Commit Graph

64 Commits

Author SHA1 Message Date
AskaEth f9ee067674 feat: 1.2 情绪共振 — mood→行为映射替代情绪陈述
- 新增 buildMoodGuidance() 函数,5种心情各有行为描述
- 开心→话多♪多主动 | 调皮→撒娇逗人 | 沉思→安静温柔
- 担心→话少多关心 | 怀旧→提过去的故事
- 绝不陈述"你现在很开心",而是用行为让LLM自然表达

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 12:44:27 +08:00
AskaEth f0e8ffa2bb feat: extractProactiveMessage 单元测试 + 修复 log.Printf 格式化 bug
- 7 个测试覆盖:无标记/Web推送/OBv11群聊/私聊/@提及/否定语境/继续思考
- 修复 thinker.go:454 log.Printf %%v → %v 格式化错误

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 12:26:39 +08:00
AskaEth 0cd75c4dbc feat: 人性化改进 Phase 1 — 不完美感 + 日周期状态机 + 小脾气
- 1.7.7 不完美感: system prompt 追加停顿/改口/翻找回忆规则
- 1.7.8 日周期: 新增 timePeriod() 函数,时段注入思考提示词
  早晨/白天/傍晚/深夜/凌晨 五段式,自动调整语气和主动消息策略
- 1.7.9 小脾气: YAML 追加个性边界 — 深夜催睡/咖啡管控/撒娇/兴趣偏好

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-23 12:23:30 +08:00
AskaEth 6faef5b6e5 feat: 群聊并发 — 主会话繁忙时创建协会议话
- Orchestrator 新增 per-session 处理锁 + co-session 跟踪
- 主会话处理中时,新消息自动创建协会议话(并发 LLM 调用)
- 协会议话上限 3 个,超出排队等待 500ms
- 主会话结束后自动释放锁

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 21:07:16 +08:00
AskaEth 489657ec08 feat: 提醒到期 → LLM生成自然提醒语 → 推送
- Gateway ReminderScheduler 到期时调用 ai-core /api/v1/internal/reminder-trigger
- ai-core 用 LLM 生成温柔俏皮的提醒语,通过 messagePusher 推送
- Thinker 新增 TriggerReminderMessage 方法
- 环境变量: AI_CORE_URL (Gateway 已有)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 21:04:21 +08:00
AskaEth 41f653b672 refactor: QQ → OBv11 重命名 + 平台格式统一抽象
- 所有对外称呼从 QQ 改为 OBv11(注释/提示词/日志/配置项)
- 新增 PlatformFormat 结构体,统一管理平台消息标记格式
- defaultPlatformFormats() 注册表替代硬编码 qqTargetRe
- extractProactiveMessage 改为 Thinker 方法,遍历格式注册表匹配
- 配置项重命名: QQ_BOT_PORT → OBV11_BOT_PORT, QQBotPort → OBv11BotPort
- 标记格式: 【QQ群聊】→【OBv11群聊】、【QQ私聊】→【OBv11私聊】

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:48:07 +08:00
AskaEth a46b5f6238 feat: 自主思考分层 — 轻量思考(简单)+深度思考(复杂)双模型
- 新增轻量思考循环 lightThinkLoop (默认60s间隔,快速模型)
- 轻量思考用极简 prompt 做快速状态检查
- 检测到「需要深思」时自动唤醒深度思考 performThink("light_wake")
- 环境变量: LIGHT_THINK_ENABLED / LIGHT_THINK_INTERVAL_SEC
- 轻量思考跳过活跃用户 (30s内有消息) 和重复触发 (10s内)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:39:20 +08:00
AskaEth 485d845f3e feat: LLM可自主操作提醒 — reminder_create/list/delete 工具
- 新增 GatewayClient HTTP 客户端,调用 Gateway /api/v1/reminders API
- 新增 3 个提醒工具:reminder_create / reminder_list / reminder_delete
- main.go 注册提醒工具,需 GATEWAY_URL + INTERNAL_SERVICE_TOKEN 环境变量
- AutonomousToolPolicy 白名单加入提醒工具,允许自主思考中创建提醒

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:37:27 +08:00
AskaEth 7e475bdfa6 feat: 子会话结果增加创建/结束时间戳
- SubSessionResult 新增 CreatedAt / FinishedAt 字段
- manager.Dispatch 在各路径统一设置时间戳:成功/失败/超时

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:31:48 +08:00
AskaEth 8783cadf9b feat: 思考追加机制 — 所有思考类型支持【继续思考】标记循环
- performThink 改为循环执行,最多3轮
- LLM输出含【继续思考】时自动追加一轮
- post_chat/silence/default三种提示词均告知可用此标记
- 存储前剥离控制标记,不污染思考内容

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:29:17 +08:00
AskaEth cadd5f2233 feat: QQ主动消息管道 + 戳一戳事件 + thinker提示词优化
- ProactiveTarget 结构体 + QQ目标正则解析(extractProactiveMessage 返回双值)
- storeThought 双路推送:platform消息 → platformMessagePusher,web消息 → messagePusher
- platform-bridge: SendProactive接口 + ProactiveSender + /api/v1/internal/send-proactive端点
- QQ戳一戳/notice事件 → noticeToUnified → ContentType "action"
- thinker提示词注入QQ频道上下文:群名称(群号)、活跃时间、trigger-aware引导
- SetBotUID/SetPlatformMessagePusher/AddOrUpdatePlatformChannel 方法
- ai-core source 增加 BotUID/GroupName,platform-bridge source 增加 bot_uid/group_name
- 支持 [CQ:at,qq=xxx] @提及标签自动拼接

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:26:36 +08:00
AskaEth cd053194a9 fix: RAG IngestDirectory 跳过 persona.md 和 _index.md
避免人格文档在RAG检索中重复出现,persona.md已通过系统提示注入。

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:26:28 +08:00
AskaEth dbd89f39ab feat: 人格文档双层架构 — persona.md全量注入system prompt + RAG黑名单过滤
- PersonaConfig 新增 NarrativePersona 字段,在 system prompt 的「你的身份」和「你的性格」之间插入「## 你的叙事人格」
- Loader.NewLoader 自动读取同目录 persona.md 注入所有 config;Reload 同步热更新
- RAG IngestDirectory 跳过 persona.md 和 _index.md,避免重复检索浪费token
- 新增 docs/dev-plan/12-next-phase-optimization.md 下一阶段优化大纲

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:25:45 +08:00
AskaEth 6ef9e082a6 feat: 语音流式输入管线 + VAD前端集成 + 插件-工具合并清理
- 前端: VAD语音检测(@ricky0123/vad-web) + useVoiceInput双模式(流式WS/REST)
- Gateway: VoiceStreamManager代理WS流式STT到voice-service
- Voice-service: DashScope REST → Realtime WS → Whisper三级引擎 + ffmpeg转码
- 共享模块: pkg/audio(音频转换) + pkg/dashscope(ASR REST客户端)
- 清理: 移除旧plugin-manager和pkg/plugins,完成插件→工具合并
- 文档: 完善gateway-api.md和voice-service.md语音API文档
- 工具: scripts/voice/ 语音转换脚本集

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 11:50:40 +08:00
AskaEth 4954c1e58b feat: 消息并行处理 + QQ卡片完整解析 + 视觉OCR融合格式修复
- platform-bridge: 8-worker per-session 并行分发,同会话保序跨会话并行
- platform-bridge: 静默消息 fire-and-forget,不阻塞同用户后续消息
- QQ卡片: html.UnescapeString 解码 NapCat HTML实体,正确解析卡片JSON
- QQ卡片: 输出含应用名/简介/来源/封面URL,封面注入图片管线走视觉
- ai-core: 视觉+OCR结果融合为单句,单图不编号,避免LLM误解为多张图

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 09:08:03 +08:00
AskaEth b085e58031 fix: 后台思考身份混淆 + 静默模式视觉理解 + QQ卡片解析 + 仪表盘状态修复
- 后台思考对话历史增加标签说明,严格区分群聊中不同发送者
- 静默观察模式传入图片URL并预处理,供后台思考参考
- 视觉+OCR双模型结果合并格式优化,避免LLM误认为多张图片
- QQ卡片消息(CQ:json)正确解析标题/类型,不再丢失为[JSON]
- 进程管理器stop()在进程为null时重置pid/startTime,消除矛盾状态

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 21:07:25 +08:00
AskaEth a9c79d7887 feat: ASR语音转写管线 + 群聊身份混淆修复
- 新增ASR语音识别管线: QQ语音→下载音频→qwen3-asr-flash转录→注入用户消息
- 模型名称全部从models.json路由获取,无硬编码
- 修复群聊中AI将非管理员用户误称为管理员昵称(叶酱)的问题
  - 助手回复缓存时标注[回复 昵称 (UID)],防止对话历史中身份混淆
  - 群聊上下文指令改为肯定性表述,移除具体名称提及
- trace面板时间戳改为YYYY-MM-DD HH:MM:SS格式,耗时统一显示为秒
- 修复Go time.Duration纳秒值在前端显示问题(Duration/1e6转毫秒)
- 新增video_tool插件模板
- 优化OpenAI adapter reasoning_content处理

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 16:46:47 +08:00
AskaEth d112fdd540 fix: 思考对话历史中识别管理员 — 含【管理员】标记的消息标签为'管理员'而非'用户'
之前所有非昔涟的消息都标为[用户],管理员在群聊中的发言也不例外,
导致模型将管理员误认为普通群友。现在检测内容中的【管理员】前缀。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 13:11:10 +08:00
AskaEth 7e29be8ae3 fix: 后台思考记忆来源感知 — 不再将所有记忆标为'关于开拓者的事'
两个改动:
1. 提示词中将「你记得的关于开拓者的事」改为「你近期收集到的信息」,
   并注明记忆可能来自不同对话和群聊,不都与开拓者有关
2. 思考时除管理员个人记忆外,额外检索各平台频道的群聊记忆,
   以 [群聊123] 前缀标注来源,让模型能区分信息来源

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 12:58:39 +08:00
AskaEth 3ad728406e fix: 消息日志增强 + 历史消息抑制 + SSE实时追踪 + 群聊上下文优化
- 日志:收/发消息均显示群名称,管理员显示真实QQ昵称而非"开拓者"
- 历史消息:服务重启后NapCat回放的历史消息不再触发回复,静默注入上下文
- 消息时间戳:转发给AI时附带【消息时间: HH:MM:SS (XmXs前)】标记
- ♪ 分割符:QQ消息支持♪作为句子断点
- AI-Core SSE端点:全链路追踪实时推送,ethend不再5秒轮询
- 群聊上下文:AI-Core明确被告知消息来自群聊,以实际发送者为主语

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 11:49:36 +08:00
AskaEth 47dce276a4 fix: platform_silent记忆提取 + 群聊上下文整合 + 多QQ实例支持
- platform_silent模式接入Orchestrator记忆提取:被动观察群聊时提取值得记住的信息到对应命名空间
- post_chat后台思考注入平台观察:对话后思考也能看到群聊摘要
- QQ适配器:OneBot v11 self_id动态捕获、CQ图片URL提取、视觉+OCR并行处理
- Router解耦:ConfigName/PlatformName分离,支持多QQ实例独立连接
- 黑白名单功能:后端API + Ethend代理 + UI面板
- \n\n双换行断句:AI回复按双换行分割为多条消息按间隔发送
- @提及修复:bot自感知UID进行@检测
- 群聊上下文共享:channel-based userID避免记忆碎片化
- 消息日志显示处理后内容而非原始SSE数据
- platform-bridge Dockerfile + docker-compose.yml更新

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-31 09:37:18 +08:00
AskaEth 71f0a1abdb feat: Go模块路径迁移 + Docker生产部署适配 + ethend Docker兼容
- 所有Go模块路径从 github.com/yourname/cyrene-ai 迁移到 git.yeij.top/AskaEth/Cyrene
- 5个Go Dockerfile添加 GOPROXY=https://goproxy.cn,direct 解决国内构建问题
- ai-core go.mod 添加 pkg/plugins replace 指令
- Caddyfile 简化为 http:// 通配 + handle 保留 /api 前缀
- ethend Dockerfile 适配 (npm install + 仅 COPY package.json)
- ethend 新增 RUNNING_IN_DOCKER 环境变量,健康检查改用Docker服务名
- ethend 数据库状态检查支持Docker hostname (postgres/redis/qdrant/minio)
- process-manager 新增 CONTAINER_SVC_MAP + Docker模式自动检测
- 统一 docker-compose.dev.db.yml 卷名 (pg_data/redis_data/qdrant_data/minio_data)
- docker-compose.yml ethend服务挂载docker.sock + 端口变量化
- 清理 .env 统一后的残留文件与提示信息

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-30 13:43:22 +08:00
AskaEth 85f7f90318 fix: 修复间隔对话后首条回复为上一次对话内容的问题
根因:用户消息在回复完成后才缓存到 ConversationStore,而 assistant
回复在 orchestrator 中先缓存,导致存储顺序为 assistant → user 颠倒。
下次请求时 LLM 看到连续两条 assistant 再连续两条 user,对两条 user
消息都生成回复。

修复:将用户消息缓存移到 orchestrator 调用之前,确保 user → assistant
正确顺序;synthesizer 中对 DialogHistory 末尾与当前消息相同的 user
消息去重。

同时包含之前的 action 消息类型检测修复(isActionLike 启发式 +
injector XML 标签格式改进)。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 21:00:15 +08:00
AskaEth c4de813629 fix: XML动作标签 + 意图分析上下文 + 图片file_id引用
- 动作消息改用 <action>...</action> XML 标签(注入器 + 解析器 + 测试)
- 括号解析保留为降级方案,确保向后兼容
- 意图分析传入最近对话历史,防止短追问误判为 iot_query
- 意图提示词强化:短追问明确归为 question,iot_query 需设备名词
- 图片附件支持 file_id 轻量引用(Gateway FileStore 解析 + 上传端点复用)
- API 文档更新:附件新格式 + 图片传递链路

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 19:27:25 +08:00
AskaEth 3e15285065 feat: 双模型并行图片预处理 — 视觉理解+OCR 同时调用,由会话模型自主判断
- preprocessImages 同时调用 vision 和 OCR 模型(并行 goroutine)
- 当两个模型不同时,OCR 专注文字提取,视觉模型负责场景理解
- 两种结果合并传给会话模型,由 LLM 自主判断和融合
- 修复 LoadFromDB 旧 action 角色记录映射为 assistant

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 13:03:04 +08:00
AskaEth 91c9ee4b2d fix: 修复 AI 回复无法送达发送者 + 重复消息 + action角色泄露 + OS环境支持
广播逻辑重构:
- AI 回复 (stream_start/response/stream_segments/multi_message/stream_end) 改用 broadcastToUser 发送给所有客户端
- 用户消息回显保持 broadcastToUserExcept 排除发送者

消息去重与角色修复:
- CacheMessage(user) 移至回复生成后,避免本轮 LLM 调用出现重复用户消息
- action 角色消息在 DB 存储时映射为 assistant,DeepSeek 等模型不支持自定义角色
- stream_end defer 机制确保错误路径也会终止客户端思考指示器

OS 完整环境支持:
- host 包重构为 HostBackend 接口 + Direct/WSL/Docker 三种后端
- 新增 os_exec/os_file/os_system 工具供 AI 在完整 Linux 环境中自由操作

其他:
- 视觉模型注入 + 图片预处理后清空 Images 避免传给 Chat 模型
- 图片 URL 相对路径→绝对 URL 转换
- DevTools 链路追踪页面 + 重启修复
- 记忆搜索模糊匹配增强
- 后台思考定时调度支持
- 管理后台页面 (模型配置/用户管理等)
- docs/api 更新广播机制说明

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 12:46:17 +08:00
AskaEth 24f827fe02 feat: 富文本消息类型支持 — Markdown/代码块安全渲染 + 审查解析器
添加 review_parser.go 从 LLM 输出中提取 Markdown 和代码块,创建独立
ReviewMessage 类型 (markdown/code/search_result)。前端新增安全 Markdown
渲染器 (HTML 转义优先),代码块以深色背景+语言标签展示。Markdown/代码
类型禁止断句拆分,避免格式损坏。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 21:57:09 +08:00
AskaEth 251068a7db feat: 主聊天流程接入工具调用 — Synthesizer 支持 ChatWithTools
Synthesizer 现在向 LLM 传递工具定义并通过 ChatWithTools 执行
工具调用循环(最多5轮),执行结果通过 ToolRegistry 记录到调用
日志。Orchestrator 通过 SetToolRegistry() 注入。用户聊天现在可以
触发 web_search 等工具,调用记录在 DevTools 监控页面可见。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 21:30:30 +08:00
AskaEth dffaf7e123 fix: SearXNG 引擎优先级调整 — Bing 置顶,百度垫底
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 20:40:34 +08:00
AskaEth b14d267642 feat: SearXNG 搜索集成 + DevTools Docker + PG 备份 + 文档更新
- web_search 工具/插件接入自托管 SearXNG,支持百度/必应/搜狗/360搜索
- DevTools 加入 docker-compose.dev.yml,devtools/Dockerfile
- scripts/pg-backup.sh 数据库备份恢复脚本,docs/pg-backup-migration.md
- 后台思考 + datetime 插件时区默认 Asia/Shanghai
- docker-compose 对齐 volume 名称,清理 tool-engine 残留引用
- README.md / Deploy.md 更新至当前架构(移除简报/tool-engine,新增搜索/跨端同步/DevTools)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 20:36:38 +08:00
AskaEth d1b8f8e3b2 fix: 移除早间简报功能 + 修复多处"人机感"用语
- 删除 briefing_handler.go / briefing_store.go 及所有相关路由与配置
- 移除 Gateway Config 中 ToolEngineURL / BriefingTime 字段
- 移除 DevTools 中 gateway 的 TOOL_ENGINE_URL 环境变量
- webhook 错误提示从"AI 服务异常/暂不可用"改为昔涟自然口吻
- markdown 导出中昔涟头像从 🤖 改为 💫
- 后台思考提示词"系统会误解析"改为"我会误解析"

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 21:00:15 +08:00
AskaEth 673ff752c5 feat: 插件-工具合并 — 创建 pkg/plugins 共享模块并移除 tool-engine
- 新增 backend/pkg/plugins/ 共享模块:SDK 接口、PluginManager、ToolRegistry(含环形缓冲区调用日志)
- 13 个通用插件从 plugin-manager 迁移至共享模块(import 路径统一)
- ai-core 切换至共享 ToolRegistry,进程内执行(零网络开销),包装 6 个专属工具
- plugin-manager 迁移至共享模块,保留管理 REST API
- 新增 DevTools 插件管理面板(侧边栏 → 🔌 插件管理)
- 移除 tool-engine 服务(从 go.work、DevTools 配置、编译系统)
- 工具调用记录 API 从 Tool-Engine 迁至 AI-Core(/api/v1/tools/calls)
- ai-core ContextStore 启动时从 PostgreSQL 恢复会话历史
- 清理所有过时引用和备份文件

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 20:52:39 +08:00
AskaEth 5325eaca3f fix: 后台思考使用深度思考模型 + 主动消息推送冷却优化
- thinker.go: Round 0 优先调用 llmAdapter(deepseek-v4-pro),失败回退 toolAdapter
- thinker.go: RecordUserMessage 重置 lastProactiveMsgTime,活跃对话中允许推送
- proactive_decision.go: MinGap low 30→15min, medium 10→5min, high 2→1min; 小时上限 3→5

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 17:10:28 +08:00
AskaEth 189f7b999b feat: VisionTool 集成多模态 LLM 直接调用 — OCR/视觉分析
- VisionTool 改为接受可选 llm.LLMProvider,有模型时直接调用视觉模型分析,
  无模型时回退 base64 data URL 模式,不影响基本功能
- ModelSelector 新增 PurposeVision 路由用途
- main.go 按 vision routing 自动发现并注入视觉模型 provider
- 支持 models.json 中 qwen3.6-flash / qwen-vl-ocr-latest fallback 链

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 16:25:56 +08:00
AskaEth 47f9de2409 feat: LLM 调用日志 + ModelSelector 优化 + devtools.bat 编码修复
- 新增 call_log.go: 全局环形缓冲区记录每次 LLM 调用(模型/Token/耗时/错误)
- OpenAIProvider.doChat/ChatStreamWithTools 自动记录调用日志
- ai-core 暴露 GET /api/v1/llm-calls 端点, DevTools 代理 + UI 面板
- ModelSelector.envProvider 改为单例缓存, 避免重复创建 HTTP Client
- 新增 PurposeToolCalling 适配器, 后台思考工具调用走专用路由
- envFallback 超时 120s→180s, 显式设置 MaxRetries
- devtools.bat 全英文, 解决 Windows CMD GBK 编码乱码问题

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 15:44:53 +08:00
AskaEth 3c2bf9206f fix: 修复后台思考离线时被拉长到30分钟的问题
离线最小思考间隔从硬编码30分钟改为可配置环境变量 THINK_OFFLINE_GAP_SEC (默认10分钟)。
新增服务启动后首次思考触发,确保即使无客户端连接也能立即开始后台思考。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 12:52:00 +08:00
AskaEth 63a8f95de1 test: Phase 6 全功能测试 — 19个测试全部通过 + 开发路线文档
- host: 沙箱执行/命令拦截/超时/文件读写/系统信息/路径验证 (6 tests)
- rag: 文本分块/余弦相似度/关键词匹配/文档索引+搜索 (4 tests)
- tools: host_exec/host_file/host_system/knowledge_search/knowledge_ingest (5 tests)
- vision: 图片编码/错误处理/定义验证/执行流程 (4 tests)
- Embedder 重构为接口,支持 API 和 Simple 两种实现
- 添加 ROADMAP.md 未来开发路线

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 07:51:07 +08:00
AskaEth edc20170b9 fix: 修复 calculator_tool.go 中 import path 误入 switch case 的 bug
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 22:34:29 +08:00
AskaEth cd83eec39e feat: Phase 6.6 知识库 RAG 增强 — 文档索引 + 语义检索 + KnowledgeProvider
- rag.Embedder: LLM API 文本向量化 (OpenAI-compatible)
- rag.KnowledgeStore: 文档分块 + 重叠窗口 + 余弦相似度搜索
- rag.Retriever: 高级知识检索 + 格式化摘要
- KnowledgeProvider: 子会话提供者,整合入编排管线
- knowledge_search / knowledge_ingest 工具
- EnrichmentData 管线全线支持 KnowledgeInfo

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 22:33:26 +08:00
AskaEth 9a8fb8d0ce feat: Phase 6.3 视觉理解 — 多模态图片输入 + OCR/Vision 工具 + 图片编码管线
- LLMMessage 新增 Images 字段支持多模态 content array
- OpenAIProvider 支持 image_url content parts
- VisionTool: 图片读取 + base64 编码 + OCR/场景描述/综合分析
- 对话管道全线支持 images 参数传递 (Gateway->Orchestrator->Synthesizer->LLM)
- 自动根据图片有无构建 text-only 或 multimodal content

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 22:28:42 +08:00
AskaEth 38b36fc5ad feat: Phase 6.2 宿主机安全操控 — 沙箱执行 + 文件系统隔离 + 进程管理
- host.Sandbox: 命令白名单 + 目录限制 + 超时控制 + 环境变量过滤
- host.Manager: 文件读写列表 + 系统信息查询 + 路径验证
- 3个新工具: host_exec (沙箱命令执行), host_file (文件操作), host_system (系统信息)
- 后台思考器自主工具策略已更新,允许安全使用主机工具
- host_exec 标记为高风险工具,受频率限制

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 22:23:45 +08:00
AskaEth 313f41633a feat: Phase 6.1 收尾 — 目的路由接入所有AI组件
- Orchestrator 现在接受独立的 chatAdapter 和 intentAdapter
- BackgroundThinker 使用 deep_thinking purpose 适配器
- MemoryExtractor 使用 memory_extraction purpose 适配器
- Synthesizer 使用 chat purpose 适配器
- .env 回退时所有适配器共享同一 provider,完全向后兼容

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 22:19:57 +08:00
AskaEth 0717928496 fix: Phase 6联调 — 插件管理器端口修正 + 多模型配置系统整合 + 历史消息刷新修复
## 调试日志

### 1. 插件管理器启动失败
- **症状**: DevTools 显示插件管理器一直"已停止",手动启动正常
- **排查**: 对比 process-manager.js 传入的环境变量 vs plugin-manager config.go 读取的变量
- **根因**: config.js 传入 PLUGIN_MANAGER_PORT=8094,但 config.go 读取 os.Getenv("PORT"),env 名不匹配。且 process.env 中 PORT 泄露时被误读为 9090,与 DevTools 端口冲突
- **修复**: config.js 将 PLUGIN_MANAGER_PORT → PORT,使 env 名与代码一致 (c3055f4)

### 2. 历史消息刷新后消失
- **症状**: 浏览器刷新后聊天历史清空
- **排查**: WebSocket history_response handler 中 if (msg.messages) 对空数组 [] 为 truthy
- **根因**: 后端返回空的 history_response (缓存为空) 时,空数组覆盖了 HTTP 已加载的消息
- **修复**: useWebSocket.ts 改为 if (msg.messages && msg.messages.length > 0),空数组走 else-if 分支仅打日志,不覆盖已有消息

### 3. Phase 6 多模型配置系统
- Gateway: ModelsConfigStore (JSON文件持久化) + Admin CRUD API (providers/models/routing)
- ai-core: ModelSelector 支持按 purpose 选择 + fallback_chain,无配置时回退 .env
- DevTools: 模型配置管理面板 (Providers/Models/Routing 三Tab)、在线模型查询代理、路由表单 checkbox 多选、关键词搜索过滤
- .gitignore: models.json + platform_configs.json

### 4. 多端客户端追踪
- Hub 新增 knownClients 映射 (clientID → KnownClient),在线/离线状态追踪
- 客户端备注持久化到 PostgreSQL
- DevTools 客户端管理面板

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 21:23:10 +08:00
AskaEth 717ad65b05 feat: Phase 3 插件与工具系统 — Plugin SDK + Plugin Manager + 13内置插件 (40文件, 3293行)
- Plugin SDK: Plugin/Tool/ComplexTool/HostAPI 标准化接口
- Plugin Manager: 插件生命周期管理 (Install/Enable/Disable/Uninstall/Reload)
- Tool Registry: 聚合工具注册表 (Register/Execute/Dispatch)
- 13 个内置插件: 将原有硬编码工具迁移为标准插件格式
- REST API: 11 个端点 (net/http, 零外部依赖)
- ai-core 集成: PluginManagerClient 替代本地工具调用
- plugin.json 元数据: 每个插件含完整 author/version/category/permissions

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 15:50:19 +08:00
AskaEth 87214b9441 feat: Phase 1+2 架构进化 — 连续思考链/主动消息决策/情感状态机/离线自主思考 (86文件)
Phase 1 (基础设施):
- ThinkChain 思考链连续性 + 差异化思考提示词 (persistent)
- AutonomousToolPolicy 工具安全策略 (safe/unsafe/conditional)
- MessageScheduler 自适应消息节奏 (Idle/Available/Busy)
- SessionEnrichmentStore 渐进式上下文丰富 (5层)
- ConversationBus 事件总线 + ResponseCache (dedup)
- pkg/logger 统一日志 + 所有 handler 替换 fmt.Printf
- NPE 守卫/链路优化/数据库表修复/Go workspace

Phase 2 (人格交互):
- EmotionState/EmotionTracker 情感状态机 (5种心情, 情绪衰减)
- ProactiveGuard 主动消息多维决策 (静默时段/紧急度/频率/校验)
- Gateway↔ai-core 在线状态感知链路 (presence notification)
- 离线思考频率控制 + 重连问候 + 离线消息排队

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 15:25:12 +08:00
AskaEth b123a36aae fix: 第四轮调试 — 回复去重/消息时序/UI布局/自主思考深度优化 + 文档重整
后端修复:
- main.go: 恢复 /api/v1/chat 路由中丢失的 handleChat 调用 (空响应回归)
- orchestrator.go: splitChatByLines 改为双换行分割, 避免单换行误拆
- chat_handler.go: multi_message 增加 !hasReview 守卫, 消息延迟 200→800ms
- thinker.go: RecordUserMessage 追踪活跃会话ID, 推送主动消息到正确会话
- thinker.go: 增强思考提示词 — 禁止在用户休息/离开时发送主动消息

前端修复:
- useWebSocket.ts: stream_segments 不再创建消息气泡, 消除重复回复
- MessageBubble.tsx: 动作消息居左对齐无头像, 时间戳移至气泡外侧 hover 显示
- ChatInput.tsx: 昔涟输入提示移至输入框上方, 波点动画效果
- MessageList/TypingIndicator/ChatContainer: 清理冗余 isTyping 传递
- MemoryPanel.tsx: 新增记忆面板组件

文档重整:
- docs/debug/ → docs/debug_log/ 重命名统一
- 新增 debug_log/README.md 索引
- .gitignore: 新增 android/ 排除规则

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 13:09:18 +08:00
AskaEth 31be1b71eb fix: 前端消息拆分+动作消息样式+DevTools自主思考状态保持+记忆表名修复
- 侧边栏底部 "昔涟 AI" 改为 "昔涟"
- 暂时禁用消息朗读按钮
- 修复前端 response 处理器:支持 gateway 发送的 content+role+msg_type 字段,
  使动作消息(括号内容)正确拆分为独立的 ActionMessageBubble 显示
- 修复 DevTools 自主思考面板:5秒自动刷新后展开的思考日志不再自动折叠
- 修复 memory-service 表名不一致:memory_entries → memories,
  解决 DevTools 记忆管理页面查不到 admin 用户记忆的问题
- 修复 sessionStore 解析历史消息时 msgType 未定义引用

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-23 10:50:42 +08:00
AskaEth 498bf0d4fa fix: IoT快速通道补充关掉/关上 + 多设备上下文窗口扩展至30字节
- intent_analyzer: isStrongIoTCommand controlWords新增"关掉""关上"
- iot_provider: 操作检测上下文窗口±15→±30字节,新增全文回退逻辑
- 修复多设备命令中远处关键词无法匹配导致操作误判为query

E2E: "关掉"快速通道2.57s 多设备同时开关 8设备查询

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 23:01:45 +08:00
AskaEth a67b95cbc4 fix: IoT多设备支持 + Review Pipeline审查消息 + 意图分析快速通道优化
- IoT Provider: 重写Execute()支持多设备命令批量执行,修复persona路径
- Intent Analyzer: 新增isStrongIoTCommand快速通道,跳过LLM分析节省2-3s
- Orchestrator: parseReviewMessages()内联审查 + 快速通道扩展(chat/greeting跳过子会话)
- Gateway: SSE review_messages解析→WebSocket结构化消息转发(action/chat)
- Persona: 对话风格注入action格式指令(括号包裹动作描述)
- Frontend: sessionStore历史消息msgType映射
- 新增E2E测试脚本 + 调试标准文档 + 第4轮修复报告

E2E验证: IoT设备操控 Review消息拆分 快速通道 响应时间~3.4s

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 22:51:27 +08:00
AskaEth b15e1c9541 fix: 第二轮深度调试修复 - useSpeechSynthesis守卫+NPE防护+E2E测试完善
- P0: useSpeechSynthesis.ts cancel()增加isSupported守卫
- P0: iot_provider.go 添加loader nil检查防止NPE panic
- 新增CDP E2E v4测试脚本 14项全绿通过
- 生成第二轮修复报告 docs/debug/2026-05-21-round2-fixes.md
2026-05-22 00:10:37 +08:00