Replace the state.cancel-based mid-turn injection with a break-after-stream
queue. When a new prompt arrives while the assistant is streaming, the current
LLM step now finishes cleanly, any pending suggest/question tool auto-dismisses
via Suggestion.dismissAll and the new Question.dismissAll, and runLoop breaks
out before the next LLM step via KiloSessionPromptQueue.hasFollowup. Queued
prompts still run in order, each getting a full turn unless a newer one
arrives during it.
When the plan agent pauses for the follow-up question, CLI users had no
way to send a free-text reply: the main prompt input is hidden while a
blocking question is active, and the "Type your own answer" row was
being forced off to avoid duplicating the VS Code prompt input. CLI now
shows the custom-answer row again, while VS Code keeps it hidden.
The prompt queue's scope() hid the user message injected by
PlanFollowup.inject() because its ID was newer than the queue target,
so the loop saw the same plan_exit messages and re-asked the question
in an infinite cycle. Retarget the queue after inject so the new
message is visible on the next iteration.
Restore custom: false on the plan follow-up question — the "Type your own answer" row was redundant because the main prompt already routes typed text as a question reply. Auto-submit single-question single-select option picks in the VS Code QuestionDock so the button behaves like the TUI instead of silently waiting for a second Submit click.
Add optional `labelKey`/`descriptionKey` to Question.Option and `questionKey`/`headerKey` to Question.Info, annotated with `kilocode_change` markers. Populate these keys from the plan follow-up so the "Ready to implement?" question, "Start new session", and "Continue here" buttons render in the sidebar language while the canonical English labels remain on the reply wire (unchanged server-side matching).
* fix: persist custom provider model and variant deletions
The CLI config.update endpoint deep-merges its payload with existing
global config, so removing a model or reasoning variant from a custom
provider in the UI had no effect on disk. Save payloads now emit null
sentinels for removed IDs, and the Provider schema accepts nullable
record values so stripNulls can delete them during the merge.
Closes#9186
* chore: update kilo-vscode visual regression baselines
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Restore custom: false on the plan follow-up question — the "Type your own answer" row was redundant because the main prompt already routes typed text as a question reply. Auto-submit single-question single-select option picks in the VS Code QuestionDock so the button behaves like the TUI instead of silently waiting for a second Submit click.
Lock in that a session with an open suggestion reports as idle (so reopening VS Code or switching worktrees does not show it stuck/running), that accepting flips it back to busy without an idle flash, and that a dismissed suggestion leaves it idle for the run loop to resume cleanly.
Move worktree-scoped gitdir construction, ACP guard logic, and diff
caching directly into the core snapshot service, eliminating the
separate kilocode/snapshot module. This reduces indirection and keeps
all snapshot concerns co-located in a single file.
If deriveAndSyncStatus hangs, the per-session promise chain would never
drain and map entries would accumulate. Wrap the derive with a 3s timeout
so stuck work fails fast, is logged, and the existing cleanup runs.
The suggest tool blocks on a promise that only resolves when the user accepts or dismisses a suggestion. While blocked, the runner stayed in Running state and the session status remained busy — if the suggestion was never answered (e.g. VS Code was closed), the session was stuck forever and follow-up prompts appeared queued.
Mark the session idle while awaiting the user's response; the loop will set it back to busy when the suggestion resolves and processing continues.
Fixes#9150
Replace raw async/Promise-based test helpers with Effect-based
equivalents to align with the upstream BashTool API changes. Introduce
a ManagedRuntime composed of CrossSpawnSpawner, AppFileSystem, Plugin,
Truncate, and Agent layers. Update metadata, ask, and execute call
sites to return Effect values instead of plain promises.
Add experimental workspace adaptor list and status endpoints to the
OpenAPI spec. Add --sanitize flag to CLI export command for redacting
sensitive data. Update SDK types to reorder session status types before
suggestion types. Remove deprecated /global/sync-event endpoint.
Includes formatting fixes across i18n files, opencode source, and
tests, plus a warpgrep import path correction.
* docs(cli): note cloud schema mirror when adding kilocode_change config keys
Points devs to apps/web/src/app/config.json/extras.ts in the cloud repo
so new Kilo-only config keys get recognised by $schema references.
Closes#9115
* docs: add CLI config schema page and AGENTS.md mirror rule
Short page under Contributing → Architecture explaining how the cloud
overlays Kilo extras on top of the upstream opencode JSON Schema, with
the step-by-step for adding a new Kilo-only config key. AGENTS.md gains
a one-liner in the Fork Merge Process section pointing to it.
* fix(vscode): restore sidebar diff viewer parity with Agent Manager
The sidebar diff viewer bundle was missing agent-manager-review.css, so
FullScreenDiffView rendered with a broken file tree (no flex layout, no
revert styles) since PR #7455. Co-locate the CSS imports with the
component so every consumer gets them automatically, and wire per-file
revert end-to-end via a shared WorktreeDiffClient used by both the
sidebar provider and the Agent Manager controller.
* fix(cli): skip flaky shell-completion test on Windows CI
The 'shell completion resumes queued loop callers' test relies on shell
process spawn timing that is unreliable on Windows CI and times out at
3s. Every other shell-process test in this file already uses the
existing `unix(...)` helper for the same reason — align this test
with that pattern.