The session context used a single global status signal shared across all
Agent Manager tabs. Switching tabs reset status to idle and dropped SSE
events for non-active sessions, making it impossible to see or abort
busy sessions after a tab switch.
- Replace single statusInfo/busySince signals with per-session stores
- Remove currentSessionID guard from handleSessionStatus so all tracked
session status events are recorded
- Remove unconditional idle reset in selectSession/clearCurrentSession
- Fetch session statuses from server on tab switch to recover any
missed SSE events
- Forward full retry info (attempt, message, next) in SSE status events
Replace hardcoded values with kilo-ui design tokens throughout the
agent manager CSS: border-radius uses --radius-* tokens, font sizes
use --font-size-* tokens, colors use single semantic token references
instead of triple-fallback var() chains with hex defaults, and
interactive states use :active opacity instead of CSS transitions.
Replace raw tab close <button> with IconButton component.
requestFileSearch handler called getWorkspaceDirectory() without a
sessionId, so @ file mentions in Agent Manager worktree sessions always
searched the main workspace instead of the worktree directory. This
meant files only in the worktree branch were not found, and shared
files could resolve to the wrong copy.
Pass currentSession.id so the sessionDirectories map is consulted,
matching the pattern every other handler already follows.
MCP HTTP methods (addMcpServer, disconnectMcpServer, getMcpStatus,
connectMcpServer) were not sending the x-opencode-directory header.
The server fell back to process.cwd(), creating the Playwright MCP
client in a different Instance.state() bucket than the one used when
the agent processes messages. The browser tools appeared registered
but were invisible to the agent.
Fixes#292
Pressing Escape now aborts a busy session in the VS Code extension,
matching the behavior of the web app. Works whether the textarea is
focused or not. Ghost text dismissal still takes priority over abort
when both conditions are true.
* tmp
* feat(agent-manager): read-only mode for unassigned sessions, tooltip fix, worktree validation
* tmp
* fix keydown
* feat(agent-manager): replace empty worktree hint with 'New Worktree' button
* fix(agent-manager): validate message params before dispatching handlers
* fix(agent-manager): clear stale directory mappings on worktree deletion, remove unused code
* feat(agent-manager): auto-focus prompt input on session switch and panel focus
* refactor(agent-manager): rename short var wt to worktree
* fix(agent-manager): local tabs with pending session support and serialized saves
- Add pending tab system for local sessions (pending:N IDs in localSessionIDs)
- Show 'New Session' tab on first start, empty state when all tabs closed
- Pending tabs behave like normal tabs (closable, selectable, keyboard nav)
- Guard against duplicate sessionCreated events (HTTP + SSE)
- Serialize WorktreeStateManager saves to prevent concurrent write races
- Add flush() method and use it in tests to eliminate flaky failures
* refactor(agent-manager): rename short var mgr to manager
* tmp
* tmp
* tmp
* feat(agent-manager): add fixed local session tab with branch display and persistence
Add a dedicated local session item at the top of the agent manager sidebar
that always runs in the main repo (never a worktree). The local session
persists across panel reopens via vscode webview state, shows the current
git branch name (refreshed on click), and supports keyboard navigation.
Extract navigation logic into a pure testable function with 16 unit tests.
* fix(agent-manager): invalidate stale persisted localSessionID on recovery
The local session ID was persisted to webview state but never checked
against the actual sessions list on recovery. If the session was deleted
or expired between VS Code reloads, the UI would get stuck selecting a
ghost session with no way to recover.
Delete implementation detail docs for all ✅ Done features — these
contained migration instructions that are no longer relevant now that
the feature is built.
Delete all unknowns/ docs — these were pre-implementation research
questions that have since been answered and implemented.
Remove broken links in opencode-migration-plan.md and update
settings-ui.md to reflect actual current state.
Code Block Interactions, Command Execution, Diff Viewing, Image Handling,
and Todo List Management are all fully implemented via kilo-ui. Connection
State UI and Inline Actions updated to reflect partial progress.
Add gitUrl and gitBranch fields to kilo_meta so shared sessions
include repository context. Resolves the best remote (origin > single
available > upstream) and fetches the URL with a 10s in-flight cache.
PostHog's capture_pageview fires on initial page load, but _app.tsx
already manually captures $pageview on routeChangeComplete for SPA
navigations. This caused double pageview events on initial load.
Set capture_pageview: false and let the manual call in _app.tsx handle
all pageview tracking consistently.
- raw-markdown.ts: Check path bounds before any filesystem probes to
prevent leaking file existence info outside the pages directory
- TableOfContents.tsx: Fix SSR hydration mismatch by moving
window.location.hash into useEffect + state instead of reading it
during render