diff --git a/src/agents/bash-tools.exec.approval-id.e2e.test.ts b/src/agents/bash-tools.exec.approval-id.e2e.test.ts index 4da098c6a..527e45fa5 100644 --- a/src/agents/bash-tools.exec.approval-id.e2e.test.ts +++ b/src/agents/bash-tools.exec.approval-id.e2e.test.ts @@ -44,23 +44,14 @@ describe("exec approvals", () => { it("reuses approval id as the node runId", async () => { const { callGatewayTool } = await import("./tools/gateway.js"); let invokeParams: unknown; - let resolveInvoke: (() => void) | undefined; - const invokeSeen = new Promise((resolve) => { - resolveInvoke = resolve; - }); vi.mocked(callGatewayTool).mockImplementation(async (method, _opts, params) => { if (method === "exec.approval.request") { - // Return registration confirmation (status: "accepted") - return { status: "accepted", id: (params as { id?: string })?.id }; - } - if (method === "exec.approval.waitDecision") { - // Return the decision when waitDecision is called + // Approval request now carries the decision directly. return { decision: "allow-once" }; } if (method === "node.invoke") { invokeParams = params; - resolveInvoke?.(); return { ok: true }; } return { ok: true }; @@ -77,10 +68,12 @@ describe("exec approvals", () => { expect(result.details.status).toBe("approval-pending"); const approvalId = (result.details as { approvalId: string }).approvalId; - await invokeSeen; - - const runId = (invokeParams as { params?: { runId?: string } } | undefined)?.params?.runId; - expect(runId).toBe(approvalId); + await expect + .poll(() => (invokeParams as { params?: { runId?: string } } | undefined)?.params?.runId, { + timeout: 2000, + interval: 20, + }) + .toBe(approvalId); }); it("skips approval when node allowlist is satisfied", async () => { diff --git a/src/agents/bash-tools.exec.pty-fallback.e2e.test.ts b/src/agents/bash-tools.exec.pty-fallback.e2e.test.ts index ec1669b97..9aa42a4c4 100644 --- a/src/agents/bash-tools.exec.pty-fallback.e2e.test.ts +++ b/src/agents/bash-tools.exec.pty-fallback.e2e.test.ts @@ -1,22 +1,21 @@ import { afterEach, expect, test, vi } from "vitest"; import { resetProcessRegistryForTests } from "./bash-process-registry"; -import { createExecTool, setPtyModuleLoaderForTests } from "./bash-tools.exec"; +import { createExecTool } from "./bash-tools.exec"; + +vi.mock("@lydell/node-pty", () => ({ + spawn: () => { + const err = new Error("spawn EBADF"); + (err as NodeJS.ErrnoException).code = "EBADF"; + throw err; + }, +})); afterEach(() => { resetProcessRegistryForTests(); - setPtyModuleLoaderForTests(); vi.clearAllMocks(); }); test("exec falls back when PTY spawn fails", async () => { - setPtyModuleLoaderForTests(async () => ({ - spawn: () => { - const err = new Error("spawn EBADF"); - (err as NodeJS.ErrnoException).code = "EBADF"; - throw err; - }, - })); - const tool = createExecTool({ allowBackground: false }); const result = await tool.execute("toolcall", { command: "printf ok",