Commit Graph

1533 Commits

Author SHA1 Message Date
Paulo Aboim Pinto 2c256d7b3a fix(tui): close Windows job before foreground joins
(cherry picked from commit 96adffb243801dcef6c6332611728930e438f1a1)
2026-06-01 09:49:54 -07:00
Paulo Aboim Pinto 54a93994f6 test(tui): cover Windows job cleanup fallbacks
(cherry picked from commit f46eb7e6644acc20d0ad9be8f9a86e1733bc7b00)
2026-06-01 09:49:54 -07:00
Paulo Aboim Pinto 14ea0721a8 fix(tui): close Windows job before output joins
(cherry picked from commit 4db07a451682fb120c902d4254a11b532b24b82a)
2026-06-01 09:49:54 -07:00
implecao a09af2024a feat(web_search): enable parallel execution for read-only search tool
Override `supports_parallel()` to return `true` in `WebSearchTool`,
allowing the engine to batch multiple concurrent web_search calls
into a `FuturesUnordered` parallel group instead of serializing them.

The tool is already read-only, auto-approved, and non-interactive —
parallel-safe by all other criteria. This change removes the final
gate (`supports_parallel() -> false` default) so co-issued searches
run concurrently rather than one-at-a-time.

Closes the ~55s serial wall-clock for 3 simultaneous web searches
(now ~20s, the slowest individual call).

Co-authored-by: Cursor <cursoragent@cursor.com>
(cherry picked from commit a7dcf63c556268b53ff430747ae2e141e4cd4451)
2026-06-01 07:41:33 -07:00
cyq bc34cd13ea fix(tui): hold subagent cap until status reconciles
(cherry picked from commit 5f01dda291e8354e779cc9220f38754fe0c3786f)
2026-06-01 07:06:45 -07:00
Paulo Aboim Pinto 382635e4aa fix(tui): harden Windows job cleanup
(cherry picked from commit 3ab06d92ab7c74f43473af5ddf4ffdd31cfd5f3d)
2026-06-01 05:50:49 -07:00
Paulo Aboim Pinto cb4f660a20 fix(tui): contain Windows shell process trees
(cherry picked from commit 6cdea3288637267d282015fbdc1074da5d8a97db)
2026-06-01 05:50:49 -07:00
Hu Qiantao 49791905f9 feat(tools): add byte-level schema canonicalize for prefix-cache stability
When MCP servers return tool schemas, the field order within each schema
object and the order of entries in required / dependentRequired arrays
can vary across reconnections. This causes the serialized tool catalog
bytes to change even when the logical schema is unchanged, busting
DeepSeek's KV prefix cache.

Add schema_canonicalize::canonicalize_schema which recursively:
- Sorts every required array alphabetically
- Sorts every dependentRequired sub-array alphabetically
- Rebuilds object keys in alphabetical order
- Recurses into all nested objects and arrays

The canonicalize step runs after schema_sanitize in build_api_tools,
so each tool's input_schema is first cleaned then byte-stabilized.
The existing OnceLock api_cache pins the result, ensuring the tool
catalog bytes are identical across reads and across process restarts.

8 unit tests cover: required sorting, dependentRequired sorting,
equivalent-ordering byte match, recursive nesting, empty schemas,
deeply nested schemas, non-required array preservation, and key
ordering.

(cherry picked from commit 7cee9cd5e12a74e8072bf2f6a1b18555ed0db0bf)
2026-06-01 05:46:07 -07:00
Hunter B 69cff93754 docs(config): use exact path in permissions example 2026-06-01 05:43:45 -07:00
greyfreedom 3df018994f feat(config): load typed ask permissions file
(cherry picked from commit fb77cf1e0946a061376e5e9a8fc9422dddd98419)
2026-06-01 05:43:26 -07:00
Hunter B 18550339a5 test(state): cover same-second migration idempotency 2026-06-01 05:43:09 -07:00
cyq b76a11b99f fix(state): stabilize fork migration parent links
(cherry picked from commit cb22c7b70b1eaefd93fd6404dbfb08d6edd03a43)
2026-06-01 05:42:50 -07:00
Hunter B 492f20da4f chore(release): prepare v0.8.49 2026-06-01 02:42:45 -07:00
Hunter B 683ec0bef4 fix(pricing): keep adjusted DeepSeek V4-Pro rates 2026-06-01 02:38:45 -07:00
Hunter B dde865453e test: cover Kimi schema and ANSI normalization edge cases 2026-06-01 02:36:50 -07:00
Hanmiao Li 34a87e3fd3 fix: collapse nested ifs to satisfy clippy (#2480) 2026-06-01 02:34:32 -07:00
Hanmiao Li bea701c6a4 fix: normalize tool schemas for Kimi/Moonshot — push type into anyOf items (#2438) 2026-06-01 02:34:30 -07:00
Justin Gao c22b60c2b0 fix: hash only API-visible tool fields, not internal metadata
Addresses chatgpt-codex review: the previous full serde_json::to_string
included internal-only fields (allowed_callers, defer_loading,
input_examples, cache_control) that are never sent to the chat API.
This caused spurious drift detection when those fields changed.

- New tool_to_api_json() helper mirrors tool_to_chat() serialization:
  only type, name, description, parameters, strict
- Doc comment fixed: 'sorted by name' → 'sorted lexicographically
  by JSON text' (greptile review)
2026-06-01 02:34:26 -07:00
Justin Gao 37cfd97b5c refs(#2264): harden PrefixFingerprint with full tool JSON hash
Phase 1.5 — upgrade PrefixFingerprint::compute() to hash the full tool
JSON serialization (name + description + schema) instead of just tool
names. This catches schema/description drift in addition to name changes.

- Serialize each tool via serde_json::to_string, sort by name, join
- New test: fingerprint_detects_schema_change_not_just_name_change
- All 21 prefix_cache tests pass
- Aligned with prompt_zones.rs tool_catalog_digest approach
2026-06-01 02:34:26 -07:00
hqt d88b2c36ab test(shell): fix test on non posix shell 2026-06-01 02:34:23 -07:00
Hanmiao Li 87b5c78d8a fix: also strip ANSI in sidebar normalize_activity_text (#2481) 2026-06-01 02:34:23 -07:00
Hanmiao Li 599b5997d0 fix: strip ANSI sequences in footer tool status labels to prevent raw escape code leaks (#2481) 2026-06-01 02:34:23 -07:00
reidliu41 c1f74b3b2f fix(config): allow missing tui status items
Treat a missing tui.status_items field as None even when the [tui]
  table exists, preserving the documented default footer behavior.

  Add a regression test for configs that define [tui] without status_items.
2026-06-01 02:34:23 -07:00
Hunter B 0af80e262f fix: prevent double-registration of web/patch tools in agent mode
with_agent_tools() unconditionally registered web_search/fetch_url/web.run
(via with_web_tools) and apply_patch (via with_patch_tools), but tool_setup.rs
conditionally registered them again based on Feature::WebSearch and
Feature::ApplyPatch flags. This caused double registration (overwritten
with a warning log on the second insert).

Changes:
- Remove with_web_tools() and with_patch_tools() from with_agent_tools()
- Move finance tool out of with_web_tools() into its own with_finance_tool()
  (finance is market data, not web search — it should not be gated behind
  the web-search feature flag)
- Add with_finance_tool() to with_agent_tools() so finance stays always
  available
- Update tests: new test for with_finance_tool(), updated web_tools test
  to verify finance is no longer in the web group
2026-06-01 02:33:40 -07:00
Hunter B e9eea70445 release: v0.8.48 — liveness watchdog fix, Qwen 3.7 removal, provider/docs sync
- 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.
2026-05-31 21:45:31 -07:00
Hunter B 2bd77edc15 Fix provider model selection and stream completion 2026-05-31 21:15:40 -07:00
Hunter B 2b69f4e041 chore: polish codewhale home defaults 2026-05-31 19:22:12 -07:00
Justin Gao 89ab2a9c67 fix: add #[allow(dead_code)] to FrozenPrefix/PinnedPrefix impl blocks 2026-06-01 09:40:44 +08:00
Justin Gao dcfe34670c fix: suppress dead_code warnings for Phase 1 foundation types
All dead_code in prompt_zones.rs is intentional — these types are
scaffolding awaiting future integration. Pre-existing schema_migration
warnings remain as-is.
2026-06-01 09:34:03 +08:00
Justin Gao d897c2e5b8 refs(#2264): Phase 1 three-zone type foundation — no request-path enforcement yet
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
2026-06-01 09:26:33 +08:00
Hunter B 6f295e9961 docs: sync release credit surfaces 2026-05-31 17:43:46 -07:00
Hunter B a9a4213d39 fix(tui): make startup update checks configurable 2026-05-31 17:06:20 -07:00
Hunter B 746bf2aa4b fix(tui): keep composer scroll and alt motion in draft 2026-05-31 16:28:00 -07:00
Hunter B 42b2ed2e23 Resolve qwen3.7 OpenRouter shorthand 2026-05-31 15:58:17 -07:00
Hunter B e0a71c2ed0 Stop header whale after liveness recovery 2026-05-31 15:44:53 -07:00
Hunter B d6baf20721 Migrate file secrets to codewhale home 2026-05-31 15:30:35 -07:00
Hunter B b1ae0fa60e Fix model picker cancel behavior 2026-05-31 14:49:45 -07:00
Hunter Bown f09b4ae72f Fix TUI cancel busy animations
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"
2026-05-31 14:06:52 -07:00
Hunter B f72f609293 feat: make file mention completion tunable 2026-05-31 13:29:28 -07:00
Hunter Bown 6858c4e105 docs: credit v0.8.48 contributors (#2463) 2026-05-31 13:07:20 -07:00
Hunter Bown 7765f32cdd chore(release): prep v0.8.48 (#2462) 2026-05-31 11:35:45 -07:00
Hunter Bown 5a80556eb2 feat(models): add recent large OpenRouter models (#2461) 2026-05-31 11:26:25 -07:00
HUQIANTAO 9c336123ea test(core): add comprehensive unit tests for JobManager and helpers (#2440)
* test(core): add comprehensive unit tests for JobManager and helpers

Add 35 unit tests covering:
- JobManager lifecycle (enqueue, set_running, update_progress, complete, fail, cancel, pause, resume)
- Exponential backoff computation and saturation
- History truncation beyond MAX_JOB_HISTORY_ENTRIES
- Persisted detail encode/parse round-trip
- Job status string conversion round-trips
- Helper functions (truncate_preview, json_optional_string, parse_retry_metadata, parse_history_entry)
- Status mapping between runtime and persisted types
- Initial history preview generation

* style: fix cargo fmt formatting

* test(core): fix job manager test hygiene

---------

Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
2026-05-31 11:10:37 -07:00
HUQIANTAO 9bf14e9825 docs(state): add doc comments to all public types (#2452)
* 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>
2026-05-31 11:08:16 -07:00
Implementist 45787bcf70 fix(web_search): improve Volcengine reliability — 90 s timeout, retry, and faster model (#2439)
* 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>
2026-05-31 11:01:34 -07:00
HUQIANTAO 46134e5bb5 test(mcp): add comprehensive unit tests for MCP manager and helpers (#2441)
* test(mcp): add comprehensive unit tests for MCP manager and helpers

Add 36 unit tests covering:
- InMemoryMcpClient: tool/resource registration, listing, calling, error cases
- McpManager: start_all (ready/failed/cancelled), list_tools with filters, call_tool,
  call_qualified_tool, unregister, stop, list_resources, read_resource, sandbox state
- Tool filter: allow/deny semantics, deny-overrides-allow
- Helper functions: sanitize_component, qualify_tool_name, parse_qualified_tool_name,
  parse_server_from_uri
- JsonRpcError: code correctness, envelope formatting
- Serialization: McpServerConfig defaults, McpStartupStatus snake_case

* style: fix cargo fmt formatting

* fix(mcp): preserve truncated qualified tool calls

---------

Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
Co-authored-by: Hunter B <hmbown@gmail.com>
2026-05-31 11:01:20 -07:00
HUQIANTAO 6f785c4bab refactor(palette): remove unused backward-compat aliases and add module docs (#2445)
* 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>
2026-05-31 10:47:32 -07:00
HUQIANTAO 74a8a6f808 test(tui-core): add unit tests for UiState state machine (#2450)
Add 25 unit tests covering the previously untested UiState::reduce
state machine and snapshot:

- Default state verification
- Key navigation: pane switching (1-5), unknown key no-op
- Prompt lifecycle: pending_tasks increment, response delta tracking
- Tool lifecycle: active_tool set/clear, pending_tasks decrement, saturation
- Job lifecycle: active_jobs increment/decrement, progress clamping, saturation
- Approval lifecycle: pending_approvals increment/decrement, saturation
- Pause/Resume: flag toggling
- Tick: ScheduleBackgroundRefresh effect
- Snapshot: field presence, state change reflection

Co-authored-by: Hu Qiantao <huqiantao@HudeMacBook-Air.local>
2026-05-31 10:38:24 -07:00
BryonGo f7fbc35165 fix: use effective_model_for_budget instead of raw model in compactio… (#2437)
* 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>
2026-05-31 10:33:47 -07:00
HUQIANTAO 0302ace9d8 docs(protocol): add doc comments to all public types (#2458)
* 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>
2026-05-31 10:33:13 -07:00