






















@@ -1256,12 +1256,22 @@ describe("CodexAppServerEventProjector", () => {
12561256it("synthesizes native tool progress from turn completion snapshots", async () => {
12571257const onAgentEvent = vi.fn();
12581258const onToolResult = vi.fn();
1259-const projector = await createProjector({
1260- ...(await createParams()),
1261-verboseLevel: "on",
1262- onAgentEvent,
1263- onToolResult,
1264-});
1259+const trajectoryRecorder = {
1260+filePath: "trajectory.jsonl",
1261+recordEvent: vi.fn(),
1262+flush: vi.fn(async () => undefined),
1263+};
1264+const projector = await createProjector(
1265+{
1266+ ...(await createParams()),
1267+verboseLevel: "on",
1268+ onAgentEvent,
1269+ onToolResult,
1270+},
1271+{
1272+ trajectoryRecorder,
1273+},
1274+);
1265127512661276await projector.handleNotification(
12671277turnCompleted([
@@ -1307,11 +1317,38 @@ describe("CodexAppServerEventProjector", () => {
13071317expect(onToolResult).toHaveBeenCalledWith({
13081318text: "🛠️ `run tests (workspace)`",
13091319});
1320+expect(trajectoryRecorder.recordEvent).toHaveBeenCalledWith("tool.call", {
1321+threadId: THREAD_ID,
1322+turnId: TURN_ID,
1323+itemId: "cmd-snapshot",
1324+toolCallId: "cmd-snapshot",
1325+name: "bash",
1326+arguments: { command: "pnpm test extensions/codex", cwd: "/workspace" },
1327+});
1328+expect(trajectoryRecorder.recordEvent).toHaveBeenCalledWith("tool.result", {
1329+threadId: THREAD_ID,
1330+turnId: TURN_ID,
1331+itemId: "cmd-snapshot",
1332+toolCallId: "cmd-snapshot",
1333+name: "bash",
1334+status: "completed",
1335+isError: false,
1336+result: { status: "completed", exitCode: 0, durationMs: 42 },
1337+output: "ok",
1338+});
13101339});
1311134013121341it("does not duplicate native tool starts when the snapshot completes a started item", async () => {
13131342const onAgentEvent = vi.fn();
1314-const projector = await createProjector({ ...(await createParams()), onAgentEvent });
1343+const trajectoryRecorder = {
1344+filePath: "trajectory.jsonl",
1345+recordEvent: vi.fn(),
1346+flush: vi.fn(async () => undefined),
1347+};
1348+const projector = await createProjector(
1349+{ ...(await createParams()), onAgentEvent },
1350+{ trajectoryRecorder },
1351+);
13151352const commandItem = {
13161353type: "commandExecution",
13171354id: "cmd-started",
@@ -1343,6 +1380,12 @@ describe("CodexAppServerEventProjector", () => {
13431380expect(
13441381toolEvents.filter((event) => event.phase === "result" && event.itemId === "cmd-started"),
13451382).toHaveLength(1);
1383+expect(
1384+trajectoryRecorder.recordEvent.mock.calls.filter(([type]) => type === "tool.call"),
1385+).toHaveLength(1);
1386+expect(
1387+trajectoryRecorder.recordEvent.mock.calls.filter(([type]) => type === "tool.result"),
1388+).toHaveLength(1);
13461389});
1347139013481391it("does not synthesize completed progress for running turn completion snapshots", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。