oudecheng
|
1cde659bb6
|
fix(storage): 全项目扫描修复——外键约束失效根因与计数一致性
- [根因] 连接池补 PRAGMA foreign_keys=ON:原先仅引导连接开启,运行时池连接 FK 强制从未生效,delete_topic 的 SET NULL / delete_session 的 CASCADE 形同虚设(悬空 topic_id、topics 孤儿残留)
- clear_messages 归零 topics.message_count(原先只清 token 列,/clear 后话题列表显示虚假消息数)
- delete_messages_by_ids 补重算 sessions.user_turn_count(sanitize 删除 user 消息后计数永久偏高)
- compact/replace_active_history 新增 recompute_session_topic_message_counts(重插消息无 topic_id,topics.message_count 漂移)
- switch_topic 三连查与 http 模型选择路由包 spawn_blocking(侧边栏主交互高频路径)
- 新增 3 个测试:FK 生效、clear 归零、user_turn_count 重算
|
2026-08-18 23:31:11 +08:00 |
|
oudecheng
|
e2841ce791
|
perf(topics): 话题列表刷新提速——token 统计增量维护列替代全表聚合
- topics 表新增 stat_* 增量列,append 时同事务累加(排除 sub:% 子代理消息)
- batch_topic_token_stats 从 messages 全表 SUM+MAX(seq) 聚合改为读 topics 列,刷新耗时与消息总量解耦
- 变更路径重算自愈:delete_by_ids/replace_topic/compact_topic 按 topic 重算,replace_active/compact_active 按 session 重算,clear_messages 归零
- backfill_topic_usage_stats 一次性回填老数据(user_version=4 守卫,仅首启执行)
- list_topics handler 移入 spawn_blocking,不再阻塞 tokio worker
- 修复既有 bug:压缩/替换路径的 INSERT SQL 漏写 cached_tokens 列
- 新增 5 个测试:增量维护、子代理隔离、删除/清空重算、替换重算、回填迁移幂等
|
2026-08-18 22:59:01 +08:00 |
|
oudecheng
|
6ac653bf51
|
fix(review): 对抗性审查修复——spawn 竞态窗口、max_run_secs 配置化、删除计数一致性
- 子代理 spawn 顺序调整为先注册 cancel_registry 再写 DB running 记录,消除 reap 误杀刚启动子代理的微秒级竞态窗口
- max_run_secs 接入 AgentConfig 配置项(config.json agents 段),不再硬编码;From 透传 + 全部字面构造点补齐
- delete_messages_by_ids 删除后按活 COUNT 重算 sessions/topics 的 message_count,修复计数列漂移
- cli init 修改 agent 路径保留既有 max_run_secs 而非重置默认
|
2026-08-18 09:46:21 +08:00 |
|
oudecheng
|
452c5ad0ef
|
fix(gateway): 修复长会话后新消息无响应——僵尸子代理清理、panic 兜底与运行预算
- 发送 ExecutionCompleted 前惰性清理僵尸 running 子代理(DB running 但执行任务已消失),解除 pending 阻塞
- processor panic 路径补发 error 通知 + ExecutionCompleted,防止前端永久 loading
- agent 单轮增加墙钟预算 max_run_secs,超时优雅退出释放 topic 串行锁
- topic 串行锁等待增加 info/warn 日志,长等待可观测
- sanitize 清理结果回写 DB(delete_messages_by_ids),消除每次加载的重复修复
- storage 新增 keyset 分页与按 ID 批量删除的单元测试
|
2026-08-18 09:33:07 +08:00 |
|
oudecheng
|
a629486ad3
|
perf(chat): 长话题历史分页——messages 按 seq keyset 增量加载
后端新增 load_messages_for_topic_page(seq < cursor + limit 分页,走 (session_id, seq) 索引替代 OFFSET 深翻页),ChatMessage 增加 seq 游标;历史批次消息带 topic_id 下发,前端以 seq+topic_id 双重判定批次归属,规避切话题瞬间在途旧批次污染。
前端触顶增量加载:批次缓存在 pendingHistoryRef,收到 topic_history_end 一次性去重 prepend,scrollTop 按新增高度补偿锚定原头部消息;不足一屏自动补页,loading 超时 10s 自愈;流式输出中加载历史不清空流式累加器,避免已流出文本丢失。
|
2026-08-18 07:51:31 +08:00 |
|
oudecheng
|
b0c24d64f0
|
fix(storage): 清理旧版本遗留的空 cli 会话并降级会话列表日志
- 早期版本每次 WebSocket 连接都会新建一个 cli 通道空会话(CLI Session xxxxxxxx),长期运行积累大量空壳记录,导致会话列表冗长、网关日志逐条刷屏
- 新增 user_version=3 一次性迁移:删除无消息/话题/待办/技能事件的 cli 空会话,有真实内容的会话不受影响(事务包裹,含回归测试)
- ws.rs 会话列表逐条日志由 INFO 降级为 debug,仅保留条数汇总
|
2026-08-17 18:02:43 +08:00 |
|
oudecheng
|
d5c0b50e63
|
fix(storage): 归一化历史前缀累积污染的会话 ID(一次性迁移)
- 早期版本重复拼接通道前缀产生 websocket:websocket:<uuid> 一类的污染会话记录,会话列表因此出现多条前缀逐层累积的重复会话
- 新增 user_version=2 迁移:子表数据改指归一化 ID,污染会话并入既有会话或重命名,seq 按时间重编号,整体事务保证原子性
- 新增回归测试覆盖合并、重命名、seq 连续性与幂等重跑
|
2026-08-17 17:52:30 +08:00 |
|
oudecheng
|
e3e32c725d
|
style: 对存储模块应用 rustfmt 格式化
|
2026-08-07 08:34:30 +08:00 |
|
oudecheng
|
07247ed140
|
perf(storage): get_topic_message_count 改用 COUNT(*) 查询
原实现调用 load_messages_for_topic 加载该 topic 的所有消息
(含 content、tool_calls_json 等大字段反序列化)到内存,
仅为调用 .len() 计数。长会话可能加载数千条消息,且在
list_sessions 列出所有 topic 时会按 topic 数量倍增。
改为 SELECT COUNT(*) FROM messages WHERE topic_id = ?1,
在数据库侧计数:无需反序列化任何字段,命中已有的
idx_messages_topic_seq(topic_id, seq) 索引。
对 N 条消息的 topic,从 O(N) 内存 + 反序列化降为 O(1)
内存 + 索引扫描。新增测试覆盖计数正确性与隔离性。
|
2026-08-04 15:18:21 +08:00 |
|
oudecheng
|
cda14360af
|
chore: 建立工程化基线(rustfmt + clippy + CI + eslint + prettier)
配置:
- rustfmt.toml: 固化 max_width=100 / 4 空格缩进,cargo fmt 全量格式化
- Cargo.toml: 配置 [lints.rust] 与 [lints.clippy] 渐进式规则
- .github/workflows/ci.yml: Rust(fmt+clippy+test) + 前端(eslint+tsc+test) 双平台 CI
- Makefile: 新增 check/fmt/fix 目标,clippy 对齐 --all-targets --all-features
- web: eslint flat config + prettier 配置 + package.json 脚本与依赖
- src/main.rs: loop→while 修复 clippy::never_loop
对抗性审查发现并修复:
- eslint 缺 caughtErrorsIgnorePattern 导致 catch(_) 误报为 error
- 前端 lint 未接入 CI,现已补上 Lint 步骤
- Makefile 与 CI 的 clippy flags 不一致,已对齐
|
2026-08-03 23:24:02 +08:00 |
|
oudecheng
|
c8660df14b
|
refactor: 拆分 storage/mod.rs 与 ConfigPage.tsx (P2)
storage/mod.rs (2957 -> 1834 行):
- 抽出 tests.rs: 17 个测试函数
- 抽出 row_mapping.rs: 8 个 row<->record 映射与单记录查询函数
- 抽出 migrations.rs: 7 个 schema 迁移函数 (ensure_*_schema, has_column, add_column_if_missing)
ConfigPage.tsx (1568 -> 1235 行):
- 抽出 types.ts: 所有接口/类型定义
- 抽出 constants.ts: TABS, inputCls, selectCls, TIMEZONE_OPTIONS
- 抽出 ui.tsx: Field, Toggle, TagEditor, SectionCard, SourceEditor, MapEntryHeader
- 抽出 api/expert.ts: getSelectedExpert, selectExpert (经 ConfigPage 再导出保持兼容)
验证: cargo build, cargo test --lib storage:: 17/17, npm run build
对抗性检查: 8/8 通过 (无丢失/重复函数, 无循环依赖, 无未使用导入)
|
2026-07-07 18:36:23 +08:00 |
|