code-whale 0.9.1 - #254
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #253
Created with
brew bump-formula-pr.Details
release notes
codewhale-linux-x64.tar.gzinstall.shcodewhale-linux-arm64.tar.gzinstall.shcodewhale-android-arm64.tar.gzinstall.shcodewhale-macos-x64.tar.gzinstall.shcodewhale-macos-arm64.tar.gzinstall.shCodeWhaleSetup.execodewhale-windows-x64.zipinstall.batcodewhale-windows-x64-portable.zipcodewhale-windows-arm64.zipinstall.batcodewhale-windows-arm64-portable.zipUnix (Linux / macOS):
Windows:
CodeWhaleSetup.exe; it installscodewhale.exe,codew.exe, andcodewhale-tui.exeunder%LOCALAPPDATA%\Programs\CodeWhale\binand adds that directory to the current-user PATH.codewhale-windows-x64.ziporcodewhale-windows-arm64.zipinstall.bat(copies to%USERPROFILE%\bin)%USERPROFILE%\binto your PATHThe 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>, andcodewhale-tui-<platform>) — the npm wrapper and the in-appcodewhale updatedownload the matched runtime binaries, whereas the.tar.gz/.ziparchives above are the recommended manual download and additionally bundle an install script. The legacy npm packagedeepseek-tuiis deprecated and is not republished. For migration from v0.8.x legacy binary names, seedocs/REBRAND.md.Verify (recommended)
Download the checksum manifests from this Release and verify:
What's in v0.9.1
Dogfood follow-ups (2026-07-24)
Added
/compact [focus]: the manual compaction command now accepts anoptional 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.jsfiles under<workspace>/.codewhale/workflows/and~/.codewhale/workflows/arediscovered as
/namecommands that accept custom arguments (forwardedto the run's
args), launch through theworkflowtool in thebackground, and report their run id. Hand-written
.mdcommands withthe same name always win. The workflow tool's
source_pathnow alsoaccepts the user-global
~/.codewhale/workflows/store, and everysettled run leaves a durable synthesized report under
.codewhale/reports/<run_id>.md(status, goal, gates, progress,result, verification).
Fixed
unexplained duplicate: bare
k3is now labeled "Kimi Code plan route"with its default 262K window annotated as the plan-tier floor (raisable
via the provider
context_windowsetting for plans that include 1M),and
kimi-k3is labeled "Moonshot direct route" with its 1M window.Both remain distinct, valid routes for the same underlying model.
agenttool role schema: thetypeproperty nowpublishes the canonical JSON Schema enum
["worker", "scout", "planner", "reviewer", "builder", "verifier", "custom"]instead of describing theaccepted 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 (
><o>).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.rstransport seam already usedby 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_HTTP1H1 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
SubAgentTypetoFleetRolewith canonical variants (Worker,Scout,Planner,Reviewer,Builder,Verifier,Custom) matching the public Fleetvocabulary one-to-one. Wire behavior is unchanged: serialization emits
canonical Fleet values only, and persisted
agent_typefields plusdocumented 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
codewhale web [--port 7878], a first-class loopback-only browserclient 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).
provider with
[providers.opencode_go],OPENCODE_GO_API_KEY, and the eightmodels currently documented on its
/v1/chat/completionsendpoint. Modelsserved only through OpenCode Go's Anthropic
/messagesendpoint remain outof 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).
[providers.telecomjs],TELECOMJS_API_KEY, and a key-scoped live/v1/modelsrefresh. Models.dev and provider-specific catalogs remain inseparate 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).
codewhale,codew, andcodewhale-tuibinaries, 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_skilltool now supports listing: omitnameor pass"list"tosee all available skills without loading one (#4651).
/skillsmanager 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).
current_activitytothe 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).
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).
(
GET /v1/providers,GET /v1/providers/{id}/models,POST /v1/providers/{id}/switch) so the web GUI renders a dynamicprovider/model picker without the setConfig+reload clobber (#4658).
/) in the Fleet setup wizard's Model step: substringmatch over provider id, display label, and model id keeps
OpenRouter-scale catalogs navigable (#4639).
[auto.router]config: explicit provider/model/thinking for the Automode classifier route; unset keeps the DeepSeek flash default, and
missing credentials fall back to the local heuristic.
Changed
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).
show a larger inline reasoning preview with clearer local/full expansion
affordances (#4699, #4701).
File,Git,Run, deferredWeb, and durable task and automation families), with legacyspellings hidden for replay. Fresh sessions no longer reserve a Work surface
before real work exists (PR #4675).
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).
Bashtool with anactionparameter (run/wait/interact/cancel). Legacy
exec_shell*names remain ashidden compat aliases for transcript replay, and the tool-search catalog
keeps
Bashactive by default (#4625).before the fold indicator; full pager (
vkey) unchanged (#4603)./mode agent|plan|operate) now persist tosettings.tomland restore across sessions (#4628).
x-codewhale-provenanceheader with client version and provider (#4324)./modelpicker's typed search now ranks results: provider-namematches first (drill-down), then exact id, then id-prefix, then the
active provider's rows (#4639).
prompts/text.rsmodule (byte-exact constants replacing 17 layered files);
composition order, constitution-first binding, and locale/personality
variants unchanged.
contract:
resolve_tool_permissionin the engine andresolve_approval_request_dispositionin the UI share one truth table forsession grants/denials, non-bypassable policy holds, and modal prompts
(#4412).
(
AutomationTool,TasksTool,GithubTool,RlmTool) while keepinglegacy tool names as hidden compatibility aliases for transcript replay.
max_depth=0) unless thecaller explicitly grants a deeper budget (#4598).
Fixed
uwutheme config round-tripping and keep header permission colorsand authored idle-whale geometry aligned with the selected theme (#4696).
Bashruns with no explicitcwdto the activeToolContext.workspace, including an isolated sub-agent worktree, instead offalling 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).
aarch64-unknown-linux-ohoswith the nativeSDK'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_shellsupport (#4470 by @shenjackyuanjie;original bindgen approach in #4384 by @shenyongqing).
[auto] cost_saving = truein provider-aware heuristic and classifierrouting, 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).
outside tmux, stock
tmux load-buffer -winside tmux, and bracketed pastefor 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).
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
/tasksand archived agent views (#4488; partial#4416).
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-localisexplicitly requested (#4485; partial #4406).
redirects so the Windows provider-persistence matrix cannot observe another
test's transient
CODEWHALE_HOMEor config path (#4483, closing #4463).kimi-k3to its documented 1,048,576-tokencontext window and 131,072-token output limit instead of treating the live
model as an unknown legacy 128K route. The existing Kimi Code tiered
k3route and credential reuse remain unchanged (#4481).
valid across turns and context compaction, while a new session still starts
with an empty tracker (#4475 by @Angel-Hair).
apply_patchexpose the canonicalreplaceoperation while continuingto accept deprecated
changespayloads through one validation path. Mixedpatch, replace, and compatibility modes now fail before any write (#4476 by
@Angel-Hair).
is enabled, using overflow-safe rounded integer math and leaving compact or
disabled status layouts unchanged (#4474 by @dmitri-0).
#fdf6e3) shell backgroundinstead of tinting it green-grey through the default underwater Ombre
treatment, while retaining foreground ambient life (#4457 by
@AiurArtanis; PR #4471 by @nightt5879).
/slopand/canzhaas compatibility aliases of/debt, whilekeeping user-command ownership truthful across dispatch, help, slash
completion, alias copy, and typo suggestions (PR #4680 by @nightt5879).
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).
contract: discovery with issuer/endpoint validation and documented
fallbacks, user-principal scope set, RFC 8628
slow_downbackoff capped atcode 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).
FREQ=HOURLYautomations withBYHOUR/BYMINUTEto persistedlocal-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).
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).
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).
concise, non-authoritative resume checkpoints, keeping their raw runtime
envelopes, sentinels, and retry instructions out of restored model and TUI
conversation state (#4409).
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).
stalled or abandoned provider login no longer hangs the calling session
(#4380).
sessions cannot hang their readers (#4383).
process trees so descendants and pipe readers cannot leak after the parent
shell exits (#4489 by @luismateusvargas).
every high-bit exception or NTSTATUS to
2147483647, including decimal andhexadecimal diagnostic metadata for device retests (#4100 by
@redjade75723).
selection moves beyond the visible rows, including Down past
/export(#4418).
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.
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).
home/workspace paths; entries render workspace-relative or
~/…so thebyte-stable prompt prefix never leaks private paths. A new invariant test
guards absolute paths, API keys, and workspace paths in the prefix (#4632).
settings.toml; they isolate config I/O to a temp directory (#4628).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).
wire aliases instead of the generic 4K fallback (#4655 by @h3c-hexin;
PR #4656).
timing telemetry, distinguishing prefill stalls from mid-stream
stalls with truncated tool-call arguments (#4657 by @h3c-hexin).
set_configprovider 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
authentication and content headers, explicitly allowing
Authorizationinstead of relying on a wildcard (#4454).
Security
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).
atomic provider-switch endpoints (PR #4658).
/skillsroot 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_activitydirection preserved from #2694/#2889 and the real-PTYlifecycle 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).
/debtcompatibility aliaseswith 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).
real-device motivation (#4267).
tracking and the explicit, backwards-compatible
apply_patchreplacementcontract (PRs #4475 and #4476).
in the phase strip (PR #4474).
Bashno-cwdworkspace 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.
View the full release notes at https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.1.