@sema-agent/core 7.54.1 → 7.56.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 (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -5,6 +5,7 @@ import type { ProviderCondition, ProviderConditionSource } from "../../brain/pro
5
5
  import type { RequestRoute, RouteCarrierBag, RouteCredentialSource } from "../../brain/request-route.js";
6
6
  export type { RouteCredentialSource } from "../../brain/request-route.js";
7
7
  import type { ModelOutputInvalidCause } from "./tool-turns.js";
8
+ import type { PromptTraitName, TraitCondition } from "../../prompt-assembly/catalog/schema.js";
8
9
  export type KnownApi = "openai-completions" | "mistral-conversations" | "openai-responses" | "azure-openai-responses" | "openai-chatgpt-responses" | "anthropic-messages" | "bedrock-converse-stream" | "google-generative-ai" | "google-vertex";
9
10
  export type Api = KnownApi | (string & {});
10
11
  export type KnownImagesApi = "openrouter-images";
@@ -611,10 +612,10 @@ export interface AssistantMessage {
611
612
  /**
612
613
  * design/124 tier A: this final message was PARTIALLY FINALIZED after a mid-stream connection
613
614
  * loss/stall — the substantive streamed prefix (text and/or completed tool calls) was promoted to
614
- * final content instead of failing the turn (CC 198 queryModelStreaming parity: avoid re-billing +
615
+ * final content instead of failing the turn (avoid re-billing +
615
616
  * keep the displayed content consistent with the result). `stopReason` is synthesized from the
616
617
  * content ("toolUse" when a completed tool call streamed, else "stop"); `errorMessage` carries the
617
- * warning in CC 2.1.220's words ("Response stalled mid-stream." / "Connection closed mid-response."; gone from 2.1.245 on), visible
618
+ * warning in the reference's former words ("Response stalled mid-stream." / "Connection closed mid-response."), visible
618
619
  * to the model in the transcript. Downstream semantics (agent-loop): `partialFinalized &&
619
620
  * stopReason==="stop"` gets a BOUNDED continue nudge (an unattended run must not book the cut as an
620
621
  * incomplete success); `partialFinalized && stopReason==="toolUse"` executes normally (a truncated
@@ -697,11 +698,24 @@ export interface Tool<TParameters extends TSchema = TSchema> {
697
698
  /** VENDORED EDIT (design/115 P0): canonical tool renames keep old model/SDK wire names as aliases. */
698
699
  aliases?: string[];
699
700
  description: string;
700
- /** R2 双形轴 — classic-profile description variant (see ToolSpec.descriptionClassic). Swapped in
701
- * for `description` at mount time when the run's promptProfile is "classic"; absent = one form. */
702
- descriptionClassic?: string;
701
+ /** The description's conditional variants (see ToolSpec.descriptionVariants): at mount, the first whose traits
702
+ * condition holds over the run's traits replaces `description`; none holds ⇒ `description`. */
703
+ descriptionVariants?: readonly ToolDescriptionVariant[];
703
704
  parameters: TParameters;
704
705
  }
706
+ /**
707
+ * One conditional variant of a tool's description — the tool card's variant table is these, first match wins, with
708
+ * `description` as the unconditional last entry. Chosen by the run's prompt traits through the same trait reading the
709
+ * prompt catalog's variants use; the variant chosen is reported in the tool's `cardId` (`<card>#<id>`).
710
+ */
711
+ export interface ToolDescriptionVariant {
712
+ /** The variant's name in the tool's card id: non-empty, at most 64 characters of `[A-Za-z0-9._-]`, unique per tool. */
713
+ readonly id: string;
714
+ /** The trait condition (`allOf` / `noneOf`, trait names) under which this text replaces `description`. */
715
+ readonly traits: TraitCondition;
716
+ /** The description text (non-blank). */
717
+ readonly text: string;
718
+ }
705
719
  export interface Context {
706
720
  systemPrompt?: string;
707
721
  /**
@@ -877,7 +891,7 @@ export interface OpenAIResponsesCompat {
877
891
  */
878
892
  export interface AnthropicMessagesCompat {
879
893
  /**
880
- * How this endpoint takes extended thinking (CC 2.1.198 parity, design/119).
894
+ * How this endpoint takes extended thinking (design/119).
881
895
  * - `"budget"` (default, pre-Fable models): `thinking: { type: "enabled", budget_tokens }`.
882
896
  * - `"adaptive"` (Fable 5 / Opus 4.8/4.7 class): `thinking: { type: "adaptive" }` — NO
883
897
  * `budget_tokens` (these models 400 on a budget), no max_tokens bump; the intensity is carried
@@ -886,7 +900,7 @@ export interface AnthropicMessagesCompat {
886
900
  */
887
901
  thinkingMode?: "budget" | "adaptive";
888
902
  /**
889
- * Effort tiers this endpoint accepts via `output_config.effort` (CC 2.1.198 `effort` /
903
+ * Effort tiers this endpoint accepts via `output_config.effort` (the reference's `effort` /
890
904
  * `xhigh_effort` / `max_effort` capability bits collapsed into one declared set, matching the
891
905
  * `reasoningEffortLevels` pattern on {@link OpenAICompletionsCompat}). Present ⇒ the brain sends
892
906
  * `output_config: { effort }` plus the `effort-2025-11-24` beta header, clamping the requested
@@ -896,14 +910,14 @@ export interface AnthropicMessagesCompat {
896
910
  */
897
911
  effortLevels?: ThinkingLevel[];
898
912
  /**
899
- * Whether the endpoint accepts `temperature` at all. CC 2.1.198 sends temperature only to a
913
+ * Whether the endpoint accepts `temperature` at all. The reference sends temperature only to a
900
914
  * legacy allowlist — Fable-5-class models NEVER receive it (400 risk), independent of thinking
901
915
  * state. Default true (existing models unchanged); `false` drops a caller temperature
902
916
  * unconditionally, not just under extended thinking.
903
917
  */
904
918
  supportsTemperature?: boolean;
905
919
  /**
906
- * design/119 S4 (CC 2.1.198 `context_management` capability): when thinking is enabled, send
920
+ * design/119 S4 (`context_management` capability): when thinking is enabled, send
907
921
  * `context_management: { edits: [{ type: "clear_thinking_20251015", keep: "all" }] }` plus the
908
922
  * `context-management-2025-06-27` beta — an explicit opt-OUT of the server's default
909
923
  * thinking-clearing, preserving cross-turn reasoning continuity (what CC sends on first-party
@@ -912,7 +926,7 @@ export interface AnthropicMessagesCompat {
912
926
  */
913
927
  contextManagement?: boolean;
914
928
  /**
915
- * design/119 S4 (CC 2.1.198): attach the `interleaved-thinking-2025-05-14` beta on tool-enabled
929
+ * design/119 S4: attach the `interleaved-thinking-2025-05-14` beta on tool-enabled
916
930
  * requests with thinking on (thinking blocks may interleave with tool_use). Declare per endpoint;
917
931
  * absent = no beta (pre-119 behavior; a deployment could already do this via static `headers`).
918
932
  */
@@ -924,7 +938,9 @@ export interface Model<TApi extends Api = Api> {
924
938
  api: TApi;
925
939
  provider: Provider;
926
940
  baseUrl: string;
927
- reasoning: boolean;
941
+ /** Declares reasoning (thinking keys): `true` / `false`, absent = not declared. Read only through `capabilityOf`
942
+ * (`brain/model-capability.ts`), which also says what an undeclared capability means. */
943
+ reasoning?: boolean;
928
944
  /**
929
945
  * design/111 — this model's DEFAULT thinking level (per-model preset). The thinking-resolution chain is
930
946
  * `spec.thinking ?? role.thinking ?? model.defaultThinking` (prepare-task) — a caller/role still overrides, but
@@ -940,7 +956,8 @@ export interface Model<TApi extends Api = Api> {
940
956
  * Missing keys use provider defaults. null marks a level as unsupported.
941
957
  */
942
958
  thinkingLevelMap?: ThinkingLevelMap;
943
- input: ("text" | "image")[];
959
+ /** Declares image input: a list with `"image"` = on, without = off, absent = not declared (same reader as `reasoning`). */
960
+ input?: ("text" | "image")[];
944
961
  cost?: {
945
962
  input: number;
946
963
  output: number;
@@ -957,7 +974,7 @@ export interface Model<TApi extends Api = Api> {
957
974
  /**
958
975
  * Optional AUTOCOMPACT window — the window the compaction trigger and the clearStale frontier
959
976
  * are derived from when it differs from the physical request window (dual-window semantics).
960
- * CC 2.1.207 posture: its 1M sonnet keeps the PHYSICAL window at 1M while a per-model dynamic
977
+ * The reference's posture: its 1M sonnet keeps the PHYSICAL window at 1M while a per-model dynamic
961
978
  * config lowers only the autocompact window to 967000, so the reactive trigger lands at 934000
962
979
  * (= 967000 − 33000); a single window value cannot express both. Consumed by the trigger-side
963
980
  * geometry only (`editBudget`/`sanitizeCompactionSettings`/`shouldCompact` window); the request
@@ -996,13 +1013,13 @@ export interface Model<TApi extends Api = Api> {
996
1013
  /** Extra request HEADERS merged into the provider call. Cannot override auth / content-type / version. */
997
1014
  headers?: Record<string, string>;
998
1015
  /**
999
- * design/119 S3 (CC 2.1.198 parity): model-declared system-prompt guidance sections, appended to
1000
- * the assembled system prompt. This is the declarative home for per-model behavioral patches (CC
1001
- * ships Fable-5 "mitigations" baked behind model-name checks; sema keeps the MECHANISM generic —
1002
- * any Model can carry guidance — and the CONTENT as preset data, zero model-name matching in core).
1003
- * Each entry is one section; joined with blank lines.
1016
+ * The prompt traits this model has: the reference's capability names that gate prompt text (`PROMPT_TRAITS`), its
1017
+ * bundle names (`PROMPT_TRAIT_BUNDLES`, expanded to their members), or a deployment's own `x-<namespace>-<name>`.
1018
+ * The prompt catalog and every overlay's `when.traits` select on them; the engine never derives them from `id`. An
1019
+ * EXACT set — nothing is added to what it lists (declare `lean_prompt` for the lean shape). Absent ⇒
1020
+ * `["lean_prompt"]`. A name that is none of these refuses the task (`config.prompt_trait_unknown`).
1004
1021
  */
1005
- promptGuidance?: string[];
1022
+ promptTraits?: readonly PromptTraitName[];
1006
1023
  /** Compatibility overrides for OpenAI-compatible APIs. If not set, auto-detected from baseUrl. */
1007
1024
  compat?: TApi extends "openai-completions" ? OpenAICompletionsCompat : TApi extends "openai-responses" ? OpenAIResponsesCompat : TApi extends "anthropic-messages" ? AnthropicMessagesCompat : never;
1008
1025
  }
@@ -1,7 +1,10 @@
1
1
  import type { Tool, ToolCall } from "./types.js";
2
2
  /** Finds the target tool and validates/coerces a model-emitted tool call. */
3
3
  export declare function validateToolCall(tools: Tool[], toolCall: ToolCall): unknown;
4
- /** VENDORED EDIT (design/115 P0): resolve canonical tool names first, then legacy aliases. */
4
+ /** The dispatcher's name resolution over one tool list, indexed once (for a caller resolving many names over the same list):
5
+ * canonical names first, then aliases (design/115 P0 order) — the first tool carrying a name, or an alias, owns it. */
6
+ export declare function toolNameIndex<T extends Tool>(tools: readonly T[] | undefined): (name: string) => T | undefined;
7
+ /** VENDORED EDIT (design/115 P0): resolve canonical tool names first, then legacy aliases ({@link toolNameIndex} for one name). */
5
8
  export declare function findToolByName<T extends Tool>(tools: readonly T[] | undefined, name: string): T | undefined;
6
9
  /** Validates tool arguments against TypeBox or plain JSON-schema parameters. */
7
10
  export declare function validateToolArguments(tool: Tool, toolCall: ToolCall): unknown;
@@ -378,8 +378,20 @@ export function validateToolCall(tools, toolCall) {
378
378
  }
379
379
  return validateToolArguments(tool, toolCall);
380
380
  }
381
+ export function toolNameIndex(tools) {
382
+ const byName = new Map();
383
+ const byAlias = new Map();
384
+ for (const t of tools ?? []) {
385
+ if (!byName.has(t.name))
386
+ byName.set(t.name, t);
387
+ for (const a of t.aliases ?? [])
388
+ if (!byAlias.has(a))
389
+ byAlias.set(a, t);
390
+ }
391
+ return (name) => byName.get(name) ?? byAlias.get(name);
392
+ }
381
393
  export function findToolByName(tools, name) {
382
- return tools?.find((t) => t.name === name) ?? tools?.find((t) => t.aliases?.includes(name));
394
+ return toolNameIndex(tools)(name);
383
395
  }
384
396
  export function validateToolArguments(tool, toolCall) {
385
397
  const args = structuredClone(toolCall.arguments);
@@ -61,7 +61,7 @@ export type LoopTerminalReason =
61
61
  * loop ended cleanly at a manufactured boundary, no reconcile owed), and which consult caught
62
62
  * it is timing, not semantics. */
63
63
  | "stop_requested"
64
- /** RB-206 (CC 220 counterpart @400176-400230, `Bxs` @397652-397674 buckets it
64
+ /** RB-206 (the reference buckets it
65
65
  * with budget_exhausted/api_error/model_error/turn_setup_failed, explicitly NOT `"completed"`): every
66
66
  * tool call in the turn was dropped as malformed AND the bounded `malformed_tool_use_retry` nudge
67
67
  * budget is used up — the model believes it acted, nothing ran, and there is no more recovery budget
@@ -154,11 +154,33 @@ type ExecutedToolCallBatch = {
154
154
  messages: ToolResultMessage[];
155
155
  terminate: boolean;
156
156
  };
157
+ /**
158
+ * ONE call through the loop's per-call pipeline — announced, prepared (the gate included), executed through the execution
159
+ * seat, finalized, closed. The sequential lane runs each call through it and adds the call's tool-result message; a host's
160
+ * own call (`AgentHarness.callTool`) runs it with no model message and adds nothing. The partitioned and streaming lanes run
161
+ * the same steps in two phases.
162
+ */
163
+ export declare function runToolCall(currentContext: AgentContext, assistantMessage: AssistantMessage | undefined, toolCall: AgentToolCall, config: AgentLoopConfig, signal: AbortSignal | undefined, emit: AgentEventSink): Promise<{
164
+ finalized: FinalizedToolCallOutcome;
165
+ halt?: HaltRemainingDirective;
166
+ }>;
167
+ /**
168
+ * Partition rule: a call is batch-safe ONLY if its arguments
169
+ * VALIDATE against the tool's schema (CC `safeParse` — a malformed call never rides a parallel batch;
170
+ * it stays a singleton and surfaces its validation error at execution) AND the tool/hook opts in.
171
+ * The hook sees the validated+coerced args — same as CC handing `parsed.data` to `isConcurrencySafe`.
172
+ */
173
+ export declare function isBatchSafeToolCall(tool: AgentTool | undefined, toolCall: AgentToolCall): boolean;
157
174
  /** An executed call's raw outcome, before (and, from {@link finalizeToolOutcome}, after) the post-execution half. */
158
175
  export type ExecutedToolCallOutcome = {
159
176
  result: AgentToolResult<unknown>;
160
177
  isError: boolean;
161
178
  };
179
+ type FinalizedToolCallOutcome = {
180
+ toolCall: AgentToolCall;
181
+ result: AgentToolResult<unknown>;
182
+ isError: boolean;
183
+ };
162
184
  /**
163
185
  * THE reading a value gets on its way to becoming a call's arguments: the tool's own preparation (`prepareArguments` —
164
186
  * a default filled in, an alias folded), then the schema's coercions ({@link validateToolArguments}). The loop reads the
@@ -118,11 +118,12 @@ async function settleTrailingBatchTurn(state, signal, emit, settle) {
118
118
  terminalEmitted = ended;
119
119
  }
120
120
  else if (!ended) {
121
+ state.hasMoreToolCalls = !batch.terminate;
121
122
  const boundary = { message: tail, toolResults: batch.messages, context: state.context, newMessages: state.newMessages };
122
- adoptNextTurnSnapshot(state, await state.config.prepareNextTurn?.(boundary));
123
+ adoptNextTurnSnapshot(state, await state.config.prepareNextTurn?.({ ...boundary, continues: state.hasMoreToolCalls }));
123
124
  ended = (await state.config.shouldStopAfterTurn?.(boundary)) === true || signal?.aborted === true;
124
125
  if (!ended)
125
- state.pendingMessages.push(...((await state.config.getSteeringMessages?.()) || []));
126
+ state.pendingMessages.push(...((await state.config.getSteeringMessages?.(state.hasMoreToolCalls)) || []));
126
127
  }
127
128
  settle.report({ assistantMessage: tail, settled: batch.messages.length, aborted: ended });
128
129
  if (ended && !terminalEmitted)
@@ -242,7 +243,7 @@ async function createLoopState(context, config, newMessages) {
242
243
  config,
243
244
  newMessages,
244
245
  firstTurn: true,
245
- pendingMessages: (await config.getSteeringMessages?.()) || [],
246
+ pendingMessages: (await config.getSteeringMessages?.(true)) || [],
246
247
  hasMoreToolCalls: true,
247
248
  truncatedOutputContinues: 0,
248
249
  staticReasoningCutRecoveries: context.messages.filter((m) => m.role === "assistant" && m.staticReasoningCut === true).length,
@@ -258,7 +259,7 @@ async function runLoop(state, signal, emit, streamFn, runtime, trace) {
258
259
  const followUpMessages = (await state.config.getFollowUpMessages?.()) || [];
259
260
  if (followUpMessages.length === 0) {
260
261
  if ((state.config.pendingInjectionCount?.() ?? 0) > 0) {
261
- state.pendingMessages = (await state.config.getSteeringMessages?.()) || [];
262
+ state.pendingMessages = (await state.config.getSteeringMessages?.(false)) || [];
262
263
  if (state.pendingMessages.length > 0) {
263
264
  trace?.({ kind: "continue", reason: "steer_injected" });
264
265
  }
@@ -448,7 +449,7 @@ async function runTurnPhases(state, signal, turnController, publishSeat, retract
448
449
  retractSeat();
449
450
  state.degenerateContinues++;
450
451
  await emit({ type: "turn_end", message, toolResults: [] });
451
- const drained = (await state.config.getSteeringMessages?.()) || [];
452
+ const drained = (await state.config.getSteeringMessages?.(false)) || [];
452
453
  state.pendingMessages = drained.length > 0 ? drained : [createDegenerateRecoveryNudge()];
453
454
  return { kind: "ran", recovered: "degenerate_output_recovery" };
454
455
  }
@@ -493,7 +494,7 @@ async function runTurnPhases(state, signal, turnController, publishSeat, retract
493
494
  context: state.context,
494
495
  newMessages: state.newMessages,
495
496
  };
496
- const nextTurnSnapshot = await state.config.prepareNextTurn?.(nextTurnContext);
497
+ const nextTurnSnapshot = await state.config.prepareNextTurn?.({ ...nextTurnContext, continues: state.hasMoreToolCalls });
497
498
  adoptNextTurnSnapshot(state, nextTurnSnapshot);
498
499
  if (await state.config.shouldStopAfterTurn?.({
499
500
  message,
@@ -504,7 +505,7 @@ async function runTurnPhases(state, signal, turnController, publishSeat, retract
504
505
  await emit({ type: "agent_end", messages: state.newMessages });
505
506
  return { kind: "terminal", reason: "stop_requested" };
506
507
  }
507
- state.pendingMessages = (await state.config.getSteeringMessages?.()) || [];
508
+ state.pendingMessages = (await state.config.getSteeringMessages?.(state.hasMoreToolCalls)) || [];
508
509
  const truncated = state.config.recovery?.truncatedOutput;
509
510
  if (message.stopReason === "length") {
510
511
  if (truncated && toolCalls.length === 0 && state.pendingMessages.length === 0) {
@@ -653,6 +654,7 @@ async function settleInterruptedTurn(state, message, executor, committedResults,
653
654
  toolResults,
654
655
  context: state.context,
655
656
  newMessages: state.newMessages,
657
+ continues: state.hasMoreToolCalls,
656
658
  });
657
659
  adoptNextTurnSnapshot(state, nextTurnSnapshot);
658
660
  if (await state.config.shouldStopAfterTurn?.({
@@ -664,7 +666,7 @@ async function settleInterruptedTurn(state, message, executor, committedResults,
664
666
  await emit({ type: "agent_end", messages: state.newMessages });
665
667
  return { kind: "terminal", reason: "stop_requested" };
666
668
  }
667
- state.pendingMessages = (await state.config.getSteeringMessages?.()) || [];
669
+ state.pendingMessages = (await state.config.getSteeringMessages?.(state.hasMoreToolCalls)) || [];
668
670
  return { kind: "ran" };
669
671
  }
670
672
  async function streamAssistantResponse(context, config, signal, emit, streamFn, runtime, executor, staticReasoningCutDowngrade) {
@@ -800,27 +802,7 @@ async function executeToolCallsSequential(currentContext, assistantMessage, tool
800
802
  const messages = [];
801
803
  for (let i = 0; i < toolCalls.length; i++) {
802
804
  const toolCall = toolCalls[i];
803
- await emit({
804
- type: "tool_execution_start",
805
- toolCallId: toolCall.id,
806
- toolName: toolCall.name,
807
- args: toolCall.arguments,
808
- });
809
- const preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);
810
- let finalized;
811
- let halt;
812
- if (preparation.kind === "immediate") {
813
- finalized = {
814
- toolCall,
815
- result: preparation.result,
816
- isError: preparation.isError,
817
- };
818
- halt = preparation.halt;
819
- }
820
- else {
821
- finalized = await executePreparedWithDisclosure(currentContext, assistantMessage, preparation, config, signal, emit);
822
- }
823
- await emitToolExecutionEnd(finalized, emit);
805
+ const { finalized, halt } = await runToolCall(currentContext, assistantMessage, toolCall, config, signal, emit);
824
806
  const toolResultMessage = createToolResultMessage(finalized);
825
807
  await emitToolResultMessage(toolResultMessage, emit);
826
808
  finalizedCalls.push(finalized);
@@ -844,6 +826,15 @@ async function executeToolCallsSequential(currentContext, assistantMessage, tool
844
826
  terminate: shouldTerminateToolBatch(finalizedCalls),
845
827
  };
846
828
  }
829
+ export async function runToolCall(currentContext, assistantMessage, toolCall, config, signal, emit) {
830
+ await emit({ type: "tool_execution_start", toolCallId: toolCall.id, toolName: toolCall.name, args: toolCall.arguments });
831
+ const preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);
832
+ const finalized = preparation.kind === "immediate"
833
+ ? { toolCall, result: preparation.result, isError: preparation.isError }
834
+ : await executePreparedWithDisclosure(currentContext, assistantMessage, preparation, config, signal, emit);
835
+ await emitToolExecutionEnd(finalized, emit);
836
+ return { finalized, ...(preparation.kind === "immediate" && preparation.halt !== undefined ? { halt: preparation.halt } : {}) };
837
+ }
847
838
  async function settleHaltedToolCall(toolCall, halt, emit) {
848
839
  await emit({
849
840
  type: "tool_execution_start",
@@ -885,7 +876,7 @@ function isCallConcurrencySafe(tool, args) {
885
876
  return false;
886
877
  }
887
878
  }
888
- function isBatchSafeToolCall(tool, toolCall) {
879
+ export function isBatchSafeToolCall(tool, toolCall) {
889
880
  if (!tool)
890
881
  return false;
891
882
  let args;
@@ -1106,7 +1097,7 @@ class StreamToolExecutor {
1106
1097
  return;
1107
1098
  }
1108
1099
  entry.prepared = preparation;
1109
- entry.executed = await executePreparedToolCall(preparation, this.signal, this.emit, this.config.abortResultDetails, (error) => this.retainCancellation(error));
1100
+ entry.executed = await executePreparedToolCall(preparation, this.signal, this.emit, this.config.executeTool, this.config.abortResultDetails, (error) => this.retainCancellation(error));
1110
1101
  }
1111
1102
  catch (error) {
1112
1103
  if (isAbortSemanticsError(error))
@@ -1393,7 +1384,7 @@ async function prepareToolCall(currentContext, assistantMessage, toolCall, confi
1393
1384
  };
1394
1385
  }
1395
1386
  }
1396
- async function executePreparedToolCall(prepared, signal, emit, abortResultDetails, onLateCancellation) {
1387
+ async function executePreparedToolCall(prepared, signal, emit, executeTool, abortResultDetails, onLateCancellation) {
1397
1388
  const updateEvents = [];
1398
1389
  let acceptingUpdates = true;
1399
1390
  if (signal?.aborted) {
@@ -1402,7 +1393,7 @@ async function executePreparedToolCall(prepared, signal, emit, abortResultDetail
1402
1393
  const work = (async () => {
1403
1394
  let outcome;
1404
1395
  try {
1405
- const result = await prepared.tool.execute(prepared.toolCall.id, prepared.args, signal, (partialResult) => {
1396
+ const body = () => prepared.tool.execute(prepared.toolCall.id, prepared.args, signal, (partialResult) => {
1406
1397
  if (!acceptingUpdates) {
1407
1398
  return;
1408
1399
  }
@@ -1425,6 +1416,7 @@ async function executePreparedToolCall(prepared, signal, emit, abortResultDetail
1425
1416
  });
1426
1417
  updateEvents.push(delivery);
1427
1418
  });
1419
+ const result = executeTool !== undefined ? await executeTool({ toolCall: prepared.toolCall, tool: prepared.tool, args: prepared.args }, body, signal) : await body();
1428
1420
  outcome = { result, isError: result.isError === true };
1429
1421
  }
1430
1422
  catch (error) {
@@ -1505,7 +1497,7 @@ function raiseFatalCancellation(executor) {
1505
1497
  async function executePreparedWithDisclosure(currentContext, assistantMessage, prepared, config, signal, emit) {
1506
1498
  let executed;
1507
1499
  try {
1508
- executed = await executePreparedToolCall(prepared, signal, emit, config.abortResultDetails);
1500
+ executed = await executePreparedToolCall(prepared, signal, emit, config.executeTool, config.abortResultDetails);
1509
1501
  }
1510
1502
  catch (error) {
1511
1503
  if (isAbortSemanticsError(error))
@@ -127,9 +127,9 @@ export interface AfterToolCallResult {
127
127
  }
128
128
  /** Context passed to `beforeToolCall`. */
129
129
  export interface BeforeToolCallContext {
130
- /** The assistant message that requested the tool call. */
131
- assistantMessage: AssistantMessage;
132
- /** The raw tool call block from `assistantMessage.content`. */
130
+ /** The assistant message that requested the tool call — absent for a host's own call (an extension's `$.tool.call`), which no model message carried. */
131
+ assistantMessage?: AssistantMessage;
132
+ /** The raw tool call block (from `assistantMessage.content` when a model message carried it). */
133
133
  toolCall: AgentToolCall;
134
134
  /** Validated tool arguments for the target tool schema. */
135
135
  args: unknown;
@@ -142,9 +142,9 @@ export interface BeforeToolCallContext {
142
142
  }
143
143
  /** Context passed to `afterToolCall`. */
144
144
  export interface AfterToolCallContext {
145
- /** The assistant message that requested the tool call. */
146
- assistantMessage: AssistantMessage;
147
- /** The raw tool call block from `assistantMessage.content`. */
145
+ /** The assistant message that requested the tool call — absent for a host's own call (an extension's `$.tool.call`), which no model message carried. */
146
+ assistantMessage?: AssistantMessage;
147
+ /** The raw tool call block (from `assistantMessage.content` when a model message carried it). */
148
148
  toolCall: AgentToolCall;
149
149
  /** Validated tool arguments for the target tool schema. */
150
150
  args: unknown;
@@ -176,6 +176,8 @@ export interface AgentLoopTurnUpdate {
176
176
  thinkingLevel?: ThinkingLevel;
177
177
  }
178
178
  export interface PrepareNextTurnContext extends ShouldStopAfterTurnContext {
179
+ /** `hasMoreToolCalls`: the turn's tool results go back to the model as the next request (its batch neither ended the run nor was cut by an interjection; a recovery nudge is not one). */
180
+ continues: boolean;
179
181
  }
180
182
  /**
181
183
  * Prompt-too-long recovery seam (design/118 ④b, the CC reactive-compact chain adapted to sema's
@@ -214,8 +216,8 @@ export interface LoopPromptTooLongRecovery {
214
216
  maxRetries?: number;
215
217
  /**
216
218
  * M1 (docs/PARITY-CONTEXT-TRANSACTIONS-2026-07-10 §4): withhold the failed assistant's
217
- * message_start/message_end stream events while a recovery attempt is pending — CC 198 holds
218
- * these errors inside its stream decoder (`claude-cli-2.1.198.pretty.js:473371-473374`) and only
219
+ * message_start/message_end stream events while a recovery attempt is pending — the reference holds
220
+ * these errors inside its stream decoder and only
219
221
  * leaks them once recovery's outcome is known. Recovery succeeded ⇒ the failure stays invisible
220
222
  * to event consumers; failed/declined ⇒ the events leak at that point (terminal truth unchanged).
221
223
  * Default true (CC-aligned). `false` restores the pre-M1 live leak of the interim error.
@@ -239,7 +241,7 @@ export interface LoopTruncatedOutputRecovery {
239
241
  maxContinues?: number;
240
242
  }
241
243
  /**
242
- * Malformed-tool-use retry (design/119 S2, CC 2.1.198 :473745-473785). A turn that stops with
244
+ * Malformed-tool-use retry (design/119 S2). A turn that stops with
243
245
  * `toolUse` but carries ZERO parseable tool calls (the brain dropped truncated/invalid ones) used to
244
246
  * end the run silently mid-task. When enabled, inject a synthetic retry nudge and run another turn,
245
247
  * up to `maxRetries` per run (CC: once). Absent ⇒ OFF (pre-S2 behavior).
@@ -249,7 +251,7 @@ export interface LoopMalformedToolUseRecovery {
249
251
  maxRetries?: number;
250
252
  }
251
253
  /**
252
- * Thinking-only retry (design/119 S2, CC 2.1.198 :473786-473825 — the adaptive-thinking era
254
+ * Thinking-only retry (design/119 S2 — the adaptive-thinking era
253
255
  * companion). A turn that stops normally with thinking block(s) but NO visible text and NO tool
254
256
  * calls used to end the run as a silent empty success. When enabled, inject a "respond with visible
255
257
  * output" nudge and run another turn, up to `maxRetries` per run (CC: once). Absent ⇒ OFF.
@@ -345,7 +347,7 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
345
347
  */
346
348
  stallTimeoutsPerCall?: () => import("../llm/types.js").StallTimeouts | undefined;
347
349
  /**
348
- * design/120 P1: concurrency cap inside a parallel tool batch. Default 10 (CC 198's production
350
+ * design/120 P1: concurrency cap inside a parallel tool batch. Default 10 (the reference's production
349
351
  * default — its knob is the CLAUDE_CODE_MAX_TOOL_USE_CONCURRENCY env; sema takes config).
350
352
  */
351
353
  maxToolConcurrency?: number;
@@ -473,11 +475,11 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
473
475
  * If messages are returned, they are added to the context before the next LLM call.
474
476
  * Tool calls from the current assistant message are not skipped.
475
477
  *
476
- * Use this for "steering" the agent while it's working.
478
+ * Use this for "steering" the agent while it's working. `continuing`: {@link PrepareNextTurnContext.continues} here.
477
479
  *
478
480
  * Contract: must not throw or reject. Return [] when no steering messages are available.
479
481
  */
480
- getSteeringMessages?: () => Promise<AgentMessage[]>;
482
+ getSteeringMessages?: (continuing: boolean) => Promise<AgentMessage[]>;
481
483
  /**
482
484
  * Returns follow-up messages to process after the agent would otherwise stop.
483
485
  *
@@ -520,7 +522,7 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
520
522
  /**
521
523
  * design/373 S1 — the FINAL COMMIT POINT's synchronous double-check: how many queued injection
522
524
  * frames a boundary drain could deliver right now (steer + follow-up, excluding frames a live
523
- * hold or an unwinding run would refuse to drain). Consulted SYNCHRONOUSLY after the follow-up
525
+ * hold, an unwinding run or the advisory rule would refuse to drain). Consulted SYNCHRONOUSLY after the follow-up
524
526
  * drain (and stop gate) answered empty, with zero awaits between the check and the terminal
525
527
  * commit — a frame that arrived during the stop gate's await window is therefore served by this
526
528
  * run instead of being stranded behind an already-decided terminal. Absent ⇒ the pre-373 commit
@@ -562,6 +564,16 @@ export interface AgentLoopConfig extends SimpleStreamOptions {
562
564
  * signal re-check, which has always minted its abort result with no details.
563
565
  */
564
566
  abortResultDetails?: () => Record<string, unknown> | undefined;
567
+ /**
568
+ * The host's station around every tool execution, between the gate's allow and the body: `run` runs the body as the loop
569
+ * would (at most once), and what the station returns is the result the loop finalizes — it may answer without running it,
570
+ * and honors `signal`. Absent ⇒ the loop runs the body itself.
571
+ */
572
+ executeTool?: (call: {
573
+ readonly toolCall: AgentToolCall;
574
+ readonly tool: AgentTool;
575
+ readonly args: unknown;
576
+ }, run: () => Promise<AgentToolResult<unknown>>, signal: AbortSignal | undefined) => Promise<AgentToolResult<unknown>>;
565
577
  /**
566
578
  * Fault seat for a THROWING {@link AgentTool.validateInput}: the loop reads the throw as "no
567
579
  * verdict" (the call proceeds to the gate as if the tool had no validator) and reports the fault
@@ -759,17 +771,17 @@ export interface AgentTool<TParameters extends TSchema = TSchema, TDetails = unk
759
771
  * - "parallel": this tool can execute concurrently with other tool calls.
760
772
  *
761
773
  * If omitted, the tool is treated as NOT concurrency-safe unless its input-level
762
- * `isConcurrencySafe` hook opts a call in (fail-closed; CC 2.1.206 TOOL_DEFAULTS parity).
774
+ * `isConcurrencySafe` hook opts a call in (fail-closed).
763
775
  */
764
776
  executionMode?: ToolExecutionMode;
765
777
  /**
766
- * MCP server self-declared result-size threshold (CC 198 `_meta["anthropic/maxResultSizeChars"]`,
767
- * pretty.js:320015/:320061 — consumer caps at 500K). Set by the MCP materializer when the server
778
+ * MCP server self-declared result-size threshold (`_meta["anthropic/maxResultSizeChars"]`,
779
+ * consumer caps at 500K). Set by the MCP materializer when the server
768
780
  * declares it; consulted by the offload mount in prepare-task. Absent on non-MCP tools.
769
781
  */
770
782
  mcpMaxResultSizeChars?: number;
771
783
  /**
772
- * RB-400-a — MCP server-declared inline pin (CC 220 `_meta["anthropic/alwaysLoad"]`): set by the
784
+ * RB-400-a — MCP server-declared inline pin (`_meta["anthropic/alwaysLoad"]`): set by the
773
785
  * MCP materializer when the server's tools/list entry declares it; prepare-task folds these names
774
786
  * into the defer classification's exemption set, ahead of the MCP constant-defer arm — the
775
787
  * server's own channel for keeping one tool's full schema inlined. Absent on non-MCP tools.
@@ -803,7 +815,7 @@ export interface AgentTool<TParameters extends TSchema = TSchema, TDetails = unk
803
815
  * partitioner for every tool WITHOUT an explicit `executionMode:"parallel"` (a statically-parallel
804
816
  * tool needs no refinement); `true` = treat THIS CALL as concurrency-safe. A throw = false
805
817
  * (fail-closed, CC same). The partitioner validates the call's args against the tool schema FIRST
806
- * (schema-invalid ⇒ unsafe, CC 206 safeParse parity) and hands the hook the validated+coerced
818
+ * (schema-invalid ⇒ unsafe) and hands the hook the validated+coerced
807
819
  * args — still treat defensively (a direct caller may pass raw args). Omitted ⇒ the static mode stands.
808
820
  */
809
821
  isConcurrencySafe?: (args: unknown) => boolean;
@@ -127,12 +127,12 @@ export declare class NodeLspManager implements LspServerManager {
127
127
  }
128
128
  /** Resolve a file path to a languageId via its extension (undefined = no mapping → degrade). */
129
129
  export declare function languageFor(filePath: string): string | undefined;
130
- /** CC 2.1.220's LSP file cap — single-sourced in core (`src/core/lsp.ts`), where the tool-layer check
130
+ /** The LSP file cap — single-sourced in core (`src/core/lsp.ts`), where the tool-layer check
131
131
  * enforces it model-visibly; re-exported here so engine-path importers keep working. */
132
132
  export { MAX_LSP_FILE_BYTES } from "../../core/lsp.js";
133
133
  /**
134
134
  * RB-232: the local default {@link LspReadText}, hardened with a stat-first precondition (CC
135
- * 2.1.220 validateInput does the same before ever reading — "Path is not a file", (pretty220.js:474700, historical; not relocated in 250 — see cc-250 anchors)).
135
+ * the reference's validateInput does the same before ever reading — "Path is not a file").
136
136
  * The stat check is the LOAD-BEARING part, do not "simplify" it away: a plain `readFile` on a FIFO/socket
137
137
  * blocks forever on the FIRST read and PINS a libuv threadpool thread (default pool = 4) for the process
138
138
  * lifetime — measured: `readFile(fifo, { signal })` with an abort fired at 2s was still unsettled at 10s,
@@ -1,22 +1,28 @@
1
- import { type Session, type SessionForkOptions, type SessionMetadata, type SessionRepo, type SessionTreeEntry } from "../harness/types.js";
2
- export declare class InMemorySessionRepo implements SessionRepo<SessionMetadata, {
3
- id?: string;
4
- }> {
1
+ import { type Session, type SessionCreateOptions, type SessionForkOptions, type SessionHead, type SessionMetadata, type SessionRepo, type SessionRow, type SessionTreeEntry } from "../harness/types.js";
2
+ export declare class InMemorySessionRepo implements SessionRepo<SessionMetadata, SessionCreateOptions> {
5
3
  private sessions;
6
- create(options?: {
7
- id?: string;
8
- }): Promise<Session>;
4
+ /** Each row's last touch (epoch ms). */
5
+ private touched;
6
+ create(options?: SessionCreateOptions): Promise<Session>;
9
7
  open(metadata: SessionMetadata): Promise<Session>;
10
- list(): Promise<SessionMetadata[]>;
8
+ /** The row's head off the one session object that IS the row: every cell comes from that object, so a delete and re-create of the
9
+ * id while this reads cannot mix two generations. */
10
+ headOf(sessionId: string): Promise<SessionHead | undefined>;
11
+ /** Every row, with its last {@link touch} as its activity time where it has one. This repo hands its sessions' storages out and never
12
+ * sees their writes (an entry's own `timestamp` is the writer's data, not the time of the write), so a row never touched carries none
13
+ * and a reader takes its `createdAt`. */
14
+ list(): Promise<SessionRow[]>;
15
+ /** Record activity on the row now (a missing row: nothing to record). The time lives and dies with the row: `delete` drops it. */
16
+ touch(sessionId: string): Promise<void>;
11
17
  delete(metadata: SessionMetadata): Promise<void>;
12
- fork(sourceMetadata: SessionMetadata, options: SessionForkOptions): Promise<Session>;
18
+ fork(sourceMetadata: SessionMetadata, options: SessionForkOptions & SessionCreateOptions): Promise<Session>;
13
19
  /** 2c session-sync: the FULL log for export. InMemory holds everything (no F3 floor), so
14
20
  * `getEntries()` IS the full oldest-first log with `id`/`parentId` verbatim. */
15
21
  exportEntries(sessionId: string): Promise<SessionTreeEntry[]>;
16
22
  /** 2c session-sync: import a verbatim log into `sessionId`. The single invariant gate runs first
17
- * ({@link validateEntriesForImport}, fail-closed); `owner` is a durable multi-tenant concept that the local
18
- * in-memory backend has no field for, so it is accepted but unused here. design/171: the operator's
19
- * trusted-import flag is forwarded to the gate that persists — see SessionRepo.importEntries. */
23
+ * ({@link validateEntriesForImport}, fail-closed); a new row records `owner`, an existing row keeps its metadata whole.
24
+ * design/171: the operator's trusted-import flag is forwarded to the gate that persists — see
25
+ * SessionRepo.importEntries. */
20
26
  importEntries(sessionId: string, owner: string | undefined, entries: SessionTreeEntry[], options?: {
21
27
  preserveActorAssertions?: boolean;
22
28
  }): Promise<void>;