From 0393ce927deb9a32288df98772d016fafa7ce199 Mon Sep 17 00:00:00 2001 From: DoSun Date: Sat, 9 May 2026 11:18:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20GET=20/permission=20=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=AF=B9=E9=BD=90=E5=89=8D=E7=AB=AF=20Permis?= =?UTF-8?q?sionRequest=20=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 工具名 PascalCase 映射为小写 permission key(匹配 i18n) - 从 tool input 提取 patterns(file_path/command 等) - 补齐 sessionID/id/tool/callID/metadata/always 字段 --- src/server/routes/permission.ts | 54 ++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) 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')