Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 62 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.4.0] - 2026-08-02

### Added

- **Fusion models — give a text-only model vision.** Some strong reasoning
Expand Down Expand Up @@ -49,11 +51,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
refers to. `deepseek-v4-pro`, `deepseek-v4-flash`, `glm-5.2`, and `glm-5.1`
are now marked vision-less in the model table.

[claude-code-router]: https://ccrdesk.top/en/configuration/fusion-models/
Fusion models, the `/fusion` command and the shared persisted-model
resolution below all land in #771.

### Added
[claude-code-router]: https://ccrdesk.top/en/configuration/fusion-models/

- **GPT-5.6 (Sol / Terra / Luna).** OpenAI's current frontier generation is
- **GPT-5.6 (Sol / Terra / Luna)** (#773). OpenAI's current frontier generation is
three durable capability tiers on one generation rather than a size ladder:
Sol is the flagship, Terra balances capability against cost, Luna is the
cheap high-volume tier, and `gpt-5.6` is OpenAI's alias for Sol. All four are
Expand All @@ -74,9 +77,61 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
(`SUBSCRIPTION_MODELS`) is also untouched, since which models that backend
serves is a wire fact that has to be observed rather than assumed.

- **`AskUserQuestion` actually asks.** The tool was advertised but never
wired: its raw JSON payload was returned to the model as the tool result,
so the model saw a blob instead of the user seeing a picker. The TUI now
renders a real multiple-choice dialog and sends the choice back (#774).

- **Four more OpenAI-compatible providers** — `groq`, `cerebras`, `baseten`
and `xai` — bringing the registry to 30. Each ships a curated model list
that live `/models` discovery extends rather than replaces (#784).

- **Fusion models are runnable under the Terminal-Bench harness.** A fusion
model lives in global config and is selected by name, so a fresh eval
container could not resolve one; `--ak fusion=<base>+<vision>` seeds the
record and the base provider (#787).

### Fixed

- **OpenRouter's curated model list offered ids OpenRouter had delisted.** The
- **Reasoning effort never reached the wire for any OpenAI-compatible
provider.** `--effort` was emitted only on the Anthropic branch, so every
DeepSeek/OpenRouter/GLM run silently ignored it — including benchmark runs
that reported an effort setting in their config and sent nothing (#776).

- **The first-party OpenAI provider chose its wire protocol from the auth
mode**, not the model: an API key meant Chat Completions, which rejects
tools outright for some reasoning models (`gpt-5.6-luna` 400s even with no
effort set). Protocol now follows the model and auth only picks the route,
which is what makes those models usable on an API key at all (#783).

- **Cached prompt tokens were billed at the full input rate.** `prompt_tokens`
includes tokens served from the cache, and the cached count was dropped, so
a heavily-cached turn over-reported its cost several-fold. Both wires now
split cache reads out. The same change surfaced that OpenRouter's streamed
reasoning was discarded entirely — it sends `delta.reasoning`, and only
`reasoning_content` was read (#785).

- **`result.usage` omitted cumulative cache tokens**, so anything pricing it
billed the cached portion at nothing, and `/goal`'s token budget saw a
fraction of what had been spent. Turn cost is now read from the cost
tracker, which prices each response individually — pricing the aggregate
crosses a per-request tier boundary no single request came near (#786).

- **Headless runs reported success after stopping early.** A cut-short run,
a loop-guard kill, and a plan-mode trap all surfaced as
`subtype: "success"`; `/goal` then treated the result as evidence of
progress and re-ran on cancels and errors (#777, #778, #779, #780).

- **A rejected image ended the turn instead of being recovered.** The
"too many images" path is now classified and retried, and the reactive
recovery lane — dead since a typed error stopped matching a string-only
gate — runs again (#781, #782).

- **TUI:** the header box lost its right border and could lose the border
entirely on first paint (#769, #770); the scrollbar stretched its sibling
and blanked the transcript on terminal resize (#775).

- **OpenRouter's curated model list offered ids OpenRouter had delisted** (#773). The
OpenAI section still led with `openai/gpt-5` / `openai/gpt-4o` / `openai/o1`
while the gateway had moved on to the `gpt-5.6` family, and
`openai/o1-mini` had been removed upstream entirely — so the /model picker
Expand All @@ -101,7 +156,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
drift reads as a model one surface offers and the other drops, so the
provider now reads the registry.

- **`/model` listed one provider instead of every configured one.** Step 1 of
- **`/model` listed one provider instead of every configured one** (#772). Step 1 of
the picker showed a single row — `anthropic · 22 models` — no matter how many
providers were set up. `model.options` was a stub: it called the
`get_settings` control, which describes only the provider the session is
Expand Down Expand Up @@ -142,7 +197,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
reports that reason instead of inventing a provider row.

- **`--model`/`/model` selection is now resolved from one rule at every
entrypoint.** The persisted `/model` choice was applied only in the
entrypoint** (#771). The persisted `/model` choice was applied only in the
interactive agent-server, and only *after* the provider was constructed
(`_build_runtime`'s post-construction `provider.model = ...`). Headless
(`-p`) ignored it entirely, so a `/model` switch had to be re-stated with
Expand All @@ -160,7 +215,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- **Permissions are now loose by default and easy to change.** `/mode` is
- **Permissions are now loose by default and easy to change** (#768). `/mode` is
renamed `/permissions` (the old name still works as an alias) and bare
`/permissions` opens a three-option picker — *Ask for approval*, *Approve for
me*, *Full Access* — instead of requiring a raw mode name. A bare interactive
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ The `session`, `settings`, and `env` blocks are optional — sensible defaults a

## 📰 News

- **2026-08-02 (v1.4.0):** **Fusion models — give a text-only model vision (#771, #787)** — several strong reasoning models cannot see images at all: `deepseek-v4-pro` rejects an image content block outright (`400 unknown variant \`image_url\``), so pasting a screenshot, `@`-mentioning one, or letting `Read` return one ended the turn. A **fusion model** pairs that base model with a second, vision-capable one — every image is described by the vision model first, and the base model reads the description. `/fusion create <name> <base> <vision>` saves one; it then behaves like a normal model in the `/model` picker, as `--model <name>`, in `-p`, and across restarts. Ported from [claude-code-router](https://ccrdesk.top/en/configuration/fusion-models/)'s Fusion Model concept, with one deliberate difference: CCR is a proxy, so it can only offer vision as a *tool* the model may choose to call — which cannot help a pasted image, already on the wire before the model gets a turn. ClawCodex owns the agent loop, so it substitutes images in place, covering paste, `@file.png`, `Read`, and Bash image output at once. Verified end to end on Terminal-Bench 2.1's `code-from-image` task — transcribing handwritten pseudocode from a PNG and reproducing its output — with `deepseek-v4-flash` + `openai:gpt-5.6-luna` (#787); the base model alone returns a 400 on the same image. **Also in v1.4.0:** GPT-5.6 Sol/Terra/Luna (#773); four more OpenAI-compatible providers — groq, cerebras, baseten, xai — taking the registry to 30 (#784); `/mode` becomes `/permissions` with a three-level picker and Full Access by default (#768); `AskUserQuestion` finally renders a real picker instead of returning JSON to the model (#774); the OpenAI provider now picks its wire protocol from the model rather than the auth mode, which is what makes `gpt-5.6-luna` usable on an API key (#783); cached prompt tokens are billed at the cache rate instead of the full input rate, and OpenRouter's streamed reasoning is no longer discarded (#785, #786); and headless runs stop reporting a cut-short run as a success (#777–#782).
- **2026-07-29 (v1.3.0):** **ClawCodex scores 80.9% on Terminal-Bench 2.1 — a top-tier open-source result on Opus 5 (#720–#725, #747–#754)** — running headless on `claude-opus-5` at `effort=xhigh`, ClawCodex solved **72 of 89** Terminal-Bench 2.1 tasks: **80.9% pass@1** on a single run. On the [public 2.1 leaderboard](https://www.tbench.ai/leaderboard/terminal-bench/2.1) (k=5 averages) that would slot **around third** — behind Claude Code / Fable 5 (83.8%) and Codex / GPT-5.5 (83.1%), statistically level with the 79–80% cluster, and **ahead of Claude Code on Opus 4.8 (78.9%) and Sonnet 5 (74.6%)**. Getting there was open, unglamorous parity work: a Harbor eval adapter (`eval/harbor/`) for three-way ClawCodex-vs-openclaude-vs-Claude-Code runs (#720, #724, #725), then a run of prompt- and reliability-parity fixes — restored task-tool skip conditions and parallel-tool guidance, deferred nonessential initial tools, and recovery of trials lost to empty turns and transport drops (#747–#754). **Also in v1.3.0:** `claude-opus-5` support with an interactive `/effort` fix (#746), bounded persistent memory with a background self-improvement review (#731), a VS Code extension driving the agent-server over stdio (#727), image-paste input with an `[Image #N]` un-attach chip (#761, #762), the `CLAUDE.md → CLAWCODEX.md` context-file rebrand (#732), and transport-retry hardening (#757, #760). Stated plainly: this is a single k=1 pass (binomial 1σ ±4.2pp) against the board's k=5 ± ~1.2pp averages, benchmarked on `main` at #756 (before the v1.3.0 tag), so read it as directional rather than a ranked submission.
- **2026-07-13:** **`/eco` token compression — -80% Bash-output tokens, measured, now a headline (#708, #712)** — a new session toggle compresses the model-bound rendering of every Bash result with deterministic filters ported from [RTK](https://github.com/rtk-ai/rtk)'s method set: failure-focused test summaries (kept error lines are never rewritten), `git`/`pip`/`npm` ceremony stripping, log dedup with `[×N]` counts, and a recoverable head-cap — all behind a **never-worse** guard, with every lossy compression teeing the full output to disk behind a runnable recovery hint (#708). A reproducible benchmark (`eval/eco/`) replays 27 real command outputs through the exact production pipeline and counts real tokenizer tokens: **92,989 → 17,767 (-80%)** corpus-wide, -88% on filter hits, plus an honestly conservative recompute of RTK's own 30-minute-session model (-19% under their averaged assumptions — real sessions are fat-tailed) (#712). Full tables: the [`/eco` section](#eco-benchmark) and [`eval/eco/results/`](eval/eco/results/results.md).
- **2026-07-12 (v1.1.0):** **ClawCodex v1.1.0 — run OpenAI *and* Claude models on your subscription, not metered API billing** — the headline of 1.1.0 is **subscription auth for the two biggest model families**, so you can point ClawCodex at a plan you already pay for. **Sign in with ChatGPT (#698):** `clawcodex login → openai → subscription` (browser, device-code, or import from an existing Codex CLI login) routes requests through the ChatGPT Codex backend's Responses API — `gpt-5.5`, `gpt-5.4`, `gpt-5.4-mini`, and `gpt-5.3-codex-spark` on your Plus/Pro allowance, with encrypted-reasoning replay across turns and **$0** metered cost. **Claude Pro/Max (#697):** `clawcodex login → anthropic → subscription` connects a Claude subscription via OAuth (PKCE) with automatic token refresh and the same $0 accounting; follow-ups repaired the login after Anthropic moved its OAuth endpoints to `platform.claude.com` (#702) and stopped sending adaptive thinking to models that don't support it (#699). A configured API key always wins, and subscription usage reports `billing_mode: subscription`. **More models:** a Meta (`api.meta.ai`) provider with the 1M-context `muse-spark-1.1` reasoning model (#692) and refreshed MiniMax parameters (#696). **Workflow & TUI:** `/plan` mode with implicit plan-mode entry/exit (#676), `--worktree/-w` session isolation for parallel runs in separate git worktrees (#672), the `/memory` picker + `$EDITOR` spawn (#693), config/state directories rebranded `.claude → .clawcodex` with a one-time migration (#678), `/logo` startup color schemes (#677), plus TUI polish — Tab accepts the suggested placeholder (#690), past inputs get the Claude-Code highlight band (#691), clickable agent URLs (#694), and a per-terminal link-open affordance (#701). **Quality:** semantic tool-input coercion with parity validation errors (#700) and looser, Claude-Code-faithful permission granting (#673).
Expand All @@ -144,7 +145,6 @@ The `session`, `settings`, and `env` blocks are optional — sensible defaults a
- **2026-06-30 (v0.7.0):** **ClawCodex v0.7.0 — TUI auto-theming, faithful inline rendering & a Claude-Code-style tool trail** — the Ink TUI now detects your terminal's background color (OSC 11) on startup and selects the light/dark theme to match, so text stays readable on any terminal with no env var needed (#577). Inline mode renders *truly* inline like Claude Code: no screen wipe on launch, and no overlap with prior terminal output on startup or with the returning shell prompt on exit (#573, #575). The tool trail reads Claude-style — workspace-relative paths (`Read(src/foo.ts)`), `Grep(pattern)` labels, and a `Read N lines` result collapse (#574) — and the banner gains a 🦞 mascot with brighter secondary text on dark themes (#576).
- **2026-06-24 (v0.6.0):** **ClawCodex v0.6.0 — interactive TUI REPL parity** — a batch of input ports brings the Python REPL to parity with the ink reference: a working slash-command menu (execute / complete / filter like the ink REPL), the sparkle spinner with a live token + elapsed busy row, context-aware prompt footer hints (interrupt / bash / grammar), the `?` shortcuts help panel, an `@` file-mention dropdown with in-place splice, double-press Ctrl+C / Ctrl+D to exit, Ctrl+R history search + double-Esc clear-draft, a `[Pasted text #N +K lines]` large-paste placeholder, and the completed command queue (drain queued prompts + dim preview). Login docs now list all 25 providers (#383).
- **2026-06-23:** **One-click installer** — `curl -fsSL https://clawcodex.app/install.sh | bash` installs uv (no sudo), provisions Python 3.10+, clones to `~/.clawcodex`, creates a lock-pinned venv, and registers `clawcodex` on PATH; ships status / doctor / verify / update / uninstall subcommands, is safe to re-run, and works on macOS / Linux / WSL.
- **2026-06-21:** **18 new LLM providers — the registry grows 7 → 25 (#377)** — a data-driven `ProviderSpec` registry adds 18 OpenAI-compatible backends (nvidia-nim, fireworks, together, moonshot/Kimi, novita, siliconflow, deepinfra, stepfun, arcee, huggingface, volcengine, xiaomi-mimo, atlascloud, wanjie-ark, plus local ollama / vllm / sglang) alongside the hand-written providers; alias-aware config resolution, standard env-var key fallback (e.g. `TOGETHER_API_KEY`), and keyless local servers.
📚 Older items have moved to the full **[News archive](docs/NEWS.md)**.

***
Expand Down
Loading
Loading