Skip to content

v8

Choose a tag to compare

@NeonMedusa NeonMedusa released this 03 Oct 03:12
· 12 commits to main since this release
perf(session): 长会话懒加载显示——加载/内存不随会话增长(schema v9)

背景:15.8k 行会话加载 ~2.4s(Debug),其中全量构建显示 ~1000ms + 首帧全量计行
~410ms;42.8MB 思考内容 + 10MB 正文被完整物化后,98% 随即被窗口化卸载——白做。

核心改动(方案 B:真·按需加载):
- schema v9:message 新增 disp_kind/disp_bytes/disp_lines/has_reasoning(由
  insertMessage 经 computeDisplayMeta 统一计算)+ 覆盖索引 idx_message_meta
  (扫 15.8k 行元数据 12~15ms,完全不碰内容页);迁移 v8→v9 纯 SQL 回填
  (先 DROP FTS UPDATE 触发器避免逐行重索引;LENGTH(CAST(... AS BLOB)) 取字节数)
- src/display.zig:工具调用行/块标题/参数摘要/截断等显示文本纯函数抽出,
  迁移回填与运行时共用(新增 toolRowHeader 统一入口)
- 懒加载路径:TUI 加载只读骨架元数据 + 尾部 ~400 行物化,其余建壳
  (行高按字节/行数估算,宽度 60~200 偏差 ≤3.4%);滚入视口经 reloadMessage
  按 entry_kind(text/call_line/shell_block/diff_block/fail_line)物化
- 显示语义统一:调用行/块改由 tool 行生成(与流式渲染顺序一致,顺带修复
  重启后显示顺序与流式不一致的旧问题)
- 物化行数变化在视口下方自动补偿 scroll_offset(估算→真实自愈不跳变)
- 回归保障:懒加载与全量加载的显示条目逐条等价测试

附带修复:
- TUI 的 -db 参数此前被静默忽略(parseCliArgs 要求首参为子命令)→ 实际打开
  默认 skynet.db、启动闸门误判版本;修复后暴露的路径悬挂段错误一并修复
- unloadMessage 卸载时释放 tool_header(原注释'重载取不到'已过时:reloadMessage
  按 db_id 反查 assistant 行参数重算)——滚过的工具行曾永久驻留标题,
  实测连续 PgUp 300s:24.7MB → 77MB 线性增长;修复后稳定 ~25MB

实测(真实 15.8k 行会话):
- Debug:加载 ~1300ms → ~230ms;首帧 ~410ms → ~3ms;内存 53MB+ → 23.6MB
- ReleaseSafe:加载 ~93ms;内存 16.9MB
- 滚动 300s / 1.8 万次 PgUp:内存 24.7MB → 25.7MB(平稳)

文档:AGENTS.md(schema v9 / 显示元数据约定 / display.zig)、
docs/architecture.md(分区地图/数据流/连带影响)、docs/development.md
(懒加载设计、滚动内存排查与教训)已同步。