From a38d5b1279db6f9de5228c173019fc2ac08daec3 Mon Sep 17 00:00:00 2001 From: Adam Malczewski Date: Tue, 19 May 2026 23:20:41 +0900 Subject: feat: Phase 2 — shell permissions, tree-sitter analysis, permission UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Permission engine: - Rule-based engine: wildcard matching, last-match-wins, reject cascade - PermissionService with pending/approved state, PermissionChecker interface - dispatch.yaml config loader with per-permission pattern rules Shell tool: - run_shell tool with child_process spawn, timeout, streaming output - Tree-sitter static analysis (web-tree-sitter + tree-sitter-bash WASM) - BashArity command normalization for 'always allow' patterns - FILE_COMMANDS set: rm, cp, mv, mkdir, ls, find, grep, cat, etc. Agent loop refactored: - Removed maxSteps, manual step loop with tool execution - Permission checks on shell commands (external_directory only) - Permission checks on file tools outside workspace boundary - Symlink bypass fix (realpathSync), .. false positive fix - Shell output streaming via Promise.race + setImmediate polling API layer: - PermissionManager wraps PermissionService, broadcasts via WebSocket - WebSocket handles permission-reply messages from frontend - Config loaded from dispatch.yaml, converted to ruleset Frontend: - Permission prompt modal (native dialog, focus trap, ARIA) - Always-allow confirmation flow with pattern preview - Shell output display (live streaming + final parsed result) - Permission log panel (fixed bottom-right overlay) - Exit code badge (green 0, red non-zero) 134 tests, typecheck clean on all 3 packages --- packages/api/src/app.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'packages/api/src/app.ts') diff --git a/packages/api/src/app.ts b/packages/api/src/app.ts index 9c31eab..b612c6a 100644 --- a/packages/api/src/app.ts +++ b/packages/api/src/app.ts @@ -1,8 +1,10 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; import { AgentManager } from "./agent-manager.js"; +import { PermissionManager } from "./permission-manager.js"; -export const agentManager = new AgentManager(); +export const permissionManager = new PermissionManager(); +export const agentManager = new AgentManager(permissionManager); export const app = new Hono(); -- cgit v1.2.3