v0.8.48 removed the Qwen 3.7 Max preset (it's a hosted model, not open-weight).
Two references remained in config.example.toml:
- Default Models comment (line 41)
- OpenRouter provider section comment (line 280)
These stale references could confuse users into trying a removed model.
- Fix false 'Turn stalled' during long active turns with running tools.
Add turn_last_activity_at tracking and active-tool awareness to
reconcile_turn_liveness(). Three new tests cover the fix.
- Remove Qwen 3.7 Max OpenRouter preset from registry, picker, docs,
and tests. Qwen 3.7 Max is a hosted model; the preset will return
when an open-weight Qwen 3.7 release ships. MiniMax M3 remains as
a full 1M-context multimodal route.
- Sync root CHANGELOG to crates/tui/CHANGELOG for crates.io packaging.
Update docs/CONFIGURATION.md, docs/PROVIDERS.md, and README to
reflect the Qwen 3.7 removal. Regenerate web facts timestamp.
All dead_code in prompt_zones.rs is intentional — these types are
scaffolding awaiting future integration. Pre-existing schema_migration
warnings remain as-is.
Narrower slice per Hmbown's review: typed zone structs as foundation
without wiring into the request path. Future phases will integrate
AppendLog/TurnScratch/ThreeZoneRequest into turn_loop.
- prompt_zones.rs (663 lines, 16 tests): PinnedPrefix / FrozenPrefix /
PrefixDrift (ready), AppendLog / TurnScratch / ThreeZoneRequest
(scaffolding, #[allow(dead_code)])
- FrozenPrefix: full tool JSON hash (name+desc+schema), raw-text
fast-path in verify(), cache_control preserved in build_messages()
- /cache zones subcommand with three-zone status display
- merge_compaction_summary: zone affiliation doc comment
- No turn_loop/session changes — engine continues using
PrefixStabilityManager / MessageRequest as before
Clear stale busy state and retry/title animations on local cancel.\n\nLocal verification:\n- cargo test -p codewhale-tui\n- codewhale doctor\n- codewhale --provider deepseek --model deepseek-v4-pro exec "Reply with exactly: OK"
* docs(state): add doc comments to all public types
* docs(execpolicy): add doc comments to all public types
* test(web): add unit tests for pure helper functions
Add vitest configuration and tests for:
- relativeTime: time formatting (just now, minutes, hours, days, months, years)
- lastPageFromLink: GitHub Link header pagination parsing
These are the first tests for the web frontend. The test framework
(vitest) was already in package.json but had no config or test files.
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
* fix(web_search): add timeout floor and retry for Volcengine provider
Volcengine's Responses API pipeline (web search + model inference +
JSON generation) can exceed the default 15 s timeout on complex
queries, causing ~50% of requests to fail with transport errors.
Changes:
- Enforce a 60 s minimum timeout for the Volcengine provider
- Separate connect_timeout (15 s) from total request timeout
- Retry transient transport errors up to 3 times (1 s / 2 s backoff)
- Add TCP keepalive, HTTP/2 keepalive, and User-Agent headers
matching the patterns used in client.rs
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: raise Volcengine timeout floor to 90 s
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix: correct stale comment — floor is 90 s, not 60 s
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(web_search): tighten Volcengine retry semantics
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Hunter B <hmbown@gmail.com>
* ci: add clippy and docs checks to PR CI workflow
- Add 'cargo clippy --workspace --all-features --locked -- -D warnings' step
to the lint job (previously only ran in release.yml)
- Enable docs job on all triggers (push/PR), not just weekly schedule
to catch broken doc links before merge
- Add clippy component to rust-toolchain setup
* ci: revert docs job to schedule-only (pre-existing broken links in tui crate)
* ci: install Linux deps before clippy
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
Add a dedicated GitHub Actions workflow for the Next.js web frontend
that runs on changes to the web/ directory:
- ESLint checks via 'npm run lint'
- TypeScript type checking via 'tsc --noEmit'
- Runs on push to main and PRs targeting main
- Uses npm cache for faster dependency installation
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
* refactor(palette): remove unused backward-compat aliases and add module docs
- Remove DEEPSEEK_AQUA_RGB, DEEPSEEK_NAVY_RGB, DEEPSEEK_AQUA, DEEPSEEK_NAVY
(unused backward-compatible aliases with no references in production code)
- Add module-level doc comment explaining the three-layer palette organization:
RGB tuples, semantic Color constants, and backward-compat aliases
- Note that some constants are kept for design-system completeness
* fix: remove deprecated color audit test (DEEPSEEK_AQUA no longer exists)
* fix: remove unused import in palette_audit test
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
* fix: use effective_model_for_budget instead of raw model in compaction_config
When model is set to 'auto', self.model holds the literal string 'auto',
which gets passed to the API as the model name in compaction requests.
DeepSeek's API rejects 'auto' with HTTP 400 since it's not a recognized
model ID.
effective_model_for_budget() resolves 'auto' to the last effective model
or falls back to DEFAULT_TEXT_MODEL, ensuring compaction always sends a
concrete model name.
* test(tui): cover auto model compaction config
---------
Co-authored-by: codgo <anbiaoren@gie777.com>
Co-authored-by: Hunter B <hmbown@gmail.com>
* docs(secrets): add doc comments to all public types
* docs(protocol): add doc comments to all public types
* style(protocol): run rustfmt on docs
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
* docs(hooks): add doc comments to all public types
* docs(hooks): clarify sink error handling
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
Add doc comments to all public types in the tui-core crate:
- Pane enum and all 6 variants
- UiEvent enum and all 13 variants
- UiEffect enum and all 4 variants
- UiState struct and all 8 fields
- UiState::reduce and UiState::snapshot methods
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
* test(web): add unit tests for pure helper functions
Add vitest configuration and tests for:
- relativeTime: time formatting (just now, minutes, hours, days, months, years)
- lastPageFromLink: GitHub Link header pagination parsing
These are the first tests for the web frontend. The test framework
(vitest) was already in package.json but had no config or test files.
* test(web): exercise real GitHub helpers
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
* refactor(tools): replace manual Display impl with thiserror derive
Replace the hand-rolled Display implementation for ToolError with
thiserror derive macros. The thiserror crate is already a workspace
dependency. Error messages remain identical (verified by existing
test tool_error_display_matches_legacy_text).
This reduces boilerplate and ensures consistency with other error
types in the codebase (secrets, state crates already use thiserror).
* chore: add thiserror to Cargo.lock
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
* docs(core): add doc comments to all public types
Add doc comments to all public types in the core crate:
- InitialHistory enum and variants
- NewThread struct and fields
- JobStatus enum and variants
- JobRetryMetadata struct and fields
- JobHistoryEntry struct and fields
- JobRecord struct and fields
- JobManager struct
- ThreadManager struct
- Runtime struct
* docs(core): add doc comments to all public types
---------
Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>