Codewhale is the public product from Shannon Labs. The
codewhale
command, npm package, and release-asset names remain lowercase technical
identifiers. The legacy npm packagedeepseek-tuiis deprecated and
receives no further releases. Users coming from v0.8.x legacydeepseek/
deepseek-tuinames should migrate withdocs/REBRAND.md.
Install
Recommended — npm (one command, both binaries)
npm install -g codewhaleThe wrapper downloads the matched runtime binaries from this Release and places them in the same directory.
Docker / GHCR
docker run --rm -it \
-e DEEPSEEK_API_KEY="$DEEPSEEK_API_KEY" \
-v codewhale-home:/home/codewhale/.codewhale \
ghcr.io/hmbown/codewhale:v0.9.0The image ships the codewhale dispatcher, codew shim, and codewhale-tui runtime. The latest tag is also updated on release.
Cargo (Linux / macOS)
cargo install codewhale-cli codewhale-tui --lockedBoth 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:
| Platform | Archive | 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 |
— |
Unix (Linux / macOS):
tar xzf codewhale-<platform>.tar.gz
cd codewhale-<platform>
./install.shWindows:
- For the installer path, run
CodeWhaleSetup.exe; it installscodewhale.exe,codew.exe, andcodewhale-tui.exeunder%LOCALAPPDATA%\Programs\CodeWhale\binand adds that directory to the current-user PATH. - Extract
codewhale-windows-x64.zip - Run
install.bat(copies to%USERPROFILE%\bin) - Add
%USERPROFILE%\binto 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-<platform>, codew-<platform>, and codewhale-tui-<platform>) — 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:
# Linux — archive bundles
sha256sum -c codewhale-bundles-sha256.txt
# Linux — individual binaries
sha256sum -c codewhale-artifacts-sha256.txt
# macOS
shasum -a 256 -c codewhale-bundles-sha256.txt
shasum -a 256 -c codewhale-artifacts-sha256.txtWhat's in v0.9.0
Codewhale v0.9.0 replaces the default terminal shell with the underwater
interaction system, makes Operate message-first, and hardens the Fleet,
Workflow, routing, accounting, and release surfaces that support day-to-day
agent work. The release also expands localization and gives the public site a
quieter, docs-first community foundation. Its provider work replaces the old
hand-maintained picker boundary with live ProviderLake discovery and adds the
largest curated model-and-pricing expansion in the project so far.
Fixed — final integration
- Redact configured, environment, file-backed, and bare active credentials
from every tool result before it crosses any model-provider wire protocol;
retrieved spillover content is sanitized again at that boundary. The
read_filetool also refuses CodeWhale configuration, backup, and
credential-store paths, preventing routine tool use from exposing those
local files. - Keep immediate TUI submit failures inside the shell: custom-provider route
preflight and closed-mailbox errors now restore the exact composer draft and
selected skill for retry, with a sticky visible error instead of exiting. - Anchor automatic compaction thresholds to the route's spendable input
budget after output reservation and safety headroom, so large-output and
tight self-hosted routes compact before provider context rejection. The TUI
pre-send gate and warning copy now use the same token threshold as the
engine. Preserve the 262K Kimi route's usable input budget and use the
documented 32K default generation budget instead of mirroring the context
window as output (#4293 by @SamhandsomeLee, #4368 by @bruce6135, and #4378
by @mvanhorn). - Fail closed instead of reporting base-rate dollar estimates for direct OpenAI
GPT-5.4/5.4 Pro, GPT-5.5 (including dated snapshots), and GPT-5.6
Sol/Terra/Luna requests above 272K input tokens. Exact tiered accounting
remains deferred to the generalized pricing schema; smaller 5.4 variants,
GPT-5.5 Pro, Codex subscription, and foreign-provider routes are unchanged
(#4317). - Retire
deepseek-chatanddeepseek-reasonerbefore they reach DeepSeek's
first-party OpenAI or Anthropic wire APIs, migrating both to the documented
deepseek-v4-flashreplacement while preserving legacy non-thinking /
thinking intent when no explicit reasoning tier is set. Aggregator, Wanjie
Ark, self-hosted, and custom endpoint model ids remain provider-owned (#4320). - Make Operate a message-first multitask surface: ordinary prompts work without
a Workflow, direct parent tools follow the same approval, sandbox, shell,
ask-rule, and repository protections as Act, and follow-ups can queue while
work is active. Bounded background workers remain preferred for independent,
parallel, isolated, or long-running work; child handoffs cannot inherit
standing Full Access, and each dispatch produces one durable completion
receipt. - Let personal Fleet profiles in
CODEWHALE_HOME/agentstravel across
repositories while project profiles in.codewhale/agentsoverride them.
Saving refreshes the live roster, and the UI now says explicitly that profile
availability does not expand workspace, trust, or filesystem authority. - Move file-mention discovery onto one bounded, generation-safe background
worker so a slow filesystem read cannot freeze composer input. Exact paths
resolve on send; fuzzy matches stay in the completion popup instead of
silently attaching an arbitrary same-name file (#4365 by @WavesMan, with the
initial bounded-walk approach from #4367 by @LeoLin990405). - Keep the opt-in
remembertool in the model-visible first-turn catalog so
durable preference capture works without requiring a model to discover a
tool it cannot yet know exists (#4373 by @Angel-Hair and #4377 by
@mvanhorn). - Make
reviewhandle a staged snapshot relative to a base ref by comparing
the branch merge-base tree with the index. This preserves committed and
staged branch work, excludes unstaged edits, and avoids the invalid
git diff --cached <base>...HEADform. - Honor each MCP server's advertised discovery capabilities before calling
optional tools, resources, templates, or prompts; keep optional probes
independently bounded and fail-soft (#4308 by @nsfoxer). - Make offline
scorecardpricing provider-aware:turn_endrecords carry the
effective route and a non-secret billing surface, runtime exports and
supported aliases ingest cleanly, legacy/unknown routes remain explicitly
unpriced, and route-scoped cache and recorded-time pricing replace model-only
guesses. Historical runtime aggregates use each turn's recorded time;
costless catalog routes fail closed while exact provider-owned hand-price
rows remain available. StepFun PAYG and Step Plan usage now stay distinct
without persisting raw endpoint URLs, so subscription quota is never reported
as token spend (#4335). Completion-only shell, manual-compaction, and purge
events remain visible toturn_endobservers as explicitly non-model
lifecycle records. This builds on the scorecard introduced by @findshan in
#3388. - Preserve named custom-provider identity across TUI sessions,
exec --resume,
runtime threads, exports, cache and Workflow receipts. Restores resolve the
saved provider against live configuration before creating a client, never
infer a provider from the model ID, and fail closed when the named route was
removed, invalid, or ambiguous (#4334). - Bind credentials to the endpoint that owns them. Environment-selected custom
hosts can no longer inherit saved provider keys, keyring entries, OAuth, or
ambient provider variables; only an explicitly source-marked CLI key may
follow an explicit CLI endpoint override.auth_mode = "none"also strips
credential-shaped custom headers consistently in the TUI and app server,
while keyless loopback routes remain usable as local runtimes. - Make hosted runtime threads deterministic and provider-exact: serialize
thread, turn, and event mutation; keep cancellation ownership with the host;
preserve the selected provider through every durable turn; terminalize
exceptional streams once; and prevent the runtime manager from silently
dispatching unclaimed goal continuations or child turns. - Treat required user confirmation as a real goal blocker instead of a failed
goal, and explain how to recover when a previously cached approval is denied.
Cached-denial recovery is also committed as a settled transcript receipt, so
tool completion or a later status update cannot erase it from scrollback or
accessibility output. The notice now describes matching, process-scoped
denials truthfully across all shipped locales; approval audits honor
CODEWHALE_HOME, and expired status toasts cannot remain trapped behind a
persistent entry. Both states remain visible and actionable instead of
looking like unexplained model or tool failure (#4374 and #4375 by
@Angel-Hair, with the final hardening in #4385 by @nightt5879). - Make Fleet launch and teardown deterministic: route flags are placed before
exec, workers are contained in owned Unix sessions or Windows Job Objects,
and cancellation reaps surviving descendants with bounded escalation before
manager state settles. Fence progress, terminal status, verification
receipts, and evidence by durable attempt generation so a stale process can
never complete or overwrite a restarted attempt; terminal state and receipt
now commit atomically, stale-heartbeat decisions use a full lease CAS,
exhausted-retry alerts are exactly once, and crash-truncated ledger tails are
quarantined before the next append. Standalone CLI and Runtime API restart
controls now drive the replacement attempt through a real executor to its
terminal receipt, while per-run manager ownership prevents concurrent
controllers from launching the same attempt twice. - Keep the stopship Workflow fixture bounded to measured 24k-per-turn role
budgets and a 360k aggregate. Authored child step and wall-time limits now
reach the live runtime, including launch-queue wait; promoted evidence stays
intact between roles, tool-free handoff consumers omit tool fields on the
provider wire, and a terminalBLOCKfails the Workflow instead of producing
a successful Lane receipt. Free-form descriptions no longer fabricate write,
shell, or network risk; unknown structured risk remains fail-closed. - Keep repository trust affirmative and explicit: only
1/Yare advertised
as acceptance keys, while Enter remains non-affirmative and explains the
required choice. - Replace literal legal and doctrinal metaphors in Simplified Chinese setup and
/constitutioncopy with direct collaboration terminology reviewed by a
native speaker (#4369 by @hmr-BH). - Keep the transcript reviewable while an inline approval card is active:
Page Up/Down, modified arrows, Home/End, and the mouse wheel now move through
the visible evidence without changing or dismissing the pending decision
(#4371 by @amuthantamil). - Match generated worker names to the active UI language while preserving
explicit user names, and tighten the 89x50 shell rhythm across Fleet rows,
choice dialogs, transcript boundaries, and the idle composer. - Put docs content and search before the full index on small screens, reduce
mobile dead space, and keep the public community copy focused on issues,
pull requests, and international contributors.
Changed — the underwater shell
- Replace the default TUI shell with the underwater interaction system: one
renderer owns the header, top work strip, transcript ledger, composer, and
footer, with explicit compact/normal/wide tiers and no legacy sidebar or
dashboard in the default path. The legacy composition survives only behind
the internalclassictreatment. - Add a distinct pre-session launch screen — new session, new worktree (with
inline naming and real lane provisioning), scoped resume count, changelog,
quit — with reliable non-colliding keys and row/keyboard parity. - Render turns as a ledger: user message, short narration, settled tool
receipts, and exactly one live row. Fast tool bursts land directly as
batch receipts (no spinner churn), completed receipts stay inspectable,
failures hold a coral receipt with stderr onevaway, and one shared
tool rail replaces nested card borders. - Make completion a one-shot exhale:
working -> finishing -> donein the
footer only, with no transcript repaint, no lingering loop, and no stale
cancel action in the completed state. - Rebuild the secondary rooms on one hairline grammar — config, setup,
sessions, help, context, theme, model/route, Fleet, file attach — each
with a title hairline, row objects with focus/selection/mouse parity,
one panel-owned scroll rail, and wrapped action footers. - Make
/modela model-first atomic route picker across configured
providers: provider and model switch together on apply, and every row
prints the resolved model./themegains a live preview with truthful
Esc revert across all 12 shipped themes. - Add a live context inspector (Alt+C) backed by the current route: exact
system/messages/free token buckets, a proportional map, drill-down into
the detail pager, and no frozen session while it is open. - Project Workflow runs as an in-stream run map: a collapsed one-line card
that unfolds into per-lane rows with role, resolved model, worktree,
elapsed track, and per-member running/waiting/failed/cancelled/done
states, plus gates and a debrief built only from real run data. Child
transcripts never flood the parent shell. - Unify Fleet into roster/setup/workers rooms: the operator is pinned first
with the live session route, members show resolved route truth (inherit /
fast lane / pinned), and the workers tab is a control surface with
row-local open/stop and real lifecycle counts. - Distinguish repository-law approvals from ordinary approvals: the
constitution prompt names its authority, source, matched rule, and target,
and Full Access never bypasses it. Ordinary approvals render as a still
coral band above the visible transcript. - Keep streaming honest and cheap: provider-unit deltas replace per-grapheme
queueing, the transcript is top-anchored so appended lines stop shifting
settled rows, ambient animation stops during real work, and ordinary
completion no longer triggers full-screen clears (verified by render-diff
logs: suffix updates of tens of cells while streaming, zero periodic
full repaints). - Give every underwater treatment ambient life: ombre breathes its water
column while flat and Terminal-owned keep the idle fish and bubble
(foreground-only for Terminal), a typed treatment setting replaces string
comparisons, reduced motion freezes life legibly,fancy_animations = falsestills the chrome, and typing scatters the fish immediately. Fish
keep a one-cell gap from occupied text; the whale remains the single brand
mark and returns to stillness between caustic sweeps. - Bring the whale mark to life with a soft diagonal caustic sweep, then let it
genuinely rest. Active markers now share a smoother 8 Hz clock after the
existing earned-motion delay, while reduced motion, hidden/off-screen views,
modal ownership, and compact-terminal redraw budgets remain authoritative.
The motion is adapted from the Apache-2.0 Grok Build interaction language,
not copied as a global pulse or high-frequency receipt cascade. - Keep compact terminals operable:
/configand/resumecollapse
secondary chrome before sacrificing their selectable rows at 40x12 and
60x16, bodies budget for the footer's real wrapped height, and the
selection stays visible through resizes. - Route footer notices through the classified toast system so informational
acknowledgements (for example "Auto-compaction enabled") expire instead of
becoming permanent idle chrome, while warnings and errors hold as sticky
notices until their window passes. - Complete the
CODEWHALE_ASCII_SAFE=1decorative tier: the whale mark,
context meter, braille state markers (mapped by dot density so the working
bubble still reads as a rising fill), bubbles, rails, and role/lane glyphs
all narrow to semantic ASCII while user, model, and CJK text passes
through untouched. Verified by whole-surface rendered-buffer sweeps. - Repair the Help catalog to match handler truth (
Alt+G,Alt+Shift+G,
Alt+[,Alt+],Alt+L,Alt+?), and give theme, Help, model, and
config rows direct mouse paths with the same activation as Enter.
Changed — integrated runtime and TUI
- Make worker delegation route-aware and identity-safe: workers receive a
small role-scoped system prompt instead of stale parent/model boilerplate,
faster routes resolve through the configured provider, and opening a worker
shows its complete available transcript. Removetoken_budgetfrom the
ordinary model-facing Agent schema so agents do not micromanage ad-hoc
launches; explicit legacy calls remain readable for compatibility. - Mature
/configinteraction for enumerated and boolean settings with
pickers/toggles, mouse-wheel scrolling, stable focus, and configured-provider
selection. Startup mode is now only Agent or Plan; legacyoperate/yolo
settings migrate to Agent with permission posture represented separately. - Show where effective permission policy comes from and keep profile,
environment, project, managed, and requirements-controlled posture read-only
in the in-session editor. Runtime presets edit only proven user-owned root
settings and no longer persist temporary environment overlays. - Restore the original four-line whale mark and make ambient ocean motion
coherent across the full scroll surface: one continuous ombre, eased fish
that face their direction of travel, fish in otherwise blank scrollback, and
explicit reduced-motion and animation controls. - Keep model reasoning in the transcript rather than the Tasks strip, retain
the live header status indicator, separate worker and success colors, and use
the same rail grammar for both work-strip and transcript scrollbars. - Present the default Z.AI Coding Plan route, including child routes, as
subscription quota instead of estimated per-token dollars. No undocumented
account endpoint is called by this change.
Added
- Thinking Machines Lab's Inkling through Together using the exact wire model
thinkingmachines/inkling, withinklingandtogether-inklingaliases and
exactnone/minimal/low/medium/high/maxreasoning
values. Codewhale does not invent a context window, price, or offline picker
claim while the provider's public catalog metadata remains inconsistent. - Expand the verified offline catalog with Claude Sonnet 5, Claude Fable 5,
GPT-5.3 Codex, and Qwen3.7 Plus, including time-aware Sonnet 5 introductory
pricing and explicit cache rates. Refresh stale GLM-5.1, Kimi K2.6, Trinity,
Qwen3.6, Nemotron, Anthropic, GLM-5.2, Kimi K2.7 Code, GLM-5 Turbo, and
GPT-5 Codex price or limit rows; keep Xiaomi MiMo explicitly unpriced where
the provider's token plan and pay-as-you-go surfaces cannot be distinguished. - MiniMax Messages provider support for MiniMax-M3 and MiniMax-M2.7, with
OpenAI-compatible and Messages routes, regional endpoint guidance, request
coverage, catalog limits, and tier-aware pricing (PR #4354 by @octo-patch). - Dynamic MCP server infrastructure and an approval-gated tool that lets the
model start a configured MCP server from chat context. Harvested from
#3869 and #3866 by @bistack with authorship preserved. - Parent
--disallowed-toolsrestrictions now flow into sub-agents and Fleet
workers by default, including deny-wins, wildcard, catalog-filtering, and
multi-generation inheritance coverage. Harvested from #4096 by @JayBeest
(#4042). - Korean (ko) UI locale with full key parity and onboarding/setup wiring
(PR #4347 by @moduvoice). - Localize the entire underwater layer: 104 new UI strings — launch menu,
phase words, mode/permission chips, footer hints, session picker, context
inspector, route and theme pickers, Fleet roster, workflow status, sidebar
work strip, repository-law approval copy, and file-attach titles — wired
through MessageIds and translated into ja, zh-Hans, es-419, pt-BR, vi,
and ko. Every complete pack now holds exact raw key parity with English
(856 keys), enforced by new tests that the old English-fallback gate could
not perform. The permission chip maps from typed state, so localization
can never silently collapse it. Machine-authored translations follow each
pack's existing terminology and are flagged for native review. - Anthropic adapter: sanitize top-level
oneOf/anyOf/allOfin tool
input schemas so affected tools no longer fail the whole request with
HTTP 400 (PR #4346 by @qinlinwang). - Anthropic pricing: bill cache-write tokens at published rates
(PR #4348 by @knqiufan, #4318). - NetBSD: generate QuickJS bindings at build time so
codewhale-workflow-js
compiles (PR #4349 by @ci4ic4). - Real-PTY release gates for six-worker fan-out liveness with Esc cancel,
multi-terminal route isolation, queued steering via terminal-safe Ctrl+G
(with Ctrl+S retained where the terminal forwards it), the one-shot
completion footer, and per-theme ANSI output for every shipped palette.
Fixed
-
Make release publication complete and source-anchored: every build checks out
the resolved tag commit, tag movement is rejected before GHCR, GitHub
Release, Homebrew, Cargo, or npm writes, and registry helpers require a clean
checkout exactly matching the remote tag. Manual recovery runs are
exact-tag-only and execute the same parity gate as automatic tag pushes. -
Publish a coherent distribution set: both checksum manifests now contain
usable public basenames and cover the full 29-asset matrix; GHCR, Homebrew,
GitHub archives, and the Linux x64 CNB mirror carrycodewhale,codew, and
codewhale-tui. The CNB shortcut now fails clearly outside Linux/OpenHarmony
x64 instead of promising assets that the mirror does not build. -
Preserve task text when a skill is invoked through dollar, unified-slash, or
explicit skill syntax, while keeping bare skill invocations and management
subcommands intact (PR #4372 by @nightt5879, co-authored by @CCChisato;
#3915). -
Honor MCP server discovery capabilities: require advertised or legacy
tools/list, keep optional resource/template/prompt probes independently
bounded and fail-soft, and format descriptions Unicode-safely (#4308,
harvested with co-authorship from @nsfoxer). -
Age-evict terminal sub-agent worker records from the state ledger so
long-lived, high-fan-out sessions do not keep rewriting multi-megabyte
terminal history (#4217; root-cause and fix direction from @yekern). -
Resolve the sub-agent completion/cancellation race with one terminal-state
claim: cancellation suppresses late mailbox/parent/UI delivery, while a
completed result remains publicly running until its notification is safely
delivered. -
Keep Workflow panel controls from stealing ordinary composer letters. Enter,
Delete, Up/Down, and Esc own panel actions; typed characters return focus to
the composer and start the message normally. -
Preserve the composer prompt gutter from the first typed character through
wrapping, scrolling, cursor placement, and mouse hit-testing so the>does
not disappear or make input appear to jump. -
Emit terminal-native OSC 8 metadata for rendered URLs without placing escape
payload bytes in the measured text, keeping long links visible, selectable,
and clickable in supporting terminals. -
Keep headless structured output terminal-clean:
codewhale execengines
no longer emit interactive terminal-title/taskbar OSC sequences, so
--output-format stream-jsonstdout stays parseable, escape-free JSONL.
Interactive TUI sessions keep their terminal chrome. -
Localization honesty: the parity gate was blinded by its own English
fallback — two keybinding rows (KbCyclePermissions,KbCycleThinking)
were missing from all five "complete" packs and now ship translated; the
Operate-mode copy that drifted in English was retranslated in every pack
(including zh-Hant's slice); three MessageIds absent from
ALL_MESSAGE_IDS are visible to tests again; and the/config
theme/locale hints and the invalid-locale error derive from the shipped
registries instead of stale hand lists that advertised 4 of 12 themes
and 4 of 8 locales. -
The setup wizard's constitution step no longer claims a "55-line core"
in any language (the bundled core is larger today); the guided draft says
"the bundled core stays active" instead. -
In-app selection copy is rail-clean and now regression-tested: copied
transcript text excludes the▎ ╎ │ ●decorations via cache metadata
(#4208 — thanks @eugenicum for the report and code-aware fix direction;
terminal-native selection with mouse capture off remains a product
decision on the proposedrail_styleoption).
Docs
- Stamp every 0.9-era roadmap document with an explicit status (current,
historical, superseded, principle-only, or future RFC), correct trackers
that recorded unshipped work as done, and describe what remains after
v0.9.0 indocs/AGENT_RUNTIME.md. - Add
docs/rfcs/UNIFIED_PROVIDER_LOGIN.md: onecodewhale auth login
surface for Anthropic, OpenAI Codex, and xAI, with the Anthropic adapter
gated on verifying flow permissions before any constants are adopted. - Refresh
docs/ACCESSIBILITY.mdfor treatment-independent ambient life
and the completed ASCII tier.
Changed — runtime foundations
- Make the advertised Android/Termux release target buildable by generating
QuickJS bindings against the Android NDK instead of expecting an upstream
pre-generatedaarch64-linux-androidbinding file, and give Android CLI/TUI
HTTP clients a preconfigured rustls root store (Mozilla WebPKI roots) so
standalone Termux processes stop panicking inside
rustls-platform-verifier's JVM expectations (#4236, #4242). - Rebalance the bundled Constitution after the v0.8.67 prompt ablation: keep
the procedural policy tail in mode-specific layers, while restoring concise
behavioral guidance for momentum, causal investigation, constraint-first
decisions, mechanism-backed guarantees, and clean continuity. - Wire live catalog cache into provider/model pickers without dropping stale or
prior rows after TTL expiry / refresh failure (#4139). Remove the dead
OFFERING_SEEDShand table so the bundled Models.dev catalog is the sole
seed source; pickers show a compactstale/cache failedchrome chip when
the Models.dev layer is past TTL or last refresh failed. - Make
work_updatethe sole model-facing To-do / Work progress tool (#4132).
checklist_*andtodo_*remain registered as hidden compat aliases for
transcript replay;update_planstays Strategy metadata/context/route, not
a second checklist. Mode/approval prompts nudge the single surface. - Demote the bundled Models.dev snapshot to an offline/stale fallback after
live catalog refresh (#4188). ProviderLake precedence is live Models.dev >
bundled seed > legacy hardcoded completion names; pickers, inventory, and
subagent validation stay catalog-backed, and Codewhale-only providers keep
defaults when Models.dev has no rows.
Added
-
Wire xAI device-code OAuth into
codewhale auth xai-device, the TUI
/auth xai-devicecommand, and guided provider setup, with comment-preserving
auth-mode persistence and loopback exchange coverage (#4257). -
Add GPT-5.6 Sol, Terra, and Luna to the OpenAI API route, including their
1.05M context metadata, 128K output limits, pricing, andmaxreasoning
effort. Add Meta Model API as a first-class OpenAI-compatible provider for
Muse Spark 1.1 with 1M context, tool/reasoning metadata, provider aliases,
and bothMETA_MODEL_API_KEYand Meta'sMODEL_API_KEYcredential names. -
Catalog automation:
scripts/catalog_models_dev.pyrefreshes secret-free
Models.dev / OpenRouter listings and validates the offline seed snapshot
(snapshot --check) without ever persisting API keys (#4117). -
/modelpicker cycles six catalog views withA(Configured → Catalog →
Recent → Coding → Cheap → Long context) and richer row metadata from the
live/bundled catalog (context, max output, tools, reasoning, price/M,
freshness). Discoverability views do not auto-apply a surprising route
(#4115). -
Workflow runs are now durable: every run appends to a
.codewhale/workflow-runs.jsonljournal and hydrates on startup, so
workflow statussurvives restarts; runs leftrunningby a dead process
are recovered as failed (#4011). The transcript renders workflow tool
output as a run card (status, goal, children, progress, verification)
instead of a generic one-liner (#4038), andworkflowaccepts averify
flag that runs post-completion verification gates and fails the run when
gates fail (#4013). -
Hotbar sources for MCP tools and skills: MCP tool slots prefill the
composer (execution stays behind the normal tool-approval flow) and skill
slots activate through the existing$skillalias (#2068, #2069). -
Mode & permission surface: Tab cycles Plan → Act → Operate; Shift+Tab
cycles the Agent permission posture (Ask / Auto-Review / Full Access) with
a footer permission chip; Ctrl+T cycles reasoning effort and Ctrl+Shift+T
opens the live transcript overlay. Operate is the orchestration mode
(delegate, wait, inspect, dispatch) and raises sub-agent fan-out while
focusing the Agents sidebar. -
Provider lake facade: the provider/model pickers, hotbar, and model
inventory now enumerate configured providers' models from the bundled
catalog (with anAtoggle to browse the full catalog), replacing the
hardcoded per-provider model table (#3830 follow-up). -
Added Cursor-integrated-terminal dogfood evidence for the published v0.8.67
release, covering installed binary provenance, release/publication checks,
headless runtime smoke, setup QA, and remaining manual visual TUI checks. -
README and README.zh-CN now point users to the community-maintained
CodeWhale for VS Code GUI frontend while clarifying that this repository's
extensions/vscode/scaffold remains the read-only Phase 0 viewer (#4035).
Fixed
-
Sub-agent waiting no longer peek→sleep polls:
agent(action="wait")joins
children, unchanged peeks are throttled (~30s) with an anti-polling nudge,
and mode prompts teach the join primitive (#4097). Harvested from PR #4098
by @Mr-Moon121 (Jeffrey Luna). -
/providerpicker remembers catalog/configured view and highlighted row
across reopen, matching/modelpicker memory. -
Mode picker roster is exactly Act / Plan / Operate (no Multitask, no
numeric4/5gaps). Legacyyolo/4remain invisible one-way
permission shorthand for Act + Bypass. -
Fleet setup is a role/profile roster editor, not a provider-scoped model
picker: the Model step lists routes from every configured provider (not
only the active one), a picked route's provider is persisted explicitly in
the saved profile TOML (provider = "...", never inferred from the model
id), and the loader/route resolver read that field back out verbatim. The
draft-preview save keypress no longer competes with a separate pager's
g/Gscroll bindings — the exact TOML preview now renders inline on the
same Review step that saves it (#4093). -
codewhale fleet runand interactive in-process Fleet launches now honor a
profile-pinned provider/model route instead of merely recording it on the
receipt. Headless workers receive the non-secret--providerand--model
pair; TUI workers resolve the same explicit route in process. Credentials
still come from the worker's environment, provider is never inferred from a
model id, and unpinned workers continue to inherit the run route (#4093,
#4193). -
The Fleet setup
mmodel-assisted redraft no longer drops a picked
cross-provider route: the provider/model the operator chose are re-pinned
onto the drafted profile (a model draft is alwaysprovider: None), so
saving it keeps the explicit route instead of persisting an ambiguous,
provider-scoped profile (#4093). -
Saving a Fleet profile now fails with a clear message when it pins a
provider that has no configured credentials, using the same
configured-provider check the model picker uses (#4093). -
Workflow correctness: completion polling fails closed instead of
fabricating success when a sub-agent reports no terminal status; cancel
interrupts the JS VM (cancel handle + abort) and blocks further spawns;
andbudget.spent()reports real manager-scope usage instead of always 0. -
Sub-agent spawns validate the model↔provider pair before dispatch:
inherited/faster routes remap foreign models to the provider's catalog
default, and explicit pins fail fast with a diagnostic instead of an
upstream model-not-found error. -
TUI stability: engine event drains break every 8–16 events / 8 ms to keep
input live (#1830, #2317, #1198); the terminal input pump restarts after
stall recovery on macOS/Linux too; the startup raw-mode probe no longer
leaks raw mode on timeout; recovery snapshots persist every 45 s during
long turns and the offline queue persists on every push (#1830);
queue/steer paths surface toasts while streaming (#2317, #1338); and
modal submit errors re-open the modal instead of being swallowed (#1198). -
Core/state: paused jobs persist as paused across restarts; unarchive
updates the in-memory cache; tool dispatch has a timeout; MCP
notifications no longer receive responses; corrupted checkpoints surface
errors instead of loading empty state; the session index compacts instead
of growing unbounded; and recording thread-goal usage no longer
self-deadlocks the state store. -
Runtime compaction summaries are now persisted into
/v1thread records so
engine reloads and restarts preserve compacted context. Contributed by
MXAntian (@MXAntian) (#4091). -
The TUI leaves xterm alternate-scroll mode off when mouse capture is disabled,
preserving native terminal text selection in light-theme/no-mouse-capture
sessions. Contributed by Nightt (@nightt5879) (#4088, #4026). -
The public
/api/github/feedendpoint is now forced dynamic on Cloudflare so
it returns live GitHub activity instead of a build-time empty feed.
Security
- Require bearer authentication for
/v1/chat/completions, compare tokens in
constant time, return accurate 4xx/5xx statuses, bound request bodies and SSE
frames, redact secrets from stdioconfig get, and reliably reap the runtime
child during shutdown. - Keep trust precedence and secret persistence fail-closed: user ExecPolicy
rules outrank agent-layer rules, chained commands cannot propose unsafe
trusted-prefix amendments, and config and secret writes are atomic with
filesystem synchronization on every supported platform.
Changed
- Tool-hang watchdog trimmed from 15 minutes to 10 (#1862); approval modal
footer hints use a higher-contrast tier (#3380); status/mode copy is
disclosed once across header, footer, cards, and sidebar instead of
repeated per layer. - Removed the unused
tui::whale_routestaxonomy module and its tests.
Contributed by Darrell Thomas (@DarrellThomas) (#4041, #3852).
Deprecated
- YOLO mode:
--yolo,default_mode = "yolo", and the hotbar YOLO action
now map to Act + Full Access permissions via a compatibility shim and
show a one-shot deprecation notice. Removal is deferred beyond v0.9.0 so
this release does not break existing scripts without a dedicated cutover.
Removed
- Remove the deprecated
deepseekanddeepseek-tuibinary shims in this
breaking release.codewhale,codew, andcodewhale-tuiare the supported
entry points; existing DeepSeek provider support and legacy config/session
migration remain intact.
Known issues
- Android/Termux arm64 remains a preview in v0.9.0. The target, asset wiring,
updater selection, dependency graph, and source-build path have automated or
static coverage, but shell/PTY/config/TUI startup and runtime behavior remain
unverified on a real device (#4236, #4242). Do not use a GNU/Linux arm64
archive in Termux.
Contributors
Thank you to the international community whose code, reports, reviews, and
reproductions shaped v0.9.0:
- @amuthantamil,
@bistack,
@bruce6135,
@CCChisato,
@ci4ic4,
@cyq1017, and
@DarrellThomas. - @eugenicum,
@findshan,
@gaord,
@hmr-BH,
@hongqitai, and
@idling11. - @JayBeest,
@knqiufan,
@LeoLin990405,
@moduvoice,
@mvanhorn,
@Mr-Moon121, and
@MXAntian. - @Angel-Hair,
@nightt5879,
@nsfoxer,
@octo-patch,
@qinlinwang,
@SamhandsomeLee, and
@taixinguo. - @WavesMan,
@wuisabel-gif, and
@yekern.
See CHANGELOG.md for full notes and docs/CHANGELOG_ARCHIVE.md for older releases.