优化: 前端走查 P2+UX(status union + ApprovalPopup hack消除/拖动JS API/Esc)

- status union: AiMessage 加 status 字面量联合,删 AiChat/MessageList AiMessageWithStatus 重复+cast
- ApprovalPopup: 删 _placeholder hack(toolDisplayName 提纯函数) + dispatchApprovalIPC 共享分派消除三套重复 + always 按钮语义对齐 + closeWithFallback 兜底 + 拖动 JS API startDragging(避子元素覆盖) + Esc 快捷键
This commit is contained in:
lxy
2026-08-02 10:43:30 +08:00
parent ef77120912
commit f1773dde4f
7 changed files with 234 additions and 136 deletions
+7 -3
View File
@@ -18,6 +18,7 @@ import { state } from '@/stores/ai'
import { t } from '@/i18n/i18n-helpers'
import { resetStreamWatchdog, clearStreamWatchdog } from './useAiStream'
import { findToolCall } from './aiShared'
import { dispatchApprovalIPC } from './useToolApproval'
/**
* F-260616-06: 审批按钮防抖守卫——同一 id 短期多次点击只发一次 IPC。
@@ -65,9 +66,12 @@ async function approveToolCall(toolCallId: string, approved: boolean, decision?:
const approvalConvId = state.activeConversationId || undefined
resetStreamWatchdog(approvalConvId)
try {
if (isPathKind) {
// path 类:decision 缺省兜底 deny(调用方未传时安全侧拒绝,不静默放行)
await aiApi.authorizeDir(toolCallId, decision ?? 'deny')
// IPC 分派规则(path→authorizeDir / risk→approve)抽离至 dispatchApprovalIPC(useToolApproval.ts),
// 与 ApprovalPopup.runApproval 同源,消除「同语义两套逻辑」漂移
// tc 为 null(findToolCall 未找到,时序竞态)时 isPathKind=false,走 risk 兜底 approve 分支
// (与原实现等价:!!tc && tc.kind==='path' 短路)。
if (tc) {
await dispatchApprovalIPC(tc, approved, decision)
} else {
await aiApi.approve(toolCallId, approved)
}