diff --git a/src/auto-reply/reply/session-transcript-replay.test.ts b/src/auto-reply/reply/session-transcript-replay.test.ts index 34961b862fd..581d777efd8 100644 --- a/src/auto-reply/reply/session-transcript-replay.test.ts +++ b/src/auto-reply/reply/session-transcript-replay.test.ts @@ -9,6 +9,27 @@ import { const j = (obj: unknown): string => `${JSON.stringify(obj)}\n`; +type ReplayRecord = { + type?: string; + id?: string; + message?: { + role?: string; + content?: string; + }; +}; + +async function readJsonlRecords(filePath: string): Promise { + const records: ReplayRecord[] = []; + const raw = await fs.readFile(filePath, "utf8"); + for (const line of raw.split(/\r?\n/)) { + if (line.trim().length === 0) { + continue; + } + records.push(JSON.parse(line) as ReplayRecord); + } + return records; +} + describe("replayRecentUserAssistantMessages", () => { let root = ""; beforeEach(async () => { @@ -37,14 +58,11 @@ describe("replayRecentUserAssistantMessages", () => { await fs.writeFile(source, lines.join(""), "utf8"); expect(await call(source, target)).toBe(DEFAULT_REPLAY_MAX_MESSAGES); - const records = (await fs.readFile(target, "utf8")) - .split(/\r?\n/) - .filter((line) => line.trim().length > 0) - .map((line) => JSON.parse(line)); + const records = await readJsonlRecords(target); expect(records[0]).toMatchObject({ type: "session", id: "new-session" }); expect(records).toHaveLength(1 + DEFAULT_REPLAY_MAX_MESSAGES); for (const r of records.slice(1)) { - expect(["user", "assistant"]).toContain(r.message.role); + expect(["user", "assistant"]).toContain(r.message?.role); } expect(await call(path.join(root, "missing.jsonl"), path.join(root, "out.jsonl"))).toBe(0); @@ -69,13 +87,10 @@ describe("replayRecentUserAssistantMessages", () => { await fs.writeFile(source, lines.join(""), "utf8"); expect(await call(source, target)).toBe(DEFAULT_REPLAY_MAX_MESSAGES - 1); - const records = (await fs.readFile(target, "utf8")) - .split(/\r?\n/) - .filter((line) => line.trim().length > 0) - .map((line) => JSON.parse(line)); + const records = await readJsonlRecords(target); expect(records.reduce((count, r) => count + (r.type === "session" ? 1 : 0), 0)).toBe(1); expect(records[0]).toMatchObject({ id: "existing" }); - expect(records[1].message.role).toBe("user"); + expect(records[1].message?.role).toBe("user"); }); it("coalesces same-role runs so replayed records strictly alternate", async () => { @@ -95,17 +110,14 @@ describe("replayRecentUserAssistantMessages", () => { ); expect(await call(source, target)).toBe(4); - const records = (await fs.readFile(target, "utf8")) - .split(/\r?\n/) - .filter((line) => line.trim().length > 0) - .map((line) => JSON.parse(line)); - expect(records.slice(1).map((r) => r.message.role)).toEqual([ + const records = await readJsonlRecords(target); + expect(records.slice(1).map((r) => r.message?.role)).toEqual([ "user", "assistant", "user", "assistant", ]); - expect(records.slice(1).map((r) => r.message.content)).toEqual([ + expect(records.slice(1).map((r) => r.message?.content)).toEqual([ "latest user", "latest assistant", "follow-up",