@sema-agent/core 7.55.0 → 7.57.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 (502) hide show
  1. package/CHANGELOG.md +1054 -0
  2. package/LICENSE +1 -1
  3. package/dist/agents/cascade.js +1 -1
  4. package/dist/agents/cc-peer-directory.js +1 -0
  5. package/dist/agents/child-model-seat.d.ts +0 -11
  6. package/dist/agents/child-model-seat.js +0 -3
  7. package/dist/agents/list-agents-tool.d.ts +3 -1
  8. package/dist/agents/list-agents-tool.js +7 -7
  9. package/dist/agents/org-delivery-gate.js +3 -4
  10. package/dist/agents/peer-directory.d.ts +22 -4
  11. package/dist/agents/peer-directory.js +24 -2
  12. package/dist/agents/peer-held-queue.d.ts +69 -49
  13. package/dist/agents/peer-held-queue.js +255 -106
  14. package/dist/agents/peer-session-drain.js +65 -45
  15. package/dist/agents/repair-loop.js +2 -2
  16. package/dist/agents/send-message-tool.js +7 -6
  17. package/dist/agents/subagent.d.ts +6 -4
  18. package/dist/agents/subagent.js +72 -68
  19. package/dist/agents/tool-filter.d.ts +7 -5
  20. package/dist/agents/tool-filter.js +12 -9
  21. package/dist/agents/verify.d.ts +3 -2
  22. package/dist/agents/verify.js +3 -3
  23. package/dist/brain/anthropic.js +45 -80
  24. package/dist/brain/media-degrade.d.ts +18 -7
  25. package/dist/brain/media-degrade.js +13 -2
  26. package/dist/brain/model-capability.d.ts +37 -0
  27. package/dist/brain/model-capability.js +34 -0
  28. package/dist/brain/model-presets.d.ts +2 -8
  29. package/dist/brain/model-presets.js +1 -6
  30. package/dist/brain/open-responses.js +23 -34
  31. package/dist/brain/openai.js +25 -96
  32. package/dist/brain/provider-dialect.d.ts +3 -2
  33. package/dist/brain/provider-dialect.js +2 -2
  34. package/dist/brain/reasoning-request.d.ts +96 -0
  35. package/dist/brain/reasoning-request.js +174 -0
  36. package/dist/brain/reasoning.d.ts +11 -11
  37. package/dist/brain/reasoning.js +4 -3
  38. package/dist/brain/request-params.d.ts +13 -4
  39. package/dist/brain/request-params.js +21 -5
  40. package/dist/brain/status-sink.d.ts +20 -0
  41. package/dist/brain/status-sink.js +7 -0
  42. package/dist/brain/stream-engine.d.ts +9 -0
  43. package/dist/brain/stream-engine.js +24 -10
  44. package/dist/brain/stream-shared.d.ts +5 -4
  45. package/dist/brain/stream-shared.js +4 -4
  46. package/dist/core/a2a.d.ts +2 -1
  47. package/dist/core/a2a.js +19 -13
  48. package/dist/core/agent-definition.d.ts +10 -0
  49. package/dist/core/allow-entry.d.ts +23 -23
  50. package/dist/core/allow-entry.js +42 -46
  51. package/dist/core/allow-rule-shadow.d.ts +3 -3
  52. package/dist/core/approval-object.d.ts +21 -5
  53. package/dist/core/approval-object.js +44 -17
  54. package/dist/core/ask-origin.d.ts +66 -20
  55. package/dist/core/ask-origin.js +63 -23
  56. package/dist/core/ask-question.d.ts +51 -8
  57. package/dist/core/ask-question.js +3 -4
  58. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  59. package/dist/core/ask-unresolvable-notice.js +16 -2
  60. package/dist/core/auto-compaction.d.ts +71 -6
  61. package/dist/core/auto-compaction.js +42 -26
  62. package/dist/core/background-agent-store.d.ts +6 -2
  63. package/dist/core/background-agent-store.js +1 -1
  64. package/dist/core/checkpoint-generation.d.ts +53 -0
  65. package/dist/core/checkpoint-generation.js +35 -0
  66. package/dist/core/checkpoint-queries.d.ts +180 -0
  67. package/dist/core/checkpoint-queries.js +272 -0
  68. package/dist/core/checkpoint-requirements.d.ts +19 -1
  69. package/dist/core/checkpoint-requirements.js +6 -0
  70. package/dist/core/checkpoint-store.d.ts +105 -53
  71. package/dist/core/checkpoint-store.js +43 -20
  72. package/dist/core/cross-boundary-taint.d.ts +6 -5
  73. package/dist/core/cross-boundary-taint.js +5 -5
  74. package/dist/core/decision-receipt.d.ts +37 -3
  75. package/dist/core/decision-receipt.js +17 -17
  76. package/dist/core/delegation-not-started.d.ts +6 -0
  77. package/dist/core/delegation-not-started.js +17 -0
  78. package/dist/core/engine-attestation.d.ts +93 -0
  79. package/dist/core/engine-attestation.js +70 -0
  80. package/dist/core/engine-capabilities.d.ts +4 -1
  81. package/dist/core/engine-capabilities.js +1 -1
  82. package/dist/core/engine-notice.d.ts +32 -12
  83. package/dist/core/engine-notice.js +6 -0
  84. package/dist/core/file-history-store.d.ts +104 -22
  85. package/dist/core/file-history-store.js +37 -19
  86. package/dist/core/gate-fold.d.ts +1 -1
  87. package/dist/core/gate-fold.js +22 -10
  88. package/dist/core/gate-lanes.js +73 -65
  89. package/dist/core/gate-outcome.d.ts +26 -5
  90. package/dist/core/gate-outcome.js +26 -0
  91. package/dist/core/governance-codes.d.ts +5 -1
  92. package/dist/core/governance-codes.js +6 -0
  93. package/dist/core/hooks.d.ts +19 -18
  94. package/dist/core/hooks.js +3 -1
  95. package/dist/core/host-floor.d.ts +128 -0
  96. package/dist/core/host-floor.js +206 -0
  97. package/dist/core/host-target.d.ts +38 -3
  98. package/dist/core/host-target.js +38 -5
  99. package/dist/core/mailbox-store.d.ts +62 -1
  100. package/dist/core/mailbox-store.js +59 -0
  101. package/dist/core/mcp-name-judge.d.ts +46 -0
  102. package/dist/core/mcp-name-judge.js +61 -0
  103. package/dist/core/mcp-probe.d.ts +1 -1
  104. package/dist/core/mcp-probe.js +2 -5
  105. package/dist/core/mcp.d.ts +5 -1
  106. package/dist/core/mcp.js +70 -64
  107. package/dist/core/memory-engine/consolidation-driver.js +4 -3
  108. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  109. package/dist/core/memory-engine/distiller.js +26 -17
  110. package/dist/core/memory-engine/engine.js +4 -4
  111. package/dist/core/memory-engine/layout.d.ts +60 -8
  112. package/dist/core/memory-engine/layout.js +70 -8
  113. package/dist/core/model-seat.d.ts +10 -3
  114. package/dist/core/mods/classic-events.d.ts +67 -0
  115. package/dist/core/mods/classic-events.js +1 -0
  116. package/dist/core/mods/dollar.d.ts +13 -0
  117. package/dist/core/mods/extension-call.d.ts +31 -0
  118. package/dist/core/mods/extension-call.js +43 -0
  119. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  120. package/dist/core/mods/kernel/dispatch.js +140 -69
  121. package/dist/core/mods/kernel/events.d.ts +47 -11
  122. package/dist/core/mods/kernel/events.js +66 -42
  123. package/dist/core/mods/kernel/index.d.ts +4 -4
  124. package/dist/core/mods/kernel/index.js +2 -2
  125. package/dist/core/mods/kernel/receive.d.ts +39 -5
  126. package/dist/core/mods/kernel/receive.js +290 -17
  127. package/dist/core/mods/kernel/registration.d.ts +33 -2
  128. package/dist/core/mods/kernel/registration.js +6 -7
  129. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  130. package/dist/core/mods/kernel/site-rules.js +24 -42
  131. package/dist/core/mods/spec-seats.d.ts +69 -0
  132. package/dist/core/mods/spec-seats.js +114 -0
  133. package/dist/core/mods/stations.d.ts +28 -8
  134. package/dist/core/mods/stations.js +29 -13
  135. package/dist/core/mods/tool-call.d.ts +79 -0
  136. package/dist/core/mods/tool-call.js +152 -0
  137. package/dist/core/namespaced-rule-name.d.ts +32 -38
  138. package/dist/core/namespaced-rule-name.js +29 -36
  139. package/dist/core/parent-spec-seat.d.ts +6 -1
  140. package/dist/core/parent-spec-seat.js +2 -0
  141. package/dist/core/park-selfcheck.js +3 -0
  142. package/dist/core/permission-rule-consent.d.ts +24 -3
  143. package/dist/core/permission-rule-consent.js +136 -41
  144. package/dist/core/permission-rule-model.d.ts +57 -5
  145. package/dist/core/permission-rule-model.js +90 -31
  146. package/dist/core/permission-rule-org.d.ts +6 -2
  147. package/dist/core/permission-rule-org.js +8 -4
  148. package/dist/core/permission-rule-provider.d.ts +5 -2
  149. package/dist/core/permission-rule-provider.js +41 -11
  150. package/dist/core/permission-rule-store.d.ts +3 -2
  151. package/dist/core/permission-rule-store.js +11 -2
  152. package/dist/core/permission-rule-sync.js +3 -2
  153. package/dist/core/permission-rule-syntax.d.ts +5 -4
  154. package/dist/core/permission-rule-syntax.js +2 -2
  155. package/dist/core/permission-rules.d.ts +4 -4
  156. package/dist/core/permission-rules.js +11 -20
  157. package/dist/core/persisted-rule-arms.d.ts +2 -2
  158. package/dist/core/persisted-rule-arms.js +10 -12
  159. package/dist/core/principal-name.d.ts +20 -0
  160. package/dist/core/principal-name.js +22 -0
  161. package/dist/core/prompt-section-seat.js +4 -6
  162. package/dist/core/protocol-http-auth.d.ts +40 -5
  163. package/dist/core/protocol-http-auth.js +168 -4
  164. package/dist/core/protocol-naming.d.ts +20 -0
  165. package/dist/core/protocol-naming.js +20 -3
  166. package/dist/core/read-only-shell.d.ts +20 -5
  167. package/dist/core/read-only-shell.js +29 -14
  168. package/dist/core/remote-env.d.ts +37 -1
  169. package/dist/core/remote-env.js +11 -0
  170. package/dist/core/resume-startup-cause.d.ts +24 -2
  171. package/dist/core/resume-startup-cause.js +20 -1
  172. package/dist/core/retired-keys.d.ts +16 -0
  173. package/dist/core/retired-keys.js +16 -4
  174. package/dist/core/rewrite-rejudge.d.ts +60 -0
  175. package/dist/core/rewrite-rejudge.js +36 -0
  176. package/dist/core/roles.d.ts +28 -1
  177. package/dist/core/roles.js +81 -26
  178. package/dist/core/rule-lane-reads.d.ts +20 -15
  179. package/dist/core/rule-lane-reads.js +45 -17
  180. package/dist/core/rule-owner.d.ts +3 -3
  181. package/dist/core/rule-owner.js +3 -2
  182. package/dist/core/runner/announce-once-ledger.d.ts +14 -0
  183. package/dist/core/runner/announce-once-ledger.js +5 -0
  184. package/dist/core/runner/assemble-result.d.ts +1 -0
  185. package/dist/core/runner/assemble-result.js +1 -1
  186. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  187. package/dist/core/runner/caller-roster.d.ts +16 -4
  188. package/dist/core/runner/caller-roster.js +33 -6
  189. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  190. package/dist/core/runner/capability-withheld-seat.js +24 -0
  191. package/dist/core/runner/classifier-ladder.d.ts +7 -9
  192. package/dist/core/runner/classifier-ladder.js +3 -3
  193. package/dist/core/runner/compact-session.d.ts +10 -0
  194. package/dist/core/runner/compact-session.js +202 -0
  195. package/dist/core/runner/compaction-call-options.d.ts +2 -2
  196. package/dist/core/runner/compaction-seams.d.ts +21 -1
  197. package/dist/core/runner/compaction-seams.js +11 -8
  198. package/dist/core/runner/construction-doors.js +3 -0
  199. package/dist/core/runner/contracts.d.ts +50 -40
  200. package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
  201. package/dist/core/runner/cross-boundary-lane.js +40 -27
  202. package/dist/core/runner/denial-limit-arms.d.ts +2 -2
  203. package/dist/core/runner/denial-limit-arms.js +1 -1
  204. package/dist/core/runner/derived-route-fallback.d.ts +13 -0
  205. package/dist/core/runner/derived-route-fallback.js +6 -0
  206. package/dist/core/runner/env-capability-census.d.ts +3 -2
  207. package/dist/core/runner/env-capability-census.js +9 -3
  208. package/dist/core/runner/file-history-request.d.ts +18 -0
  209. package/dist/core/runner/file-history-request.js +21 -13
  210. package/dist/core/runner/file-history-restore.d.ts +45 -0
  211. package/dist/core/runner/file-history-restore.js +46 -0
  212. package/dist/core/runner/gate-exit.d.ts +3 -3
  213. package/dist/core/runner/gate-exit.js +4 -3
  214. package/dist/core/runner/image.d.ts +7 -17
  215. package/dist/core/runner/image.js +9 -60
  216. package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
  217. package/dist/core/runner/permission-rule-lanes.js +39 -17
  218. package/dist/core/runner/person-path-rows.d.ts +12 -9
  219. package/dist/core/runner/person-path-rows.js +18 -7
  220. package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
  221. package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
  222. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  223. package/dist/core/runner/prepare-ask-lane.js +5 -2
  224. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  225. package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
  226. package/dist/core/runner/prepare-config-doors.d.ts +35 -38
  227. package/dist/core/runner/prepare-config-doors.js +46 -28
  228. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  229. package/dist/core/runner/prepare-defer-classify.js +7 -8
  230. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  231. package/dist/core/runner/prepare-file-history.js +7 -39
  232. package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
  233. package/dist/core/runner/prepare-gate-stations.js +10 -1
  234. package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
  235. package/dist/core/runner/prepare-hands-readface.js +17 -14
  236. package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
  237. package/dist/core/runner/prepare-inherited-gate.js +5 -3
  238. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  239. package/dist/core/runner/prepare-park-ask.d.ts +2 -0
  240. package/dist/core/runner/prepare-park-ask.js +7 -7
  241. package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
  242. package/dist/core/runner/prepare-policy-chain.js +67 -76
  243. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  244. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  245. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  246. package/dist/core/runner/prepare-prompt-inputs.js +3 -5
  247. package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
  248. package/dist/core/runner/prepare-protocol-tools.js +3 -3
  249. package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
  250. package/dist/core/runner/prepare-safety-scan.js +0 -17
  251. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  252. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  253. package/dist/core/runner/prepare-task.d.ts +5 -2
  254. package/dist/core/runner/prepare-task.js +48 -43
  255. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
  256. package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
  257. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  258. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  259. package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
  260. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  261. package/dist/core/runner/resume-admission.js +1 -1
  262. package/dist/core/runner/resume-apply.js +11 -12
  263. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  264. package/dist/core/runner/resume-claim.d.ts +4 -2
  265. package/dist/core/runner/resume-claim.js +15 -8
  266. package/dist/core/runner/retired-runner-deps.js +1 -0
  267. package/dist/core/runner/rewind-files.d.ts +12 -0
  268. package/dist/core/runner/rewind-files.js +90 -0
  269. package/dist/core/runner/run-attachment-seats.js +2 -1
  270. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  271. package/dist/core/runner/run-brain-sinks.js +4 -2
  272. package/dist/core/runner/run-harness-handlers.js +12 -4
  273. package/dist/core/runner/run-leg.d.ts +1 -1
  274. package/dist/core/runner/run-leg.js +40 -39
  275. package/dist/core/runner/run-notification-lane.d.ts +2 -0
  276. package/dist/core/runner/run-notification-lane.js +2 -2
  277. package/dist/core/runner/run-recovery-lanes.js +3 -4
  278. package/dist/core/runner/run-settle-and-teardown.js +7 -12
  279. package/dist/core/runner/run-terminal-adoption.js +3 -4
  280. package/dist/core/runner/run-turn-boundary.js +4 -15
  281. package/dist/core/runner/runtask.d.ts +10 -0
  282. package/dist/core/runner/runtask.js +35 -42
  283. package/dist/core/runner/send-message-continuation.js +1 -1
  284. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  285. package/dist/core/runner/session-read-file-states.js +28 -0
  286. package/dist/core/runner/session-rule-policy.js +4 -3
  287. package/dist/core/runner/session-verb-doors.d.ts +28 -0
  288. package/dist/core/runner/session-verb-doors.js +48 -0
  289. package/dist/core/runner/session-write-ledger.d.ts +30 -0
  290. package/dist/core/runner/session-write-ledger.js +101 -0
  291. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  292. package/dist/core/runner/shell-env-withheld.js +51 -0
  293. package/dist/core/runner/skills-seat.js +6 -2
  294. package/dist/core/runner/stream-settle-backstop.js +12 -15
  295. package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
  296. package/dist/core/runner/sub-agent-deny-lists.js +25 -17
  297. package/dist/core/runner/synthetic-tools.d.ts +6 -0
  298. package/dist/core/runner/synthetic-tools.js +4 -1
  299. package/dist/core/runner/teardown-bounded.d.ts +1 -0
  300. package/dist/core/runner/teardown-bounded.js +1 -0
  301. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  302. package/dist/core/runner/tool-disclosure.js +1 -3
  303. package/dist/core/runner/tool-end-body.d.ts +1 -1
  304. package/dist/core/runner/tool-end-body.js +10 -9
  305. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  306. package/dist/core/runner/tool-not-executed.js +11 -0
  307. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  308. package/dist/core/runner/tool-occurrence.js +7 -0
  309. package/dist/core/runner/turn-attachments.d.ts +33 -15
  310. package/dist/core/runner/turn-attachments.js +62 -37
  311. package/dist/core/runner-deps.d.ts +7 -7
  312. package/dist/core/safety-axis-vocab.d.ts +6 -4
  313. package/dist/core/safety-axis-vocab.js +6 -5
  314. package/dist/core/safety-merge-corpus.js +11 -3
  315. package/dist/core/secret-env.d.ts +30 -3
  316. package/dist/core/secret-env.js +47 -8
  317. package/dist/core/select-model.js +3 -3
  318. package/dist/core/session-policy-store.d.ts +32 -15
  319. package/dist/core/session-policy-store.js +156 -36
  320. package/dist/core/session-store.d.ts +29 -10
  321. package/dist/core/session-store.js +51 -19
  322. package/dist/core/session.d.ts +82 -16
  323. package/dist/core/session.js +53 -0
  324. package/dist/core/shell-read-silence.d.ts +11 -12
  325. package/dist/core/shell-read-silence.js +9 -5
  326. package/dist/core/shell-run-candidates.js +3 -1
  327. package/dist/core/shell-wrapper-projection.d.ts +1 -1
  328. package/dist/core/shell-wrapper-projection.js +1 -1
  329. package/dist/core/shell-wrapper-table.d.ts +14 -7
  330. package/dist/core/shell-wrapper-table.js +5 -4
  331. package/dist/core/side-query.js +10 -1
  332. package/dist/core/skill-grant.d.ts +7 -2
  333. package/dist/core/skill-grant.js +5 -0
  334. package/dist/core/skills-directory.js +6 -2
  335. package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
  336. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  337. package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
  338. package/dist/core/store-contracts/file-history-store-contract.js +40 -1
  339. package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
  340. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  341. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  342. package/dist/core/store-contracts/session-repo-contract.js +51 -0
  343. package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
  344. package/dist/core/store-contracts/session-store-contract.js +150 -14
  345. package/dist/core/stub-env.d.ts +2 -0
  346. package/dist/core/stub-env.js +1 -0
  347. package/dist/core/synthetic-read-verdict.js +3 -3
  348. package/dist/core/task-event.d.ts +32 -4
  349. package/dist/core/task-notification.d.ts +16 -12
  350. package/dist/core/task-registry-agent.d.ts +8 -4
  351. package/dist/core/task-registry-agent.js +14 -8
  352. package/dist/core/task-registry-shared.d.ts +35 -6
  353. package/dist/core/task-registry-shared.js +11 -0
  354. package/dist/core/task-registry.d.ts +10 -1
  355. package/dist/core/task-registry.js +12 -2
  356. package/dist/core/task-result.d.ts +18 -0
  357. package/dist/core/task-spec.d.ts +18 -13
  358. package/dist/core/tighten-task-spec.js +2 -1
  359. package/dist/core/tool-catalog-entries.d.ts +23 -0
  360. package/dist/core/tool-catalog-entries.js +14 -2
  361. package/dist/core/tool-check-reading.d.ts +11 -0
  362. package/dist/core/tool-check-reading.js +11 -6
  363. package/dist/core/tool-model-gate.d.ts +2 -2
  364. package/dist/core/tool-name-aliases.d.ts +48 -18
  365. package/dist/core/tool-name-aliases.js +36 -19
  366. package/dist/core/tool-name-readings.d.ts +6 -32
  367. package/dist/core/tool-name-readings.js +2 -9
  368. package/dist/core/tool-policy.d.ts +78 -204
  369. package/dist/core/tool-policy.js +152 -204
  370. package/dist/core/tool-result-store.js +3 -0
  371. package/dist/core/tool-roster.d.ts +14 -19
  372. package/dist/core/tool-roster.js +11 -44
  373. package/dist/core/tool-spec-members.js +7 -2
  374. package/dist/core/tool-spec.d.ts +19 -11
  375. package/dist/core/tools.js +49 -9
  376. package/dist/core/trace.d.ts +6 -3
  377. package/dist/core/trace.js +2 -1
  378. package/dist/core/types.d.ts +1 -1
  379. package/dist/core/untrusted-egress.d.ts +20 -0
  380. package/dist/core/untrusted-egress.js +77 -3
  381. package/dist/core/user-attachment.d.ts +8 -1
  382. package/dist/core/user-attachment.js +64 -4
  383. package/dist/core/wiring-manifest.d.ts +9 -0
  384. package/dist/core/wiring-manifest.js +1 -0
  385. package/dist/core/workflow-journal-store.js +1 -1
  386. package/dist/engine/compaction/compaction.js +3 -2
  387. package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
  388. package/dist/engine/execution-env/node-execution-env.js +11 -2
  389. package/dist/engine/harness/agent-harness.d.ts +32 -6
  390. package/dist/engine/harness/agent-harness.js +65 -9
  391. package/dist/engine/harness/types.d.ts +29 -2
  392. package/dist/engine/llm/types.d.ts +28 -11
  393. package/dist/engine/loop/agent-loop.d.ts +23 -4
  394. package/dist/engine/loop/agent-loop.js +42 -30
  395. package/dist/engine/loop/types.d.ts +16 -6
  396. package/dist/engine/session/memory-repo.d.ts +9 -2
  397. package/dist/engine/session/memory-repo.js +11 -1
  398. package/dist/engine/session/repo-utils.d.ts +6 -5
  399. package/dist/engine/session/repo-utils.js +14 -6
  400. package/dist/index.d.ts +34 -17
  401. package/dist/index.js +22 -11
  402. package/dist/internal/harness-types.d.ts +1 -1
  403. package/dist/internal/harness.d.ts +2 -1
  404. package/dist/internal/harness.js +1 -0
  405. package/dist/internal/llm.d.ts +1 -1
  406. package/dist/orchestration/run-workflow-tool.d.ts +6 -4
  407. package/dist/orchestration/run-workflow-tool.js +5 -3
  408. package/dist/orchestration/workflow.d.ts +3 -0
  409. package/dist/orchestration/workflow.js +36 -18
  410. package/dist/primitives/credential-ref.d.ts +89 -0
  411. package/dist/primitives/credential-ref.js +125 -0
  412. package/dist/primitives/index.d.ts +2 -0
  413. package/dist/primitives/index.js +1 -0
  414. package/dist/prompt-assembly/artifact.d.ts +2 -2
  415. package/dist/prompt-assembly/artifact.js +5 -3
  416. package/dist/prompt-assembly/assemble.d.ts +3 -2
  417. package/dist/prompt-assembly/assemble.js +1 -1
  418. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  419. package/dist/prompt-assembly/catalog/schema.js +34 -2
  420. package/dist/prompt-assembly/catalog/sections.js +0 -1
  421. package/dist/prompt-assembly/composer.d.ts +3 -1
  422. package/dist/prompt-assembly/composer.js +1 -1
  423. package/dist/prompt-assembly/event-registry.js +1 -0
  424. package/dist/prompt-assembly/overlay.js +3 -3
  425. package/dist/prompt-assembly/renderers.d.ts +1 -1
  426. package/dist/prompt-assembly/renderers.js +0 -3
  427. package/dist/prompt-assembly/role-base.d.ts +15 -0
  428. package/dist/prompt-assembly/role-base.js +9 -0
  429. package/dist/prompt-assembly/select.d.ts +39 -14
  430. package/dist/prompt-assembly/select.js +47 -16
  431. package/dist/prompt-assembly/sugar.d.ts +17 -11
  432. package/dist/prompt-assembly/sugar.js +8 -3
  433. package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
  434. package/dist/prompt-assembly/tool-catalog.js +114 -4
  435. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  436. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  437. package/dist/prompt-assembly/types.d.ts +0 -7
  438. package/dist/scenarios/full-body.d.ts +11 -11
  439. package/dist/scenarios/full-body.js +4 -3
  440. package/dist/shell/lex.js +10 -1
  441. package/dist/stores/file/adoption/adopt.js +4 -3
  442. package/dist/stores/file/adoption/marker.js +3 -2
  443. package/dist/stores/file/checkpoint-store.d.ts +21 -4
  444. package/dist/stores/file/checkpoint-store.js +38 -7
  445. package/dist/stores/file/file-history-store.js +18 -11
  446. package/dist/stores/file/index.js +2 -1
  447. package/dist/stores/file/mailbox-store.d.ts +2 -1
  448. package/dist/stores/file/mailbox-store.js +26 -1
  449. package/dist/stores/file/permission-rule-adopt.js +4 -3
  450. package/dist/stores/file/permission-rule-store.js +11 -5
  451. package/dist/stores/file/session-store.d.ts +29 -6
  452. package/dist/stores/file/session-store.js +42 -50
  453. package/dist/tools/artifact/artifact-tool.js +3 -2
  454. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  455. package/dist/tools/fs/bash-program-position.js +56 -9
  456. package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
  457. package/dist/tools/fs/bash-readonly-classifier.js +5 -10
  458. package/dist/tools/fs/fs-bash.js +15 -8
  459. package/dist/tools/fs/fs-glob.d.ts +86 -0
  460. package/dist/tools/fs/fs-glob.js +226 -0
  461. package/dist/tools/fs/fs-read.js +14 -14
  462. package/dist/tools/fs/fs-search-tools.js +7 -7
  463. package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
  464. package/dist/tools/fs/pattern-kill-guard.js +429 -0
  465. package/dist/tools/fs/pdf.d.ts +9 -6
  466. package/dist/tools/fs/pdf.js +3 -3
  467. package/dist/tools/fs/program-read-model.d.ts +57 -7
  468. package/dist/tools/fs/program-read-model.js +11 -1
  469. package/dist/tools/fs/program-read-model.rows.js +78 -21
  470. package/dist/tools/fs/read-deny-home.js +3 -2
  471. package/dist/tools/fs/removal-targets.d.ts +17 -7
  472. package/dist/tools/fs/removal-targets.js +47 -20
  473. package/dist/tools/fs/search.d.ts +10 -0
  474. package/dist/tools/fs/search.js +20 -26
  475. package/dist/tools/fs/shell-read-argv.js +89 -12
  476. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  477. package/dist/tools/fs/shell-read-bindings.js +41 -0
  478. package/dist/tools/fs/shell-read-check.d.ts +10 -0
  479. package/dist/tools/fs/shell-read-check.js +13 -20
  480. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  481. package/dist/tools/fs/shell-read-environment.js +3 -2
  482. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  483. package/dist/tools/fs/shell-read-establish.js +19 -20
  484. package/dist/tools/fs/shell-read-identity.d.ts +12 -9
  485. package/dist/tools/fs/shell-read-identity.js +9 -4
  486. package/dist/tools/fs/shell-read-plan.js +24 -16
  487. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  488. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  489. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  490. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  491. package/dist/tools/fs/shell-reentry-text.js +40 -2
  492. package/dist/tools/todo.js +63 -63
  493. package/dist/tools/web.d.ts +19 -14
  494. package/dist/tools/web.js +46 -61
  495. package/package.json +1 -1
  496. package/test/export-surface.snapshot.json +221 -7
  497. package/wire-changes/core-stores-sql@7.57.0.json +29 -0
  498. package/wire-changes/core@7.56.0.json +3891 -0
  499. package/wire-changes/core@7.57.0.json +1487 -0
  500. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  501. package/wire-changes/mods-kernel@7.57.0.json +29 -0
  502. package/wire-changes/primitives@7.57.0.json +245 -0
@@ -1,15 +1,16 @@
1
1
  import { argsAsTheToolReads, withArgsReading } from "../effective-path-target.js";
2
+ import { outletAsk, readRejudge, rewriteChasedSentence, sameBytes } from "../rewrite-rejudge.js";
2
3
  import { policyAskClassOf } from "../ask-class.js";
3
- import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
4
+ import { ASK_USER_QUESTION_TOOL_NAME, isEngineQuestionFace } from "../ask-question.js";
4
5
  import { classifierUnavailableSeat } from "./classifier-ladder.js";
5
6
  import { resolveCheckpointStore } from "../checkpoint-store.js";
6
7
  import { chainJudges, inheritedToolChecks, screeningInstallationsOf, standsInFor } from "../mods/stations.js";
7
- import { isNamespacedCoveringRuleName, namespacedRuleNameCovers } from "../permission-rules.js";
8
+ import { isCoveringRuleName, ruleNameCovers } from "../namespaced-rule-name.js";
8
9
  import { isIsolated } from "../remote-env.js";
9
10
  import { deliverEngineNotice } from "../engine-notice.js";
10
11
  import { earlierGrammarNotice } from "../session-policy-store.js";
11
12
  import { attest, attestationOf, checkToolPolicyProjection, combinePolicies, createTranscriptIntegrityPolicy, createUnverifiableDeletePolicy, durableParkOptInDeclared, isLiveApproverSeat, mergeAttestation, refuseOutOfContractDecision, resolveAsk, toolPolicyNameSets, withAttestation, wrapToolPolicy } from "../tool-policy.js";
12
- import { judgeRuleToolName, mountedToolNames } from "../tool-name-aliases.js";
13
+ import { judgeRuleToolName, mountedToolNames, nearMissSpellingOf } from "../tool-name-aliases.js";
13
14
  import { approvalCardMemberOf } from "../tool-roster.js";
14
15
  import { NAMESPACED_NAME_SHAPES } from "../protocol-table.js";
15
16
  import { emitTrace } from "../trace.js";
@@ -17,7 +18,7 @@ import { skillGrantBindingMembers } from "../skill-grant.js";
17
18
  import { SKILL_TOOL_NAME } from "./synthetic-tools.js";
18
19
  import { delegationPoolReading } from "./sub-agent-deny-lists.js";
19
20
  import { valveLeaves } from "../../agents/tool-filter.js";
20
- import { autoStrippedRule, cardDisclosureOf, nearMissSpellingOf, rootFacingToolNames } from "../allow-entry.js";
21
+ import { autoStrippedRule, cardDisclosureOf, rootFacingToolNames } from "../allow-entry.js";
21
22
  import { arbitrateByMode, askClassMembersOf, askFaceOf, askMandateMember } from "../ask-origin.js";
22
23
  import { createModeGatePolicy, mountedToolDeclaresReadOnly } from "../mode-policy.js";
23
24
  const ancestorFacts = (ask) => ({ ...(ask ?? {}), ancestorResolved: true });
@@ -29,8 +30,9 @@ import { createPermissionRuleLanes, inheritedAskRuleEvidence, createRuleOffersOf
29
30
  import { createLiveSessionRules, createSessionRulePolicy } from "./session-rule-policy.js";
30
31
  import { policyThrowLine, reportPolicyThrow } from "./policy-throw.js";
31
32
  import { heldBy, heldValues, seatOf, wireOf } from "../tool-name-readings.js";
33
+ import { hostFloorPolicy } from "../host-floor.js";
32
34
  export async function preparePolicyChain(input) {
33
- const { spec, deps, internals, sessionId, runId, hostTaskId, taskRootFinal, additionalRootsCanonical, executionEnv, lockedPreflight, pathRuleAnchors, headLeads, tools, harnessTools, selector, toolEffects, egressTools, irreversibilityTier, axisExplicitNegatives, shellGatedTools, toolMarkSources, envHandToolNames, handsCwdRef, readDenyMatcher, personRows, questionToolMounted, runtimeCaps, inheritedAncestorRules, ancestorSessionRulesRef, inheritedParentConstraints, seedInheritedGate, skillGrants, skillSpecs, allowedToolTables, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, modBus, ownModChain, autoModeDecider, readFace, permissionMode, scratchpadDir, toolRosterDeltas, stopForDenialLimit, delegation, abortController, now, ownSessionRulesRef } = input;
35
+ const { spec, deps, internals, sessionId, runId, hostTaskId, taskRootFinal, additionalRootsCanonical, executionEnv, lockedPreflight, pathRuleAnchors, headLeads, tools, harnessTools, selector, toolEffects, egressTools, irreversibilityTier, axisExplicitNegatives, shellGatedTools, toolMarkSources, envHandToolNames, handsCwdRef, readDenyMatcher, personRows, questionToolMounted, runtimeCaps, inheritedAncestorRules, ancestorSessionRulesRef, inheritedParentConstraints, seedInheritedGate, skillGrants, skillSpecs, allowedToolTables, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, modBus, ownModChain, autoModeDecider, readFace, permissionMode, scratchpadDir, toolRosterDeltas, stopForDenialLimit, delegation, abortController, now, ownSessionRulesRef, hostFloor } = input;
34
36
  const ancestorArbitrations = new Map();
35
37
  const arbitrateInherited = (ask, toolCallId, judged) => {
36
38
  const verdict = arbitrateByMode(permissionMode.current, judged.classification, { origin: judged.origin, ...askMandateMember(ancestorFacts(judged.ask.action === "ask" ? judged.ask : undefined)) });
@@ -85,7 +87,7 @@ export async function preparePolicyChain(input) {
85
87
  }
86
88
  if (known.has(n))
87
89
  continue;
88
- if (isNamespacedCoveringRuleName(n, kind) && [...known].some((k) => namespacedRuleNameCovers(n, k)))
90
+ if (isCoveringRuleName(n, kind) && [...known].some((k) => ruleNameCovers(n, k)))
89
91
  continue;
90
92
  unmatched.add(`"${n}" (${kind})`);
91
93
  }
@@ -102,7 +104,7 @@ export async function preparePolicyChain(input) {
102
104
  }
103
105
  advisedPolicyNames.set(deps, advised);
104
106
  try {
105
- const e = new Error(`toolPolicy name audit: ${[...unmatched].join(", ")} match(es) no tool mounted this run (primary or alias) — the rule cannot fire here. Often a typo or a self-report/wire name skew (e.g. TodoWrite vs the mounted TaskCreate family; "*" has no wildcard meaning in a name-keyed policy). Advisory only: enforcement is unchanged, and a name can be legitimate for another scenario or a per-spawn tool.`);
107
+ const e = new Error(`toolPolicy name audit: ${[...unmatched].join(", ")} match(es) no tool mounted this run (primary or alias) — the rule cannot fire here. Often a typo or a self-report/wire name skew (e.g. TodoWrite vs the mounted TaskCreate family; a "*" on a deny or ask list reaches every name its pattern matches). Advisory only: enforcement is unchanged, and a name can be legitimate for another scenario or a per-spawn tool.`);
106
108
  e.code = "config.toolpolicy.unmatched_names";
107
109
  deps.onError?.(e, { phase: "config", sessionId });
108
110
  }
@@ -159,7 +161,7 @@ export async function preparePolicyChain(input) {
159
161
  .map((entry) => ({
160
162
  check: (creq) => checkToolPolicyProjection(entry, creq) ?? { action: "allow" },
161
163
  }));
162
- const narrowingLayers = [sessionRulePolicy, ...ancestorRulePolicies, ...frozenConstraintLayers].filter((p) => p !== undefined);
164
+ const narrowingLayers = [hostFloor !== undefined ? hostFloorPolicy(hostFloor) : undefined, sessionRulePolicy, ...ancestorRulePolicies, ...frozenConstraintLayers].filter((p) => p !== undefined);
163
165
  auditPolicyNames(sessionRulePolicy);
164
166
  for (const layer of ancestorRulePolicies)
165
167
  auditPolicyNames(layer, true);
@@ -169,6 +171,16 @@ export async function preparePolicyChain(input) {
169
171
  const sameInstanceAncestorCount = policy === undefined ? 0 : (inheritedParentConstraints ?? []).reduce((n, pc) => (pc.policy === policy ? n + 1 : n), 0);
170
172
  const sharedFirstDecision = new Map();
171
173
  const SHARED_FIRST_DECISION_CAP = 256;
174
+ const staleArbitrations = new Map();
175
+ const noteArbitration = (toolCallId, arbitrate, stale) => {
176
+ const rest = (staleArbitrations.get(toolCallId) ?? []).filter((a) => a !== arbitrate);
177
+ if (stale)
178
+ rest.push(arbitrate);
179
+ if (rest.length > 0)
180
+ staleArbitrations.set(toolCallId, rest);
181
+ else
182
+ staleArbitrations.delete(toolCallId);
183
+ };
172
184
  const inheritedUnavailableAsks = new Set();
173
185
  const INHERITED_UNAVAILABLE_CAP = 256;
174
186
  const markInheritedUnavailable = (toolCallId) => {
@@ -204,8 +216,6 @@ export async function preparePolicyChain(input) {
204
216
  const missing = [];
205
217
  if (store === undefined)
206
218
  missing.push("a wired CheckpointStore");
207
- else if (store.redecision?.reopen !== true)
208
- missing.push("a CheckpointStore that DECLARES redecision.reopen (declaration, never duck-typing)");
209
219
  if (spec.durableApproval === undefined && runtimeCaps?.forceDurableGate !== true)
210
220
  missing.push("a durable park (spec.durableApproval, or the forceDurableGate entitlement)");
211
221
  if (missing.length === 0)
@@ -229,7 +239,7 @@ export async function preparePolicyChain(input) {
229
239
  list.push({ cls, layer });
230
240
  foldAskClasses.set(toolCallId, list);
231
241
  };
232
- const isDelegatedQuestion = (creq) => wireOf("inherited.questionFloat", creq) === ASK_USER_QUESTION_TOOL_NAME;
242
+ const isDelegatedQuestion = (creq) => isEngineQuestionFace(creq.face);
233
243
  const sandboxBoundaryCapable = (call) => heldBy("gate.sandboxBoundary.egress", egressTools, call) || !envHandToolNames.has(wireOf("gate.sandboxBoundary.hand", call));
234
244
  const emitSandboxAdmitted = (info) => {
235
245
  emitTrace(deps.tracer, () => ({
@@ -255,8 +265,8 @@ export async function preparePolicyChain(input) {
255
265
  };
256
266
  const callerPolicyLayer = policy !== undefined && sameInstanceAncestorCount > 0
257
267
  ? wrapToolPolicy(policy, async (creq, csignal) => {
258
- const decision = refuseOutOfContractDecision(await policy.check(creq, csignal ?? abortController.signal));
259
- sharedFirstDecision.set(creq.toolCallId, decision);
268
+ const decision = refuseOutOfContractDecision(await policy.check(creq, csignal ?? abortController.signal), { call: creq });
269
+ sharedFirstDecision.set(creq.toolCallId, { decision, judged: creq.args });
260
270
  if (sharedFirstDecision.size > SHARED_FIRST_DECISION_CAP) {
261
271
  const oldest = sharedFirstDecision.keys().next().value;
262
272
  if (oldest !== undefined)
@@ -297,7 +307,7 @@ export async function preparePolicyChain(input) {
297
307
  const seat = seatMarksOf(call);
298
308
  const face = readFace();
299
309
  return {
300
- ...INHERITED_STATION_FACTS,
310
+ ...INHERITED_STATION_FACTS, call: { toolCallId: call.toolCallId, toolName: call.toolName },
301
311
  mandateMarks: { egress: seat.egress, shellGated: false, ...(seat.tier === "always" && !seat.shellGated ? { irreversibility: "always" } : {}) },
302
312
  ...(seat.sources.size > 0 ? { toolMarkSources: seat.sources } : {}),
303
313
  ...(deps.a2a?.isolatePeers === true ? { a2aIsolatePeers: true } : {}),
@@ -352,7 +362,7 @@ export async function preparePolicyChain(input) {
352
362
  }
353
363
  let re;
354
364
  try {
355
- re = refuseOutOfContractDecision(await pol.check(await withArgsReading(creq, editArgs, csignal ?? abortController.signal), csignal ?? abortController.signal));
365
+ re = refuseOutOfContractDecision(await pol.check(await withArgsReading(creq, editArgs, csignal ?? abortController.signal), csignal ?? abortController.signal), { call: creq });
356
366
  }
357
367
  catch (err) {
358
368
  reportPolicyThrow(notifyOwnHookCrash, "an inherited parent policy's re-check of the approved edit", creq, err, csignal ?? abortController.signal);
@@ -363,13 +373,16 @@ export async function preparePolicyChain(input) {
363
373
  }
364
374
  if (re.action === "deny")
365
375
  return vetoed(re);
366
- if (re.action === "allow") {
367
- const stated = re.updatedInput === undefined ? "mode" : re.decisionReason;
368
- return onApproval(withAttestation({ action: "allow", updatedInput: re.updatedInput !== undefined ? re.updatedInput : editArgs, ...(stated !== undefined ? { decisionReason: stated } : {}) }, re.attestation));
376
+ const read = readRejudge(creq, editArgs, re);
377
+ if (read.kind === "rewritten") {
378
+ editArgs = read.form;
379
+ const { updatedInput: _form, ...verdict } = re;
380
+ re = outletAsk(verdict, creq.toolName, editArgs);
369
381
  }
370
- if (re.updatedInput !== undefined)
371
- editArgs = argsAsTheToolReads(creq, re.updatedInput);
372
- const judged = await judgeInheritedClassifier({ liveMode: () => permissionMode.current, autoMode: ancestorAutoMode, ask: re, req: { ...creq, args: editArgs }, signal: csignal ?? abortController.signal, subject: "the approved edit", allowRewrite: editArgs, facts: inheritedStationFacts(creq), unavailableSeat: classifierUnavailableSeat({ station: "ancestor", ...(ancestorDecider?.timeoutMs !== undefined ? { budgetMs: ancestorDecider.timeoutMs } : {}), route: frozenApproverRoute(onAskOf), onNotice: deps.onNotice, sessionId, runId }) });
382
+ else if (re.action === "allow") {
383
+ return onApproval(withAttestation({ action: "allow", updatedInput: editArgs, decisionReason: "mode" }, re.attestation));
384
+ }
385
+ const judged = await judgeInheritedClassifier({ liveMode: () => permissionMode.current, autoMode: read.kind === "rewritten" ? undefined : ancestorAutoMode, ask: re, req: { ...creq, args: editArgs }, signal: csignal ?? abortController.signal, subject: "the approved edit", allowRewrite: editArgs, facts: inheritedStationFacts(creq), unavailableSeat: classifierUnavailableSeat({ station: "ancestor", ...(ancestorDecider?.timeoutMs !== undefined ? { budgetMs: ancestorDecider.timeoutMs } : {}), route: frozenApproverRoute(onAskOf), onNotice: deps.onNotice, sessionId, runId }) });
373
386
  if (judged.kind === "allow") {
374
387
  return onApproval(judged.result);
375
388
  }
@@ -378,7 +391,10 @@ export async function preparePolicyChain(input) {
378
391
  const { ask: editAsk } = judged;
379
392
  re = editAsk;
380
393
  const editArbitrated = arbitrateInherited(re, creq.toolCallId, judged);
381
- if (editArbitrated !== undefined) {
394
+ const outletReleased = read.kind === "rewritten" && editArbitrated?.action === "allow";
395
+ if (outletReleased)
396
+ ancestorArbitrations.delete(creq.toolCallId);
397
+ if (editArbitrated !== undefined && !outletReleased) {
382
398
  return onApproval(editArbitrated.action === "allow" ? { action: "allow", updatedInput: editArgs, decisionReason: "mode" } : editArbitrated);
383
399
  }
384
400
  const { resolved: rr, judged: settled } = await resolveInheritedAsk(judged, (j) => resolveAsk({
@@ -469,8 +485,14 @@ export async function preparePolicyChain(input) {
469
485
  ? { check: () => ({ action: "allow" }) }
470
486
  : policy !== undefined && pc.policy === policy
471
487
  ? {
472
- check: async (creq, csignal) => {
473
- const first = sharedFirstDecision.get(creq.toolCallId);
488
+ check: async function arbitrate(creq, csignal) {
489
+ const recorded = sharedFirstDecision.get(creq.toolCallId);
490
+ const first = recorded?.decision;
491
+ const stale = recorded !== undefined && !sameBytes(creq, recorded.decision.updatedInput !== undefined ? recorded.decision.updatedInput : recorded.judged, creq.args);
492
+ if (recorded !== undefined)
493
+ noteArbitration(creq.toolCallId, arbitrate, stale);
494
+ if (stale)
495
+ return { action: "allow" };
474
496
  if (first === undefined) {
475
497
  return {
476
498
  action: "deny",
@@ -546,7 +568,7 @@ export async function preparePolicyChain(input) {
546
568
  : wrapToolPolicy(pc.policy, async (creq, csignal) => {
547
569
  let decision;
548
570
  try {
549
- decision = refuseOutOfContractDecision(await pc.policy.check(creq, csignal ?? abortController.signal));
571
+ decision = refuseOutOfContractDecision(await pc.policy.check(creq, csignal ?? abortController.signal), { call: creq });
550
572
  }
551
573
  catch (err) {
552
574
  reportPolicyThrow(notifyOwnHookCrash, "an inherited parent policy", creq, err, csignal ?? abortController.signal);
@@ -575,88 +597,57 @@ export async function preparePolicyChain(input) {
575
597
  const settled = await settleInstallationAsk(pc, ask, creq, csignal);
576
598
  return settled.kind === "settled" ? settled.result : settled.resolved;
577
599
  });
578
- const rewriteCapableLayers = policy !== undefined || parentConstraintWrappers.length > 0;
579
- const rewriteEmitterIndex = new Map();
580
600
  const rewriteCapableChain = [
581
601
  ...(callerPolicyLayer !== undefined ? [callerPolicyLayer] : []),
582
602
  ...parentConstraintWrappers,
583
603
  ];
584
604
  const callerSlotOffset = callerPolicyLayer !== undefined ? 1 : 0;
585
- const sameInstanceAdapterIndices = new Set();
586
- (inheritedParentConstraints ?? []).forEach((pc, j) => {
587
- if (policy !== undefined && pc.policy === policy)
588
- sameInstanceAdapterIndices.add(j + callerSlotOffset);
589
- });
590
605
  const instrumentedChain = rewriteCapableChain.map((layer, idx) => wrapToolPolicy(layer, async (creq, csignal) => {
591
- const d = refuseOutOfContractDecision(await layer.check(creq, csignal));
592
- if (d.updatedInput !== undefined)
593
- rewriteEmitterIndex.set(creq.toolCallId, idx);
606
+ const d = refuseOutOfContractDecision(await layer.check(creq, csignal), { call: creq });
594
607
  if (d.action === "ask") {
595
608
  recordFoldAskClass(creq.toolCallId, idx < callerSlotOffset ? policyAskClassOf(policy) : "mandate", idx < callerSlotOffset ? "caller_policy" : "ancestor_constraint");
596
609
  }
597
610
  return d;
598
611
  }));
599
612
  const modeGateLayer = createModeGatePolicy(permissionMode, { env: executionEnv, rootPath: taskRootFinal, acceptDirs: [taskRootFinal, ...additionalRootsCanonical], roster: toolRosterDeltas, readOnlyDeclared: (name) => mountedToolDeclaresReadOnly(tools, name), ...(scratchpadDir !== undefined ? { exemptDirs: [scratchpadDir] } : {}) });
600
- const policyLayers = [
601
- ...narrowingLayers,
602
- ...instrumentedChain,
603
- ...(rewriteCapableLayers ? narrowingLayers : []),
604
- ];
613
+ const policyLayers = [...narrowingLayers, ...instrumentedChain, ...(rewriteCapableChain.length > 0 ? narrowingLayers : [])];
605
614
  const integrityGuardLayers = [createTranscriptIntegrityPolicy(), createUnverifiableDeletePolicy({ removalSeat: { env: executionEnv, additionalRoots: () => additionalRootsCanonical } })];
606
- const guardedPolicyLayers = rewriteCapableLayers
607
- ? [...integrityGuardLayers, ...policyLayers, modeGateLayer, ...integrityGuardLayers]
608
- : [...integrityGuardLayers, ...policyLayers, modeGateLayer];
615
+ const guardedPolicyLayers = [...integrityGuardLayers, ...policyLayers, modeGateLayer];
609
616
  const foldedPolicy = guardedPolicyLayers.length === 1 ? guardedPolicyLayers[0] : combinePolicies(...guardedPolicyLayers);
610
- const effectivePolicy = foldedPolicy !== undefined && rewriteCapableLayers
617
+ const effectivePolicy = foldedPolicy !== undefined && sameInstanceAncestorCount > 0
611
618
  ? wrapToolPolicy(foldedPolicy, async (req, signal) => {
612
619
  let decision;
620
+ let stale;
613
621
  try {
614
622
  decision = await foldedPolicy.check(req, signal);
615
623
  }
616
- catch (err) {
617
- rewriteEmitterIndex.delete(req.toolCallId);
618
- throw err;
624
+ finally {
625
+ stale = staleArbitrations.get(req.toolCallId) ?? [];
626
+ staleArbitrations.delete(req.toolCallId);
619
627
  }
620
- const emitterIdx = rewriteEmitterIndex.get(req.toolCallId);
621
- rewriteEmitterIndex.delete(req.toolCallId);
622
- if (decision.action === "deny" || decision.updatedInput === undefined)
628
+ if (decision.action === "deny" || stale.length === 0)
623
629
  return decision;
624
- const recheckPrefix = rewriteCapableChain.slice(0, emitterIdx ?? rewriteCapableChain.length);
625
- const postEmitterSameInstanceAdapters = [];
626
- if (emitterIdx !== undefined && emitterIdx > 0) {
627
- for (let i = emitterIdx + 1; i < rewriteCapableChain.length; i++) {
628
- if (sameInstanceAdapterIndices.has(i))
629
- postEmitterSameInstanceAdapters.push(rewriteCapableChain[i]);
630
- }
631
- }
632
- const recheckLayers = [...recheckPrefix, ...postEmitterSameInstanceAdapters];
633
- const finalReq = await withArgsReading(req, decision.updatedInput, signal);
630
+ const finalReq = decision.updatedInput !== undefined ? await withArgsReading(req, decision.updatedInput, signal) : req;
631
+ const carried = decision.updatedInput !== undefined ? { updatedInput: decision.updatedInput } : {};
634
632
  let asked;
635
633
  let revalidated;
636
634
  try {
637
- for (const layer of recheckLayers) {
638
- const d = refuseOutOfContractDecision(await layer.check(finalReq, signal));
639
- if (d.action === "deny") {
640
- return withAttestation({ ...d, updatedInput: decision.updatedInput }, mergeAttestation(req, attestationOf(decision, req), attestationOf(d, req), "answer"));
641
- }
642
- if (d.updatedInput !== undefined) {
643
- return {
644
- action: "deny",
645
- message: "policy required a rewrite during final-form re-check — the arguments that would execute were not accepted as-is (fail-closed; rewrite chains are not iterated to a fixpoint)",
646
- updatedInput: decision.updatedInput,
647
- };
648
- }
635
+ for (const arbitrate of stale) {
636
+ const d = refuseOutOfContractDecision(await arbitrate(finalReq, signal), { call: finalReq });
637
+ if (d.action === "deny")
638
+ return withAttestation({ ...d, ...carried }, mergeAttestation(req, attestationOf(decision, req), attestationOf(d, req), "answer"));
639
+ if (readRejudge(finalReq, finalReq.args, d).kind === "rewritten")
640
+ return { action: "deny", message: rewriteChasedSentence(req.toolName), ...carried };
649
641
  if (d.action === "ask" && asked === undefined)
650
642
  asked = d;
651
643
  revalidated = mergeAttestation(req, revalidated, d.attestation);
652
644
  }
653
645
  }
654
646
  finally {
655
- rewriteEmitterIndex.delete(req.toolCallId);
656
- }
657
- if (asked !== undefined && decision.action === "allow") {
658
- return { ...asked, updatedInput: decision.updatedInput };
647
+ staleArbitrations.delete(req.toolCallId);
659
648
  }
649
+ if (asked !== undefined && decision.action === "allow")
650
+ return { ...asked, ...carried };
660
651
  if (decision.action === "allow")
661
652
  return withAttestation(decision, mergeAttestation(req, attestationOf(decision, req), revalidated));
662
653
  return decision;
@@ -3,7 +3,7 @@ import type { Model } from "../../internal/llm.js";
3
3
  import { assemblePrompt, type AssembledPrompt } from "../../prompt-assembly/assemble.js";
4
4
  import { type CenterAdoption } from "../../prompt-assembly/artifact.js";
5
5
  import { type RunPromptIdentity } from "../../prompt-assembly/epoch.js";
6
- import type { HostForm, HostRole } from "../../prompt-assembly/catalog/schema.js";
6
+ import type { HostForm, HostRole, PromptTraitName } from "../../prompt-assembly/catalog/schema.js";
7
7
  import type { SourcedOverlay } from "../../prompt-assembly/overlay.js";
8
8
  import { type EnvironmentFacts } from "../../prompts/default.js";
9
9
  import { type LegModBus } from "../mods/stations.js";
@@ -47,15 +47,13 @@ export interface PreparePromptAssemblyInput {
47
47
  memoryBlock: string | undefined;
48
48
  /** borrowed-readonly — the environment facts; `date` is the assembly's date, the block builder re-renders on a date change. */
49
49
  envFacts: EnvironmentFacts;
50
- /** borrowed-readonly — the resolved prompt profile (a runtime fact of the assembly). */
51
- promptProfile: "simple" | "classic";
52
- /** borrowed-readonly — the fable mitigations switch (a runtime fact of the assembly). */
53
- fableMitigations: boolean;
50
+ /** borrowed-readonly — the run's effective prompt traits (a selector value of the assembly). */
51
+ promptTraits: ReadonlySet<PromptTraitName>;
54
52
  /** borrowed-readonly — the run's ONE tool roster, read only: the assembly receives DETACHED copies, the audit and the
55
53
  * manifest read it in place. Never mutated here. */
56
54
  tools: readonly AgentTool[];
57
- /** borrowed-readonly — the task model: `promptGuidance` (the model-guidance section) and `id` (the compose event's `model`). */
58
- model: Pick<Model, "id" | "promptGuidance">;
55
+ /** borrowed-readonly — the task model: `id` (the compose event's `model`). */
56
+ model: Pick<Model, "id">;
59
57
  /** borrowed-readonly — the acquired session id (every operator line's attribution). */
60
58
  sessionId: string;
61
59
  /** borrowed-readonly — the once-per-session ledger's operator sink (the collision audit's two lines). */
@@ -15,19 +15,23 @@ import { protocolOf } from "../protocol-table.js";
15
15
  import { hasConversationContent } from "../session.js";
16
16
  import { PROMPT_HASH_SALT } from "./prompt-hash-salt.js";
17
17
  const CATALOG_DIGEST = catalogDigestOf(SEMA_DEFAULT_CATALOG);
18
- function taskLayerOf(task) {
18
+ const TASK_TEXT_DIGEST_SCHEME = "sid-sha256:";
19
+ function taskLayerDigestOf(sessionId, text) {
20
+ return `${TASK_TEXT_DIGEST_SCHEME}${createHash("sha256").update(sessionId).update("\u0000").update(text).digest("hex")}`;
21
+ }
22
+ function taskLayerOf(task, sessionId) {
19
23
  return task.map(({ overlay: o, origin }) => ({
20
24
  by: origin.by,
21
25
  id: o.id,
22
26
  op: o.op,
23
27
  target: o.target,
24
- ...(o.text !== undefined ? { chars: o.text.length } : {}),
28
+ ...(o.text !== undefined ? { text: taskLayerDigestOf(sessionId, o.text) } : {}),
25
29
  ...(o.message !== undefined ? { message: o.message } : {}),
26
30
  ...(o.when !== undefined ? { when: o.when } : {}),
27
31
  }));
28
32
  }
29
33
  export async function preparePromptAssembly(input) {
30
- const { session, deps, internals, resume, sugar, host, binding, modBus, featureFlags, mcpInstructionsBlock, memoryBlock, envFacts, promptProfile, fableMitigations, tools, model, sessionId, onceLedger } = input;
34
+ const { session, deps, internals, resume, sugar, host, binding, modBus, featureFlags, mcpInstructionsBlock, memoryBlock, envFacts, promptTraits, tools, model, sessionId, onceLedger } = input;
31
35
  const topLevel = internals?.parentTaskId === undefined && internals?.parentSessionId === undefined && internals?.parentCenterArtifactDigest === undefined;
32
36
  const stored = await session.getPromptEpoch();
33
37
  let centerAdoption;
@@ -82,10 +86,8 @@ export async function preparePromptAssembly(input) {
82
86
  ...featureFlags,
83
87
  orchestrationEnabled: featureFlags.orchestrationEnabled && tools.some((t) => t.name === "Workflow"),
84
88
  orchestrationDeferred: featureFlags.orchestrationDeferred && tools.some((t) => t.name === "Workflow"),
85
- promptProfile,
86
- fableMitigations,
87
89
  };
88
- const selectorRecord = selectorRecordOf(selectorsOf(facts, host, binding));
90
+ const selectorRecord = selectorRecordOf(selectorsOf(facts, host, binding, promptTraits));
89
91
  const centerOverlays = centerOverlaysOf(centerAdoption);
90
92
  const lowerAdds = new Map();
91
93
  for (const { overlay } of [...sugar, ...centerOverlays])
@@ -105,6 +107,7 @@ export async function preparePromptAssembly(input) {
105
107
  deployOverlays: composed.deploy,
106
108
  host,
107
109
  ...(binding !== undefined ? { binding } : {}),
110
+ traits: promptTraits,
108
111
  tools,
109
112
  facts,
110
113
  ...(envFacts.cwd !== undefined ? { workspaceFolder: envFacts.cwd } : {}),
@@ -112,11 +115,10 @@ export async function preparePromptAssembly(input) {
112
115
  memoryBlock,
113
116
  buildEnvBlock: (date) => buildEnvironmentContext({ ...envFacts, date }) || undefined,
114
117
  date: envFacts.date,
115
- ...(model.promptGuidance && model.promptGuidance.length > 0 ? { modelGuidance: model.promptGuidance.join("\n\n") } : {}),
116
118
  onWarn: (message, phase) => deps.onError?.(new Error(message), { phase, sessionId }),
117
119
  });
118
120
  const deployLayer = composed.deploy.length > 0 ? digestOf(composed.deploy.map(({ overlay, origin }) => ({ by: origin.by, overlay }))) : undefined;
119
- const taskLayer = taskOverlays.length > 0 ? digestOf(taskLayerOf(taskOverlays)) : undefined;
121
+ const taskLayer = taskOverlays.length > 0 ? digestOf(taskLayerOf(taskOverlays, sessionId)) : undefined;
120
122
  const bindingLayer = digestOf(selectorRecord);
121
123
  const renderers = rendererVector();
122
124
  const identityFor = (center) => ({
@@ -23,7 +23,8 @@ import type { LegModBus } from "../mods/stations.js";
23
23
  import type { ExecutionEnv, ThinkingLevel } from "../../internal/harness.js";
24
24
  import type { Model } from "../../internal/llm.js";
25
25
  import { type EnvironmentFacts } from "../../prompts/default.js";
26
- import type { SourcedOverlay } from "../../prompt-assembly/overlay.js";
26
+ import type { HostRole } from "../../prompt-assembly/catalog/schema.js";
27
+ import { type RequestBodySugar } from "../../prompt-assembly/sugar.js";
27
28
  import type { ContainmentFace } from "../../tools/fs/index.js";
28
29
  import type { LockedPreflight } from "../locked-config.js";
29
30
  import type { MaterializedMcp } from "../mcp.js";
@@ -65,10 +66,6 @@ export interface PreparePromptInputsInput {
65
66
  /** borrowed-readonly — the frozen tool face; `defer` (the Workflow short-pointer flag) and `selector` (with the spec's whole-face
66
67
  * switch, the valve's reading that decides which servers' instructions are taught). */
67
68
  toolFaceSnapshot: Pick<ToolFaceSnapshot, "defer" | "selector">;
68
- /** borrowed-readonly — the resolved prompt profile (rides the flags to the legacy ctx). */
69
- promptProfile: "simple" | "classic";
70
- /** borrowed-readonly — the fable-mitigations profile axis (rides the flags with the profile). */
71
- fableMitigations: boolean;
72
69
  /** borrowed-readonly — trusted internals: `goalMode` (goal flag), `isolation` (worktree flag),
73
70
  * `defaultSystemPrompt` (the sugar's third source). `undefined` on a standalone prepare. */
74
71
  internals: Pick<RunInternals, "goalMode" | "isolation" | "defaultSystemPrompt"> | undefined;
@@ -81,8 +78,12 @@ export interface PreparePromptInputsInput {
81
78
  delegation: {
82
79
  readonly isNonForkChild: boolean;
83
80
  };
84
- /** borrowed-readonly — the resolved role; only its `systemPrompt` preset is read (second source). */
85
- resolvedRole: Pick<ResolvedRole, "systemPrompt">;
81
+ /** borrowed-readonly — the resolved role; only its role-base statement (`promptRole` / `systemPrompt`) is read (the
82
+ * role-base decision's second source). */
83
+ resolvedRole: Pick<ResolvedRole, "promptRole" | "systemPrompt">;
84
+ /** borrowed-readonly — the task seat's role word as its door judged it (`TaskSpec.promptRole`, `resolveHost`): the
85
+ * role-base decision's first source, beside the spec's own text. */
86
+ taskRole: HostRole | undefined;
86
87
  /** borrowed-mutable — the materialized MCP roster; `serverInstructions` (the disposed entries) and `tools` (each server's listing: did it list
87
88
  * any tool) are read, and the instructions lane's ledger is stated: the block is what the model is told at the run's start. */
88
89
  mcp: Pick<MaterializedMcp, "serverInstructions" | "tools" | "instructionsDelta">;
@@ -122,8 +123,9 @@ export interface PreparePromptInputsInput {
122
123
  export interface PreparePromptInputsResult {
123
124
  /** owned — the runtime feature flags (see {@link PromptFeatureFlags}). */
124
125
  featureFlags: PromptFeatureFlags;
125
- /** owned — the request-body sugar's overlays (the task class's first contributions), in application order. */
126
- sugar: readonly SourcedOverlay[];
126
+ /** owned — the request-body sugar: its overlays (the task class's first contributions, in application order) and the
127
+ * run's host role, from the one role-base decision. */
128
+ sugar: RequestBodySugar;
127
129
  /** owned — the fenced MCP server-instructions block, or undefined when no server declared any. */
128
130
  mcpInstructionsBlock: string | undefined;
129
131
  /** owned — the environment facts the env tail renders from. Filled here; no later phase writes it
@@ -1,5 +1,5 @@
1
1
  import { formatLocalDate, isValidTimeZone } from "../../prompts/default.js";
2
- import { sugarOverlays } from "../../prompt-assembly/sugar.js";
2
+ import { requestBodySugar } from "../../prompt-assembly/sugar.js";
3
3
  import { valveLeaves } from "../../agents/tool-filter.js";
4
4
  import { instructionsTaught, toldAtStart } from "../mounted-mcp.js";
5
5
  import { isIsolated } from "../remote-env.js";
@@ -9,7 +9,7 @@ import { renderMcpInstructionsEntry } from "./turn-attachments.js";
9
9
  const ULTRA_REASONING_TIERS = new Set(["xhigh", "max"]);
10
10
  import { compactionEnabled } from "../context-settings.js";
11
11
  export async function preparePromptInputs(input) {
12
- const { spec, deps, failClosedReason, lockedPreflight, selfOrchestrationActive, executionEnv, reminderMark, resolvedReadFace, resolvedWriteFace, toolFaceSnapshot, promptProfile, fableMitigations, internals, thinking, ownedEnv, delegation, resolvedRole, mcp, model, externalContentTargetActive, resume, handsEnabled, taskRootFinal, additionalRootsCanonical, additionalReadRootsCanonical, sessionId, session, advertisedWritableDirs } = input;
12
+ const { spec, deps, failClosedReason, lockedPreflight, selfOrchestrationActive, executionEnv, reminderMark, resolvedReadFace, resolvedWriteFace, toolFaceSnapshot, internals, thinking, ownedEnv, delegation, resolvedRole, mcp, model, externalContentTargetActive, resume, handsEnabled, taskRootFinal, additionalRootsCanonical, additionalReadRootsCanonical, sessionId, session, advertisedWritableDirs } = input;
13
13
  const promptPolicyEnabled = Boolean(lockedPreflight.toolPolicy);
14
14
  const promptHooksEnabled = input.modBus.hasHandlers("classic.PreToolUse") || input.modBus.hasHandlers("classic.PostToolUse");
15
15
  if (failClosedReason) {
@@ -24,15 +24,13 @@ export async function preparePromptInputs(input) {
24
24
  writeFaceOpen: resolvedWriteFace === "open",
25
25
  orchestrationEnabled: selfOrchestrationActive,
26
26
  orchestrationDeferred: selfOrchestrationActive && (toolFaceSnapshot.defer?.includes("Workflow") ?? false),
27
- promptProfile,
28
- fableMitigations,
29
27
  goalEnabled: internals?.goalMode === true,
30
28
  awarenessEnabled: thinking !== undefined && ULTRA_REASONING_TIERS.has(thinking),
31
29
  worktreeIsolated: internals?.isolation === "worktree" && ownedEnv !== undefined,
32
30
  withinTaskCompactionEnabled: compactionEnabled(spec.compaction?.enabled, input.contextOverlay) && (spec.compaction?.withinTask ?? true),
33
31
  isSubagent: delegation.isNonForkChild,
34
32
  };
35
- const sugar = sugarOverlays({ spec, resolvedRole, ...(internals !== undefined ? { internals } : {}) });
33
+ const sugar = requestBodySugar({ spec, resolvedRole, ...(input.taskRole !== undefined ? { taskRole: input.taskRole } : {}), ...(internals !== undefined ? { internals } : {}) });
36
34
  const valveLeft = valveLeaves(spec, toolFaceSnapshot.selector);
37
35
  const taught = mcp.serverInstructions.filter((entry) => instructionsTaught(valveLeft, entry.server, input.roster.tools, mcp.tools));
38
36
  toldAtStart(mcp.instructionsDelta, new Set(taught.map((entry) => entry.server)));
@@ -36,6 +36,8 @@ export interface PrepareProtocolToolsInput {
36
36
  * mount predicate, and whether a real client was acquired) and `a2a` (the declared peers the door judged: the materialize
37
37
  * input and whether a handle was acquired) are read. */
38
38
  lockedPreflight: Pick<LockedPreflight, "mcp" | "a2a">;
39
+ /** borrowed-readonly — the deployment's host floor as the config doors compiled it: each MCP http dial and every A2A request is judged by it. */
40
+ hostFloor: import("../host-floor.js").HostFloor | undefined;
39
41
  /** borrowed-readonly — the REBOUND spec. Read: `principal` (the MCP header / the A2A identity), `tools`
40
42
  * (the caller names both reserved-name guards check against), `excludeAllTools` (the valve's whole-face switch: the live roster lane's
41
43
  * reading, and the first-dial gate), `signal` (the host's abort, which stops an MCP dial). */
@@ -14,7 +14,7 @@ import { applyMcpToolFaces } from "./tool-face-overlay.js";
14
14
  import { sectionDisposerOf } from "../prompt-section-seat.js";
15
15
  import { thrownText } from "../thrown-value.js";
16
16
  export async function prepareProtocolTools(input) {
17
- const { lockedPreflight, spec, deps, mcpPool, reminderMark, reminderDisclosureCounts, runId, sessionId, onceLedger, roster, rosterSeat, remoteToolOffload, toolFaceSnapshot, toolEffects, axisExplicitNegatives, irreversibilityTier, irreversibleTools, egressTools, toolMarkSources, abortController, rollback } = input;
17
+ const { lockedPreflight, hostFloor, spec, deps, mcpPool, reminderMark, reminderDisclosureCounts, runId, sessionId, onceLedger, roster, rosterSeat, remoteToolOffload, toolFaceSnapshot, toolEffects, axisExplicitNegatives, irreversibilityTier, irreversibleTools, egressTools, toolMarkSources, abortController, rollback } = input;
18
18
  const markedBy = (name, source) => {
19
19
  const set = toolMarkSources.get(name);
20
20
  if (set !== undefined)
@@ -30,7 +30,7 @@ export async function prepareProtocolTools(input) {
30
30
  const leaves = valveLeaves(spec, toolFaceSnapshot.selector);
31
31
  const resourcesReached = resourceFacesLeft(leaves);
32
32
  const mcp = lockedPreflight.mcp?.length
33
- ? await materializeMcpTools(lockedPreflight.mcp, spec.principal, deps.onElicit, deps.mcpImageResizer, { reminderMark, counts: reminderDisclosureCounts }, mcpRevocationWiring(deps, runId), mcpPool === undefined ? undefined : { pool: mcpPool.pool, ownsPool: mcpPool.owned }, sectionDisposerOf(input.modBus, abortController.signal), (entry) => resourcesReached || serverReached(mintNamespacePrefix(MCP_NAMESPACE, entry.name)), AbortSignal.any([abortController.signal, ...(spec.signal !== undefined ? [spec.signal] : [])]))
33
+ ? await materializeMcpTools(lockedPreflight.mcp, spec.principal, deps.onElicit, deps.mcpImageResizer, { reminderMark, counts: reminderDisclosureCounts }, mcpRevocationWiring(deps, runId), mcpPool === undefined ? undefined : { pool: mcpPool.pool, ownsPool: mcpPool.owned }, sectionDisposerOf(input.modBus, abortController.signal), (entry) => resourcesReached || serverReached(mintNamespacePrefix(MCP_NAMESPACE, entry.name)), AbortSignal.any([abortController.signal, ...(spec.signal !== undefined ? [spec.signal] : [])]), hostFloor)
34
34
  :
35
35
  { tools: [], toolAxes: [], warnings: [], serverInstructions: [], instructionsDelta: { pendingAdds: [], pendingRemovals: [] }, droppedTools: [], statuses: [], refresh: async () => [], reconnect: async (server) => ({ server, prefix: mintNamespacePrefix(MCP_NAMESPACE, server), outcome: "not_declared", reason: "this task declared no MCP servers", toolCount: 0, added: [], removed: [] }), dispose: async () => { } };
36
36
  if (lockedPreflight.mcp?.length)
@@ -167,7 +167,7 @@ export async function prepareProtocolTools(input) {
167
167
  foldProtocolAxes(mcp.toolAxes, "MCP");
168
168
  const a2aDeclared = lockedPreflight.a2a;
169
169
  const a2a = a2aDeclared
170
- ? await materializeA2aTools(a2aDeclared, spec.principal, abortController.signal)
170
+ ? await materializeA2aTools(a2aDeclared, spec.principal, abortController.signal, hostFloor)
171
171
  : { tools: [], toolAxes: [], warnings: [], statuses: [], refresh: async () => [], dispose: async () => { } };
172
172
  if (a2aDeclared)
173
173
  rollback.push(function a2aDispose() { return a2a.dispose(); });
@@ -16,7 +16,7 @@ export interface PrepareSafetyScanInput {
16
16
  * The six collections are **borrowed-mutable**: the driver and later phases fold into them IN
17
17
  * PLACE (identity is part of the contract — closures alias these exact objects). Mutation owners
18
18
  * after this phase, in driver order:
19
- * · the roster builder (`toolEffects`: every mount and unmount; the aliases' axes on a non-caller mount and on an unmount);
19
+ * · the roster builder (`toolEffects`: every mount and unmount);
20
20
  * · the MCP/A2A materialize fold + the runtime refresh seam (protocol-axis tighten registration and a protocol tool's effect;
21
21
  * on refresh, `toolEffects.delete` resets a replaced tool's effect record for the fresh fold —
22
22
  * the irreversible/egress sets deliberately KEEP their entries, the tighten-only residue);
@@ -116,9 +116,7 @@ export function prepareSafetyScan(input) {
116
116
  }
117
117
  }
118
118
  const candidates = engineCandidatesOf(spec, deps);
119
- const engineNames = new Set(candidates.map(([n]) => n));
120
119
  for (const t of survivors.values()) {
121
- const tier = tierOf(t);
122
120
  for (const alias of t.aliases ?? []) {
123
121
  if (alias === t.name || survivors.has(alias))
124
122
  continue;
@@ -128,21 +126,6 @@ export function prepareSafetyScan(input) {
128
126
  claimedAliases.add(alias);
129
127
  if (t.effect)
130
128
  declared.set(alias, t.effect);
131
- if (engineNames.has(alias))
132
- continue;
133
- if (tier !== undefined) {
134
- irreversibilityTier.set(alias, tier);
135
- if (tier === "always" || tier === "maybe") {
136
- irreversibleTools.add(alias);
137
- markedBy(alias, "deployment");
138
- }
139
- }
140
- if (t.reversibilityProbe)
141
- reversibilityProbes.set(alias, t.reversibilityProbe);
142
- if (t.egress) {
143
- egressTools.add(alias);
144
- markedBy(alias, "deployment");
145
- }
146
129
  }
147
130
  }
148
131
  return {
@@ -114,6 +114,8 @@ export interface PrepareSuspendSagaInput {
114
114
  writeFaceCheckpointSection: () => SerializedCheckpointState["writeFace"];
115
115
  /** borrowed-readonly — the inherited-gate phase's SKILL-GRANT section builder (the row's `skillGrants`). */
116
116
  skillGrantCheckpointSection: () => SerializedCheckpointState["skillGrants"];
117
+ /** borrowed-readonly — the leg's skill scopes (the mods admission's record): the row's `skillScopes`, read at the park. */
118
+ skillScopesCheckpointSection: () => SerializedCheckpointState["skillScopes"];
117
119
  /** borrowed-readonly — the leg's reminder provenance mark (travels with the row). */
118
120
  reminderMark: string;
119
121
  /** borrowed-readonly — the hand's live tracked cwd, or undefined; `current` is read at mint time. Not written here. */
@@ -82,9 +82,10 @@ function stampPlacementRootSessionId(placementRootResolved) {
82
82
  return placementValueOrAbsent(placementRootResolved);
83
83
  }
84
84
  export function prepareSuspendSaga(input) {
85
- const { gateMachineryActive, abortController, harness, checkpointStore, deps, sessionId, hostTaskId, taskScope, liveSpendRef, resume, nestedStats, internals, activeTools, outputRef, readFileStateForCheckpoint, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, reminderMark, handsCwdRef, handsRoot, handsHome, worktreeSessionRef, undeliveredContinuationRef, inheritedParentConstraints, seedInheritedGate, ancestorRulesNow, inheritedShellGate, permissionMode, inheritedAdmittedOrgScopes, inheritedPathRuleAnchors, inheritedPathRuleInstallations, ownOrgVerdictRef, orgGovernedProvenance, announcedListingsRef, gitStatusRef, hookIdentity, placementRootResolved, checkpointScope, toolCeiling, toolListsJudged, ownToolLists, externalContentTargetActive, crossBoundary, remoteEnvFailures, memoryEngineSession, suspendLoopRef, ownedEnv, incompleteSuspendAdapter } = input;
85
+ const { gateMachineryActive, abortController, harness, checkpointStore, deps, sessionId, hostTaskId, taskScope, liveSpendRef, resume, nestedStats, internals, activeTools, outputRef, readFileStateForCheckpoint, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, skillScopesCheckpointSection, reminderMark, handsCwdRef, handsRoot, handsHome, worktreeSessionRef, undeliveredContinuationRef, inheritedParentConstraints, seedInheritedGate, ancestorRulesNow, inheritedShellGate, permissionMode, inheritedAdmittedOrgScopes, inheritedPathRuleAnchors, inheritedPathRuleInstallations, ownOrgVerdictRef, orgGovernedProvenance, announcedListingsRef, gitStatusRef, hookIdentity, placementRootResolved, checkpointScope, toolCeiling, toolListsJudged, ownToolLists, externalContentTargetActive, crossBoundary, remoteEnvFailures, memoryEngineSession, suspendLoopRef, ownedEnv, incompleteSuspendAdapter } = input;
86
86
  if (!gateMachineryActive)
87
87
  return { saga: undefined };
88
+ const taskAccess = { owner: hostTaskId, scope: taskScope, sessionId };
88
89
  const inFlightSpendMicroUsd = () => {
89
90
  const own = liveSpendRef.get?.().costMicroUsd ?? 0;
90
91
  const seededNested = resume?.seed.nestedStats.costMicroUsd;
@@ -114,6 +115,7 @@ export function prepareSuspendSaga(input) {
114
115
  readFace: faceCheckpointSection(),
115
116
  writeFace: writeFaceCheckpointSection(),
116
117
  skillGrants: skillGrantCheckpointSection(),
118
+ skillScopes: skillScopesCheckpointSection(),
117
119
  reminderMark,
118
120
  repairBundle: repairBundleForCheckpoint(parkedSpendMicroUsd),
119
121
  workspaceHandle,
@@ -122,10 +124,7 @@ export function prepareSuspendSaga(input) {
122
124
  handsHome,
123
125
  activeWorktree: worktreeSessionRef?.current ? { ...worktreeSessionRef.current } : undefined,
124
126
  runningBackgroundTasks: (() => {
125
- const live = defaultTaskRegistry
126
- .list({ owner: hostTaskId, scope: taskScope, sessionId })
127
- .filter((t) => t.status === "pending" || t.status === "running")
128
- .map((t) => ({ id: t.task_id, ...(t.description !== undefined ? { description: t.description } : {}) }));
127
+ const live = defaultTaskRegistry.liveTasks(taskAccess).filter((t) => t.status !== "parked").map((t) => ({ id: t.task_id, ...(t.description !== undefined ? { description: t.description } : {}) }));
129
128
  const owed = undeliveredContinuationRef.current.orphanTasks.filter((o) => !live.some((t) => t.id === o.id));
130
129
  const all = [...owed, ...live];
131
130
  return all.length > 0 ? all : undefined;
@@ -200,7 +199,7 @@ export function prepareSuspendSaga(input) {
200
199
  return { tag: "absent" };
201
200
  if (memoryEngineSession)
202
201
  await memoryEngineSession.harvest("checkpoint");
203
- const recordUnwritten = await crossBoundary.owe(cp.leafId).then((entryId) => void (entryId !== undefined && (cp = { ...cp, leafId: entryId })), (err) => ({ err }));
202
+ const recordUnwritten = await crossBoundary.owe(cp.leafId, () => defaultTaskRegistry.owedDeliveries(taskAccess)).then((entryId) => void (entryId !== undefined && (cp = { ...cp, leafId: entryId })), (err) => ({ err }));
204
203
  if (cutSignal?.aborted) {
205
204
  if (remoteEnv !== undefined && remoteHandle?.snapshotId !== undefined) {
206
205
  const back = await compensatePausedVM(remoteEnv, remoteHandle.snapshotId);