@sema-agent/core 7.51.1 → 7.52.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 (372) hide show
  1. package/CHANGELOG.md +550 -2
  2. package/dist/agents/agent-transcript-tool.d.ts +1 -1
  3. package/dist/agents/cascade.js +4 -0
  4. package/dist/agents/cumulative-stats.d.ts +3 -0
  5. package/dist/agents/cumulative-stats.js +3 -0
  6. package/dist/agents/list-agents-tool.d.ts +1 -1
  7. package/dist/agents/read-inbox-tool.d.ts +1 -1
  8. package/dist/agents/repair-loop.js +4 -0
  9. package/dist/agents/send-message-tool.d.ts +11 -16
  10. package/dist/agents/send-message-tool.js +11 -13
  11. package/dist/agents/subagent.d.ts +5 -0
  12. package/dist/agents/subagent.js +7 -4
  13. package/dist/agents/tool-filter.d.ts +40 -13
  14. package/dist/agents/tool-filter.js +28 -14
  15. package/dist/bench/metrics.d.ts +1 -0
  16. package/dist/brain/anthropic.js +16 -12
  17. package/dist/brain/model-presets.d.ts +4 -5
  18. package/dist/brain/model-presets.js +4 -4
  19. package/dist/brain/open-responses.js +16 -12
  20. package/dist/brain/openai.js +16 -12
  21. package/dist/brain/request-params.d.ts +12 -33
  22. package/dist/brain/request-params.js +5 -2
  23. package/dist/brain/request-route.d.ts +9 -8
  24. package/dist/brain/request-route.js +1 -0
  25. package/dist/brain/route-adjudicator.d.ts +117 -47
  26. package/dist/brain/route-adjudicator.js +171 -42
  27. package/dist/brain/route-conformance.js +2 -2
  28. package/dist/brain/status-sink.d.ts +18 -0
  29. package/dist/brain/status-sink.js +7 -0
  30. package/dist/core/allow-entry.d.ts +42 -8
  31. package/dist/core/allow-entry.js +24 -17
  32. package/dist/core/auto-compaction.d.ts +23 -20
  33. package/dist/core/auto-compaction.js +37 -16
  34. package/dist/core/auto-promote.d.ts +2 -1
  35. package/dist/core/auto-promote.js +2 -2
  36. package/dist/core/caller-tool-name.d.ts +9 -0
  37. package/dist/core/caller-tool-name.js +13 -0
  38. package/dist/core/checkpoint-requirements.d.ts +7 -1
  39. package/dist/core/checkpoint-requirements.js +2 -0
  40. package/dist/core/checkpoint-store.d.ts +36 -12
  41. package/dist/core/checkpoint-store.js +1 -1
  42. package/dist/core/child-clamp-seats.d.ts +6 -0
  43. package/dist/core/child-clamp-seats.js +2 -1
  44. package/dist/core/credential-vocabulary.d.ts +33 -8
  45. package/dist/core/credential-vocabulary.js +32 -7
  46. package/dist/core/decision-receipt.d.ts +2 -2
  47. package/dist/core/delegation-frames.d.ts +9 -2
  48. package/dist/core/delegation-name.d.ts +18 -0
  49. package/dist/core/delegation-name.js +47 -0
  50. package/dist/core/engine-capabilities.d.ts +8 -1
  51. package/dist/core/engine-capabilities.js +1 -1
  52. package/dist/core/engine-notice.d.ts +36 -19
  53. package/dist/core/frontmatter-fence.d.ts +10 -0
  54. package/dist/core/frontmatter-fence.js +6 -0
  55. package/dist/core/gate-fold.js +5 -23
  56. package/dist/core/gate-lanes.js +356 -270
  57. package/dist/core/governance-codes.d.ts +9 -4
  58. package/dist/core/governance-codes.js +9 -3
  59. package/dist/core/hooks.d.ts +276 -734
  60. package/dist/core/hooks.js +97 -192
  61. package/dist/{tools/fs → core}/image-admission.d.ts +21 -3
  62. package/dist/{tools/fs → core}/image-admission.js +24 -6
  63. package/dist/core/locked-config.d.ts +26 -5
  64. package/dist/core/locked-config.js +31 -6
  65. package/dist/core/mcp-connection-pool.d.ts +4 -1
  66. package/dist/core/mcp-connection-pool.js +7 -2
  67. package/dist/core/mcp-probe.d.ts +12 -9
  68. package/dist/core/mcp-probe.js +2 -2
  69. package/dist/core/mcp-server-spec.d.ts +53 -7
  70. package/dist/core/mcp-server-spec.js +84 -1
  71. package/dist/core/mcp.d.ts +11 -7
  72. package/dist/core/mcp.js +27 -9
  73. package/dist/core/memory-engine/data-plane.js +5 -1
  74. package/dist/core/memory-engine/distiller.js +16 -2
  75. package/dist/core/memory-engine/engine.d.ts +8 -11
  76. package/dist/core/memory-engine/engine.js +9 -5
  77. package/dist/core/memory-engine/frontmatter.d.ts +6 -0
  78. package/dist/core/memory-engine/frontmatter.js +19 -16
  79. package/dist/core/memory.d.ts +2 -2
  80. package/dist/core/mode-policy.d.ts +4 -0
  81. package/dist/core/mode-policy.js +7 -5
  82. package/dist/core/model-seat.d.ts +4 -1
  83. package/dist/core/mods/dollar.d.ts +109 -0
  84. package/dist/core/mods/dollar.js +154 -0
  85. package/dist/core/mods/host.d.ts +23 -0
  86. package/dist/core/mods/host.js +21 -0
  87. package/dist/core/mods/kernel/budget.d.ts +43 -0
  88. package/dist/core/mods/kernel/budget.js +83 -0
  89. package/dist/core/mods/kernel/dispatch.d.ts +100 -0
  90. package/dist/core/mods/kernel/dispatch.js +701 -0
  91. package/dist/core/mods/kernel/events.d.ts +242 -0
  92. package/dist/core/mods/kernel/events.js +210 -0
  93. package/dist/core/mods/kernel/index.d.ts +6 -0
  94. package/dist/core/mods/kernel/index.js +5 -0
  95. package/dist/core/mods/kernel/receive.d.ts +65 -0
  96. package/dist/core/mods/kernel/receive.js +123 -0
  97. package/dist/core/mods/kernel/registration.d.ts +131 -0
  98. package/dist/core/mods/kernel/registration.js +102 -0
  99. package/dist/core/mods/kernel/site-rules.d.ts +84 -0
  100. package/dist/core/mods/kernel/site-rules.js +104 -0
  101. package/dist/core/mods/stations.d.ts +350 -0
  102. package/dist/core/mods/stations.js +444 -0
  103. package/dist/core/own-property-receipt.js +11 -23
  104. package/dist/core/parent-spec-seat.d.ts +18 -7
  105. package/dist/core/parent-spec-seat.js +6 -2
  106. package/dist/core/path-identity.js +2 -1
  107. package/dist/core/permission-rule-syntax.d.ts +15 -0
  108. package/dist/core/permission-rule-syntax.js +24 -16
  109. package/dist/core/permission-rules.d.ts +7 -1
  110. package/dist/core/permission-rules.js +26 -15
  111. package/dist/core/prompt-section-seat.d.ts +15 -27
  112. package/dist/core/prompt-section-seat.js +73 -40
  113. package/dist/core/protocol-http-auth.d.ts +3 -1
  114. package/dist/core/protocol-http-auth.js +2 -0
  115. package/dist/core/reminder-mint.d.ts +2 -2
  116. package/dist/core/remote-env.d.ts +24 -12
  117. package/dist/core/remote-env.js +1 -0
  118. package/dist/core/resume-startup-cause.d.ts +16 -1
  119. package/dist/core/resume-startup-cause.js +4 -1
  120. package/dist/core/retired-keys.d.ts +4 -0
  121. package/dist/core/retired-keys.js +3 -0
  122. package/dist/core/runner/announce-once-ledger.d.ts +31 -1
  123. package/dist/core/runner/announce-once-ledger.js +22 -0
  124. package/dist/core/runner/assemble-result.d.ts +9 -0
  125. package/dist/core/runner/assemble-result.js +3 -1
  126. package/dist/core/runner/call-hook-stations.d.ts +23 -27
  127. package/dist/core/runner/call-hook-stations.js +58 -42
  128. package/dist/core/runner/caller-stop-gate.d.ts +25 -0
  129. package/dist/core/runner/caller-stop-gate.js +7 -0
  130. package/dist/core/runner/compaction-seams.d.ts +8 -22
  131. package/dist/core/runner/compaction-seams.js +28 -53
  132. package/dist/core/runner/construction-doors.js +11 -1
  133. package/dist/core/runner/contracts.d.ts +85 -83
  134. package/dist/core/runner/credential-origin-seat.d.ts +2 -0
  135. package/dist/core/runner/credential-origin-seat.js +19 -0
  136. package/dist/core/runner/extra-body-dropped-seat.d.ts +2 -6
  137. package/dist/core/runner/gate-exit.d.ts +47 -36
  138. package/dist/core/runner/gate-exit.js +8 -2
  139. package/dist/core/runner/image.js +1 -2
  140. package/dist/core/runner/inline-image.js +1 -1
  141. package/dist/core/runner/notice-seat-input.d.ts +11 -0
  142. package/dist/core/runner/notice-seat-input.js +1 -0
  143. package/dist/core/runner/person-path-rows.js +1 -0
  144. package/dist/core/runner/prepare-acquire-reconcile.js +5 -1
  145. package/dist/core/runner/prepare-ask-lane.d.ts +5 -7
  146. package/dist/core/runner/prepare-ask-lane.js +6 -15
  147. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -2
  148. package/dist/core/runner/prepare-caps-and-workflow.js +25 -8
  149. package/dist/core/runner/prepare-config-doors.d.ts +5 -0
  150. package/dist/core/runner/prepare-config-doors.js +9 -0
  151. package/dist/core/runner/prepare-defer-classify.js +3 -4
  152. package/dist/core/runner/prepare-gate-stations.d.ts +8 -11
  153. package/dist/core/runner/prepare-gate-stations.js +11 -10
  154. package/dist/core/runner/prepare-inherited-gate.d.ts +8 -12
  155. package/dist/core/runner/prepare-inherited-gate.js +8 -21
  156. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  157. package/dist/core/runner/prepare-park-ask.js +10 -14
  158. package/dist/core/runner/prepare-policy-chain.d.ts +18 -16
  159. package/dist/core/runner/prepare-policy-chain.js +98 -101
  160. package/dist/core/runner/prepare-project-context.js +7 -10
  161. package/dist/core/runner/prepare-prompt-assembly.d.ts +45 -40
  162. package/dist/core/runner/prepare-prompt-assembly.js +134 -101
  163. package/dist/core/runner/prepare-prompt-inputs.d.ts +18 -19
  164. package/dist/core/runner/prepare-prompt-inputs.js +5 -7
  165. package/dist/core/runner/prepare-protocol-tools.d.ts +6 -4
  166. package/dist/core/runner/prepare-protocol-tools.js +2 -2
  167. package/dist/core/runner/prepare-safety-scan.js +6 -10
  168. package/dist/core/runner/prepare-suspend-saga.d.ts +6 -0
  169. package/dist/core/runner/prepare-suspend-saga.js +7 -5
  170. package/dist/core/runner/prepare-task.js +33 -15
  171. package/dist/core/runner/prepare-turn-wiring.d.ts +13 -15
  172. package/dist/core/runner/prepare-turn-wiring.js +29 -27
  173. package/dist/core/runner/prepare-wiring-manifest.d.ts +5 -6
  174. package/dist/core/runner/prepare-wiring-manifest.js +7 -7
  175. package/dist/core/runner/resume-apply.d.ts +5 -2
  176. package/dist/core/runner/resume-apply.js +24 -42
  177. package/dist/core/runner/resume-checkpoint-screen.d.ts +1 -0
  178. package/dist/core/runner/resume-checkpoint-screen.js +9 -1
  179. package/dist/core/runner/resume-preflight.js +38 -16
  180. package/dist/core/runner/retired-runner-deps.js +3 -1
  181. package/dist/core/runner/run-brain-sinks.d.ts +3 -2
  182. package/dist/core/runner/run-brain-sinks.js +5 -1
  183. package/dist/core/runner/run-compaction-machinery.d.ts +7 -1
  184. package/dist/core/runner/run-compaction-machinery.js +7 -33
  185. package/dist/core/runner/run-harness-handlers.js +4 -2
  186. package/dist/core/runner/run-identity-wiring.d.ts +3 -1
  187. package/dist/core/runner/run-identity-wiring.js +3 -2
  188. package/dist/core/runner/run-leg.js +62 -84
  189. package/dist/core/runner/run-notification-lane.js +1 -0
  190. package/dist/core/runner/run-recovery-lanes.d.ts +3 -0
  191. package/dist/core/runner/run-recovery-lanes.js +11 -10
  192. package/dist/core/runner/run-settle-and-teardown.js +9 -28
  193. package/dist/core/runner/run-stop-and-final-verify.js +18 -25
  194. package/dist/core/runner/run-terminal-adoption.d.ts +3 -0
  195. package/dist/core/runner/run-terminal-adoption.js +33 -22
  196. package/dist/core/runner/run-tool-mount-facts.js +5 -3
  197. package/dist/core/runner/run-turn-boundary.js +23 -34
  198. package/dist/core/runner/runtask.d.ts +6 -7
  199. package/dist/core/runner/runtask.js +14 -72
  200. package/dist/core/runner/session-rule-policy.d.ts +6 -4
  201. package/dist/core/runner/session-rule-policy.js +17 -10
  202. package/dist/core/runner/side-call-account.d.ts +68 -0
  203. package/dist/core/runner/side-call-account.js +61 -0
  204. package/dist/core/runner/stream-halt-verbs.js +12 -17
  205. package/dist/core/runner/stream-lifecycle-verbs.js +8 -5
  206. package/dist/core/runner/stream-steer-verb.d.ts +1 -1
  207. package/dist/core/runner/stream-steer-verb.js +20 -38
  208. package/dist/core/runner/sub-agent-deny-lists.d.ts +121 -22
  209. package/dist/core/runner/sub-agent-deny-lists.js +228 -71
  210. package/dist/core/runner/tool-end-body.d.ts +5 -6
  211. package/dist/core/runner/tool-end-body.js +6 -4
  212. package/dist/core/runner/tool-not-executed.d.ts +15 -0
  213. package/dist/core/runner/tool-not-executed.js +30 -0
  214. package/dist/core/runner/tool-occurrence.d.ts +8 -7
  215. package/dist/core/runner/tool-occurrence.js +5 -5
  216. package/dist/core/runner/tool-result-media-seat.d.ts +1 -1
  217. package/dist/core/runner-deps.d.ts +20 -28
  218. package/dist/core/safety-merge-corpus.js +18 -2
  219. package/dist/core/secret-env.d.ts +93 -20
  220. package/dist/core/secret-env.js +192 -38
  221. package/dist/core/session-policy-store.d.ts +93 -17
  222. package/dist/core/session-policy-store.js +178 -25
  223. package/dist/core/session-reconcile.d.ts +4 -0
  224. package/dist/core/session-reconcile.js +2 -1
  225. package/dist/core/shell-read-silence.js +3 -32
  226. package/dist/core/side-query.d.ts +5 -3
  227. package/dist/core/skill-grant.d.ts +3 -2
  228. package/dist/core/skill-grant.js +17 -9
  229. package/dist/core/skills-directory.d.ts +31 -11
  230. package/dist/core/skills-directory.js +655 -104
  231. package/dist/core/task-event.d.ts +13 -3
  232. package/dist/core/task-result.d.ts +8 -0
  233. package/dist/core/task-spec.d.ts +20 -19
  234. package/dist/core/task-stream.d.ts +14 -4
  235. package/dist/core/tighten-task-spec.d.ts +4 -3
  236. package/dist/core/tighten-task-spec.js +2 -4
  237. package/dist/core/tool-check-reading.d.ts +74 -0
  238. package/dist/core/tool-check-reading.js +80 -0
  239. package/dist/core/tool-policy.d.ts +59 -18
  240. package/dist/core/tool-policy.js +77 -12
  241. package/dist/core/tool-registry.d.ts +20 -0
  242. package/dist/core/tool-registry.js +4 -0
  243. package/dist/core/tool-spec.d.ts +10 -6
  244. package/dist/core/tools.js +2 -0
  245. package/dist/core/trace.d.ts +51 -32
  246. package/dist/core/types.d.ts +2 -1
  247. package/dist/core/types.js +1 -0
  248. package/dist/core/unc-spelling.d.ts +10 -0
  249. package/dist/core/unc-spelling.js +3 -0
  250. package/dist/core/untrusted-egress.d.ts +8 -0
  251. package/dist/core/untrusted-egress.js +4 -1
  252. package/dist/core/user-attachment.d.ts +12 -2
  253. package/dist/core/user-attachment.js +17 -2
  254. package/dist/core/wiring-manifest.d.ts +14 -13
  255. package/dist/core/wiring-manifest.js +2 -2
  256. package/dist/engine/compaction/utils.js +1 -2
  257. package/dist/engine/execution-env/node-execution-env.d.ts +4 -3
  258. package/dist/engine/execution-env/symlink-chain.js +1 -1
  259. package/dist/engine/harness/agent-harness.d.ts +1 -1
  260. package/dist/engine/harness/agent-harness.js +3 -3
  261. package/dist/engine/harness/types.d.ts +17 -16
  262. package/dist/engine/harness/types.js +7 -1
  263. package/dist/engine/llm/types.d.ts +12 -7
  264. package/dist/engine/loop/agent-loop.js +1 -1
  265. package/dist/engine/loop/types.d.ts +1 -1
  266. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  267. package/dist/engine/session/import-validate.js +3 -10
  268. package/dist/engine/session/session.d.ts +4 -4
  269. package/dist/engine/session/session.js +4 -4
  270. package/dist/index.d.ts +24 -17
  271. package/dist/index.js +15 -12
  272. package/dist/internal/harness.d.ts +1 -1
  273. package/dist/internal/harness.js +1 -1
  274. package/dist/orchestration/run-spec.d.ts +4 -6
  275. package/dist/orchestration/run-spec.js +39 -63
  276. package/dist/orchestration/run-workflow-tool.js +1 -2
  277. package/dist/orchestration/workflow.d.ts +11 -3
  278. package/dist/orchestration/workflow.js +11 -2
  279. package/dist/prompt-assembly/artifact-store.d.ts +37 -56
  280. package/dist/prompt-assembly/artifact-store.js +31 -49
  281. package/dist/prompt-assembly/artifact.d.ts +89 -76
  282. package/dist/prompt-assembly/artifact.js +167 -146
  283. package/dist/prompt-assembly/assemble.d.ts +34 -29
  284. package/dist/prompt-assembly/assemble.js +33 -220
  285. package/dist/prompt-assembly/bands.d.ts +20 -0
  286. package/dist/prompt-assembly/bands.js +18 -0
  287. package/dist/prompt-assembly/catalog/constitution.d.ts +23 -0
  288. package/dist/prompt-assembly/catalog/constitution.js +69 -0
  289. package/dist/prompt-assembly/catalog/core-behavior.d.ts +9 -0
  290. package/dist/prompt-assembly/catalog/core-behavior.js +85 -0
  291. package/dist/prompt-assembly/catalog/index.d.ts +11 -0
  292. package/dist/prompt-assembly/catalog/index.js +59 -0
  293. package/dist/prompt-assembly/catalog/modes.d.ts +15 -0
  294. package/dist/prompt-assembly/catalog/modes.js +137 -0
  295. package/dist/prompt-assembly/catalog/role.d.ts +10 -0
  296. package/dist/prompt-assembly/catalog/role.js +157 -0
  297. package/dist/prompt-assembly/catalog/schema.d.ts +124 -0
  298. package/dist/prompt-assembly/catalog/schema.js +25 -0
  299. package/dist/prompt-assembly/catalog/sections.d.ts +9 -0
  300. package/dist/prompt-assembly/catalog/sections.js +98 -0
  301. package/dist/prompt-assembly/catalog/team.d.ts +4 -0
  302. package/dist/prompt-assembly/catalog/team.js +258 -0
  303. package/dist/prompt-assembly/composer.d.ts +24 -28
  304. package/dist/prompt-assembly/composer.js +124 -46
  305. package/dist/prompt-assembly/epoch.d.ts +89 -79
  306. package/dist/prompt-assembly/epoch.js +115 -142
  307. package/dist/prompt-assembly/explain.d.ts +58 -34
  308. package/dist/prompt-assembly/explain.js +21 -24
  309. package/dist/prompt-assembly/overlay.d.ts +127 -0
  310. package/dist/prompt-assembly/overlay.js +301 -0
  311. package/dist/prompt-assembly/renderers.d.ts +21 -0
  312. package/dist/prompt-assembly/renderers.js +39 -0
  313. package/dist/prompt-assembly/section-usage.d.ts +3 -3
  314. package/dist/prompt-assembly/section-usage.js +1 -1
  315. package/dist/prompt-assembly/select.d.ts +56 -0
  316. package/dist/prompt-assembly/select.js +69 -0
  317. package/dist/prompt-assembly/sugar.d.ts +31 -0
  318. package/dist/prompt-assembly/sugar.js +20 -0
  319. package/dist/prompt-assembly/turn-snapshot.d.ts +3 -2
  320. package/dist/prompt-assembly/types.d.ts +45 -148
  321. package/dist/prompts/coordinator.d.ts +2 -21
  322. package/dist/prompts/coordinator.js +3 -255
  323. package/dist/prompts/cowork.d.ts +27 -16
  324. package/dist/prompts/cowork.js +2 -23
  325. package/dist/prompts/default.d.ts +38 -500
  326. package/dist/prompts/default.js +20 -285
  327. package/dist/prompts/supervisor.d.ts +6 -71
  328. package/dist/prompts/supervisor.js +6 -117
  329. package/dist/stores/file/session-policy-store.d.ts +3 -3
  330. package/dist/tools/fs/bash-readonly-classifier.d.ts +6 -5
  331. package/dist/tools/fs/dir-entries.d.ts +4 -2
  332. package/dist/tools/fs/dir-entries.js +16 -4
  333. package/dist/tools/fs/fs-bash.d.ts +1 -1
  334. package/dist/tools/fs/fs-bash.js +22 -11
  335. package/dist/tools/fs/fs-pdf.js +17 -13
  336. package/dist/tools/fs/fs-read.js +4 -3
  337. package/dist/tools/fs/fs-shared.d.ts +1 -10
  338. package/dist/tools/fs/fs-shared.js +3 -4
  339. package/dist/tools/fs/fs-write.js +2 -1
  340. package/dist/tools/fs/notebook.js +1 -1
  341. package/dist/tools/fs/pdf.d.ts +20 -10
  342. package/dist/tools/fs/pdf.js +19 -10
  343. package/dist/tools/fs/program-read-model.d.ts +68 -8
  344. package/dist/tools/fs/program-read-model.js +112 -33
  345. package/dist/tools/fs/program-read-model.rows.js +30 -10
  346. package/dist/tools/fs/read-deny-home.d.ts +25 -9
  347. package/dist/tools/fs/read-deny-home.js +28 -27
  348. package/dist/tools/fs/read-deny.d.ts +41 -11
  349. package/dist/tools/fs/read-deny.js +51 -5
  350. package/dist/tools/fs/safety.d.ts +4 -26
  351. package/dist/tools/fs/safety.js +10 -32
  352. package/dist/tools/fs/search.js +15 -10
  353. package/dist/tools/fs/shell-read-argv.d.ts +3 -2
  354. package/dist/tools/fs/shell-read-argv.js +118 -38
  355. package/dist/tools/fs/shell-read-establish.d.ts +5 -5
  356. package/dist/tools/fs/shell-read-establish.js +11 -61
  357. package/dist/tools/fs/shell-read-identity.js +6 -3
  358. package/dist/tools/fs/shell-read-judge.d.ts +13 -15
  359. package/dist/tools/fs/shell-read-judge.js +18 -4
  360. package/dist/tools/fs/shell-read-plan.d.ts +2 -2
  361. package/dist/tools/web.js +1 -1
  362. package/package.json +13 -1
  363. package/test/export-surface.snapshot.json +256 -99
  364. package/wire-changes/core@7.51.1.json +5 -5
  365. package/wire-changes/core@7.51.2.json +293 -0
  366. package/wire-changes/core@7.52.0.json +5859 -0
  367. package/dist/core/hook-seats.d.ts +0 -66
  368. package/dist/core/hook-seats.js +0 -37
  369. package/dist/prompt-assembly/packs/sema-default.d.ts +0 -2
  370. package/dist/prompt-assembly/packs/sema-default.js +0 -147
  371. package/dist/prompts/simple-sections.d.ts +0 -58
  372. package/dist/prompts/simple-sections.js +0 -43
@@ -1,8 +1,9 @@
1
1
  import { snapshotActorAssertion } from "../../internal/llm.js";
2
2
  import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
3
3
  import { CheckpointError, remainingBudgetMicroUsd } from "../checkpoint-store.js";
4
- import { mintHookInvocationIdentity, resolveHookTimeoutMs, runHookSeat } from "../hooks.js";
5
4
  import { chainPolicyOnLeg, chainTopAnchors } from "./child-tree.js";
5
+ import { mintHookInvocationIdentity } from "../hooks.js";
6
+ import { admitLegMods, classicEventBase, failedHandlerClause, screenUserPrompt } from "../mods/stations.js";
6
7
  import { checkToolPolicyProjection, policyCannotAnswer, refuseOutOfContractDecision } from "../tool-policy.js";
7
8
  import { callFaceSeat, parkedCallFaceOf } from "../tool-roster.js";
8
9
  import { readCallTarget } from "../effective-path-target.js";
@@ -10,7 +11,7 @@ import { inlineUntrusted } from "../untrusted-text.js";
10
11
  import { deepJsonEqual, describeSuppliedValue, mintDecideRecord } from "./decide-continuation.js";
11
12
  import { orgVerdictBeforeClaim } from "./permission-rule-lanes.js";
12
13
  import { chainCannotJudge } from "./call-hook-stations.js";
13
- import { asThrownError, thrownText } from "../thrown-value.js";
14
+ import { thrownText } from "../thrown-value.js";
14
15
  import { wireOf } from "../tool-name-readings.js";
15
16
  import { parkedSkillApprovalRefusal } from "../skill-grant.js";
16
17
  import { SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, normalizeSkills } from "./synthetic-tools.js";
@@ -19,10 +20,12 @@ export async function resumeApply(input) {
19
20
  const { cp, config, internals, outcomeGate, wakeMessage, resumeSignal, recheckGovernanceWindow, plainReviewOutcome, plainParkOutcome, runner, effectiveDelegationFacts } = input;
20
21
  let plainPolicyOutcome = input.plainPolicyOutcome;
21
22
  let wakeHookContext;
23
+ let legMods;
22
24
  if (outcomeGate === "wake" && wakeMessage !== undefined) {
23
- const resumeScreenHooks = config.hooks ?? runner.deps.hooks;
24
- const screen = resumeScreenHooks?.userPromptSubmit;
25
- if (screen !== undefined && resumeSignal?.aborted !== true) {
25
+ if (resumeSignal?.aborted !== true) {
26
+ legMods = await admitLegMods({ spec: config, deps: runner.deps, sessionId: cp.sessionId });
27
+ }
28
+ if (legMods !== undefined && legMods.bus.hasHandlers("classic.UserPromptSubmit")) {
26
29
  const screenedMessage = wakeMessage;
27
30
  const identity = mintHookInvocationIdentity({
28
31
  sessionId: cp.sessionId,
@@ -35,45 +38,24 @@ export async function resumeApply(input) {
35
38
  ...(internals?.spawnAgentType !== undefined ? { agentType: internals.spawnAgentType } : {}),
36
39
  ...(internals?.parentToolCallId !== undefined ? { parentToolCallId: internals.parentToolCallId } : {}),
37
40
  });
38
- const screenTimeoutMs = resolveHookTimeoutMs(resumeScreenHooks?.timeoutMs, (badErr) => {
39
- try {
40
- runner.deps.onError?.(asThrownError(badErr), { phase: "hook", sessionId: cp.sessionId });
41
- }
42
- catch {
43
- }
44
- }, resumeScreenHooks);
45
- let decision;
46
- try {
47
- const seat = await runHookSeat("userPromptSubmit", { timeoutMs: screenTimeoutMs, ...(resumeSignal !== undefined ? { signal: resumeSignal } : {}), abortEnds: true }, (sig) => screen(screenedMessage.text, {
48
- identity,
49
- signal: sig,
50
- source: "resume_message",
51
- ...(screenedMessage.inputId !== undefined ? { inputId: screenedMessage.inputId } : {}),
52
- ...(screenedMessage.actor !== undefined ? { actor: snapshotActorAssertion(screenedMessage.actor) } : {}),
53
- }));
54
- if (seat.expired) {
55
- if (seat.cause === "aborted")
56
- throw new CheckpointError("checkpoint.resume_aborted", "the resume was aborted while the deployment's userPromptSubmit hook was still screening this wake message — the checkpoint stays pending and is resumable with a live signal");
57
- throw new CheckpointError("steering.blocked_by_hook", `the deployment's userPromptSubmit hook did not answer within its ${screenTimeoutMs}ms bound while screening this wake message; the resume was refused (fail-closed) and the checkpoint stays pending`);
58
- }
59
- decision = seat.value;
41
+ const screen = await screenUserPrompt(legMods.bus, {
42
+ ...classicEventBase(identity),
43
+ prompt: screenedMessage.text,
44
+ source: "resume_message",
45
+ ...(screenedMessage.inputId !== undefined ? { inputId: screenedMessage.inputId } : {}),
46
+ ...(screenedMessage.actor !== undefined ? { actor: snapshotActorAssertion(screenedMessage.actor) } : {}),
47
+ }, resumeSignal);
48
+ if (screen?.kind === "aborted") {
49
+ throw new CheckpointError("checkpoint.resume_aborted", "the resume was aborted while the deployment's userPromptSubmit hook was still screening this wake message — the checkpoint stays pending and is resumable with a live signal");
60
50
  }
61
- catch (hookErr) {
62
- if (hookErr instanceof CheckpointError)
63
- throw hookErr;
64
- const err = asThrownError(hookErr);
65
- try {
66
- runner.deps.onError?.(err, { phase: "hook", sessionId: cp.sessionId });
67
- }
68
- catch {
69
- }
70
- throw new CheckpointError("steering.blocked_by_hook", `the deployment's userPromptSubmit hook crashed while screening this wake message (${inlineUntrusted(err.message)}); the resume was refused (fail-closed) and the checkpoint stays pending`);
51
+ if (screen?.kind === "failed") {
52
+ throw new CheckpointError("steering.blocked_by_hook", `the deployment's userPromptSubmit hook ${failedHandlerClause(screen)} while screening this wake message; the resume was refused (fail-closed) and the checkpoint stays pending`);
71
53
  }
72
- if (decision?.block !== undefined && decision.block !== "") {
73
- throw new CheckpointError("steering.blocked_by_hook", `the deployment's userPromptSubmit hook blocked this wake message: ${inlineUntrusted(decision.block)}`);
54
+ if (screen?.block !== undefined && screen.block !== "") {
55
+ throw new CheckpointError("steering.blocked_by_hook", `the deployment's userPromptSubmit hook blocked this wake message: ${inlineUntrusted(screen.block)}`);
74
56
  }
75
- if (decision?.additionalContext !== undefined && decision.additionalContext !== "") {
76
- wakeHookContext = decision.additionalContext;
57
+ if (screen?.additionalContext !== undefined && screen.additionalContext !== "") {
58
+ wakeHookContext = screen.additionalContext;
77
59
  }
78
60
  if (recheckGovernanceWindow !== undefined)
79
61
  await recheckGovernanceWindow();
@@ -192,5 +174,5 @@ export async function resumeApply(input) {
192
174
  if (outcomeForStore === undefined) {
193
175
  throw new CheckpointError("checkpoint.invalid_outcome", `resume outcome (gate "${describeSuppliedValue(outcomeGate)}") matched the checkpoint gate but no lane captured it — refusing pre-CAS rather than passing the caller's live object to the store and the resumed run`);
194
176
  }
195
- return await input.next({ wakeHookContext, plainPolicyOutcome, outcomeForStore });
177
+ return await input.next({ wakeHookContext, ...(legMods !== undefined ? { legMods } : {}), plainPolicyOutcome, outcomeForStore });
196
178
  }
@@ -7,6 +7,7 @@ export interface ResumeCheckpointScreenInput {
7
7
  resumeSignal: AbortSignal | undefined;
8
8
  /** borrowed-readonly — the internals snapshot (the re-supplied chain, the requested cwd). */
9
9
  internals: RunInternals | undefined;
10
+ /** borrowed-readonly — the roster the resume hands (`ResumeTaskConfig.tools`), as the caller mounts it. */ tools: unknown;
10
11
  /** borrowed-readonly — the Runner's deployment deps, read LIVE through the Runner (reads `permissionRuleStore` and `executionEnvFactory`); the one home of why it is a
11
12
  * seat and not a captured object is {@link RunnerDepsSeat}. */
12
13
  runner: RunnerDepsSeat;
@@ -6,8 +6,11 @@ import { judgeCheckpointRequirements } from "../checkpoint-requirements.js";
6
6
  import { constraintChainDigest, constraintChainEntryOfSuppliedLayer } from "../tool-policy.js";
7
7
  import { readFrozenSkillGrants } from "../skill-grant.js";
8
8
  import { chainInstallationGaps, chainInstallationRefusal } from "./child-tree.js";
9
+ import { screeningInstallationsOf, unraisableGuardsOf } from "../mods/stations.js";
10
+ import { refusePersistedToolNames, refuseRenamedDelegationMounts } from "./sub-agent-deny-lists.js";
11
+ import { asResumeConfigRefusal } from "../mode-policy.js";
9
12
  export function resumeCheckpointScreen(input) {
10
- const { cp, resumeSignal, internals, runner } = input;
13
+ const { cp, resumeSignal, internals, tools, runner } = input;
11
14
  const { realApproval: realApprovalRow, face: faceRow, f012: f012Row } = CHECKPOINT_FEATURES;
12
15
  if (checkpointVersionOf(cp) > MAX_SUPPORTED_CHECKPOINT_VERSION) {
13
16
  throw new CheckpointError("checkpoint.unsupported_version", `checkpoint requires reader capabilities this worker lacks (row format v${checkpointVersionOf(cp)}; this worker reads up to v${MAX_SUPPORTED_CHECKPOINT_VERSION}) — resume it on a worker at or above the version that parked it`, { reason: "version_newer" });
@@ -84,6 +87,8 @@ export function resumeCheckpointScreen(input) {
84
87
  "the restored workspace's own mount path is authoritative for the task root. Drop requestedCwd on resume legs " +
85
88
  "(the checkpoint stays pending and is resumable without it).");
86
89
  }
90
+ asResumeConfigRefusal("inheritedGate", () => refusePersistedToolNames((internals?.toolCeiling ?? undefined) === undefined ? cp.state.toolCeiling : undefined, cp.state.inheritedGate?.constraintChain, (internals?.ownToolLists ?? undefined) === undefined ? cp.state.ownToolLists : undefined));
91
+ asResumeConfigRefusal("taskConfig", () => refuseRenamedDelegationMounts(tools));
87
92
  if (cp.state.inheritedGate?.requiresParentConstraint === true) {
88
93
  const supplied = internals?.inheritedGate?.parentConstraints?.length ?? 0;
89
94
  if (supplied === 0) {
@@ -126,6 +131,9 @@ export function resumeCheckpointScreen(input) {
126
131
  if (gaps.length > 0)
127
132
  throw chainInstallationRefusal(gaps, true);
128
133
  }
134
+ const unraisable = unraisableGuardsOf(screeningInstallationsOf(internals?.inheritedGate?.parentConstraints ?? []));
135
+ if (unraisable !== undefined)
136
+ throw new CheckpointError("resume.parent_constraint_mismatch", `${unraisable}; rejected pre-CAS (the checkpoint stays pending)`);
129
137
  const resumeInternals = internals?.inheritedGate?.parentConstraints !== undefined
130
138
  ? {
131
139
  ...internals,
@@ -1,10 +1,44 @@
1
1
  import { CheckpointError } from "../checkpoint-store.js";
2
- import { MAX_HOOK_TIMEOUT_MS, runHookSeat } from "../hooks.js";
2
+ import { MAX_TIMER_MS } from "../mods/kernel/index.js";
3
3
  import { hasDestroy } from "../remote-env.js";
4
4
  import { inlineUntrusted } from "../untrusted-text.js";
5
5
  import { describeSuppliedValue } from "./decide-continuation.js";
6
6
  import { settleTeardownLeg } from "./teardown-bounded.js";
7
7
  import { asThrownError } from "../thrown-value.js";
8
+ async function boundedPreflight(timeoutMs, signal, call) {
9
+ const controller = new AbortController();
10
+ const pending = Promise.resolve(call(controller.signal));
11
+ return await new Promise((resolve, reject) => {
12
+ let settled = false;
13
+ const finish = (act) => {
14
+ if (settled)
15
+ return;
16
+ settled = true;
17
+ clearTimeout(timer);
18
+ signal?.removeEventListener("abort", onAbort);
19
+ act();
20
+ };
21
+ const expire = (cause) => finish(() => {
22
+ void pending.then(undefined, () => {
23
+ });
24
+ resolve({ expired: true, cause });
25
+ queueMicrotask(() => {
26
+ try {
27
+ controller.abort();
28
+ }
29
+ catch {
30
+ }
31
+ });
32
+ });
33
+ const onAbort = () => expire("aborted");
34
+ const timer = setTimeout(() => expire("timeout"), timeoutMs);
35
+ if (signal?.aborted === true)
36
+ onAbort();
37
+ else
38
+ signal?.addEventListener("abort", onAbort, { once: true });
39
+ pending.then((value) => finish(() => resolve({ expired: false, value })), (err) => finish(() => reject(asThrownError(err))));
40
+ });
41
+ }
8
42
  const RESUME_PREFLIGHT_DEFAULT_TIMEOUT_MS = 10_000;
9
43
  export async function resumePreflight(input) {
10
44
  const { token, cp, resumeSignal, recheckGovernanceWindow, store, runner, locallyClaimedTokens, parentConstraintRegistry, suspendedEnvReaps } = input;
@@ -13,12 +47,12 @@ export async function resumePreflight(input) {
13
47
  const rawDeadline = runner.deps.resumePreflightTimeoutMs;
14
48
  let preflightTimeoutMs = RESUME_PREFLIGHT_DEFAULT_TIMEOUT_MS;
15
49
  if (rawDeadline !== undefined) {
16
- if (typeof rawDeadline === "number" && Number.isFinite(rawDeadline) && rawDeadline > 0 && rawDeadline <= MAX_HOOK_TIMEOUT_MS) {
50
+ if (typeof rawDeadline === "number" && Number.isFinite(rawDeadline) && rawDeadline > 0 && rawDeadline <= MAX_TIMER_MS) {
17
51
  preflightTimeoutMs = rawDeadline;
18
52
  }
19
53
  else {
20
54
  try {
21
- runner.deps.onError?.(new Error(`RunnerDeps.resumePreflightTimeoutMs is not a positive finite number within the seat ceiling of ${MAX_HOOK_TIMEOUT_MS}ms (got ${describeSuppliedValue(rawDeadline)}) — the resume preflight falls back to its own ${RESUME_PREFLIGHT_DEFAULT_TIMEOUT_MS}ms default`), { phase: "config", sessionId: cp.sessionId });
55
+ runner.deps.onError?.(new Error(`RunnerDeps.resumePreflightTimeoutMs is not a positive finite number within the timer ceiling of ${MAX_TIMER_MS}ms (got ${describeSuppliedValue(rawDeadline)}) — the resume preflight falls back to its own ${RESUME_PREFLIGHT_DEFAULT_TIMEOUT_MS}ms default`), { phase: "config", sessionId: cp.sessionId });
22
56
  }
23
57
  catch {
24
58
  }
@@ -35,19 +69,7 @@ export async function resumePreflight(input) {
35
69
  const refusalTail = "; the checkpoint stays pending and the same token is redeemable once the obstacle clears";
36
70
  let verdict;
37
71
  try {
38
- const seat = await runHookSeat("resumePreflight", {
39
- timeoutMs: preflightTimeoutMs,
40
- ...(resumeSignal !== undefined ? { signal: resumeSignal } : {}),
41
- abortEnds: true,
42
- onBadTimeout: (badErr) => {
43
- try {
44
- runner.deps.onError?.(asThrownError(badErr), { phase: "hook", sessionId: cp.sessionId });
45
- }
46
- catch {
47
- }
48
- },
49
- owner: runner.deps,
50
- }, (sig) => preflight(info, sig));
72
+ const seat = await boundedPreflight(preflightTimeoutMs, resumeSignal, (sig) => preflight(info, sig));
51
73
  if (seat.expired) {
52
74
  if (seat.cause === "aborted")
53
75
  throw new CheckpointError("checkpoint.resume_aborted", "the resume was aborted while the deployment's resumePreflight was still screening it — the checkpoint stays pending and is resumable with a live signal");
@@ -1,11 +1,13 @@
1
- import { assertNoRetiredKeys, assertNoRetiredToolPolicyKeys } from "../retired-keys.js";
1
+ import { assertNoRetiredKeys, assertNoRetiredToolPolicyKeys, RETIRED_HOOKS_REPLACEMENT } from "../retired-keys.js";
2
2
  import { assertCallerPoliciesCurrent, callerPolicySeats } from "../locked-config.js";
3
3
  const RETIRED_RUNNER_DEPS_KEYS = {
4
+ hooks: RETIRED_HOOKS_REPLACEMENT,
4
5
  legacyRewindBoundaryProbe: "the rewind refusal always names both possibilities (never existed / retired whole-tree era); a deployment that holds that era's table answers the question on its own surface",
5
6
  peerAdmission: "the peer lane's knob table is `RunnerDeps.peerLane` (the same fields: admission gate, delivery budgets, listing window)",
6
7
  builtinWorkflows: "the engine ships no built-in named workflows — the Workflow tool's `{name}` resolves only `RunnerDeps.workflowScriptStore`; register any named workflow there",
7
8
  graderEnvFactory: "the grader env reaches the repair loop as `RepairLoopConfig.graderEnv`, minted by the trusted control plane (`assertOracleIsolation` / `GraderEnv` unchanged)",
8
9
  "hands.readCyberReminder": "a Read result carries only the reminders about that read (an empty file, an offset past the end, a file already in context) — no standing content-safety tail, so there is nothing to switch; a deployment that wants that sentence states it in its own `appendSystemPrompt`",
10
+ promptProvider: "a deployment changes prompt text through overlays: register a `prompt.compose` handler on `RunnerDeps.mods` answering `{ overlays }` (role base `replace`, a brand line `add` to the role band, a behavior or scenario `add`, a core-behavior `replace` / `append` / `drop`), choose the role base per task with `TaskSpec.promptRole`, and dispose of an MCP server's instructions with a `prompt.section` registration answering `{ text }` / `{ text: null }`",
9
11
  memorySessionIncarnation: "the occupant behind a session id is a cell of the session row now — `SessionMetadata.incarnation` on the metadata `Session.getMetadata()` returns (forks also `forkedFromIncarnation`), with `SessionStore.incarnationOf` for by-id readers; put the token the old seat answered on your sessions instead. A deployment that drops the seat without surfacing the cell loses the axis: records bind by session id alone",
10
12
  };
11
13
  export function assertNoRetiredRunnerDeps(deps) {
@@ -18,12 +18,13 @@ export interface RunBrainSinksInput {
18
18
  };
19
19
  /** borrowed-readonly — the reasoning lane's wire-facts consumer, the third sink the composition installs. */
20
20
  observeReasoningWireFacts: (facts: ReasoningWireFacts) => void;
21
- /** borrowed-readonly — the notice sink and the leg's ids; the fourth sink's announcer is minted from them. */
21
+ /** borrowed-readonly — the notice sink and the leg's ids; the fourth and fifth sinks' announcers are minted from them. */
22
22
  notice: ExtraBodyDroppedSeatInput;
23
23
  }
24
24
  export interface RunBrainSinksResult {
25
25
  /** Compose the three brain ALS sinks around a brain-driving call. */
26
26
  withBrainSinks: <T>(fn: () => Promise<T>) => Promise<T>;
27
- withExtraBodyDroppedSink: <T>(fn: () => Promise<T>) => Promise<T>;
27
+ /** Compose the two leg-wide request sinks (the extraBody strip, the credential-origin refusal) around the whole leg. */
28
+ withLegRequestSinks: <T>(fn: () => Promise<T>) => Promise<T>;
28
29
  }
29
30
  export declare function runBrainSinks(input: RunBrainSinksInput): RunBrainSinksResult;
@@ -1,5 +1,6 @@
1
1
  import { runWithBrainTelemetry, runWithReasoningWireFacts, runWithStatusSink } from "../../brain/status-sink.js";
2
2
  import { createExtraBodyDroppedScope } from "./extra-body-dropped-seat.js";
3
+ import { createCredentialOriginRefusalScope } from "./credential-origin-seat.js";
3
4
  import { createSafeNotifier, observeThenableRejection } from "../safe-notify.js";
4
5
  import { emitTrace } from "../trace.js";
5
6
  export function runBrainSinks(input) {
@@ -60,5 +61,8 @@ export function runBrainSinks(input) {
60
61
  : { kind: "vision.placeholder", version: 1, taskId: rs.telemetry.taskId, count: t.count, ts: Date.now() });
61
62
  };
62
63
  const withBrainSinks = (fn) => runWithStatusSink(statusEmit, () => runWithBrainTelemetry(telemetryEmit, () => runWithReasoningWireFacts(observeReasoningWireFacts, fn)));
63
- return { withBrainSinks, withExtraBodyDroppedSink: createExtraBodyDroppedScope(notice) };
64
+ const withExtraBodyDropped = createExtraBodyDroppedScope(notice);
65
+ const withCredentialOriginRefusals = createCredentialOriginRefusalScope(notice);
66
+ const withLegRequestSinks = (fn) => withExtraBodyDropped(() => withCredentialOriginRefusals(fn));
67
+ return { withBrainSinks, withLegRequestSinks };
64
68
  }
@@ -1,9 +1,10 @@
1
1
  import type { Model } from "../../internal/llm.js";
2
2
  import { type MaybeCompactOptions } from "../auto-compaction.js";
3
3
  import { type ModelPricing } from "../pricing.js";
4
- import type { Brain, TaskSpec } from "../types.js";
4
+ import type { Brain, RunnerDeps, TaskSpec } from "../types.js";
5
5
  import type { Stats } from "./assemble-result.js";
6
6
  import type { Prepared, RunnerDepsSeat, RunState } from "./contracts.js";
7
+ import { type SideCallBook } from "./side-call-account.js";
7
8
  export interface RunCompactionMachineryInput {
8
9
  /** borrowed-readonly — the task spec: the compaction settings. */
9
10
  spec: TaskSpec;
@@ -17,6 +18,8 @@ export interface RunCompactionMachineryInput {
17
18
  stats: Stats;
18
19
  /** borrowed-readonly — the telemetry lane's price-table door, consulted for every summarizer table adopted. */
19
20
  noteUnevaluablePriceTable: (p: ModelPricing) => void;
21
+ /** borrowed-readonly — the deployment's model catalog: where a degraded side-call reply's serving model is looked up. */
22
+ modelCatalog: RunnerDeps["models"];
20
23
  /** borrowed-readonly — the Runner's deployment deps, read LIVE (`brain`, `pricing`, `onError`). */
21
24
  runner: RunnerDepsSeat;
22
25
  }
@@ -33,5 +36,8 @@ export interface RunCompactionMachineryResult {
33
36
  };
34
37
  /** The window-safety wiring (per call — a mid-task degrade moves the fallback target). */
35
38
  windowSafetyOptions: (mainModel: Model) => Pick<MaybeCompactOptions, "fallbackBudget" | "onWindowSafety">;
39
+ /** The leg's one door onto the run's usage account (the same function `Prepared.sideCallBookRef.book` holds): every
40
+ * model call made beside the main loop is booked through it, once, with its lane. */
41
+ bookSideCall: SideCallBook;
36
42
  }
37
43
  export declare function runCompactionMachinery(input: RunCompactionMachineryInput): RunCompactionMachineryResult;
@@ -2,47 +2,21 @@ import { DEFAULT_COMPACTION_SETTINGS } from "../../internal/harness.js";
2
2
  import { resolveTriggerWindow } from "../context-edit.js";
3
3
  import { compactionEnabled, contextOverlayFor } from "../context-settings.js";
4
4
  import { sanitizeCompactionSettings } from "../auto-compaction.js";
5
- import { isModelPriced, modelCostToPricing } from "../pricing.js";
5
+ import { modelCostToPricing } from "../pricing.js";
6
6
  import { emitTrace } from "../trace.js";
7
7
  import { runWithReasoningWireFacts, runWithStatusSink } from "../../brain/status-sink.js";
8
- import { cacheFamilyOf, usageCostMicroUsd } from "./usage-accounting.js";
8
+ import { sideCallBookOf } from "./side-call-account.js";
9
9
  export function runCompactionMachinery(input) {
10
- const { spec, prepared, rs, stats, noteUnevaluablePriceTable, runner } = input;
11
- const recordCompactionUsage = (m, msg) => {
12
- const u = msg?.usage;
13
- if (!u)
14
- return;
15
- if (msg.usageMissing === true)
16
- stats.usageMissing = true;
17
- const fam = cacheFamilyOf(m);
18
- const price = runner.deps.pricing?.[m.id] ?? modelCostToPricing(m.cost);
19
- const priced = isModelPriced(m, runner.deps.pricing);
20
- if (!priced)
21
- rs.telemetry.unpricedSpend = true;
22
- noteUnevaluablePriceTable(price);
23
- const { totalInputTokens, uncachedInputTokens, costMicroUsd } = usageCostMicroUsd(fam, u, price);
24
- stats.tokens += u.totalTokens || 0;
25
- stats.promptTokens += uncachedInputTokens;
26
- stats.totalInputTokens += totalInputTokens;
27
- stats.cachedTokens += u.cacheRead || 0;
28
- stats.cacheWriteTokens += u.cacheWrite || 0;
29
- stats.outputTokens += u.output || 0;
30
- stats.costMicroUsd += costMicroUsd;
31
- stats.compactionMicroUsd = (stats.compactionMicroUsd ?? 0) + costMicroUsd;
32
- emitTrace(rs.telemetry.tracer, () => ({
33
- kind: "brain.call", version: 1, taskId: rs.telemetry.taskId, model: m.id, provider: m.provider,
34
- promptTokens: uncachedInputTokens, totalInputTokens, completionTokens: u.output || 0,
35
- cacheRead: u.cacheRead || 0, cacheWrite: u.cacheWrite || 0,
36
- latencyMs: 0, ...(priced ? { costMicroUsd } : {}), ...(typeof msg?.stopReason === "string" ? { stopReason: msg.stopReason } : {}), ts: Date.now(),
37
- }));
38
- };
10
+ const { spec, prepared, rs, stats, noteUnevaluablePriceTable, modelCatalog, runner } = input;
11
+ const bookSideCall = sideCallBookOf(stats, { telemetry: rs.telemetry, pricing: () => runner.deps.pricing, noteUnevaluablePriceTable, catalog: modelCatalog });
12
+ prepared.sideCallBookRef.book = bookSideCall;
39
13
  const compactionBrain = {
40
14
  stream: runner.deps.brain.stream,
41
15
  complete: async (m, c, o) => {
42
16
  const msg = await runWithStatusSink(() => { }, async () => await runWithReasoningWireFacts(() => { }, async () => runner.deps.brain.complete
43
17
  ? await runner.deps.brain.complete(m, c, o)
44
18
  : await (await Promise.resolve(runner.deps.brain.stream(m, c, o))).result()));
45
- recordCompactionUsage(m, msg);
19
+ bookSideCall("compaction", m, msg);
46
20
  return msg;
47
21
  },
48
22
  };
@@ -98,5 +72,5 @@ export function runCompactionMachinery(input) {
98
72
  }
99
73
  },
100
74
  });
101
- return { compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions };
75
+ return { compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions, bookSideCall };
102
76
  }
@@ -11,6 +11,7 @@ import { advanceCadenceClock, reduceToolEnd } from "./turn-attachments.js";
11
11
  import { gatedCallIdOf } from "./park-commit.js";
12
12
  import { hasVerifiableStructureSignal } from "./grounding-signal.js";
13
13
  import { announceToolCall, batchResponseDigest, emitSettled } from "./tool-end-body.js";
14
+ import { stampRowNotExecuted } from "./tool-not-executed.js";
14
15
  import { createResponseModelSeat } from "./response-model-seat.js";
15
16
  import { createToolCallIdFoldSeat } from "./tool-call-id-fold-seat.js";
16
17
  import { createFinishReasonSeat } from "./finish-reason-seat.js";
@@ -23,7 +24,7 @@ export function createHarnessHandlers(input) {
23
24
  const toolCallIdFoldSeat = createToolCallIdFoldSeat(deps.runnerHooks.onNotice, { sessionId: prepared.sessionId, runId: prepared.runId });
24
25
  const toolTurnIncompleteSeat = createToolTurnIncompleteSeat(deps.runnerHooks.onNotice, { sessionId: prepared.sessionId, runId: prepared.runId });
25
26
  const finishReasonSeat = createFinishReasonSeat(deps.runnerHooks.onNotice, { sessionId: prepared.sessionId, runId: prepared.runId });
26
- const { spec, queue, internals, ident, pushContent, emitCommitted, startedToolCallIds, toolStartAt, toolProgress, writeFamilyOf, toolLabels, postToolBatchHook, batchArgs, internalsNotifier, mediaByteCapBytes } = deps;
27
+ const { spec, queue, internals, ident, pushContent, emitCommitted, startedToolCallIds, toolStartAt, toolProgress, writeFamilyOf, toolLabels, postToolBatchArmed, batchArgs, internalsNotifier, mediaByteCapBytes } = deps;
27
28
  const frames = { push: (f) => pushContent({ ...f, ...ident() }), structured: prepared.structuredProjector, mediaByteCapBytes };
28
29
  const startOf = (e) => {
29
30
  const label = toolLabels.get(e.toolName);
@@ -235,7 +236,7 @@ export function createHarnessHandlers(input) {
235
236
  if (det !== undefined)
236
237
  reduceToolEnd(rs.attach.attachState, det);
237
238
  }
238
- if (postToolBatchHook !== undefined) {
239
+ if (postToolBatchArmed) {
239
240
  if (prepared.blockedToolCalls.delete(event.toolCallId) || event.notExecuted === true) {
240
241
  batchArgs?.delete(event.toolCallId);
241
242
  }
@@ -266,6 +267,7 @@ export function createHarnessHandlers(input) {
266
267
  ...(event.notExecuted === true ? { notExecuted: true } : {}),
267
268
  ...(() => { const id = prepared.abortController.signal.aborted ? gatedCallIdOf(prepared) : undefined; return id !== undefined ? { gatedCallIdOfRun: id } : {}; })(),
268
269
  }, frames);
270
+ stampRowNotExecuted(event.result, settled.notExecuted === true);
269
271
  emitTrace(rs.telemetry.tracer, () => ({
270
272
  kind: "tool.call",
271
273
  version: 1,
@@ -4,6 +4,7 @@ import { type NotificationInjectionOutcome, type PendingSessionNotifications, ty
4
4
  import type { PushQueue } from "../push-queue.js";
5
5
  import type { TaskEvent, TaskSpec } from "../types.js";
6
6
  import type { Stats } from "./assemble-result.js";
7
+ import { type CallerStopGate } from "./caller-stop-gate.js";
7
8
  import type { CaptureOptOutRef, LiveHandle, ManualCompactRef, McpRedialRef, NotificationLaneBindings, NotifyRef, Prepared, RunInternals, RunnerDepsSeat, TaskIdRef } from "./contracts.js";
8
9
  export interface RunIdentityWiringInput {
9
10
  /** borrowed-readonly — the task spec: the task id and the memory / notification seats it names. */
@@ -60,11 +61,12 @@ export interface RunIdentityWiringResult {
60
61
  };
61
62
  /** The delegation-lifecycle emission closure both phases share (spawn here, terminal in the driver). */
62
63
  emitDelegationLifecycle: (event: import("../types.js").DelegationLifecycleEvent) => void;
63
- /** The loop-liveness latch and the two attribution seats (ended / userInterrupted / userHalted). */
64
+ /** The loop-liveness latch, the two attribution seats (ended / userInterrupted / userHalted) and the caller-stop gate. */
64
65
  loopLatch: {
65
66
  ended: boolean;
66
67
  userInterrupted: boolean;
67
68
  userHalted: boolean;
69
+ callerStop: CallerStopGate;
68
70
  };
69
71
  /** This leg's usage counters, zeroed here; the harness-handlers lane is their writer from the first turn on. */
70
72
  stats: Stats;
@@ -7,6 +7,7 @@ import { discloseDroppedPending, renderTaskNotificationXml, taskNotificationDedu
7
7
  import { buildAppliedHumanInputEvent } from "../human-input-projection.js";
8
8
  import { announceAcceptance, nextHumanInputSeq } from "./steer-admission.js";
9
9
  import { deliverDelegationLifecycle, deliverEngineNotice, parentLegIds, undrainedUserInputNotices } from "../types.js";
10
+ import { mintCallerStopGate } from "./caller-stop-gate.js";
10
11
  export function runIdentityWiring(input) {
11
12
  const { spec, queue, prepared, internals, taskIdRef, onReady, manualCompactRef, notifyRef, captureOptOutRef, mcpRedialRef, injectTaskNotification, deliveredAtTurnOpen, peerInboundChainRef, notificationLane, pendingSessionNotifications, runner } = input;
12
13
  notificationLane.harness = prepared.harness;
@@ -126,8 +127,8 @@ export function runIdentityWiring(input) {
126
127
  }
127
128
  }
128
129
  }
129
- const loopLatch = { ended: false, userInterrupted: false, userHalted: false };
130
- onReady({ harness: prepared.harness, abortController: prepared.abortController, loop: loopLatch, reminderMark: prepared.reminderMark, sessionId: prepared.sessionId, runId: prepared.runId, hookTimeoutMs: prepared.hookTimeoutMs, hookIdentity: prepared.hookIdentity, permissionMode: prepared.permissionMode });
130
+ const loopLatch = { ended: false, userInterrupted: false, userHalted: false, callerStop: mintCallerStopGate(spec.signal) };
131
+ onReady({ harness: prepared.harness, abortController: prepared.abortController, loop: loopLatch, reminderMark: prepared.reminderMark, sessionId: prepared.sessionId, runId: prepared.runId, hookIdentity: prepared.hookIdentity, modBus: prepared.modBus, permissionMode: prepared.permissionMode });
131
132
  const stats = { turns: 0, tokens: 0, toolCalls: 0, promptTokens: 0, totalInputTokens: 0, cachedTokens: 0, cacheWriteTokens: 0, cacheWriteTokensLong: 0, outputTokens: 0, costMicroUsd: 0 };
132
133
  return { runSourceTaskId, parentToolCallId, ident, emitDelegationLifecycle, loopLatch, stats, internalsNotifier, undrainedUserAtEnd: { get current() { return undrainedUserAtEnd; } }, userInputLostAtEnd: { get current() { return userInputLostAtEnd; } } };
133
134
  }