Conversation
…loaded skills The <recommended_plugins> user-turn fragment fired on every turn for any conversation that merely mentioned a plugin's domain keywords, and it could not tell that a loaded local skill already covered the domain — a takeover session talking about handoffs was nudged to install the handoff plugin four times in one evening. A plugin id is now suggested at most once per engine lifetime, and a plugin whose name (or alias) matches a skill in the session's catalogue is never suggested. Dismissals still apply. The suppression snapshot is taken at engine construction from the same catalogue the system prompt indexes (workspace roots + configured skills dir + plugin-sourced skills); a skill installed mid-session is not suppressed until the next engine starts (known limitation, documented on the gate). Closes #6274 Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Every surface pinned the original MCP revision and the stdio client required an exact match, so current servers negotiating newer revisions could not connect. The server and both clients now advertise 2025-06-18 and negotiate over the supported set [2025-06-18, 2025-03-26, 2024-11-05]: the server echoes the client's revision when supported and answers with the latest otherwise, the stdio client accepts any supported revision, the main client validates the negotiated version against the set, and streamable HTTP sends the required MCP-Protocol-Version header on every post-initialize request. Verification (parallel lane receipt, this checkout): codewhale-mcp 79/79, codewhale-tui --lib mcp 425/425, cargo fmt --all -- --check clean; the existing 2024-11-05 and 2025-06-18 fixtures pass because both are in the accepted set. First half of #6280 (the 2026-07-28 rmcp layer follows). Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…t-plugin.py --bundle <package-dir> consumes a real dsh npm bundle end to end: reads package.json -> dsh.bundle.patch -> parses cordis.patch.yml with !!js tags captured (never evaluated), applies the patch list with applyEntryPatches parity (insert, group inserts, keyed overrides), lowers the three !!js idioms (process.execPath -> node, process.env.X || 'literal', template paths), snapshots stdio arg host directories into mcp/<server>, imports dsh-skill-filesystem rows as customSkillDirs skills, and routes everything unportable into CONVERSION.md as named diagnostics instead of dropping it. Verified against our own codewhale-cu-plugin/integrations/dsh reference bundle (previously could not round-trip): 1 MCP declaration prepared, mcp/computer-use/server.mjs snapshotted from the installed app, tool timeout and version carried over. All 46 converter tests pass, including 6 new bundle-mode tests (patch evaluation, !!js lowering, group inserts, skill import, non-execution guarantees). Signed-off-by: CodeWhale Bot <bot@codewhale.net>
An outstanding user-input prompt must not outlive the turn that asked it, whatever way that turn ends. Terminal and failed paths were already pinned (terminal_turn_cancels_pending_user_input_and_clears_snapshot, failed_turn_cancels_pending_user_input_and_clears_snapshot); this adds the interrupt twin: a TurnComplete carrying Interrupted settles the prompt with a terminal user_input.canceled event, the engine is told to cancel the outstanding request, and the thread snapshot's pending_user_inputs clears. Audit note for the remaining turn-death surfaces: the two `active_turn = None` sites at turn-start persistence failures run cleanup_unaccepted_turn_records before any engine turn exists, so no user-input registration can reference them; the terminal site pairs with settle_user_inputs_for_terminal_turn immediately before it; and the monitor-failure recovery path settles via its own receipt handling. No driven path leaks a pending prompt. Closes #6275 Signed-off-by: CodeWhale Bot <bot@codewhale.net>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
Claude finished @Hmbown's task in 2m 13s —— View job Review of PR #6284
SummaryScope note (most important finding): this PR's 4 commits bring in far more than the title/description say.
The described change (interrupted-turn test)Verified correct and consistent with its stated claim:
Other bundled commits (lighter pass, since out of stated scope)
No provider/model prefix-inference issues (EPIC #2608) were introduced by any of the four commits — none of this touches route/provider selection. No correctness bugs, unwrap/panic risks, or security issues found in the reviewed diff. |
Closes #6275
Pins the last unpinned turn-death surface for pending user inputs. Terminal and failed paths already had coverage; this adds the interrupt twin (
interrupted_turn_cancels_pending_user_input_and_clears_snapshot): aTurnCompletecarryingInterruptedsettles the outstanding prompt with a terminaluser_input.canceledevent, the engine is told to cancel, and the snapshot clears.Audit note (in the commit): the two turn-start
active_turn = Nonefailure sites run record cleanup before any engine turn exists (no registration can reference them); the terminal clear site pairs withsettle_user_inputs_for_terminal_turn; monitor-failure recovery settles via its receipt path. No driven path leaks a pending prompt.The live symptom that motivated the issue — install prompts sticking in a client UI — is the client-side card queue fed by
request_plugin_installmetadata (see #6274 for the source fix); the server-sidepending_user_inputsmap settles on every turn-death path this harness can drive.Verification:
cargo nextest run -p codewhale-tui --lib -j 5 -E 'test(interrupted_turn_cancels_pending_user_input)'→Summary: 1 test run: 1 passed(mirrors the existing terminal/failed twins).