From d908a54fc476aeb1d2f21bb0275f139ac7f469b1 Mon Sep 17 00:00:00 2001 From: Dave Date: Thu, 26 Feb 2026 17:08:32 +0000 Subject: [PATCH] story-kit: merge 180_bug_web_ui_permissions_handling_unreliable --- frontend/src/components/Chat.tsx | 46 +++++++++++++++++++++----------- server/src/http/mcp.rs | 13 +++++---- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/frontend/src/components/Chat.tsx b/frontend/src/components/Chat.tsx index eb1c38a..d91cb9e 100644 --- a/frontend/src/components/Chat.tsx +++ b/frontend/src/components/Chat.tsx @@ -169,11 +169,13 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) { }); const [claudeSessionId, setClaudeSessionId] = useState(null); const [activityStatus, setActivityStatus] = useState(null); - const [permissionRequest, setPermissionRequest] = useState<{ - requestId: string; - toolName: string; - toolInput: Record; - } | null>(null); + const [permissionQueue, setPermissionQueue] = useState< + { + requestId: string; + toolName: string; + toolInput: Record; + }[] + >([]); const [isNarrowScreen, setIsNarrowScreen] = useState( window.innerWidth < NARROW_BREAKPOINT, ); @@ -320,7 +322,10 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) { setPipeline(state); }, onPermissionRequest: (requestId, toolName, toolInput) => { - setPermissionRequest({ requestId, toolName, toolInput }); + setPermissionQueue((prev) => [ + ...prev, + { requestId, toolName, toolInput }, + ]); }, onActivity: (toolName) => { setActivityStatus(formatToolActivity(toolName)); @@ -566,12 +571,10 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) { }; const handlePermissionResponse = (approved: boolean) => { - if (!permissionRequest) return; - wsRef.current?.sendPermissionResponse( - permissionRequest.requestId, - approved, - ); - setPermissionRequest(null); + const current = permissionQueue[0]; + if (!current) return; + wsRef.current?.sendPermissionResponse(current.requestId, approved); + setPermissionQueue((prev) => prev.slice(1)); }; const clearSession = async () => { @@ -975,7 +978,7 @@ export function Chat({ projectPath, onCloseProject }: ChatProps) { )} - {permissionRequest && ( + {permissionQueue.length > 0 && (

Permission Request + {permissionQueue.length > 1 && ( + + (+{permissionQueue.length - 1} queued) + + )}

The agent wants to use the{" "} - {permissionRequest.toolName} + {permissionQueue[0].toolName} {" "} tool. Do you approve?

- {Object.keys(permissionRequest.toolInput).length > 0 && ( + {Object.keys(permissionQueue[0].toolInput).length > 0 && (
-								{JSON.stringify(permissionRequest.toolInput, null, 2)}
+								{JSON.stringify(permissionQueue[0].toolInput, null, 2)}
 							
)}
Result Result