Files
zclaw_openfang/wiki/log.md
iven 28c892fd31
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
fix(chat): 聊天定时功能断链接通 — NlScheduleParser + _reminder Hand
接通"写了没接"的定时功能断链:
- NlScheduleParser has_schedule_intent/parse_nl_schedule 接入 agent_chat_stream
- 新增 _reminder 系统 Hand 作为定时触发器桥接
- TriggerManager hand_id 验证对 _ 前缀系统 Hand 放行
- 聊天消息含定时意图时自动拦截,创建触发器并返回确认消息

验证:cargo check 0 error, 49 tests passed,
Tauri MCP "每天早上9点提醒我查房" → cron 0 9 * * * 确认正确显示
2026-04-15 09:45:19 +08:00

259 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 变更日志
updated: 2026-04-15
status: active
tags: [log, history]
---
# 变更日志
> Append-only 操作记录。格式: `## [日期] 类型 | 描述`
## 2026-04-15 fix | 聊天定时功能断链接通 — NlScheduleParser + _reminder Hand
- **fix(runtime)**: NlScheduleParser 接入 chat.rs — has_schedule_intent() 意图检测 + parse_nl_schedule() cron 解析
- **fix(hands)**: 新增 _reminder 系统内部 Hand — 定时触发器桥接
- **fix(kernel)**: TriggerManager hand_id 验证放宽 — `_` 前缀系统 Hand 免验证
- **fix(desktop)**: agent_chat_stream 定时拦截 — 确认消息通过 LoopEvent::Delta 流式返回
- **docs(wiki)**: hands-skills.md 新增定时提醒链路说明
- 验证: cargo check 0 error, 49 tests passed, Tauri MCP 实操验证 "每天早上9点提醒我查房" → cron `0 9 * * *` 确认消息正确显示
## 2026-04-15 fix | 发布前冲刺 Day1 — 5项修复 + 2项标注 + 文档同步
- **fix(saas)**: SSE 用量统计一致性 — 回写 usage_records 真实 token + 消除 relay_requests 双重计数
- **fix(saas)**: relay_tasks 超时自动清理 — 每5分钟扫描 processing>10min 标记 failed
- **fix(desktop)**: 模型自动路由 — 首次登录自动选择第一个可用模型 (saasStore + connectionStore)
- **chore**: Cargo warnings 清零 — 39→0 (仅剩 sqlx-postgres 外部依赖)
- **chore**: Tauri 命令 @reserved 全量标注 — 89个 (孤儿命令 0)
- **docs**: TRUTH.md 数字更新 (Tauri 182命令、95 invoke、89 @reserved、0 孤儿)
- 验证: tsc 0错误、vitest 344通过、cargo check 0 warning、pnpm build 成功
## 2026-04-15 fix | 三端联调 V2 — SSE Token 捕获修复 + 调试环境文档
- **fix(saas)**: SseUsageCapture 增加 `stream_done` 标志,修复 SSE 路径 Token 始终为 0 的根因
- **fix(saas)**: `parse_sse_line` 兼容 `data:``data: ` 两种前缀 + `total_tokens` 兜底
- **docs(wiki)**: development.md 新增完整调试环境信息Windows 环境要求/数据库/端口/账号/启动顺序)
- **docs(wiki)**: known-issues.md 新增 V2 联调测试结果17 项通过 + 3 项待处理)
- 验证方式: Chrome DevTools MCP + Tauri MCP 实际界面操作
## [2026-04-14] docs | Wiki 全量更新 — 2026-04-14 代码验证驱动
- 全部 12 个 wiki 页面基于最新代码扫描验证更新
- 关键数字修正: Rust 77K行(274 .rs)、Tauri 189命令、SaaS 137 routes、Admin 17页、SaaS 16模块
- known-issues: V13-GAP 全部标记已修复 + 三端联调测试结果
- middleware: 14层 runtime + 10层 SaaS HTTP 完整清单
- saas: 16模块(含industry)、20迁移/42表、137 routes
- routing: SaaS降级流程、Store含industryStore、lib/85文件
- chat: 14层中间件经过
- butler: 行业配置接入ButlerPanel
- development: Admin 17页、SaaS 137 routes
- log: 链接三端联调测试报告
## [2026-04-14] fix | 三端联调测试 2 P0 + 6 P1 修复
- P0: SaaS 模型选择残留模型 ID → 模型可用性前置校验
- P1: API 密钥页崩溃 / 桌面端 401 恢复 / 用量统计全零 / 行业选择 500 / 管理员订阅 500 / SaaS 启动崩溃
- 完整报告: `docs/INTEGRATION_TEST_REPORT_20260414_V2.md`
## [2026-04-13] fix | V13 审计 6 项修复全部完成
- FIX-01~06: TrajectoryRecorder注册 + industryStore接入 + 知识搜索 + webhook标注 + 结构化UI + PersistentMemoryStore移除
- 提交: c167ea4 + fd3e7fd
## [2026-04-12] audit | V13 系统性功能审计 — 6 项新发现
- 全系统功能一致性审计完成, 总体健康度 82/100 (V12: 76)
- P1 新发现 3 项: TrajectoryRecorder 未注册中间件链, industryStore 无组件导入, 桌面端无 Knowledge Search
- P2 新发现 3 项: Webhook 孤儿表, Structured Data Source 无 Admin UI, PersistentMemoryStore 遗留
- 修正 V12 错误认知 5 项: Butler/MCP/Gateway/Presentation 已接通, Reflection driver 已修复
- TRUTH.md 数字校准: Tauri 184→191, SaaS 122→136, @reserved 33→24, dead_code 76→43
- 完整报告: `docs/features/audit-v13/V13-FULL-REPORT.md`
## [2026-04-12] fix | 三轮审计修复 — 3 HIGH + 4 MEDIUM 清零
- H1: status disabled→inactive 统一 + source 补 admin 映射
- H2: experience.rs format_for_injection XML 转义
- H3: TriggerContext industry_keywords 全局缓存接通
- M2: ID 自动生成移除中文 + 无 ASCII 手动提示
- M3: TS CreateIndustryRequest 补 id 字段
- M4: ListIndustriesQuery deny_unknown_fields
## [2026-04-12] feat | 知识库 Phase D — 统一搜索 + 种子知识冷启动
- search/recommend API 返回 UnifiedSearchResult (文档+结构化双通道合并)
- POST /api/v1/knowledge/seed 种子知识冷启动接口 (幂等, admin权限)
- seed_knowledge: 按标题+行业查重, source='distillation', tags标记行业
- SearchRequest 扩展: search_structured/search_documents/industry_id 字段
- 167 行新增, 4 文件变更
## [2026-04-12] fix | 二次审计修复 — 2 CRITICAL + 4 HIGH + 2 MEDIUM
- C-1: Industries.tsx 创建弹窗缺少 id → 添加 id 输入 + name 自动生成
- C-2: Accounts.tsx handleSave 部分 save → try/catch + handleClose 统一
- V1: viking_commands Mutex 跨 await → Arc clone 后释放 Mutex
- I1+I2: 误导性"相关度"分数移除 + pain point XML 转义
- S1+S2: industry status 枚举白名单 + id 格式正则验证
- H-3+H-4: 编辑模态数据竞争守卫 + useEffect editingId 守卫
## [2026-04-12] feat | 知识库 Phase B+C — 文档提取器 + multipart 文件上传
- extractors.rs: PDF(pdf-extract) + DOCX(zip+quick-xml) + Excel(calamine) 三格式提取
- 格式路由 detect_format() → RAG 通道或结构化通道
- POST /api/v1/knowledge/upload multipart 文件上传
- PDF/DOCX/Markdown → RAG 管线Excel → structured_rows JSONB 存储
- 结构化数据源 API: GET/DELETE /api/v1/structured/sources + /rows + /query
- 修复 industry/service.rs SaasError::Database 类型不匹配
- 累计新增 849 行7 文件变更
## [2026-04-12] fix | 审计修复 — 4 CRITICAL + 5 HIGH 全部解决
- C1: SQL 注入风险 → industry/service.rs 参数化查询 ($N 绑定)
- C2: INDUSTRY_CONFIGS 死链 → Kernel 共享 Arc + ButlerRouter 共享实例
- C3: IndustryListItem 缺字段 → keywords_count + 时间戳补全
- C4: 非事务性行业绑定 → batch ANY($1) 验证 + 事务 DELETE+INSERT
- H8: Accounts.tsx 竞态 → mutate→mutateAsync + confirmLoading 双检测
- H9: XML 注入未转义 → xml_escape() 辅助函数
- H10: update 覆盖 source → 保留原始值
- H11: 面包屑 /industries 映射缺失
## [2026-04-12] feat | 行业配置 + 管家主动性 全栈 5 Phase 实施
Phase 1 — 行业配置基础 (13 files, 886 insertions):
- SaaS industries + account_industries 表 (migration v15)
- 4 内置行业: 医疗/教育/制衣/电商 (keywords/prompt/pain_seeds)
- ButlerRouter 动态行业关键词注入 (Arc<RwLock<Vec<IndustryKeywordConfig>>>)
- 8 SaaS API handlers (list/create/update/fullConfig/accountIndustries)
Phase 2 — 学习循环基础 (5 files, 271 insertions):
- 5 触发信号: PainConfirmed/PositiveFeedback/ComplexToolChain/UserCorrection/IndustryPattern
- Experience 增加 industry_context + source_trigger 维度
- experience_store keywords 含行业标签
Phase 3 — Tauri 行业配置加载 (6 files, 310 insertions):
- desktop saas-industry.ts mixin (4 API methods)
- industryStore.ts (Zustand + persist, 离线缓存)
- viking_load_industry_keywords Tauri 命令 (JSON String → Rust struct)
Phase 4 — Admin 行业管理 (6 files, 564 insertions):
- Industries.tsx: 行业列表 + 编辑弹窗(关键词/prompt/痛点种子) + 新建弹窗
- Accounts.tsx 增强: 行业授权多选 + 主行业标记
- /industries 路由 + ShopOutlined 侧边栏导航
Phase 5 — 主动行为激活 (3 files, 152 insertions):
- 注入格式升级: [路由上下文] → <butler-context> XML fencing (Hermes 策略)
- 跨会话连续性: pre_hook 注入活跃痛点 + 相关经验
- 触发信号持久化: store_trigger_experience() 模板提取零 LLM 成本
## [2026-04-11] chore | 发布前准备 — 版本号统一 + 数字校准 + 安全加固
1. Cargo.toml 版本 0.1.0 → 0.9.0-beta.1 (workspace 统一)
2. TRUTH.md 数字全面校准 — Rust 代码 66K→74.6K、Tauri 命令 182→184、SaaS .route() 140→122 等 10 项
3. CSP 加固 — 添加 `object-src 'none'`
4. .env.example 补充 SaaS 关键环境变量 (JWT_SECRET/TOTP_KEY/Admin 凭据)
5. 安全检查通过 — 无硬编码密钥、SQL 全参数化、Cookie 三件套完整
## [2026-04-11] fix | 模型路由链路修复 — 消除硬编码不匹配模型
1. summarizer_adapter.rs — "glm-4-flash" 硬编码 fallback → 未配置时明确报错 (fail fast)
2. saas-relay-client.ts — 'glm-4-flash-250414' 硬编码 fallback → 未获取模型时报错
3. Wiki routing.md — 新增完整模型路由文档 (Tauri SaaS Relay 主路径 + 辅助 LLM + Browser 模式)
## [2026-04-11] fix | Skill/MCP 调用链路修复 3 个断点
1. Anthropic Driver ToolResult 格式 — ContentBlock 添加 ToolResult 变体, tool_call_id 不再丢弃
2. 前端 callMcpTool 参数名 — serviceName/toolName/args → service_name/tool_name/arguments
3. MCP 工具桥接 ToolRegistry — McpToolWrapper + Kernel mcp_adapters 共享状态 + 启停同步
4. Wiki 更新 — hands-skills.md 添加 Skill 调用链路 + MCP 架构文档
## [2026-04-11] fix | 发布内测前修复 6 批次
- Batch 1: 新用户 llm_routing 默认改为 relay (SQL + migration)
- Batch 2: SaaS URL 集中配置化 (VITE_SAAS_URL, 5处硬编码消除)
- Batch 3: Gateway URL 配置化 + Rust panic hook 崩溃报告
- Batch 4: UX 文案修复 — 新/老用户区分 + 去政务化 + 忘记密码
- Batch 5: 移除空壳"行业资讯" Tab + Provider URL 去重统一到 api-urls.ts
- Batch 6: 版本号 0.1.0 → 0.9.0-beta.1 + updater 插件预留
## [2026-04-11] docs | Wiki 全面更新 — 代码验证驱动
- 全部 10 个 wiki 页面基于代码扫描验证更新(非文档推测)
- 关键数字修正: Rust 95K行(335 .rs文件, 原文档66K)、Tauri命令 190/183、SaaS路由 121、前端组件 104、lib/ 85 文件
- 测试函数修正: ~1,055 (872内联+183集成原文档仅计#[test])
- 新增中间件完整注册清单14层runtime + 6层SaaS HTTP
- 新增 Store 完整目录结构17 文件 + chat/4 子store
- 新增 Pipeline 模板完整目录树17 YAML, 8 行业目录)
- 新增 Hands 测试数分布
- 新增 memory Tauri 命令完整列表16 个)
- 新增代码健康度指标TODO/FIXME 仅 8 个)
- 修正管家模式描述: 关键词路由 → 语义路由(TF-IDF)
- 新增 artifactStore 到 chat Store 拆分列表
## [2026-04-11] init | 创建 wiki 知识库
- 从 TRUTH.md / ARCHITECTURE_BRIEF.md / CLAUDE.md 编译 8 个 wiki 页面
- 创建 index.md 入口 + 7 个主题页
- CLAUDE.md 添加 @wiki/index.md 引用
## [2026-04-10] fix | 发布前修复批次
- ButlerRouter 语义路由 — SemanticSkillRouter TF-IDF 替代关键词
- P1-04 AuthGuard 竞态 — 三态守卫 + cookie 先验证
- P2-03 限流 — Cross 测试共享 token
- P1-02 浏览器聊天 — Playwright SaaS fixture
- BREAKS.md 全部 P0/P1/P2 已修复
## [2026-04-09] feat | Hermes Intelligence Pipeline 4 Chunk
- Chunk1 ExperienceStore+Extractor (10 tests)
- Chunk2 UserProfileStore+Profiler (14 tests)
- Chunk3 NlScheduleParser (16 tests)
- Chunk4 TrajectoryRecorder+Compressor (18 tests)
- 中间件 13→14 层 (+TrajectoryRecorder@650)
- Schema v2→v4 (user_profiles + trajectory tables)
## [2026-04-09] feat | 管家模式发布前实施完成
- ButlerRouter + 冷启动 + 简洁UI
- 痛点持久化 SQLite
- 桥测试 43 通过
## [2026-04-07] feat | 管家能力激活
- Tauri 命令 183→189 (+6 butler)
- multi-agent feature 默认启用
- ButlerPanel UI 3 区
- DataMaskingMiddleware@90
## [2026-04-03] fix | 前端改进 + 数字校准
- Pipeline 8 invoke 接通前端
- Viking 5 孤立 invoke 清理
- SaaS API 93→131 (新增 knowledge/billing/role)
- scheduled_task Admin V2 完整接入
## [2026-04-02] fix | P0/P1 全部修复
- 2 P0 崩溃修复
- 9 P1 功能失效修复
- 7 P1.5 代码质量修复
- TRUTH.md 初始创建
---
> 更新规则: 每次重大变更后追加一条,最新在最上面
### [2026-04-13] V13 审计 6 项修复全部完成
- FIX-01 (P1): TrajectoryRecorderMiddleware 注册到 create_middleware_chain() @650Hermes 轨迹数据开始流入
- FIX-02 (P1): industryStore 接入 ButlerPanel桌面端展示行业专长卡片 + 自动拉取
- FIX-03 (P1): 桌面端知识库搜索 — saas-knowledge mixin + VikingPanel SaaS KB 搜索 UI
- FIX-04 (P2): Webhook 孤儿迁移标注 deprecated + down migration 注释
- FIX-05 (P2): Admin Knowledge 新增"结构化数据"Tab (CRUD + 行浏览)
- FIX-06 (P2): PersistentMemoryStore 全量移除 — persistent.rs 611→57行删除死 embedding global + 2 @reserved 命令 + viking_commands 冗余配置Tauri 命令 191→189
- 文件: 13 个 (Rust 5 + TS 7 + docs 1), 提交: c167ea4 + fd3e7fd + 本轮
- P0: memory_search 空查询 min_similarity 默认值; hand_trigger null→handAutoTrigger; 重启后 chat 路由竞态修复
- P1: AgentInfo 扩展 UserProfile 桥接; 反思阈值降低 5→3; 反思 state restore peek+pop 竞态修复
- P2: 演化历史可展开差异视图; 管家 Tab 条件 header + 空状态引导
- 文件: 14 个 (Rust 5 + TS 9), 10 次提交