2.9 KiB
2.9 KiB
Task 3 report — reconnect SSE on same-session Resume
Status
Complete. A successful Resume of the currently active session now replaces its existing
EventSource connection. Resuming a different session continues to reconnect through the
session ID change only, without a generation-driven second connection.
Implementation
useSessionStreamaccepts an optionalgenerationargument (default0) and includes it in the stream effect dependencies. A generation change therefore runs the existing cleanup, closes the old source, and opens the same URL again.AppShellcaptures whether the requested Resume ID is already active before its existing optimistic state updates. It increments the stream generation only afterresumeSession(id)succeeds and only for that same-ID case.- The existing optimistic session switch, phase refresh, and failed-Resume rollback remain unchanged. A failed POST cannot increment the generation.
TDD evidence
- RED command:
cd frontend && npx vitest run src/stream/useSessionStream.test.tsx src/shell/AppShell.session-mgmt.test.tsx - RED result: 2 expected failures and 15 passes. The hook test observed
first.closed === false; the AppShell test observed oneFakeEventSourceinstead of two after the second same-ID Resume. - GREEN focused result: the same command passed 2/2 files and 17/17 tests after the minimal production wiring.
Full verification
- Baseline before edits:
cd frontend && npx vitest run— 42/42 files and 251/251 tests passed. - Focused tests: 2/2 files and 17/17 tests passed.
- Full frontend suite:
cd frontend && npx vitest run— 42/42 files and 253/253 tests passed. - Typecheck:
cd frontend && npx tsc -b— exit 0. - Production build:
cd frontend && npm run build— exit 0; Vite transformed 4,835 modules and completed the production bundle. git diff --check— passed.
The suite and build retained the pre-existing MSW unhandled-request, React ref/act, Node type
stripping, and Vite chunk-size warnings. This task introduced no new warning category.
Files
frontend/src/stream/useSessionStream.tsfrontend/src/stream/useSessionStream.test.tsxfrontend/src/shell/AppShell.tsxfrontend/src/shell/AppShell.session-mgmt.test.tsx.superpowers/sdd/task-3-report.md
Self-review
- Confirmed the old EventSource is closed before the replacement is retained by React's effect lifecycle, and the replacement uses the identical session URL.
- Confirmed same-ID detection happens before the optimistic
setActiveSessionId(id)call. - Confirmed the generation increments only after a successful Resume POST; the catch/rollback branch is unchanged.
- Confirmed a different ID leaves the generation unchanged, so the existing session-ID effect change creates exactly one replacement connection.
- Confirmed the diff is frontend-only apart from this report and contains no backend, Docker, configuration, or session changes.
Concerns
None.