
























@@ -2319,58 +2319,25 @@ describe("runCodexAppServerAttempt", () => {
23192319expect(dynamicToolNames).toEqual(["message"]);
23202320});
232123212322-it("keeps searchable OpenClaw dynamic tools when code-mode-only is enabled", async () => {
2323-testing.setOpenClawCodingToolsFactoryForTests(() => [
2322+it("keeps searchable OpenClaw dynamic tools when code-mode-only is enabled", () => {
2323+const tools = [
23242324createRuntimeDynamicTool("message"),
23252325createRuntimeDynamicTool("web_search"),
23262326createRuntimeDynamicTool("heartbeat_respond"),
23272327createRuntimeDynamicTool("sessions_spawn"),
23282328createRuntimeDynamicTool("sessions_yield"),
2329-]);
2330-const workspaceDir = path.join(tempDir, "workspace");
2331-const params = createParams(path.join(tempDir, "session.jsonl"), workspaceDir);
2332-params.disableTools = false;
2333-params.runtimePlan = createCodexRuntimePlanFixture();
2334-params.sourceReplyDeliveryMode = "message_tool_only";
2335-const dynamicTools = await buildDynamicToolsForTest(params, workspaceDir, {
2336-forceHeartbeatTool: true,
2337-ignoreRuntimePlan: true,
2338-});
2329+];
23392330const toolBridge = createCodexDynamicToolBridge({
2340-tools: dynamicTools,
2331+ tools,
23412332signal: new AbortController().signal,
23422333directToolNames: ["message"],
23432334});
2344-const request = vi.fn(async (method: string, _params?: unknown) => {
2345-if (method === "thread/start") {
2346-return threadStartResult();
2347-}
2348-throw new Error(`unexpected method: ${method}`);
2349-});
2350-2351-await startOrResumeThread({
2352-client: { request } as never,
2353- params,
2354-cwd: workspaceDir,
2355-dynamicTools: toolBridge.specs,
2356-appServer: { ...createThreadLifecycleAppServerOptions(), codeModeOnly: true },
2357-nativeCodeModeEnabled: true,
2358-nativeCodeModeOnlyEnabled: true,
2359-userMcpServersEnabled: true,
2360-environmentSelection: [],
2361-});
236223352363-const startRequest = request.mock.calls.find(([method]) => method === "thread/start");
2364-const startDynamicTools =
2365-(startRequest?.[1] as { dynamicTools?: Array<Record<string, unknown>> } | undefined)
2366-?.dynamicTools ?? [];
2367-const startConfig = (startRequest?.[1] as { config?: Record<string, unknown> } | undefined)
2368-?.config;
2369-const message = startDynamicTools.find((tool) => tool.name === "message");
2370-const webSearch = startDynamicTools.find((tool) => tool.name === "web_search");
2371-const heartbeat = startDynamicTools.find((tool) => tool.name === "heartbeat_respond");
2372-const sessionsSpawn = startDynamicTools.find((tool) => tool.name === "sessions_spawn");
2373-const sessionsYield = startDynamicTools.find((tool) => tool.name === "sessions_yield");
2336+const message = toolBridge.specs.find((tool) => tool.name === "message");
2337+const webSearch = toolBridge.specs.find((tool) => tool.name === "web_search");
2338+const heartbeat = toolBridge.specs.find((tool) => tool.name === "heartbeat_respond");
2339+const sessionsSpawn = toolBridge.specs.find((tool) => tool.name === "sessions_spawn");
2340+const sessionsYield = toolBridge.specs.find((tool) => tool.name === "sessions_yield");
2374234123752342expect(message).not.toHaveProperty("namespace");
23762343expect(message).not.toHaveProperty("deferLoading");
@@ -2382,8 +2349,6 @@ describe("runCodexAppServerAttempt", () => {
23822349expect(sessionsSpawn?.deferLoading).toBe(true);
23832350expect(sessionsYield).not.toHaveProperty("namespace");
23842351expect(sessionsYield).not.toHaveProperty("deferLoading");
2385-expect(startConfig?.["features.code_mode"]).toBe(true);
2386-expect(startConfig?.["features.code_mode_only"]).toBe(true);
23872352});
2388235323892354it("registers heartbeat response durably without advertising it on normal turns", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。