|
29 | 29 | - [ ] **⑤ 测试补面** —— 现状:仅 `CoreTests.cs`(16 用例,集中在 SecretBox / 插件名门禁 / 去重 / 配置加密)。 |
30 | 30 | 动作:补 WebUI 端点冒烟(鉴权与返回体)、**zip 安装防目录穿越**(实现有、测试无)、命令派发与管理员门禁、配置迁移。 |
31 | 31 | 验收:`dotnet test` 全绿,CI 自动跑。 |
32 | | -- [ ] **④ 可观测性补完** —— 现状:AI **token/费用无聚合**;无插件耗时/异常排行;`/healthz` 只看连接状态。 |
| 32 | +- [~] **④ 可观测性补完**(token 统计已落地 `e176bf4`:UsageStore + IUsageSink + Agent 双路径记录 + 2 个单测;**WebUI 展示与 /healthz 扩展未做**) —— 现状:AI **token/费用无聚合**;无插件耗时/异常排行;`/healthz` 只看连接状态。 |
33 | 33 | 动作:Abstractions 加极小的 `IBotMetrics`(宿主实现、`ctx.Metrics`);Agent 在响应回调上报 prompt/completion tokens;WebUI 仪表盘加统计块;`/healthz` 增磁盘与内存。 |
34 | 34 | 验收:跑一轮 AI 对话后 `/api/stats` 出现 token 计数;`/healthz` 含磁盘指标。 |
35 | | -- [ ] **⑥ 小项** —— `IdMap` 加容量上限与淘汰(官方通道身份映射会一直涨);`MessageDedup` 淘汰改环形(去掉 `OrderBy` 的 O(n log n));WebUI 加响应压缩与 CSRF token;插件目录加文件监听(改动自动 reload,默认关闭)。 |
| 35 | +- [~] **⑥ 小项**(核实后调整 + 部分完成)—— 响应压缩 ✅ 已加(`e176bf4`);**`MessageDedup` 无需改**:已有 2000 上限 + 过期清理,用的是 `Where` 不是 `OrderBy`(原判断有误);**`IdMap` 不应加淘汰**:身份映射必须稳定,天然受"不同用户数"约束,强制淘汰会造成身份漂移,比不加上限更糟;CSRF 由 SameSite=Lax + 单一会话令牌覆盖;插件目录文件监听未做(dev 便利,默认关)。 |
36 | 36 |
|
37 | 37 | ### 数据层:记忆与聊天记录 |
38 | 38 |
|
39 | 39 | > 完整设计(架构图 / 时序图 / ER 图 / 隔离威胁模型 / 向量库取舍)见本文件末尾「设计:记忆与聊天记录」一节。 |
40 | 40 |
|
41 | | -- [ ] **会话重置:允许 agent「遗忘」当前会话(不清空记忆)** —— 现在只有"清空记忆"这一种破坏性操作,缺一个安全的"丢上下文"。 |
| 41 | +- [x] **会话重置:允许 agent「遗忘」当前会话(不清空记忆)**(`5bb57eb` 已实现:reset 命令 + session_reset 工具 + 宿主补来源 + 60 秒频控 + 留痕) —— 现在只有"清空记忆"这一种破坏性操作,缺一个安全的"丢上下文"。 |
42 | 42 | **可立刻动手,不依赖 P1**(当前内存实现清 `_convHist[key]` 即可)。 |
43 | 43 | 动作:① 新增 `session_reset` 工具(模型可调)+ `!reset` 命令(按现有权限模型);② 影响范围**只有短期上下文**; |
44 | 44 | ③ **绝不动** `mem` 长期条目、`conversation_*.md` 摘要、消息流水;④ 重置后同一回合重建必带块(global + 高重要度条目 + 最近摘要),避免"以为记得"; |
|
59 | 59 | - [ ] **P2 检索** —— `msg_fts`(FTS5,**必须 `tokenize='trigram'`**,默认 `unicode61` 不切中文)+ `history_search` / `history_recent` 工具;会话历史与"必带注入"改为从库取近 N 轮(同时修掉"超限就丢")。 |
60 | 60 | 安全:**工具签名不含 `scope` 参数**,scope 由宿主从 `TurnContext` 注入(见设计 §5 注)。 |
61 | 61 | 验收:能答"上周谁说过 X";跨 scope 检索被拒。 |
62 | | -- [ ] **P3 增强** —— 首次关注群用 `GetGroupMsgHistoryAsync` 分页补拉历史;`SummarizeDayAsync` 改走库存(不再受单次 1500 条分页上限);按天总结顺带产出结构化 `mem` 条目(复用同一次模型调用,零额外成本)。 |
| 62 | +- [~] **P3 增强**(上半完成 `5bb57eb`)—— ~~首次关注群补拉历史~~ ✅ 已实现并实地验证(启动 20 秒后 + 每 6 小时检查,无数据的关注群补拉最多 5 页×100 条;实测「关注群 207937678 首次补拉 500 条历史」,去重后入库 100 条);**日报改走库存尚未接线**(`IHistoryStore.Range` 已就绪,见下);结构化 `mem` 条目抽取未做。 |
63 | 63 | 验收:新关注的群立即有历史;日报覆盖全天消息。 |
64 | 64 | - [ ] **P4(可选项)会话 id + 关联/分离** —— 每个会话分配稳定短 id(`s_xxxxxx`),主人可用 `!session link/unlink` 把会话放进同一「记忆组」共享记忆、或分离恢复独占;含 `list/info/rename/forget/export`。 |
65 | 65 | 设计见下文 §7.3。**不阻塞 P1–P3**,可随时插入或跳过。 |
66 | 66 | 防护(最容易出事):关联 `private → group` 等于把私聊暴露给该群 ⇒ **默认禁止 + 显式二次确认 + 审计留痕 + WebUI 风险标记**;关联只增不减权限。 |
67 | 67 | 验收:关联后两边记忆互通、分离后历史互不可见;越权关联被拒并留下审计。 |
68 | 68 |
|
| 69 | +### 本轮未竟(按建议顺序续做) |
| 70 | + |
| 71 | +- [ ] **③ 日志管道**:`TimestampWriter` 逐字符 + 每行 `AutoFlush` 同步刷盘 → 行级缓冲批量刷;stdout 被重定向(非 TTY)时剥掉 ANSI。 |
| 72 | +- [ ] **P3 下半**:`SummarizeDayAsync` 改为先查库(`IHistoryStore.Range(scope, fromUnix, toUnix)` 已就绪),不再受通道单次 1500 条分页上限;随后按天总结顺带产出结构化 `mem` 条目。 |
| 73 | +- [ ] **④ 补完**:WebUI 展示用量(`/api/usage` + 页面 chip)+ `/healthz` 增加磁盘/内存指标。 |
| 74 | +- [ ] **⑤ 测试补面**:WebUI 端点冒烟(鉴权与返回体)、zip 安装防目录穿越、命令派发与管理员门禁、配置迁移。 |
| 75 | +- [ ] **P4(可选)**:会话 id + 记忆组「关联 / 分离」+ 审计(设计见设计章节 §7.3)。 |
| 76 | +- [ ] **② 拆分巨型文件**:`PluginManager.cs` 1578 行 → PluginLoader/PluginSettings/PluginInstaller/PluginCommands;`WebUi.cs` 端点分模块;`Program.cs` 启动编排拆分。 |
| 77 | + |
69 | 78 | ## 明确不做 |
70 | 79 |
|
71 | 80 | 自研向量库 / 本地 embedding(真要做也只对 `mem` 条目嵌入,不对全量消息,见设计 §8.1); |
|
0 commit comments