A fleet worker IS a headless `codewhale exec` run — not a separate execution
engine. New crates/tui/src/fleet/executor.rs provides the bridge:
- build_worker_exec_command: FleetTaskSpec + FleetExecConfig ->
`codewhale exec --auto --output-format stream-json [--model/--allowed-tools/
--disallowed-tools/--max-turns/--append-system-prompt] <prompt>`. Secrets are
never on argv (worker resolves its own config/keyring).
- map_exec_stream_line: maps the worker's stream-json events
({"type":"tool_use"|"content"|"tool_result"|"done"|"error"}) into
FleetWorkerEventPayload so the durable ledger persists the worker's OWN event
vocabulary (collapses the translation layer toward identity).
- classify_worker_exit: process exit -> terminal Completed/Failed/Cancelled.
This is the substrate for replacing the local simulation with real headless
workers. fleet_task_prompt is now pub(crate). 7 new unit tests; building blocks
only (no behavior change yet) so the 58 existing fleet tests stay green.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Refs #3163.
Adds the @codewhale/runtime-sdk workspace with typed fleet Runtime API helpers, protocol-shaped TypeScript declarations, JSON/SSE event fixture handling, and typed RuntimeCapabilityError failures for create/event-stream endpoints that the Rust API has not exposed yet.
Documents the SDK contract in docs/RUNTIME_API.md and wires npm workspace verification through npm test --workspace @codewhale/runtime-sdk.
Refs #1310.
Adds the direct minimax provider slot, auth/config/env bindings, model aliases, docs, and picker/status surfaces. MiniMax requests now set reasoning_split and preserve reasoning_details history so thinking stays out of answer text.
Also updates Moonshot/Kimi reasoning classification for the Kimi Code route so reasoning_content streams into Thinking cells instead of inline prose.
Removing Paste from the sidebar menu (#3065) left rows with no copy
path at all — sidebar text can't be mouse-selected. Right-clicking a
sidebar row now offers Copy, which writes the row's untruncated text
plus its hover detail to the clipboard via a new
ContextMenuAction::CopyText. Run stays first for clickable rows.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Work panel: hovering the '+N more checklist items' overflow row now
reveals the omitted checklist items in the popover, so a
height-constrained panel no longer hides work items with no way to
inspect them (#3063).
- Agents panel: the compact agent label row's hover text now carries a
full dossier — id, role, status, elapsed time, step count, objective
(new SidebarAgentRow field, from SubAgentAssignment), branch, and
untruncated progress. Compact rows stay unchanged.
- Detail-row hover keeps the full progress text instead of the
summarized form.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The loading mouse filter (should_drop_loading_mouse_motion) dropped all
Drag events while app.is_loading unless a transcript selection or
scrollbar drag was active. A sidebar resize started on the handle
(Down passes the filter) then never received its Drag events, leaving
the resize wedged mid-gesture during live runs (#3063, symptom of the
#3096 subagent-runtime pressure on the TUI).
- Allow Drag events through the loading filter while
app.sidebar_resizing is set.
- Clear last_sidebar_area / last_sidebar_handle_area and any in-flight
resize when the sidebar is hidden or doesn't fit, so stale handle
hit-areas can't capture clicks.
- Tests: resize down/drag/up while loading, mouse-up outside the
handle still ends the resize.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cargo clippy --workspace -D warnings fails on three pre-existing spots
newly flagged by the current toolchain: unnecessary_sort_by in
context_report, question_mark in the provider fallback chain, and
unnecessary_map_or in the empty-state widget check. Apply the
mechanical fixes clippy suggests; no behavior change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>