DeepSeek TUI v0.9.1 Release Notes: Codewhale is the public product from Shannon Labs. The codewhale
command, npm package, and release-asset names remain lowercase technical
identifiers. The legacy npm package deepseek-tui is deprecated and
receives no further releases. Users coming from v0.8.x legacy deepseek /
deepseek-tui names should migrate with docs/REBRAND.md.
Install
Recommended — npm (one command, all three entrypoints)
bash
npm install -g codewhale
The wrapper downloads the matched codewhale, codew, and codewhale-tui
binaries from this Release and places them in the same directory.
Docker / GHCR
bash
docker run --rm -it \
-e DEEPSEEK_API_KEY="$DEEPSEEK_API_KEY" \
-v codewhale-home:/home/codewhale/.codewhale \
ghcr.io/hmbown/codewhale:v0.9.1
The image ships the codewhale dispatcher, codew shim, and codewhale-tui runtime. The latest tag is also updated on release.
Cargo (Linux / macOS)
bash
cargo install codewhale-cli codewhale-tui --locked
Both crates are required — codewhale-cli produces the codewhale dispatcher and codew shim, while codewhale-tui produces the interactive runtime that the dispatcher delegates to. Installing only one crate will fail at runtime with a MISSING_COMPANION_BINARY error.
Manual download — platform archives (recommended)
Each archive below contains the codewhale dispatcher, codew shim, and codewhale-tui runtime, plus an install script:
- Linux x64:
codewhale-linux-x64.tar.gz | install.sh
- Linux ARM64:
codewhale-linux-arm64.tar.gz | install.sh
- Android ARM64 (Termux):
codewhale-android-arm64.tar.gz | install.sh
- macOS x64:
codewhale-macos-x64.tar.gz | install.sh
- macOS ARM:
codewhale-macos-arm64.tar.gz | install.sh
- Windows x64 (installer):
CodeWhaleSetup.exe | NSIS setup
- Windows x64:
codewhale-windows-x64.zip | install.bat
- Windows x64 (portable):
codewhale-windows-x64-portable.zip | —
- Windows ARM64:
codewhale-windows-arm64.zip | install.bat
- Windows ARM64 (portable):
codewhale-windows-arm64-portable.zip | —
Unix (Linux / macOS):
bash
tar xzf codewhale-.tar.gz
cd codewhale-
./install.sh
Windows:
- For the installer path, run
CodeWhaleSetup.exe; it installs codewhale.exe, codew.exe, and codewhale-tui.exe under %LOCALAPPDATA%\Programs\CodeWhale\bin and adds that directory to the current-user PATH.
- Extract the archive for your machine:
codewhale-windows-x64.zip or
codewhale-windows-arm64.zip
- Run
install.bat (copies to %USERPROFILE%\bin)
- Add
%USERPROFILE%\bin to your PATH
The portable Windows archive skips the install script — extract and run from any directory. The NSIS installer is currently unsigned and may trigger Windows SmartScreen until a signing certificate is wired into the release pipeline.
Each platform also has bare, unarchived binaries attached below (codewhale-, codew-, and codewhale-tui-) — the npm wrapper and the in-app codewhale update download the matched runtime binaries, whereas the .tar.gz / .zip archives above are the recommended manual download and additionally bundle an install script. The legacy npm package deepseek-tui is deprecated and is not republished. For migration from v0.8.x legacy binary names, see docs/REBRAND.md.
Verify (recommended)
Download the checksum manifests from this Release and verify:
bash
Linux — archive bundles
sha256sum -c codewhale-bundles-sha256.txt --ignore-missing
Linux — individual binaries
sha256sum -c codewhale-artifacts-sha256.txt --ignore-missing
macOS
shasum -a 256 -c codewhale-bundles-sha256.txt --ignore-missing
shasum -a 256 -c codewhale-artifacts-sha256.txt --ignore-missing
What's in v0.9.1
Dogfood follow-ups (2026-07-24)
Added
/compact [focus]: the manual compaction command now accepts an
optional focus argument that is injected into the summary prompt, and
the compaction summary itself becomes a structured nine-section
successor briefing (primary intent, key concepts, files and code,
errors and fixes, problem solving, user messages, pending tasks,
current work, next step) that carries earlier compaction summaries
forward and explicitly forbids tool use — replacing the free-form
"under N words" instruction. Codewhale's pin/working-set and
V4 prefix-cache-aligned machinery are unchanged.
- Saved workflows become slash commands:
*.workflow.js files under
/.codewhale/workflows/ and ~/.codewhale/workflows/ are
discovered as /name commands that accept custom arguments (forwarded
to the run's args), launch through the workflow tool in the
background, and report their run id. Hand-written .md commands with
the same name always win. The workflow tool's source_path now also
accepts the user-global ~/.codewhale/workflows/ store, and every
settled run leaves a durable synthesized report under
.codewhale/reports/.md (status, goal, gates, progress,
result, verification).
Fixed
- Disambiguate the two Kimi K3 model-picker rows, which read as an
unexplained duplicate: bare k3 is now labeled "Kimi Code plan route"
with its default 262K window annotated as the plan-tier floor (raisable
via the provider context_window setting for plans that include 1M),
and kimi-k3 is labeled "Moonshot direct route" with its 1M window.
Both remain distinct, valid routes for the same underlying model.
- Close the model-facing
agent tool role schema: the type property now
publishes the canonical JSON Schema enum `["worker", "scout", "planner",
"reviewer", "builder", "verifier", "custom"]` instead of describing the
accepted values in prose. Legacy aliases are no longer advertised to
models; they remain accepted only at replay/deserialization boundaries.
Provider schema sanitizers (Chat Completions, strict mode, Anthropic
Messages / OpenAI Responses, Moonshot/Kimi) are pinned by test to
preserve the closed enum.
Changed
- Rework the ambient idle ocean: the water now holds exactly one loose
wedge school of fish, jellyfish, bubbles, and the rare whale cameo —
seaweed and bio-dust are removed. Fish swim on a wrap-around path and
always face the way they move (direction can only change while the
school is off-screen); the lead fish carries an eye (>).
Jellyfish become a pulsing bell with a lagging swaying tentacle. All
ambient marks now glow via background→ink color lerp: a travelling
sin² wave through the school, a floor-bounded pulse for jellyfish,
and occasional raised-cosine glints on bubbles, with deliberately
non-matching periods so nothing strobes in sync.
- Consolidate Anthropic Messages and OpenAI Responses stream opening
through the shared client/stream_entry.rs transport seam already used
by Chat Completions: one bounded response-header wait, shared
dual/HTTP-1.1 client policy selection, at most one HTTP/1.1 fallback
retry on a classified HTTP/2 header stall (never after a stream body
has begun), and the shared idle-timeout diagnostics format. Both
adapters gain the bounded open wait and CODEWHALE_FORCE_HTTP1
H1 pinning; wire-specific headers, authentication, endpoints, and
stream decoding stay at the adapter edge, and the Responses provider
retry loop for rate limits / transient upstream errors is preserved.
- Rename the internal delegated-worker role type from
SubAgentType to
FleetRole with canonical variants (Worker, Scout, Planner,
Reviewer, Builder, Verifier, Custom) matching the public Fleet
vocabulary one-to-one. Wire behavior is unchanged: serialization emits
canonical Fleet values only, and persisted agent_type fields plus
documented legacy spellings (general, explore, plan, review,
implementer, …) continue to load at deserialization/parse boundaries;
unknown role tokens still fail closed with the canonical vocabulary in
the error.
The Codewhale v0.9.1 source candidate includes a first-class local web client over the Runtime API,
first-class OpenCode Go and TelecomJS TokenHub providers and restored xAI device login,
calendar-correct hourly automations, a buildable OpenHarmony workflow-js
target, and hardening for Auto routing, remote-terminal clipboard transport,
restart recovery, and a coherent TUI, Work, evidence, and public release
surface.
Added
- Add
codewhale web [--port 7878], a first-class loopback-only browser
client over the canonical Runtime API. The dependency-free embedded shell
supports thread lifecycle, snapshot-then-SSE transcripts, turn start/steer/
interrupt, approvals, and user questions, including pending-request recovery
across tab reloads, while leaving unsupported managed,
files, PTY, model-selection, and Fleet controls absent. Browser auth uses a
short-lived one-time loopback capability exchanged for an opaque, bounded,
process-local HttpOnly, SameSite=Strict session cookie with a same-origin
mutation guard; Runtime tokens never enter URLs, HTML, browser storage, logs,
or browser-launch arguments (#4423).
- Add OpenCode Go as a first-class, subscription-backed Chat Completions
provider with [providers.opencode_go], OPENCODE_GO_API_KEY, and the eight
models currently documented on its /v1/chat/completions endpoint. Models
served only through OpenCode Go's Anthropic /messages endpoint remain out
of this narrow route until Codewhale supports per-model wire selection
(#1481 by @seanthefuturegorilla; implementation harvested from PR #773 by
@zhangweiii and PR #1050 by @sternelee).
- Add TelecomJS TokenHub as a first-class Chat Completions provider with
[providers.telecomjs], TELECOMJS_API_KEY, and a key-scoped live
/v1/models refresh. Models.dev and provider-specific catalogs remain in
separate source partitions so either refresh order preserves both; refreshes
do not delete the other source's rows, matching model ids from unrelated
providers do not fabricate metadata, and chat requests omit unsupported
reasoning fields (PR #4370 by @baendlorel; harvested with co-authorship).
- Prepare native Windows ARM64
codewhale, codew, and codewhale-tui
binaries, npm selection, updater support, and standard/portable release
archives. Build and smoke them on GitHub's native Windows 11 ARM runner,
and move Linux ARM64 release builds to the native Ubuntu ARM runner to
remove the slower multi-arch cross-link setup (#4267 by @w1w218).
load_skill tool now supports listing: omit name or pass "list" to
see all available skills without loading one (#4651).
- Add a unified
/skills manager with one precedence-aware root catalog,
bounded duplicate/shadow/conflict auditing, package provenance, and
validated install, update, remove, and trust mutations (PR #4679 by
@SamhandsomeLee).
- Add a safe Agent Details view and bounded, structured
current_activity to
the single Work projection, sourced from worker events instead of renderer
string inference. Rows stay compact, exact evidence is opt-in, and raw child
output never enters the parent transcript (#2889 and #4636; design direction
by @aboimpinto, preserved from #2694).
- Make exact results and delegated coordination durable: non-inline tool output
becomes immutable session-owned evidence behind bounded receipts; File
mutations add configurable success-only diffs; and decisions and write
contention survive restart with typed neutral-fan-in records (#4619, #4636,
#4647).
- Runtime API provider registry and atomic provider-switch endpoints
(GET /v1/providers, GET /v1/providers/{id}/models,
POST /v1/providers/{id}/switch) so the web GUI renders a dynamic
provider/model picker without the setConfig+reload clobber (#4658).
- Typed filter (
/) in the Fleet setup wizard's Model step: substring
match over provider id, display label, and model id keeps
OpenRouter-scale catalogs navigable (#4639).
[auto.router] config: explicit provider/model/thinking for the Auto
mode classifier route; unset keeps the DeepSeek flash default, and
missing credentials fall back to the local heuristic.
Changed
- Keep the top activity bar literal and actionable: active To-dos appear first,
followed by Sub-agents, while generic operations and coordination stay in
the detail surface. Completed-only bars auto-hide, and top/side layouts can
be resized by dragging their divider and retain the chosen size (#4700,
#4702).
- Use each theme's semantic colors for composer mode and permission rails, and
show a larger inline reasoning preview with clearer local/full expansion
affordances (#4699, #4701).
- Simplify the model-facing runtime around stable action tools (
File, Git,
Run, deferred Web, and durable task and automation families), with legacy
spellings hidden for replay. Fresh sessions no longer reserve a Work surface
before real work exists (PR #4675).
- Give the terminal shell one deliberate visual language: cool Plan → Act →
Operate and warm Ask → Auto-Review → Full Access ramps match between header
and split composer edges; transcript rhythm groups related activity; a
refined whale keeps the empty state calm; and one-cell live motion with
truthful labels distinguishes reasoning, reading, tool use, and verification
without exposing private reasoning text. Reduced-motion and animation-off
settings freeze it, while ASCII-safe terminals retain the signal (#4676,
#4677).
- Unified shell tool: the model now sees a single
Bash tool with an action
parameter (run/wait/interact/cancel). Legacy exec_shell* names remain as
hidden compat aliases for transcript replay, and the tool-search catalog
keeps Bash active by default (#4625).
- Tool output inline preview increased from 6 to 12 lines (4 head + 4 tail)
before the fold indicator; full pager (v key) unchanged (#4603).
- Mode changes (
/mode agent|plan|operate) now persist to settings.toml
and restore across sessions (#4628).
- Billing provenance: every outgoing API request carries an
x-codewhale-provenance header with client version and provider (#4324).
- The
/model picker's typed search now ranks results: provider-name
matches first (drill-down), then exact id, then id-prefix, then the
active provider's rows (#4639).
- System prompt text consolidated into a single
prompts/text.rs
module (byte-exact constants replacing 17 layered files);
composition order, constitution-first binding, and locale/personality
variants unchanged.
- Ask, Auto-Review, Full Access, and Never resolve through one permission
contract: resolve_tool_permission in the engine and
resolve_approval_request_disposition in the UI share one truth table for
session grants/denials, non-bypassable policy holds, and modal prompts
(#4412).
- Collapsed multi-struct tool families into single action-dispatched tools
(AutomationTool, TasksTool, GithubTool, RlmTool) while keeping
legacy tool names as hidden compatibility aliases for transcript replay.
- Operate-mode children default to leaf depth (
max_depth=0) unless the
caller explicitly grants a deeper budget (#4598).
Fixed
- Restore
uwu theme config round-tripping and keep header permission colors
and authored idle-whale geometry aligned with the selected theme (#4696).
- Default canonical
Bash runs with no explicit cwd to the active
ToolContext.workspace, including an isolated sub-agent worktree, instead of
falling through to the shared shell manager's parent workspace. The regression
test detects the selected workspace through marker files so it remains
meaningful across PowerShell path spellings (#4674, PR #4673 by @fleitz).
- Generate QuickJS bindings for
aarch64-unknown-linux-ohos with the native
SDK's libclang and sysroot, carry the OHOS target and sysroot through final
linking, and keep unsupported persistent PTY dependencies out of the target
while retaining non-PTY exec_shell support (#4470 by @shenjackyuanjie;
original bindgen approach in #4384 by @shenyongqing).
- Honor
[auto] cost_saving = true in provider-aware heuristic and classifier
routing, using only validated same-provider fast siblings and deriving
fallback candidates from their actual provider so Auto cannot invent a
cross-provider model. Providers without a known fast sibling stay on the
active model (#4486; partial #4405).
- Make terminal-client clipboard behavior truthful over SSH: use OSC 52
outside tmux, stock tmux load-buffer -w inside tmux, and bracketed paste
for client-to-remote text. Graphical text and image access now requires
credible forwarding or an explicit override, transport failures no longer
claim success, and help distinguishes terminal text paste from graphical
image attachment (#4484).
- Keep a fresh TUI Work surface from rendering prior-session worker snapshots
or durable-task terminal receipts whose creation or completion predates the
current app start. Active durable tasks remain visible, and shared history
stays available through /tasks and archived agent views (#4488; partial
#4416).
- Make doctor and setup output distinguish static configuration, command
availability, MCP protocol readiness, and backend health instead of
presenting configured routes as live-healthy. Ordinary doctor runs no
longer wake loopback/self-hosted providers unless --probe-local is
explicitly requested (#4485; partial #4406).
- Serialize test-only configuration-path readers with temporary environment
redirects so the Windows provider-persistence matrix cannot observe another
test's transient CODEWHALE_HOME or config path (#4483, closing #4463).
- Restore direct Moonshot
kimi-k3 to its documented 1,048,576-token
context window and 131,072-token output limit instead of treating the live
model as an unknown legacy 128K route. The existing Kimi Code tiered k3
route and credential reuse remain unchanged (#4481).
- Keep read-before-edit snapshots in the engine session so a file read remains
valid across turns and context compaction, while a new session still starts
with an empty tracker (#4475 by @Angel-Hair).
- Make
apply_patch expose the canonical replace operation while continuing
to accept deprecated changes payloads through one validation path. Mixed
patch, replace, and compatibility modes now fail before any write (#4476 by
@Angel-Hair).
- Show the prompt-cache hit rate in the phase strip when the Cache status item
is enabled, using overflow-safe rounded integer math and leaving compact or
disabled status layouts unchanged (#4474 by @dmitri-0).
- Preserve Solarized Light's canonical Base3 (
#fdf6e3) shell background
instead of tinting it green-grey through the default underwater Ombre
treatment, while retaining foreground ambient life (#4457 by
@AiurArtanis; PR #4471 by @nightt5879).
- Register
/slop and /canzha as compatibility aliases of /debt, while
keeping user-command ownership truthful across dispatch, help, slash
completion, alias copy, and typo suggestions (PR #4680 by @nightt5879).
- Fail closed on legacy Kimi CLI credential imports: remove Codewhale's
hard-coded first-party-client impersonation and refresh request, never
auto-enable or rewrite imported credentials, and label the compatibility
route as a read-only imported token. An explicitly configured, still-valid
access token remains usable until expiry; missing, malformed, and expired
imports recover through the supported Kimi Code API-key route while
first-class OAuth awaits Codewhale's own vendor registration (#4417,
partially addressed).
- Restore xAI/Grok device-code OAuth login against the live xAI OIDC
contract: discovery with issuer/endpoint validation and documented
fallbacks, user-principal scope set, RFC 8628 slow_down backoff capped at
code expiry, bounded, sanitized error reporting for denial, expiry, and
malformed responses, and a shared blocking-worker boundary for both CLI and
TUI login so reqwest's blocking client never creates or drops its private
runtime inside Codewhale's Tokio runtime (#4410).
- Anchor
FREQ=HOURLY automations with BYHOUR/BYMINUTE to persisted
local-calendar slots so intervals keep their wall-clock phase across DST,
restart, resume, RRULE updates, duplicate-slot recovery, and post-run
advancement. Nonexistent clock slots are skipped and ambiguous slots run at
their first occurrence (#4381 by @h3c-hexin).
- Give content-watch drafts canonical identities: the link and semantic-drift
watchers now write and dedup through one canonical draft-storage key with
deterministic hash-suffixed IDs, validate and bound model drift output
before any KV writes, and show truthful admin draft labels, so unchanged
findings dedup and changed findings re-draft instead of colliding (#4453).
- Make model-policy JSON repair consider object and array payloads in source
order, matching nested delimiters across quoted strings and escapes and
returning the earliest balanced candidate that parses, instead of letting
an unmatched opening delimiter or object-first preference corrupt array
payloads (#4430).
- Convert persisted sub-agent completion and still-running control events into
concise, non-authoritative resume checkpoints, keeping their raw runtime
envelopes, sentinels, and retry instructions out of restored model and TUI
conversation state (#4409).
- Deliver failed, stopped, and stale sub-agent outcomes exactly once to the
awaiting parent, lifecycle mailbox, and TUI before closing their runtime
state. Restart now reconciles orphaned queued/model/tool-wait worker records
to interrupted while preserving checkpoints, and cancelled workers no
longer read as completed in the TUI (#4408).
- Give host applications a cancellation boundary for MCP OAuth login so a
stalled or abandoned provider login no longer hangs the calling session
(#4380).
- Avoid blocked reader joins after Windows process kills so terminated shell
sessions cannot hang their readers (#4383).
- Give stdin-less observer hooks immediate EOF and contain timed-out hook
process trees so descendants and pipe readers cannot leak after the parent
shell exits (#4489 by @luismateusvargas).
- Preserve the full unsigned Windows PTY process status instead of collapsing
every high-bit exception or NTSTATUS to 2147483647, including decimal and
hexadecimal diagnostic metadata for device retests (#4100 by
@redjade75723).
- Keep the Hotbar Setup action list synchronized with keyboard focus when the
selection moves beyond the visible rows, including Down past /export
(#4418).
- Route Windows OpenHarmony Cargo links through the repository's target-aware
clang launcher so the final Rust link keeps its target, sysroot, and MUSL
flags, and extend the no-SDK release guard to protect that contract. This
completes @shenjackyuanjie's PR #4470
setup alongside @shenyongqing's original
bindgen approach in PR #4384.
- Reconcile the website roadmap with reality: the retired share-link
direction is now an explicit non-goal, Workrooms is the considered
direction, and the local web client appears as underway, in English and
Chinese (#3418).
- System-prompt skills block and skill-load warnings no longer embed absolute
home/workspace paths; entries render workspace-relative or ~/… so the
byte-stable prompt prefix never leaks private paths. A new invariant test
guards absolute paths, API keys, and workspace paths in the prefix (#4632).
- Mode/permission baseline unit tests no longer read the developer's live
settings.toml; they isolate config I/O to a temp directory (#4628).
- Enter no longer freezes the composer on send: dispatch splits into a
sync prepare phase (instant history + spinner) and a spawned async
phase (auto-route, preflight, engine send), with submits gated while
a dispatch is in flight (#4605).
- Self-hosted routes keep explicit per-model output limits for unknown
wire aliases instead of the generic 4K fallback (#4655 by @h3c-hexin;
PR #4656).
- Chat Completions idle-timeout errors now include received-byte and
timing telemetry, distinguishing prefill stalls from mid-stream
stalls with truncated tool-call arguments (#4657 by @h3c-hexin).
set_config provider writes now keep the in-memory route in step,
so a following model write lands in the new provider's table instead
of clobbering the previous provider's root default_text_model (#4658
by @gaord, with a follow-up route-sync fix).
Security
- Restrict cross-origin Runtime API browser preflights to the documented
authentication and content headers, explicitly allowing Authorization
instead of relying on a wildcard (#4454).
Security
- Harden the public community-site boundary: scheduled review drafts now use
one canonical freshness namespace, admin discard is restricted to validated
draft objects, public feed requests cannot spend the server-held GitHub
token, and maintainer login bodies are type- and size-bounded before parsing.
Contributors
Thank you to the contributors whose code, reports, and reviews shaped v0.9.1:
automation recurrence (PR #4381), the MCP OAuth cancellation report
(#4380), explicit limits for unknown local models (PR #4656 / #4655),
and idle-timeout progress telemetry (PR #4657).
- @gaord — Runtime API provider registry and
atomic provider-switch endpoints (PR #4658).
root catalog, audit/provenance model, validated mutations, manager UI, and
acceptance coverage (PR #4679), plus Enter-send lag diagnosis and fix
direction for #4605 (PR #4654; landed via the release-lane async-dispatch
split).
registry boundary from PR #3278; the exact authored evidence commit from PR
#4046, preserved intact in the integration graph; and the #2870 follow-up
audit whose metadata and malformed-sibling gaps shaped the final corrections.
Paulo also provided the structured, redacted Agent Details and
current_activity direction preserved from #2694/#2889 and the real-PTY
lifecycle acceptance direction from #2886.
support and key-scoped live-catalog direction from PR #4370, harvested into
the current provider architecture with co-authorship preserved.
@sternelee — the original first-class
OpenCode Go implementations (PRs #773 and #1050), harvested into the
current provider architecture.
canonical OpenCode Go/Zen provider request and acceptance direction
(#1481).
with dispatch-consistent user-command shadowing across discovery surfaces
(PR #4680), plus the Solarized Light background preservation fix (PR #4471).
regression report and reproduction (#4457).
workflow-js bindgen, portable-pty gating, and SDK environment work
(PR #4470).
bindgen approach (PR #4384), carried into the landed implementation.
process-leak reproduction, process-tree analysis, and EOF fix direction
(#4489).
report that exposed lossy high-bit process-status handling (#4100).
- @w1w218 — the Windows ARM64 release request and
real-device motivation (#4267).
tracking and the explicit, backwards-compatible apply_patch replacement
contract (PRs #4475 and #4476).
- @dmitri-0 — configurable cache-hit visibility
in the phase strip (PR #4474).
- @fleitz — the canonical
Bash no-cwd
workspace fix and regression test that keep isolated sub-agent commands in
their own worktree (PR #4673, closing #4674).
reproduction that exposed pre-pager result truncation and conflicting composer
shortcut routing (#4482), and the exact Vim-space regression reproduction
verifying the v0.9.1 input path already contains the needed global binding
(PR #4477).
See CHANGELOG.md for full notes and docs/CHANGELOG_ARCHIVE.md for older releases.
|
Post a Comment/Report Broken Link: