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>
The release branch already ships the slim-prompt intent in a stronger
form than #3010 — compose_default_static_layers appends no personality
overlay at all (voice/tone guidance is folded into the constitution
preamble), where the PR only emptied the Calm arm. Carry over the PR's
regression test, which derives its assertion from calm.md itself so a
future re-inclusion of the overlay text fails loudly.
Harvested from PR #3010 by @894876246
Co-authored-by: Hanmiao Li <894876246@qq.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The release branch independently evolved the sessions API from #2808
(POST /v1/sessions creates from a thread, /v1/sessions/{id}/resume-thread
resumes), but the turn-rewind and snapshot-restore endpoints never
landed. Port them onto the current thread model:
- POST /v1/threads/{id}/undo — fork at the Nth-from-last user message
and return the dropped user text for input pre-population.
- POST /v1/threads/{id}/patch-undo — restore the newest differing
tool:/pre-turn: workspace snapshot (same target selection as the
TUI's patch_undo), then fork the conversation; reports the file
rollback result alongside the forked thread.
- POST /v1/threads/{id}/retry — fork and immediately start a turn
re-using the dropped user text (or an override prompt), adapted to
the extended StartTurnRequest (dynamic_tools, environment_id).
- POST /v1/snapshots/{id}/restore — restore a workspace snapshot by id.
fork_at_user_message and its tests were already present; this adds the
HTTP surface plus endpoint tests for undo/patch-undo/retry/restore.
Harvested from PR #2808 by @bengao168
Co-authored-by: Ben Gao <bengao168@msn.com>
Co-authored-by: Hunter Bown <hmbown@gmail.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Port /voice, /voice-send, and /voice-control into the command strategy
registry as groups/core/voice.rs. The handlers only flip App state
(voice_enabled, voice_send_enabled, voice_control_enabled) and emit the
new AppAction::VoiceCapture; the UI event loop performs the actual
record + transcribe cycle so credentials come from the live Config
(deepseek_api_key/deepseek_base_url) instead of auth fields cached on
App, and no audio is ever recorded by the registry smoke tests.
- voice.toggle hotbar action dispatches the real /voice command and
reports voice_enabled as its active state, replacing the placeholder.
- Recording uses sox/rec/arecord with RMS-based silence detection;
transcription posts input_audio blocks to the provider chat
completions API (async reqwest — the blocking client would panic
inside the tokio event loop).
- Transcripts insert at the composer cursor via App::insert_str. With
/voice-send enabled, a transcript ending in "send it" / 发送 strips
the suffix and submits; a bare "send it" submits the current composer
content. With /voice-control enabled, transcription runs through the
AI dictation pipeline that sees the composer text.
- Failures (no recorder, no API key, short recording, network) surface
as localized status messages and disarm voice input.
- Localized command help and status strings for all seven shipped
locales; /voice now appears in the command palette.
Harvested from PR #3051 by @huqiantao
Co-authored-by: huqiantao <huqiantao@users.noreply.github.com>
Co-authored-by: Hunter B <hmbown@gmail.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>