优化: AI模块(provider重试兼容+aichat交互+工具卡片可读化+diff高亮)

This commit is contained in:
2026-06-16 02:33:16 +08:00
parent d2cb38cdac
commit 10e4945e5a
26 changed files with 2337 additions and 332 deletions

View File

@@ -34,8 +34,6 @@ import type { AiChatEvent, AiConversationSummary, AiMessage, AiProviderConfig, A
* - 现有 push 逻辑(composables 内)零改动,上限由本模块 watch 统一兜底。
*/
const MESSAGE_CAP = 200
/** push 单次增量上限(用于区分 push 增长 vs 整体替换)。useAiSend 连续 push user+ai=2,其余事件 push 1。 */
const MESSAGE_PUSH_BURST = 2
import { useAiEvents } from '@/composables/ai/useAiEvents'
import { useAiStream } from '@/composables/ai/useAiStream'
import { useAiSend } from '@/composables/ai/useAiSend'
@@ -60,14 +58,19 @@ export const state = reactive({
conversations: [] as AiConversationSummary[],
activeConversationId: null as string | null,
sidebarOpen: false,
// 侧栏宽度(px,可拖拽;clamp 120~280,默认 200;持久化于 df-ai-ui。UX-2025-16)
sidebarWidth: 200,
// 窗口分离
detached: false,
// 吸附跟随中
docked: false,
// 本机技能(`/` 联想)
skills: [] as SkillInfo[],
// 待发送队列生成中发的消息排队AiCompleted 后自动续发)
queue: [] as { text: string; skill?: string }[],
// 待发送队列生成中发的消息排队AiCompleted 后自动续发enqueuedAt 记录入队时间供超时检测
queue: [] as { text: string; skill?: string; enqueuedAt: number }[],
// Agentic 循环当前轮次(0=非agentic/未开始;>0=收到后端 AiAgentRound 事件的 round)
// AE-2025-07:进度条用; AiCompleted/AiError 复位为 0
agentRound: 0,
// 归档分组折叠态(默认折叠)
archivedCollapsed: true,
// token 用量展示(受 df-show-token-usage 开关控制;lastTokenUsage=最近一条回复,convTokenTotal=当前对话累计)
@@ -82,7 +85,7 @@ export type { AiChatEvent, AiConversationSummary, AiMessage, AiProviderConfig, A
/**
* messages 软上限守卫:push 式增长超 MESSAGE_CAP 时,splice 掉最早条滚动淘汰。
*
* 仅拦截 push(oldVal>0 且 newVal-oldVal ≤ MESSAGE_PUSH_BURST);整体替换(切换对话)
* 仅拦截 push(oldVal>0 且增量≤2);整体替换(切换对话)
* 放行,避免截断后端历史。watch 在模块加载即注册(state 单例生命周期内常驻)。
*/
watch(
@@ -90,7 +93,7 @@ watch(
(newLen, oldLen) => {
if (
oldLen > 0 &&
newLen - oldLen <= MESSAGE_PUSH_BURST &&
newLen - oldLen <= 2 && // 最多连续 push 2 条触发滚动(useAiSend user+ai=2)
newLen > MESSAGE_CAP
) {
state.messages.splice(0, newLen - MESSAGE_CAP)