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
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.
The prompt queue already serializes follow-up loops, so canceling the
in-flight loop on every new prompt breaks the queue contract (see
session-prompt-queue.test.ts). Keep only Suggestion.dismissAll so a
previous loop blocked on a suggestion can settle.
* fix(cli): continue queued follow-up prompts
* test(cli): stabilize local model persistence test
* fix(cli): preserve queued prompt order
* fix(cli): persist queued prompts before processing
* chore(cli): clarify prompt queue settling
* fix(cli): preserve queued prompt history order
* fix(cli): clear queue state on release and test abort
The switch(model.prompt) block in SystemPrompt.provider() was
accidentally dropped during merge conflict resolution in fa2c979ac.
This meant the prompt property set by the Kilo gateway (e.g. codex,
anthropic, beast) was stored on the model but never read, causing all
Kilo-routed models to fall back to model.api.id string matching.
* fix(cli): remap child session references on fork to prevent subagent state leaks
When forking a session, task tool parts referencing child sessions were
copied verbatim, causing both original and forked sessions to share the
same subagent references. This led to SSE events and permission prompts
leaking across sessions in the Agent Manager.
* fix: remove redundant recursive remapChildren call
Session.fork() already calls remapChildren via the hook, so the explicit
recursive call inside remapChildren was double-forking nested descendants.
Update DiffVirtualApp and PermissionDiff to reconstruct before/after
content from the patch field when explicit before/after values are not
provided. Export the `text` helper from kilo-ui session-diff and add
`patch` to the PermissionFileDiff type.
In message-v2, refine stripMessageMetadata to only strip oversized
patches (exceeding MAX_DIFF_SIZE) rather than all patches, preserving
small patches so the UI can render inline diffs without additional
fetches.
Replace before/after content fields with unified patch field across
the diff pipeline. WorktreeDiff now generates patch strings via
createTwoFilesPatch, and all consumers (summary stripping, size
checks, content hashing, TUI sync, ingest queue) operate on the
patch field instead of before/after.
Consolidate model variant into the model object, removing the
separate variant field from MessageV2.User, PlanFollowup inject,
and resolveCodeModel interfaces.
Additional changes:
- Add session-diff module export to kilo-ui package
- Remove batch tool (batch.ts deleted)
- Fix WebSocket proxy to convert Uint8Array to ArrayBuffer
- Switch VscodeSessionTurn from useDiffComponent to useFileComponent
- Update SnapshotFileDiff type references in vscode extension