mirror of
https://github.com/cline/cline.git
synced 2026-09-21 13:21:23 +08:00
* fix(vscode): enforce stop-before-start ordering for same-id session restarts The app reuses the taskId as the sessionId whenever it replaces or resumes a session (mode/MCP rebuilds, follow-up resume, history restore), but the old session's stop ran fire-and-forget, and core cleanup is keyed by sessionId across multiple awaits. A stop still in flight when the same-id replacement started could tear down the live successor: late sessions-map deletes, a late 'ended' emission, or a stalled status write landing on the replacement. Adopt the sequencing invariant the CLI has always used: never start a same-id session while its stop is in flight. SdkSessionLifecycle tracks in-flight stops in a pendingStops map keyed by sessionId, and startNewSession awaits the pending stop for a reused id before starting (with a log line so a wedged stop is diagnosable). Fresh-id starts never wait. fireAndForgetSend additionally captures the ActiveSession by object identity at send time so a send settling after a same-id replacement cannot flip the successor's run state. * fix(vscode): auto-continue the task when switching from plan to act In plan mode, the model's switch_to_act_mode tool call flipped the toggle but ended the run as aborted: the beforeModel stop hook fired after turn-started, leaving a dangling api_req_started spinner rendered as 'API Request Cancelled', and nothing continued the task after the act-mode rebuild. Manually toggling after a presented plan had the same dead end. The tool now declares lifecycle.completesRun so the run ends cleanly after the tool result, and the queued mode change rebuilds the session and auto-continues with a hidden continuation prompt. A manual plan to act toggle auto-continues only when the agent is idle after presenting its plan (not running and awaiting_followup; a pending ask_question blocks mid-run so it cannot false-positive). Composer content rides along: typed text becomes the continuation, attachments are forwarded and echoed, attachment-only toggles count as consumed. The RPC reports consumption only after the send was actually handed to the session, and the webview then clears only the exact submitted content, so failures and racing input never lose composer state. Failures before the send undo the optimistic running flip, report an error phase, and roll the mode back when the session was never replaced. Hidden prompts (the act continuation and the pre-existing task resumption prompt) shifted editMessageAndRegenerate's visible-to-SDK user message ordinal mapping; the new sdk-user-message-mapping module skips them in their persisted user_input-wrapped shape, counts attachment-only messages (which have visible bubbles), ignores tool-result rows, and attachment-only resumes now echo a bubble to keep both transcripts aligned. Follow-ups sent during a rebuild wait on waitForPendingRebuild instead of resuming a parallel session that the rebuild would kill. The plan-mode system prompt and tool description require explicit user approval in a message sent after the plan was presented, preventing the model from self-escalating to act mode. * fix(vscode): move the turn phase to error when a task resume fails askResponse optimistically sets the turn phase to streaming before delegating to the followup coordinator, but the coordinator's resume catch only posted an error row, leaving the footer stuck on Thinking/Cancel. Resume failures (auth errors, session start errors) now report back via onResumeFailed so the controller can set the phase to error.