






















@@ -2150,29 +2150,33 @@ describe("runCodexAppServerAttempt", () => {
21502150expect(llmInput).toHaveBeenCalledTimes(1);
21512151expect(llmOutput).toHaveBeenCalledTimes(1);
21522152expect(agentEnd).toHaveBeenCalledTimes(1);
2153-expect(llmOutput).toHaveBeenCalledWith(
2154-expect.objectContaining({
2155-assistantTexts: [],
2156-model: "gpt-5.4-codex",
2157-provider: "codex",
2158-resolvedRef: "codex/gpt-5.4-codex",
2159-harnessId: "codex",
2160-runId: "run-1",
2161-sessionId: "session-1",
2162-}),
2163-expect.any(Object),
2164-);
2165-expect(agentEnd).toHaveBeenCalledWith(
2166-expect.objectContaining({
2167-success: false,
2168-error: "turn start exploded",
2169-messages: expect.arrayContaining([
2170-expect.objectContaining({ role: "assistant" }),
2171-expect.objectContaining({ role: "user" }),
2172-]),
2173-}),
2174-expect.any(Object),
2175-);
2153+const [llmOutputPayload] = llmOutput.mock.calls[0] as unknown as [
2154+{
2155+assistantTexts?: string[];
2156+harnessId?: string;
2157+model?: string;
2158+provider?: string;
2159+resolvedRef?: string;
2160+runId?: string;
2161+sessionId?: string;
2162+},
2163+unknown,
2164+];
2165+expect(llmOutputPayload.assistantTexts).toEqual([]);
2166+expect(llmOutputPayload.model).toBe("gpt-5.4-codex");
2167+expect(llmOutputPayload.provider).toBe("codex");
2168+expect(llmOutputPayload.resolvedRef).toBe("codex/gpt-5.4-codex");
2169+expect(llmOutputPayload.harnessId).toBe("codex");
2170+expect(llmOutputPayload.runId).toBe("run-1");
2171+expect(llmOutputPayload.sessionId).toBe("session-1");
2172+const [agentEndPayload] = agentEnd.mock.calls[0] as unknown as [
2173+{ error?: string; messages?: Array<{ role?: string }>; success?: boolean },
2174+unknown,
2175+];
2176+expect(agentEndPayload.success).toBe(false);
2177+expect(agentEndPayload.error).toBe("turn start exploded");
2178+expect(agentEndPayload.messages?.some((message) => message.role === "assistant")).toBe(true);
2179+expect(agentEndPayload.messages?.some((message) => message.role === "user")).toBe(true);
21762180});
2177218121782182it("fires agent_end with success false when the codex turn is aborted", async () => {
@@ -2192,12 +2196,8 @@ describe("runCodexAppServerAttempt", () => {
21922196const result = await run;
21932197expect(result.aborted).toBe(true);
21942198expect(agentEnd).toHaveBeenCalledTimes(1);
2195-expect(agentEnd).toHaveBeenCalledWith(
2196-expect.objectContaining({
2197-success: false,
2198-}),
2199-expect.any(Object),
2200-);
2199+const [agentEndPayload] = agentEnd.mock.calls[0] as unknown as [{ success?: boolean }, unknown];
2200+expect(agentEndPayload.success).toBe(false);
22012201});
2202220222032203it("forwards queued user input and aborts the active app-server turn", async () => {
@@ -2221,32 +2221,29 @@ describe("runCodexAppServerAttempt", () => {
2221222122222222const result = await run;
22232223expect(result.aborted).toBe(true);
2224-expect(requests).toEqual(
2225-expect.arrayContaining([
2226-{
2227-method: "thread/start",
2228-params: expect.objectContaining({
2229-model: "gpt-5.4-codex",
2230-approvalPolicy: "never",
2231-sandbox: "danger-full-access",
2232-approvalsReviewer: "user",
2233-developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
2234-}),
2235-},
2236-{
2237-method: "turn/steer",
2238-params: {
2239-threadId: "thread-1",
2240-expectedTurnId: "turn-1",
2241-input: [{ type: "text", text: "more context", text_elements: [] }],
2242-},
2243-},
2244-{
2245-method: "turn/interrupt",
2246-params: { threadId: "thread-1", turnId: "turn-1" },
2247-},
2248-]),
2249-);
2224+const threadStart = requests.find((entry) => entry.method === "thread/start");
2225+const threadStartParams = threadStart?.params as
2226+| {
2227+approvalPolicy?: string;
2228+approvalsReviewer?: string;
2229+developerInstructions?: string;
2230+model?: string;
2231+sandbox?: string;
2232+}
2233+| undefined;
2234+expect(threadStartParams?.model).toBe("gpt-5.4-codex");
2235+expect(threadStartParams?.approvalPolicy).toBe("never");
2236+expect(threadStartParams?.sandbox).toBe("danger-full-access");
2237+expect(threadStartParams?.approvalsReviewer).toBe("user");
2238+expect(threadStartParams?.developerInstructions).toContain(CODEX_GPT5_BEHAVIOR_CONTRACT);
2239+const steer = requests.find((entry) => entry.method === "turn/steer");
2240+expect(steer?.params).toEqual({
2241+threadId: "thread-1",
2242+expectedTurnId: "turn-1",
2243+input: [{ type: "text", text: "more context", text_elements: [] }],
2244+});
2245+const interrupt = requests.find((entry) => entry.method === "turn/interrupt");
2246+expect(interrupt?.params).toEqual({ threadId: "thread-1", turnId: "turn-1" });
22502247});
2251224822522249it("batches default queued steering before sending turn/steer", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。