fix: reduce conversation history memory use
GoodBuddy Agents / Validate Agent source (push) Canceled after 0s
GoodBuddy Agents / Build darwin arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux x64 Agent (push) Canceled after 0s
Cross-platform packages / Validate source (push) Canceled after 0s
Cross-platform packages / Authorize desktop packaging (push) Canceled after 0s
Cross-platform packages / linux arm64 (push) Canceled after 0s
Cross-platform packages / macos arm64 (push) Canceled after 0s
Cross-platform packages / windows arm64 (push) Canceled after 0s
Cross-platform packages / linux x64 (push) Canceled after 0s
Cross-platform packages / macos x64 (push) Canceled after 0s
Cross-platform packages / windows x64 (push) Canceled after 0s
Cross-platform packages / Publish GitHub and OSS release (push) Canceled after 0s
GoodBuddy Agents / Validate Agent source (push) Canceled after 0s
GoodBuddy Agents / Build darwin arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux arm64 Agent (push) Canceled after 0s
GoodBuddy Agents / Build linux x64 Agent (push) Canceled after 0s
Cross-platform packages / Validate source (push) Canceled after 0s
Cross-platform packages / Authorize desktop packaging (push) Canceled after 0s
Cross-platform packages / linux arm64 (push) Canceled after 0s
Cross-platform packages / macos arm64 (push) Canceled after 0s
Cross-platform packages / windows arm64 (push) Canceled after 0s
Cross-platform packages / linux x64 (push) Canceled after 0s
Cross-platform packages / macos x64 (push) Canceled after 0s
Cross-platform packages / windows x64 (push) Canceled after 0s
Cross-platform packages / Publish GitHub and OSS release (push) Canceled after 0s
Load lightweight conversation summaries and hydrate full history only when needed, preserving search, copy, export, queued requests, and remote questions. Keep unchanged image reconciliation messages stable so list refreshes no longer resend the entire saved history. Prepare Desktop 0.13.6 with the approved bilingual notes and aligned feature matrices. Agent remains 0.13.0; no LoongArch preview or navigation demo edits are included. Development validation passed 4301 tests with 67 skipped; the user requested CI validation instead of repeating local release checks. Release note: 历史会话按需加载,减少切回应用时的重复保存和内存占用,同时保留完整历史、搜索与续聊。
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
| [多终端页签 PRD](./terminal-tabs-prd.md) | 工作栏应用的固定、可关闭、单实例和多实例策略,以及多终端生命周期 |
|
||||
| [浏览器多实例技术设计](./browser-tabs-technical-design.md) | 浏览器 Tab 身份、Conversation 绑定、IPC、BrowserService 和 MCP 路由 |
|
||||
| [实现与验证进度](./progress.md) | 工作区与 Runtime 相关改动的实现事实、验证证据与剩余阻塞 |
|
||||
| [执行记录存储与升级回收](./execution-history-storage.md) | 子任务过程差量存储、远程去重、旧库转换、空间回收及升级界面 |
|
||||
| [执行记录存储与升级回收](./execution-history-storage.md) | 子任务差量存储、远程去重、旧库转换、会话摘要与完整历史按需读取、内存引用释放 |
|
||||
| [Runtime 交互边界](./runtime-interactions.md) | 原生权限、结构化问答、后台拒绝、终端交互、并行与输出、消息请求状态及资源生命周期规则 |
|
||||
| [Runtime 进程复用技术设计](./runtime-process-reuse-technical-design.md) | 跨 Runtime 资源调研、锁定协议证据、进程与会话拆分、远端模型桥、实施顺序和性能验收 |
|
||||
| [Runtime 执行清单技术设计](./runtime-checklist-technical-design.md) | OC/CN 原生清单提取、远程 Agent 传递复用、消息恢复与真实部署验收;尚未实现 |
|
||||
|
||||
@@ -33,6 +33,38 @@
|
||||
的缓存引用,不影响其他会话。若事务随后回滚或仍收到该任务的后续事件,按已提交记录重建。
|
||||
释放引用不等于进程 RSS 立即下降,垃圾回收和 Runtime 自身会话缓存另按生命周期回收。
|
||||
|
||||
## 会话列表读取与前端保留
|
||||
|
||||
列表读取与数据库存储是两个不同层次。`messages.metadata_json` 继续保留完整过程,
|
||||
本次读取优化不修改 schema、迁移或用户数据:
|
||||
|
||||
- Renderer 启动及焦点、会话、队列刷新使用 `conversations.listSummaries(detailIds)`。
|
||||
普通未打开会话只返回标题、项目、上下文设置和消息数量/首条角色,不解析或跨 IPC
|
||||
传输正文、工具、子任务及图片操作元数据。
|
||||
- 当前会话、现有 KeepAlive 视图,以及 Main 仍持有请求、数据库中仍有活动 Task 或
|
||||
streaming 消息的会话返回完整消息。保留既有最近 100 条加较早活动会话的列表规则,
|
||||
请求中的已缓存会话即使更早也仍能刷新。
|
||||
- 打开历史通过 `conversations.get(id)` 读取全部消息,不使用会截断历史的分页上限。
|
||||
加载时明确显示进度;失败保留会话与输入,提供原地重试。发送、队列派发和压缩上下文
|
||||
必须先确认完整历史;复制与导出临时读取完整内容,不把未打开会话留入视图缓存。
|
||||
- 搜索由 Main 在 SQLite 中读取标题与正文,不读取过程元数据,保持原来的 Unicode
|
||||
大小写匹配和字面子串规则。范围包含 Renderer 已保留的较早会话;前端同时匹配尚未
|
||||
落库的消息。搜索状态只保留命中的 ID,不额外持有整份历史对象。
|
||||
- KeepAlive 淘汰后,在现有保存周期中释放已经确认落库且空闲的详情及持久化比较引用。
|
||||
未保存消息、正在执行的会话、待答/待审批内容不被淘汰。读取中的请求按会话合并;
|
||||
晚到摘要不能覆盖刚打开的历史或新到的后台审批,摘要附带的实时新增消息仍增量保存。
|
||||
- `messageSummary` 仅为只读列表标记,不进入持久化 header。保存继续使用已有逐消息
|
||||
增量接口,空消息数组不代表删除历史。原有完整 `list()` 与数据库 `getConversation()`
|
||||
接口保留供其他调用方使用。
|
||||
- 图片状态通过同一合并函数处理。本地更新与 Main 图片操作按原有时间优先级合并,
|
||||
未变化消息返回原对象,避免每次列表刷新后把无变化的整个历史当作脏消息再次保存。
|
||||
- 本机和托管 SSH 的 Renderer/Main 读取、持久化与恢复投影共用以上实现。Agent 的
|
||||
transcript、原生 Session、权限及模型桥协议未改变;完整列表、摘要和详情都附带
|
||||
Main 当前恢复请求的问题投影。
|
||||
|
||||
此优化不等于工具折叠内容的延迟渲染,也不保证操作系统立即归还全部 Private Commit。
|
||||
实际测量与适用边界见[实现与验证进度](./progress.md)。
|
||||
|
||||
## 旧库升级
|
||||
|
||||
桌面在打开业务数据库之前启动独立 Node 工作线程,使用同一套编码和还原函数转换旧库。
|
||||
|
||||
@@ -1,5 +1,100 @@
|
||||
# 工作栏实现与验证进度
|
||||
|
||||
## 2026-09-15 Desktop 0.13.6 发布准备
|
||||
|
||||
用户批准两项性能修复的中英文更新说明,指定 Desktop 0.13.6,不发布 Agent 或
|
||||
LoongArch 预览,并明确排除工作区另外四个应用导航设计/演示文件。
|
||||
`package.json` 与 lockfile 的两处根版本一致,更新说明校验通过。
|
||||
双语功能矩阵已核对并补充按需历史行为;Agent 保持 0.13.0。
|
||||
|
||||
用户随后要求直接交由 CI 发布,本地独立候选的全量验收命令被取消,未记为通过;
|
||||
开发阶段的完整测试及实测结果保留在下一节。候选发布不再进行本地生产构建或
|
||||
打包,主分支 CI 与六平台标签工作流仍为发布验收入口。最终提交、标签与公开
|
||||
产物状态须以远端实际结果核对,不以版本号变更视为已发布。
|
||||
|
||||
## 2026-09-15 会话列表与图片合并性能修复
|
||||
|
||||
本轮针对用户报告的 0.13.5 卡顿与高内存,不修改正在运行的正式应用或数据库。
|
||||
只读检查发现最近会话正文约 1.14 MiB,消息 metadata 约 119.3 MiB;`f8d0741`
|
||||
的图片合并还会重建无变化消息,使焦点刷新后再次保存历史。实现规则见
|
||||
[会话列表读取与前端保留](./execution-history-storage.md#会话列表读取与前端保留)。
|
||||
|
||||
已实现并验证:
|
||||
|
||||
- 图片合并的三个分支共用保留引用的函数。1,600 条无图片历史引用不变;App 使用
|
||||
JSON 往返形状刷新后,保存的消息数为 0,较新的图片操作、成果关联和流式正文仍保留。
|
||||
- 启动、焦点/队列刷新、活动跳转与自定义任务入口均使用摘要或按 ID 读取。
|
||||
搜索保留中文、Unicode 大小写和字面 `%_` 匹配,包含仍显示但已落到最近 100 条以外的
|
||||
会话;真实 SQLite 中 501 条历史仍可完整取回,header-only 保存不删除消息。
|
||||
- 打开、复制、导出、发送及压缩上下文保留完整历史语义。详情读取失败可原地重试;
|
||||
旧摘要不能覆盖晚到的后台审批或刚加载的历史。搜索只保存命中 ID,复制/导出不把
|
||||
未打开详情留入缓存,空闲详情在已确认保存后随现有 KeepAlive 生命周期释放。
|
||||
- 三路 simplify 审查覆盖全部本轮源码,修正了两处残留全量读取、搜索保留大对象、
|
||||
较早会话搜索遗漏及后台审批竞态。保留已发布完整列表接口,无 schema/Agent 协议迁移。
|
||||
- 定向 App、SQLite、IPC/恢复及图片合并测试:**443 通过**。最终 `npm test`:
|
||||
**4,301 通过、67 跳过、0 失败**,约 736.46 秒。`npm run typecheck` 和所有本轮
|
||||
源码文件的 ESLint 通过。全仓 `npm run lint` 仍被本轮范围外的
|
||||
`application-tool-navigation/navigation-demo.js:360` 的 `no-unused-expressions`
|
||||
阻塞,未修改该用户编辑;不能记为全仓 lint 通过。
|
||||
- 以 `f47049c40d757a38296d06d281b87fb6a5fe1c8c` 和本轮 14 个源码/测试文件冻结
|
||||
before/after,两个生产 Electron 构建均成功;验证后哈希核对无源码漂移。
|
||||
- 隔离生产 Electron 的 100 会话/1,600 消息试验:首次摘要读取 0 条消息,仅当前会话
|
||||
详情读取 16 条;搜索第 100 个会话的正文不预载其 metadata,点击后再读取完整 16 条。
|
||||
已检查实际 UI 截图,不是只调用数据库或 Mock。
|
||||
- 另一个隔离 App 正常 UI 打开未加载的旧会话并发送,Main 请求携带原有 2 条历史;
|
||||
**1 次真实直连文本调用**,HTTP 200,最终完整保存准确标记 `HISTORY_RENDERER_7391`。
|
||||
初始等待使用错误 DOM class 超时,随后以保存结果核对成功,未重复发送。
|
||||
- Linux x64 共享 Host 在本轮独立目录构建、安装并激活当前源码 Agent/OpenCode,
|
||||
真实 SQLite 摘要测试通过;**2 次真实无工具文本调用**均完成且 delivered=1,
|
||||
第二轮复用同一原生 Session 并准确记住首轮标记。测试 Agent 停止后独立 `/proc`
|
||||
检查无该目录所属进程。此检查验证当前源码部署与 Session 续接,不冒充远端 UI
|
||||
断线恢复全流程;桌面恢复问题投影由本轮真实 SQLite IPC 回归覆盖。
|
||||
|
||||
本轮真实模型调用共 **3 次文本、0 次图片**,无工具请求,不新增图片生成费用。
|
||||
准备阶段的错误 fixture provider/图片默认字段、独立 profile 缺少原安全存储的
|
||||
加密上下文、Host 源码包漏带 LICENSE 均只修验证脚本;失败记录保留,不计为产品修复。
|
||||
所有脚本与原始证据位于忽略目录
|
||||
`.agent-resources/conversation-performance-20260915/run-KX7bIz/`。
|
||||
|
||||
### 完整 App 配对内存测量
|
||||
|
||||
最终采用三组顺序执行的 before/after 冷启动,共六个独立 profile。每组使用相同
|
||||
100 会话/1,600 消息,正文 1.20 MiB、完整 reasoning metadata 119.69 MiB;
|
||||
执行三次焦点刷新、搜索未打开正文并导航 11 次。使用直连 Runtime 的无网络配置,
|
||||
不启动 OC/DSH、不调用模型;测试与构建已完成后再开始这组测量。
|
||||
|
||||
下表是各三次结果的中位数,内存为 Windows Private Commit,单位 MiB:
|
||||
|
||||
| 指标 | before | after |
|
||||
| --- | ---: | ---: |
|
||||
| 初次传入 Renderer 的完整消息数 | 1,600 | 16 |
|
||||
| 三次无变化刷新保存的消息数 | 4,800 | 0 |
|
||||
| Main 焦点列表读取耗时(ms,不是端到端帧延迟) | 207.28 | 8.05 |
|
||||
| 启动稳定点 App / Renderer | 803.42 / 284.77 | 682.36 / 155.73 |
|
||||
| 三次刷新后 App / Renderer | 1,640.43 / 703.91 | 661.34 / 154.16 |
|
||||
| 导航及缓存释放后 App / Renderer | 895.27 / 557.09 | 574.65 / 248.95 |
|
||||
| App 采样峰值 | 1,788.71 | 694.35 |
|
||||
|
||||
每次 10 个进程样本,定时器间隔 5 秒,另有阶段采样,不代表连续峰值。
|
||||
本数据集采样峰值中位数下降 **61.18%**;before 三次峰值分别为
|
||||
2,506.29 / 1,788.71 / 1,766.39,after 为 694.35 / 693.61 / 719.27。
|
||||
它测的是这两项历史读取/重复保存修复,不含重型 Runtime 的原生内存,不能推广为
|
||||
正式用户整个 App 必然下降相同比例,也不是长时间空闲泄漏证明。
|
||||
|
||||
六个最终 profile 都保留 1,600 条消息,按 ID/角色/状态/正文/完整 reasoning
|
||||
计算的 SHA-256 一致,`quick_check` 均通过;六个 App 均正常退出(code 0)。
|
||||
汇总见 `summary.json`,单轮为 `before-2` 至 `after-4` 的 report/acceptance。
|
||||
|
||||
保留但不纳入三组对照的早期 `before-1`/`after-1`:after 的驱动在清除搜索后未等待
|
||||
延迟筛选收敛,导航失败;退出时还记录 `PostQueuedCompletionStatus` 无效句柄。
|
||||
后续为两个版本都补上可见列表等待,并等本轮采样子进程完成后再正常退出;
|
||||
未唯一定位早期退出错误,也未据此修改产品代码。最终六轮完成后的监督脚本仍因
|
||||
向已退出 CDP 调用 browser close 返回错误;随后不附带 CDP 独立关闭命名浏览器成功。
|
||||
OS 按本轮目录核对无遗留 Electron/Node 进程,原始失败日志未覆盖。
|
||||
|
||||
文档检查覆盖本轮六份文档、81 个相对文件链接,无缺失;未逐一校验所有历史锚点。
|
||||
修改未提交、未推送、未发布。
|
||||
|
||||
## 2026-09-15 Runtime 执行清单设计(未实现)
|
||||
|
||||
对应 FR-CL1–FR-CL4。用户本轮明确只完善设计与进展文档,不改代码;
|
||||
|
||||
@@ -313,9 +313,10 @@ token、global dir、活动 Session 或权限/问题队列。设置替换及窗
|
||||
callback;会话释放才结束其可续读输出和工具资源,不在工具刚完成时删掉用户可查看结果。
|
||||
- 当前 50 个会话的 history 限制不是字节上限。先采堆与 retained size,再决定可从
|
||||
SQLite 重建的历史缓存是否使用字节约束和 LRU,不能先增加一套持久历史副本。
|
||||
- Renderer 最近 100 个会话整包 metadata 加载另做列表摘要、当前会话分页、展开后取
|
||||
详情的性能改造;本方案只记录依赖,不将这一尚未设计完成的 UI 改造算进进程修复交付。
|
||||
必须保持完整历史、搜索、重新打开和当前活动事件可用。
|
||||
- Renderer 整包 metadata 加载是独立于进程复用的性能工作。现有实现改为列表摘要、
|
||||
打开会话时读取完整历史,不截断已保存消息;搜索、复制、续聊、后台活动和缓存释放
|
||||
规则见[会话列表读取与前端保留](./execution-history-storage.md#会话列表读取与前端保留)。
|
||||
不将这项后续修改的收益计入原进程复用对照结果。
|
||||
- 旧 Runtime 磁盘缓存可单独评估版本清理策略,不在本次研究或进程 idle 时删除安装、
|
||||
用户工作区、数据库、备份或历史。
|
||||
|
||||
|
||||
@@ -51,6 +51,11 @@ Main 从已保存图片 profile 的会话调用开关推导允许模型目录,
|
||||
|
||||
Main 仅在图片和会话引用持久化成功后发布完成事件。素材必须是当前会话可访问的附件或成果,沿用已有项目和会话边界;删除会话后的晚到结果不重建会话。
|
||||
|
||||
会话刷新共用保留对象引用的图片状态合并:无图片或图片状态未变化时,不重建消息并触发
|
||||
整段历史重新保存。未打开历史的读取与缓存释放遵循
|
||||
[会话列表读取与前端保留](../assistant-workbar/execution-history-storage.md#会话列表读取与前端保留),
|
||||
不改变图片操作的 Main 所有权、成果关联或时间优先级。
|
||||
|
||||
## 图片协议
|
||||
|
||||
沿用[图片技术设计](../image-generation/technical-design.md)的已有生成、编辑协议及素材限制。接收并校验有界内联图片,不下载 Provider 返回的图片 URL。沿用现有成果存储限制,实施时核对编码开销与超限反馈,不以配置检查成功代替真实生成验收。视频协议、下载、播放及交付计划均不属于本设计。
|
||||
|
||||
Reference in New Issue
Block a user