diff --git a/Cargo.lock b/Cargo.lock index 253fb7e..3b76a3b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1635,7 +1635,7 @@ dependencies = [ [[package]] name = "picobot" -version = "0.3.0" +version = "0.3.1" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index c9a9901..5090a08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "picobot" -version = "0.3.0" +version = "0.3.1" edition = "2024" [lints.rust] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 4989d68..615c282 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,80 @@ 本文件记录 Picobot 各版本的显著变更,遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 风格。 +## [0.3.1] - 2026-08-05 + +较 [0.3.0] 的 19 个 commit 迭代,聚焦 **历史压缩可追溯性**、**token 统计准确性**、**前端渲染稳定性**、**工具执行可靠性** 与 **网关吞吐优化** 五大方向。 + +### 新增功能 + +#### 历史压缩保留原消息(双视图分离) +- 压缩流程从物理删除原消息改为标记位 `is_compacted` 分离两个视图: + - **LLM 视角**(`load_messages_for_topic`):只看 `is_compacted=0` 的压缩摘要 + 新消息,context 仍精简。 + - **UI 视角**(`load_messages_for_topic_full`):看原消息(含 `is_compacted=1`)+ 新消息,排除压缩摘要,前端切回老话题仍能展示完整原始对话。 +- 新增 `compact_topic_history`:不删除原消息,仅打标记 + 插入摘要,同事务内删除旧摘要避免累积。修复 token 统计因压缩丢失 `usage` 的问题。 +- `messages` 表新增 `is_compacted INTEGER NOT NULL DEFAULT 0` 列,migration 幂等。 + +#### Topic 维度 token 统计 +- 新增 `batch_topic_token_stats`,按 `topic_id` 聚合 token 消耗,替代原按 `session_id` 聚合导致的同 session 多 topic 共享总和问题。 +- 前端侧边栏每个 topic 显示独立 token 消耗与 context 占用百分比(Coins 图标 + 数值,绿/黄/红三色指示)。 +- 主代理执行结束时触发 `list_topics` 刷新(500ms 防抖),实时更新侧边栏 token 统计;子代理每轮执行也支持刷新。 + +#### 设置页重启按钮 +- 设置页 Footer 区新增重启按钮,样式为 `bg-tertiary` + 边框,与主保存按钮区分。 +- 确认对话框区分触发来源:保存后触发显示"配置已保存 / 稍后",手动触发显示"重启服务 / 取消"并警告未保存改动。 +- 状态管理改用 `restartDialogMode: 'saved' | 'manual' | null`,按钮在重启期间显示 loading 并禁用。 + +#### 设置页懒加载标签页与子代理管理 +- 拆分设置页为懒加载标签页,减少首屏渲染负担。 +- 前端支持子代理创建与删除,配合 `PUT /api/subagents/update` 端点。 + +#### LLM 主调用可配置重试机制(0.3.0 收尾补充) +- `ProviderConfig` 增加 `max_retries` 字段(serde default=3,向后兼容)。 +- `agent_loop` 流式 + summary 两个调用点实现重试循环:指数退避 1s/2s/4s,仅对 429/502/503/504/timeout/connection reset 重试;流式仅在未 emit delta 时重试,避免重复输出。 + +### 修复 + +#### 前端渲染稳定性 +- `MessageBubble` 使用 `React.memo` 避免流式期间不必要重渲染。 +- `useWebSocket` 回调 ref-化,避免父组件重渲染触发 WebSocket 无谓重连。 +- 修复触发滚动到底部按钮时新消息计数错误。 +- 修复话题重命名预填字段与写入字段不一致。 +- 修复流式期间消息重渲染、WebSocket 无谓重连与新消息计数错误。 + +#### 子智能体结果展示 +- 失败/超时子智能体返回结构化结果,前端可点击查看详情,而非静默丢失。 + +#### Token 统计准确性 +- 修复 token 统计按 `session_id` 聚合导致同 session 多 topic 共享总和:改为按 `topic_id` 聚合,子代理消息通过 `session_id NOT LIKE 'sub:%'` 排除。 +- 修复主代理执行结束后 token 统计不刷新:`useMessages` 在 `execution_completed` 事件时触发 `bumpTopicRefreshTrigger()`。 + +#### 工具执行可靠性 +- 修复 shell 工具超时未生效:`adb start-server` 守护进程继承 stdout 管道导致 EOF 阻塞,`adb devices` 误判 socket 等待为 stdin 等待绕过 deadline。新增 `STREAM_DRAIN_MS` 常量、改进 `kill_and_reap`、移除 `should_return_pending` 中的错误检查,确保 timeout 参数完全覆盖默认值。 + +#### 安全加固 +- `web_fetch` 加固 SSRF 防护,禁用 HTTP 重定向,与 `http_request` 实现对齐。 + +#### MCP 兼容性 +- 限制 MCP server 名称字符并兜底 `tool_name` 清洗,避免非法字符导致 OpenAI API 400。 + +### 性能优化 + +#### 网关吞吐 +- `send_with_retry` 对 `ChannelFull` 错误短路(不重试、不退避),加速队列消费,避免 dispatcher 在满队列时 7s 退避阻塞。 +- 新增 `ChannelError::ChannelFull` 变体,`CliChannel` 在 `try_send` 返回 `Full` 时映射为 `ChannelFull`。 + +#### 存储查询 +- `get_topic_message_count` 改用 `SELECT COUNT(*)` 在数据库侧计数,避免将所有消息(含 `content`、`tool_calls_json` 等大字段)加载到内存。 + +#### 热路径优化 +- 减少热路径无谓拷贝与重复正则编译,跳过已完成 migration。 + +### 内部改进 +- 删除临时计划文件 `PLAN.md`。 +- CHANGELOG 补充 LLM 重试机制条目并修正 commit 计数。 + +--- + ## [0.3.0] - 2026-08-04 较 [0.2.0] 的 18 个 commit 迭代,聚焦 **Agent 执行与显示层解耦**、**LLM 调用稳定性**、**工程化基线**、**并发持久化稳定性**、**安全加固** 与 **MCP 兼容性** 六大方向。锁屏冻结架构修复经五轮对抗性审查验证。 @@ -188,5 +262,7 @@ - 前端静态文件嵌入二进制。 - React Web UI 前端界面。 +[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 [0.1.2]: https://github.com/picobot/picobot/releases/tag/v0.1.2