mirror of
https://github.com/Hmbown/DeepSeek-TUI.git
synced 2026-09-03 06:50:13 +08:00
chore(release): prepare v0.9.3
Bump the Rust workspace, internal dependency pins, npm wrapper, lockfiles, public candidate facts, remote smoke default, generated site facts, and packaged changelog together.\n\nAdd dated release notes for DeepSeek V4 Flash Responses support, the canonical action cutover, safety and durability hardening, and contributor credit. Public published-release facts remain pinned to v0.9.2 until v0.9.3 assets actually exist.
This commit is contained in:
91
CHANGELOG.md
91
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
|
||||
|
||||
38
Cargo.lock
generated
38
Cargo.lock
generated
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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).
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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",
|
||||
|
||||
2
package-lock.json
generated
2
package-lock.json
generated
@@ -1559,7 +1559,7 @@
|
||||
}
|
||||
},
|
||||
"npm/codewhale": {
|
||||
"version": "0.9.2",
|
||||
"version": "0.9.3",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user