c4241c23da37c12cf5b938d80f968ebdfd917d43
The /chat sidebar is now a vertical split: live sessions on top, the transcript list below. They look similar and answer completely different questions — the list reads conversations from disk, thousands of them, while this reads the agent's in-memory map over `claude:list`. Only the second can tell you a conversation is still working while nothing is on screen, which is exactly the state that has been invisible: after a `pm2 restart officer`, or from a browser that has never seen the session, officer has no record of a live turn and only the agent can say. `pendingTasks` is surfaced per row because it is the load-bearing number. It is what keeps a session alive with nothing on screen, and what makes restarting the agent sidecar unsafe at that moment. Polled at 10s rather than pushed: liveness changes without officer being told — a turn ends, a background task reports — so there is no single event to subscribe to. The request is one map read. Titles come from the sessions query already in cache, so they cost nothing, but that query only covers the group being browsed and a live session can be in any of them. Unmatched rows show a short key rather than inventing a name, and an unsaved chat renders unlinked rather than pointing at a transcript that does not exist yet. Closes the UI half of step 2 in docs/chat-session-lifetime.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Description
No description provided
42 MiB
Languages
TypeScript
90.9%
Shell
4.7%
JavaScript
4.1%
CSS
0.2%
HTML
0.1%