From 8f5da804a9e12e085e9f2769a91dfba44a71ae89 Mon Sep 17 00:00:00 2001 From: CodeWhale Bot Date: Mon, 7 Sep 2026 07:16:44 -0700 Subject: [PATCH] chore(release): prepare v0.9.13 Version bumps across the workspace, npm packages, VS Code extension, and facts surfaces; CHANGELOG 0.9.13 section with the release narrative, the missing #5989 receipts (ACP schema, queue data loss, metrics, goal-loop), the truncated-tool-args fix, the paste regression fix, allow_insecure_http, the Computer Use 0.2.0 bundle refresh, an upgrade-notes subsection (re-trust Computer Use), and the 0.9.13 contributor ledger; derived web surfaces regenerated (changelog.generated, facts.generated, GT catalogs); contributor credits chain in parity (CHANGELOG ledger = website arrays = docs/CONTRIBUTORS.md band = facts requiredCandidateCredits); INSTALL.md and the trust/telemetry copy bumped to 0.9.13. Gates: web 407/407 (npm test); check:facts OK; check:locales OK; check-versions OK (workspace/npm/npm-binary/lockfile = 0.9.13); feature release-note receipts OK (15); prepare-release transaction completed. Signed-off-by: CodeWhale Bot --- CHANGELOG.md | 71 +++- Cargo.lock | 42 +-- Cargo.toml | 2 +- crates/agent/Cargo.toml | 2 +- crates/app-server/Cargo.toml | 22 +- crates/cli/Cargo.toml | 28 +- crates/command-contract/Cargo.toml | 2 +- crates/config/Cargo.toml | 6 +- crates/core/Cargo.toml | 16 +- crates/execpolicy/Cargo.toml | 2 +- crates/hooks/Cargo.toml | 4 +- crates/lane/Cargo.toml | 2 +- crates/secrets/Cargo.toml | 2 +- crates/state/Cargo.toml | 4 +- crates/telemetry/Cargo.toml | 10 +- crates/tools/Cargo.toml | 2 +- crates/tui/CHANGELOG.md | 377 ++++----------------- crates/tui/Cargo.toml | 30 +- docs/CONTRIBUTORS.md | 9 + docs/INSTALL.md | 12 +- docs/public-surface-facts.json | 22 +- extensions/vscode/package-lock.json | 4 +- extensions/vscode/package.json | 2 +- npm/codewhale/package.json | 4 +- npm/runtime-sdk/package.json | 2 +- package-lock.json | 4 +- scripts/remote-smoke/setup-vm.sh | 2 +- web/gt-catalog/en.json | 2 +- web/gt-catalog/zh.json | 2 +- web/lib/changelog.generated.ts | 150 +++----- web/lib/facts.generated.ts | 4 +- web/lib/i18n/dictionaries/en/docs-trust.ts | 2 +- web/lib/i18n/dictionaries/zh/docs-trust.ts | 2 +- web/lib/release-credits.ts | 24 +- 34 files changed, 319 insertions(+), 552 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3b419f5e63..6a5f6342ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.13] - 2026-09-07 + +Codewhale v0.9.13 is the integrity release for 0.9.12: multiline paste is +one paste again, truncated tool arguments can no longer execute, strict +ACP clients connect again, concurrent instances stop destroying each +other's queued text, and the Computer Use bundle ships at plugin 0.2.0 +with an accessibility-first pointer. + ### Fixed - Pasting multiline text is one paste again. 0.9.12 gated the @@ -19,6 +27,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 the session once a real `Event::Paste` arrives, so fast typing on terminals with working bracketed paste is unaffected (#5981, thanks @nsfoxer). +- `serve --acp` no longer breaks strict JetBrains clients: the + `initialize` response advertised `sessionCapabilities.list` as a + boolean and carried an undefined nested `load` capability; it now + sends `{"list": {}}` with no `load` key, per the ACP schema (#5969, + reported by @Lujc0523). +- Concurrent Codewhale instances no longer destroy each other's queued, + unsent text. The offline input queue was one global file that boot + cleared on session-id mismatch, so a second instance deleted the + first's parked messages. Queues are now keyed per session (mirroring + per-session checkpoints), an existing global file is adopted by its + owning session rather than discarded, and the adoption race between + two instances of the same session tolerates the loser's cleanup. +- A tool call truncated at the provider's output limit can no longer be + repaired into valid JSON and executed: repairs that had to synthesize + structure (append or discard closers) are routed to the existing + malformed-arguments path so the model is asked to re-issue — including + when the stream is cut before the closing content-block event (#5986). +- `codewhale metrics` reads Codewhale's own receipts again: the + deepseek-home fallback resolved `$HOME/.deepseek` unconditionally, so + the rollup reported all zeros from a directory nothing has written + since 2024. The Codewhale audit log is primary, with a checked legacy + fallback. +- The goal-continuation loop's promised stall bound actually bounds + stalls now, and undeclared fleet role names fail closed to read-only + `explore` in both fleet drivers instead of resolving to write-capable + customs in one and not the other. - `allow_insecure_http = true` under a `[providers.]` table works again. 0.9.12 tightened plain-HTTP base URL handling in a way that silently dropped the per-provider key, leaving the process-wide env @@ -47,8 +81,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - The built-in Computer Use plugin bundle is refreshed to the standalone - plugin's 0.2.0 runtime (vendored from `Hmbown/codewhale-cu-plugin` @ - `906b433`): the native macOS accessibility backend with an + plugin's 0.2.0 runtime (vendored from `Hmbown/codewhale-cu-plugin` + PR #12 @ `906b433`): the native macOS accessibility backend with an a11y-first pointer strategy (covered points are refused, previews are drawn), the permission-owning desktop-app socket transport, remote computers over ssh and HarmonyOS HDC with contained temp handling, @@ -226,6 +260,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [@goransh-walia](https://github.com/goransh-walia) for the original implementation (PR #5870, fixes #3999). +### Contributors + +- **[@nsfoxer](https://github.com/nsfoxer)** — reported the 0.9.12 + multiline-paste regression with a root-cause analysis that made the + fix a one-day turnaround (#5981). +- **@Nefelibata1024** — confirmed the paste regression's impact. +- **[@Gabriel-Degret](https://github.com/Gabriel-Degret)** — reported + `allow_insecure_http` being silently dropped in 0.9.12, with the + valid-key list that pinned it (#5991). +- **[@Lujc0523](https://github.com/Lujc0523)** — reported the ACP + `initialize` schema violation that made Codewhale unusable from + JetBrains IDEs (#5969). +- **[@gaord](https://github.com/gaord)** — the fleet role-precedence + recovery (#5945) and the README link to the community VS Code + frontend (#5992). +- **[@goransh-walia](https://github.com/goransh-walia)** — the + propose-only `commit_plan` rework (#5870). + +### Notes + +- Upgrading from 0.9.12 with Computer Use trusted and enabled: the + bundle's content hash changes with the 0.2.0 refresh, so the plugin + deactivates and asks for a fresh review — that is the designed + fail-closed path for a desktop-driving plugin. Re-trust it from the + Extensions page. +- The multiline-paste fix restores v9.11 behavior on terminals that + accept `EnableBracketedPaste` but deliver pastes as keystrokes + (reported on Windows 11 / PowerShell). Verified at the input-contract + level and in CI; a manual paste check on a real Windows terminal is + still welcome — please comment on #5981 with your terminal if anything + still misbehaves. + ## [0.9.12] - 2026-09-03 Codewhale v0.9.12 puts computer use in the binary, opens two new routes — @@ -8144,6 +8210,7 @@ overflow report and `/theme` picker edge-wrapping patch in #1814. Older releases (v0.8.39 and earlier) are archived in [docs/CHANGELOG_ARCHIVE.md](docs/CHANGELOG_ARCHIVE.md). [Unreleased]: https://github.com/Hmbown/CodeWhale/compare/v0.9.12...HEAD +[0.9.13]: https://github.com/Hmbown/CodeWhale/compare/v0.9.12...v0.9.13 [0.9.12]: https://github.com/Hmbown/CodeWhale/compare/v0.9.11...v0.9.12 [0.9.11]: https://github.com/Hmbown/CodeWhale/compare/v0.9.10...v0.9.11 [0.9.10]: https://github.com/Hmbown/CodeWhale/compare/v0.9.9...v0.9.10 diff --git a/Cargo.lock b/Cargo.lock index 437f7eec84..9bcba1b616 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -764,7 +764,7 @@ dependencies = [ [[package]] name = "codewhale-agent" -version = "0.9.12" +version = "0.9.13" dependencies = [ "codewhale-config", "serde", @@ -772,7 +772,7 @@ dependencies = [ [[package]] name = "codewhale-app-server" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "axum", @@ -802,11 +802,11 @@ dependencies = [ [[package]] name = "codewhale-build-support" -version = "0.9.12" +version = "0.9.13" [[package]] name = "codewhale-cli" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "chrono", @@ -848,14 +848,14 @@ dependencies = [ [[package]] name = "codewhale-command-contract" -version = "0.9.12" +version = "0.9.13" dependencies = [ "codewhale-core", ] [[package]] name = "codewhale-config" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "codewhale-execpolicy", @@ -875,7 +875,7 @@ dependencies = [ [[package]] name = "codewhale-core" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "async-trait", @@ -900,7 +900,7 @@ dependencies = [ [[package]] name = "codewhale-execpolicy" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "codewhale-protocol", @@ -909,7 +909,7 @@ dependencies = [ [[package]] name = "codewhale-hooks" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "async-trait", @@ -927,7 +927,7 @@ dependencies = [ [[package]] name = "codewhale-lane" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "chrono", @@ -942,7 +942,7 @@ dependencies = [ [[package]] name = "codewhale-mcp" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "serde", @@ -952,14 +952,14 @@ dependencies = [ [[package]] name = "codewhale-paths" -version = "0.9.12" +version = "0.9.13" dependencies = [ "dirs", ] [[package]] name = "codewhale-protocol" -version = "0.9.12" +version = "0.9.13" dependencies = [ "chrono", "serde", @@ -969,7 +969,7 @@ dependencies = [ [[package]] name = "codewhale-release" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "reqwest 0.13.4", @@ -983,7 +983,7 @@ dependencies = [ [[package]] name = "codewhale-secrets" -version = "0.9.12" +version = "0.9.13" dependencies = [ "chrono", "codewhale-paths", @@ -998,7 +998,7 @@ dependencies = [ [[package]] name = "codewhale-state" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "chrono", @@ -1013,7 +1013,7 @@ dependencies = [ [[package]] name = "codewhale-telemetry" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "chrono", @@ -1033,7 +1033,7 @@ dependencies = [ [[package]] name = "codewhale-tools" -version = "0.9.12" +version = "0.9.13" dependencies = [ "anyhow", "async-trait", @@ -1047,7 +1047,7 @@ dependencies = [ [[package]] name = "codewhale-tui" -version = "0.9.12" +version = "0.9.13" dependencies = [ "ahash", "ansi-to-tui", @@ -1144,7 +1144,7 @@ dependencies = [ [[package]] name = "codewhale-workflow" -version = "0.9.12" +version = "0.9.13" dependencies = [ "serde", "serde_json", @@ -1156,7 +1156,7 @@ dependencies = [ [[package]] name = "codewhale-workflow-js" -version = "0.9.12" +version = "0.9.13" dependencies = [ "async-trait", "jsonschema", diff --git a/Cargo.toml b/Cargo.toml index 24e39e1e43..bf909dfcdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ default-members = ["crates/cli"] resolver = "2" [workspace.package] -version = "0.9.12" +version = "0.9.13" edition = "2024" # Rust 1.88 stabilized `let_chains` in `if`/`while` conditions, which the # codebase relies on extensively. Cargo enforces this so users on older diff --git a/crates/agent/Cargo.toml b/crates/agent/Cargo.toml index 8367e558dc..919a7e6e2a 100644 --- a/crates/agent/Cargo.toml +++ b/crates/agent/Cargo.toml @@ -11,5 +11,5 @@ description = "Model/provider registry and fallback strategy for Codewhale" workspace = true [dependencies] -codewhale-config = { path = "../config", version = "0.9.12" } +codewhale-config = { path = "../config", version = "0.9.13" } serde.workspace = true diff --git a/crates/app-server/Cargo.toml b/crates/app-server/Cargo.toml index f7357e5f3c..124db525b1 100644 --- a/crates/app-server/Cargo.toml +++ b/crates/app-server/Cargo.toml @@ -15,17 +15,17 @@ workspace = true [dependencies] anyhow.workspace = true axum.workspace = true -codewhale-agent = { path = "../agent", version = "0.9.12" } -codewhale-config = { path = "../config", version = "0.9.12" } -codewhale-core = { path = "../core", version = "0.9.12" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.12" } -codewhale-hooks = { path = "../hooks", version = "0.9.12" } -codewhale-mcp = { path = "../mcp", version = "0.9.12" } -codewhale-paths = { path = "../paths", version = "0.9.12" } -codewhale-protocol = { path = "../protocol", version = "0.9.12" } -codewhale-release = { path = "../release", version = "0.9.12" } -codewhale-state = { path = "../state", version = "0.9.12" } -codewhale-tools = { path = "../tools", version = "0.9.12" } +codewhale-agent = { path = "../agent", version = "0.9.13" } +codewhale-config = { path = "../config", version = "0.9.13" } +codewhale-core = { path = "../core", version = "0.9.13" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.13" } +codewhale-hooks = { path = "../hooks", version = "0.9.13" } +codewhale-mcp = { path = "../mcp", version = "0.9.13" } +codewhale-paths = { path = "../paths", version = "0.9.13" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } +codewhale-release = { path = "../release", version = "0.9.13" } +codewhale-state = { path = "../state", version = "0.9.13" } +codewhale-tools = { path = "../tools", version = "0.9.13" } serde.workspace = true serde_json.workspace = true rustls.workspace = true diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index ee96af6153..ed7573447d 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -25,19 +25,19 @@ path = "src/main.rs" anyhow.workspace = true clap.workspace = true clap_complete.workspace = true -codewhale-tui = { path = "../tui", version = "0.9.12" } -codewhale-agent = { path = "../agent", version = "0.9.12" } -codewhale-app-server = { path = "../app-server", version = "0.9.12" } -codewhale-config = { path = "../config", version = "0.9.12" } -codewhale-lane = { path = "../lane", version = "0.9.12" } -codewhale-workflow = { path = "../workflow", version = "0.9.12" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.12" } -codewhale-mcp = { path = "../mcp", version = "0.9.12" } -codewhale-paths = { path = "../paths", version = "0.9.12" } -codewhale-release = { path = "../release", version = "0.9.12" } -codewhale-secrets = { path = "../secrets", version = "0.9.12" } -codewhale-state = { path = "../state", version = "0.9.12" } -codewhale-telemetry = { path = "../telemetry", version = "0.9.12" } +codewhale-tui = { path = "../tui", version = "0.9.13" } +codewhale-agent = { path = "../agent", version = "0.9.13" } +codewhale-app-server = { path = "../app-server", version = "0.9.13" } +codewhale-config = { path = "../config", version = "0.9.13" } +codewhale-lane = { path = "../lane", version = "0.9.13" } +codewhale-workflow = { path = "../workflow", version = "0.9.13" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.13" } +codewhale-mcp = { path = "../mcp", version = "0.9.13" } +codewhale-paths = { path = "../paths", version = "0.9.13" } +codewhale-release = { path = "../release", version = "0.9.13" } +codewhale-secrets = { path = "../secrets", version = "0.9.13" } +codewhale-state = { path = "../state", version = "0.9.13" } +codewhale-telemetry = { path = "../telemetry", version = "0.9.13" } chrono.workspace = true console = "0.16.3" dirs.workspace = true @@ -57,7 +57,7 @@ webbrowser = "1.0" zeroize = "1.8.2" [build-dependencies] -codewhale-build-support = { path = "../build-support", version = "0.9.12" } +codewhale-build-support = { path = "../build-support", version = "0.9.13" } # Parent-death cleanup for delegated server children (#3259): on Linux the # dispatcher sets PR_SET_PDEATHSIG so the child is signalled if the dispatcher diff --git a/crates/command-contract/Cargo.toml b/crates/command-contract/Cargo.toml index 7a30c1c2ed..af61912af0 100644 --- a/crates/command-contract/Cargo.toml +++ b/crates/command-contract/Cargo.toml @@ -11,4 +11,4 @@ description = "Prototype command capability and dispatch shapes for the staged T workspace = true [dependencies] -codewhale-core = { path = "../core", version = "0.9.12" } +codewhale-core = { path = "../core", version = "0.9.13" } diff --git a/crates/config/Cargo.toml b/crates/config/Cargo.toml index 4a1ab47f58..266121cceb 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -12,9 +12,9 @@ workspace = true [dependencies] anyhow.workspace = true -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.12" } -codewhale-paths = { path = "../paths", version = "0.9.12" } -codewhale-secrets = { path = "../secrets", version = "0.9.12" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.13" } +codewhale-paths = { path = "../paths", version = "0.9.13" } +codewhale-secrets = { path = "../secrets", version = "0.9.13" } fd-lock = "4.0.4" libc = "0.2" serde.workspace = true diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 3b83232574..d470f7ba06 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -15,14 +15,14 @@ anyhow.workspace = true chrono.workspace = true serde.workspace = true thiserror.workspace = true -codewhale-agent = { path = "../agent", version = "0.9.12" } -codewhale-config = { path = "../config", version = "0.9.12" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.12" } -codewhale-hooks = { path = "../hooks", version = "0.9.12" } -codewhale-mcp = { path = "../mcp", version = "0.9.12" } -codewhale-protocol = { path = "../protocol", version = "0.9.12" } -codewhale-state = { path = "../state", version = "0.9.12" } -codewhale-tools = { path = "../tools", version = "0.9.12" } +codewhale-agent = { path = "../agent", version = "0.9.13" } +codewhale-config = { path = "../config", version = "0.9.13" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.13" } +codewhale-hooks = { path = "../hooks", version = "0.9.13" } +codewhale-mcp = { path = "../mcp", version = "0.9.13" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } +codewhale-state = { path = "../state", version = "0.9.13" } +codewhale-tools = { path = "../tools", version = "0.9.13" } regex = "1.11" serde_json = { workspace = true, features = ["preserve_order"] } tokio = { workspace = true, features = ["time"] } diff --git a/crates/execpolicy/Cargo.toml b/crates/execpolicy/Cargo.toml index f56b206d04..2ecf3a400e 100644 --- a/crates/execpolicy/Cargo.toml +++ b/crates/execpolicy/Cargo.toml @@ -12,5 +12,5 @@ workspace = true [dependencies] anyhow.workspace = true -codewhale-protocol = { path = "../protocol", version = "0.9.12" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } serde.workspace = true diff --git a/crates/hooks/Cargo.toml b/crates/hooks/Cargo.toml index b43937e9d8..67777f11e7 100644 --- a/crates/hooks/Cargo.toml +++ b/crates/hooks/Cargo.toml @@ -14,8 +14,8 @@ workspace = true anyhow.workspace = true async-trait.workspace = true chrono.workspace = true -codewhale-protocol = { path = "../protocol", version = "0.9.12" } -codewhale-release = { path = "../release", version = "0.9.12" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } +codewhale-release = { path = "../release", version = "0.9.13" } reqwest.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/lane/Cargo.toml b/crates/lane/Cargo.toml index 08a4fec2f6..a34708f4b0 100644 --- a/crates/lane/Cargo.toml +++ b/crates/lane/Cargo.toml @@ -13,7 +13,7 @@ workspace = true [dependencies] anyhow.workspace = true chrono.workspace = true -codewhale-config = { path = "../config", version = "0.9.12" } +codewhale-config = { path = "../config", version = "0.9.13" } fd-lock = "4.0.4" serde.workspace = true serde_json.workspace = true diff --git a/crates/secrets/Cargo.toml b/crates/secrets/Cargo.toml index 7ab57f2a3f..7a2d0fcdb0 100644 --- a/crates/secrets/Cargo.toml +++ b/crates/secrets/Cargo.toml @@ -11,7 +11,7 @@ description = "Secret storage backends for Codewhale, with OS keyring and file f workspace = true [dependencies] -codewhale-paths = { path = "../paths", version = "0.9.12" } +codewhale-paths = { path = "../paths", version = "0.9.13" } chrono.workspace = true serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/state/Cargo.toml b/crates/state/Cargo.toml index efe2d34b2a..b91a7e7317 100644 --- a/crates/state/Cargo.toml +++ b/crates/state/Cargo.toml @@ -13,8 +13,8 @@ workspace = true [dependencies] anyhow.workspace = true chrono.workspace = true -codewhale-paths = { path = "../paths", version = "0.9.12" } -codewhale-protocol = { path = "../protocol", version = "0.9.12" } +codewhale-paths = { path = "../paths", version = "0.9.13" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } fd-lock = "4.0.4" rusqlite.workspace = true serde.workspace = true diff --git a/crates/telemetry/Cargo.toml b/crates/telemetry/Cargo.toml index 511a91e07e..e75ae38b8d 100644 --- a/crates/telemetry/Cargo.toml +++ b/crates/telemetry/Cargo.toml @@ -13,9 +13,9 @@ workspace = true [dependencies] anyhow.workspace = true chrono.workspace = true -codewhale-config = { path = "../config", version = "0.9.12" } -codewhale-paths = { path = "../paths", version = "0.9.12" } -codewhale-release = { path = "../release", version = "0.9.12" } +codewhale-config = { path = "../config", version = "0.9.13" } +codewhale-paths = { path = "../paths", version = "0.9.13" } +codewhale-release = { path = "../release", version = "0.9.13" } fd-lock = "4.0.4" reqwest = { workspace = true, features = ["blocking"] } serde.workspace = true @@ -25,9 +25,9 @@ tracing.workspace = true uuid.workspace = true [build-dependencies] -codewhale-build-support = { path = "../build-support", version = "0.9.12" } +codewhale-build-support = { path = "../build-support", version = "0.9.13" } [dev-dependencies] # Used as an *assertion*, never as a filter: every string leaf of a serialized # batch is run through `redact_for_disclosure` and must come back unredacted. -codewhale-workflow = { path = "../workflow", version = "0.9.12" } +codewhale-workflow = { path = "../workflow", version = "0.9.13" } diff --git a/crates/tools/Cargo.toml b/crates/tools/Cargo.toml index ed5a9ba4af..b19e9c5a76 100644 --- a/crates/tools/Cargo.toml +++ b/crates/tools/Cargo.toml @@ -13,7 +13,7 @@ workspace = true [dependencies] anyhow.workspace = true async-trait.workspace = true -codewhale-protocol = { path = "../protocol", version = "0.9.12" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } serde.workspace = true serde_json.workspace = true thiserror.workspace = true diff --git a/crates/tui/CHANGELOG.md b/crates/tui/CHANGELOG.md index 4190db819f..d0e5abb90c 100644 --- a/crates/tui/CHANGELOG.md +++ b/crates/tui/CHANGELOG.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.13] - 2026-09-07 + +Codewhale v0.9.13 is the integrity release for 0.9.12: multiline paste is +one paste again, truncated tool arguments can no longer execute, strict +ACP clients connect again, concurrent instances stop destroying each +other's queued text, and the Computer Use bundle ships at plugin 0.2.0 +with an accessibility-first pointer. + ### Fixed - Pasting multiline text is one paste again. 0.9.12 gated the @@ -19,6 +27,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 the session once a real `Event::Paste` arrives, so fast typing on terminals with working bracketed paste is unaffected (#5981, thanks @nsfoxer). +- `serve --acp` no longer breaks strict JetBrains clients: the + `initialize` response advertised `sessionCapabilities.list` as a + boolean and carried an undefined nested `load` capability; it now + sends `{"list": {}}` with no `load` key, per the ACP schema (#5969, + reported by @Lujc0523). +- Concurrent Codewhale instances no longer destroy each other's queued, + unsent text. The offline input queue was one global file that boot + cleared on session-id mismatch, so a second instance deleted the + first's parked messages. Queues are now keyed per session (mirroring + per-session checkpoints), an existing global file is adopted by its + owning session rather than discarded, and the adoption race between + two instances of the same session tolerates the loser's cleanup. +- A tool call truncated at the provider's output limit can no longer be + repaired into valid JSON and executed: repairs that had to synthesize + structure (append or discard closers) are routed to the existing + malformed-arguments path so the model is asked to re-issue — including + when the stream is cut before the closing content-block event (#5986). +- `codewhale metrics` reads Codewhale's own receipts again: the + deepseek-home fallback resolved `$HOME/.deepseek` unconditionally, so + the rollup reported all zeros from a directory nothing has written + since 2024. The Codewhale audit log is primary, with a checked legacy + fallback. +- The goal-continuation loop's promised stall bound actually bounds + stalls now, and undeclared fleet role names fail closed to read-only + `explore` in both fleet drivers instead of resolving to write-capable + customs in one and not the other. - `allow_insecure_http = true` under a `[providers.]` table works again. 0.9.12 tightened plain-HTTP base URL handling in a way that silently dropped the per-provider key, leaving the process-wide env @@ -47,8 +81,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - The built-in Computer Use plugin bundle is refreshed to the standalone - plugin's 0.2.0 runtime (vendored from `Hmbown/codewhale-cu-plugin` @ - `906b433`): the native macOS accessibility backend with an + plugin's 0.2.0 runtime (vendored from `Hmbown/codewhale-cu-plugin` + PR #12 @ `906b433`): the native macOS accessibility backend with an a11y-first pointer strategy (covered points are refused, previews are drawn), the permission-owning desktop-app socket transport, remote computers over ssh and HarmonyOS HDC with contained temp handling, @@ -226,6 +260,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [@goransh-walia](https://github.com/goransh-walia) for the original implementation (PR #5870, fixes #3999). +### Contributors + +- **[@nsfoxer](https://github.com/nsfoxer)** — reported the 0.9.12 + multiline-paste regression with a root-cause analysis that made the + fix a one-day turnaround (#5981). +- **@Nefelibata1024** — confirmed the paste regression's impact. +- **[@Gabriel-Degret](https://github.com/Gabriel-Degret)** — reported + `allow_insecure_http` being silently dropped in 0.9.12, with the + valid-key list that pinned it (#5991). +- **[@Lujc0523](https://github.com/Lujc0523)** — reported the ACP + `initialize` schema violation that made Codewhale unusable from + JetBrains IDEs (#5969). +- **[@gaord](https://github.com/gaord)** — the fleet role-precedence + recovery (#5945) and the README link to the community VS Code + frontend (#5992). +- **[@goransh-walia](https://github.com/goransh-walia)** — the + propose-only `commit_plan` rework (#5870). + +### Notes + +- Upgrading from 0.9.12 with Computer Use trusted and enabled: the + bundle's content hash changes with the 0.2.0 refresh, so the plugin + deactivates and asks for a fresh review — that is the designed + fail-closed path for a desktop-driving plugin. Re-trust it from the + Extensions page. +- The multiline-paste fix restores v9.11 behavior on terminals that + accept `EnableBracketedPaste` but deliver pastes as keystrokes + (reported on Windows 11 / PowerShell). Verified at the input-contract + level and in CI; a manual paste check on a real Windows terminal is + still welcome — please comment on #5981 with your terminal if anything + still misbehaves. + ## [0.9.12] - 2026-09-03 Codewhale v0.9.12 puts computer use in the binary, opens two new routes — @@ -5221,313 +5287,6 @@ reproductions shaped v0.9.0: now map to Act + Full Access permissions via a compatibility shim and show a one-shot deprecation notice; removal is planned for 0.9.0. -## [0.8.67] - 2026-07-06 - -### Added - -- The model you select in `/model` is now the operator: fleet workers whose - task spec and roster profile pin no model inherit the active session route - instead of a hardcoded `auto` sentinel, matching the pinned operator row in - `/fleet roster`. Task-level and profile model overrides still win, and - route receipts record which source applied (`task.model`, - `agent_profile.model`, or `run.model`). -- Added the `/workflow` command (aliases `/workflows`, `/wf`) as the user - opt-in to workflow orchestration. Bare `/workflow` orchestrates the current - work — the model synthesizes the objective from the conversation context; - `/workflow ` narrows the run; `/workflow status [run_id]` and - `/workflow cancel ` relay typed run receipts without starting new - runs. -- Bare `/goal` with no active goal now declares a goal from the conversation - context via `create_goal` instead of printing usage; with an active goal it - remains the status readout, and explicit `/goal ` is unchanged. -- Added the constitution-first setup wizard: a unified `/setup` shell with - resume, back navigation, and skip-retry state; provider/model readiness - cards with a custom-provider form and provider-picker detail layout; a - runtime posture card with preset application and project-override warnings; - a setup verification report; and transactional setup persistence with - secret redaction and rollback (#3402, #3403, #3404, #3405, #3406, #3410, - #3411). -- Added a structured user-global constitution with a deterministic renderer, - prompt-block injection, guided principle authoring with preview and preset - save, and a `/constitution` manager command as the primary constitution - management surface, with file state shown in setup and actions surfaced in - diagnostics (#3793, #3806, #3811). -- Added model-assisted constitution and fleet-profile drafting behind an - explicit ratify gate, with untrusted-draft provenance recorded so - model-authored text is never applied silently. Updating users keep their - existing constitution unchanged, and a localized constitution checkpoint is - required after update (#3794). -- Added the Hotbar route editor v1 with route-switch slot actions and support - for custom model routes, plus a configured-provider route manager for - `/provider` and `/model` with a missing-auth handoff into provider key - entry (#2066, #3830, #3831). -- Added auto-discovery of `.codewhale/rules/` and `.claude/rules/` - directories as project context, with a total byte-budget cap on the - assembled rules block. Contributed by maple (@yekern). -- Exposed `context_input_budget_for_route` from the engine so external - integrations can reuse route budget math. Contributed by hexin - (@h3c-hexin). -- Added GUI config persistence to the runtime API. Contributed by @gaord. -- Added a website localization matrix with a locale registry and drift - checks. Harvested from #3763 by @idling11 (#3090). -- Added `doctor` detection of half-applied setup state, and startup milestone - tracing for boot-performance diagnosis. -- Added a v0.8.67 computer-use dogfood prompt that covers the Cursor-terminal - QA flow, headless gates, setup, sub-agent completion, Fleet, Workflow, model - pricing, and release evidence collection. -- Fleet: local worker memory usage is now reported, including retained memory - while a task is in Running status. Contributed by @cyq1017 (#3901). -- Website: community hub, constitution thesis page and constitution-centered - homepage, models page generated from the provider registry, docs dark mode - and full SEO metadata/sitemap coverage, terminal player for real - constitution traces, and a live star badge and version. -- Added Meituan LongCat as a first-class OpenAI-compatible provider - (`longcat`, with `long-cat`, `meituan-longcat`, and `meituan` aliases), - `LONGCAT_API_KEY` discovery, the `LongCat-2.0` default model, provider - picker wiring, model completions, provider docs, and web provider facts. -- Fleet: added per-provider setup cards (Persistence, Constitution, Hotbar, - Tools/MCP, Remote Runtime) with a unified setup catalog and provider-specific - credential links. Provider setup progress is persisted transactionally with - rollback guards, Codex OAuth is kept out of provider key storage, and a - headless QA contract verifies setup readiness across providers. -- Fleet: added Fleet starter profiles with role-aware loadouts (scout→Fast, - manager→Inherit, etc.), `/fleet setup` profile-authoring wizard, Fleet - effective-permission recording, and route intent-source tracking. -- Fleet: added 'operator' as a built-in Fleet roster member — the preferred - helm Fleet slot for workflow coordination. Operator plans, routes, reviews - outputs, and calls other Fleet slots as needed. This is a roster role, not a - separate app mode. The full Operation/Operate-mode architecture is deferred - to 0.9.0. -- Workflow: declarative workflows now run through the production driver, the - workflow tool is wired to sub-agent dispatch, public Workflow surfaces are - renamed, and typed workflow-run and status receipts are emitted for - debugging and verification. -- Added provider-agnostic Fleet rosters and loadouts: provider-specific - subagent limits, launch concurrency, and admission caps are derived from - config without hardcoding any single provider. -- Added Workflow runtime foundations: the internal JS authoring/runtime crates - compile and replay example workflows. 0.8.67 ships the `/workflow` opt-in, - production-driver dispatch path, sub-agent task handoff, and typed run/status - receipts; richer authoring UX and the full TUI run view remain tracked for - v0.8.68 (#2974, #4038). - -### Changed - -- Clarified the Fleet coordination hierarchy and made roles carry real - doctrine: the **operator** (the session's `/model` selection) runs the - operation and assigns managers to workflows; a **manager** is the middle - manager of exactly one workflow. The built-in **reviewer** is now explicitly - adversarial (assume the change is broken, try to refute it), and the review - sub-agent intro adopts the same framing. Built-in `manager`/`operator`/ - `reviewer` roster members now ship role `instructions` that flow into worker - prompts on both the Fleet task-spec and agent/workflow `profile:` spawn - paths; custom profiles override them via the same `instructions` field. -- Removed the decorative Fleet vocabulary that never routed differently: - the `tool-heavy` slot and the `strong`/`balanced`/`deep-reasoning`/`code`/ - `review`/`tool-heavy` loadout tiers. `inherit` (the operator's route) and - `fast` (the provider's faster class) remain; retired names in existing - configs keep parsing (as custom labels) with identical auto routing, and - the `/fleet setup` model-class step now offers only the real choices. -- Raised the default subagent concurrency for high-throughput fanout: - `max_subagents` default 20 → 64 (config ceiling 128) and the queued+running - admission cap 200 → 1024. Users on metered plans who want the old behavior - can set `max_subagents = 20` in config.toml. -- Renamed the internal `whaleflow` subsystem to `workflow` across the - workspace: the `codewhale-whaleflow`/`codewhale-whaleflow-js` crates become - `codewhale-workflow`/`codewhale-workflow-js`, Rust identifiers and JS bridge - symbols are renamed, the `CODEWHALE_WHALEFLOW_JS_*` environment variables - become `CODEWHALE_WORKFLOW_JS_*`, and the authoring/RFC docs move to - `WORKFLOW_AUTHORING.md` and `WORKFLOW_EXTERNAL_MEMORY.md`. Historical - changelog and retro-ledger entries keep the old name as a record. -- Documented the Homebrew rollout strategy and added a distribution-channel - check to the release checklist. Harvested from #3760 by @idling11 (#3489). -- Paused Linux RISC-V prebuilt release and nightly artifacts because - `rquickjs-sys` 0.12.0 does not ship `riscv64gc-unknown-linux-gnu` bindings; - installers, docs, and update paths now treat RISC-V as unsupported until - upstream bindings or a bindgen-enabled build lands. -- Made the approval prompt calm, compact, and honest, and centered the - first-run follow-up on the constitution; first-run onboarding now hands off - into the setup wizard, and the language picker offers every shipped locale - (#3929). -- Startup performance: boot janitors and store scans no longer block the - first frame, `@mention` completion no longer re-walks the workspace per - keystroke, and idle offline-queue clones and duplicate tool-output hashing - were eliminated. -- Clarified the misleading "Ctrl+B backgrounds this command" shell wording - (#3859) and the hotbar help shortcuts. Docs contribution by Chanhyo Jung - (@roian6). -- Documented the enforced repo-law invariants, the constitution flow, and the - `/fleet setup` profile-authoring wizard; aligned `permissions.toml` action - docs. Docs contribution by @greyfreedom. -- Bumped web dependencies: wrangler 4.103.0 → 4.107.0, mermaid 11.15.0 → - 11.16.0, vitest 4.1.8 → 4.1.9 (@dependabot). -- Backfilled v0.8.67 regression coverage across sub-agent completion, budget - exhaustion, delegate ordering, provider onboarding, setup scroll, model - catalog pricing, Fleet routing, and Workflow gates (#4076). -- Split the large TUI debug command group and palette/theme internals into - smaller modules without changing user-visible behavior (#4078, #4081). - -### Fixed - -- Fixed the goal sidebar elapsed timer so completed and blocked goals freeze - their "completed in {elapsed}" readout instead of ticking forever. Goal state - now records a `finished_at` instant that both sidebar render paths and the - engine snapshot clamp elapsed against; `/goal resume` clears the freeze and - the timer ticks again. -- Fixed paused goals silently un-freezing their sidebar timer: usage keeps - accruing while paused, and the next goal snapshot used to clear the frozen - instant. Paused goals now stay frozen until an explicit resume. -- Fixed durable `/goal` progress accounting so usage and continuation updates - release the shared SQLite connection before re-reading the updated goal, - unblocking resumed goal loops and full workspace release tests. -- Fixed a scheduled-automation race where deleting an automation while its - run was being enqueued left the already-created task running untracked; - the run record is now persisted unconditionally. -- Removed `panic = "abort"` from the release profile: it disabled unwinding - and broke the panic supervision that keeps one failing tool call from - taking down the whole session. The `lto`/`strip`/`codegen-units` size and - speed tuning is unchanged. -- Fixed session save/load to persist and restore the active model provider - across restarts. Previously sessions created under one provider (e.g. - DeepSeek) would silently load under a different active provider. Provider, - subagent limits, fallback chain, context window, and reasoning effort are now - restored from saved session metadata, with `"deepseek"` as the default for - legacy sessions. -- Raised the streamed model-response idle timeout and matched the TUI stall - watchdog to the configured stream budget so long reasoning pauses are not - recovered as stalled turns (#2487, #3998). -- Fixed Codex OAuth/sub-agent release diagnostics so `auth list` reports an - active Codex OAuth file, Responses API child requests encode inherited tool - names safely, rate-limited child requests checkpoint as resumable provider - interruptions, and failure records surface the real Responses API error - (#3884). -- Fixed fresh launch/setup testing with an explicit `CODEWHALE_HOME` so - config, settings, theme prefs, and doctor legacy-state diagnostics do not - inherit unrelated ambient `~/.deepseek` files (#4001, #4002). -- Sub-agent state now persists to `.codewhale/` instead of the lingering - pre-rebrand `.deepseek/` path (#3864). Contributed by Stime (@yekern). -- `/plugin enable|disable` now persists across restarts (#3918), and the - plugin command is hidden from the root slash menu and kept canonical after - the scanner merge. Contributed by Nightt (@nightt5879). -- `/config ask-rules` now shows ask rule actions with improved diagnostics, - with file-rule action precedence under test. Contributed by @greyfreedom. -- Fleet/sub-agents: enforced an absolute recursion-depth ceiling and widened - task-id entropy, gave each atomic state write a unique temp path, kept - sub-agent tool catalogs in parent parity (#3836), and made the Agents - sidebar reconcile sub-agent completion and cancellation live (#3837). -- Fixed apply_patch mangling newlines, defaulted fuzz to 3, and made writes - atomic; fixed compaction to preserve pins on emergency compaction, harden - the summary fallback, and count image tokens; corrected backtrack boundary, - checkpoint clear ordering, prune guard, and durable rename. -- Fixed the SSE client to flush the final frame, join multi-line data fields, - and stop corrupting multibyte UTF-8 split across network reads. -- Kept review-only turns read-only, aliased `auto` mode to the agent policy, - showed the mode-derived safety policy in status (contributed by @cyq1017), - and stopped the durable-review floor from holding routine YOLO work - (#3883). -- Fixed self-update to prefer exact binary release assets. Contributed by - @LI-Jialu. -- UI polish: stopped constitution and fleet-profile model drafts from - freezing the event loop, scoped the context-menu backdrop to the popup - rect, stacked model-picker panes on narrow modals, unified display-width - helpers on one contract (#3924), removed misleading success toasts, - issue-number leaks, and dead-end empty states, and repaired the onboarding - trust and api-key keys. -- Fixed the onboarding Trust step so plain Enter no longer silently grants - workspace trust; users must choose the explicit trust or exit keys. -- Fixed same-root skill-name collisions being silently shadowed; duplicate - normalized skill names now warn while keeping discovery deterministic - (#3919). -- Normalized discovered skill names, removed unenforced trust copy, and - surfaced the gated constitution override in prompts. -- Fixed a parallel `subagent::` suite flake where one test's process-wide - `Retry-After` pause could strand unrelated budget-capped workers for the - full stale window; requests now re-poll the global pause in bounded slices - and the rate-limit test clears the window on drop. -- Sub-agent and Fleet reliability now fail empty, step-limited, and - budget-exhausted children with explicit diagnostics instead of silent - `Completed (no output)` success; budget exhaustion preserves partial output, - `worktree: true` discovers one-level nested repos from harness directories, - and completion-before-start delegate events recover into named rows instead - of ellipsis-only identities (#4050, #4051, #4052, #4053). -- Goal-mode writing and research tasks can complete with - `verification.status = "not_applicable"` without triggering continuation - loops (#4054). -- First-run onboarding routes API keys through the selected provider, setup - wizard bodies scroll with PageUp/PageDown, shipped locale packs are back to - `en.json` parity with zh-Hant explicitly partial, stable feature flags stay - out of Experimental, and model/provider rows include current LongCat and - sourced-pricing hints (#4056, #4057, #4058, #4062, #4063). -- Running tool rows animate while a lone foreground tool is active, and - workflow receipts render run/status/failure cards instead of one-line or - null-success output (#4059). -- Model-facing turn metadata now includes a compact git workspace snapshot and - escalates context pressure at the same thresholds as the TUI, helping agents - narrow scope or compact before truncation (#4071, #4073). -- Successful child sub-agent completions inline the child's `EVIDENCE` block - before the completion sentinel, so parents can cite child findings without - re-running tools (#4072). -- Deferred tools hydrate and execute in the same batch when the original - arguments are valid, and `[tools].always_load` now keeps configured MCP tools - active instead of forcing the first-call retry. Thanks @SparkofSpike for the - hot-path MCP report (#4074, #4027). -- New commit-range co-author checks reject bot/tool trailers on newly pushed - commits; historical release-range cleanup remains a separate maintenance - concern (#4075). -- Fixed fuzzy `edit_file` matching so matches that begin with multibyte UTF-8 - characters, including CJK text, advance on character boundaries instead of - panicking. Contributed by Nightt (@nightt5879), reported by Taixin Guo - (@taixinguo) (#3971, #4045). -- Fixed Unix dispatcher/TUI output under early-closing pipes such as - `codewhale doctor | head` by restoring the default `SIGPIPE` handler before - printing and propagating signal exits quietly. Contributed by @aznikline, - reported by @BrathonBai (#4030, #4043). -- Suppressed dead_code warnings in the unused plugin registry module and - fixed formatting across the command-group files. Contributed by Paulo Aboim - Pinto (@aboimpinto). -- Pointed the website Community nav link at the community hub. - -### Security - -- MCP client hardening: closed an SSE-endpoint SSRF, bounded the HTTP - response body via Content-Length instead of a streaming read, bounded stdio - line reads to prevent OOM denial of service, fixed a dead timeout, and - removed an unbounded buffer. -- Made execpolicy deny/trust rules segment-aware, closing a command-chaining - bypass. -- Closed repo-law and safety-floor bypasses found by adversarial review: - protected invariants are now enforced as mechanism, the destroyer gap in - the safety floor is closed, a catalog-present tool with no execution path - now fails closed, `web_run` open/click is classified as destructive, and - the allow-list gained wildcard and case handling. -- Refused symlinked rules directories to prevent workspace escape via - discovered rules. Contributed by maple (@yekern). -- Bounded Fleet sub-agent worker output so fanout cannot exhaust TUI memory - (#3882), and preserved event headroom for progress. Contributed in part by - @cyq1017. -- Added an untrusted constitution-draft gate with authoring provenance so - model-drafted constitutions require explicit human ratification. - -- Google Gemini is its own backend (`/provider google`) on the official - OpenAI-compatible route with thought-signature capture/replay and - fail-closed replay for thinking models. Antigravity (`agy` 1.1.13) joins - as a separate credential-plane provider: consent-gated read-only import - of the official CLI's login with `ANTIGRAVITY_API_KEY`/`AGY_ADC_AUTH` - precedence; requests fail closed until the cloud-code wire protocol is - implemented. - -### Removed - -- Removed unused model-registry helpers. Harvested from #3872 by @cyq1017. -- Removed unused request-tuning metadata. Harvested from #3871 by @cyq1017. -- Removed dead fleet task helpers (#3894 by @cyq1017), the unused - approval-cache container (#3845) and localization QA metadata (both by - @nightt5879), the dormant tab collaboration subsystem (#3838), the legacy - flash auto-router (#3839), the stale project_doc loader (#3840), ignored - mock LLM placeholders (#3841), dead model-catalog helpers (#3842), the - unused execpolicy amend module, and dead MCP/client retry helpers. -- Retired the deprecated `WHALE.md` context fallback (#3798). - --- Older releases: [CHANGELOG.md](https://github.com/Hmbown/CodeWhale/blob/main/CHANGELOG.md) and [docs/CHANGELOG_ARCHIVE.md](https://github.com/Hmbown/CodeWhale/blob/main/docs/CHANGELOG_ARCHIVE.md). diff --git a/crates/tui/Cargo.toml b/crates/tui/Cargo.toml index 15a92b419f..08482b0683 100644 --- a/crates/tui/Cargo.toml +++ b/crates/tui/Cargo.toml @@ -31,20 +31,20 @@ path = "src/main.rs" [dependencies] ahash = "0.8" anyhow.workspace = true -codewhale-config = { path = "../config", version = "0.9.12" } -codewhale-command-contract = { path = "../command-contract", version = "0.9.12" } -codewhale-core = { path = "../core", version = "0.9.12" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.12" } -codewhale-hooks = { path = "../hooks", version = "0.9.12" } -codewhale-lane = { path = "../lane", version = "0.9.12" } -codewhale-paths = { path = "../paths", version = "0.9.12" } -codewhale-protocol = { path = "../protocol", version = "0.9.12" } -codewhale-release = { path = "../release", version = "0.9.12" } -codewhale-secrets = { path = "../secrets", version = "0.9.12" } -codewhale-telemetry = { path = "../telemetry", version = "0.9.12" } -codewhale-tools = { path = "../tools", version = "0.9.12" } -codewhale-workflow = { path = "../workflow", version = "0.9.12" } -codewhale-workflow-js = { path = "../workflow-js", version = "0.9.12" } +codewhale-config = { path = "../config", version = "0.9.13" } +codewhale-command-contract = { path = "../command-contract", version = "0.9.13" } +codewhale-core = { path = "../core", version = "0.9.13" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.13" } +codewhale-hooks = { path = "../hooks", version = "0.9.13" } +codewhale-lane = { path = "../lane", version = "0.9.13" } +codewhale-paths = { path = "../paths", version = "0.9.13" } +codewhale-protocol = { path = "../protocol", version = "0.9.13" } +codewhale-release = { path = "../release", version = "0.9.13" } +codewhale-secrets = { path = "../secrets", version = "0.9.13" } +codewhale-telemetry = { path = "../telemetry", version = "0.9.13" } +codewhale-tools = { path = "../tools", version = "0.9.13" } +codewhale-workflow = { path = "../workflow", version = "0.9.13" } +codewhale-workflow-js = { path = "../workflow-js", version = "0.9.13" } async-stream = "0.3.6" async-trait.workspace = true base64 = "0.23.1" @@ -112,7 +112,7 @@ mimalloc.workspace = true rusty_alloc-api = { workspace = true, optional = true } [build-dependencies] -codewhale-build-support = { path = "../build-support", version = "0.9.12" } +codewhale-build-support = { path = "../build-support", version = "0.9.13" } [dev-dependencies] cucumber = "0.23.0" diff --git a/docs/CONTRIBUTORS.md b/docs/CONTRIBUTORS.md index 5f2a25ea51..8bb4690d48 100644 --- a/docs/CONTRIBUTORS.md +++ b/docs/CONTRIBUTORS.md @@ -27,6 +27,15 @@ notes, and relevant issue/PR comments. ## Contributors by time +
+v0.9.13 — paste integrity, dispatch safety, and the Computer Use bundle + +Contributors and reporters credited in the [0.9.13 changelog](../CHANGELOG.md): +merged PRs from [gaord](https://github.com/gaord) and [goransh-walia](https://github.com/goransh-walia); +reports and reproductions from [nsfoxer](https://github.com/nsfoxer), [Nefelibata1024](https://github.com/Nefelibata1024), [Gabriel-Degret](https://github.com/Gabriel-Degret), and [Lujc0523](https://github.com/Lujc0523). + +
+
v0.9.12 — native search, live token truth, and runtime surfaces diff --git a/docs/INSTALL.md b/docs/INSTALL.md index e277737e09..b4e5ae05d5 100644 --- a/docs/INSTALL.md +++ b/docs/INSTALL.md @@ -10,7 +10,7 @@ If you just want the short version, see the [main README](../README.md#install) or [简体中文 README](../README.zh-CN.md#安装). -This branch describes the **v0.9.12 source candidate**. Install commands that use +This branch describes the **v0.9.13 source candidate**. Install commands that use `latest` resolve to the latest published package or GitHub Release, which may trail the source candidate. A candidate is not a published install until the matching package, tag, checksums, and release assets exist. @@ -47,7 +47,7 @@ and at most three attempts. Explicit mirror settings remain supported. `CODEWHAL version; `DEEPSEEK_TUI_VERSION` and `DEEPSEEK_VERSION` remain legacy aliases. The manifest and binary must come from the same source, and checksum failure never permits replacement. An explicit version or mirror cannot bypass the version -check: a newer development build is kept, including v0.9.12 when public latest +check: a newer development build is kept, including v0.9.13 when public latest is v0.9.11. Use a separate directory for deliberate rollback. ### Migrating from npm, Cargo, or another installation @@ -101,7 +101,7 @@ commands update their own copies, so verify PATH again afterward. As checked on 2026-09-04, [latest stable v0.9.11](https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.11) publishes Linux x64/arm64, macOS x64/arm64, Windows x64/arm64, and Android arm64 assets. Artifact presence is distinct from platform qualification. -The table below describes the v0.9.12 source candidate's platform and secondary +The table below describes the v0.9.13 source candidate's platform and secondary packaging support; `latest` installation still selects the published release. Android/Termux is preview pending real-device QA. Linux ARM64 is available from v0.8.8 onward. Linux RISC-V prebuilts are temporarily paused because the locked @@ -126,7 +126,7 @@ v0.8.8 onward. Linux RISC-V prebuilts are temporarily paused because the locked [Build from source](#7-build-from-source) below. ³ RISC-V source builds currently need upstream `rquickjs-sys` RISC-V bindings or a bindgen-enabled dependency build. -⁴ The v0.9.12 source-candidate npm wrapper recognizes Android arm64 and resolves +⁴ The v0.9.13 source-candidate npm wrapper recognizes Android arm64 and resolves the matching `codewhale` and `codew` Android assets. npm installation works only for a package version whose GitHub Release publishes those matching assets. The Android/Termux path remains preview-only until the @@ -138,7 +138,7 @@ Linux `codewhale-linux-arm64` archive in Termux; use the Termux-specific Android archive when a release or release candidate publishes one, or build from source inside Termux. -The Linux **x64 and arm64** v0.9.12 candidate assets are **static musl builds**. +The Linux **x64 and arm64** v0.9.13 candidate assets are **static musl builds**. The x64 release path has used musl since v0.8.65; v0.9.6 extends the same build and static-launch check to arm64. These binaries have no glibc dependency and run on their matching architecture across Ubuntu, Debian, RHEL/CentOS, and @@ -156,7 +156,7 @@ version `GLIBC_2.39' not found ``` The npm wrapper, `codewhale update`, and the Unix archive installer retain their -GNU-binary preflight for older releases. The v0.9.12 arm64 candidate instead uses +GNU-binary preflight for older releases. The v0.9.13 arm64 candidate instead uses `aarch64-unknown-linux-musl`, so it has no `GLIBC_*` floor. If you are installing an earlier release on an older arm64 distribution, use: diff --git a/docs/public-surface-facts.json b/docs/public-surface-facts.json index 5354b9a902..b5528fc82c 100644 --- a/docs/public-surface-facts.json +++ b/docs/public-surface-facts.json @@ -20,7 +20,7 @@ ] }, "sourceCandidate": { - "version": "0.9.12", + "version": "0.9.13", "providerCount": 47, "toolCount": 76, "sandboxBackends": [ @@ -177,7 +177,7 @@ "localRuntime": "runtime, workspace state, and audit log stay on the user's machine", "hostedProviderBoundary": "the selected hosted provider receives turn context required for inference", "localInference": "a loopback local-model route can keep inference local", - "telemetry": "Codewhale 0.9.12 counts anonymous usage by default and discloses it at first launch (policy notice version 5, naming Codewhale and PostHog as processors), while the earlier 0.9.11 release asked first; turning it off is a saved choice that later versions keep, an opt-out recorded under the earlier opt-in policy stays off, and showing the notice never records any acceptance on the user's behalf; Codewhale does not collect conversations, code, prompts, files, file/repo/branch names, model content, credentials, or per-turn/per-tool timelines; while on, sessions post aggregate counts and closed enums to the first-party endpoint https://telemetry.codewhale.net/v1/telemetry, whose storage has no IP, country, or geo column and a fixed three-month retention; optional PostHog forwarding requires separate operator configuration and verified IP-safe egress, and its retention is a separate project setting; telemetry_endpoint = \"\" writes only to a local dry-run file; no mandatory hosted relay", + "telemetry": "Codewhale 0.9.13 counts anonymous usage by default and discloses it at first launch (policy notice version 5, naming Codewhale and PostHog as processors), while the earlier 0.9.11 release asked first; turning it off is a saved choice that later versions keep, an opt-out recorded under the earlier opt-in policy stays off, and showing the notice never records any acceptance on the user's behalf; Codewhale does not collect conversations, code, prompts, files, file/repo/branch names, model content, credentials, or per-turn/per-tool timelines; while on, sessions post aggregate counts and closed enums to the first-party endpoint https://telemetry.codewhale.net/v1/telemetry, whose storage has no IP, country, or geo column and a fixed three-month retention; optional PostHog forwarding requires separate operator configuration and verified IP-safe egress, and its retention is a separate project setting; telemetry_endpoint = \"\" writes only to a local dry-run file; no mandatory hosted relay", "account": "no account required for the local runtime", "plan": "Plan centrally refuses file mutation and shell execution; policy-allowed research may contact external services and local session state can still be persisted.", "sandbox": "Seatbelt is used on macOS when available; Linux bubblewrap is opt-in and must be installed; Windows currently reports no OS sandbox", @@ -222,22 +222,12 @@ "web/lib/release-credits.ts" ], "requiredCandidateCredits": [ - "@h3c-hexin", - "@qiuYliangM", - "@wuisabel-gif", - "@aboimpinto", - "@musichen", "@gaord", - "@SparkofSpike", - "@M-Maciej", - "@serephus", - "@whp233", + "@goransh-walia", + "@nsfoxer", + "@Nefelibata1024", "@Gabriel-Degret", - "@huangxianzhan", - "@zhuowp", - "@AdityaVG13", - "@nightt5879", - "@Lstarsky0" + "@Lujc0523" ] }, "screenshot": { diff --git a/extensions/vscode/package-lock.json b/extensions/vscode/package-lock.json index 5c4bd39760..12b5e1182b 100644 --- a/extensions/vscode/package-lock.json +++ b/extensions/vscode/package-lock.json @@ -1,12 +1,12 @@ { "name": "codewhale-vscode", - "version": "0.9.12", + "version": "0.9.13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "codewhale-vscode", - "version": "0.9.12", + "version": "0.9.13", "license": "MIT", "devDependencies": { "@types/node": "^20.19.27", diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index f2f76a6e3a..47f060c193 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -2,7 +2,7 @@ "name": "codewhale-vscode", "displayName": "Codewhale", "description": "Official Codewhale VS Code extension: agentic chat in the secondary sidebar over the local Engine Runtime API, with editor context, streaming turns, approvals, and terminal parity.", - "version": "0.9.12", + "version": "0.9.13", "publisher": "codewhale", "license": "MIT", "preview": true, diff --git a/npm/codewhale/package.json b/npm/codewhale/package.json index 92f7bf90e9..6408afaee1 100644 --- a/npm/codewhale/package.json +++ b/npm/codewhale/package.json @@ -1,7 +1,7 @@ { "name": "codewhale", - "version": "0.9.12", - "codewhaleBinaryVersion": "0.9.12", + "version": "0.9.13", + "codewhaleBinaryVersion": "0.9.13", "description": "Terminal coding agent for supported hosted and local models. One runtime on your machine. Rust, MIT.", "author": "Hmbown", "license": "MIT", diff --git a/npm/runtime-sdk/package.json b/npm/runtime-sdk/package.json index 2c68aca87a..f4e2abdc2b 100644 --- a/npm/runtime-sdk/package.json +++ b/npm/runtime-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@codewhale/runtime-sdk", - "version": "0.9.12", + "version": "0.9.13", "description": "Typed JavaScript helpers for Codewhale Runtime API Fleet endpoints.", "license": "MIT", "type": "module", diff --git a/package-lock.json b/package-lock.json index c90bc776e4..681da08744 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1559,7 +1559,7 @@ } }, "npm/codewhale": { - "version": "0.9.12", + "version": "0.9.13", "funding": [ { "type": "github", @@ -1600,7 +1600,7 @@ }, "npm/runtime-sdk": { "name": "@codewhale/runtime-sdk", - "version": "0.9.12", + "version": "0.9.13", "license": "MIT", "engines": { "node": ">=18" diff --git a/scripts/remote-smoke/setup-vm.sh b/scripts/remote-smoke/setup-vm.sh index 8a9691d30f..488252548b 100644 --- a/scripts/remote-smoke/setup-vm.sh +++ b/scripts/remote-smoke/setup-vm.sh @@ -20,7 +20,7 @@ # Uses prebuilt release binaries instead of a Rust build. set -euo pipefail -RELEASE_TAG="${RELEASE_TAG:-v0.9.12}" +RELEASE_TAG="${RELEASE_TAG:-v0.9.13}" REPO_URL="${REPO_URL:-https://github.com/Hmbown/CodeWhale.git}" REPO_BRANCH="${REPO_BRANCH:-main}" SECRETS_FILE="${SECRETS_FILE:-/tmp/cw-secrets.env}" diff --git a/web/gt-catalog/en.json b/web/gt-catalog/en.json index 1af8e03354..2d03dbc889 100644 --- a/web/gt-catalog/en.json +++ b/web/gt-catalog/en.json @@ -751,7 +751,7 @@ ], "sandboxNote": "The repository also contains a seccomp module and a future Windows helper contract. Neither is wired into child-command launch, so Codewhale does not advertise them: source-only sandbox code is not evidence that a command was restricted.", "telemetryTitle": "Telemetry, exactly", - "telemetryLead": "Codewhale 0.9.12 counts anonymous usage by default and tells you so at first launch; the earlier 0.9.11 release asked first. Turning it off is a saved choice that later versions keep, and an opt-out recorded under the earlier opt-in policy stays off. Showing the notice never records any acceptance on your behalf; Codewhale and PostHog are named as the processors.", + "telemetryLead": "Codewhale 0.9.13 counts anonymous usage by default and tells you so at first launch; the earlier 0.9.11 release asked first. Turning it off is a saved choice that later versions keep, and an opt-out recorded under the earlier opt-in policy stays off. Showing the notice never records any acceptance on your behalf; Codewhale and PostHog are named as the processors.", "telemetry": [ [ "Never collected", diff --git a/web/gt-catalog/zh.json b/web/gt-catalog/zh.json index c83c06d160..3a4d6c48ca 100644 --- a/web/gt-catalog/zh.json +++ b/web/gt-catalog/zh.json @@ -751,7 +751,7 @@ ], "sandboxNote": "仓库中还有一个 seccomp 模块和一份未来的 Windows 辅助程序契约。两者都没有接入子命令启动,所以 Codewhale 不会宣传它们:只存在于源码中的沙箱代码不能证明某条命令受到了限制。", "telemetryTitle": "遥测,精确到每一项", - "telemetryLead": "Codewhale 0.9.12 默认统计匿名使用量,并在首次启动时告知你;早先的 0.9.11 版本会先询问。关闭是会被后续版本保留的选择,在早先的自愿开启政策下记录的关闭也始终有效。显示告知绝不会代你记录任何同意;处理方为 Codewhale 和 PostHog。", + "telemetryLead": "Codewhale 0.9.13 默认统计匿名使用量,并在首次启动时告知你;早先的 0.9.11 版本会先询问。关闭是会被后续版本保留的选择,在早先的自愿开启政策下记录的关闭也始终有效。显示告知绝不会代你记录任何同意;处理方为 Codewhale 和 PostHog。", "telemetry": [ [ "永远不收集", diff --git a/web/lib/changelog.generated.ts b/web/lib/changelog.generated.ts index 085462ac03..bda26f3cee 100644 --- a/web/lib/changelog.generated.ts +++ b/web/lib/changelog.generated.ts @@ -26,23 +26,49 @@ export const CHANGELOG: ChangelogRelease[] = [ "date": null, "unreleased": true, "compareUrl": "https://github.com/Hmbown/CodeWhale/compare/v0.9.12...HEAD", + "sections": [] + }, + { + "version": "0.9.13", + "date": "2026-09-07", + "unreleased": false, + "compareUrl": "https://github.com/Hmbown/CodeWhale/compare/v0.9.12...v0.9.13", "sections": [ + { + "heading": "Fixed", + "items": [ + "Pasting multiline text is one paste again. 0.9.12 gated the paste-burst heuristic off whenever bracketed paste was *requested*, but a terminal can accept EnableBracketedPaste and still deliver a paste as individual keystrokes — on those terminals (observed on Windows 11) every pasted line was submitted as its own message. The heuristic is again armed whenever tui.paste_burst_detection is on, and the existing bracketed_paste_seen guard still disarms it for the rest of the…", + "serve --acp no longer breaks strict JetBrains clients: the initialize response advertised sessionCapabilities.list as a boolean and carried an undefined nested load capability; it now sends {\"list\": {}} with no load key, per the ACP schema (#5969, reported by @Lujc0523).", + "Concurrent Codewhale instances no longer destroy each other's queued, unsent text. The offline input queue was one global file that boot cleared on session-id mismatch, so a second instance deleted the first's parked messages. Queues are now keyed per session (mirroring per-session checkpoints), an existing global file is adopted by its owning session rather than discarded, and the adoption race between two instances of the same session tolerates the loser's cleanup.", + "A tool call truncated at the provider's output limit can no longer be repaired into valid JSON and executed: repairs that had to synthesize structure (append or discard closers) are routed to the existing malformed-arguments path so the model is asked to re-issue — including when the stream is cut before the closing content-block event (#5986).", + "codewhale metrics reads Codewhale's own receipts again: the deepseek-home fallback resolved $HOME/.deepseek unconditionally, so the rollup reported all zeros from a directory nothing has written since 2024. The Codewhale audit log is primary, with a checked legacy fallback.", + "The goal-continuation loop's promised stall bound actually bounds stalls now, and undeclared fleet role names fail closed to read-only explore in both fleet drivers instead of resolving to write-capable customs in one and not the other.", + "allow_insecure_http = true under a [providers.] table works again. 0.9.12 tightened plain-HTTP base URL handling in a way that silently dropped the per-provider key, leaving the process-wide env var as the only opt-in — LAN llama.cpp and internal-gateway users had to export CODEWHALE_ALLOW_INSECURE_HTTP=1 to connect at all. The key is honored again (parsed, settable and unsettable through codewhale config set providers..allow_insecure_http, and listed in the…", + "A Fleet task that selects a roster member with worker.agent_profile now runs with that member's posture. The launch-time resolver only consulted the resolved member when the legacy worker.role label was absent, so a task labelled manager that selected member:reviewer ran as a write-capable manager instead of a reviewer and was never leased. The member's canonical slot now wins whenever one resolved; the label remains the posture only when no member resolved at all. To keep…" + ], + "itemCount": 8 + }, { "heading": "Changed", "items": [ + "The built-in Computer Use plugin bundle is refreshed to the standalone plugin's 0.2.0 runtime (vendored from Hmbown/codewhale-cu-plugin PR #12 @ 906b433): the native macOS accessibility backend with an a11y-first pointer strategy (covered points are refused, previews are drawn), the permission-owning desktop-app socket transport, remote computers over ssh and HarmonyOS HDC with contained temp handling, truthful win32 PowerShell failure reporting, and the shared allow-listed…", "/statusline drives the bottom chrome again. Since the 0.9.12 shell redesign the posture bar and the metrics line were built independently of tui.status_items, so every toggle in the picker except the balance fetch was decoration. Each remaining item now shows or hides exactly one thing: model, context_percent, cost, balance, cache, tokens and session_metrics are metrics-line segments, and mode is the posture bar's plan/act/operate chip. The status, agents, reasoning_replay,…", "The context reading is back on screen at every fullness. 0.9.12 painted ctx NN% only from 50% up, which left most of a session with no context signal at all; it now paints from 0% and keeps its warning colour from 80% up (#5950).", "A child agent parked because its parent's turn ended is shown as parked in the Agents panel, the sidebar and Agent Details, with resume_from / cancel as the recovery, instead of wearing the same \"waiting for input\" label as a child that asked a question. Parked work sorts below live and answerable work and no longer inflates the blocked chip; the receipts roster and the wire state gain parked (#5906, #5921).", - "codewhale account keys set|remove|list no longer carry a hardcoded eight-provider list. Provider ids come from the control plane's public catalog (GET /api/model-providers), are validated locally against ^[a-z0-9][a-z0-9-]{0,63}$ before they reach a URL path, and list shows every catalog provider with its label and stored-key state. --from-local maps a catalog row onto the local runtime provider through the catalog's own runtimeProvider field, so a newly supported provider…" + "codewhale account keys set|remove|list no longer carry a hardcoded eight-provider list. Provider ids come from the control plane's public catalog (GET /api/model-providers), are validated locally against ^[a-z0-9][a-z0-9-]{0,63}$ before they reach a URL path, and list shows every catalog provider with its label and stored-key state. --from-local maps a catalog row onto the local runtime provider through the catalog's own runtimeProvider field, so a newly supported provider…", + "/mcp lists the servers that need a login first, as their own Needs login group above Needs attention, and opens with the cursor already on the first such row so the Enter the screen advertises runs /mcp login straight away; translated in all 15 packs. A snapshot test pins the footer shape the chip landed with (MCP · N connected · N ◆ auth required · N failed) so an expired login never regresses into the failed count (#5926)." ], - "itemCount": 4 + "itemCount": 6 }, { "heading": "Fixed", "items": [ - "The posture bar states how long the session has been working and how long the current turn has run, distinguishing actively working from waiting on a tool, a sub-agent or the operator; the 0.9.12 shell had dropped the overall working-time indicator from the place a glancing user checks (#5914)." + "Five of the load-flaky tests tracked in #5929 no longer depend on shared state or live local daemons. Background-hook capture tests wait for the capture file to hold bytes instead of merely existing (the shell's > redirection creates the file empty before cat writes, which read as valid JSON: EOF under load); the session-picker acceptance test drives the real picker over a private store instead of a process-global CODEWHALE_HOME redirect that concurrent tests could observe…", + "The posture bar states how long the session has been working and how long the current turn has run, distinguishing actively working from waiting on a tool, a sub-agent or the operator; the 0.9.12 shell had dropped the overall working-time indicator from the place a glancing user checks (#5914).", + "A background runtime turn whose own store record could not be read, parsed or written (Failed to read turn …, Failed to read item …) was only a log line. The runtime now publishes a runtime.store_failure event naming the file, the root cause and the next action (move the file aside, or check free space and permissions); the TUI shows it as a warning toast and a transcript line, the task timeline records it, and the runtime API streams it. A turn whose own record is…", + "An MCP token refresh that fails to parse the provider's answer keeps the endpoint's receipt — status line, content type, and a 200-byte excerpt with every credential-shaped value (access_token, refresh_token, client_secret, id_token, bearer schemes) masked before the cut — instead of rmcp's bare Failed to parse server response, so a provider outage answering an HTML 502 reads differently from a parser defect, and the login remedy stays named (#5926; remedy wording landed in…" ], - "itemCount": 1 + "itemCount": 4 }, { "heading": "Added", @@ -60,7 +86,27 @@ export const CHANGELOG: ChangelogRelease[] = [ "/shannon [world|trace|children] inspects the session's ShannonNet World: agent, projected capabilities, children, and receipts.", "ShannonNet sub-agents get compiled context: the session's native-memory hits are imported with provenance and the child's projected World decides what it sees (confidential notes never cross); the session World is checkpointed and closed when the backend drops." ], - "itemCount": 14 + "itemCount": 15 + }, + { + "heading": "Contributors", + "items": [ + "@nsfoxer — reported the 0.9.12 multiline-paste regression with a root-cause analysis that made the fix a one-day turnaround (#5981).", + "@Nefelibata1024 — confirmed the paste regression's impact.", + "@Gabriel-Degret — reported allow_insecure_http being silently dropped in 0.9.12, with the valid-key list that pinned it (#5991).", + "@Lujc0523 — reported the ACP initialize schema violation that made Codewhale unusable from JetBrains IDEs (#5969).", + "@gaord — the fleet role-precedence recovery (#5945) and the README link to the community VS Code frontend (#5992).", + "@goransh-walia — the propose-only commit_plan rework (#5870)." + ], + "itemCount": 6 + }, + { + "heading": "Notes", + "items": [ + "Upgrading from 0.9.12 with Computer Use trusted and enabled: the bundle's content hash changes with the 0.2.0 refresh, so the plugin deactivates and asks for a fresh review — that is the designed fail-closed path for a desktop-driving plugin. Re-trust it from the Extensions page.", + "The multiline-paste fix restores v9.11 behavior on terminals that accept EnableBracketedPaste but deliver pastes as keystrokes (reported on Windows 11 / PowerShell). Verified at the input-contract level and in CI; a manual paste check on a real Windows terminal is still welcome — please comment on #5981 with your terminal if anything still misbehaves." + ], + "itemCount": 2 } ] }, @@ -156,6 +202,7 @@ export const CHANGELOG: ChangelogRelease[] = [ { "heading": "Fixed", "items": [ + "Read-only Fleet workers no longer send \"action\": {\"enum\": null} in their projected bash schema. The read-only projection probed the action enum with a mutating index, which auto-vivified the key on schemas that have no action property, and strict OpenAI-compatible validators then rejected the whole request (null is not of type \"array\"). The probe is non-mutating now, in both the read-only projection and the Run arm next to it, and a regression test walks the whole projected…", "Fast typing no longer corrupts the composer. The paste-burst heuristic ran on every session until a real bracketed paste arrived, holding, buffering, retro-grabbing, and absorbing Enter on timing guesses; it is now fallback-only (gated off when the terminal provides bracketed paste), the retro-grab is deleted, and Enter on held command text flushes and submits.", "Ctrl+C works on the pre-session launch menu and speaks everywhere: the first press arms the two-second exit window with a visible localized \"Press Ctrl+C again to quit\" hint (previously silent), the second exits. The worktree name input keeps Ctrl+C as cancel-input.", "Fresh interactive sessions no longer leave a phantom one-message duplicate behind. The TUI claimed one session id (Runtime store lock, turn-start crash checkpoint) while the engine minted a second one; the first SessionUpdated re-keyed the App, the completion commit cleared only the engine id's checkpoint, and codewhale --continue later \"recovered\" the orphaned checkpoint as a duplicate session instead of the real one. The engine now adopts the host-owned id at spawn…", @@ -166,10 +213,9 @@ export const CHANGELOG: ChangelogRelease[] = [ "Account sessions no longer read the macOS Keychain. Unsigned or rebuilt codewhale binaries were a new Keychain ACL principal every time, so codewhale web and the TUI popped a password dialog on start. Sessions now use ~/.codewhale/secrets/secrets.json (mode 0600), the same store as provider keys. Extracted from the Keychain-retirement half of #5632.", "Hardened the dispatcher-side config parse the same way: ConfigStore loads and project-config parsing now deserialize ConfigToml on a dedicated 16 MiB-stack thread (the guided-setup save path could overflow a 2 MiB worker stack the same way the TUI's ConfigFile parse did), and the #5585 setup-confirm toast test runs its runtime on an equally sized thread instead of overflowing the default libtest stack.", "Fixed detached interactive agents reporting worker usage after the parent turn ends with the usage missing from the session/live /cost total (#5597): interactive turns acquire an owner-scoped runtime usage lease, late usage enters the session cost pool without reopening the sealed mailbox, and worker/session/reload accounting share one hashed response identity so retried deliveries stay exactly-once.", - "Fixed the sub-agent fiasco class: in-workspace absolute git -C no longer trips the read-only child shell gate with a coherent bounded gate (#5595), turn end parks turn-owned children resumably instead of silently cancelling them (#5596), stale write-claims are released by liveness with coordinate release (#5562), and the verifier role description matches its real surface (#5562).", - "Fixed workflow responseSchema failure handling (#5583): bounded repair with typed receipts (kind + attempt), raw-output receipts persisted as artifacts that survive reload, and failures surfaced instead of null success (#5528). Degraded owner snapshots no longer project as ordinary Completed runs (#5582), typed task error kinds enable fail-fast parallel/pipeline (R9), and /workflow confirm finds the draft despite interleaved messages." + "Fixed the sub-agent fiasco class: in-workspace absolute git -C no longer trips the read-only child shell gate with a coherent bounded gate (#5595), turn end parks turn-owned children resumably instead of silently cancelling them (#5596), stale write-claims are released by liveness with coordinate release (#5562), and the verifier role description matches its real surface (#5562)." ], - "itemCount": 24 + "itemCount": 25 } ] }, @@ -392,93 +438,5 @@ export const CHANGELOG: ChangelogRelease[] = [ "itemCount": 4 } ] - }, - { - "version": "0.9.8", - "date": "2026-08-16", - "unreleased": false, - "compareUrl": "https://github.com/Hmbown/CodeWhale/compare/v0.9.7...v0.9.8", - "sections": [ - { - "heading": "Fixed", - "items": [ - "sudo (and su/setuid helpers) work again for wheel-group administrators who want Codewhale to be able to escalate: the Linux startup hardening's irreversible PR_SET_NO_NEW_PRIVS flag — inherited by every child process — is now skippable with CODEWHALE_NO_NEW_PRIVS=0 (#5413). The flag stays on by default; the no-ptrace and no-core-dump measures are never skipped.", - "Abort-class process deaths no longer poison the terminal (#5424). A stack overflow, allocation failure, or double panic skips the panic hook and every cleanup guard, which is how a v0.9.7 user's mid-turn exit left mouse capture leaking SGR sequences into their shell. An async-signal-safe handler now restores the terminal modes and appends a one-line cause marker to ~/.codewhale/crashes/last-fatal-signal.log before re-raising, keeping the honest 128+signal wait status. A…" - ], - "itemCount": 2 - }, - { - "heading": "Changed", - "items": [ - "Prompt-cache prefix is pinned for the session. The tool loop no longer recomposes the system prompt from disk on every model step, so an agent writing a file no longer busts the provider KV prefix cache mid-turn. The system prompt and tool catalog are re-composed only on a declared header change (/model, mode, goal, session resume), which re-pins under a logged reason; an undeclared change is reported as drift and the original pin is kept instead of silently becoming the new…", - "Plugin compatibility is now per-component. A reviewed, trusted, enabled bundle that mixes Skills or MCP with unsupported commands, agents, hooks, LSP, native, filesystem-roots, or lifecycle-mutation declarations keeps the supported adapters active and reports the rest as inactive (full / partial / unsupported). All-unsupported bundles still cannot be enabled. The capability hash is now v2 and binds this build's activation policy, so older v1 receipts and any later…" - ], - "itemCount": 2 - }, - { - "heading": "Added", - "items": [ - "Opt-in multiline composer mode (composer_multiline_mode = true) makes Enter insert a newline and Shift+Enter send. Alt+Enter, Ctrl+J, and supported Ctrl+Enter/Cmd+Enter behavior stays unchanged (#5345, @AiurArtanis).", - "/plugin marketplace add|list|show|remove|install completes the federated marketplace journey (#5311). add reads one LOCAL catalog document in the real published schemas (Kimi, Claude, Codex, or Codewhale native) — no network, regular files only — and persists it beside the plugin state with the same hardened, fail-closed store. list/show render every candidate with per-entry diagnostics, display-only tiers, and honest install plans that say when Codewhale cannot fetch a…", - "/rc attach now includes an observed owner/name git remote when the folder has a GitHub, CNB, or Gitee origin, so CWC can label the paired session. Paths stay off the wire. Reconnect after both this client and CWC #202 land to backfill existing empty rows.", - "The local Runtime web client keeps the thread rail clipped so New thread cannot paint over the session fact chips. Chips wrap instead of sliding under the rail.", - "Z.ai GLM-5.3 is live on the Coding Plan and is now the default direct Z.ai model: DEFAULT_ZAI_MODEL resolves to GLM-5.3 in both codewhale-tui and codewhale-config, and it is the first /model row after /provider zai. Explicit GLM-5.2 selections (model = \"GLM-5.2\" and its glm-5.2 aliases) keep their own id — only the default moved. Limits and reasoning options still inherit from GLM-5.2 until Z.ai publishes distinct 5.3 numbers. No USD price is claimed. A live call can still…", - "The TUI transcript renders Markdown blockquotes (> lines) with a quote rail — nested quotes, inline bold/code/links, wrapped continuation rows, and selection copy that keeps the quote text and skips the rail chrome.", - "Sub-agent details show the resolved model, fleet role, and type. Labels use the session/role name instead of a generic Agent N (#5371, #5287).", - "Documented catalogue output ceilings (including DeepSeek V4's 384K maximum) remain authoritative bounds, while ordinary requests start at a safe 64K cap and explicit overrides can raise it within the resolved route window. A clean output-limit stop continues the turn instead of killing it (#5373, #5516, #5518). Thanks @sfdzhmr and @hxfhd for the route evidence.", - "Ollama Cloud is a first-class hosted provider (/provider ollama-cloud) on the official OpenAI-compatible https://ollama.com/v1 route. Local Ollama stays keyless. The exact released ollama + Cloud URL tuple keeps a bounded compatibility path across saved sessions, Fleet, and nested subagents; neighboring remotes stay custom and fail closed against inherited official credentials.", - "Homebrew ships a codewhale formula. brew tap Hmbown/deepseek-tui && brew install codewhale is the install path; brew upgrade codewhale updates it. The legacy deepseek-tui formula remains a deprecated alias for one overlap release.", - "/title [name|off] sets a per-session tab/window title, shown as [title] … in front of the terminal window title (Codewhale / reasoning… / using tool… / done). The title config key supplies the default (/config title … --save persists it); multi-window workflows can tell parallel sessions apart at a glance. /title is independent of /rename, which keeps naming the session in the picker and composer. Control, bidi, and zero-width format characters are stripped from both the…", - "Eden AI is a named OpenAI-compatible Chat Completions provider (edenai, aliases eden-ai / eden_ai) with EDENAI_API_KEY, global and EU base-URL overrides, a live provider-scoped model catalog, and deepseek/deepseek-v4-pro as the verified default. Generic reasoning fields stay omitted because Eden AI routes multiple upstream model families (#5422, Kai Nacke)." - ], - "itemCount": 20 - }, - { - "heading": "Fixed", - "items": [ - "Selecting the google provider kind resolved to the antigravity TUI identity (and vice versa): the agy provider entry was inserted at different positions in the config-level enum and the TUI's discriminant-indexed lookup table. The table now matches the enum, so provider pickers, sorted display, and kind round-trips are correct.", - "The provider picker's key-entry stage accepted typed input and pastes for OAuth-only providers after antigravity declared OAuth acquisition; those gates now key off the OAuth acquisition class instead of a hard-coded provider identity.", - "The webhook hook sink no longer panics when its HTTP client fails to build; it falls back to a default client (#5381, EvanProgramming).", - "Session-index JSONL writes are serialized behind a process-wide mutex so concurrent state stores cannot drop an append during compaction (#5382, EvanProgramming; complements the cross-process file lock).", - "A billed max_tokens stop followed by a transport error fails the turn instead of continuing into a second request. A clean output-limit stop still continues. Mid-size context windows keep the ordinary 65K internal reservation so compaction does not collapse to the 1K headroom floor when the catalogue documents a matching output ceiling.", - "Thinking cycle, /effort, and Settings now walk each model's real ladder instead of the DeepSeek off/high/max shortcut. Grok 4.6 is auto/low/medium/high/xhigh (cannot disable); Grok 4.5 is auto/low/medium/high; first-party DeepSeek keeps a documented low tier. /effort persists and receipts through the same path as Ctrl+T.", - "Google Gemini is its own backend (/provider google) on the official OpenAI-compatible route with thought-signature capture/replay and fail-closed replay for thinking models. Antigravity (agy 1.1.13) is a separate provider: consent-gated read-only import of the official CLI's login, then a text-only cloud-code stream (/v1internal:streamGenerateContent). Tools, images, and unknown SSE shapes fail closed. Gemini 3.7 Flash is not advertised until a live turn succeeds on this…", - "DeepSeek Flash SSE on macOS no longer turns mid-character HTTP/2 flushes into U+FFFD replacement characters (#5374). Invalid UTF-8 fails the line instead of using lossy decode.", - "[workshop] read_result_max_bytes and tool_result_max_bytes raise the model-visible read/tool-result floor; they never lower the compile-time defaults and cap at 2MiB (#5367).", - "Fireworks and OpenCode Zen DeepSeek V4 Flash/Pro keep a bundled family rate when the live control plane is down, so session cost is not stuck on unverified_live_pricing (#5241). kimi-k3 stays unpriced until a published rate exists.", - "Provider setup ships a typed beginner template catalog (#5350). OpenCode Zen/Go stay first-class key-only rows with their documented hosts and curated models. SenseNova fills a named OpenAI-compatible table on the published https://token.sensenova.cn/v1 host (S or /provider setup sensenova). Agnes is listed as unpublished because this repository has no published URL. /provider P and Settings → beginner templates open the list; T tests /models and refreshes status without…", - "Privileged release workflows no longer restore rust-cache, sccache, or npm caches after checking out a caller-supplied SHA (CodeQL cache-poisoning #88–#106). Catalog drift no longer prints raw bundled/upstream blobs (#107)." - ], - "itemCount": 24 - }, - { - "heading": "Removed", - "items": [ - "The source-structure budget ratchet (CI step, checker, baseline JSON). It measured line counts, not quality: every legitimate feature required a hand-edited ceiling and the accompanying \"review\" was self-review, so it bought ceremony, not protection. Behavior-measuring gates (dead-code, runtime-contract, persistence-backlog) stay enforced.", - "DeepSeek can reuse a key already stored by official DeepSeek Harness (dsh) after codewhale auth external-consent --provider deepseek --mode read-only. Codewhale reads only DEEPSEEK_API_KEY from the exact granted $DSH_HOME/.credentials.yaml and never writes or refreshes that file.", - "The TUI markdown parser now honors CommonMark fence-length rules: a opener is not closed by a shorter line, so >` content inside a longer fence stays literal code instead of escaping into a quote.", - "Sub-agents finalize when the parent session id changes, so a closed session cannot block new children as a live owner (#5372).", - "Child spawn-route receipts stay live and usage is deduped by response (#5366).", - "Doctor keeps persisted setup readiness across first-run / update checkpoints (#5340).", - "Approval default selection is applied and explained; agents are told when approvals are disabled (#5293).", - "A /models 2xx probe is a connection check, not model readiness.", - "Site layout uses one container, the ticker no longer implies false provider readiness, and install links stay in the active locale." - ], - "itemCount": 9 - }, - { - "heading": "Contributors", - "items": [ - "EvanProgramming (@EvanProgramming) — webhook client panic fallback (#5381); session-index JSONL mutex (#5382).", - "Lstarsky0 (@Lstarsky0) — session peek hides internal runtime events (#5376); thinking-ladder test re-pin (#5378); provider-count follow-ups (#5383/#5384); macOS agy fixture canonicalization (#5392); zh-Hans 宪章 terminology (#5397); regenerated website facts harvested and corrected from #5398.", - "Matt Van Horn (@mvanhorn) — read-only models settings preview on the website (#5411, fixes #5370).", - "Nhat Bui (@buiducnhat) — canonical ultra reasoning effort mapped across provider effort tables (#5409); session titles truncated by character count, not byte offset (#5415).", - "Sh1Zuku (@SparkofSpike) — /title and the session name in the terminal tab/window title, plus the mid-turn title deadlock fix (#5419).", - "Kai Nacke (@redstar) — Eden AI provider registration, aliases, EDENAI_API_KEY, and the global/EU endpoints (#5422).", - "Isabel Wu (@wuisabel-gif) — background verifier test isolated from rustup and $HOME (#5423, slice of #5056)." - ], - "itemCount": 7 - } - ] } ]; diff --git a/web/lib/facts.generated.ts b/web/lib/facts.generated.ts index fe2c673b10..59b0254ae0 100644 --- a/web/lib/facts.generated.ts +++ b/web/lib/facts.generated.ts @@ -27,10 +27,10 @@ export interface RepoFacts { } export const FACTS: RepoFacts = { - "generatedAt": "2026-09-07T05:01:30.152Z", + "generatedAt": "2026-09-07T14:16:12.671Z", "sourceRevision": null, "sourceCommittedAt": null, - "version": "0.9.12", + "version": "0.9.13", "crates": [ "agent", "app-server", diff --git a/web/lib/i18n/dictionaries/en/docs-trust.ts b/web/lib/i18n/dictionaries/en/docs-trust.ts index 493477b5fe..32da278b3a 100644 --- a/web/lib/i18n/dictionaries/en/docs-trust.ts +++ b/web/lib/i18n/dictionaries/en/docs-trust.ts @@ -38,7 +38,7 @@ export const docsTrust: DocsTrustDict = { "The repository also contains a seccomp module and a future Windows helper contract. Neither is wired into child-command launch, so Codewhale does not advertise them: source-only sandbox code is not evidence that a command was restricted.", telemetryTitle: "Telemetry, exactly", telemetryLead: - "Codewhale 0.9.12 counts anonymous usage by default and tells you so at first launch; the earlier 0.9.11 release asked first. Turning it off is a saved choice that later versions keep, and an opt-out recorded under the earlier opt-in policy stays off. Showing the notice never records any acceptance on your behalf; Codewhale and PostHog are named as the processors.", + "Codewhale 0.9.13 counts anonymous usage by default and tells you so at first launch; the earlier 0.9.11 release asked first. Turning it off is a saved choice that later versions keep, and an opt-out recorded under the earlier opt-in policy stays off. Showing the notice never records any acceptance on your behalf; Codewhale and PostHog are named as the processors.", telemetry: [ ["Never collected", "Conversations, code, prompts, files, file/repo/branch names, model content, credentials, or any per-turn or per-tool timeline."], ["Sent while on", "Version and platform classes, session duration and outcome, feature and error counters, closed enums, and a random install id that rotates every 90 days."], diff --git a/web/lib/i18n/dictionaries/zh/docs-trust.ts b/web/lib/i18n/dictionaries/zh/docs-trust.ts index 12212d6f19..6a8c951f9e 100644 --- a/web/lib/i18n/dictionaries/zh/docs-trust.ts +++ b/web/lib/i18n/dictionaries/zh/docs-trust.ts @@ -36,7 +36,7 @@ export const docsTrust: DocsTrustDict = { sandboxNote: "仓库中还有一个 seccomp 模块和一份未来的 Windows 辅助程序契约。两者都没有接入子命令启动,所以 Codewhale 不会宣传它们:只存在于源码中的沙箱代码不能证明某条命令受到了限制。", telemetryTitle: "遥测,精确到每一项", - telemetryLead: "Codewhale 0.9.12 默认统计匿名使用量,并在首次启动时告知你;早先的 0.9.11 版本会先询问。关闭是会被后续版本保留的选择,在早先的自愿开启政策下记录的关闭也始终有效。显示告知绝不会代你记录任何同意;处理方为 Codewhale 和 PostHog。", + telemetryLead: "Codewhale 0.9.13 默认统计匿名使用量,并在首次启动时告知你;早先的 0.9.11 版本会先询问。关闭是会被后续版本保留的选择,在早先的自愿开启政策下记录的关闭也始终有效。显示告知绝不会代你记录任何同意;处理方为 Codewhale 和 PostHog。", telemetry: [ ["永远不收集", "对话、代码、prompt、文件、文件/仓库/分支名、模型内容、凭据,以及任何逐轮或逐工具的时间线。"], ["开启时发送", "版本与平台类别、会话时长与结果、功能与错误计数、封闭枚举,以及一个每 90 天轮换的随机安装 id。"], diff --git a/web/lib/release-credits.ts b/web/lib/release-credits.ts index f400612e76..a93709654f 100644 --- a/web/lib/release-credits.ts +++ b/web/lib/release-credits.ts @@ -20,24 +20,8 @@ /** Contributors whose PRs were merged or harvested into this release. */ export const RELEASE_CONTRIBUTORS: string[] = [ - "@h3c-hexin", - "@qiuYliangM", - "@wuisabel-gif", - "@aboimpinto", - "@musichen", "@gaord", - "@SparkofSpike", - "@M-Maciej", - "@serephus", - "@whp233", - "@Gabriel-Degret", - "@huangxianzhan", - "@zhuowp", - "@AdityaVG13", - "@nightt5879", - "@Lstarsky0", - "@yiheng-kkk", - "@Lfanxing", + "@goransh-walia", ]; /** @@ -45,8 +29,8 @@ export const RELEASE_CONTRIBUTORS: string[] = [ * Each name points at a landed change in the 0.9.12 changelog. */ export const RELEASE_HELPERS: string[] = [ - "@slowly247", - "@ronohara", + "@nsfoxer", + "@Nefelibata1024", + "@Gabriel-Degret", "@Lujc0523", - "@senka9h", ];