From 9dcbf911a0a23ce42da489bab11d4b04e301e2b6 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 22:36:09 +0100 Subject: [PATCH] refactor: share ui approval event handling --- ui/src/ui/app-gateway.ts | 49 +++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/ui/src/ui/app-gateway.ts b/ui/src/ui/app-gateway.ts index 7103c47ae8a..d0fcf266cb4 100644 --- a/ui/src/ui/app-gateway.ts +++ b/ui/src/ui/app-gateway.ts @@ -119,6 +119,25 @@ type GatewayHostWithSideResults = GatewayHost & { chatSideResultTerminalRuns?: Set; }; +function enqueueApprovalRequest(host: GatewayHost, entry: ExecApprovalRequest | null) { + if (!entry) { + return; + } + host.execApprovalQueue = addExecApproval(host.execApprovalQueue, entry); + host.execApprovalError = null; + const delay = Math.max(0, entry.expiresAtMs - Date.now() + 500); + window.setTimeout(() => { + host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, entry.id); + }, delay); +} + +function removeResolvedApprovalRequest(host: GatewayHost, payload: unknown) { + const resolved = parseExecApprovalResolved(payload); + if (resolved) { + host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, resolved.id); + } +} + function isTerminalChatState( state: ChatEventPayload["state"] | ReturnType | null | undefined, ): state is "final" | "aborted" | "error" { @@ -542,44 +561,22 @@ function handleGatewayEventUnsafe(host: GatewayHost, evt: GatewayEventFrame) { } if (evt.event === "exec.approval.requested") { - const entry = parseExecApprovalRequested(evt.payload); - if (entry) { - host.execApprovalQueue = addExecApproval(host.execApprovalQueue, entry); - host.execApprovalError = null; - const delay = Math.max(0, entry.expiresAtMs - Date.now() + 500); - window.setTimeout(() => { - host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, entry.id); - }, delay); - } + enqueueApprovalRequest(host, parseExecApprovalRequested(evt.payload)); return; } if (evt.event === "exec.approval.resolved") { - const resolved = parseExecApprovalResolved(evt.payload); - if (resolved) { - host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, resolved.id); - } + removeResolvedApprovalRequest(host, evt.payload); return; } if (evt.event === "plugin.approval.requested") { - const entry = parsePluginApprovalRequested(evt.payload); - if (entry) { - host.execApprovalQueue = addExecApproval(host.execApprovalQueue, entry); - host.execApprovalError = null; - const delay = Math.max(0, entry.expiresAtMs - Date.now() + 500); - window.setTimeout(() => { - host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, entry.id); - }, delay); - } + enqueueApprovalRequest(host, parsePluginApprovalRequested(evt.payload)); return; } if (evt.event === "plugin.approval.resolved") { - const resolved = parseExecApprovalResolved(evt.payload); - if (resolved) { - host.execApprovalQueue = removeExecApproval(host.execApprovalQueue, resolved.id); - } + removeResolvedApprovalRequest(host, evt.payload); return; }