-
-
-
- Allow {item.integrationId} to run {item.toolName}?
-
-
- {summarizeArgs(item.argsSummary)}
-
+ {pending.map((item) => {
+ const prompt = approvalPrompt(item);
+ const args = summarizeArgs(item.argsSummary);
+ return (
+
+
+
+
+
{prompt}
+
+ Roomote is waiting for your approval to continue.
+
+
-
+
+
+
+ Details
+
+
+
+
+ - Integration
+ - {item.integrationId}
+ - Tool
+ - {item.toolName}
+
+
+
Arguments
+ {args ? (
+
+ {args}
+
+ ) : (
+
No additional details.
+ )}
+
+
+
+
+
-
-
- ))}
+
+ );
+ })}
);
}
From 133ae7551d20f83b788e29f5072cd931abe95d4e Mon Sep 17 00:00:00 2001
From: "@daniel-lxs" <57051444+daniel-lxs@users.noreply.github.com>
Date: Mon, 21 Sep 2026 21:45:51 +0000
Subject: [PATCH 2/2] fix(web): quiet the approval denial action
---
...ngIntegrationToolApprovals.client.test.tsx | 26 +++++++++++++++++++
.../PendingIntegrationToolApprovals.tsx | 22 +++++++---------
2 files changed, 36 insertions(+), 12 deletions(-)
diff --git a/apps/web/src/components/sessions/PendingIntegrationToolApprovals.client.test.tsx b/apps/web/src/components/sessions/PendingIntegrationToolApprovals.client.test.tsx
index 714dee10dc..b173c86740 100644
--- a/apps/web/src/components/sessions/PendingIntegrationToolApprovals.client.test.tsx
+++ b/apps/web/src/components/sessions/PendingIntegrationToolApprovals.client.test.tsx
@@ -98,6 +98,32 @@ describe('PendingIntegrationToolApprovals', () => {
).toBeInTheDocument();
});
+ it('disables every decision while the request is being submitted', async () => {
+ let resolveFetch: ((response: Response) => void) | undefined;
+ fetchMock.mockImplementationOnce(
+ () =>
+ new Promise
((resolve) => {
+ resolveFetch = resolve;
+ }),
+ );
+ renderCard();
+
+ fireEvent.click(screen.getByRole('button', { name: 'Allow once' }));
+
+ await waitFor(() => {
+ expect(screen.getByRole('button', { name: 'Allow once' })).toBeDisabled();
+ expect(
+ screen.getByRole('button', { name: 'Allow for this session' }),
+ ).toBeDisabled();
+ expect(screen.getByRole('button', { name: 'Deny' })).toBeDisabled();
+ });
+
+ resolveFetch?.(new Response('{}', { status: 200 }));
+ await waitFor(() => {
+ expect(screen.getByRole('button', { name: 'Allow once' })).toBeEnabled();
+ });
+ });
+
it('describes empty arguments without exposing implementation wording', () => {
render(
diff --git a/apps/web/src/components/sessions/PendingIntegrationToolApprovals.tsx b/apps/web/src/components/sessions/PendingIntegrationToolApprovals.tsx
index 5f3348afd0..b8e6b247d5 100644
--- a/apps/web/src/components/sessions/PendingIntegrationToolApprovals.tsx
+++ b/apps/web/src/components/sessions/PendingIntegrationToolApprovals.tsx
@@ -194,18 +194,16 @@ export function PendingIntegrationToolApprovals({
>
Allow for this session
-
- void decide(item.approvalId, 'rejected')}
- >
- Deny
-
-
+ void decide(item.approvalId, 'rejected')}
+ >
+ Deny
+