





















@@ -50,16 +50,43 @@ async function writeTranscriptHeader(transcriptPath: string, sessionId: string)
50505151async function readTranscriptLines(transcriptPath: string): Promise<TranscriptLine[]> {
5252const raw = await fs.readFile(transcriptPath, "utf-8");
53-return raw
54-.split(/\r?\n/)
55-.filter((line) => line.trim().length > 0)
56-.map((line) => {
57-try {
58-return JSON.parse(line) as TranscriptLine;
59-} catch {
60-return {};
61-}
62-});
53+const lines: TranscriptLine[] = [];
54+for (const line of raw.split(/\r?\n/)) {
55+if (line.trim().length === 0) {
56+continue;
57+}
58+try {
59+lines.push(JSON.parse(line) as TranscriptLine);
60+} catch {
61+lines.push({});
62+}
63+}
64+return lines;
65+}
66+67+function collectMessagesWithIdempotencyKey(
68+lines: TranscriptLine[],
69+idempotencyKey: string,
70+): Record<string, unknown>[] {
71+const messages: Record<string, unknown>[] = [];
72+for (const line of lines) {
73+if (line.message?.idempotencyKey === idempotencyKey) {
74+messages.push(line.message);
75+}
76+}
77+return messages;
78+}
79+80+function findMessageWithIdempotencyKey(
81+lines: TranscriptLine[],
82+idempotencyKey: string,
83+): Record<string, unknown> | undefined {
84+for (const line of lines) {
85+if (line.message?.idempotencyKey === idempotencyKey) {
86+return line.message;
87+}
88+}
89+return undefined;
6390}
64916592function setMockSessionEntry(transcriptPath: string, sessionId: string) {
@@ -124,12 +151,7 @@ describe("chat abort transcript persistence", () => {
124151});
125152126153const lines = await readTranscriptLines(transcriptPath);
127-const persisted = lines
128-.map((line) => line.message)
129-.filter(
130-(message): message is Record<string, unknown> =>
131-Boolean(message) && message?.idempotencyKey === `${runId}:assistant`,
132-);
154+const persisted = collectMessagesWithIdempotencyKey(lines, `${runId}:assistant`);
133155134156expect(persisted).toHaveLength(1);
135157expect(persisted[0]).toMatchObject({
@@ -176,12 +198,8 @@ describe("chat abort transcript persistence", () => {
176198expect(payload.runIds).toEqual(expect.arrayContaining(["run-a", "run-b"]));
177199178200const lines = await readTranscriptLines(transcriptPath);
179-const runAPersisted = lines
180-.map((line) => line.message)
181-.find((message) => message?.idempotencyKey === "run-a:assistant");
182-const runBPersisted = lines
183-.map((line) => line.message)
184-.find((message) => message?.idempotencyKey === "run-b:assistant");
201+const runAPersisted = findMessageWithIdempotencyKey(lines, "run-a:assistant");
202+const runBPersisted = findMessageWithIdempotencyKey(lines, "run-b:assistant");
185203186204expect(runAPersisted).toMatchObject({
187205idempotencyKey: "run-a:assistant",
@@ -226,9 +244,7 @@ describe("chat abort transcript persistence", () => {
226244expect(payload).toMatchObject({ aborted: true, runIds: ["run-stop-1"] });
227245228246const lines = await readTranscriptLines(transcriptPath);
229-const persisted = lines
230-.map((line) => line.message)
231-.find((message) => message?.idempotencyKey === "run-stop-1:assistant");
247+const persisted = findMessageWithIdempotencyKey(lines, "run-stop-1:assistant");
232248233249expect(persisted).toMatchObject({
234250idempotencyKey: "run-stop-1:assistant",
@@ -264,9 +280,7 @@ describe("chat abort transcript persistence", () => {
264280expect(payload).toMatchObject({ aborted: true, runIds: [runId] });
265281266282const lines = await readTranscriptLines(transcriptPath);
267-const persisted = lines
268-.map((line) => line.message)
269-.find((message) => message?.idempotencyKey === `${runId}:assistant`);
283+const persisted = findMessageWithIdempotencyKey(lines, `${runId}:assistant`);
270284expect(persisted).toBeUndefined();
271285});
272286});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。