From 7c0bf382ba529602195d49ea2ea78df86483b285 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Wed, 21 Jan 2026 14:17:08 +0000 Subject: [PATCH] fix(ui): add permission actions for unresolved requests Render Allow/Deny buttons in the permissions control center fallback when a permission request cannot be linked to a tool-call, enabling responses for global permissions like doom_loop. --- .../components/permission-approval-modal.tsx | 95 +++++++++++++++++-- 1 file changed, 85 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/components/permission-approval-modal.tsx b/packages/ui/src/components/permission-approval-modal.tsx index 37250b44..60bd512a 100644 --- a/packages/ui/src/components/permission-approval-modal.tsx +++ b/packages/ui/src/components/permission-approval-modal.tsx @@ -7,6 +7,7 @@ import { getPermissionQueue, getQuestionQueue, getQuestionEnqueuedAtForInstance, + sendPermissionResponse, } from "../stores/instances" import { ensureSessionParentExpanded, loadMessages, sessions as sessionStateSessions, setActiveSessionFromList } from "../stores/sessions" import { messageStoreBus } from "../stores/message-v2/bus" @@ -130,6 +131,45 @@ function resolveToolCallFromQuestion(instanceId: string, request: QuestionReques const PermissionApprovalModal: Component = (props) => { const [loadingSession, setLoadingSession] = createSignal(null) + const [permissionSubmitting, setPermissionSubmitting] = createSignal>(new Set()) + const [permissionError, setPermissionError] = createSignal>(new Map()) + + const setPermissionBusy = (permissionId: string, busy: boolean) => { + setPermissionSubmitting((prev) => { + const next = new Set(prev) + if (busy) next.add(permissionId) + else next.delete(permissionId) + return next + }) + } + + const setPermissionItemError = (permissionId: string, message: string | null) => { + setPermissionError((prev) => { + const next = new Map(prev) + if (!message) next.delete(permissionId) + else next.set(permissionId, message) + return next + }) + } + + async function handlePermissionDecision(permission: PermissionRequestLike, response: "once" | "always" | "reject") { + const permissionId = permission?.id + if (!permissionId) return + + if (permissionSubmitting().has(permissionId)) return + + setPermissionBusy(permissionId, true) + setPermissionItemError(permissionId, null) + + try { + const sessionId = getPermissionSessionId(permission) || "" + await sendPermissionResponse(props.instanceId, sessionId, permissionId, response) + } catch (error) { + setPermissionItemError(permissionId, error instanceof Error ? error.message : "Unable to update permission") + } finally { + setPermissionBusy(permissionId, false) + } + } const permissionQueue = createMemo(() => getPermissionQueue(props.instanceId)) const questionQueue = createMemo(() => getQuestionQueue(props.instanceId)) @@ -304,17 +344,52 @@ const PermissionApprovalModal: Component = (props) - -
- {primaryTitle()} + +
+ {primaryTitle()} +
+ +
+
+ + + +
+
+ + {(err) =>
{err()}
} +
+
+ +
Load session for more information.
+
-
Load session for more information.
- - } - > + } + > {(data) => (