refactor: share exec approval request helper

This commit is contained in:
Peter Steinberger
2026-02-19 14:23:21 +00:00
parent 3179097a1f
commit 2581b67cdb
4 changed files with 148 additions and 45 deletions

View File

@@ -0,0 +1,81 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import {
DEFAULT_APPROVAL_REQUEST_TIMEOUT_MS,
DEFAULT_APPROVAL_TIMEOUT_MS,
} from "./bash-tools.exec-runtime.js";
vi.mock("./tools/gateway.js", () => ({
callGatewayTool: vi.fn(),
}));
describe("requestExecApprovalDecision", () => {
beforeEach(async () => {
const { callGatewayTool } = await import("./tools/gateway.js");
vi.mocked(callGatewayTool).mockReset();
});
it("returns string decisions", async () => {
const { requestExecApprovalDecision } = await import("./bash-tools.exec-approval-request.js");
const { callGatewayTool } = await import("./tools/gateway.js");
vi.mocked(callGatewayTool).mockResolvedValue({ decision: "allow-once" });
const result = await requestExecApprovalDecision({
id: "approval-id",
command: "echo hi",
cwd: "/tmp",
host: "gateway",
security: "allowlist",
ask: "always",
agentId: "main",
resolvedPath: "/usr/bin/echo",
sessionKey: "session",
});
expect(result).toBe("allow-once");
expect(callGatewayTool).toHaveBeenCalledWith(
"exec.approval.request",
{ timeoutMs: DEFAULT_APPROVAL_REQUEST_TIMEOUT_MS },
{
id: "approval-id",
command: "echo hi",
cwd: "/tmp",
host: "gateway",
security: "allowlist",
ask: "always",
agentId: "main",
resolvedPath: "/usr/bin/echo",
sessionKey: "session",
timeoutMs: DEFAULT_APPROVAL_TIMEOUT_MS,
},
);
});
it("returns null for missing or non-string decisions", async () => {
const { requestExecApprovalDecision } = await import("./bash-tools.exec-approval-request.js");
const { callGatewayTool } = await import("./tools/gateway.js");
vi.mocked(callGatewayTool).mockResolvedValueOnce({});
await expect(
requestExecApprovalDecision({
id: "approval-id",
command: "echo hi",
cwd: "/tmp",
host: "node",
security: "allowlist",
ask: "on-miss",
}),
).resolves.toBeNull();
vi.mocked(callGatewayTool).mockResolvedValueOnce({ decision: 123 });
await expect(
requestExecApprovalDecision({
id: "approval-id-2",
command: "echo hi",
cwd: "/tmp",
host: "node",
security: "allowlist",
ask: "on-miss",
}),
).resolves.toBeNull();
});
});