From ed1726c29819503dfcd6b3f33afe786ceb2112e8 Mon Sep 17 00:00:00 2001 From: iliya Date: Fri, 27 Mar 2026 18:44:58 +0200 Subject: [PATCH] fix(team): intercept permission_request in native stdout delivery path relayLeadInboxMessages only runs after provisioningComplete, but teammate permission_request messages arrive during bootstrap (before provisioning finishes). Claude Code delivers them natively via stdout type:"user" messages, bypassing the relay entirely. Add permission_request interception in handleNativeTeammateUserMessage which processes stdout user messages at all times, including during provisioning. This ensures ToolApprovalSheet appears immediately when teammates need tool permission. --- src/main/services/team/TeamProvisioningService.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/services/team/TeamProvisioningService.ts b/src/main/services/team/TeamProvisioningService.ts index c6f4f80b..eeb92511 100644 --- a/src/main/services/team/TeamProvisioningService.ts +++ b/src/main/services/team/TeamProvisioningService.ts @@ -1749,6 +1749,17 @@ export class TeamProvisioningService { const blocks = parseAllTeammateMessages(rawText); if (blocks.length === 0) return; + // Intercept teammate permission_request messages delivered natively via stdout. + // This runs even during provisioning (unlike relayLeadInboxMessages which waits + // for provisioningComplete). The lead already received the message — we can't + // prevent that — but we create a ToolApprovalRequest so the user sees the dialog. + for (const block of blocks) { + const perm = parsePermissionRequest(block.content); + if (perm) { + this.handleTeammatePermissionRequest(run, perm, new Date().toISOString()); + } + } + const crossTeamBlocks = blocks.flatMap((block) => { const origin = parseCrossTeamPrefix(block.content); const sourceTeam = origin?.from.includes('.') ? origin.from.split('.', 1)[0] : null;