Route ChangesCardView.Header's open-in-diff button through the shared HeaderOpenAction, matching the edit/patch and task cards, so the toolbarButton + hoverPlaceholder wiring lives in one place. Add the new sub-agent bundle keys (openSubagent, subagent.title, subagent.path) to all locale files.
The open-action anchor lived in the header fill slot, a fitHorizontal stack that clips trailing children to zero width. A long summary could starve the anchor so the hover open control failed to appear. Move the summary and anchor into the non-fit left group like the edit/patch cards, so the anchor always reserves its width right after the text.
Streaming child tools no longer pack the whole IDE window. The task popup is now a fixed, bounded box: a 60-char floor width, the shared height cap, and both scrollbars, so live child updates scroll inside the balloon instead of resizing it. HeaderPopupBody gains opt-in minWidth/fixedHeight/horizontal params; snapshot popups keep their content-sized behavior.
Removes packages/opencode/.kilo/tui.json, an empty {} file that was
accidentally committed by a broad 'git add' while running the httpapi
exerciser (PATCH /tui/config) from packages/opencode/ during work on
PR #13271 (feat(cli): add experimental MCP Apps support with
resource/tool HTTP endpoints).
Also ignores per-directory tui.json/tui.jsonc runtime config files
under packages/*/.kilo/ so this can't recur.
Collapsed task cards now show the same hover popup as the edit/patch and changes cards. Instead of rebuilding a static snapshot, the popup reparents the live TaskBodyScroll the in-place expanded card uses, so streaming child tools keep updating inside the popup. The popup's disposable detaches the shared body on hide (unless the card reclaimed it by expanding) without disposing it, so it stays reusable across expand/collapse.
Append the open action to the flexible header slot so it sits right after the task summary like the edit/patch card, instead of pinned to the far-right header group.
The sub-agent open control used a persistent header HoverIcon that never reliably opened the editor tab. Switch it to the same hover-overlay open-in-editor affordance the edit/patch and modified-files cards already use (SessionCopyTarget + open-diff icon), and extract that button+anchor wiring into a shared HeaderOpenAction so the three cards no longer duplicate it.
Call ensureSubagentSessionEditorKind() before opening the sub-agent VFS file so the first click reliably creates the virtual file, matching the diff and attachment open sites. Also cap SubagentTitleCache with an access-order LRU so high-churn child session ids do not accumulate for the IDE lifetime.
Show unsupported workspace directories (Dev Container / WSL / invalid
virtual path) through the standard in-session connection banner instead
of a stuck "Loading…" state. The banner includes the workspace path and
two clear, localized options: reopen in the container/WSL via JetBrains
Gateway, or open from the local filesystem. Expanded error details now
fit the full text, capped to the available transcript height.
Remove the dev-only kilo.dev.forceUnsupportedWorkspace override used to
reproduce the state during development.