diff --git a/app/src/components/orchestration/AgentChatPanel.tsx b/app/src/components/orchestration/AgentChatPanel.tsx
index 10ba4100b..0d12a7c0e 100644
--- a/app/src/components/orchestration/AgentChatPanel.tsx
+++ b/app/src/components/orchestration/AgentChatPanel.tsx
@@ -241,6 +241,37 @@ function SessionChatView({ session }: { session: SessionSummary }) {
[body, sending, session.agentId, session.sessionId, refresh]
);
+ // A runtime tool-approval decision → reply "allow"/"deny" to the peer. Rethrows
+ // on failure so SessionTranscript rolls the card back to buttons for a retry.
+ const decide = useCallback(
+ async (decision: 'allow' | 'deny'): Promise