v0.9.6

Hmbown/Codewhalev0.9.6Aug 12, 2026by github-actions[bot]

AI Summary

Codewhale v0.9.6 is a subtractive release focusing on simplifying the runtime, removing legacy guards, and adding Mistral AI support. It consolidates the runtime into a single binary and deprecates legacy installers.

Key Highlights

  • Mistral AI is a first-class provider route including Codestral models.
  • Legacy npm package `deepseek-tui` is deprecated and receives no further releases.
  • Single compiled runtime exposes `codewhale` and `codew` commands.
  • Opt-in telemetry with a native first-run modal.
  • Native image support for PNG, JPEG, GIF, and WebP results.

Breaking Changes

  • Removed the legacy `deepseek` and `deepseek-tui` npm package.
  • Removed the no-progress guard, repeated-read guard, and injected tool-error strategy.
  • Removed the legacy callable aliases `exec_shell`, `read_file`, `write_file`, `list_dir`, `grep_files`, and `file_search`.

New Features

  • Mistral AI provider with Codestral models and first-party reasoning support.
  • `web_search` defaults to Firecrawl Cloud without an API key.
  • Headless `Bash` can transfer persistent Unix services.
  • `/remote-env` opens hosted Work from GitHub or CNB branch tips.
  • ACP editor sessions can execute multi-round file, search, Git, patch, and shell tool calls.

Full 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, both entrypoints)

```bash
npm install -g codewhale
```

The wrapper downloads the matched `codewhale` and `codew` command assets
from this Release. Both contain the same compiled runtime.

### 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.6
```

The image exposes the same runtime as both `codewhale` and `codew`. The
`latest` tag is also updated on release.

### Cargo (Linux / macOS)

```bash
cargo install codewhale-cli --locked
```

The Cargo package installs `codewhale`. Cargo cannot create a second command
alias from one binary target; users who want the shorter spelling can add a
`codew` symlink to that installed executable. The npm, Homebrew, archive,
shell-installer, and container channels install both command names directly.

### Manual download — platform archives (recommended)

Each archive below contains the same runtime under the `codewhale` and
`codew` command names, 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` | — |
| Windows ARM64 | `codewhale-windows-arm64.zip` | `install.bat` |
| Windows ARM64 (portable) | `codewhale-windows-arm64-portable.zip` | — |

**Unix (Linux / macOS):**
```bash
tar xzf codewhale-<platform>.tar.gz
cd codewhale-<platform>
./install.sh
```

**Windows:**
- For the installer path, run `CodeWhaleSetup.exe`; it installs
  `codewhale.exe` and `codew.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** `codewhale-<platform>` and
`codew-<platform>` assets. The seven `codewhale-tui-<platform>` filenames
attached to v0.9.5 are byte-identical compatibility copies used only to let
already-installed v0.9.4 clients discover and cross this single-binary
transition; current installers do not expose a third runtime. 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.6

Codewhale v0.9.6 is a subtractive release: fewer runtime guards, one stable
prompt, truthful provider endings, and a smaller compaction path that preserves
the provider cache. The changes were grounded by matched Terminal-Bench 2.1
runs against Pi 0.8.41 and by dogfooding repeated manual compaction.

### Added

- `web_search` defaults to Firecrawl Cloud without an API key; keyless requests
  are headerless and quota-bounded, while an optional user key raises limits.
- Green web builds on `main` now emit an actionable manual-deploy reminder, so
  site changes cannot quietly appear shipped while Cloudflare still serves an
  older revision.
- Mistral AI is a first-class provider route, including Codestral models,
  first-party reasoning support, authentication, picker entries, and aliases.
- Headless `Bash` can transfer explicitly requested persistent Unix services
  out of an exec run, with ownership and cleanup receipts.
- `/remote-env` opens hosted Work from the current GitHub or CNB branch tip and
  states exactly which unpushed, dirty, ignored, secret, and session state stays
  local.
- Linux ARM64 release and nightly assets are static musl builds with native
  launch checks.
- Maintainers can report observed daily active installs from the same anonymous,
  aggregate telemetry dataset; no additional client data is collected.
- Fleet-dispatched members under a read-only evidence (no-network) ceiling now
  keep the `Web` tool's read-only `search` and `fetch` actions — parity with an
  ordinary scout — while every reaching surface (`web.run`, `fetch_url`,
  `github`, MCP) stays denied and the sentinel-backed capability envelope
  remains the fail-closed backstop.
- `/fleet setup` can show an optional, deterministic, unratified role-to-model
  advisory built only from configured ready routes. Accept, edit, and reject
  all remain inside the existing human-reviewed profile save boundary; the
  advisory never launches a Fleet or writes a second configuration.
- `/update` checks for a newer Codewhale release and installs it from inside
  the TUI, while `tui_help` gives agents the same command and key map users see.
- Markdown file paths render as OSC 8 links where the terminal supports them,
  and every agent row can open that agent's transcript directly.
- ACP editor sessions can execute multi-round file, search, Git, patch, and
  explicitly enabled shell tool calls through the shared Runtime registry.
  Shell access requires both the client's terminal capability and Codewhale's
  headless shell opt-in, and cancellation stops an in-flight tool before the
  turn returns (#5225 by @rafaelcavalheri).
- Lowercase `read` returns bounded typed PNG, JPEG, GIF, and WebP results to
  image-capable Chat, Responses, Anthropic, and ACP routes. Text-only routes
  receive an explicit omission receipt; image bytes never spill into ordinary
  transcript, export, compaction, or relay text.

### Changed

- Anonymous usage counting is on by default for fresh installs and disclosed in
  a native first-run Codewhale modal with an immediate opt-out. Prior declines
  remain off. Codewhale does not collect conversations, code, prompts, files,
  repo or branch names, credentials, model content, or per-turn activity
  timelines.
- Wide terminals use a responsive, full-screen ocean canvas with modest
  gutters: prose keeps a readable measure while tools, diffs, work surfaces,
  the composer, and status chrome can use the available width. Turn and major
  activity seams breathe without padding every call inside a tool group.
- Root CLI help describes product actions directly instead of exposing internal
  TUI/runtime layers.
- `Bash action="wait"` now blocks by default when a wait is requested; callers
  can still ask for a nonblocking snapshot, and persistent service ownership
  remains explicit.
- Compaction is one cache-stable summary request followed by one committed
  replacement summary and a bounded recent-message tail. Older saved sessions
  still restore.
- Ask, Work, Auto-Review, and Full Access share one stable base prompt. Modes
  continue to differ through permissions and the live tool catalog; the former
  Act label is now Work throughout the product and shipped locales.
- Full Access now auto-approves non-bypassable tools consistently, and the
  default choice shown on ordinary approval cards is configurable.
- Model, context-window, dispatch-name, and nested-agent spawn receipts report
  the route and limits actually used rather than silently substituting a
  guessed identity.
- Child-agent launches mint one immutable route receipt before admission and
  preserve it through status, interruption, completion, resume, Work Graph,
  and ledger projections, so provider/model attribution cannot drift (#5305).
- Goal runs no longer stop because of internal continuation, repeated-gap, or
  unanswered-question guards. Explicit user limits and terminal goal states
  remain authoritative.
- Account-owned `/rc` remote control now keeps exclusive ownership and a
  crash-recoverable delivery journal until the server acknowledges terminal,
  approval, failure, and snapshot state.
- `todo_write` is an optional progress surface rather than required model
  ceremony.
- New turns use one small, stable toolbox: `read`, `write`, `edit`, `bash`,
  `agent`, `todo_write`, and `tool_search`. The optional progress tool stays
  visible as familiar working memory; specialized native, Web, MCP, plugin,
  memory, task, and verification tools are policy-filtered and searchable;
  activated schemas stay in a bounded per-conversation cache. Every sub-agent
  keeps its own search and cache, including policy-allowed Web research, while
  forked context and parent activations remain warm starts rather than allowlists.
- The direct file and shell schemas follow Pi's deliberately small contract:
  bounded complete-line reads, hash-free writes, unambiguous multi-edit with
  BOM/CRLF preservation and conservative fuzzy matching, and one foreground
  `bash` command with a bounded chronological output tail. Modes change
  execution authority, not those primitive names.
- Codewhale no longer re-states the To-do list to the model. The model learns
  what is on the list from the tool result its own `todo_write` call returned,
  which is ordinary conversation history — the same way Pi's To-do works. The
  transient `<codewhale:work_state>` block that used to ride the tail of every
  parent turn-loop and sub-agent step request is gone, along with the stable
  system prefix being disturbed by list changes. A snapshot is still shown once,
  where a person asked for it: the `<codewhale:fork_state>` block a newly forked
  sub-agent is handed, `/relay` handoff instructions, and the agent card. The
  complete To-do stays visible in the UI. A structural test asserts real
  outbound provider request bodies do not carry the list.
- Scout and Reviewer name the read-only investigator roles. Both expose exactly
  one shell entry point — canonical lowercase `bash`, bounded by the strict
  read-only classifier — and the legacy `Bash` alias stays denied in the catalog
  and at dispatch. Previously a case-insensitive name match let a call spelled
  `Bash` execute through that carve-out, returning raw shell to a read-only role.

### Fixed

- Sending more context while a lowercase `bash` command is running now moves
  the command to `/jobs` and returns a successful running receipt instead of
  falsely reporting `Command exited with code -1`; the process keeps running
  and its completion still arrives through the normal runtime event.

- First-run usage disclosure now opens as a native Codewhale modal instead of a
  shell questionnaire before application startup. Telemetry remains unarmed
  until the native choice is made, and an in-memory Disable choice governs the
  current session even when its preference cannot be saved.
- `/compact` completion, failure, queued, duplicate, and mailbox outcomes are
  durable transcript receipts instead of short-lived toasts. A stray terminal
  event can no longer leave every later compaction stuck as already running.
- Compaction now follows Codex's simple transcript shape: recent user context
  followed by one ordinary history checkpoint. It never appends the summary,
  the To-do list, or volatile shell/worker state to the standing system prompt;
  reloads migrate the persisted carrier back into exactly one history item.
- Automatic compaction uses a percentage of the real context window, clamped to
  the route's spendable ceiling. Pressure comes from the current parent-route
  prompt, not cumulative billing or child-model usage.
- Compaction, review, verify, routing, setup, Fleet, MCP, RLM, vision,
  translation, and sub-agent calls inherit the resolved route's normal output,
  sampling, and reasoning policy. Small internal-task token caps no longer
  truncate thinking routes or special-case individual providers.
- Incomplete provider responses fail truthfully across ordinary turns and every
  internal model consumer. Partial text stays interrupted, pending tool calls do
  not execute, and billed usage is retained.
- Transport-only `(reasoning omitted)` placeholders no longer enter new
  transcripts and are filtered from restored sessions. Reasoning expand/collapse
  actions stay attached to the exact rendered cell, including after replacement,
  restore, filtering, and resize (#5291).
- Step-budget exhaustion is a typed failure and cannot release a pending
  persistent service. Cancellation after terminal usage still charges the turn.
- Deferred tools now preserve a completed result when a provider reuses its
  tool-call ID on the retry turn, preventing successful plugin calls from
  entering a repeated execution loop.
- Website setup, provider, diagnostics, Fleet, and single-runtime claims now
  match the source candidate.
- Opening the sub-agent register no longer hides the to-do list: the Agents
  panel shows the full register and the durable checklist together, and the
  register header is a two-way door that returns to Tasks on a second click.
- The ⌥V / Alt+V details chord opens the selected work-surface row's own
  inspector instead of the transcript's nearest tool cell, so a selected
  to-do row shows its own content rather than the latest reasoning.
- The first-run usage disclosure now asks a clear question — "Help improve
  Codewhale?" — with unambiguous "Yes, keep anonymous counts" / "No, turn off
  tracking" choices in every shipped locale, and states the persistent opt-out
  command. Consent semantics are unchanged: telemetry stays unarmed until a
  choice is made.
- macOS screencapture screenshots referenced in a message are copied to a
  stable attachments directory the moment the message is received, and the
  reference is rewritten to the stable path, so the image still exists when
  the agent reads it. Only files under a screencapture "Temporary Items"
  directory are touched; copies are idempotent and a failed copy keeps the
  original reference.
- Manual `/compact` during an active turn now queues even when the engine's
  bounded op mailbox is saturated. The request defers client-side, retries as
  mailbox slots free, and cannot latch as already running after it settles.
- Interactive `/load`, startup `--resume`, and `/resume` picker paths preserve
  the persisted provider, endpoint, and model identity; picker resume also
  leaves a durable transcript receipt.
- Relative `mcp_config_path` values no longer depend on the launch directory or
  silently load an empty server pool: Codewhale warns and falls back to the
  user-global MCP configuration. Explicit absolute paths remain authoritative.
- Alibaba Model Studio `qwen3.8-max` and `qwen3.8-max-preview` still stream
  their current reasoning, but no longer replay historical `reasoning_content`
  that those routes do not accept. Historical reasoning replay is now gated by
  the exact provider/API/model contract, so unknown `*-thinking` lookalikes
  fail closed while documented Qwen, Kimi, DeepSeek, Mistral, Anthropic, and
  Responses continuity rules remain intact.
- Compatibility File/patch calls retain optional content-hash guards when a
  caller supplies them. The new direct `write` and `edit` schemas do not expose
  hash or prior-read ceremony.
- Shell previews hold back incomplete UTF-8 sequences instead of emitting
  replacement characters, and compaction receipts report token deltas.
- Nested agents may narrow but can never widen their inherited depth budget
  (#5317 by @ousamabenyounes).
- Container publication now assembles AMD64 and ARM64 images in parallel on
  native runners from the already-verified static release binaries, then
  publishes and checks one multi-architecture manifest. It no longer rebuilds
  both targets through the single long-running QEMU job that lost its runner.

### Removed

- The no-progress guard, repeated-read guard, and injected tool-error strategy
  coaching. Productive polling, repeated inspection, and model-owned recovery
  are no longer interrupted by runtime heuristics.
- Never-wired decision-card, keybinding, hover, shell-execution, engine-op, and
  release-script paths were deleted so the supported runtime has one route for
  each behavior.

## Contributors

- Xavier Pestel (@xavierpestel-ai) — Mistral AI provider route (#5295).
- Ben Younes (@ousamabenyounes) — inherited nested-agent depth cap (#5317).
- Rafael Cavalheri (@rafaelcavalheri) — ACP agentic tool turns (#5225).

See [CHANGELOG.md](https://github.com/Hmbown/CodeWhale/blob/main/CHANGELOG.md) for full notes and [docs/CHANGELOG_ARCHIVE.md](https://github.com/Hmbown/CodeWhale/blob/main/docs/CHANGELOG_ARCHIVE.md) for older releases.