@sema-ai/core 1.275.1 → 1.276.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/brain/anthropic.d.ts.map +1 -1
  3. package/dist/brain/anthropic.js +15 -4
  4. package/dist/brain/anthropic.js.map +1 -1
  5. package/dist/brain/openai.d.ts.map +1 -1
  6. package/dist/brain/openai.js +17 -5
  7. package/dist/brain/openai.js.map +1 -1
  8. package/dist/brain/repetition.d.ts +31 -0
  9. package/dist/brain/repetition.d.ts.map +1 -1
  10. package/dist/brain/repetition.js +55 -0
  11. package/dist/brain/repetition.js.map +1 -1
  12. package/dist/brain/stream-engine.d.ts.map +1 -1
  13. package/dist/brain/stream-engine.js +5 -0
  14. package/dist/brain/stream-engine.js.map +1 -1
  15. package/dist/core/auto-mode-prompt-assets.d.ts +11 -0
  16. package/dist/core/auto-mode-prompt-assets.d.ts.map +1 -0
  17. package/dist/core/auto-mode-prompt-assets.js +19 -0
  18. package/dist/core/auto-mode-prompt-assets.js.map +1 -0
  19. package/dist/core/auto-mode-prompt.d.ts +49 -0
  20. package/dist/core/auto-mode-prompt.d.ts.map +1 -0
  21. package/dist/core/auto-mode-prompt.js +125 -0
  22. package/dist/core/auto-mode-prompt.js.map +1 -0
  23. package/dist/core/auto-mode.d.ts +86 -0
  24. package/dist/core/auto-mode.d.ts.map +1 -0
  25. package/dist/core/auto-mode.js +144 -0
  26. package/dist/core/auto-mode.js.map +1 -0
  27. package/dist/core/hooks.d.ts +20 -1
  28. package/dist/core/hooks.d.ts.map +1 -1
  29. package/dist/core/hooks.js +45 -2
  30. package/dist/core/hooks.js.map +1 -1
  31. package/dist/core/memory-engine/file-backend.d.ts +4 -0
  32. package/dist/core/memory-engine/file-backend.d.ts.map +1 -1
  33. package/dist/core/memory-engine/file-backend.js +86 -25
  34. package/dist/core/memory-engine/file-backend.js.map +1 -1
  35. package/dist/core/memory-engine/frontmatter.d.ts +5 -0
  36. package/dist/core/memory-engine/frontmatter.d.ts.map +1 -1
  37. package/dist/core/memory-engine/frontmatter.js +8 -1
  38. package/dist/core/memory-engine/frontmatter.js.map +1 -1
  39. package/dist/core/memory-engine/memory-backend-contract.d.ts.map +1 -1
  40. package/dist/core/memory-engine/memory-backend-contract.js +17 -0
  41. package/dist/core/memory-engine/memory-backend-contract.js.map +1 -1
  42. package/dist/core/memory-engine/sync-client.d.ts +3 -1
  43. package/dist/core/memory-engine/sync-client.d.ts.map +1 -1
  44. package/dist/core/memory-engine/sync-client.js +41 -8
  45. package/dist/core/memory-engine/sync-client.js.map +1 -1
  46. package/dist/core/memory-engine/types.d.ts +4 -2
  47. package/dist/core/memory-engine/types.d.ts.map +1 -1
  48. package/dist/core/roles.d.ts.map +1 -1
  49. package/dist/core/roles.js +2 -0
  50. package/dist/core/roles.js.map +1 -1
  51. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  52. package/dist/core/runner/prepare-task.js +46 -0
  53. package/dist/core/runner/prepare-task.js.map +1 -1
  54. package/dist/core/runner/tool-disclosure.d.ts.map +1 -1
  55. package/dist/core/runner/tool-disclosure.js +0 -0
  56. package/dist/core/runner/tool-disclosure.js.map +1 -1
  57. package/dist/core/stub-env.d.ts.map +1 -1
  58. package/dist/core/stub-env.js +4 -0
  59. package/dist/core/stub-env.js.map +1 -1
  60. package/dist/core/task-registry.d.ts +9 -0
  61. package/dist/core/task-registry.d.ts.map +1 -1
  62. package/dist/core/task-registry.js +32 -0
  63. package/dist/core/task-registry.js.map +1 -1
  64. package/dist/core/types.d.ts +55 -4
  65. package/dist/core/types.d.ts.map +1 -1
  66. package/dist/engine/execution-env/node-execution-env.d.ts +6 -0
  67. package/dist/engine/execution-env/node-execution-env.d.ts.map +1 -1
  68. package/dist/engine/execution-env/node-execution-env.js +37 -0
  69. package/dist/engine/execution-env/node-execution-env.js.map +1 -1
  70. package/dist/engine/harness/types.d.ts +17 -0
  71. package/dist/engine/harness/types.d.ts.map +1 -1
  72. package/dist/engine/harness/types.js.map +1 -1
  73. package/dist/index.d.ts +4 -1
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +12 -1
  76. package/dist/index.js.map +1 -1
  77. package/dist/tools/fs/index.d.ts +9 -2
  78. package/dist/tools/fs/index.d.ts.map +1 -1
  79. package/dist/tools/fs/index.js +27 -5
  80. package/dist/tools/fs/index.js.map +1 -1
  81. package/dist/tools/fs/search.d.ts.map +1 -1
  82. package/dist/tools/fs/search.js +17 -7
  83. package/dist/tools/fs/search.js.map +1 -1
  84. package/docs/KNOWN-ISSUES.md +11 -11
  85. package/package.json +1 -1
@@ -74,23 +74,23 @@
74
74
  - **流内执行 × 进程崩溃窗**:`TaskSpec.streamingToolExecution: true` 时,工具副作用可先于 assistant message 持久化完成;该窗内 kill -9 → session 无该 call 任何痕迹(wake reconcile 结构性不可见,resume 后模型可能盲目重发)。默认 OFF 不受影响;merge-back 防线只覆盖进程存活的 stream-tear。对崩溃-恰好一次审计要求高的部署保持 OFF(TaskSpec docstring 同步声明)。
75
75
  - **stream throw 路径副作用零痕迹**:emit/hook throw 逃逸 streamAssistantResponse 时,try/finally settle 保证在飞工具完成且无 post-terminal 泄漏,但已完成结果无 final assistant 可挂 → 不落库(与 pre-P2 loop-failure 同型)。
76
76
 
77
- ## brain 退化面待设计小批(2026-07-05 TB 尸检 T1-4/T1-5,记档非本批)
77
+ ## ~~brain 退化面待设计小批(2026-07-05 TB 尸检 T1-4/T1-5)~~(✅ 已收口 2026-07-12)
78
78
 
79
- - **T1-4 MED**:`output.degenerate` 检测(brain/repetition + stream-engine)直接废整 run(errorCode + salvagedOutput),不尝试「截断退化尾 当合法回复续跑」。修复需 brain 流层截断 + circuit-breaker 联动(防二次退化死循环),非边角量级 独立小批。salvagedOutput v1(design/39)已给下游兜底。
80
- - **T1-5 LOW**:退化中止的 turn 记账 in=0 out=0——provider 流中止前未发 usage 帧,事实缺失(0 是诚实的);若要改善需 partial-usage 捕获或显式 `usageMissing` 标记,与 T1-4 同面,同批处理。
79
+ - ~~**T1-4 MED**~~ **(✅ FIXED,分两批)**:①退化续跑 + 熔断已于 1.238.0 落地(`LoopRecoveryOptions.degenerateOutput`:brain 截流后 bounded "different approach" continue;连续退化熔断 `maxContinues` 可配、默认 2,超限退回经典 `output.degenerate` + `salvagedOutput` 终态;steer 优先/tool-call 双面门/turn_end 照发,codex 复审)。②brain 流层截断退化尾(2026-07-12 本批):`trimDegenerateTail`(`src/brain/repetition.ts`)在两 brain 的 finalize 把触发 cut 的 TEXT face 逐字重复尾截掉(保留一个 unit 实例、含窗外增长段与 cut 后缓冲的 partial unit),transcript 回放与 `salvagedOutput` 只带干净前缀;thinking/reasoning face 不截(anthropic 签名回放面,mutate 即失效)。默认 ON 无旗:检测器只对 exact 尾重复触发,截掉的都是被保留 unit 的逐字副本 → 零信息损失、不吞真错误(论证见 `trimDegenerateTail` JSDoc);合法重复代码由 2e1c161 豁免在上游根本不 cut。
80
+ - ~~**T1-5 LOW**~~ **(✅ FIXED)**:显式 `usageMissing: true` 标记全链落地——brain finalize 无 provider usage 帧即打标(1.238.0 codex F3),`turn_end` 事件/turns 记账透传;2026-07-12 本批补齐 stream-engine 引擎级终态零壳(connect 失败/重试耗尽/abort,parser finalize 未跑的所有路径)同样打标,消费者全路径可区分「真 0」与「事实缺失」。
81
81
 
82
- ## design/134 stoppedBy 归因盲区(2026-07-07 记档,LOW)
82
+ ## design/134 stoppedBy 归因盲区(2026-07-07 记档,LOW → **FIXED 2026-07-12**)
83
83
 
84
- - **legacy env-direct TaskStop 路**(`src/tools/fs/index.ts:1453`):旧 toolkit 的 TaskStop 直接 `env.killBackground`,绕过 registry 的 `markStopSource` → 同 env 的 registry handle 由 watcher/poll 兜底归因为 `"system"` 而非 `"parent"`。文案面从「Claude 停的」降级为缺省「was stopped」,无功能影响。正解=该工具迁移 `registry.stopTask`( design/129 统一 kill 面同批),独立小件。
84
+ - ~~**legacy env-direct TaskStop 路**:旧 toolkit 的 TaskStop 直接 `env.killBackground`,未经过 registry 的 `markStopSource` → 同 env 的 registry handle 由 watcher/poll 兜底归因为 `"system"` 而非 `"parent"`。~~ **已修**:`makeKillShellTool` 结构上拿不到 toolkit 注入的 registry(createHandsToolkit 三元式=有 registry 走 `createTaskStopTool`,该 band 只在无 registry 分支挂载),故不迁 `registry.stopTask`(会引入 owner 门/文案变化),改为 kill 前补挂标注面:新增 `TaskRegistry.markStopSourceByShellId(shellId, source, env?)`(legacy shellId→task id 解析,复用 `markStopSource` 的 running-only+first-marker-wins 门,env 身份参与匹配),工具默认标注进程级 `defaultTaskRegistry`(Runner 同 env 行所在)。watcher 归因 `"system"`→`"parent"`,kill 路与模型面文案不变。测试=`test/stop-attribution.test.ts` S11(反事实核过:去掉标注即回 `"system"`)。
85
85
 
86
- ## Edit-as-create 非原子创建(2026-07-07 1.253 双轨终审记档,LOW)
86
+ ## Edit-as-create 非原子创建(2026-07-07 1.253 双轨终审记档,LOW → **FIXED 2026-07-12**)
87
87
 
88
- - **`src/tools/fs/index.ts` Edit 的 create 路径**(old_string="" 且目标不存在 → Write 语义):存在 exists-check 与 writeFile 之间的 TOCTOU 窗——并发写者(另一 agent/进程)在窗内创建同名文件会被本次 create 静默覆盖。根治需 `ExecutionEnv` 提供独占创建语义接口(POSIX `wx` flag 同型),现有 env 契约(exists + writeFile)结构性做不到原子;单 agent 单工作树下窗口极窄、且与 Write 工具覆盖语义同型,风险接受记档。正解=env seam `writeFileExclusive`(BREAKING env 契约面),等下一次 env 接口批一并做。
88
+ - ~~**`src/tools/fs/index.ts` Edit 的 create 路径**(old_string="" 且目标不存在 → Write 语义):存在 exists-check 与 writeFile 之间的 TOCTOU 窗——并发写者在窗内创建同名文件会被本次 create 静默覆盖。~~ **已修**:env seam 增 **optional** `FileSystem.writeFileExclusive?(path, content, signal?)`(POSIX `O_EXCL`/Node `wx` 同型;`FileErrorCode` `"already_exists"`;JSDoc 钉死降级契约=无原子后端的 env **必须留 undefined** 不得 exists+write 仿真)。`NodeExecutionEnv` 实现(`wx` flag,EEXIST→`already_exists`);`StubExecutionEnv` `not_supported` 面;remote seam 不实现(降级语义归接口 JSDoc)。Edit create 路径:seam 存在→独占创建,输掉竞态→诚实错误「file already exists (created concurrently since the existence check)」;seam 不存在→保留旧 exists+writeFile 仿真(第三方 env 风险接受,窗口语义与修前一致)。Write 工具覆盖语义不动。测试=`test/hands-fs.test.ts`「Edit-as-create atomicity」四腿(反事实核过:退回 writeFile 即静默覆盖)。
89
89
 
90
- ## memory-engine 无 guard add 的 MOVE 声明矛盾(2026-07-12 三轮复查记档,LOW)
90
+ ## memory-engine 无 guard add 的 MOVE 声明矛盾(2026-07-12 三轮复查记档,LOW → **FIXED 2026-07-12/13**)
91
91
 
92
- - **`applyPatches` 无 guard 的 add 对既有 id 用异 slug/异 scope 重添**:实现会铸同 id 第二个投影文件(三轮复查探针 C3/C4 实证),与 `types.ts` JSDoc「re-add into another scope = the MOVE: the old scope loses the entry」声明矛盾。同 id 双投影破「条目=真理单元」不变量;但该路径内部流程不可达(sync add 全带 `guard:"absent"`,harvest 铸新 UUID),仅第三方直调 backend 可触。正解二选一:File 实现补 MOVE 语义(旧 scope 失条目)或改契约声明——**涉共享契约套件(service Pg twin 同锁),跨仓对齐后动**,黑板已知会。
92
+ - ~~**`applyPatches` 无 guard 的 add 对既有 id 用异 slug/异 scope 重添**:实现会铸同 id 第二个投影文件,与 `types.ts` JSDoc「re-add into another scope = the MOVE」声明矛盾。~~ **已裁定+已修**:Pg/TiDB twin 侦察坐实两实现从来都是前置检查 REJECT(reason=`cross-scope add refused`)——契约 JSDoc MOVE 声明才是错的。三端对齐:①File scope guard add REJECT(reason 逐字对齐 Pg);②`types.ts` 契约声明改「add 永不搬迁,MOVE 唯一拼法=update」;③共享契约套件补 cross-scope 拒绝 case(锁三端)。fable 独立轨复审追加两修:同批 `delete(X@s1)+add(X@s2)` 合法搬迁批不受新检查误伤(批内 plannedDeletes 顺序语义,对齐 twin 逐条执行);同 scope 换 slug 的无 guard re-add 从「铸第二投影」改为单行改名(Pg `ON CONFLICT (id) DO UPDATE SET slug` 同型,旧投影文件删除)。测试=`test/memory-backend-contract.test.ts` cross-scope describe 5 腿+共享套件新 case。
93
93
 
94
- ## memory-engine applyPatches 不校验 id 形状(2026-07-12 三轮复查记档,LOW)
94
+ ## memory-engine applyPatches 不校验 id 形状(2026-07-12 三轮复查记档,LOW → **FIXED 2026-07-12**)
95
95
 
96
- - 不满足 `ID_RE` 的 id(如 <8 字符)能 applied + 入 ledger,但 `readScope` 解析时丢弃该 id → 条目落盘却永久不可见(幽灵行)。内部流程(harvest UUID)不可达,第三方直调 backend 才可触;加固候选=`applyPatches` 入口 id 形状校验 → REPORTED conflict( throw,批内其余照常)
96
+ - ~~不满足 `ID_RE` 的 id(如 <8 字符)能 applied + 入 ledger,但 `readScope` 解析时丢弃该 id → 条目落盘却永久不可见(幽灵行)。~~ **已修**:`frontmatter.ts` 导出 `isValidEntryId()`(读闸/写闸单谓词单源);`planOne` 头部形状闸,不合规 id → `invalid_id_shape` REPORTED conflict(op 原样、绝不 throw、批内其余照常),三 op 共路全覆盖;顺带关闭 shadow 文件名路径形洞(`/`/`..` 形 id 不再触盘)。存量幽灵残留(修复前已落盘的)对一切 patch op 不可达,无独立清理路径(接受:读侧本就永不可见)。测试=`test/memory-backend-contract.test.ts` invalid-id describe 3 腿。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-ai/core",
3
- "version": "1.275.1",
3
+ "version": "1.276.0",
4
4
  "description": "Stateless, task-oriented AI agent core distilled from openclaw (vendored).",
5
5
  "type": "module",
6
6
  "license": "MIT",