























@@ -10,6 +10,8 @@ const ensurePathMock = vi.hoisted(() => vi.fn());
1010const assertRuntimeMock = vi.hoisted(() => vi.fn());
1111const closeActiveMemorySearchManagersMock = vi.hoisted(() => vi.fn(async () => {}));
1212const hasMemoryRuntimeMock = vi.hoisted(() => vi.fn(() => false));
13+const listAgentHarnessIdsMock = vi.hoisted(() => vi.fn((): string[] => []));
14+const disposeRegisteredAgentHarnessesMock = vi.hoisted(() => vi.fn(async () => {}));
1315const ensureTaskRegistryReadyMock = vi.hoisted(() => vi.fn());
1416const startTaskRegistryMaintenanceMock = vi.hoisted(() => vi.fn());
1517const outputRootHelpMock = vi.hoisted(() => vi.fn());
@@ -120,6 +122,11 @@ vi.mock("../plugins/memory-state.js", () => ({
120122hasMemoryRuntime: hasMemoryRuntimeMock,
121123}));
122124125+vi.mock("../agents/harness/registry.js", () => ({
126+listAgentHarnessIds: listAgentHarnessIdsMock,
127+disposeRegisteredAgentHarnesses: disposeRegisteredAgentHarnessesMock,
128+}));
129+123130vi.mock("../tasks/task-registry.js", () => ({
124131ensureTaskRegistryReady: ensureTaskRegistryReadyMock,
125132}));
@@ -216,6 +223,7 @@ describe("runCli exit behavior", () => {
216223beforeEach(() => {
217224vi.clearAllMocks();
218225hasMemoryRuntimeMock.mockReturnValue(false);
226+listAgentHarnessIdsMock.mockReturnValue([]);
219227outputPrecomputedBrowserHelpTextMock.mockReturnValue(false);
220228outputPrecomputedRootHelpTextMock.mockReturnValue(false);
221229hasEnvHttpProxyAgentConfiguredMock.mockReturnValue(false);
@@ -242,12 +250,28 @@ describe("runCli exit behavior", () => {
242250expect(maybeRunCliInContainerMock).toHaveBeenCalledWith(["node", "openclaw", "status"]);
243251expect(tryRouteCliMock).toHaveBeenCalledWith(["node", "openclaw", "status"]);
244252expect(closeActiveMemorySearchManagersMock).not.toHaveBeenCalled();
253+expect(disposeRegisteredAgentHarnessesMock).not.toHaveBeenCalled();
245254expect(ensureTaskRegistryReadyMock).not.toHaveBeenCalled();
246255expect(startTaskRegistryMaintenanceMock).not.toHaveBeenCalled();
247256expect(exitSpy).not.toHaveBeenCalled();
248257exitSpy.mockRestore();
249258});
250259260+it("disposes registered harnesses after full CLI command completion", async () => {
261+listAgentHarnessIdsMock.mockReturnValueOnce(["codex"]);
262+tryRouteCliMock.mockResolvedValueOnce(false);
263+const parseAsync = vi.fn().mockResolvedValueOnce(undefined);
264+buildProgramMock.mockReturnValueOnce({
265+commands: [{ name: () => "agent", aliases: () => [] }],
266+ parseAsync,
267+});
268+269+await runCli(["node", "openclaw", "agent", "--local"]);
270+271+expect(parseAsync).toHaveBeenCalledWith(["node", "openclaw", "agent", "--local"]);
272+expect(disposeRegisteredAgentHarnessesMock).toHaveBeenCalledTimes(1);
273+});
274+251275it("pauses non-tty stdin after full CLI command completion", async () => {
252276tryRouteCliMock.mockResolvedValueOnce(false);
253277const parseAsync = vi.fn().mockResolvedValueOnce(undefined);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。