♻️ fix(sdk): engine 收敛批——惰性 token 估算/stableSerialize 单源/双循环合并/低危积压六项 - #467
Conversation
finally 只保留引擎引用,全量 messages JSON.stringify 估算改到宿主 实际调用 getContextUsage 时执行。sidecar 对该 API 零调用,此前每轮 run 收尾都在白算 ~150 行估算。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
递归排序键 + 过滤 undefined + 保序数组的 JSON 规范化序列化此前在 sdk engine(repeat guard 签名)与 sidecar submission store(payload hash)各有一份手写实现。抽到 @lume/shared 单源,黄金值测试钉死 字节输出。 submission store 副本原用 localeCompare 排序,依赖运行环境默认 locale,跨机器不确定;统一为码点序后对实际 payload 键集(camelCase 标识符)输出逐字节一致,已对照实证。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Skill 混批与 serial 两个循环各自维护的软中断 break / guard-stop 占位 / 中断兜底 / events+toolsUsed 扇出提取为同函数作用域的局部 闭包 runSequentialItem,repeatGuardStop 提升为跨阶段单一声明。 顺带消除"preCheck 仅在不执行时返回空 toolsUsed"的隐式不变量: guard 拒绝路径的空扇出改在 executeToolWithRepeatGuard 唯一出口 显式构造,preCheck 返回类型收窄,concurrent 批删除恒空 push。 纯重构,行为等价,靠现有 engine/abort 测试验证。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1. session_state_changed 全域零消费:删四处发射点、类型与导出,不再每轮持久化进 sessionMessages jsonl。
2. SDKResultMessage.subtype 补 'error_completion_guard' 并删 '| string';sidecar 测试 mock 的非法 "error" 改为真实发射值 error_during_execution。
3. 宿主中途放弃生成器时 finally 清空 queuedSdkEvents,迟到异步事件不再混入下一 run;尾部 drain 前置堵住最后窗口。
4. natives countTokens 降级路径补 catch→null,对齐同文件契约。
5. nativeSearch 公开签名补已支持的 multiline 参数。
6. findModelMeta("") 空串入口守卫,不再命中第一条注册表记录。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Review:#386 / #391 / #393 / #413 收敛批结论可合。四个 commit 与四个 issue 一一对应,无 scope creep,文案合规(无来源性表述),CI 4/4 绿。逐条实证后未发现阻塞项;2 条 P3 跟进 + 若干观察记录如下。 发现[P3] #386 ——
|
#386 为惰性估算保留了 QueryEngine 引用,但 Agent 的关闭路径未清它, engine 连同内部 messages 历史双份驻留到 Agent 生命周期结束。close() 现在置空该引用,getContextUsage 落回零值安全路径,不再触发估算。
executeSingleTool 的后台 task_notification 闭包可在宿主放弃迭代之后 迟到触发,#413③ 的 finally 清空与 drain 前置都堵不住这个窗口。引入 asyncEventEpoch:run 的 finally 递增,各 run 的 onAsyncEvent 闭包捕获 创建时的代际,入队前比对,过期代际直接丢弃——run 结束后任何迟到 事件都不再存活到下一 run 的 drain 窗口。
中文键/emoji 键/大小写混合键 {aZ,Az,az,AZ} 正是 localeCompare 与
码点序的分叉点;黄金值钉死排序字节输出,防止未来误改为 locale 排序。
|
review 三处已修(969a4ea1 / 22e8134 / 4677563):
|
概要
四个 sdk engine 域 issue 的收敛批次,每 issue 一个 commit。
Fixes #386 — getContextUsage 惰性化
lastContextUsage快照改为保留引擎引用lastUsageEngine,估算延迟到宿主实际调用getContextUsage()时执行。Fixes #391 — stableSerialize 单源化
stableSerialize(递归排序键 + 过滤 undefined + 保序数组),黄金值测试钉死字节输出。Fixes #393 — executeTools 双循环收敛
runSequentialItem,不新建模块。Fixes #413 — 低危积压六项
| string;顺带修正 sidecar 测试 mock 中非法的 "error" subtype 为 error_during_execution。验证
bun run typecheck六包全绿(shared/ui/agent-sdk/sidecar/web/desktop)🤖 Generated with Claude Code