跳转至

旧版导入源字节预算

当文件在 stat() 和读取之间增长时,生产导入器接受了大于其现有 16 MiB 配额的转录。该修复将相同配额应用于已消费的原始字节,并在替换日志之前拒绝整个导入。它不会导入截断的前缀。

复现

在已安装依赖项的情况下,从仓库根目录开始:

ORCA_BACKGROUND_LAUNCH=1 node --max-old-space-size=256 docs/audits/legacy-import-source-budget/reproduce.mjs

该脚本将实际生产导入器和解码器捆绑两次。基线恢复导入器的 UTF-8 流,并在内存中省略新的已消费字节配额;第二次运行使用当前源。所有其他依赖项均相同。显式文件路径绕过发现;如果意外调用发现,桩会失败。不需要历史检出或仅本地提交。

每次运行创建一个包含有效 Claude 消息的真实临时文件。受控的 stat 接缝捕获其原始大小,追加空格直到文件恰好为 17 MiB,然后返回原始 stat。生产导入器读取增长后的文件。日志间谍记录替换尝试及其 epoch;不会触及 SQLite 数据库或用户转录。临时文件会被删除。

results.json 记录源哈希、实际已消费字节、流关闭和替换尝试。修复前,导入器消费全部 17 MiB,返回成功,并用解码前缀替换日志。修复后,它在第一个超过 16 MiB 的块上拒绝,销毁流,并保持先前 epoch 不变。读取缓冲允许一个块的超出。

流程与版本归属

该导入器通过结构化会话采用、交接、转录追赶和日志恢复在宿主运行时中运行。在桌面上,该运行时是 Electron main;远程运行时导入其自身宿主本地的源。仅 stat 配额和无限制流已经存在于 v1.4.198,发布提交 e0826956fcfc532f5a1e55b5e081f2e57e553c43。

复现建立了配额绕过,而不是 #19768 或 #19831 的原因。它需要大小检查后的导入以及源增长/替换;两个事件均未提供该证据。此修复独立于 #20963 的可恢复 JSONL 记录限制。

其他整文档审计结果

  • ai-vault/session-transcript-reader.ts:152 将重写的 JSON 文档通过整文件 readFile 和 JSON.parse 路由。Gemini JSON、Hermes、Devin、Cline、Grok 元数据、Kimi 状态、Rovo 和 OpenCode 文件读取器缺少源字节配额。这些是分配峰值;解析缓存保留摘要,而不是完整文档。
  • 生产默认值,包括 v1.4.198,将这些扫描放在分叉的 AI Vault 服务中,具有 384 MiB V8 old-space 限制。这不是总 RSS 限制。ORCA_AI_VAULT_SERVICE_PROCESS=0 则改为将扫描放在共享 main 的 PID 的工作线程中;其 first-prompt 回退直接在 main 中运行。
  • 现有远程整文档流式解析器提供复用路径,但本地转换必须保留 message-sink 投递以用于搜索索引。流式还需要对单个超大 JSON 值具有明确策略;未引入任意历史截断。
  • 较旧的 native-chat/transcript-reader.ts 和 transcript-read-cache.ts 具有整历史行为,包括最新条目缓存豁免,但当前生产源没有这些导出的外部调用点。

验证:50 个针对性测试通过,包括修复前失败的回归、UTF-8 和原始字节限制、精确边界接受以及流清理。Node 类型检查、针对性 lint、格式化和 diff 检查通过。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 orca48/orca