diff --git a/src/routes/chatStream.ts b/src/routes/chatStream.ts index 0a93c96..d85fe2f 100644 --- a/src/routes/chatStream.ts +++ b/src/routes/chatStream.ts @@ -24,6 +24,7 @@ import { isPermissionV2AskedEvent, isPermissionV2RepliedEvent, isQuestionAskedEvent, + isObjectRecord, isQuestionRejectedEvent, isQuestionRepliedEvent, isQuestionV2AskedEvent, @@ -84,6 +85,19 @@ type ProgressPayload = { detail?: string; }; +const getPermissionTarget = (metadata: unknown) => { + if (!isObjectRecord(metadata)) { + return undefined; + } + for (const key of ["command", "path", "file", "filepath", "directory"]) { + const value = metadata[key]; + if (typeof value === "string" && value.trim()) { + return value.trim(); + } + } + return undefined; +}; + const toRuntimeModel = (model?: SupportedModel) => { if (!model) { return undefined; @@ -398,7 +412,7 @@ export const streamPromptResponse = async ({ request_id: event.properties.id, permission: event.properties.permission, patterns: event.properties.patterns, - metadata: event.properties.metadata, + target: getPermissionTarget(event.properties.metadata), always: event.properties.always, tool: event.properties.tool, created_at: Date.now(), @@ -443,7 +457,7 @@ export const streamPromptResponse = async ({ request_id: event.properties.id, permission: event.properties.action, patterns: event.properties.resources, - metadata: event.properties.metadata ?? {}, + target: getPermissionTarget(event.properties.metadata), always: event.properties.save ?? [], tool: undefined, created_at: Date.now(), diff --git a/src/routes/chatStreamEvents.ts b/src/routes/chatStreamEvents.ts index e0090b3..55a7cef 100644 --- a/src/routes/chatStreamEvents.ts +++ b/src/routes/chatStreamEvents.ts @@ -8,7 +8,7 @@ export type PermissionRequestPayload = { request_id: string; permission: string; patterns: string[]; - metadata: Record; + target?: string; always: string[]; tool?: { messageID: string; diff --git a/src/routes/chatUiState.ts b/src/routes/chatUiState.ts index 38218d9..d7f89c1 100644 --- a/src/routes/chatUiState.ts +++ b/src/routes/chatUiState.ts @@ -204,7 +204,7 @@ export const toFrontendPermission = ( sessionId: payload.session_id, permission: payload.permission, patterns: payload.patterns, - metadata: payload.metadata, + target: payload.target, always: payload.always, tool: payload.tool, createdAt: payload.created_at, diff --git a/tests/routes/chatStream.test.ts b/tests/routes/chatStream.test.ts index 521e74b..6a39e84 100644 --- a/tests/routes/chatStream.test.ts +++ b/tests/routes/chatStream.test.ts @@ -56,7 +56,7 @@ describe("streamPromptResponse", () => { request_id: "perm-1", permission: "bash", patterns: ["rm *"], - metadata: { command: "rm tmp.txt" }, + target: "rm tmp.txt", always: ["rm *"], } satisfies Partial); }); @@ -157,7 +157,7 @@ describe("streamPromptResponse", () => { request_id: "perm-v2-1", permission: "external_directory", patterns: ["/tmp"], - metadata: { path: "/tmp" }, + target: "/tmp", always: ["/tmp"], } satisfies Partial); });