修复: @任务联想源隔离 store.tasks 污染 + DirAuthDialog 拒绝二次确认 + 看板销账(AC弱模型机制 3/5 已落地核对)

This commit is contained in:
lxy
2026-08-09 21:34:52 +08:00
parent 180d8e339f
commit cad76ffdf2
3 changed files with 48 additions and 12 deletions
+21
View File
@@ -37,6 +37,13 @@
>{{ $t('aiChat.dirAuthDeny') }}</button>
</div>
</div>
<!-- P1-e-c: deny 拒绝二次确认(拒绝不可逆——工具返 Err、loop 续跑不再重试;对齐 ToolCard/ApprovalPopup) -->
<ConfirmDialog
:visible="confirmState.visible"
:msg="confirmState.msg"
:danger-label="$t('common.confirm')"
@result="answerConfirm"
/>
</template>
<script setup lang="ts">
@@ -45,6 +52,8 @@ import { useI18n } from 'vue-i18n'
import { useAiStore } from '../../stores/ai'
import { pendingDirAuths } from '../../composables/ai/useAiPendingState'
import { aiApi } from '../../api'
import { useConfirm } from '../../composables/useConfirm'
import ConfirmDialog from '../../components/ConfirmDialog.vue'
const emit = defineEmits<{
(e: 'toast', payload: { msg: string; type: 'error' | 'warning' | 'info' }): void
@@ -53,6 +62,9 @@ const emit = defineEmits<{
const store = useAiStore()
const { t } = useI18n()
// P1-e-c: deny 拒绝二次确认统一弹层(useConfirm 状态机 + ConfirmDialog 组件,同 ToolCard/ApprovalPopup)
const { confirmState, confirmDialog, answerConfirm } = useConfirm()
// F-260620 根治(授权挂起无声卡死):挂起态弹窗显示只依赖 isGenerating(conv),不依赖 streaming。
// streaming 会被流式看门狗超时清(useAiStream onStreamTimeout),而 AiDirAuthRequired 挂起常发生在
// 首轮慢响应(看门狗已超时清 streaming)之后——此时 streaming=false 但后端 generating=true、
@@ -87,6 +99,15 @@ const dirAuthRefs = ref<HTMLElement[]>([])
async function handleAuthorize(id: string, decision: 'once' | 'session' | 'always' | 'deny'): Promise<void> {
if (actingIds.has(id)) return
actingIds.add(id)
// P1-e-c: deny 拒绝前二次确认(拒绝不可逆——工具返 Err、loop 续跑不再重试;与 ToolCard onDeny 同款)。
// 放 actingIds.add 之后、IPC 之前;取消则删 actingIds 复位处理中态(保持 pending 可重新决策),不调用 IPC。
if (decision === 'deny') {
const ok = await confirmDialog(t('aiChat.dirAuthDenyConfirm'))
if (!ok) {
actingIds.delete(id)
return
}
}
try {
await aiApi.authorizeDir(id, decision)
} catch (e) {