/**
* Permission Modes — control tool access levels
*
* Extracted from agent-loop.ts for single-responsibility.
* All consumers should import from agent-loop.ts (re-export facade).
*/
import { loadConfig, updateConfig } from "./config-store.js";
export type PermissionMode = "default" | "plan" | "yolo";
/** CLI-only: current permission mode */
let activePermissionMode: PermissionMode = "default";
// Load persisted permission mode on import
try {
const cfg = loadConfig();
if (cfg.permission_mode && ["default", "plan", "yolo"].includes(cfg.permission_mode)) {
activePermissionMode = cfg.permission_mode as PermissionMode;
}
} catch { /* use default */ }
// Tools allowed in plan mode
const PLAN_MODE_TOOLS = new Set([
"read_file", "list_directory", "search_files", "search_content",
"glob", "grep", "web_fetch", "web_search", "task", "task_output",
"bash_output", "list_shells", "tasks", "config", "ask_user",
// Interactive tools (read-only by nature)
"ask_user_question", "enter_plan_mode", "exit_plan_mode",
]);
export function setPermissionMode(mode: PermissionMode): { success: boolean; message: string } {
activePermissionMode = mode;
try { updateConfig({ permission_mode: mode }); } catch { /* best effort */ }
return { success: true, message: `Permission mode: ${mode}` };
}
export function getPermissionMode(): PermissionMode {
return activePermissionMode;
}
export function isToolAllowedByPermission(toolName: string): boolean {
switch (activePermissionMode) {
case "yolo": return true;
case "plan": return PLAN_MODE_TOOLS.has(toolName);
case "default": return true; // Default allows all — UI can prompt for confirmation
}
}