# Live Sessions

Project Picker starts with `Live Sessions` (`live_sessions`), a non-persistent
Catalog-only virtual project with no filesystem path. It aggregates existing
Pi/Codex discovery across registered projects with at most eight concurrent
queries and the existing 15-second per-query timeout. A failed query yields a
sanitized `agent:project_id` error while other results remain available.

Only WAITING_APPROVAL, WAITING_INPUT and RUNNING are included, in that priority
order, then updated time descending, agent and session ID ascending. Identity is
(agent, session_id); duplicates favor higher-priority state, newer time, then
more complete catalog information. Names show Project / Session and retain the
existing 240-byte UTF-8 bound. Items contain only existing catalog fields.

Each item retains its real project_id. Existing Navigator target selection and
cwd checks are unchanged. The existing four-row, 60-second, connection-owned
snapshot holds the initial collection; reopening obtains fresh states. No active
sessions yields Empty. No protocol, capability, firmware or Adapter discovery
change is required.

Gateway-only v1 may still show `+ New Session` in the existing Session Picker.
`creation_get` and `session_create` reject the virtual ID through the existing
ProjectRegistry validation; no default project or cwd is substituted.

If Gateway restart misses a Pi turn start, elapsed time continues from its first
observed native RUNNING state; repeated snapshots and heartbeats do not reset it.
When the original agent_start is available, its timestamp remains authoritative.

Pi opens a new low-level run for automatic retry, overflow recovery, compaction
retry, steering and queued follow-ups, so several `agent_start` events can occur
inside one user request. Only the first one anchors the timer: the extension keeps
the existing `turn_id` while the turn is still running, and the registry preserves
`run_started_at` for an already-RUNNING session. A genuinely new turn, which
arrives after the terminal event, re-anchors the timer at zero.
