修复: 模型停用无效根因 + 上下文归位/压缩守卫
- 模型停用无效根因: get_active_provider 两条路径均不校验 enabled(显式活跃直返/默认只挑 is_default) → 收敛为启用集合解析,无启用 provider 明确报错 - 压缩/标题兜底模型不校验 enabled → 新增 resolve_fallback_model 纯函数(title 复用同一实现,单一源无双轨) - 上下文多夹层归位修复: gather_tool_responses 聚拢该头全部响应(此前第二个夹层之后的响应仍被判未闭合剥除) - 压缩后台任务加内容版本哨兵(取首条消息 id,否掉 len:压缩期间 loop 正常 append 会致守卫永不生效) + panic 兜底复位标志 - 902 超时类失败与其它 Fatal 区分停靠文案(点继续可续跑) - 子代理事件按 conv 改挂(route_scope) + 运行期事件推父会话视图 - 飞书 13a 真根因: run_stream_refresher 死代码(提前 drop)+静默钟被心跳重置 → 帧通道+仅内容事件重置 - 项目详情文件查看: F22 目录不存在误显非 Git 仓库 / F24 模块为仓库子目录时 git 徽标全失效(scope_git_path 按 show-prefix 剥前缀) - 更新徽章通道错配(Tauri 事件 vs window CustomEvent 同名不同通道,徽章此前永不触发) - ProjectCard 卡片根 keydown 顶替内嵌按钮(补 e.target 守卫) - i18n 坏键 ai.aiTool.rejectedHint → aiTool.rejectedHint(双缺会渲染裸 key) - miniapp 三处: 会话列表刷新漏网/看门狗节流致新一轮无兜底/newConversation 漏清看门狗
This commit is contained in:
@@ -7,6 +7,9 @@ import { useAiChat } from '@/composables/useAiChat'
|
||||
import type { MentionSpan, MiniContentPart } from '@/types/relay'
|
||||
import type { ProjectRecord, TaskRecord, IdeaRecord, AiToolCallInfo, ChatMessage, TokenUsage } from '@/types/events'
|
||||
|
||||
/** 调试日志门控(对齐 useAiChat/ws.ts:import.meta.env.DEV,生产零 bridge 成本) */
|
||||
const DEBUG = import.meta.env.DEV
|
||||
|
||||
// 组件内联(绕过微信工具 3.15.2 组件解析缓存 bug):独立组件恒报 Component not found,
|
||||
// inline 进页面后 chat/index.json usingComponents 空,工具无需解析 components/,问题消失。
|
||||
// MdView/MentionInput 源保留(src/components/ 下,工具 bug 修复后可拆回)。
|
||||
@@ -512,11 +515,11 @@ function onMentionClose(): void {
|
||||
* 保留原有守卫:空文本忽略 / generating 中忽略 / 关闭联想浮层。
|
||||
*/
|
||||
function handleSend(): void {
|
||||
console.log('[v2:send] enter text=', JSON.stringify(inputText.value), 'gen=', generating.value, 'imgs=', pendingImages.value.length)
|
||||
if (DEBUG) console.log('[v2:send] enter text=', JSON.stringify(inputText.value), 'gen=', generating.value, 'imgs=', pendingImages.value.length)
|
||||
const text = inputText.value.trim()
|
||||
const hasImage = pendingImages.value.length > 0
|
||||
if (!text && !hasImage) {
|
||||
console.log('[v2:send] 空文本且无图片,忽略')
|
||||
if (DEBUG) console.log('[v2:send] 空文本且无图片,忽略')
|
||||
return
|
||||
}
|
||||
if (generating.value) {
|
||||
|
||||
@@ -12,11 +12,15 @@ const ai = useAiChat()
|
||||
*/
|
||||
const conversations = ref<Conversation[]>([])
|
||||
/**
|
||||
* 监听 ai.conversations.length 变化(比 deep watch 更可靠)。
|
||||
* 监听 ai.conversations 整体替换(比 deep watch 更可靠,也比只盯 length 完整)。
|
||||
* 用 `[...ai.conversations]` 创建普通数组赋值给 ref,确保每次变化都触发模板更新。
|
||||
*
|
||||
* 为什么监听 ref 而非 length:device 回推 AiConversationList 是「整体替换」且条数常不变
|
||||
* (改名后条数不变),只盯 length 时 watch 回调不触发 → 本地副本滞留旧标题。
|
||||
* 监听 ref 则在赋值(含同长度替换)时即触发刷新。
|
||||
*/
|
||||
watch(() => ai.conversations.value.length, () => {
|
||||
conversations.value = [...ai.conversations.value]
|
||||
watch(ai.conversations, (list) => {
|
||||
conversations.value = [...(list || [])]
|
||||
}, { immediate: true })
|
||||
|
||||
/** 点击会话项切换 */
|
||||
|
||||
Reference in New Issue
Block a user