resolve live sessions by claude's id, not the agent's session key

Every live row read 'Starting…' and linked nowhere, because the title lookup searched for a transcript
named after the session KEY. It isn't. The key is officer's handle for a conversation; the transcript is
named after Claude's own session id, and the mapping between them exists only inside the agent
(setClaudeSession/getClaudeSession). I assumed the two were the same and never checked — confirmed wrong
by looking for the ids from the officer log under ~/.claude/projects and finding nothing.

claude:list now reports claudeSessionId beside the key, the route resolves titles by that, and rows link
to it. Null means the first turn has not reported one yet, which is a genuinely unwritten conversation
and stays unlinked.

Needs the agent sidecar restarted to take effect — the new field comes from there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-10 01:23:14 +01:00
co-authored by Claude Opus 5
parent 27bbbaee47
commit 5a7591124a
5 changed files with 29 additions and 10 deletions
+8
View File
@@ -13,6 +13,14 @@ export type SidecarMessage = SidecarCommand | SidecarEvent;
*/
export type LiveClaudeSession = {
sessionKey: string;
/**
* Claude's own session id — the transcript's filename — or null before the first turn reports one.
*
* NOT the same as `sessionKey`, which is officer's handle for the conversation. Only the agent holds
* the mapping (`setClaudeSession`/`getClaudeSession`), so anything that wants to find the transcript
* has to be told it here. Assuming the two were equal made every live row unnameable and unlinkable.
*/
claudeSessionId: string | null;
isGenerating: boolean;
pendingTasks: number;
};