fix(permissions): require approval for ExitPlanMode in bypass mode (#1431)

Co-authored-by: Letta Code <noreply@letta.com>
This commit is contained in:
Devansh Jain
2026-03-18 12:06:45 -07:00
committed by GitHub
parent 87eff23b81
commit 36fca4d9d2
2 changed files with 41 additions and 1 deletions

View File

@@ -266,7 +266,11 @@ class PermissionModeManager {
: this.getPlanFilePath(); : this.getPlanFilePath();
switch (effectiveMode) { switch (effectiveMode) {
case "bypassPermissions": case "bypassPermissions":
// Auto-allow everything (except explicit deny rules checked earlier) // ExitPlanMode always requires human approval, even in yolo mode
if (toolName === "ExitPlanMode" || toolName === "exit_plan_mode") {
return null;
}
// Auto-allow everything else (except explicit deny rules checked earlier)
return "allow"; return "allow";
case "acceptEdits": case "acceptEdits":

View File

@@ -66,6 +66,42 @@ test("bypassPermissions mode - allows all tools", () => {
expect(writeResult.decision).toBe("allow"); expect(writeResult.decision).toBe("allow");
}); });
test("bypassPermissions mode - ExitPlanMode always requires approval", () => {
permissionMode.setMode("bypassPermissions");
const permissions: PermissionRules = {
allow: [],
deny: [],
ask: [],
};
// ExitPlanMode should NOT be auto-approved in yolo mode
const exitResult = checkPermission(
"ExitPlanMode",
{},
permissions,
"/Users/test/project",
);
expect(exitResult.decision).toBe("ask");
const exitSnakeResult = checkPermission(
"exit_plan_mode",
{},
permissions,
"/Users/test/project",
);
expect(exitSnakeResult.decision).toBe("ask");
// EnterPlanMode should still be auto-approved
const enterResult = checkPermission(
"EnterPlanMode",
{},
permissions,
"/Users/test/project",
);
expect(enterResult.decision).toBe("allow");
});
test("bypassPermissions mode - does NOT override deny rules", () => { test("bypassPermissions mode - does NOT override deny rules", () => {
permissionMode.setMode("bypassPermissions"); permissionMode.setMode("bypassPermissions");