From 65c0f6b2b6e3b644a5e895fa42baf5451f6a234b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Sat, 8 Aug 2026 20:38:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20aichat=20=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E5=B0=BE(useAiEvents=E6=8B=86=E5=88=864?= =?UTF-8?q?=E5=AD=90=E5=9F=9F=20+=20AIC-FIX=20P1=E9=98=9F=E5=88=97/mutex/?= =?UTF-8?q?=E7=BC=93=E5=AD=98=20+=20i18n=E6=AE=8B=E7=95=99=E6=8A=BD?= =?UTF-8?q?=E5=8F=96)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 1 + src/components/ai/ChatInput.vue | 3 +- src/components/ai/DirAuthDialog.vue | 2 +- src/components/ai/HelpRequiredCard.vue | 2 +- src/components/ai/MaxRoundsCard.vue | 3 +- src/components/ai/MessageList.vue | 20 +- src/components/ai/TopBar.vue | 20 +- src/components/project/DependencyGraph.vue | 42 +- src/composables/ai/aiShared.ts | 126 +++ src/composables/ai/useAiConversations.ts | 17 +- src/composables/ai/useAiEvents.ts | 898 ++------------------- src/composables/ai/useAiLifecycleEvents.ts | 222 +++++ src/composables/ai/useAiPendingState.ts | 77 ++ src/composables/ai/useAiSend.ts | 25 +- src/composables/ai/useAiStreamingEvents.ts | 143 ++++ src/composables/ai/useAiToolEvents.ts | 108 +++ src/i18n/en/aiChat.ts | 17 + src/i18n/en/dependencyGraph.ts | 20 + src/i18n/zh-CN/aiChat.ts | 17 + src/i18n/zh-CN/dependencyGraph.ts | 20 + src/stores/ai.ts | 12 +- 21 files changed, 882 insertions(+), 913 deletions(-) create mode 100644 src/composables/ai/useAiLifecycleEvents.ts create mode 100644 src/composables/ai/useAiPendingState.ts create mode 100644 src/composables/ai/useAiStreamingEvents.ts create mode 100644 src/composables/ai/useAiToolEvents.ts diff --git a/Cargo.lock b/Cargo.lock index f40f142..0fbcf09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -953,6 +953,7 @@ dependencies = [ "anyhow", "axum", "df-nodes", + "df-project", "df-storage", "df-types", "futures", diff --git a/src/components/ai/ChatInput.vue b/src/components/ai/ChatInput.vue index 63a0917..197b2f9 100644 --- a/src/components/ai/ChatInput.vue +++ b/src/components/ai/ChatInput.vue @@ -114,7 +114,8 @@ import { ref, computed, nextTick, watch } from 'vue' import { useI18n } from 'vue-i18n' import { useAiStore } from '../../stores/ai' import { useProjectStore } from '../../stores/project' -import { getConvState, textIdle } from '../../composables/ai/useAiEvents' +import { getConvState } from '../../composables/ai/useAiEvents' +import { textIdle } from '../../composables/ai/useAiPendingState' import { extractImageUrlParts } from '../../composables/ai/utils' import { uploadFile } from '../../composables/ai/fileUpload' import { open } from '@tauri-apps/plugin-dialog' diff --git a/src/components/ai/DirAuthDialog.vue b/src/components/ai/DirAuthDialog.vue index b46146e..87102f8 100644 --- a/src/components/ai/DirAuthDialog.vue +++ b/src/components/ai/DirAuthDialog.vue @@ -43,7 +43,7 @@ import { reactive, computed, watch, nextTick, ref } from 'vue' import { useI18n } from 'vue-i18n' import { useAiStore } from '../../stores/ai' -import { pendingDirAuths } from '../../composables/ai/useAiEvents' +import { pendingDirAuths } from '../../composables/ai/useAiPendingState' import { aiApi } from '../../api' const emit = defineEmits<{ diff --git a/src/components/ai/HelpRequiredCard.vue b/src/components/ai/HelpRequiredCard.vue index ebf5dcd..2583d93 100644 --- a/src/components/ai/HelpRequiredCard.vue +++ b/src/components/ai/HelpRequiredCard.vue @@ -25,7 +25,7 @@ import { computed, ref, watch, nextTick } from 'vue' import { useI18n } from 'vue-i18n' import { useAiStore } from '../../stores/ai' -import { pendingHelp } from '../../composables/ai/useAiEvents' +import { pendingHelp } from '../../composables/ai/useAiPendingState' // toast 经 emit 转父(保持单一 toast 源,与 MaxRoundsCard 一致) const emit = defineEmits<{ diff --git a/src/components/ai/MaxRoundsCard.vue b/src/components/ai/MaxRoundsCard.vue index 8587108..db958a5 100644 --- a/src/components/ai/MaxRoundsCard.vue +++ b/src/components/ai/MaxRoundsCard.vue @@ -27,7 +27,8 @@ import { ref, computed, watch, nextTick } from 'vue' import { useI18n } from 'vue-i18n' import { useAiStore } from '../../stores/ai' -import { pendingMaxRounds, getConvState } from '../../composables/ai/useAiEvents' +import { getConvState } from '../../composables/ai/useAiEvents' +import { pendingMaxRounds } from '../../composables/ai/useAiPendingState' import { aiApi } from '../../api' const emit = defineEmits<{ diff --git a/src/components/ai/MessageList.vue b/src/components/ai/MessageList.vue index 6de80d9..000152f 100644 --- a/src/components/ai/MessageList.vue +++ b/src/components/ai/MessageList.vue @@ -901,7 +901,7 @@ defineExpose({ :aria-expanded="tokenPopoverMsgId === item.msg.id" @click="toggleTokenPopover(item.msg, $event)" > - {{ formatTokens(tokenInOf(item.msg)) }} in(估算) + {{ formatTokens(tokenInOf(item.msg)) }} in({{ $t('aiChat.estimated') }}) · {{ formatTokens(tokenCacheOf(item.msg)) }} cache · @@ -917,34 +917,34 @@ defineExpose({ class="ai-token-popover" @click.stop > -