保留的 Claude 后台任务文本¶
实际的 Claude 任务跟踪器通过其 512 字符的描述/名称切片保留了过大的输入字符串。其运行中任务、已结算任务和最近移除任务都可能各自保留这些切片。该修复在共享文本边界处使用现有的 ownRetainedString;规范化、UTF-16 裁剪、任务身份、发布以及生命周期行为保持不变。
此修复扩展了 ML-018 / #20960。
复现¶
该脚本打包了实际跟踪器及其保留类。其基线仅在内存中移除新增的复制调用。它测试扁平字符串、拼接字符串以及 JSON 解析的 SDK 风格帧;每个输入都有独立的任务所有者。它在 GC 之后测量,然后清空跟踪器,并在测量清理之前让出。结果和 bundle 哈希 保留了完整运行记录。
| JSON 解析用例 | 每任务输入 | 任务数 | 可见文本 | 清理前堆 | 清理后堆 |
|---|---|---|---|---|---|
| 运行中 | 64 Ki 字符 | 32 | 16,384 字符 | 2,125,672 | 43,536 |
| 已结算 | 64 Ki 字符 | 32 | 16,384 字符 | 2,127,072 | 44,296 |
| 已移除,等待结果 | 64 Ki 字符 | 32 | 0 字符 | 2,108,136 | 25,360 |
| 运行中 | 4 Mi 字符 | 8 | 4,096 字符 | 33,562,624 | 11,048 |
| 已结算 | 4 Mi 字符 | 8 | 4,096 字符 | 33,563,960 | 11,656 |
| 已移除,等待结果 | 4 Mi 字符 | 8 | 0 字符 | 33,558,584 | 7,008 |
在 macOS 上使用 Node v26.6.0 捕获。对于每种情况,清理后都回到接近初始堆的水平。六个回归测试针对描述和名称,让实际跟踪器经历这三种生命周期。文本行为测试保留空白规范化、回退名称以及被裁剪的代理对。
可达性与限制¶
claude-stream-json-connection.ts 将 SDK 消息转发给结构化适配器,其 emit 会调用 backgroundTasks.observe。已安装的 SDK 0.3.251 使用 Node readline 组装 stdout 记录,使用 JSON.parse 解析每条记录,然后让出该记录。所检查的路径不施加记录或描述长度限制;原生读取块大小不会限制已组装的 JSON 字段。描述在 SDKTaskStartedMessage 中声明为普通字符串。
该描述切片和此 SDK 版本也存在于 v1.4.198;该标签使读取器在 claude-background-task-tracker.ts 中保持内联。独立的已结算/最近移除保留路径和名称读取器路径描述的是当前代码。
当前映射受数量限制:每个跟踪器最多 256 个运行中条目、256 个已结算条目和 256 个最近移除条目。当没有可见工作剩余时,已结算上下文会清除;最近移除上下文等待结果、逐出或显式清除。会话结束/关闭会清空跟踪器。每个保留字段的复制工作最多为 512 个 UTF-16 码元,并且它不会减少临时解析分配。
这些是合成的大尺寸任务字段,并非受影响用户收到此类字段的证据。该路径涉及结构化 Claude 会话,而非普通终端输出或 stderr。#19831 和 #19768 均未确立此触发条件。
独立的摘要受限子代理 ID 也在实际消费者处进行了检查。移动端响应净化器可能会临时保留原始值,直到 JSON 序列化将其拼接的 ID 扁平化。Worker 转录边界处理已为其字节预算进行序列化,并在探测中释放了该父对象。未确立持久的 ID 所有者泄漏,因此该辅助函数保持不变。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca