|
2 | 2 | // preserving agent-session parent links and transcript update notifications. |
3 | 3 | import type { SessionManager } from "../../agents/sessions/session-manager.js"; |
4 | 4 | import { |
5 | | - loadTranscriptEvents, |
| 5 | + findTranscriptEvent, |
6 | 6 | persistSessionTranscriptTurn, |
7 | 7 | type TranscriptEvent, |
8 | 8 | } from "../../config/sessions/session-accessor.js"; |
@@ -92,24 +92,28 @@ async function findInjectedAssistantMessageByIdempotencyKey(params: { |
92 | 92 | } |
93 | 93 | // The in-lock duplicate check resolves through the already-resolved |
94 | 94 | // sessionFile when present so the lookup reads the file being appended to. |
95 | | - const events = await loadTranscriptEvents({ |
96 | | - ...(params.target.agentId ? { agentId: params.target.agentId } : {}), |
97 | | - ...(params.target.sessionFile ? { sessionFile: params.target.sessionFile } : {}), |
98 | | - sessionId: params.target.sessionId, |
99 | | - sessionKey: params.target.sessionKey, |
100 | | - ...(params.target.storePath ? { storePath: params.target.storePath } : {}), |
101 | | - }); |
102 | | - const event = events.toReversed().find((candidate) => { |
103 | | - const message = transcriptEventMessage(candidate); |
104 | | - return message?.role === "assistant" && message.idempotencyKey === params.idempotencyKey; |
105 | | - }); |
106 | | - const message = event ? transcriptEventMessage(event) : undefined; |
| 95 | + // findTranscriptEvent scans newest-first with early exit, keeping the hot |
| 96 | + // idempotent append path from materializing the whole transcript. |
| 97 | + const found = await findTranscriptEvent( |
| 98 | + { |
| 99 | + ...(params.target.agentId ? { agentId: params.target.agentId } : {}), |
| 100 | + ...(params.target.sessionFile ? { sessionFile: params.target.sessionFile } : {}), |
| 101 | + sessionId: params.target.sessionId, |
| 102 | + sessionKey: params.target.sessionKey, |
| 103 | + ...(params.target.storePath ? { storePath: params.target.storePath } : {}), |
| 104 | + }, |
| 105 | + (candidate) => { |
| 106 | + const message = transcriptEventMessage(candidate); |
| 107 | + return message?.role === "assistant" && message.idempotencyKey === params.idempotencyKey; |
| 108 | + }, |
| 109 | + ); |
| 110 | + const message = found ? transcriptEventMessage(found.event) : undefined; |
107 | 111 | if (!message) { |
108 | 112 | return undefined; |
109 | 113 | } |
110 | 114 | // Legacy shipped transcripts can carry assistant rows without top-level ids; |
111 | 115 | // fall back to the idempotency key so re-issued aborts still dedupe there. |
112 | | - const messageId = (event ? transcriptEventId(event) : undefined) ?? params.idempotencyKey; |
| 116 | + const messageId = (found ? transcriptEventId(found.event) : undefined) ?? params.idempotencyKey; |
113 | 117 | return { messageId, message }; |
114 | 118 | } |
115 | 119 |
|
|
0 commit comments