












@@ -49,6 +49,10 @@ import {
4949resolveCodexAppServerRuntimeOptions,
5050resolveCodexPluginsPolicy,
5151} from "./config.js";
52+import {
53+emitDynamicToolStartedDiagnostic,
54+emitDynamicToolTerminalDiagnostic,
55+} from "./dynamic-tool-diagnostics.js";
5256import {
5357CODEX_OPENCLAW_DYNAMIC_TOOL_NAMESPACE,
5458createCodexDynamicToolBridge,
@@ -63,7 +67,7 @@ import {
6367resolveCodexPluginAppCacheEndpoint,
6468} from "./plugin-app-cache-key.js";
6569import { buildCodexPluginThreadConfig } from "./plugin-thread-config.js";
66-import type { CodexServerNotification } from "./protocol.js";
70+import type { CodexDynamicToolCallParams, CodexServerNotification } from "./protocol.js";
6771import {
6872readRecentCodexRateLimits,
6973rememberCodexRateLimits,
@@ -3170,54 +3174,40 @@ describe("runCodexAppServerAttempt", () => {
31703174expect(activeDiagnosticToolKeys(diagnosticEvents)).toEqual(new Set());
31713175});
317231763173-it("clears dynamic tool diagnostics after successful app-server tool responses", async () => {
3174-const harness = createStartedThreadHarness();
3177+it("clears dynamic tool diagnostics after successful terminal responses", async () => {
31753178const diagnosticEvents: DiagnosticEventPayload[] = [];
31763179const unsubscribeDiagnostics = onInternalDiagnosticEvent((event) =>
31773180diagnosticEvents.push(event),
31783181);
3179-testing.setOpenClawCodingToolsFactoryForTests(() => [createRuntimeDynamicTool("echo")]);
3180-3181-const params = createParams(
3182-path.join(tempDir, "session.jsonl"),
3183-path.join(tempDir, "workspace"),
3184-);
3185-const abortController = new AbortController();
3186-params.abortSignal = abortController.signal;
3187-params.disableTools = false;
3188-params.runtimePlan = createCodexRuntimePlanFixture();
3189-3190-const run = runCodexAppServerAttempt(params);
3191-void run.catch(() => undefined);
3192-let runSettled = false;
3193-let diagnosticsSubscribed = true;
31943182try {
3195-await harness.waitForMethod("thread/start", 10_000);
3183+const call = {
3184+threadId: "thread-1",
3185+turnId: "turn-1",
3186+callId: "call-echo-1",
3187+namespace: null,
3188+tool: "echo",
3189+arguments: {},
3190+} satisfies CodexDynamicToolCallParams;
319631913197-const toolResult = (await harness.handleServerRequest({
3198-id: "request-echo-tool",
3199-method: "item/tool/call",
3200-params: {
3201-threadId: "thread-1",
3202-turnId: "turn-1",
3203-callId: "call-echo-1",
3204-namespace: null,
3205-tool: "echo",
3206-arguments: {},
3192+emitDynamicToolStartedDiagnostic({
3193+ call,
3194+runId: "run-1",
3195+sessionId: "session-1",
3196+sessionKey: "agent:main:session-1",
3197+});
3198+emitDynamicToolTerminalDiagnostic({
3199+ call,
3200+runId: "run-1",
3201+sessionId: "session-1",
3202+sessionKey: "agent:main:session-1",
3203+durationMs: 1,
3204+response: {
3205+success: true,
3206+contentItems: [{ type: "inputText", text: "echo done" }],
32073207},
3208-})) as {
3209-contentItems?: Array<{ text?: string; type?: string }>;
3210-success?: boolean;
3211-};
3212-3213-expect(toolResult.success).toBe(true);
3214-expect(toolResult.contentItems?.[0]).toEqual({
3215-type: "inputText",
3216-text: "echo done",
32173208});
3209+32183210await flushDiagnosticEvents();
3219-unsubscribeDiagnostics();
3220-diagnosticsSubscribed = false;
3221321132223212const toolDiagnosticEvents = diagnosticEvents.filter(
32233213(
@@ -3248,22 +3238,8 @@ describe("runCodexAppServerAttempt", () => {
32483238toolDiagnosticEventSummaries.filter((event) => event.type === "tool.execution.started"),
32493239).toHaveLength(1);
32503240expect(activeDiagnosticToolKeys(diagnosticEvents)).toEqual(new Set());
3251-3252-harness.close();
3253-abortController.abort(new Error("test complete"));
3254-await drainPromiseForTest(run, 10_000, "Codex diagnostic test run cleanup");
3255-runSettled = true;
32563241} finally {
3257-if (diagnosticsSubscribed) {
3258-unsubscribeDiagnostics();
3259-}
3260-if (!runSettled) {
3261-harness.close();
3262-abortController.abort(new Error("test cleanup"));
3263-await drainPromiseForTest(run, 1_000, "Codex diagnostic test failure cleanup").catch(
3264-() => undefined,
3265-);
3266-}
3242+unsubscribeDiagnostics();
32673243}
32683244});
32693245此內容由慣性聚合(RSS閱讀器)自動聚合整理,僅供閱讀參考。 原文來自 — 版權歸原作者所有。