From 9e1e16feb2dd8c853aa8af201ed8642f41bc4b01 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Sat, 16 May 2026 19:14:24 +0100 Subject: [PATCH 1/2] fix(ui): surface pending interruptions Auto-open the permission/question center when an active instance receives pending interruptions so an earlier permission cannot remain hidden while a later question shows Waiting for earlier responses. Keep question message-store attachments deduplicated when a request moves from a global fallback entry to a resolved tool part, and order active question state by enqueue time to match the permission flow. Queued permission actions are disabled to preserve the same active-interruption ordering as questions. Validation: npm run typecheck --workspace @codenomad/ui; node --import tsx --test packages/ui/src/stores/message-v2/instance-store.test.ts --- .../components/instance/instance-shell2.tsx | 19 +++++++++-- .../components/permission-approval-modal.tsx | 6 ++-- .../components/tool-call/permission-block.tsx | 6 ++-- .../stores/message-v2/instance-store.test.ts | 33 +++++++++++++++++++ .../src/stores/message-v2/instance-store.ts | 16 +++++++-- 5 files changed, 69 insertions(+), 11 deletions(-) diff --git a/packages/ui/src/components/instance/instance-shell2.tsx b/packages/ui/src/components/instance/instance-shell2.tsx index c2689fdb4..5cff0ab50 100644 --- a/packages/ui/src/components/instance/instance-shell2.tsx +++ b/packages/ui/src/components/instance/instance-shell2.tsx @@ -340,10 +340,25 @@ const InstanceShell2: Component = (props) => { return t("instanceShell.connection.unknown") } - const hasPendingRequests = createMemo(() => { + const pendingRequestCount = createMemo(() => { const permissions = getPermissionQueueLength(props.instance.id) const questions = getQuestionQueueLength(props.instance.id) - return permissions + questions > 0 + return permissions + questions + }) + const hasPendingRequests = createMemo(() => { + return pendingRequestCount() > 0 + }) + + let previousPendingRequestCount = 0 + let previousIsActiveInstance = props.isActiveInstance !== false + createEffect(() => { + const count = pendingRequestCount() + const isActiveInstance = props.isActiveInstance !== false + if (isActiveInstance && count > 0 && (previousPendingRequestCount === 0 || !previousIsActiveInstance)) { + setPermissionModalOpen(true) + } + previousPendingRequestCount = count + previousIsActiveInstance = isActiveInstance }) const activePromptInputApi = createMemo(() => { diff --git a/packages/ui/src/components/permission-approval-modal.tsx b/packages/ui/src/components/permission-approval-modal.tsx index 4e2aff614..032292758 100644 --- a/packages/ui/src/components/permission-approval-modal.tsx +++ b/packages/ui/src/components/permission-approval-modal.tsx @@ -375,7 +375,7 @@ const PermissionApprovalModal: Component = (props)