Skip to content

refactor(session): adopt streamer lifecycle for ended vs hold - #556

Draft
RonenMars wants to merge 1 commit into
mainfrom
refactor/session-lifecycle-phase
Draft

refactor(session): adopt streamer lifecycle for ended vs hold#556
RonenMars wants to merge 1 commit into
mainfrom
refactor/session-lifecycle-phase

Conversation

@RonenMars

@RonenMars RonenMars commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Summary

Closes #508.

The streamer already ships an additive lifecycle field (attached | detached | orphaned | resumable | completed | failed). Streamer #437 made holds report resumable instead of completed, and documented that completedAt is stamped on both a real exit and a hold — so it cannot be the client's "ended" signal.

This PR adopts that contract on mobile:

  • Add lifecycle / lifecycleSource / lifecycleUpdatedAt to Session
  • Rewrite sessionPhase() to prefer lifecycle (and stop treating completedAt alone as ended)
  • Add sessionOpensAsHistory() for the session-screen redirect and live-activity terminal check
  • Convert the ended-session redirect, live-activity isTerminal, conversation→session live gate, and hub presentation (resumable → historical/resume) to the new helpers
  • Keep the legacy idle + !ptyAttached fallback when lifecycle is absent (older servers + starting=1 still gates spawn)

Test plan

  • npx jest --ci --runInBand --forceExit --testPathPattern "sessionPresentation|live-activity\.test|SessionScreen.endedRedirect|LiveActivity.reconcile" — 58 passed
  • npx jest --ci --runInBand --forceExit --testPathPattern "conversation-detail-gating|SessionStatusBadge" — 19 passed
  • ESLint on staged TS/TSX — no errors (one pre-existing hooks warning in app/session/[id].tsx)

Replace idle+!ptyAttached / completedAt inference with the streamer's
additive lifecycle field. sessionPhase and sessionOpensAsHistory now
prefer lifecycle so holds (resumable) are not conflated with genuine
ends, while older servers keep the legacy idle+detached fallback.

Co-authored-by: Ronen Mars <ronenmars@gmail.com>
@RonenMars
RonenMars force-pushed the refactor/session-lifecycle-phase branch from 78f2425 to 9c04478 Compare August 6, 2026 04:32
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.

refactor(session): replace the idle + !ptyAttached inference with an explicit lifecycle phase

1 participant