diff --git a/src/composables/ai/useAiApproval.ts b/src/composables/ai/useAiApproval.ts index 8e50b2a..bd984ae 100644 --- a/src/composables/ai/useAiApproval.ts +++ b/src/composables/ai/useAiApproval.ts @@ -70,6 +70,19 @@ async function approveToolCall(toolCallId: string, approved: boolean, decision?: } else { await aiApi.approve(toolCallId, approved) } + // IPC 成功返回 = 后端已处理(执行工具/拒绝/写入白名单 + emit 事件 + try_continue)。 + // 乐观更新 tc.status,不依赖后端事件来复位 loading(后端事件可能在 IPC 返回前后任意时刻到达, + // 且 findToolCall 若因时序找不到 tc 会致 loading 永不复位)。 + // approve/authorize 通过 → running(后端正在执行工具);deny/reject → rejected(后端已记审计)。 + if (tc) { + const isDeny = isPathKind ? (decision === 'deny') : !approved + tc.status = isDeny ? 'rejected' : 'running' + if (isDeny) { + tc.result = t('ai.aiTool.rejectedHint') + } + } + // 同步从 pendingApprovals 移除(不等后端 AiApprovalResult 事件来移,防 loading 卡死) + state.pendingApprovals = state.pendingApprovals.filter(p => p.id !== toolCallId) } catch (e) { // IPC 未送达:用户已点过按钮,清看门狗(避免 130s 后误触发假错误)再回滚到失败态 // TD-260621-03 per-conv:清审批 tc 所属会话的 timer(与上方 reset 同 conv,对称成对)。