diff --git a/src/agents/bash-tools.exec.background-abort.test.ts b/src/agents/bash-tools.exec.background-abort.test.ts index 0e312e64687..71faf23b690 100644 --- a/src/agents/bash-tools.exec.background-abort.test.ts +++ b/src/agents/bash-tools.exec.background-abort.test.ts @@ -8,11 +8,11 @@ import { createExecTool } from "./bash-tools.exec.js"; import { killProcessTree } from "./shell-utils.js"; const BACKGROUND_HOLD_CMD = 'node -e "setTimeout(() => {}, 5000)"'; -const ABORT_SETTLE_MS = process.platform === "win32" ? 200 : 40; +const ABORT_SETTLE_MS = process.platform === "win32" ? 200 : 25; const ABORT_WAIT_TIMEOUT_MS = process.platform === "win32" ? 1_500 : 240; const POLL_INTERVAL_MS = 15; const FINISHED_WAIT_TIMEOUT_MS = process.platform === "win32" ? 8_000 : 600; -const BACKGROUND_TIMEOUT_SEC = process.platform === "win32" ? 0.2 : 0.08; +const BACKGROUND_TIMEOUT_SEC = process.platform === "win32" ? 0.2 : 0.05; const TEST_EXEC_DEFAULTS = { security: "full" as const, ask: "off" as const, @@ -151,7 +151,7 @@ test("background exec without explicit timeout ignores default timeout", async ( const result = await tool.execute("toolcall", { command: BACKGROUND_HOLD_CMD, background: true }); expect(result.details.status).toBe("running"); const sessionId = (result.details as { sessionId: string }).sessionId; - const waitMs = Math.max(ABORT_SETTLE_MS + 120, BACKGROUND_TIMEOUT_SEC * 1000 + 120); + const waitMs = Math.max(ABORT_SETTLE_MS + 80, BACKGROUND_TIMEOUT_SEC * 1000 + 80); const startedAt = Date.now(); await expect diff --git a/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts b/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts index 041684af6b1..5a883c7c6c4 100644 --- a/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts +++ b/src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts @@ -10,6 +10,12 @@ import { } from "./openclaw-tools.subagents.sessions-spawn.test-harness.js"; import { resetSubagentRegistryForTests } from "./subagent-registry.js"; +const fastModeEnv = vi.hoisted(() => { + const previous = process.env.OPENCLAW_TEST_FAST; + process.env.OPENCLAW_TEST_FAST = "1"; + return { previous }; +}); + vi.mock("./pi-embedded.js", () => ({ isEmbeddedPiRunActive: () => false, isEmbeddedPiRunStreaming: () => false, @@ -17,6 +23,10 @@ vi.mock("./pi-embedded.js", () => ({ waitForEmbeddedPiRunEnd: async () => true, })); +vi.mock("./tools/agent-step.js", () => ({ + readLatestAssistantReply: async () => "done", +})); + const callGatewayMock = getCallGatewayMock(); const RUN_TIMEOUT_SECONDS = 1; @@ -93,13 +103,7 @@ async function emitLifecycleEndAndFlush(params: { } describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { - let previousFastTestEnv: string | undefined; - beforeEach(() => { - if (previousFastTestEnv === undefined) { - previousFastTestEnv = process.env.OPENCLAW_TEST_FAST; - } - vi.stubEnv("OPENCLAW_TEST_FAST", "1"); resetSessionsSpawnConfigOverride(); setSessionsSpawnConfigOverride({ session: { @@ -117,11 +121,11 @@ describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { }); afterAll(() => { - if (previousFastTestEnv === undefined) { + if (fastModeEnv.previous === undefined) { delete process.env.OPENCLAW_TEST_FAST; return; } - process.env.OPENCLAW_TEST_FAST = previousFastTestEnv; + process.env.OPENCLAW_TEST_FAST = fastModeEnv.previous; }); it("sessions_spawn runs cleanup flow after subagent completion", async () => { @@ -151,19 +155,12 @@ describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { if (!child.runId) { throw new Error("missing child runId"); } - emitAgentEvent({ - runId: child.runId, - stream: "lifecycle", - data: { - phase: "end", - startedAt: 1000, - endedAt: 2000, - }, - }); - - await waitFor(() => ctx.waitCalls.some((call) => call.runId === child.runId)); - await waitFor(() => patchCalls.some((call) => call.label === "my-task")); - await waitFor(() => ctx.calls.filter((c) => c.method === "agent").length >= 2); + await waitFor( + () => + ctx.waitCalls.some((call) => call.runId === child.runId) && + patchCalls.some((call) => call.label === "my-task") && + ctx.calls.filter((call) => call.method === "agent").length >= 2, + ); const childWait = ctx.waitCalls.find((call) => call.runId === child.runId); expect(childWait?.timeoutMs).toBe(1000); @@ -216,8 +213,9 @@ describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { endedAt: 2345, }); - await waitFor(() => ctx.calls.filter((call) => call.method === "agent").length >= 2); - await waitFor(() => Boolean(deletedKey)); + await waitFor( + () => ctx.calls.filter((call) => call.method === "agent").length >= 2 && Boolean(deletedKey), + ); const childWait = ctx.waitCalls.find((call) => call.runId === child.runId); expect(childWait?.timeoutMs).toBe(1000); @@ -277,9 +275,12 @@ describe("openclaw-tools: subagents (sessions_spawn lifecycle)", () => { if (!child.runId) { throw new Error("missing child runId"); } - await waitFor(() => ctx.waitCalls.some((call) => call.runId === child.runId)); - await waitFor(() => ctx.calls.filter((call) => call.method === "agent").length >= 2); - await waitFor(() => Boolean(deletedKey)); + await waitFor( + () => + ctx.waitCalls.some((call) => call.runId === child.runId) && + ctx.calls.filter((call) => call.method === "agent").length >= 2 && + Boolean(deletedKey), + ); const childWait = ctx.waitCalls.find((call) => call.runId === child.runId); expect(childWait?.timeoutMs).toBe(1000);