* perf(vscode): gate API readiness and coalesce duplicate startup reads Bring the VS Code bridge runtime to parity with the web startup optimizations (PR #1650), which were web/desktop-only. waitForApiUrl now hands out the OpenCode API URL only once the manager reports 'connected', instead of as soon as getApiUrl() exposes server.url. The URL is available the moment the process is spawned — before waitForReady confirms it can serve and during a workspace-switch restart (stale port) — so URL-presence alone let the bridge forward to a not-yet-ready OpenCode and surface 502s. Gating on connected status mirrors the web proxy's isOpenCodeReady hold. Also fail fast on 'error' status so a missing CLI doesn't burn the full 30s timeout. Coalesce concurrent identical GET reads (config/path/agents/agent/ project/command) at the bridge proxy so the single OpenCode process serves them once. On cold start the webview's sync bootstrap and config store fire these reads in parallel with no shared dedup; this is the extension-host analog of the runtimeFetch coalescer. Shared reads carry no AbortController so one caller's abort can't strand the others, and the entry clears as soon as it settles (never serves stale). * perf(vscode): fade the startup splash once mounted + connected, not on live fetch The webview's initial-loading overlay held until a successful live /api/config/providers AND /api/agent fetch completed. After the cache hydration work those live reads are the slowest cold-start tail — the UI underneath already paints pickers and the sidebar from cache and refreshes in the background — so gating the splash on them kept it spinning long after the app was usable. Fade the overlay as soon as the UI is mounted and OpenCode is connected. Per-widget loaders convey any remaining background refresh, matching how web/desktop (which have no such splash) already behave. Removes the now -obsolete bootstrapProvidersReady/AgentsReady/Failed tracking and recordBootstrapFetch. Connection error/disconnected splash messages are unchanged. * fix(vscode): include captured OpenCode output in spawn-timeout error When the managed OpenCode server fails to emit its 'listening' line within the start timeout, the error discarded everything the process printed to stdout/stderr — so the status report showed a bare 'Timeout waiting for server to start' with no clue whether the process hung, crashed silently, or printed a config/auth error. The exit path already includes the output; the timeout path now does too (or notes that nothing was printed). * feat(vscode): workspace-grouped session list with working folders, pinning, and archived toggle Replace the flat multi-workspace session list with the grouped project view, using each open VS Code workspace folder as a header (no per-worktree subgroups). This restores native folder and pin support, which the flat list silently dropped, and fixes the clipped left padding on session rows. - Group sessions strictly by open workspace; funnel all non-archived sessions into the workspace's group so they no longer fall into the archived bucket. - Keep the project/group/folder + buttons but make them open a draft in the correct workspace and navigate to chat; hide the project actions (...) menu, which isn't relevant in VS Code. - Force the minimal single-line row layout (the second metadata row is redundant under workspace headers) and drop the per-row tooltip. - Add a show/hide archived toggle next to the archive-all control, since the VS Code header has no display-mode menu. - Size the hover action reveal so the timestamp clears the row buttons.
4.7 KiB
4.7 KiB
Session Sidebar Documentation
Refactor result
SessionSidebar.tsxnow acts mainly as orchestration; core logic moved to focused hooks/components.- Sidebar is now a single multi-project tree:
recenttop section, then projects, then worktrees/archived groups, then sessions. NavRailis no longer part of sidebar/navigation flow.- Project headers now own root sessions directly; there is no separate rendered
project rootsubgroup. - Active/hover row styling is text-first; selected sessions use primary text instead of background fills.
- Archived groups are collapsed by default and support bulk deletion at group/folder level.
- Session rows support compact inline dates in minimal mode and simplified metadata in default mode.
- New extractions in latest pass reduced local effect/callback bulk further:
- project session list builders
- folder cleanup sync
- sticky project header observer
VS Code grouping
- VS Code uses the same grouped project tree as web/desktop (project headers + folders + pinned-first ordering), not a separate flat list. Each open VS Code workspace folder is a project header.
- VS Code groups strictly by open workspace:
useSessionGroupingfunnels every non-archived session into the project's root group and emits no per-worktree subgroups (worktrees aren't registered in VS Code).getSessionsForProjectbuckets sessions to a workspace by exact directory match, so only sessions whose directory is an open workspace folder appear. - VS Code passes
hideDirectoryControls(clean workspace headers, no worktree/close chrome) and no longer passesshowOnlyMainWorkspace/sharedSessionsOnly. Folders and pinning therefore work natively, scoped to the workspace root.
File summaries
Components
SidebarHeader.tsx: Top header UI for add-project, session search, and display mode.SidebarActivitySections.tsx: Global top section renderer; currently used for therecentsection only.SidebarFooter.tsx: Static footer with icon-only settings, shortcuts, and about actions.SidebarProjectsList.tsx: Main scrollable tree renderer for projects, root sessions, worktrees/groups, and empty/search states.SessionGroupSection.tsx: Renders a single worktree/archived group, collapse/expand, folder subtree, and group-level controls.SessionNodeItem.tsx: Renders one session row/tree node with inline metadata, menu actions, minimal/default variants, and nested children.ConfirmDialogs.tsx: Shared confirm dialog wrappers for session delete and folder delete flows.sortableItems.tsx: DnD sortable wrappers for project and group ordering plus project-row action affordances.sessionFolderDnd.tsx: Folder/session DnD scope and wrappers for dropping/moving sessions into folders.
Hooks
hooks/useSessionActions.ts: Centralizes session row actions (select/open, rename, share/unshare, archive/delete, confirmations).hooks/useSessionSearchEffects.ts: Handles search open/close UX and input focus behavior.hooks/useSessionPrefetch.ts: Prefetches messages for nearby/active sessions to improve perceived load speed.hooks/useDirectoryStatusProbe.ts: Probes and caches directory existence status for session/path indicators.hooks/useSessionGrouping.ts: Builds grouped session structures and search text/filter helpers.hooks/useSessionSidebarSections.ts: Composes final per-project sections and group search metadata for rendering.hooks/useProjectSessionSelection.ts: Resolves active/current project-session selection logic and session-directory context.hooks/useGroupOrdering.ts: Applies persisted/custom group order with stable fallback ordering; archived groups are reorderable.hooks/useArchivedAutoFolders.ts: Maintains archived auto-folder structure and assignment behavior.hooks/useSidebarPersistence.ts: Persists sidebar UI state (expanded/collapsed/pinned/group order/active session) to storage + desktop settings.hooks/useProjectRepoStatus.ts: Tracks per-project git-repo state and root branch metadata.hooks/useProjectSessionLists.ts: Builds live and archived session lists for a given project (including worktrees + dedupe).hooks/useSessionFolderCleanup.ts: Cleans stale folder session IDs by reconciling known sessions/archived scopes.hooks/useStickyProjectHeaders.ts: Tracks which project headers are sticky/stuck viaIntersectionObserver.
Types and utilities
types.ts: Shared sidebar types (SessionNode,SessionGroup, summary/search metadata).activitySections.ts: Persisted top-section storage/helpers for the currentrecentsession list.utils.tsx: Shared sidebar utilities (path normalization, sorting, dedupe, archived scope keys, project relation checks, text highlight, labels, compact/default date formatting).