diff --git a/Cargo.toml b/Cargo.toml index 3cd61ed..96a4553 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "picobot" -version = "0.3.2" +version = "0.3.3" edition = "2024" [lints.rust] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index cfa9512..d0f4817 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,74 @@ 本文件记录 Picobot 各版本的显著变更,遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 风格。 +## [0.3.3] - 2026-08-07 + +较 [0.3.2] 的 12 个 commit 迭代,聚焦 **前端渲染性能飞跃**、**流式通信健壮性** 与 **代码质量治理** 三大方向。 + +### 新增功能 + +#### 执行状态对账端点 +- 新增 `GET /api/executions` HTTP 端点,返回后端权威的执行中话题集合。前端 WebSocket 重连时调用此端点对账,修正断连期间丢失的 `execution_completed` 信号导致的状态漂移。 + +### 性能优化 + +#### 消息列表虚拟化(长对话不再卡顿) +- 引入 `@tanstack/react-virtual` 替换原 `messages.map` 全量渲染,只渲染视口内 + overscan=6 条消息,DOM 节点数恒定。 +- `measureElement` 动态测量变高度消息(一行文本 vs 50 行代码块),`estimateSize=120` 提供初始估计,测量后自动校正。 +- Firefox 特殊处理 `measureElement`(`getBoundingClientRect`)。 +- 适配现有功能:自动滚到底部改用 `virtualizer.scrollToIndex`;`viewKey` 滚动位置记忆保留;`highlightedMessageId` 先渲染目标项再 rAF 加 class;流式 delta 不计数(消息条数不变)。 +- 性能对比(500 条消息):DOM 节点 10000+ → ~200;首次渲染数百 ms → <16ms;流式 diff 从全量列表降至仅可见项。 + +#### 流式 delta 批处理(避免每 token 全数组拷贝) +- 用 `streamingRef` 累加 delta chunks + `requestAnimationFrame` 批量 flush,将每秒数十次 O(n) 数组拷贝合并为一帧一次状态更新。 +- `useMessages.ts` 新增 `streamingRef` 累加器 + rAF 调度,所有 delta 只 push 到 ref,由 `flushStreaming` 批量落盘。 +- `useChat.ts` 5 处 `setMessages([])` 改为 `clearMessages()`,切话题/会话/通道时重置流式 ref,避免脏状态残留。 +- 复杂度:O(n²·L) → O(n) 每帧。 + +### 改进 + +#### 压缩阈值默认值下调 +- 工程化压缩阈值 `threshold_ratio` 从 0.7 下调至 0.5(50%),LLM 压缩阈值 `llm_compaction_threshold_ratio` 从 0.5 下调至 0.3(30%)。 +- 降低触发门槛使压缩更积极介入,减少上下文溢出风险。同步更新相关注释、日志信息和前端 hint 文案。 + +### 修复 + +#### 输入框/发送按钮状态按话题隔离 +- 将单一全局 `isLoading` 布尔值重构为按 `topic_id` 跟踪的 `processingTopicIds` 集合,`isLoading` 派生自当前选中话题是否在集合中。 +- 导航响应不再清空处理状态,切换话题后切回原话题仍能正确禁用输入。 +- 重连时通过 `/api/executions` 端点对账后端权威执行状态,修正断连期间丢失的 `execution_completed` 信号。 + +#### WebSocket 断连时清理流式状态 +- 修复 WebSocket 在流式输出中途断连时 `streamingRef`(contentChunks/index)不重置,导致重连后新消息 delta 追加到旧消息错误位置。 +- 修复链路:`useWebSocket` 的 `onDisconnect` 回调 → `useChat` 的 `finishStreaming` → `useMessages` 的 `finishStreaming`(重置 ref + flush pending chunks)。 + +#### 会话消息泄露到定时任务视图 +- `handleSchedulerMessage`(Tier 1 路由)原先无条件吞掉所有可转换的 chat 消息,导致正在执行的实时消息被错误追加到调度器视图。 +- 修复:调度器视图只接收不带 `topic_id` 的历史加载消息;实时流式消息和带 `topic_id` 的实时消息 fall through 到主视图。 + +### 重构 + +#### 公共工具函数提取与 DRY +- 提取 `src/utils.rs` 公共工具函数模块,消除跨模块重复逻辑。 +- 修复飞书 channel 正则表达式重复编译问题,改为 `Lazy` 一次编译。 +- 网关路由逻辑 DRY 化,减少 `gateway/mod.rs` 重复代码。 +- `agent_loop` / `providers` / `config` / `storage` 等多模块统一引用公共函数,20 个文件受影响。 +- CI 新增安全审计步骤(`cargo audit`)。 + +### 内部改进 +- 存储模块应用 `rustfmt` 格式化(`migrations.rs` / `row_mapping.rs` / `tests.rs`)。 +- 降低 `list_todos` handler 与 gateway 转发日志级别为 debug,减少子代理多次更新待办时的 INFO 日志噪音。 +- 删除临时优化计划文件 `OPTIMIZATION_PLAN.md`。 + +### 测试 +- 新增 MessageList 虚拟化对抗性 smoke test(5 个用例):空消息渲染、100 条消息不崩溃、highlight 视口外不崩溃、viewKey 切换不崩溃、流式 rerender 不崩溃。 +- 新增流式断连对抗性测试(2 个用例):`stream_end` 幂等性验证、多周期断连-重连循环下 `finishStreaming` 幂等验证。 +- 新增断连后新 delta 不污染旧消息测试(用例 17)。 +- 新增定时任务视图消息隔离测试(用例 16)。 +- 新增批量 delta 累加与 `stream_end` 后 `assistant_response` 替换对抗性测试。 + +--- + ## [0.3.2] - 2026-08-06 较 [0.3.1] 的 7 个 commit 迭代,聚焦 **上下文压缩可配置化**、**网关安全加固**、**并发模型优化** 与 **错误防御性提升** 四大方向。 @@ -312,6 +380,8 @@ - 前端静态文件嵌入二进制。 - React Web UI 前端界面。 +[0.3.3]: https://github.com/picobot/picobot/compare/v0.3.2...v0.3.3 +[0.3.2]: https://github.com/picobot/picobot/compare/v0.3.1...v0.3.2 [0.3.1]: https://github.com/picobot/picobot/compare/v0.3.0...v0.3.1 [0.3.0]: https://github.com/picobot/picobot/compare/v0.2.0...v0.3.0 [0.2.0]: https://github.com/picobot/picobot/compare/v0.1.2...v0.2.0