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:
@@ -511,6 +511,9 @@ export function clearSession(sessionKey: string): void {
|
||||
export function listSessions(): LiveClaudeSession[] {
|
||||
return Array.from(sessions.values()).map((session) => ({
|
||||
sessionKey: session.sessionKey,
|
||||
// The only place this mapping exists. Without it a caller cannot find the transcript, because the
|
||||
// key is officer's handle and the filename is Claude's id.
|
||||
claudeSessionId: getClaudeSession(session.sessionKey) ?? null,
|
||||
isGenerating: session.isGenerating,
|
||||
pendingTasks: session.pendingTasks.size,
|
||||
}));
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user