





















@@ -1170,72 +1170,69 @@ describe("runCodexAppServerAttempt", () => {
11701170);
11711171});
117211721173-it("starts active OpenClaw sandbox turns with Codex native execution disabled", async () => {
1174-const runtimeId = `codex-test-runtime-${path.basename(tempDir)}`;
1175-const restoreSandboxBackend = registerSandboxBackend("codex-test-sandbox", async () => ({
1176-id: "codex-test-sandbox",
1177- runtimeId,
1178-runtimeLabel: "Codex Test Sandbox",
1179-workdir: "/workspace",
1180-buildExecSpec: async () => ({
1181-argv: ["true"],
1182-env: {},
1183-stdinMode: "pipe-closed" as const,
1184-}),
1185-runShellCommand: async () => ({
1186-stdout: Buffer.alloc(0),
1187-stderr: Buffer.alloc(0),
1188-code: 0,
1189-}),
1190-}));
1191-try {
1192-testing.setOpenClawCodingToolsFactoryForTests(() => [
1193-createRuntimeDynamicTool("exec"),
1194-createRuntimeDynamicTool("process"),
1195-createRuntimeDynamicTool("message"),
1196-]);
1197-const sessionFile = path.join(tempDir, "session.jsonl");
1198-const workspaceDir = path.join(tempDir, "workspace");
1199-const params = createParams(sessionFile, workspaceDir);
1200-params.disableTools = false;
1201-params.runtimePlan = createCodexRuntimePlanFixture();
1202-params.config = {
1203-agents: {
1204-defaults: {
1205-sandbox: {
1206-mode: "all",
1207-backend: "codex-test-sandbox",
1208-scope: "session",
1209-workspaceAccess: "rw",
1210-prune: { idleHours: 0, maxAgeDays: 0 },
1211-},
1212-},
1213-},
1214-} as never;
1215-const { requests } = createStartedThreadHarness(async (method) =>
1216-method === "turn/start" ? turnStartResult("turn-1", "completed") : undefined,
1217-);
1173+it("starts active OpenClaw sandbox threads with Codex native execution disabled", async () => {
1174+testing.setOpenClawCodingToolsFactoryForTests(() => [
1175+createRuntimeDynamicTool("exec"),
1176+createRuntimeDynamicTool("process"),
1177+createRuntimeDynamicTool("message"),
1178+]);
1179+const sessionFile = path.join(tempDir, "session.jsonl");
1180+const workspaceDir = path.join(tempDir, "workspace");
1181+const params = createParams(sessionFile, workspaceDir);
1182+params.disableTools = false;
1183+params.runtimePlan = createCodexRuntimePlanFixture();
1184+const sandbox = {
1185+enabled: true,
1186+backendId: "codex-test-sandbox",
1187+workspaceAccess: "rw",
1188+} as never;
1189+const nativeToolSurfaceEnabled = testing.shouldEnableCodexAppServerNativeToolSurface(
1190+params,
1191+sandbox,
1192+);
1193+const dynamicTools = await testing.buildDynamicTools({
1194+ params,
1195+resolvedWorkspace: workspaceDir,
1196+effectiveWorkspace: workspaceDir,
1197+sandboxSessionKey: params.sessionKey!,
1198+ sandbox,
1199+ nativeToolSurfaceEnabled,
1200+runAbortController: new AbortController(),
1201+sessionAgentId: "main",
1202+pluginConfig: {},
1203+onYieldDetected: () => undefined,
1204+});
1205+const request = vi.fn(async (method: string) => {
1206+if (method === "thread/start") {
1207+return threadStartResult();
1208+}
1209+throw new Error(`unexpected method: ${method}`);
1210+});
121812111219-const run = runCodexAppServerAttempt(params, {
1220-pluginConfig: { appServer: { mode: "yolo" } },
1221-});
1222-await run;
1212+await startOrResumeThread({
1213+client: { request } as never,
1214+ params,
1215+cwd: workspaceDir,
1216+dynamicTools: dynamicTools as never,
1217+appServer: createThreadLifecycleAppServerOptions(),
1218+nativeCodeModeEnabled: nativeToolSurfaceEnabled,
1219+nativeCodeModeOnlyEnabled: false,
1220+userMcpServersEnabled: nativeToolSurfaceEnabled,
1221+environmentSelection: [],
1222+});
122312231224-const startRequest = requests.find((request) => request.method === "thread/start");
1225-const startParams = startRequest?.params as Record<string, unknown> | undefined;
1226-const startConfig = startParams?.config as Record<string, unknown> | undefined;
1227-const dynamicTools = startParams?.dynamicTools as Array<{ name: string }> | undefined;
1228-expect(startConfig?.["features.code_mode"]).toBe(false);
1229-expect(startConfig?.["features.code_mode_only"]).toBe(false);
1230-expect(startParams?.environments).toEqual([]);
1231-expect(dynamicTools?.map((tool) => tool.name)).toEqual([
1232-"message",
1233-"sandbox_exec",
1234-"sandbox_process",
1235-]);
1236-} finally {
1237-restoreSandboxBackend();
1238-}
1224+const startRequest = request.mock.calls.find(([method]) => method === "thread/start");
1225+const startParams = startRequest?.[1] as Record<string, unknown> | undefined;
1226+const startConfig = startParams?.config as Record<string, unknown> | undefined;
1227+const startDynamicTools = startParams?.dynamicTools as Array<{ name: string }> | undefined;
1228+expect(startConfig?.["features.code_mode"]).toBe(false);
1229+expect(startConfig?.["features.code_mode_only"]).toBe(false);
1230+expect(startParams?.environments).toEqual([]);
1231+expect(startDynamicTools?.map((tool) => tool.name)).toEqual([
1232+"message",
1233+"sandbox_exec",
1234+"sandbox_process",
1235+]);
12391236});
1240123712411238it("routes native Codex execution through an OpenClaw sandbox exec-server when opted in", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。