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:
@@ -101,14 +101,17 @@ chatRouter.get('/sessions/:id', async (ctx) => {
|
||||
//
|
||||
// `pendingTasks` is background work started but not yet notified — with `isGenerating` it is what the
|
||||
// agent's own idle GC consults, so a caller can tell "busy" from "merely open" the same way it does.
|
||||
// Titles are resolved here rather than in the client: the agent reports session keys and nothing else,
|
||||
// and the client can only name the sessions in the group it happens to be browsing — which is how the
|
||||
// list ended up showing raw ids for anything running elsewhere.
|
||||
// Titles are resolved here rather than in the client, which can only name the sessions in the group it
|
||||
// happens to be browsing — which is how the list ended up showing raw ids for anything running elsewhere.
|
||||
chatRouter.get('/live', async (ctx) => {
|
||||
const email = ctx.get('user').email;
|
||||
const live = await sidecar.listLiveClaudeSessions();
|
||||
const sessions = live.map((session) => {
|
||||
const resolved = isOpenCodeSessionId(session.sessionKey) ? null : liveSessionTitle(email, session.sessionKey);
|
||||
// Resolve by Claude's id, never by the session key — the key is officer's handle and the transcript
|
||||
// is named after Claude's. Null until the first turn reports one, which is a conversation that has
|
||||
// genuinely not been written yet.
|
||||
const transcriptId = session.claudeSessionId;
|
||||
const resolved = transcriptId && !isOpenCodeSessionId(transcriptId) ? liveSessionTitle(email, transcriptId) : null;
|
||||
return { ...session, title: resolved?.title ?? null, cwd: resolved?.cwd ?? null };
|
||||
});
|
||||
return ctx.json({ sessions });
|
||||
|
||||
Reference in New Issue
Block a user