



























@@ -2854,10 +2854,9 @@ describe("runCodexAppServerAttempt", () => {
28542854},
28552855});
285628562857-await expect(run).resolves.toMatchObject({
2858-assistantTexts: [],
2859-toolMediaUrls: ["/tmp/codex-home/generated_images/session-1/ig_123.png"],
2860-});
2857+const result = await run;
2858+expect(result.assistantTexts).toEqual([]);
2859+expect(result.toolMediaUrls).toEqual(["/tmp/codex-home/generated_images/session-1/ig_123.png"]);
28612860});
2862286128632862it("does not complete on unscoped turn/completed notifications", async () => {
@@ -3717,9 +3716,11 @@ describe("runCodexAppServerAttempt", () => {
37173716approvalPolicy: "never",
37183717approvalsReviewer: "user",
37193718sandbox: "danger-full-access",
3720-developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
37213719persistExtendedHistory: true,
37223720});
3721+const resumeRequest = requests.find((request) => request.method === "thread/resume");
3722+const resumeRequestParams = resumeRequest?.params as Record<string, unknown> | undefined;
3723+expect(resumeRequestParams?.developerInstructions).toContain(CODEX_GPT5_BEHAVIOR_CONTRACT);
37233724});
3724372537253726it("resumes a bound Codex thread when only dynamic tool descriptions change", async () => {
@@ -4585,16 +4586,17 @@ describe("runCodexAppServerAttempt", () => {
45854586model: "gpt-5.4-codex",
45864587approvalPolicy: "on-request",
45874588approvalsReviewer: "guardian_subagent",
4588-config: expect.objectContaining({
4589-"features.codex_hooks": true,
4590-"features.code_mode": true,
4591-"features.code_mode_only": true,
4592-}),
45934589sandbox: "danger-full-access",
45944590serviceTier: "priority",
4595-developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
45964591persistExtendedHistory: true,
45974592});
4593+const resumeRequest = requests.find((request) => request.method === "thread/resume");
4594+const resumeRequestParams = resumeRequest?.params as Record<string, unknown> | undefined;
4595+const resumeConfig = resumeRequestParams?.config as Record<string, unknown> | undefined;
4596+expect(resumeConfig?.["features.codex_hooks"]).toBe(true);
4597+expect(resumeConfig?.["features.code_mode"]).toBe(true);
4598+expect(resumeConfig?.["features.code_mode_only"]).toBe(true);
4599+expect(resumeRequestParams?.developerInstructions).toContain(CODEX_GPT5_BEHAVIOR_CONTRACT);
45984600const turnRequest = requests.find((request) => request.method === "turn/start");
45994601const turnRequestParams = turnRequest?.params as Record<string, unknown> | undefined;
46004602expect(turnRequestParams?.approvalPolicy).toBe("on-request");
@@ -4687,7 +4689,8 @@ describe("runCodexAppServerAttempt", () => {
46874689serviceTier: "flex" as const,
46884690};
468946914690-expect(buildThreadResumeParams(params, { threadId: "thread-1", appServer })).toEqual({
4692+const resumeParams = buildThreadResumeParams(params, { threadId: "thread-1", appServer });
4693+expect(resumeParams).toEqual({
46914694threadId: "thread-1",
46924695model: "gpt-5.4-codex",
46934696approvalPolicy: "on-request",
@@ -4698,9 +4701,10 @@ describe("runCodexAppServerAttempt", () => {
46984701},
46994702sandbox: "danger-full-access",
47004703serviceTier: "flex",
4701-developerInstructions: expect.stringContaining(CODEX_GPT5_BEHAVIOR_CONTRACT),
4704+developerInstructions: resumeParams.developerInstructions,
47024705persistExtendedHistory: true,
47034706});
4707+expect(resumeParams.developerInstructions).toContain(CODEX_GPT5_BEHAVIOR_CONTRACT);
47044708const turnParams = buildTurnStartParams(params, {
47054709threadId: "thread-1",
47064710cwd: "/tmp/workspace",
@@ -4727,20 +4731,17 @@ describe("runCodexAppServerAttempt", () => {
47274731const params = createParams("/tmp/session.jsonl", "/tmp/workspace");
47284732params.trigger = "heartbeat";
472947334730-expect(buildTurnCollaborationMode(params)).toEqual({
4731-mode: "default",
4732-settings: {
4733-model: "gpt-5.4-codex",
4734-reasoning_effort: "medium",
4735-developer_instructions: expect.stringContaining(
4736-"This is an OpenClaw heartbeat turn. Apply these instructions only to this heartbeat wake",
4737-),
4738-},
4739-});
4740-expect(buildTurnCollaborationMode(params).settings.developer_instructions).toContain(
4734+const heartbeatCollaborationMode = buildTurnCollaborationMode(params);
4735+expect(heartbeatCollaborationMode.mode).toBe("default");
4736+expect(heartbeatCollaborationMode.settings.model).toBe("gpt-5.4-codex");
4737+expect(heartbeatCollaborationMode.settings.reasoning_effort).toBe("medium");
4738+expect(heartbeatCollaborationMode.settings.developer_instructions).toContain(
4739+"This is an OpenClaw heartbeat turn. Apply these instructions only to this heartbeat wake",
4740+);
4741+expect(heartbeatCollaborationMode.settings.developer_instructions).toContain(
47414742"Use heartbeats to create useful proactive progress",
47424743);
4743-expect(buildTurnCollaborationMode(params).settings.developer_instructions).toContain(
4744+expect(heartbeatCollaborationMode.settings.developer_instructions).toContain(
47444745"If `heartbeat_respond` is not already available and `tool_search` is available",
47454746);
47464747此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。