From 3cef9da443222d80cf7060af7c714c42750e22fe Mon Sep 17 00:00:00 2001 From: oudecheng <13802883547@139.com> Date: Tue, 18 Aug 2026 15:35:22 +0800 Subject: [PATCH] =?UTF-8?q?chore(release):=200.4.3=E2=80=94=E2=80=94max=5F?= =?UTF-8?q?run=5Fsecs=20=E9=BB=98=E8=AE=A4=E6=94=B9=E4=B8=BA=E4=B8=8D?= =?UTF-8?q?=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit max_run_secs 默认值由 3600(60 分钟)改为 0(不限制),避免长任务被单次执行时间上限中断;需要时可在 config.json 的 agents 段显式配置。同步版本号提升至 0.4.3 并更新 CHANGELOG。 --- Cargo.lock | 2 +- Cargo.toml | 2 +- docs/CHANGELOG.md | 66 +++++++++++++++++++++++++++++++++++++ src/agent/runtime_config.rs | 4 +-- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16dd399..387400b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1728,7 +1728,7 @@ dependencies = [ [[package]] name = "picobot" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "async-trait", diff --git a/Cargo.toml b/Cargo.toml index dfedd2d..34b780c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "picobot" -version = "0.4.2" +version = "0.4.3" edition = "2024" [lints.rust] diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 54b4062..8b45a3a 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,72 @@ 本文件记录 Picobot 各版本的显著变更,遵循 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/) 风格。 +## [0.4.3] - 2026-08-18 + +较 [0.4.2] 的 13 个 commit 迭代,聚焦 **长话题历史分页**、**全链路性能优化(两批)**、**长会话稳定性兜底** 与 **对抗性审查修复** 四大方向。 + +### 新增功能 + +#### 长话题历史 keyset 分页加载 +- 后端新增 `load_messages_for_topic_page`,按 `seq < cursor + limit` 走 `(session_id, seq)` 复合索引替代 OFFSET 深翻页,`ChatMessage` 增加 `seq` 游标字段,支持超大量历史消息。 +- 前端触顶增量加载:批次缓存在 `pendingHistoryRef`,收到 `topic_history_end` 一次性去重 prepend,`scrollTop` 按新增高度补偿锚定原头部消息;不足一屏自动补页,loading 超时 10s 自愈;流式输出中加载历史不清空流式累加器。 + +#### 设置页字段 UX 改进 +- 设置页字段提示改为问号图标悬停气泡,避免长说明文本挤占布局宽度。 + +#### 子代理运行时长配置化 +- `max_run_secs` 接入 `AgentConfig`(`config.json` → `agents` 段),不再硬编码;`From` 透传与所有字面构造点已补齐。 +- `cli init` 写入 agent 路径时保留既有 `max_run_secs` 而非重置默认。 +- `max_run_secs` 默认值由 3600(60 分钟)改为 0(不限制),避免长任务被单次执行时间上限中断;需要时可在 `config.json` 的 `agents` 段显式配置。 + +### 性能优化 + +#### 第一批性能修复 +- 飞书通道 HTTP client:新增 connect/全局超时,token 刷新与 reaction 叠加紧超时,消除无限挂起风险。 +- SQLite:WAL 模式下 `synchronous=NORMAL`(per-connection `with_init`),6 处批量写入循环改用 `prepare_cached` 复用预编译语句,写入吞吐显著提升。 +- `web_fetch`:复用长生命周期 HTTP client,响应体改为流式限长读取(上限=字符限额×4,封顶 32MB),替代全量读完再截断。 +- 前端:`App.tsx` effect/callback 依赖由 `subAgentView` 对象改为 `subAgentTaskId` 原始值,修复子代理流式期间 token 统计 500ms 定时器被每帧重置永不触发;`MessageBubble` / `ToolDetailModal` 的 `ReactMarkdown` components 与 remarkPlugins 提升为模块级常量,避免流式渲染期间每帧重建。 + +#### 第二批性能修复 +- 同步阻塞操作(附件处理、历史加载、scheduler/memory_search 的 SQLite 调用)全部移入 `spawn_blocking`,避免占用 async worker 线程。 +- LLM Provider `reqwest::Client` 按超时配置缓存复用,减少 TLS/连接建立开销。 +- Agent loop:图片过滤加廉价预判避免全量深拷贝;请求克隆改借用;工具定义 `Arc` 化减少大对象复制。 +- 定向 `COUNT / LIMIT 1` 查询替代全量加载计数(`wait_coordinator`、`task session` 重建)。 +- 前端:面板/侧栏/聊天组件 `memo` 化;`merged_tool` 对象按值复用缓存;流式 delta rAF 节流批量 flush;`useMemo` 缓存分组排序结果。 + +#### MCP 可观测 +- MCP tool 调用全链路往返耗时(入口→MCP server→返回)新增 debug 日志,便于定位慢调用。 + +### 修复 + +#### 长会话后新消息无响应(核心稳定性) +- 发送 `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 批量删除的单元测试,回归有保障。 + +#### 对抗性审查修复 +- 子代理 spawn 顺序调整为「先注册 `cancel_registry` → 再写 DB running 记录」,消除 reap 误杀刚启动子代理的微秒级竞态窗口。 +- `delete_messages_by_ids` 删除后按活 COUNT 重算 `sessions/topics` 的 `message_count`,修复计数列漂移。 + +#### 存储数据正确性 +- 归一化历史前缀累积污染的会话 ID(一次性迁移),修复会话 ID 被多次加前缀导致查询找不到对应行。 +- 清理旧版本遗留的空 CLI 会话,`list_sessions` 日志级别从 info 降级 debug,减少运行噪音。 + +#### 前端交互 +- 回到顶部改用 rAF 自驱动动画,修复消息多时平滑滚动被 virtualizer 纠正写入打断停在半路。 + +#### Provider 请求兼容 +- Anthropic 型 provider `max_tokens` 留空兜底从默认值提高至 8192。 +- 模型未配置 Temperature 时,请求体 JSON 不再携带该字段,避免部分供应商对显式 null/空值报错。 + +#### Windows 终端卡死 +- 启动时禁用 Windows 控制台 QuickEdit 模式并改为非阻塞日志写入,修复 stdout 输出被 QuickEdit 选中阻塞、需按回车才继续的历史顽疾。 + +--- + ## [0.4.2] - 2026-08-17 较 [0.4.1] 的 8 个 commit 迭代,聚焦 **安全漏洞修复**、**全链路性能优化** 与 **前端健壮性** 三大方向。 diff --git a/src/agent/runtime_config.rs b/src/agent/runtime_config.rs index 8c43326..3614bc3 100644 --- a/src/agent/runtime_config.rs +++ b/src/agent/runtime_config.rs @@ -22,8 +22,8 @@ pub struct AgentRuntimeConfig { pub max_run_secs: u64, } -/// 单次 agent run 默认墙钟预算。 -pub const DEFAULT_MAX_RUN_SECS: u64 = 3600; +/// 单次 agent run 默认墙钟预算。默认 0 表示不限制,需要时可在 config.json 的 agents 段按 agent 设置。 +pub const DEFAULT_MAX_RUN_SECS: u64 = 0; impl From for AgentRuntimeConfig { fn from(config: LLMProviderConfig) -> Self {