From 3910bc324b93b9c37ffc106bf6f08308772ea7cc Mon Sep 17 00:00:00 2001 From: oudecheng <13802883547@139.com> Date: Wed, 12 Aug 2026 08:39:40 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=8D=87=E7=BA=A7=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E8=87=B3=200.3.5=20=E5=B9=B6=E6=9B=B4=E6=96=B0=20CHAN?= =?UTF-8?q?GELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.toml | 2 +- docs/CHANGELOG.md | 120 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index d6e4ade..eae2bc4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "picobot" -version = "0.3.3" +version = "0.3.5" edition = "2024" [lints.rust] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d0f4817..4ecd51d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,124 @@ 本文件记录 Picobot 各版本的显著变更,遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 风格。 +## [0.3.5] - 2026-08-12 + +较 [0.3.4] 的 4 个 commit 迭代,聚焦 **可观测性**、**并发性能** 与 **外部集成健壮性** 三大方向。 + +### 新增功能 + +#### MCP 工具调用超时保护 +- 在 `McpToolWrapper` 适配层用 `tokio::time::timeout` 包裹 `call_tool`,防止外部 MCP server 挂起导致 agent loop 无限阻塞。 +- 超时时间通过 `config.mcp_tool_timeout_secs` 配置(默认 300 秒,0=不超时)。 +- 前端 McpTab 设置页提供输入框。 + +#### 端到端可观测性整改 +- **trace_id 全链路传播**:`BusToolCallEmitter` / `SubAgentEmitter` / `processor` 全链路设置 trace_id。 +- **AgentEnd 指标配对**:补发 5 个 cancel/defensive 路径的 AgentEnd 事件,闭合 AgentStart 指标。 +- **LLM 计时修正**:`attempt_start` 移入 retry 循环,排除退避等待时间。 +- **`/metrics` auth**:非 loopback 部署时纳入 Bearer token 校验。 +- **recorder 复用**:`OnceLock` 缓存 `PrometheusHandle`,热重启后不再返回 503。 +- **结构化日志**:新增 `tracing_ctx` + JSON 日志格式支持。 + +### 修复 + +#### 压缩期间 session 锁阻塞新建话题 +- 压缩任务在 LLM 调用(2-5s)期间持有 session 锁,阻塞 `create_session` 命令获取锁执行 `switch_topic`,导致新建话题后列表刷新延迟。 +- 将压缩重构为 4 阶段: + 1. 短暂持锁:读取 history/compressor/store/session_id/provider_config + 2. 释放锁:LLM 压缩调用(2-5s) + 3. 释放锁:DB 写入(store 为 Arc,DB 层自带事务保护) + 4. 短暂持锁:reload 内存历史 +- 并发安全:同 topic 由调用方的 per-topic serial lock 保证串行;不同 topic 完全并行不受影响。 + +#### MCP 前端空输入重置为不超时 +- 清空输入框时回退到默认值 300 而非 0(0 表示不超时,与用户预期不符)。 +- 新增两个 tokio 测试覆盖有超时和无超时(error pass-through)路径。 + +### 测试 +- MCP 超时路径新增 2 个 tokio 单元测试。 + +--- + +## [0.3.4] - 2026-08-10 + +较 [0.3.3] 的 9 个 commit 迭代,聚焦 **安全加固**、**健壮性防御** 与 **代码质量优化** 三大方向。 + +### 新增功能 + +#### 顶栏显示后端版本号 +- 复用现有 `/health` 端点返回的 `CARGO_PKG_VERSION`,避免在 `package.json` 重复维护版本号。 +- 前端挂载时拉取一次,失败则不显示徽标。 + +#### 文件工具路径限制(最小权限原则) +- 默认行为:文件读写编辑限制在当前工作目录内。 +- 新增配置项:`tools.allowed_dirs`(白名单目录列表)+ `tools.file_access_unrestricted`(opt-in 全局放开)。 +- 共享 `resolve_file_path()` 函数,使用 `canonicalize()` 防御符号链接与 `..` 路径遍历。 +- 前端:设置页 > 工具标签新增"文件访问"卡片,含开关与目录标签编辑器。 +- 向后兼容:旧配置默认 cwd 限制(`serde(default)`)。 + +### 安全修复 + +#### Shell 会话生命周期管理 +- `GatewayState` 持有 `Arc` 引用,网关关闭时(`ctrl_c` 和重启两条路径)调用 `shutdown()`。 +- 新增防御性 `Drop` impl,泄露会话时打 warn 日志。 +- 子进程 kill 添加 5s 超时,防止无限阻塞。 + +#### HTTP 工具 OOM 防护 +- `WebFetchTool` / `HttpRequestTool` 实现流式读取响应体(`futures_util::StreamExt`),防止大响应撑爆内存。 +- 检查 `Content-Length` 头,分块读取并累计校验大小。 +- 默认限制:`WebFetch` 200KB,`HttpRequest` 4MB。 + +#### TimeTool 重复类型转换修复 +- 移除 `time.rs` 中重复的 `u32::try_from` 调用(复制粘贴错误)。 + +#### 消除 16 处 unreachable! panic 风险 +- 15 个 command handler 文件中 `_ => unreachable!()` 替换为 `_ => Err(CommandError::new(...))`,防止 `Command` 枚举新增变体时运行时 panic。 + +#### 配置占位符校验 +- 新增 `validate_no_unresolved_placeholders()`,拒绝包含未解析 `` 或 `\` 占位符的配置。 +- 防止字面占位符字符串被当作真实 API key 发送到 LLM provider(难以诊断的 401 根因)。 +- 首次运行跳过校验(`create_default_config` 模板场景)。 + +### 修复 + +#### 切换话题后滚动到最新消息 +- 修复切换话题后不滚动到最新消息的问题。 +- 跟随意图仅由用户输入(wheel/touch/key)推翻,程序触发的滚动不会打断用户浏览。 +- 将虚拟化 `totalSize` 纳入滚动依赖,使测量收敛到真实底部。 + +#### WebSocket 重连竞态修复 +- 修复 URL 切换时的 WebSocket 重连竞态问题。 +- 事件处理引入代际同一性守卫,孤儿 socket 事件整体忽略。 +- disconnect 恰好触发一次 `onDisconnect`,避免重复清理。 + +#### 删除话题竞态修复 +- 修复删除选中话题时的竞态问题。 +- 乐观移除本地话题并以 `null` 作为唯一无选择哨兵。 +- 杜绝基于过期列表重选已删除话题。 + +### 重构 + +#### 8 处 quick wins +- `shared.rs` 提取 channel/cli 适配器公共逻辑,消除 124 行重复代码。 +- `http_utils.rs` 提取 HTTP 响应读取公共逻辑,`http_request.rs` 与 `web_fetch.rs` 共享实现。 +- `bash.rs` / `shell_session.rs` 简化冗余逻辑。 +- `gateway/mod.rs` 优化路由分支。 +- `storage/mod.rs` 精简查询逻辑。 +- `mcp/client.rs` 增强错误处理。 + +### 内部改进 +- 修复 release 构建编译器警告:补全 `regex::Captures` 显式生命周期标注,`cfg(debug_assertions)` 条件化仅 debug 使用的变量,`AnthropicProvider::llm_timeout_secs` 添加 `cfg_attr allow(dead_code)`。 +- 飞书 channel 时间戳去重改用 `crate::utils::current_timestamp()`,消除 `unwrap()` panic 点并统一日志格式。 +- 批量更新依赖 patch 版本(chrono, clap, anyhow, bytes 等),无 breaking change。 + +### 测试 +- `cancel_manager.rs` 新增 8 个单元测试,覆盖 register/cancel/remove/overwrite/list/cancel_all/drop-safety 核心路径。 +- `session_pool.rs` 新增 3 个单元测试,覆盖 `is_scheduler_chat_id` 路由逻辑。 +- 配置占位符校验新增 11 个单元测试,覆盖空值、小写、数字、去重、多占位符、首次运行、加载集成等边缘场景。 + +--- + ## [0.3.3] - 2026-08-07 较 [0.3.2] 的 12 个 commit 迭代,聚焦 **前端渲染性能飞跃**、**流式通信健壮性** 与 **代码质量治理** 三大方向。 @@ -380,6 +498,8 @@ - 前端静态文件嵌入二进制。 - React Web UI 前端界面。 +[0.3.5]: https://github.com/picobot/picobot/compare/v0.3.4...v0.3.5 +[0.3.4]: https://github.com/picobot/picobot/compare/v0.3.3...v0.3.4 [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