* feat(agent-manager): allow sessions to move their worktree between sections or ungroup
Add a new to the tool so a session can
reassign its own worktree to another section or ungroup it by passing
. The move operation validates the target section and
the session's worktree, then pushes refreshed state to the panel.
Also tighten the model-facing contract so the list-to-move workflow is
unambiguous: is required first, its result is the
source of truth for section and session IDs, and direct edits to
are rejected by , , and
with an explicit pointer to the tool.
- New / in the Agent Manager protocol
- New domain function with section/session validation
- New OpenAPI hook so stays
nullable in the generated SDK
- Tool schema descriptions now spell out the list-first workflow and
the no-direct-edit rule
- List output now includes an instruction block and is pretty-printed
- Optional nullable Task fields tolerate from models
- Focused CLI tests, bridge unit test, and protection test
* chore: remove local PR screenshot
* style(vscode): format agent manager orchestration
* fix(agent-manager): protect state paths on Windows
* fix(vscode): recover Agent Manager terminal with one input after exit
When an embedded Agent Manager terminal ends, the next typed input now
starts a fresh shell in the same tab and delivers that input exactly once
instead of requiring a second keystroke. The original scrollback remains
visible above a neutral divider so the ended shell is clearly separated
from the replacement.
- TerminalManager owns a logical terminal ID with a mutable PTY ID and
exposes a deduplicated restart method that returns the fresh wsUrl.
- TerminalRouter posts one restarted message back to the webview.
- TerminalTab buffers input while the replacement attaches and flushes
it only after replacement shell output settles, with a one-second
fallback for silent shells.
- Restartable terminals show a distinct ended marker that advertises
both typing and closing; Run/Setup terminals keep the original
close-only text.
- Localized the new marker in all Agent Manager locales.
- Replaces the previous dispose-on-webview-reload behavior with a
reconciliation pass so a fresh webview does not orphan running PTYs.
Verified end-to-end in an isolated VS Code instance: two consecutive
exit-then-one-input cycles both execute the original input without
requiring a second keystroke, and pwd confirms the replacement shell
starts in the original worktree cwd.
* fix(vscode): avoid duplicate prompt after terminal recovery
* fix(vscode): keep skill paths and urls contained at narrow panel widths
Folder path and URL rows in the Skills settings subtab used min-content width
on their value cells and a fixed-width input wrapper, so long paths and URLs
expanded the row past the panel at narrow widths, clipping the value and pushing
the remove (×) button off-screen.
Give the value cell flex:1 + min-width:0 with text-overflow ellipsis (mirroring
the working discovered-skills rows above) so it shrinks instead of overflowing,
and add min-width:0 to the input+Add wrapper so the TextField can shrink below
its intrinsic input width. Add a Playwright regression test that asserts no
horizontal overflow and a fully-visible × button at a 320px viewport.
* fix(vscode): expose full skill paths and urls via accessible tooltip
The previous responsive fix truncated long path and URL values to ellipsis
with a native title attribute. The native title is not consistently
reachable across keyboard and screen reader interactions, and stacking
it on top of an accessible tooltip would produce duplicate prompts.
Wrap each value cell in the kilo-ui Tooltip (Kobalte-backed, ARIA-compliant)
so the full value is exposed on hover and keyboard focus, and drop the
native title. Add a settings.css class so the Tooltip trigger grows in
the row flex layout and the inner span keeps its single-line ellipsis.
Extend the regression test to assert the trigger wraps each value and
that focusing the trigger surfaces the full value through the kilo-ui
tooltip content, keeping the overflow and × button assertions intact.
* Update packages/kilo-vscode/webview-ui/src/stories/settings.stories.tsx
Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
* Update packages/kilo-vscode/tests/skills-settings-responsive.spec.ts
Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
* test(vscode): use hover to assert skills tooltip and cover both cards
* chore: update kilo-vscode visual regression baselines
* test(vscode): assert trigger focusability and label card in Add assertions
* fix(vscode): make skill tooltip triggers keyboard-focusable via tabindex prop
* fix(vscode): drop keyboard-focus assertion; full path is already in DOM
* Update .changeset/vscode-skills-settings-narrow-overflow.md
Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
---------
Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
* fix(vscode): prevent prompt toolbar height growth when training indicator is visible
The prompt training icon (book-open-check) rendered at 16px inside compact
toolbar buttons caused the model selector button to grow taller than sibling
buttons. Constrain the icon to 14px so the toolbar row stays at a consistent
height regardless of whether the active model has mayTrainOnYourPrompts set.
Add 420px and 200px screenshot stories covering the training indicator so
visual regression catches future regressions.
* chore: update kilo-vscode visual regression baselines
---------
Co-authored-by: kilo-maintainer[bot] <kilo-maintainer[bot]@users.noreply.github.com>
The Markdown renderer began wrapping rendered blocks in div[data-markdown-block]
containers with display: contents, which collapsed the annotation layer's
bounding-box lookups and broke list/table special-case comment handling.
Flatten renderer-owned block wrappers to their actual rendered children while
preserving legacy top-level Markdown DOM and filtering inserted annotation
elements.
Regression introduced in PR #12460 (a776bd4d29, refactor: kilo compat for v1.17.9).
Add a Retry-state reflow test (isBusy() == true but not SessionState.Busy):
it must keep restarting the settle window toward the idle budget rather than
collapsing to REFLOW_PASSES. This is the only case that distinguishes
`is SessionState.Busy` from the old `isBusy()` predicate — verified it fails
(7 passes) if the gate is reverted to isBusy().
isBusy() is true for awaiting-permission/question, retry, and offline —
states recoverPending() can seed right after history load, where no deltas
arrive and a moving height genuinely means the panes are still settling.
Gating the settle-window shortcut on those states cut the reflow chain to
REFLOW_PASSES and reintroduced the crop-until-resize bug on exactly that
path. Gate only on SessionState.Busy (the streaming state) so the runaway
fix stays while blocked/retry/offline sessions keep their full settle window.
Add a Busy-state test that fails if the term is dropped or inverted.
invalidateCacheAndRepaint is UI-scoped, so firing it from the expansion
listener on every row made expand/collapse-all O(rows^2) to re-measure on
large branch diffs. Suppress the listener during bulk toggles and invalidate
once at the end, and register it after the initial expandAll. Per-row user
toggles still invalidate immediately.
Only treat a moving preferred height as an unsettled layout while the session
is idle. During streaming the height just tracks incoming content, so the
chain now counts its passes down instead of restarting the settle window,
settling in REFLOW_PASSES and handing off to the per-turn forgetTurn path
rather than risking a narrow crop-until-resize when the hard budget trips
mid-stream. Keep the budget as the idle backstop and cover it with a test
that drives an ever-growing child so the chain would spin without the cap.
A folder row hides its rolled-up badge while expanded, so its preferred
width now depends on expansion state. JTree only invalidates cached path
bounds on model changes, not on expand/collapse, so a collapsed folder could
keep its narrower expanded-state bounds and let the re-shown badge squeeze
the file name until an unrelated re-measure. Add a TreeExpansionListener that
invalidates the layout cache on toggle so the row re-measures immediately.
The reflow chain restarted its pass budget on every height change, so a
session that keeps streaming after open reset the budget each EDT cycle and
held the panel in a perpetual forgetAll()/re-measure loop, defeating the
width-keyed height cache. Add a hard total-pass budget that never resets so
the layout can still settle across a few height changes while capping the
work a streaming session can trigger. Covers the doLayout re-arm path with a
test that latches pendingReflow via a real turn at zero width.
Expanded folders already reveal child file badges, so showing the rolled-up folder total duplicates the visible counts. Keep aggregate badges only on collapsed folders while preserving file badges.
Opening a session could pin the transcript to a bottom computed from a zero-width measurement, cropping the last content until a toolwindow resize forced a re-measure. Reflow now no-ops until the panel has a real width and re-arms from doLayout once it does, so the transcript is always measured on-screen. The streaming path is untouched: pendingReflow is only set by a rebuild/clear that ran before layout, so the added doLayout check short-circuits during live updates.
- Replace generic 'multi-model API gateway' opening with punchier
differentiators: native Claude protocol, verifiable routing, one-key access
- Reviewer feedback: opening sentence didn't differentiate from other gateways
Co-Authored-By: Claude <noreply@anthropic.com>