Uh oh!
There was an error while loading. Please reload this page.
feat(app): group Codex child sessions and resize sidebar - #463
Open
AmagiDDmxh wants to merge 1 commit into
Open
Conversation
AmagiDDmxhforce-pushed
the
feat/session-tree-resizable-sidebar
branch
from
July 18, 2026 18:49
ae2ed0a to
9dd13d5Comparebet4it 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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
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
parent_session_uuidstorage and an index in schema migration v16parent_thread_idin the shared session-kit Codex parser and propagate it through core session models and sync writescodex-v7-parent-session-treeso existing records are refreshedDESIGN.mdVerification
pnpm exec vp run --no-cache -r buildpnpm typecheckpnpm exec vp checkKnown upstream test issue
The full
pnpm testrun reaches an existing failure inpackages/session-view/src/build-output.test.ts. That test invokespnpm exec vite build, but the current Vite+ workspace does not expose avitebinary (Command "vite" not found). The package's normalvp buildpath succeeds, including in the full no-cache build above.