diff --git a/CHANGELOG.md b/CHANGELOG.md index d4226d6f1..b1c6e3c32 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,94 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.3] - 2026-07-31 + +DeepSeek V4 Flash is now a first-class Codewhale route, and the agent-facing +tool surface has been reduced to the canonical action tools that current +models actually need. This release also hardens credential, authorization, +durability, compaction, and macOS File Provider boundaries while deleting +stale runtime and dependency surface. + +### Added + +- Native `deepseek-v4-flash` support over DeepSeek's Responses API, including + stateless reasoning-item replay, semantic SSE terminal events, structured + function calls and outputs, `apply_patch`, and model-aware wire-format + selection. Exact current Flash IDs use Responses; future direct + `deepseek-vN-*` model IDs inherit that route conservatively, while custom + DeepSeek-compatible endpoints retain Chat Completions unless configured + otherwise. +- A pipe-only `codewhale auth print-api-key` handoff for explicitly selected + providers. It shares Codewhale's home-scoped credential authority, refuses + terminal output, and prevents sentinel placeholders from becoming live + credentials. +- Per-turn `max_tool_calls` enforcement at the engine admission gate, plus a + named-file write scope with a separate read seam. The runtime now rejects + over-budget calls before execution and keeps the operator's write boundary + explicit (#4415). +- Runtime-contract, source-structure, and persistence-backlog ratchets that + name drift instead of allowing large ownership surfaces to grow silently + (#3921, #4785). + +### Changed + +- Model-visible built-ins now use the canonical `Bash`, `File`, and `Run` + action schemas. `apply_patch` remains available as the one direct custom + edit tool supported by DeepSeek Responses. The bundled stop-ship workflow, + Fleet fixtures, shell shortcut, and engine tests use the same canonical + vocabulary. +- Canonical `File { action: "write" }` requests now pass through the same + semantic repo-law checks as the former write path. Approval, Full Access, + and workflow execution cannot bypass the repository safety floor by choosing + the canonical schema. +- Codewhale home resolution is shared across the CLI, TUI, state, and secret + stores. `doctor` is offline by default, distinguishes credential source from + availability, and reports one consistent path snapshot. +- Durable runtime event writes are serialized across simultaneous processes, + blocking history waits move off async workers, and provider quota exhaustion + remains typed and retryable through compaction (#4522). +- Skill discovery caches the merged catalog behind watched-mtime validation; + large skill, engine, subagent, UI, and ambient-ocean test blocks now live in + owned test seams. +- Reasoning summaries stay in the user's language, complete jellyfish + silhouettes relocate around transcript text, and cached ocean frames include + their palette identity (#4807). +- The authorization-order contract now documents and tests how modes, hooks, + permission rules, safety floors, repo law, approvals, and sandboxing compose + (PR #4980). + +### Fixed + +- macOS sandbox extensions cover CloudStorage/File Provider workspaces without + broadening unrelated paths; thanks @Watcher24 for the #4085 report and + reproduction. +- Foreground shell state detaches before steering, so an interrupted command + cannot keep owning the composer (PR #4979). +- MCP application-level failures and malformed error envelopes fail closed + instead of looking like successful tool output. +- Optional PDF failures are truthful and PDF classification no longer misses + supported inputs. +- Bracketed-paste contents are redacted from traces, and credential diagnostics + never treat placeholder sentinels as usable keys. + +### Removed + +- The legacy callable aliases `exec_shell`, `run_shell_command`, `read_file`, + `write_file`, `list_dir`, `grep_files`, `file_search`, and the duplicate + Work/RLM registrations. Historical transcript and policy semantics remain + readable, but new model turns receive only the canonical action surface. +- The bundled PDF parser dependency chain, replacing it with the smaller + optional extraction boundary tracked by #4382. + +### Contributors + +- [Turisla](https://github.com/greyfreedom) (`@greyfreedom`) documented and + locked the authorization-order contract in PR #4980. +- [Nightt](https://github.com/nightt5879) (`@nightt5879`) fixed foreground + shell detachment before steering in PR #4979. +- [Watcher24](https://github.com/Watcher24) (`@Watcher24`) provided the macOS + File Provider report and reproduction for #4085. + ## [0.9.2] - 2026-07-29 This is the Codewhale v0.9.2 source candidate. It is not a published release @@ -4578,7 +4666,8 @@ 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.1...HEAD +[Unreleased]: https://github.com/Hmbown/CodeWhale/compare/v0.9.3...HEAD +[0.9.3]: https://github.com/Hmbown/CodeWhale/compare/v0.9.2...v0.9.3 [0.9.2]: https://github.com/Hmbown/CodeWhale/compare/v0.9.1...v0.9.2 [0.9.1]: https://github.com/Hmbown/CodeWhale/compare/v0.9.0...v0.9.1 [0.8.68]: https://github.com/Hmbown/CodeWhale/compare/v0.8.67...v0.8.68 diff --git a/Cargo.lock b/Cargo.lock index c6f1815dd..a1c7c7678 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -827,7 +827,7 @@ checksum = "e9b18233253483ce2f65329a24072ec414db782531bdbb7d0bbc4bd2ce6b7e21" [[package]] name = "codewhale-agent" -version = "0.9.2" +version = "0.9.3" dependencies = [ "codewhale-config", "serde", @@ -835,7 +835,7 @@ dependencies = [ [[package]] name = "codewhale-app-server" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "axum", @@ -863,11 +863,11 @@ dependencies = [ [[package]] name = "codewhale-build-support" -version = "0.9.2" +version = "0.9.3" [[package]] name = "codewhale-cli" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "chrono", @@ -903,7 +903,7 @@ dependencies = [ [[package]] name = "codewhale-config" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "codewhale-execpolicy", @@ -923,7 +923,7 @@ dependencies = [ [[package]] name = "codewhale-core" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "async-trait", @@ -944,7 +944,7 @@ dependencies = [ [[package]] name = "codewhale-execpolicy" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "codewhale-protocol", @@ -953,7 +953,7 @@ dependencies = [ [[package]] name = "codewhale-hooks" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "async-trait", @@ -968,7 +968,7 @@ dependencies = [ [[package]] name = "codewhale-lane" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "chrono", @@ -983,7 +983,7 @@ dependencies = [ [[package]] name = "codewhale-mcp" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "serde", @@ -993,14 +993,14 @@ dependencies = [ [[package]] name = "codewhale-paths" -version = "0.9.2" +version = "0.9.3" dependencies = [ "dirs", ] [[package]] name = "codewhale-protocol" -version = "0.9.2" +version = "0.9.3" dependencies = [ "chrono", "serde", @@ -1010,7 +1010,7 @@ dependencies = [ [[package]] name = "codewhale-release" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "reqwest 0.13.4", @@ -1023,7 +1023,7 @@ dependencies = [ [[package]] name = "codewhale-secrets" -version = "0.9.2" +version = "0.9.3" dependencies = [ "codewhale-paths", "keyring", @@ -1036,7 +1036,7 @@ dependencies = [ [[package]] name = "codewhale-state" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "chrono", @@ -1051,7 +1051,7 @@ dependencies = [ [[package]] name = "codewhale-tools" -version = "0.9.2" +version = "0.9.3" dependencies = [ "anyhow", "async-trait", @@ -1065,7 +1065,7 @@ dependencies = [ [[package]] name = "codewhale-tui" -version = "0.9.2" +version = "0.9.3" dependencies = [ "ahash", "anyhow", @@ -1158,7 +1158,7 @@ dependencies = [ [[package]] name = "codewhale-workflow" -version = "0.9.2" +version = "0.9.3" dependencies = [ "serde", "serde_json", @@ -1170,7 +1170,7 @@ dependencies = [ [[package]] name = "codewhale-workflow-js" -version = "0.9.2" +version = "0.9.3" dependencies = [ "async-trait", "jsonschema 0.48.5", diff --git a/Cargo.toml b/Cargo.toml index 08d3eeb5b..5a92d6f3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,7 +24,7 @@ default-members = ["crates/cli", "crates/app-server", "crates/tui"] resolver = "2" [workspace.package] -version = "0.9.2" +version = "0.9.3" 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 d255648fd..97d17f516 100644 --- a/crates/agent/Cargo.toml +++ b/crates/agent/Cargo.toml @@ -8,5 +8,5 @@ repository.workspace = true description = "Model/provider registry and fallback strategy for Codewhale" [dependencies] -codewhale-config = { path = "../config", version = "0.9.2" } +codewhale-config = { path = "../config", version = "0.9.3" } serde.workspace = true diff --git a/crates/app-server/Cargo.toml b/crates/app-server/Cargo.toml index def50f99a..53e88f80a 100644 --- a/crates/app-server/Cargo.toml +++ b/crates/app-server/Cargo.toml @@ -12,16 +12,16 @@ autobins = false [dependencies] anyhow.workspace = true axum.workspace = true -codewhale-agent = { path = "../agent", version = "0.9.2" } -codewhale-config = { path = "../config", version = "0.9.2" } -codewhale-core = { path = "../core", version = "0.9.2" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.2" } -codewhale-hooks = { path = "../hooks", version = "0.9.2" } -codewhale-mcp = { path = "../mcp", version = "0.9.2" } -codewhale-protocol = { path = "../protocol", version = "0.9.2" } -codewhale-release = { path = "../release", version = "0.9.2" } -codewhale-state = { path = "../state", version = "0.9.2" } -codewhale-tools = { path = "../tools", version = "0.9.2" } +codewhale-agent = { path = "../agent", version = "0.9.3" } +codewhale-config = { path = "../config", version = "0.9.3" } +codewhale-core = { path = "../core", version = "0.9.3" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.3" } +codewhale-hooks = { path = "../hooks", version = "0.9.3" } +codewhale-mcp = { path = "../mcp", version = "0.9.3" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } +codewhale-release = { path = "../release", version = "0.9.3" } +codewhale-state = { path = "../state", version = "0.9.3" } +codewhale-tools = { path = "../tools", version = "0.9.3" } serde.workspace = true serde_json.workspace = true rustls.workspace = true diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index ffd1e2a99..f914d9e1b 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -20,17 +20,17 @@ path = "src/bin/codew.rs" anyhow.workspace = true clap.workspace = true clap_complete.workspace = true -codewhale-agent = { path = "../agent", version = "0.9.2" } -codewhale-app-server = { path = "../app-server", version = "0.9.2" } -codewhale-config = { path = "../config", version = "0.9.2" } -codewhale-lane = { path = "../lane", version = "0.9.2" } -codewhale-workflow = { path = "../workflow", version = "0.9.2" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.2" } -codewhale-mcp = { path = "../mcp", version = "0.9.2" } -codewhale-paths = { path = "../paths", version = "0.9.2" } -codewhale-release = { path = "../release", version = "0.9.2" } -codewhale-secrets = { path = "../secrets", version = "0.9.2" } -codewhale-state = { path = "../state", version = "0.9.2" } +codewhale-agent = { path = "../agent", version = "0.9.3" } +codewhale-app-server = { path = "../app-server", version = "0.9.3" } +codewhale-config = { path = "../config", version = "0.9.3" } +codewhale-lane = { path = "../lane", version = "0.9.3" } +codewhale-workflow = { path = "../workflow", version = "0.9.3" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.3" } +codewhale-mcp = { path = "../mcp", version = "0.9.3" } +codewhale-paths = { path = "../paths", version = "0.9.3" } +codewhale-release = { path = "../release", version = "0.9.3" } +codewhale-secrets = { path = "../secrets", version = "0.9.3" } +codewhale-state = { path = "../state", version = "0.9.3" } chrono.workspace = true dirs.workspace = true serde.workspace = true @@ -46,7 +46,7 @@ tracing.workspace = true zeroize = "1.8.2" [build-dependencies] -codewhale-build-support = { path = "../build-support", version = "0.9.2" } +codewhale-build-support = { path = "../build-support", version = "0.9.3" } # 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/config/Cargo.toml b/crates/config/Cargo.toml index efeab82e2..565547486 100644 --- a/crates/config/Cargo.toml +++ b/crates/config/Cargo.toml @@ -9,9 +9,9 @@ description = "Config schema and precedence model for Codewhale" [dependencies] anyhow.workspace = true -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.2" } -codewhale-paths = { path = "../paths", version = "0.9.2" } -codewhale-secrets = { path = "../secrets", version = "0.9.2" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.3" } +codewhale-paths = { path = "../paths", version = "0.9.3" } +codewhale-secrets = { path = "../secrets", version = "0.9.3" } fd-lock = "4.0.4" libc = "0.2" serde.workspace = true diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index cb3d84668..18220341e 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -10,14 +10,14 @@ description = "Core runtime boundaries for Codewhale" [dependencies] anyhow.workspace = true chrono.workspace = true -codewhale-agent = { path = "../agent", version = "0.9.2" } -codewhale-config = { path = "../config", version = "0.9.2" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.2" } -codewhale-hooks = { path = "../hooks", version = "0.9.2" } -codewhale-mcp = { path = "../mcp", version = "0.9.2" } -codewhale-protocol = { path = "../protocol", version = "0.9.2" } -codewhale-state = { path = "../state", version = "0.9.2" } -codewhale-tools = { path = "../tools", version = "0.9.2" } +codewhale-agent = { path = "../agent", version = "0.9.3" } +codewhale-config = { path = "../config", version = "0.9.3" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.3" } +codewhale-hooks = { path = "../hooks", version = "0.9.3" } +codewhale-mcp = { path = "../mcp", version = "0.9.3" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } +codewhale-state = { path = "../state", version = "0.9.3" } +codewhale-tools = { path = "../tools", version = "0.9.3" } serde_json.workspace = true tokio = { workspace = true, features = ["time"] } tracing.workspace = true diff --git a/crates/execpolicy/Cargo.toml b/crates/execpolicy/Cargo.toml index a4b9e0bb6..d3d097b04 100644 --- a/crates/execpolicy/Cargo.toml +++ b/crates/execpolicy/Cargo.toml @@ -9,5 +9,5 @@ description = "Execution policy and approval model for Codewhale" [dependencies] anyhow.workspace = true -codewhale-protocol = { path = "../protocol", version = "0.9.2" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } serde.workspace = true diff --git a/crates/hooks/Cargo.toml b/crates/hooks/Cargo.toml index 5c86abab4..68c356744 100644 --- a/crates/hooks/Cargo.toml +++ b/crates/hooks/Cargo.toml @@ -11,8 +11,8 @@ description = "Hook dispatch and notifications support for Codewhale" anyhow.workspace = true async-trait.workspace = true chrono.workspace = true -codewhale-protocol = { path = "../protocol", version = "0.9.2" } -codewhale-release = { path = "../release", version = "0.9.2" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } +codewhale-release = { path = "../release", version = "0.9.3" } reqwest.workspace = true serde.workspace = true serde_json.workspace = true diff --git a/crates/lane/Cargo.toml b/crates/lane/Cargo.toml index ef1db77ad..9ea4df0e3 100644 --- a/crates/lane/Cargo.toml +++ b/crates/lane/Cargo.toml @@ -10,7 +10,7 @@ description = "Lane registry and Runtime backends for Codewhale workflow instanc [dependencies] anyhow.workspace = true chrono.workspace = true -codewhale-config = { path = "../config", version = "0.9.2" } +codewhale-config = { path = "../config", version = "0.9.3" } 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 bf43c04e1..91fa3ae3d 100644 --- a/crates/secrets/Cargo.toml +++ b/crates/secrets/Cargo.toml @@ -8,7 +8,7 @@ repository.workspace = true description = "Secret storage backends for Codewhale, with OS keyring and file fallback" [dependencies] -codewhale-paths = { path = "../paths", version = "0.9.2" } +codewhale-paths = { path = "../paths", version = "0.9.3" } serde = { workspace = true } serde_json = { workspace = true } tempfile.workspace = true diff --git a/crates/state/Cargo.toml b/crates/state/Cargo.toml index 6b8bd1151..c091962fd 100644 --- a/crates/state/Cargo.toml +++ b/crates/state/Cargo.toml @@ -10,8 +10,8 @@ description = "Session/thread persistence and recovery model for Codewhale" [dependencies] anyhow.workspace = true chrono.workspace = true -codewhale-paths = { path = "../paths", version = "0.9.2" } -codewhale-protocol = { path = "../protocol", version = "0.9.2" } +codewhale-paths = { path = "../paths", version = "0.9.3" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } fd-lock = "4.0.4" rusqlite.workspace = true serde.workspace = true diff --git a/crates/tools/Cargo.toml b/crates/tools/Cargo.toml index 3a39f3663..9405e93ac 100644 --- a/crates/tools/Cargo.toml +++ b/crates/tools/Cargo.toml @@ -10,7 +10,7 @@ description = "Tool invocation lifecycle, schema validation, and scheduler paral [dependencies] anyhow.workspace = true async-trait.workspace = true -codewhale-protocol = { path = "../protocol", version = "0.9.2" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } serde.workspace = true serde_json.workspace = true thiserror.workspace = true diff --git a/crates/tui/CHANGELOG.md b/crates/tui/CHANGELOG.md index 931ee27e3..1f24fab8e 100644 --- a/crates/tui/CHANGELOG.md +++ b/crates/tui/CHANGELOG.md @@ -7,6 +7,94 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.3] - 2026-07-31 + +DeepSeek V4 Flash is now a first-class Codewhale route, and the agent-facing +tool surface has been reduced to the canonical action tools that current +models actually need. This release also hardens credential, authorization, +durability, compaction, and macOS File Provider boundaries while deleting +stale runtime and dependency surface. + +### Added + +- Native `deepseek-v4-flash` support over DeepSeek's Responses API, including + stateless reasoning-item replay, semantic SSE terminal events, structured + function calls and outputs, `apply_patch`, and model-aware wire-format + selection. Exact current Flash IDs use Responses; future direct + `deepseek-vN-*` model IDs inherit that route conservatively, while custom + DeepSeek-compatible endpoints retain Chat Completions unless configured + otherwise. +- A pipe-only `codewhale auth print-api-key` handoff for explicitly selected + providers. It shares Codewhale's home-scoped credential authority, refuses + terminal output, and prevents sentinel placeholders from becoming live + credentials. +- Per-turn `max_tool_calls` enforcement at the engine admission gate, plus a + named-file write scope with a separate read seam. The runtime now rejects + over-budget calls before execution and keeps the operator's write boundary + explicit (#4415). +- Runtime-contract, source-structure, and persistence-backlog ratchets that + name drift instead of allowing large ownership surfaces to grow silently + (#3921, #4785). + +### Changed + +- Model-visible built-ins now use the canonical `Bash`, `File`, and `Run` + action schemas. `apply_patch` remains available as the one direct custom + edit tool supported by DeepSeek Responses. The bundled stop-ship workflow, + Fleet fixtures, shell shortcut, and engine tests use the same canonical + vocabulary. +- Canonical `File { action: "write" }` requests now pass through the same + semantic repo-law checks as the former write path. Approval, Full Access, + and workflow execution cannot bypass the repository safety floor by choosing + the canonical schema. +- Codewhale home resolution is shared across the CLI, TUI, state, and secret + stores. `doctor` is offline by default, distinguishes credential source from + availability, and reports one consistent path snapshot. +- Durable runtime event writes are serialized across simultaneous processes, + blocking history waits move off async workers, and provider quota exhaustion + remains typed and retryable through compaction (#4522). +- Skill discovery caches the merged catalog behind watched-mtime validation; + large skill, engine, subagent, UI, and ambient-ocean test blocks now live in + owned test seams. +- Reasoning summaries stay in the user's language, complete jellyfish + silhouettes relocate around transcript text, and cached ocean frames include + their palette identity (#4807). +- The authorization-order contract now documents and tests how modes, hooks, + permission rules, safety floors, repo law, approvals, and sandboxing compose + (PR #4980). + +### Fixed + +- macOS sandbox extensions cover CloudStorage/File Provider workspaces without + broadening unrelated paths; thanks @Watcher24 for the #4085 report and + reproduction. +- Foreground shell state detaches before steering, so an interrupted command + cannot keep owning the composer (PR #4979). +- MCP application-level failures and malformed error envelopes fail closed + instead of looking like successful tool output. +- Optional PDF failures are truthful and PDF classification no longer misses + supported inputs. +- Bracketed-paste contents are redacted from traces, and credential diagnostics + never treat placeholder sentinels as usable keys. + +### Removed + +- The legacy callable aliases `exec_shell`, `run_shell_command`, `read_file`, + `write_file`, `list_dir`, `grep_files`, `file_search`, and the duplicate + Work/RLM registrations. Historical transcript and policy semantics remain + readable, but new model turns receive only the canonical action surface. +- The bundled PDF parser dependency chain, replacing it with the smaller + optional extraction boundary tracked by #4382. + +### Contributors + +- [Turisla](https://github.com/greyfreedom) (`@greyfreedom`) documented and + locked the authorization-order contract in PR #4980. +- [Nightt](https://github.com/nightt5879) (`@nightt5879`) fixed foreground + shell detachment before steering in PR #4979. +- [Watcher24](https://github.com/Watcher24) (`@Watcher24`) provided the macOS + File Provider report and reproduction for #4085. + ## [0.9.2] - 2026-07-29 This is the Codewhale v0.9.2 source candidate. It is not a published release @@ -2952,64 +3040,6 @@ folds in several community contributions. (#3020). -## [0.8.57] - 2026-06-10 - -### Added - -- **Turns now survive system sleep.** When the host suspends mid-stream, the - connection used to die on wake with `Stream read error: error decoding - response body` and the turn was lost (#2990). The engine now stamps stream - progress with both monotonic and wall-clock time; a large divergence on a - stream error identifies a sleep/wake cycle, and the request is silently - re-issued (up to the existing 3-retry budget) instead of failing the turn. -- **One-command release prep.** `./scripts/release/prepare-release.sh X.Y.Z` - bumps the workspace version, every internal crate dependency pin, the npm - wrapper, and the README install-tag examples, refreshes `Cargo.lock`, - regenerates the embedded TUI changelog slice and web facts, and runs - `check-versions.sh` — the v0.8.56 release needed nine follow-up commits for - exactly these sync points. -- `.github/CODEOWNERS` and `.github/dependabot.yml` (weekly cargo + - github-actions updates, monthly npm for `web/`). - -### Changed - -- **The changelog went on a diet.** Root `CHANGELOG.md` now carries recent - releases (v0.8.40+); older entries moved to `docs/CHANGELOG_ARCHIVE.md`. - `crates/tui/CHANGELOG.md` — embedded into every binary for `/change` — is a - generated 15-release slice (`scripts/sync-changelog.sh`), no longer a - 357 KB manual byte-for-byte copy (~300 KB smaller binaries). -- GitHub Release bodies are generated from the tagged version's changelog - section (`scripts/release/generate-release-body.sh`) instead of a - hardcoded workflow blob with a hand-pasted contributor list. -- `check-versions.sh` now also gates `web/lib/facts.generated.ts` and the - README install-tag examples; the CNB mirror pipeline validates the pushed - tag against `Cargo.toml` before generating release notes. -- Docs reorganized: internal design notes moved under `docs/rfcs/`; stale - internal docs (old audits, handoffs, region-specific VM notes) removed. -- Agent-facing polish: the system prompt environment block reports - `codewhale_version` (was `deepseek_version`), the legacy - `.deepseek/instructions.md` path is no longer advertised in the prompt - (still honored for back-compat), and oversized instruction files are - truncated with an explicit `[…truncated: N bytes omitted]` marker instead - of a bare ellipsis. - -### Fixed - -- **Docker images build again.** The release `docker` job failed for v0.8.56 - because the Dockerfile still copied the pre-rebrand `deepseek` / - `deepseek-tui` binaries; they are now symlinks to the codewhale binaries - inside the image, so legacy container entrypoints keep working. -- `.devcontainer/devcontainer.json` used the pre-rebrand container name, - mount path, and `deepseek` remote user. -- Stale `--bin deepseek` examples, `DeepSeek-TUI` strings in `/change` - output, and pre-rebrand doc comments. - -### Removed - -- Unused dependencies: `tracing-appender` and `zeroize` (TUI crate), - `rustls` (release crate); the orphaned `vendor/schemaui-0.12.0` lockfile - leftover and a machine-specific one-off `scripts/verify_task.sh`. - --- 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 eba08b5b9..cbff1c842 100644 --- a/crates/tui/Cargo.toml +++ b/crates/tui/Cargo.toml @@ -23,16 +23,16 @@ path = "src/main.rs" [dependencies] ahash = "0.8" anyhow.workspace = true -codewhale-config = { path = "../config", version = "0.9.2" } -codewhale-execpolicy = { path = "../execpolicy", version = "0.9.2" } -codewhale-lane = { path = "../lane", version = "0.9.2" } -codewhale-paths = { path = "../paths", version = "0.9.2" } -codewhale-protocol = { path = "../protocol", version = "0.9.2" } -codewhale-release = { path = "../release", version = "0.9.2" } -codewhale-secrets = { path = "../secrets", version = "0.9.2" } -codewhale-tools = { path = "../tools", version = "0.9.2" } -codewhale-workflow = { path = "../workflow", version = "0.9.2" } -codewhale-workflow-js = { path = "../workflow-js", version = "0.9.2" } +codewhale-config = { path = "../config", version = "0.9.3" } +codewhale-execpolicy = { path = "../execpolicy", version = "0.9.3" } +codewhale-lane = { path = "../lane", version = "0.9.3" } +codewhale-paths = { path = "../paths", version = "0.9.3" } +codewhale-protocol = { path = "../protocol", version = "0.9.3" } +codewhale-release = { path = "../release", version = "0.9.3" } +codewhale-secrets = { path = "../secrets", version = "0.9.3" } +codewhale-tools = { path = "../tools", version = "0.9.3" } +codewhale-workflow = { path = "../workflow", version = "0.9.3" } +codewhale-workflow-js = { path = "../workflow-js", version = "0.9.3" } schemaui = { version = "0.12.0", default-features = false, optional = true } async-stream = "0.3.6" async-trait.workspace = true @@ -97,7 +97,7 @@ shell-words = "1.1.1" mimalloc.workspace = true [build-dependencies] -codewhale-build-support = { path = "../build-support", version = "0.9.2" } +codewhale-build-support = { path = "../build-support", version = "0.9.3" } [dev-dependencies] cucumber = "0.23.0" diff --git a/docs/public-surface-facts.json b/docs/public-surface-facts.json index 277b6eb1e..1b2a387a8 100644 --- a/docs/public-surface-facts.json +++ b/docs/public-surface-facts.json @@ -14,9 +14,9 @@ "sources": ["Cargo.toml", "LICENSE", "README.md", "npm/codewhale/package.json", "docs/FLEET.md"] }, "sourceCandidate": { - "version": "0.9.2", + "version": "0.9.3", "providerCount": 36, - "toolCount": 70, + "toolCount": 67, "sandboxBackends": [ "seatbelt (macOS, when available)", "bubblewrap (Linux, opt-in when installed)" diff --git a/npm/codewhale/package.json b/npm/codewhale/package.json index 0a47f9a10..e75ce713e 100644 --- a/npm/codewhale/package.json +++ b/npm/codewhale/package.json @@ -1,7 +1,7 @@ { "name": "codewhale", - "version": "0.9.2", - "codewhaleBinaryVersion": "0.9.2", + "version": "0.9.3", + "codewhaleBinaryVersion": "0.9.3", "description": "Terminal coding agent for supported hosted and local models. One runtime on your machine. Rust, MIT.", "author": "Hmbown", "license": "MIT", diff --git a/package-lock.json b/package-lock.json index 53d791cca..873fc5c4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1559,7 +1559,7 @@ } }, "npm/codewhale": { - "version": "0.9.2", + "version": "0.9.3", "funding": [ { "type": "github", diff --git a/scripts/remote-smoke/setup-vm.sh b/scripts/remote-smoke/setup-vm.sh index e8f05e2a4..c1429c55b 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.2}" +RELEASE_TAG="${RELEASE_TAG:-v0.9.3}" 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/lib/facts.generated.ts b/web/lib/facts.generated.ts index b4b129795..a51befddd 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-07-31T03:19:01.929Z", + "generatedAt": "2026-07-31T09:27:54.203Z", "sourceRevision": null, "sourceCommittedAt": null, - "version": "0.9.2", + "version": "0.9.3", "crates": [ "agent", "app-server", @@ -240,7 +240,7 @@ export const FACTS: RepoFacts = { ], "defaultModel": "deepseek-v4-pro", "nodeEngines": ">=18", - "toolCount": 70, + "toolCount": 67, "license": "MIT", "latestPublishedRelease": { "tag": "v0.9.2",