4.0 KiB
4.0 KiB
Session page decomposition
Split pages/session.tsx into focused modules without behavior changes.
Summary
packages/app/src/pages/session.tsx is still a large (~3,655 LOC) route coordinator. Recent refactoring already extracted packages/app/src/pages/session/helpers.ts and packages/app/src/pages/session/scroll-spy.ts, but review-panel wiring, message timeline orchestration, file-tab rendering, and terminal coordination remain tightly coupled. This spec continues the decomposition from that updated baseline.
Goals
- Reduce complexity in
packages/app/src/pages/session.tsx. - Isolate major concerns into dedicated modules under
packages/app/src/pages/session/. - Keep behavior and route/API contracts unchanged.
- Preserve current keyboard, scroll, hash, and review interactions.
Non-goals
- No redesign of session UX.
- No changes to SDK contracts.
- No refactor of
context/global-sync.tsx,context/file.tsx, orcomponents/prompt-input.tsxin this workstream.
Parallel ownership (important)
This workstream owns:
packages/app/src/pages/session.tsx- New files under
packages/app/src/pages/session/**
This workstream must not edit:
packages/app/src/pages/layout.tsx(owned by spec 10)packages/app/src/components/prompt-input.tsx(owned by spec 11)packages/app/src/context/global-sync.tsx(owned by spec 12)packages/app/src/context/file.tsx(owned by spec 13)
Current state
- File size: ~3,655 LOC.
- Existing extracted modules:
packages/app/src/pages/session/helpers.ts(terminal focus and shared handlers)packages/app/src/pages/session/scroll-spy.ts(message visibility + active-section tracking)
- High effect density (
createEffect) and local-state density (createStore+createSignal) remain insession.tsx. - Remaining interleaved responsibilities:
- review panel state + scrolling integration
- message timeline + hash navigation wiring
- file tab renderers + per-tab scroll sync
- terminal panel and tab coordination
Proposed module split
Build on the existing packages/app/src/pages/session/ directory and keep current extracted helpers in place. Add modules such as:
review-panel.tsx- review tab rendering and focused diff logic.message-timeline.tsx- session turn rendering and active message tracking UI wiring.file-tabs.tsx- file tab content rendering, file scroll persistence, and line-comment overlays.terminal-panel.tsx- terminal tabs and focus behavior.use-session-page-state.ts- page-level derived state and imperative handlers.
packages/app/src/pages/session.tsx remains the route entry and orchestrator only.
Phased steps
- Keep
helpers.tsandscroll-spy.tsas baseline; extract any additional pure helpers first (no behavior changes). - Extract review panel subtree and related handlers.
- Extract file-tab subtree and scroll synchronization logic.
- Extract terminal panel subtree.
- Move page-level state/effects into
use-session-page-state.ts. - Reduce
session.tsxto composition and routing glue.
Acceptance criteria
packages/app/src/pages/session.tsxis reduced substantially (target: under 1,400 LOC).- No user-facing behavior changes in session, review, file tabs, or terminal tabs.
- Event listeners and observers are still correctly cleaned up.
- New modules have clear prop boundaries and minimal hidden coupling.
Validation plan
- Typecheck:
bun run typecheck(frompackages/app). - Targeted e2e checks:
e2e/session/session.spec.tse2e/files/file-viewer.spec.tse2e/terminal/terminal.spec.ts
- Manual checks:
- message hash navigation
- review diff focus + open-file action
- terminal tab create/reorder/focus behavior
Handoff notes
- Keep module interfaces narrow and data-oriented.
- Prefer extracting code unchanged before doing any cleanup refactors.
- If a helper is useful to other specs, place it under
pages/session/for now; cross-spec shared utilities can be unified later.