mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-10-26 10:45:22 +00:00
refactor(permission-system): simplify policy and autoreview flow
This commit is contained in:
@@ -292,86 +292,6 @@ describe("handleToolCall — bash command chain gate", () => {
|
||||
});
|
||||
});
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Moved from permission-system.test.ts catch-all (#342)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
describe("handleToolCall — bash external-directory policy states", () => {
|
||||
it("allows bash command with only internal paths when external_directory is denied", async () => {
|
||||
const { handler } = makeHandler({ tools: ["bash"] });
|
||||
const event = makeToolCallEvent("bash", {
|
||||
input: { command: "cat src/index.ts" },
|
||||
});
|
||||
const result = await handler.handleToolCall(event, makeCtx());
|
||||
expect(result).toEqual({ action: "allow" });
|
||||
});
|
||||
|
||||
it("blocks bash command with external path when external_directory is ask and no UI", async () => {
|
||||
const { handler } = makeHandler({
|
||||
session: {
|
||||
checkPermission: makeSurfaceCheck({
|
||||
external_directory: { state: "ask", source: "special" },
|
||||
}),
|
||||
},
|
||||
tools: ["bash"],
|
||||
prompter: {
|
||||
escalate: vi.fn().mockResolvedValue({
|
||||
approved: false,
|
||||
state: "denied",
|
||||
confirmationUnavailable: true,
|
||||
}),
|
||||
},
|
||||
});
|
||||
const event = makeToolCallEvent("bash", {
|
||||
input: { command: "cat /etc/hosts" },
|
||||
});
|
||||
const result = await handler.handleToolCall(
|
||||
event,
|
||||
makeCtx({ hasUI: false }),
|
||||
);
|
||||
expect(result).toMatchObject({ action: "block" });
|
||||
expect(String((result as { reason?: unknown }).reason)).toMatch(
|
||||
/no interactive UI/i,
|
||||
);
|
||||
});
|
||||
|
||||
it("allows bash command with external path when external_directory is allow", async () => {
|
||||
const { handler } = makeHandler({
|
||||
session: {
|
||||
checkPermission: makeSurfaceCheck({
|
||||
external_directory: { state: "allow", source: "special" },
|
||||
}),
|
||||
},
|
||||
tools: ["bash"],
|
||||
});
|
||||
const event = makeToolCallEvent("bash", {
|
||||
input: { command: "cat /etc/hosts" },
|
||||
});
|
||||
const result = await handler.handleToolCall(event, makeCtx());
|
||||
expect(result).toEqual({ action: "allow" });
|
||||
});
|
||||
|
||||
it("applies bash pattern deny after external_directory allow", async () => {
|
||||
const { handler } = makeHandler({
|
||||
session: {
|
||||
checkPermission: makeSurfaceCheck(
|
||||
{
|
||||
external_directory: { state: "allow", source: "special" },
|
||||
bash: { state: "deny", source: "bash" },
|
||||
},
|
||||
{ state: "allow" },
|
||||
),
|
||||
},
|
||||
tools: ["bash"],
|
||||
});
|
||||
const event = makeToolCallEvent("bash", {
|
||||
input: { command: "cat /etc/hosts" },
|
||||
});
|
||||
const result = await handler.handleToolCall(event, makeCtx());
|
||||
expect(result).toMatchObject({ action: "block" });
|
||||
});
|
||||
});
|
||||
|
||||
describe("handleToolCall — generic ask prompt content", () => {
|
||||
it("ask prompt includes serialized tool input for informed approval", async () => {
|
||||
const { handler, prompter } = makeHandler({
|
||||
|
||||
Reference in New Issue
Block a user