Conversation
HTTP/2 bidi 路径的 pump 把 kvClientMessage 与 clientHeartbeat 一并 continue 掉, 导致 getBlobArgs 的回包 (getBlobResult) 永远到不了 waitForMessageMatching, requestContextParts 四类 blob 取回在 bidi 模式下只能靠 10s 超时兜底。 SSE 降级路径 (BidiAppend → appendMessage) 从未做过这种过滤, 只有 bidi 受影响。 pump 抽为可测的 pumpBidiClientMessages: 仅丢 clientHeartbeat, kv 帧入队。 首条 runRequest 之前的预读循环仍丢弃 kv 帧 (彼时无 session 可推, 也无人等待)。
对齐官方 ControlledKvManager 架构: 客户端是 blob 唯一持有方, 服务端需要时 发 kvServerMessage.getBlobArgs 取回。此前 rebuildConversationHistory 只查 内存 Map + SQLite, 未命中静默跳过, resolvedBlobs 会小于 requestedBlobs。 阶段 1 (零风险兼容期): 只加回源、不删存储 —— 取回的 blob 仍经 cacheBlob 双写内存 + SQLite, 本地库照常写, 行为不变只多一条兜底路径。 - historyBlobFetch.ts: 缺失列表按 32 一批; 首批第一个作探针串行取回 (探测通道 活性与客户端是否回显 kv id, 不回显 → 退化串行), 其余整批一次发出再按各自 id 等回包; 单条 10s / 整体 60s, 超限标记 failed 不阻塞对话。 blobId 编码 = TextEncoder.encode(historyBlobId) (kvMessage/parseRunRequest 逆运算); 回包 bytes 做 UTF-8 解码即是 cacheBlob 需要的 base64 文本 (实测与 agent_blobs.blob_data 逐字节一致), 裸 JSON 兜底再 base64。 - kvBlobResult.ts: getBlobResult 解包从 requestContextParts 抽出共用, 行为等价。 - historyManager.rebuildConversationHistory: 同步 → async generator, 新增 session / allocateBlobId 入参; 回源判定在 warmupBlobsAsync 之后。 `history blobs from cache` 日志新增稳定字段 requestedBlobs / cachedBlobs / fetchedFromClient / stillMissing。 - conversationRuntime.handleConversationRun 新增 options.allocateBlobId, 由 agentOrchestrator 透传 (与四类 Part 取回共用 900_000 起的计数器)。
对齐官方 ControlledKvManager 架构做到终态: 服务端不再落盘任何对话 blob。 实测 3 GB 的 agent_blobs (37 万行) 与客户端 agentKv:blob:* 逐字节一致, 纯属冗余。 唯一取回原语 clientBlobFetch.fetchBlobsFromClient: 每批 ≤32 个一次性发出 getBlobArgs, 按 id 严格匹配回包; 客户端对每个请求必有回包, 一次超时 (10s) 即 视为通道已死, 剩余不再等也不再发。rules/skills/subagents/mcps 四类 Part、 历史 blob、resume 的 turn blob、extraContext blob 全部走它。 - blob.ts: blobIdToBytes / jsonBlobDataFromClientBytes / binaryBlobDataFromClientBytes —— 与 kvMessage 发 setBlobArgs 时的两种字节形态互为逆运算 (JSON blob 存的是 base64 文本的 UTF-8 字节, 二进制 blob 存 raw protobuf)。 - blobStore.ts: 纯内存字节 LRU (128 MB, 实测最大会话 ~4 MB), 删 SQLite 依赖。 - sqlite.ts: 去 agent_blobs DDL; 首次启动 DROP TABLE + VACUUM + wal_checkpoint (实测 3.25 GB → 12 MB, ~6s, 在客户端 30s 等待预算内), 幂等, 失败仅告警。 - historyManager: loadHistoryEntries 为对话与 summarize 两条路径共用的历史装载; sendRootBlobsUnknownToClient 把压缩产物里服务端新造的 root blob (repair 重编码 / 占位 / 锚点) 补发给客户端 —— 没有 SQLite 副本后这是它们唯一的存身之处。 - turnTracker.ensureTurnBlobCached: resume 时最近一个 turn blob 未命中则回取。 - requestContextParts: 只剩 decode / apply, 取回归并到公共原语。 - agentOrchestrator: 去 warmup; 四类 Part 一批取; extraContext 未命中兜底回取。 - 删 database/blobs.ts、handlers/agent/persistence.ts、handlers/agent/database/* (死 shim)、historyBlobFetch.ts、kvBlobResult.ts。 生产代码净减 210 行。
取消全局历史 LRU,必要历史不完整即停止生成,所有新引用经客户端确认后才提交 checkpoint,并保留旧 SQLite blob 恢复源。补齐上传交接、取消与 BiDi 收尾,以及真实续聊、resume 和两类压缩的回归测试。
安装和更新保留既有 routes/providers 文件,新配置默认关闭 BYOK,不再直接查询 Cursor 正在使用的 state.vscdb。增加隔离 HOME 的配置保留回归测试。
排除未跟踪的 bun.lock,仅调整 VSIX 文件清单,不修改用户工作文件。
复用客户端 KV 与运行身份,阻止缺失依赖及迟到写入污染历史;用条件提交替代取消补偿,并补齐 SDK、传输清理及资源准入的真实入口回归。
- 新增 CheckpointDelivery: 校验终态收据后原样重放 checkpoint 三帧并恢复 blob 图, 不重新生成内容/重跑工具 - 新增 admitClientCheckpoint: legacy 结构兼容验证; 冲突时走原生 AskQuestion 由用户确认, 拒绝静默替换历史 - compactLocal/compactRemote 合并为 compactionExecution 单入口; 摘要心跳泵迁入 wait.ts - tokenCounter 支持按 token 头/尾切片; checkpointManager 统一 saveRunCheckpoint 的 blob 确认顺序 - 清理 config/sqlite/logger 死代码; 新增 AGENTS.md 与 3 个集成/回归测试
- sanitizeUnsupportedHistoricalTools 原位替换产生的 text 块会形成 [tool_use, text], 触发 contains text after tool_use - 复用既有拆分语义, 统一将非 tool_use 块排在首个 tool_use 之前 - 新增回归测试: Edit 与 OpenAI 专用 ApplyPatch 混合历史不再抛错
- 新增测试/文档从追踪中移除, 已有测试文件还原为上游版本 - 工作区文件与本地修改全部保留, 仅收敛 PR 的 diff 范围
786153747
added a commit
to 786153747/CCursor
that referenced
this pull request
Sep 17, 2026
PR CometixSpace#23 (blob runtime 边界 + checkpoint 恢复/回放) 重构后, 一批测试仍在断言已被 删除的 API, 造成 33 个类型错误 + 29 个用例失败。这些失败在本分支 HEAD 上就 已经存在 (用干净 worktree 对照过), 导致 `pnpm run vsix` 连 check-types 都过不去。 - blobStore: 模块级单例 (cacheBlob / getCachedBlob / resetBlobCacheForTests / warmupBlobsAsync) 已移除, 现在是"每个 run 一个 RunBlobStore", 测试按新契约 注入 (autoSummarize / protocolStep4Blobs / turnTracker / agentOrchestrator) - database/blobs 模块已删除 (服务端不再持有 blob 副本): 删掉落库+预热用例, 替换为覆盖 RunBlobStore 的内存留存 / 同 id 内容冲突拒绝 / dispose 语义 - hydrateHistoryEntries 现在对缺失 blob 抛 BlobIntegrityError 而不是静默跳过, 用例改为断言拒绝 - planCompaction 已从"按条数切分"改为 token 预算驱动 (含可行性降级/b-mode), 断言改用 budgetOverride 构造真实切分, 并锁住"assistant tool_use 与其结果 消息永远不被切到两侧" - requestContextParts: fetch*Part 生成器已收敛进 clientBlobFetch, 本层只保留 decode*Part / apply*Part, 用例改走 applyRequestContextPart 入口 - protocol.test.ts: rules fixture 补一条 source=2 的用户级规则, 真正覆盖 <user_rules> 渲染分支 (此前该断言从未命中) - agentOrchestrator: 空 conversationState 撞上已提交 checkpoint 时, 运行必须 被拒 (Checkpoint version conflict; history preserved) 而不是静默丢弃历史, 按新契约重写断言 - vitest.config.ts: testTimeout 放宽到 20s, 吸收并行跑全量时的模块转换抖动 (protocolKnowledgeBase 冷启动被 5s 预算误杀, 单跑仅 1.8s) 结果: check-types 0 error / lint 0 error / test:server 414 passed, 0 failed。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更概览
共 24 个提交,按阶段递进:
1. 自动压缩死循环修复
2. 对话 blob 运行时边界 + checkpoint
getBlobArgs回源,删除服务端 SQLite 副本compactionExecution单入口;工具降级历史顺序修复(contains text after tool_use)3. 用量统计与 installer
bun.lock