From 82ba1a7575bb66e18f80148ae47dc8693c97492c Mon Sep 17 00:00:00 2001 From: "paseo-bot[bot]" <266920839+paseo-bot[bot]@users.noreply.github.com> Date: Tue, 29 Sep 2026 05:05:57 +0200 Subject: [PATCH] test(codex): reproduce finished legacy sub-agent replaying as running (#4538) Failing on purpose. A thread whose child was spawned with the legacy spawnAgent/wait/closeAgent items replays the child as running, because only the spawn snapshot is read on replay. --- .../providers/codex-app-server-agent.test.ts | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts index d4a96b45e6..22005c57bf 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts @@ -4324,6 +4324,69 @@ describe("Codex app-server provider", () => { }); }); + test("replays a legacy sub-agent that later finished as completed", async () => { + const session = createSession(); + session.client = { + request: vi.fn(async (method: string, params: unknown) => { + if (method !== "thread/read") { + return {}; + } + if ((params as { threadId?: string }).threadId !== "test-thread") { + return { thread: { turns: [] } }; + } + return { + thread: { + turns: [ + { + items: [ + { + type: "collabAgentToolCall", + id: "exec-spawn-history", + tool: "spawnAgent", + status: "completed", + prompt: "Research child", + receiverThreadIds: ["finished-child-thread"], + agentsStates: { "finished-child-thread": { status: "pendingInit" } }, + }, + { + type: "collabAgentToolCall", + id: "exec-wait-history", + tool: "wait", + status: "completed", + receiverThreadIds: ["finished-child-thread"], + agentsStates: { + "finished-child-thread": { status: "completed", message: "done" }, + }, + }, + { + type: "collabAgentToolCall", + id: "exec-close-history", + tool: "closeAgent", + status: "completed", + receiverThreadIds: ["finished-child-thread"], + agentsStates: { "finished-child-thread": { status: "completed" } }, + }, + ], + }, + ], + }, + }; + }), + }; + + await asInternals(session).loadPersistedHistory(session.client); + + const history: AgentStreamEvent[] = []; + for await (const event of session.streamHistory()) { + history.push(event); + } + expect( + history.flatMap((event) => + event.type === "provider_subagent" && event.event.type === "upsert" ? [event.event] : [], + ), + ).toMatchObject([{ type: "upsert", id: "finished-child-thread", status: "completed" }]); + }); + test("loads mixed legacy and MultiAgentV2 sub-agent history", async () => { const session = createSession(); session.client = {