diff --git a/extensions/codex/src/app-server/schema-normalization-runtime-contract.test.ts b/extensions/codex/src/app-server/schema-normalization-runtime-contract.test.ts index b66a9bd69c4..b63143d8882 100644 --- a/extensions/codex/src/app-server/schema-normalization-runtime-contract.test.ts +++ b/extensions/codex/src/app-server/schema-normalization-runtime-contract.test.ts @@ -8,6 +8,7 @@ import { normalizedParameterFreeSchema, } from "openclaw/plugin-sdk/agent-runtime-test-contracts"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import type { CodexThreadStartParams } from "./protocol.js"; import { createCodexTestModel } from "./test-support.js"; import { startOrResumeThread } from "./thread-lifecycle.js"; @@ -118,12 +119,24 @@ describe("Codex app-server dynamic tool schema boundary contract", () => { appServer: createAppServerOptions(), }); - expect(request).toHaveBeenCalledWith( - "thread/start", - expect.objectContaining({ - dynamicTools: [dynamicTool], - }), - ); + expect(request).toHaveBeenCalledTimes(1); + const [method, payload] = request.mock.calls[0] ?? []; + if (method !== "thread/start") { + throw new Error(`expected thread/start request, got ${String(method)}`); + } + const startPayload = payload as CodexThreadStartParams | undefined; + expect(startPayload?.dynamicTools).toStrictEqual([dynamicTool]); + expect(startPayload?.cwd).toBe(workspaceDir); + expect(startPayload?.model).toBe("gpt-5.4"); + expect(startPayload?.modelProvider).toBeUndefined(); + expect(startPayload?.approvalPolicy).toBe("never"); + expect(startPayload?.approvalsReviewer).toBe("user"); + expect(startPayload?.sandbox).toBe("workspace-write"); + expect(startPayload?.serviceName).toBe("OpenClaw"); + expect(startPayload?.experimentalRawEvents).toBe(true); + expect(startPayload?.persistExtendedHistory).toBe(true); + expect(typeof startPayload?.developerInstructions).toBe("string"); + expect(startPayload?.developerInstructions).toContain("OpenClaw"); }); it("accepts Codex app-server priority service tier responses", async () => {