🐛 fix(sdk): hooks/skills 域十项修复——写回竞态、输入源错误转发、hook 隔离等 - #430
Conversation
replaceAll 字符串替换会把参数中的 $&/$$ 等序列当作替换模式解释, 改用函数形式保证占位符展开为原始字面量。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
yamlString 此前只转义反斜杠与双引号,标题含裸换行或 C0 控制字符时 会产生非法 YAML frontmatter。补齐 \n/\r/\t 及其余控制字符的 \xNN 转义,保证 frontmatter 恒为合法单行。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
buildGrepArgs 未映射上下文行参数,rg 缺失回退 grep 时上下文请求被 静默丢弃。GNU/BSD grep 原生支持这三个参数,直接透传;注释标注 entries 计数口径与 rg/native 引擎的差异(上下文行计入输出行)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
findCellIndex 对缺省 cell_id 返回 0,insert 实际插到第一个单元格 之后,与文档 at the beginning 不符。insert 分支单独解析锚点: cell_id 与 cell_number 均缺省时取 -1 走既有的插到开头分支; 显式锚点与 replace/delete 行为不变。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
original_file/updated_file 把完整 notebook JSON 塞进工具结果, 白白膨胀事件流与 token。结果只保留变更单元格摘要,全文按需 Read。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
两处修复: - 函数 hook 超时的 setTimeout 从不清理,成功路径泄漏最长 30s 句柄; 改为 race 结束即 clearTimeout,并为 handler promise 挂防御性 noop catch,超时后的迟到 rejection 不外溢。 - matcher 正则编译在 try 块外,非法 pattern 同步抛穿循环被上层空 catch 吞掉,该事件下全部 hook 静默丢弃;编译移入独立包裹,失败 记日志、跳过该定义并上报 error 型 hook_response,其余 hook 继续。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
构造器对 streamInput 只挂 finally 无 catch:async iterable 输入源 中途抛错即 unhandledRejection,且队列永不关闭导致 runner 永久 pending。AsyncInputQueue 增加 fail(),构造器补 catch 后经其把错误 转发为迭代器错误进入消息流;push-after-close 同链路一并覆盖。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
applySkillImprovement 的 readFile→备份→模型长窗口→rename 无条件覆盖 链路无锁无复核,外部修改会被静默覆盖。整个写回段接入 withFileMutationLock 串行化,rename 前重读快照比对,内容变化即清理 备份并中止报错。restoreSkillVersion 备份当前内容失败时不再吞掉错误 继续覆盖,改为中止恢复。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
宿主注入 provider 契约下 SDK 不持有凭据,auth_status 在 apps 全域 零消费,每轮 run 纯属死重:入口 fail-fast 已保证到达运行循环必有 provider,直接删除该事件发射并同步调整断言其存在的测试。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Code Review逐项核对了十项声称的修复,全部真实落地,修复方向无一修错,CI 6/6 绿(含长期红的 Computer Use 本轮也绿),可合并。以下为遗留发现。 逐项核对结论
发现[P2]
[P3] NotebookEdit insert 对正超界 cell_number 静默追加尾部,与 replace/delete 的报错不一致( [P3] 「排队等待既有文件锁」测试无法钉住锁语义( [P3] matcher 隔离两个小缺口( [P3] applySkillImprovement 持锁跨 callModel 且锁无超时护栏 [P3] #383 残留:engine.ts 的 CODEANY_API_KEY env 回退链仍在( |
概述
修复 sdk 全量 review 提出的 10 个 issue(hooks / skills / 工具杂项域),每个 commit 独立可跑绿。
验证
bun run typecheck六 workspace 全绿Notes
rebase 至 main 最新并与 provider 移除语义对齐:#383 的 env 链清理部分被 main 等价实现吸收,本分支保留的行为增量为 auth_status 死事件移除与测试翻转。
Closes #348, closes #349, closes #355, closes #356, closes #369, closes #370, closes #378, closes #382, closes #383, closes #385
🤖 Generated with Claude Code