diff --git a/src/server/routes/permission.ts b/src/server/routes/permission.ts index 5f36b35fa..d7af5e8a4 100644 --- a/src/server/routes/permission.ts +++ b/src/server/routes/permission.ts @@ -2,11 +2,63 @@ import { Hono } from 'hono' import type { SessionManager } from '../sessionManager.js' import { notFound } from '../errors.js' +const TOOL_NAME_TO_PERMISSION: Record = { + Read: 'read', + Edit: 'edit', + Write: 'edit', + Glob: 'glob', + Grep: 'grep', + LS: 'list', + Bash: 'bash', + PowerShell: 'bash', + Agent: 'task', + WebFetch: 'webfetch', + WebSearch: 'websearch', + TodoRead: 'todoread', + TodoWrite: 'todowrite', +} + +function extractPatterns(input: Record): string[] { + const patterns: string[] = [] + for (const key of ['file_path', 'path', 'pattern', 'glob'] as const) { + const v = typeof input[key] === 'string' ? input[key] as string : '' + if (v) patterns.push(v) + } + const cmd = typeof input.command === 'string' ? input.command as string : '' + if (cmd) patterns.push(cmd) + return patterns +} + +function toPermissionKey(toolName: string): string { + return TOOL_NAME_TO_PERMISSION[toolName] ?? toolName.toLowerCase() +} + +function formatPermission(perm: { + requestId: string + sessionId: string + toolName: string + toolUseId: string + input: Record +}) { + return { + id: perm.requestId, + sessionID: perm.sessionId, + permission: toPermissionKey(perm.toolName), + patterns: extractPatterns(perm.input), + metadata: { input: perm.input }, + always: [] as string[], + tool: { + messageID: '', + callID: perm.toolUseId, + }, + } +} + export function createPermissionRoutes(sessionManager: SessionManager): Hono { return new Hono() .get('/permission', c => { const permissions = sessionManager.getAllPendingPermissions() - return c.json({ permissions }) + return c.json({ permissions: permissions.map(formatPermission) }) }) .post('/permission/:requestID/reply', async c => { const requestId = c.req.param('requestID')