Skip to content

feat(app): group Codex child sessions and resize sidebar - #463

Open
AmagiDDmxh wants to merge 1 commit into
paperboytm:mainfrom
AmagiDDmxh:feat/session-tree-resizable-sidebar
Open

AmagiDDmxh wants to merge 1 commit into
paperboytm:mainfrom
AmagiDDmxh:feat/session-tree-resizable-sidebar

Conversation

@AmagiDDmxh

@AmagiDDmxh AmagiDDmxh commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Summary

  • group Codex child sessions under their parent session in the desktop library instead of showing subagent runs as unrelated duplicate rows
  • add a persistent, resizable desktop sidebar with pointer, keyboard, and reset interactions
  • store Codex parent-session lineage in SQLite and reindex existing Codex sessions so the tree is populated for existing libraries

Why

Codex records subagent work as separate session files and links each child to its parent through parent_thread_id. Spool previously discarded that relationship, so parent and child sessions appeared as independent entries with similar titles and timestamps. This made the library look as if it contained duplicate sessions.

Preserving the lineage lets the desktop app present those records as a tree while keeping every child session individually accessible. The sidebar resize control also brings the desktop shell in line with the dimensions and behavior documented in DESIGN.md.

Implementation

  • add nullable parent_session_uuid storage and an index in schema migration v16
  • parse parent_thread_id in the shared session-kit Codex parser and propagate it through core session models and sync writes
  • bump the Codex index version to codex-v7-parent-session-tree so existing records are refreshed
  • page by root sessions, then load their descendants with a recursive CTE so children do not consume root pagination slots
  • build cycle-safe session forests in the renderer and render nested rows with expand/collapse controls
  • keep tree context in library, virtualized, and share-editor session lists
  • add a 200-360 px sidebar resize separator, persist the selected width, support arrow/Home/End keys, and reset to 240 px on double-click
  • update localized accessibility labels and the desktop layout guidance in DESIGN.md

Verification

  • pnpm exec vp run --no-cache -r build
  • pnpm typecheck
  • pnpm exec vp check
  • focused core parser, migration, query, and project-session tests: 40 passed
  • renderer session-tree and resize-handle tests: 3 passed
  • Electron E2E coverage for tree interaction and sidebar resize persistence: 2 passed

Known upstream test issue

The full pnpm test run reaches an existing failure in packages/session-view/src/build-output.test.ts. That test invokes pnpm exec vite build, but the current Vite+ workspace does not expose a vite binary (Command "vite" not found). The package's normal vp build path succeeds, including in the full no-cache build above.

@AmagiDDmxh
AmagiDDmxh force-pushed the feat/session-tree-resizable-sidebar branch from ae2ed0a to 9dd13d5 Compare July 18, 2026 18:49
@AmagiDDmxh AmagiDDmxh changed the title Feat/session tree resizable sidebar feat(app): group Codex child sessions and resize sidebar Jul 18, 2026
bet4it added a commit to bet4it/spool that referenced this pull request Aug 30, 2026
Cherry-pick of paperboytm#463, adapted for our repo layout
(packages/app instead of apps/app, schema v17 instead of v16, and
codex-v10 instead of codex-v7 to avoid version collisions).

Core changes:
- Add parentSessionUuid to ParsedSession and Session types
- Parse parent_thread_id from Codex session_meta records
- Store parent_session_uuid in SQLite (migration v17) with an index
- Page by root sessions in listRecentSessionsPage, then load
  descendants via recursive CTE so children don't consume pagination
- Bump CODEX_INDEX_VERSION to codex-v10-parent-session-tree

Renderer changes:
- buildSessionForest creates cycle-safe trees from flat session lists
- SessionRow renders tree depth indentation, expand/collapse toggle,
  and child-session count
- VirtualSessionList filters tree rows by ancestor expansion state
- LibraryLanding buckets root sessions only and appends child rows
  within each bucket
- SidebarResizeHandle: pointer-drag + keyboard resize (200-360px),
  persisted to localStorage, double-click resets to 240px
- AppTopBar and SidebarRail use dynamic width instead of w-60
- Sidebar receives and applies the width prop
- DESIGN.md updated for resizable sidebar spec

Tests: 508 core + 485 app pass (2 pre-existing security IPC failures
unrelated to this change).
bet4it added a commit to bet4it/spool that referenced this pull request Aug 30, 2026
The cherry-pick of paperboytm#463 only wired tree grouping into the Library
landing; ProjectView still rendered children as flat rows mixed with
their parents.

Core:
- listSessionsByIdentity now pages by root sessions and loads
  descendants via recursive CTE for sortOrder=recent, reusing
  executeRecentTreePage. A root filter is added so children don't
  appear in both the root page and the descendants query (duplicates).
- Descendants re-apply identity/source filters: a source-filtered
  family hides together instead of leaving dangling orphans.
- '' parent_session_uuid (codex writes empty string, not NULL) is
  treated as a root. listRecentSessionsPage didn't need this, but the
  new shared path makes the contract explicit.

Renderer:
- ProjectView builds a session forest from the page and nests children
  under their parent (chevron expand, depth indentation, child count),
  matching LibraryLanding. Directory grouping builds one forest per
  cwd; filtered-out parents orphan their children into roots so they
  stay visible.

E2e:
- New project-view-session-tree.spec.ts with codex parent/child
  fixtures: collapse by default, expand shows indented children at
  depth 1, child rows open their own detail.
- launchApp now isolates SPOOL_GROK_DIR/GROK_HOME — grok was syncing
  the developer's real ~/.grok/sessions during e2e, which made the
  end-of-list footer assertion flaky.

Tests: 513 core + 490 app unit + tree/project-view/pin e2e pass.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant