@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
@@ -14,15 +14,18 @@
14
14
  *
15
15
  * The request door (the bad-value doors and every refusal the request decides alone) lives in
16
16
  * `./file-history-request.ts` and runs BEFORE the session is acquired; this phase receives its resolution.
17
- * The module-level helpers below the phase (`restoredAbsPathsOf`,
18
- * the refusal's epoch-tail wording helper, `adoptForkedFileHistory` with its per-store carry memo,
17
+ * The module-level helpers below the phase (`adoptForkedFileHistory` with its per-store carry memo,
19
18
  * `createFileHistoryBoundarySeat`, `resolveFileHistoryCoordinates` / `resolveFileHistoryScope` /
20
19
  * `fileHistoryFilesystemIdentity`, `childScopeRewindRefusal`) moved with it unchanged; the two the test
21
- * suite reaches through the driver are re-exported from there.
20
+ * suite reaches through the driver are re-exported from there. The restore itself and the reading of its
21
+ * answer live in `./file-history-restore.ts`, shared with the out-of-run rewind (`./rewind-files.ts`), which
22
+ * also reaches down here for the coordinates and the fork carry — a rewind outside a run is the same history
23
+ * operation as the one this phase runs.
22
24
  */
23
25
  import type { ExecutionEnv } from "../../internal/harness.js";
24
26
  import type { StoredSession } from "../../engine/session/session.js";
25
27
  import type { RunnerDeps, TaskResult, TaskSpec, TrackFileEditHook } from "../types.js";
28
+ import type { FileHistoryStore } from "../file-history-store.js";
26
29
  import type { FileHistoryBoundarySeat, RunInternals } from "./contracts.js";
27
30
  import type { FileHistoryRequest } from "./file-history-request.js";
28
31
  export interface PrepareFileHistoryInput {
@@ -36,8 +39,9 @@ export interface PrepareFileHistoryInput {
36
39
  * acquired: every refusal the request and the deployment's seats decide on their own has already thrown. */
37
40
  request: FileHistoryRequest;
38
41
  /** borrowed-readonly — the trusted lineage a delegating parent handed this run (absent for a root run
39
- * and for a host's own fork), read for the recording-scope decision only. */
40
- internals: Pick<RunInternals, "fileHistoryLineage"> | undefined;
42
+ * and for a host's own fork), read for the recording-scope decision only; and the Runner's session
43
+ * read-state seats, whose restore channel the restore writes the paths it moved into. */
44
+ internals: Pick<RunInternals, "fileHistoryLineage" | "sessionReadStates"> | undefined;
41
45
  /** borrowed-readonly — the run's resolved env (owned or static or the stub); every history verb runs
42
46
  * against ITS filesystem ops. Never rebound or destroyed here. */
43
47
  executionEnv: ExecutionEnv;
@@ -60,9 +64,6 @@ export interface PrepareFileHistoryResult {
60
64
  /** borrowed-readonly — the turn-start boundary seat runtask drives; `undefined` when not live or when
61
65
  * this run records into its ROOT session's scope (a child mints no boundaries). */
62
66
  fileHistoryBoundary: FileHistoryBoundarySeat | undefined;
63
- /** borrowed-readonly — the absolute paths the restore MUTATED (empty when no restore ran), for the
64
- * read-face phase's read-state invalidation. */
65
- restoredFilePaths: string[];
66
67
  /** borrowed-mutable — the non-fatal rewind disclosures (`TaskResult.rewindNotes`). Mutation owners after
67
68
  * this call: none — every push happens inside this phase; the driver only reads it into `Prepared`. */
68
69
  rewindNotes: NonNullable<TaskResult["rewindNotes"]>;
@@ -79,6 +80,45 @@ export interface PrepareFileHistoryResult {
79
80
  historyFs: string;
80
81
  }
81
82
  export declare function prepareFileHistory(input: PrepareFileHistoryInput): Promise<PrepareFileHistoryResult>;
83
+ /**
84
+ * Carry a forked session's file history from its parent scope (the seat §5 names).
85
+ * Never throws and never fails the turn: a store that cannot carry leaves the fork with an empty
86
+ * history, which is DEGRADED (a pre-fork boundary is not restorable from the new session) and not
87
+ * wrong (nothing is silently mis-restored — the restore seat answers "no boundary" honestly).
88
+ */
89
+ export declare function adoptForkedFileHistory(store: FileHistoryStore, session: {
90
+ getMetadata(): Promise<{
91
+ forkedFrom?: string;
92
+ }>;
93
+ }, sessionId: string, onError: RunnerDeps["onError"]): Promise<void>;
94
+ /**
95
+ * The run's two file-history COORDINATES, resolved once where store/env/root meet (module-level per
96
+ * the body ratchet):
97
+ * - `historyRoot` — ONE canonical root coordinate for every history verb: capture keys (rel-under-root
98
+ * vs absolute, DV-6) must agree with the canonical containment keys the hands band mints — a
99
+ * symlinked root spelling (macOS /var → /private/var) would otherwise record in-root files as
100
+ * absolute and un-tether them from the root they live in.
101
+ * - `historyScope` — WHICH scope this run's first-touch records land in. A top-level run owns its own
102
+ * (its sessionId). A delegated child that was handed a {@link RunInternals.fileHistoryLineage} and
103
+ * runs on the SAME canonical root records into the lineage's scope — the root session's — so the
104
+ * edits a child makes on the user's behalf are part of the ONE history the user rewinds from
105
+ * (before this, a child's first touch minted its baseline in a scope no rewind ever read, and the
106
+ * parent's own later first touch of that file recorded the child-modified bytes as pristine). A
107
+ * child on a DIFFERENT root keeps its own scope: keys are root-relative and carry no root, so a
108
+ * record minted under a worktree re-joined against the root session's tree would converge a file
109
+ * that run never edited — the structural out-of-scope guarantee the store contract opens with.
110
+ * Same-tree equality is judged on TWO coordinates, both minted here: the CANONICAL root spelling
111
+ * both sides minted their keys against, and the FILESYSTEM the env is a view of
112
+ * ({@link fileHistoryFilesystemIdentity}) — a path string alone is not a tree (two per-task
113
+ * sandboxes can both spell `/workspace` and hold unrelated files).
114
+ * With no live history store there is nothing to coordinate: own scope, uncanonicalized root, no
115
+ * filesystem identity (nothing reads any of them).
116
+ */
117
+ export declare function resolveFileHistoryCoordinates(enabled: boolean, env: ExecutionEnv, taskRoot: string, lineage: RunInternals["fileHistoryLineage"], sessionId: string): Promise<{
118
+ historyRoot: string;
119
+ historyScope: string;
120
+ historyFs: string;
121
+ }>;
82
122
  /** The ONE reading of {@link RunInternals.fileHistoryLineage} (see {@link resolveFileHistoryCoordinates}):
83
123
  * the lineage's scope iff BOTH tree coordinates match; otherwise the run's own session. */
84
124
  export declare function resolveFileHistoryScope(lineage: RunInternals["fileHistoryLineage"], historyRoot: string, historyFs: string, sessionId: string): string;
@@ -1,8 +1,9 @@
1
1
  import { NodeExecutionEnv } from "../../engine/execution-env/node-execution-env.js";
2
2
  import { isRemoteExecutionEnv } from "../remote-env.js";
3
- import { FILE_HISTORY_ERROR_CODES, FileHistoryStoreError, resolveTrackKey } from "../file-history-store.js";
3
+ import { FILE_HISTORY_ERROR_CODES, FileHistoryStoreError } from "../file-history-store.js";
4
4
  import { readMember, thrownText } from "../thrown-value.js";
5
5
  import { isGovernanceRetryClass } from "../governance-codes.js";
6
+ import { fileHistoryRestoreLedgerLine, settleFileHistoryRestore } from "./file-history-restore.js";
6
7
  export async function prepareFileHistory(input) {
7
8
  const { deps, spec, request, internals, executionEnv, taskRootFinal, handsEnabled, sessionId, session, abortController } = input;
8
9
  const rewindNotes = [];
@@ -45,25 +46,10 @@ export async function prepareFileHistory(input) {
45
46
  });
46
47
  }
47
48
  }
48
- let restoredFilePaths = [];
49
49
  if (rewindTarget !== undefined && fileHistoryStore !== undefined && handsEnabled) {
50
50
  const restoreSignal = spec.signal ? AbortSignal.any([abortController.signal, spec.signal]) : abortController.signal;
51
- const restored = await fileHistoryStore.restore(sessionId, rewindTarget, executionEnv, historyRoot, restoreSignal);
52
- const ledgerLine = (r) => `applied ${r.filesChanged.length}, identical ${r.identicalSkipped.length}, refused ${r.refused.length}${r.refused.length > 0 ? ` (${r.refused.map((f) => `${f.path}: ${f.reason}`).join("; ")})` : ""}, failed ${r.failed.length}${r.failed.length > 0 ? ` (${r.failed.map((f) => `${f.path}: ${f.reason}`).join("; ")})` : ""}`;
53
- if (restored.outcome === "failed") {
54
- if (restored.error?.code === "not_found") {
55
- if (rewindBefore)
56
- throw beforeWithoutBoundaryRefusal(rewindTarget, sessionId);
57
- const e = new Error(`rewind-files: no file-history boundary exists for entry "${rewindTarget}" on session "${sessionId}" — the working tree was NOT rewound. ${rewindRefusalTail()}`);
58
- e.code = "rewind_snapshot.unresolvable";
59
- throw e;
60
- }
61
- const e = new Error(`rewind-files restore failed (${restored.error?.code ?? "restore_failed"}): ${restored.error?.message ?? "unknown"} — ledger: ${ledgerLine(restored)}`);
62
- e.code = "rewind.restore_failed";
63
- if (restored.error !== undefined)
64
- e.detail = { code: restored.error.code, ...(isGovernanceRetryClass(restored.error.permanence) ? { permanence: restored.error.permanence } : {}) };
65
- throw e;
66
- }
51
+ const restored = await settleFileHistoryRestore({ store: fileHistoryStore, sessionId, target: rewindTarget, before: rewindBefore, env: executionEnv, root: historyRoot, signal: restoreSignal, readStates: internals?.sessionReadStates });
52
+ const ledgerLine = fileHistoryRestoreLedgerLine;
67
53
  if (restored.outcome === "partial") {
68
54
  if (spec.acceptPartialRestore === true) {
69
55
  rewindNotes.push({
@@ -77,7 +63,6 @@ export async function prepareFileHistory(input) {
77
63
  throw e;
78
64
  }
79
65
  }
80
- restoredFilePaths = restoredAbsPathsOf(restored, historyRoot);
81
66
  }
82
67
  const trackFileEdit = fileHistoryEnabled
83
68
  ? async (req) => {
@@ -115,24 +100,7 @@ export async function prepareFileHistory(input) {
115
100
  ? createFileHistoryBoundarySeat({ store: fileHistoryStore, sessionId, env: executionEnv, root: historyRoot, onError: deps.onError })
116
101
  : undefined;
117
102
  const fileHistoryFact = fileHistoryEnabled ? "on" : "disabled";
118
- return { trackFileEdit, fileHistoryBoundary, restoredFilePaths, rewindNotes, fileHistoryEnabled, fileHistoryFact, historyScope, historyRoot, historyFs };
119
- }
120
- function restoredAbsPathsOf(restored, root) {
121
- const out = [];
122
- for (const key of [...restored.filesChanged, ...restored.failed.map((f) => f.path)]) {
123
- const abs = resolveTrackKey(root, key);
124
- if (abs.ok)
125
- out.push(abs.abs);
126
- }
127
- return out;
128
- }
129
- function rewindRefusalTail() {
130
- return `Boundaries are keyed by a turn's INITIAL entry and exist only for turns that recorded history (a RunnerDeps.fileHistoryStore wired, capture on, and the run's file history not disabled); a boundary from the retired whole-tree snapshot era is not restorable by this seat, and reaped boundaries have none.`;
131
- }
132
- function beforeWithoutBoundaryRefusal(target, sessionId) {
133
- const e = new Error(`rewind-files: entry "${target}" has no file-history boundary on session "${sessionId}" — a before-restore needs the target's own boundary and never crosses into an earlier turn, so the working tree was NOT rewound. ${rewindRefusalTail()}`);
134
- e.code = "rewind_snapshot.unresolvable";
135
- return e;
103
+ return { trackFileEdit, fileHistoryBoundary, rewindNotes, fileHistoryEnabled, fileHistoryFact, historyScope, historyRoot, historyFs };
136
104
  }
137
105
  const FILE_HISTORY_BOUNDARY_TIMEOUT_MS = 30_000;
138
106
  const FILE_HISTORY_LIVENESS_MEMO = new WeakMap();
@@ -160,7 +128,7 @@ function answerOf(call, code) {
160
128
  return { ok: false, error: { code: known, message: text, ...(isGovernanceRetryClass(permanence) ? { permanence } : {}) } };
161
129
  }, (value) => unanswered(`the history store threw: ${thrownText(value)}`, { value }));
162
130
  }
163
- async function adoptForkedFileHistory(store, session, sessionId, onError) {
131
+ export async function adoptForkedFileHistory(store, session, sessionId, onError) {
164
132
  const memo = FILE_HISTORY_CARRY_MEMO.get(store) ?? { settled: new Set(), disclosed: new Set(), inFlight: new Map() };
165
133
  FILE_HISTORY_CARRY_MEMO.set(store, memo);
166
134
  const discloseOnce = (err) => {
@@ -242,7 +210,7 @@ function createFileHistoryBoundarySeat(opts) {
242
210
  },
243
211
  };
244
212
  }
245
- async function resolveFileHistoryCoordinates(enabled, env, taskRoot, lineage, sessionId) {
213
+ export async function resolveFileHistoryCoordinates(enabled, env, taskRoot, lineage, sessionId) {
246
214
  if (!enabled)
247
215
  return { historyRoot: taskRoot, historyScope: sessionId, historyFs: "" };
248
216
  const canonRoot = await env.canonicalPath(taskRoot);
@@ -108,7 +108,7 @@ export interface PrepareGateStationsInput {
108
108
  complianceDenies: ReadonlySet<ComplianceCapability>;
109
109
  /** borrowed-mutable — the built harness. Writer here: `on("tool_call")` / `on("tool_result")` — the registrations this
110
110
  * phase exists for, in this order, after the driver's boundary-lease handler. */
111
- harness: Pick<AgentHarness, "on">;
111
+ harness: Pick<AgentHarness, "on" | "isBatchSafe">;
112
112
  /** borrowed-mutable — the blocked/suspended call ids (`Prepared.blockedToolCalls`). Writers here: the head-of-evaluation
113
113
  * hygiene `delete`, the two short-circuits' and the gate outcome's `add`, the `tool_result` station's one-shot `delete`. */
114
114
  blockedToolCalls: Set<string>;
@@ -13,6 +13,8 @@ import { PATH_CONFINABLE_WRITE_TOOLS } from "./session-rule-policy.js";
13
13
  import { callFaceSeat, rosterToolName, toolCallFaceOf } from "../tool-roster.js";
14
14
  import { heldBy, heldValues, seatOf, wireOf } from "../tool-name-readings.js";
15
15
  import { createApprovedCallScreen, createToolResultStation } from "./call-hook-stations.js";
16
+ import { extensionCallOf } from "../mods/extension-call.js";
17
+ import { extensionCallOverlap } from "../mods/tool-call.js";
16
18
  const PEER_MESSAGE_NAMES = new Set([SEND_MESSAGE_TOOL_NAME]);
17
19
  function screenGateResult(result) {
18
20
  if (result.suspend !== undefined)
@@ -123,7 +125,7 @@ export function prepareGateStations(input) {
123
125
  toolFaceOf: (name) => toolCallFaceOf(toolRosterDeltas.current, name === e.toolName ? called.toolName : name),
124
126
  adjudicate,
125
127
  resolveAsk: (...args) => toolOccurrences.whileAwaitingUser(args[1].toolCallId, () => resolveAskBound(...args)),
126
- suspendAsk,
128
+ ...(extensionCallOf(modBus, e.toolCallId) === undefined ? { suspendAsk } : {}),
127
129
  resolveContentAsk: (...args) => toolOccurrences.whileAwaitingUser(args[0].toolCallId, () => resolveContentAsk(...args)),
128
130
  egress: heldBy("gate.egress", egressTools, call),
129
131
  peerMessage: heldBy("gate.peerMessage", PEER_MESSAGE_NAMES, call),
@@ -236,6 +238,13 @@ export function prepareGateStations(input) {
236
238
  }
237
239
  return { block: true, reason: result.reason, ...details };
238
240
  }
241
+ const overlap = result.suspend === undefined && extensionCallOf(modBus, e.toolCallId) !== undefined ? extensionCallOverlap({ occurrences: toolOccurrences, toolCallId: e.toolCallId, toolName: e.toolName, args: result.finalInput ?? e.input, batchSafe: (n, a) => harness.isBatchSafe(n, a) }) : undefined;
242
+ if (overlap !== undefined) {
243
+ toolOccurrences.refuse(e.toolCallId, "hook");
244
+ if (blockedTracked)
245
+ blockedToolCalls.add(e.toolCallId);
246
+ return { block: true, reason: formatHookFeedback(overlap, reminderMark) };
247
+ }
239
248
  if (result.suspend === undefined)
240
249
  toolOccurrences.release(e.toolCallId);
241
250
  return result.updatedInput !== undefined ? { updatedInput: result.updatedInput } : undefined;
@@ -2,7 +2,7 @@ import { type BeforeWriteHook, type CwdRef, type PathRuleDenyRow, type Containme
2
2
  import { type ReadFileState } from "../../tools/fs/safety.js";
3
3
  import { type PathTablesFacade, type PersonPathRows, type ReadRootsSeat } from "./person-path-rows.js";
4
4
  import type { HeadLeads } from "../path-rule-binding.js";
5
- import { type ShellReadAdmission, type ShellReadCheck } from "../../tools/fs/shell-read-check.js";
5
+ import { type ShellReadAdmission, type ShellReadCheck, type ShellReadLandings } from "../../tools/fs/shell-read-check.js";
6
6
  import type { ShellReadBoundary } from "../../tools/fs/shell-read-judge.js";
7
7
  import type { RunnerDeps, ShellGateDoctrine, TaskSpec } from "../types.js";
8
8
  import type { Model } from "../../internal/llm.js";
@@ -96,7 +96,8 @@ export interface PrepareHandsReadFaceInput {
96
96
  deps: Pick<RunnerDeps, "onError" | "onNotice" | "tracer" | "readDenyPatterns" | "readDenyBuiltinTiers" | "readDenyBuiltinExclude" | "agentConfigDir" | "readFace" | "writeFace" | "permissionRuleStore" | "hands">;
97
97
  /** borrowed-readonly — the trusted spawn-side seats the band forwards: the finished-command
98
98
  * notification lane, the mid-flight detach hub, and the Runner's per-session
99
- * read-state seats (absent on a standalone prepare ⇒ the transcript-replay rung covers alone). */
99
+ * read-state seats and their restore channel (absent on a standalone prepare ⇒ the transcript-replay rung
100
+ * covers alone, and no restore is owed a check — the channel is the Runner's). */
100
101
  internals: Pick<RunInternals, "onTaskNotification" | "detachHub" | "sessionReadStates"> | undefined;
101
102
  /** borrowed-mutable — the harness seat, read LIVE by the band's queued-human-input predicate (the shell's
102
103
  * auto-backgrounding leg asks it mid-command). Late-bound: the band is built here, the harness later. */
@@ -110,13 +111,6 @@ export interface PrepareHandsReadFaceInput {
110
111
  };
111
112
  /** borrowed-mutable — the leg's occurrence table; writer here: the shell read station's refused-admission callback. */
112
113
  toolOccurrences: ToolOccurrenceTable;
113
- /** borrowed-readonly — ABSOLUTE paths this prepare's restore wrote, deleted,
114
- * or failed to write. Every read-state seed above describes the PRE-restore tree, so these keys are
115
- * dropped from the map: the engine replaced those bytes itself, and a surviving entry makes the
116
- * next refusal blame "the user or a linter" for the engine's own write. Absent (the common case)
117
- * when no file restore ran. Fail-closed by construction — dropping a read record only ever
118
- * produces refusals. */
119
- restoredFilePaths?: readonly string[];
120
114
  /** borrowed-readonly — the memory write gate the memory phase minted (it runs BEFORE this phase: the memory root
121
115
  * must be known before the toolkit compiles), composed into the band's beforeWrite below; undefined for a
122
116
  * memory-less run (every write passes the engine half). */
@@ -221,6 +215,8 @@ export interface PrepareHandsReadFaceResult {
221
215
  /** owned — the same station's pre-spawn ADMISSION, published for the P11 face that spawns a shell command
222
216
  * and mounts LATER than the band (`Monitor`): the SAME function the band's shell faces got. ⇔ a real shell. */
223
217
  shellReadAdmission: ShellReadAdmission | undefined;
218
+ /** owned — the same station's landings of a judged call (`ShellReadStation.landings`): the park binds them, the resumed leg's execution station compares. ⇔ a real shell. */
219
+ shellReadLandings: ShellReadLandings | undefined;
224
220
  /** owned — the file read station's admission (`FileReadStation.admitted`) the band's read tools got, for the read tools mounted later (LSP). */
225
221
  readAdmission: ((toolCallId: string | undefined, canonicalKey: string) => boolean) | undefined;
226
222
  /** write-back (D-3 hold) — the run's RESOLVED read face where hands mount; undefined ⇔ no hands
@@ -86,6 +86,7 @@ export function resolveHandsLessReadFace(input) {
86
86
  shellReadCheck: undefined,
87
87
  shellReadStationArmed: false,
88
88
  shellReadAdmission: undefined,
89
+ shellReadLandings: undefined,
89
90
  readAdmission: undefined,
90
91
  resolvedReadFace: undefined,
91
92
  resolvedWriteFace: undefined,
@@ -260,22 +261,23 @@ export async function prepareHandsMount(input) {
260
261
  }
261
262
  }
262
263
  }
263
- if (input.restoredFilePaths !== undefined) {
264
- for (const abs of input.restoredFilePaths) {
265
- const k = await judgeKey(abs);
266
- if (k === undefined)
267
- continue;
268
- const entry = readFileState.get(k);
269
- if (entry === undefined || entry.seededFromContext === true)
270
- continue;
271
- const cur = await executionEnv.readTextFile(abs);
272
- if (cur.ok && entry.hash === sha256(normalizeFileText(cur.value)))
273
- continue;
274
- readFileState.delete(k);
275
- }
264
+ const restoredOwed = sessionSeats?.pendingRestored(sessionId) ?? [];
265
+ for (const abs of restoredOwed) {
266
+ const k = await judgeKey(abs);
267
+ if (k === undefined)
268
+ continue;
269
+ const entry = readFileState.get(k);
270
+ if (entry === undefined || entry.seededFromContext === true)
271
+ continue;
272
+ const cur = await executionEnv.readTextFile(abs);
273
+ if (cur.ok && entry.hash === sha256(normalizeFileText(cur.value)))
274
+ continue;
275
+ readFileState.delete(k);
276
276
  }
277
- if (seatLeafId !== undefined)
277
+ if (seatLeafId !== undefined) {
278
278
  sessionSeats?.adopt(sessionId, readFileState, seatLeafId);
279
+ sessionSeats?.settleRestored(sessionId, restoredOwed);
280
+ }
279
281
  sealReadStateSeat =
280
282
  sessionSeats !== undefined && seatLeafId !== undefined
281
283
  ? (ownCommittedTailEntryId) => {
@@ -410,6 +412,7 @@ export async function prepareHandsMount(input) {
410
412
  shellReadCheck: onPinnedRead(input.personRows, [...(shellReadStation !== undefined ? [{ check: shellReadStation.check, tools: shellReadTools }] : []), ...(fileReadStation !== undefined ? [fileReadStation] : [])]),
411
413
  shellReadStationArmed: shellReadStation !== undefined,
412
414
  shellReadAdmission: shellReadStation?.admit,
415
+ shellReadLandings: shellReadStation?.landings,
413
416
  readAdmission: fileReadStation?.admitted,
414
417
  resolvedReadFace,
415
418
  resolvedWriteFace,
@@ -62,6 +62,8 @@ export interface PrepareInheritedGateInput {
62
62
  checkpointSeat: import("../checkpoint-seat.js").CheckpointSeat | undefined;
63
63
  /** borrowed-readonly — this leg's checkpoint scope (the driver's one `checkpointScopeOf` derivation): the ctx's `checkpointScopeForChildren`, which every delegation lane copies into its children's internals. */
64
64
  checkpointScope: string;
65
+ /** borrowed-readonly — the deployment's host floor as the config doors compiled it (`RunnerDeps.hostFloor`): the ctx's `hostFloor`, absent when none is declared. */
66
+ hostFloor: import("../host-floor.js").HostFloor | undefined;
65
67
  /** borrowed-readonly — the deployment seats: `autoMode.denialLimit` (the rebuilt trackers' bounds), `memoryScopeAdmission` /
66
68
  * `deploymentMemoryScopes` / `compliancePostureResolver` (the governed-provenance bit), `onError` (the screening-face crash
67
69
  * lane), `onNotice` (the stop seat's notice), `executionEnv` (the hook-env identity predicate), `delegationEntryCaps` (resolved
@@ -109,8 +111,8 @@ export interface PrepareInheritedGateInput {
109
111
  mountsCallerTool: (tool: ToolSpec) => boolean;
110
112
  /** borrowed-readonly — the ctx's `mountedMcp` seat: the MCP surface the run mounts right now (call-time; the roster is minted after this phase). Present iff the run declared a server. */
111
113
  mountedMcp?: () => import("../mounted-mcp.js").MountedMcp;
112
- /** borrowed-readonly — the resolved prompt profile (ctx seat). */
113
- promptProfile: ToolExecuteContext["promptProfile"];
114
+ /** borrowed-readonly — the task-level lean switch (ctx seat; absent ⇒ no key). */
115
+ promptLean: ToolExecuteContext["promptLean"];
114
116
  /** borrowed-readonly — the resolved interaction posture (ctx seat; absent ⇒ no key). */
115
117
  resolvedInteractionPosture: ToolExecuteContext["interactionPosture"];
116
118
  /** borrowed-readonly — the task's own permission-mode key, screened and snapshotted before the first await (undefined =
@@ -160,7 +162,8 @@ export interface PrepareInheritedGateInput {
160
162
  /** borrowed-readonly — LATE-BOUND: the per-principal entitlements the caps phase resolves after this one; read only inside
161
163
  * `inheritedGateForChildren` (the two mandate tests), at spawn time. */
162
164
  runtimeCaps: () => RuntimeCaps | undefined;
163
- /** borrowed-readonly — the leg's mods bus: the chain assembly mints this leg's screening entry over its `classic.PreToolUse` chain. */
165
+ /** borrowed-readonly — what the leg hands its descendants of its mods bus (`LegMods.handedDown`: without the skills' own
166
+ * registrations): the chain assembly mints this leg's screening entry over its `classic.PreToolUse` chain. */
164
167
  modBus: LegModBus;
165
168
  /** borrowed-readonly — this leg's chain identity as its admission recorded it (`chainOfBus`) — the installation identity's chain term. */
166
169
  ownModChain: readonly ModChainLink[];
@@ -1,3 +1,4 @@
1
+ import { principalNameOf } from "../principal-name.js";
1
2
  import { forkGovernanceDenial, resolveDelegationEntryCaps } from "../../agents/subagent.js";
2
3
  import { isLiveQuestionFace } from "../ask-question.js";
3
4
  import { parentSpecSeatOf } from "../parent-spec-seat.js";
@@ -16,7 +17,7 @@ import { frozenSkillGrants } from "../skill-grant.js";
16
17
  import { attachRebuiltDenialTrackers, createDenialLimitStop } from "./denial-limit-arms.js";
17
18
  import { valveLeaves } from "../../agents/tool-filter.js";
18
19
  export function prepareInheritedGate(input) {
19
- const { spec, deps, askSeat, internals, resume, sessions, sessionId, runId, hostTaskId, taskRootFinal, executionEnv, ownedEnv, lockedPreflight, pathRuleAnchors, toolFaceSnapshot, mountsCallerTool, promptProfile, resolvedInteractionPosture, permissionModeSeat, handsEnabled, reportUsage, harnessRef, skillGrants, forwardEvent, subagentRetain, worktreeIsolation, requestReview, requestStopAfterTurn, enterPlanMode, reminderMark, reminderDisclosureCounts, fileHistoryEnabled, historyScope, historyRoot, historyFs, abortRun } = input;
20
+ const { spec, deps, askSeat, internals, resume, sessions, sessionId, runId, hostTaskId, taskRootFinal, executionEnv, ownedEnv, lockedPreflight, pathRuleAnchors, toolFaceSnapshot, mountsCallerTool, promptLean, resolvedInteractionPosture, permissionModeSeat, handsEnabled, reportUsage, harnessRef, skillGrants, forwardEvent, subagentRetain, worktreeIsolation, requestReview, requestStopAfterTurn, enterPlanMode, reminderMark, reminderDisclosureCounts, fileHistoryEnabled, historyScope, historyRoot, historyFs, abortRun } = input;
20
21
  const liveInheritedGate = internals?.inheritedGate;
21
22
  const seedInheritedGate = resume?.seed.inheritedGate;
22
23
  const inheritedAncestorRules = (() => {
@@ -221,7 +222,7 @@ export function prepareInheritedGate(input) {
221
222
  deferTools: toolFaceSnapshot.defer,
222
223
  alwaysLoadTools: toolFaceSnapshot.alwaysLoad,
223
224
  ...(toolFaceSnapshot.restoreGated !== undefined ? { restoreGatedTools: toolFaceSnapshot.restoreGated } : {}),
224
- promptProfile,
225
+ ...(promptLean !== undefined ? { promptLean } : {}),
225
226
  ...(spec.memoryPersistenceCapable !== undefined ? { memoryPersistenceCapable: spec.memoryPersistenceCapable } : {}),
226
227
  get memoryCaptureOptedOut() {
227
228
  return input.memoryEngineSession()?.captureOptOut?.optedOut() ?? false;
@@ -238,6 +239,7 @@ export function prepareInheritedGate(input) {
238
239
  },
239
240
  getApiKeyAndHeaders: spec.getApiKeyAndHeaders,
240
241
  parentCwd: taskRootFinal,
242
+ ...(input.hostFloor !== undefined ? { hostFloor: input.hostFloor } : {}),
241
243
  ...(fileHistoryEnabled ? { fileHistoryLineage: { scope: historyScope, root: historyRoot, fs: historyFs } } : {}),
242
244
  reminderMark,
243
245
  reminderDisclosureCounts,
@@ -264,7 +266,7 @@ export function prepareInheritedGate(input) {
264
266
  ...(sessions.fork !== undefined
265
267
  ? {
266
268
  hostSessionFork: async () => {
267
- const forked = (await sessions.fork(sessionId, spec.principal ?? null)) ?? null;
269
+ const forked = (await sessions.fork(sessionId, principalNameOf(spec.principal) ?? null)) ?? null;
268
270
  if (forked === null)
269
271
  return null;
270
272
  return {
@@ -7,7 +7,7 @@ import { deliverEngineNotice } from "../types.js";
7
7
  import { inlineUntrusted } from "../untrusted-text.js";
8
8
  import { fileArgPath } from "../tool-registry.js";
9
9
  import { RosterBuilder } from "../tool-roster.js";
10
- import { isNotStartedDelegationResult } from "../../agents/subagent.js";
10
+ import { isNotStartedDelegationResult } from "../delegation-not-started.js";
11
11
  import { thrownText } from "../thrown-value.js";
12
12
  export function prepareMemoryEngineSession(input) {
13
13
  const { memoryEngineSession, internals, memoryDelegationEvidence, externalContentTargetActive, lockedPreflight, mountedMcp, sessionId, runId, deps, provenanceForChildrenRef, delegationSettlementRef, spec, envHandToolNames, roster, contentOriginWrapRef } = input;
@@ -102,6 +102,8 @@ export interface PrepareParkAskInput {
102
102
  handsRoot: string | undefined;
103
103
  /** borrowed-readonly — the live gate's target-reading stamp ({@link import("./prepare-ask-lane.js").PrepareAskLaneInput.stampCallTarget}). */
104
104
  stampCallTarget: CallTargetStamp | undefined;
105
+ /** borrowed-readonly — where the leg's shell read station found a judged call's reads land (the approval object's targets). */
106
+ shellReadLandings: import("../../tools/fs/shell-read-check.js").ShellReadLandings | undefined;
105
107
  /** borrowed-readonly — the SAME seat the live gate stamps from ({@link import("./prepare-ask-lane.js").PrepareAskLaneInput.advertisedWritableDirs}): a parked call's projection re-adjudication asks one question about one call, so it must ask it against the same admitted list. Read at park time, not written here. */
106
108
  advertisedWritableDirs: Pick<AdvertisedWritableDirs, "roots"> | undefined;
107
109
  /** borrowed-readonly — the leg's ONE exempt root, the SAME list the live gate stamps ({@link import("./prepare-ask-lane.js").PrepareAskLaneInput.exemptRoots}). */
@@ -2,7 +2,7 @@ import { callTargetReadingOf } from "../effective-path-target.js";
2
2
  import { approvalTargetsOf } from "../approval-object.js";
3
3
  import { uuidv7 } from "../../engine/session/uuid.js";
4
4
  import { Value } from "typebox/value";
5
- import { classifyQuestionOutcome, validateAskQuestions } from "../ask-question.js";
5
+ import { classifyQuestionOutcome, isEngineQuestionFace, validateAskQuestions } from "../ask-question.js";
6
6
  import { hasBackgroundShell, sweepBackgroundShells, sweepRunBoundaryBackgroundShells } from "../background-shell.js";
7
7
  import { boundInputHashOf, exactBoundInputHashOf } from "../canonical-json.js";
8
8
  import { buildRiskDescriptor, debitLedger, encodeAtFidelity, mintCheckpointId, mintCheckpointToken, resolveDeclaredFidelity, } from "../checkpoint-store.js";
@@ -17,7 +17,7 @@ import { raceAbort, raceSettlementAgainstSignal } from "./abort-race.js";
17
17
  import { CONTENT_ASK_BINDING_CAP } from "./content-ask-bindings.js";
18
18
  import { DEFAULT_UNATTENDED_APPROVAL_TTL_MS, publishCommittedSuspend, sanitizedTtlMs } from "./park-commit.js";
19
19
  import { remoteEnvFailureNote } from "./remote-env-retry.js";
20
- import { approvalCardMemberOf, callFaceSeat, engineCardOf, parkedToolIdentity, parkedToolFace } from "../tool-roster.js";
20
+ import { approvalCardMemberOf, callFaceSeat, parkedToolIdentity, parkedToolFace } from "../tool-roster.js";
21
21
  import { seatOf } from "../tool-name-readings.js";
22
22
  class ParkRefusal extends Error {
23
23
  constructor(message, options) {
@@ -29,7 +29,7 @@ const wordlessDemand = (toolName) => {
29
29
  throw new Error(`a real-approval demand for "${toolName}" reached the park with no origin word — the origin stamp precedes every park`);
30
30
  };
31
31
  export function prepareParkAsk(input) {
32
- const { askLane, saga, spec, deps, sessionId, checkpointStore, checkpointScope, toolRosterDeltas, parkLaneArmed, contentAskRoutable, liveQuestionFace, mountedQuestionTool, contentAskBindings, lateStrandedAnswers, discloseStrandedAnswers, onAsk, runtimeCaps, inheritedUnavailableAsks, basePolicyForResumeEdit, budgetSnapshot, handsCwdRef, handsRoot, stampCallTarget, advertisedWritableDirs, exemptRoots, offloadStore, ownedEnv, incompleteSuspendAdapter, session, sessions, suspendChainBase, maxSuspends, remoteEnvFailures, shellGatedTools, irreversibilityTier, toolMarkSources, effectiveShellGate, durableApproval, priorLedger, liveSpendRef, resourceTotal, ruleOffersOf, grantBindingOf, now, humanReviewRef, abortController, harness, pausedRef } = input;
32
+ const { askLane, saga, spec, deps, sessionId, checkpointStore, checkpointScope, toolRosterDeltas, parkLaneArmed, contentAskRoutable, liveQuestionFace, mountedQuestionTool, contentAskBindings, lateStrandedAnswers, discloseStrandedAnswers, onAsk, runtimeCaps, inheritedUnavailableAsks, basePolicyForResumeEdit, budgetSnapshot, handsCwdRef, handsRoot, stampCallTarget, shellReadLandings, advertisedWritableDirs, exemptRoots, offloadStore, ownedEnv, incompleteSuspendAdapter, session, sessions, suspendChainBase, maxSuspends, remoteEnvFailures, shellGatedTools, irreversibilityTier, toolMarkSources, effectiveShellGate, durableApproval, priorLedger, liveSpendRef, resourceTotal, ruleOffersOf, grantBindingOf, now, humanReviewRef, abortController, harness, pausedRef } = input;
33
33
  if (askLane === undefined || saga === undefined)
34
34
  return { parkAsk: undefined };
35
35
  const { composedCallSignal, approvalPreviewOf } = askLane;
@@ -112,7 +112,7 @@ export function prepareParkAsk(input) {
112
112
  };
113
113
  const suspendAsk = parkLaneArmed && checkpointStore !== undefined
114
114
  ? async (req, postHookArgs, safety, liveFaceUnavailable, realApproval, allowRuleShadowed, askDecisionReason, probeReason, probeCause, segmentCoverage, matchedAskRule, probeMandated, carry) => {
115
- const contentAsk = engineCardOf(req) === "question";
115
+ const contentAsk = isEngineQuestionFace(req.face);
116
116
  const syncFirstEligible = contentAsk ? contentAskRoutable(req.toolCallId) : isLiveApproverSeat(onAsk);
117
117
  if (syncFirstEligible &&
118
118
  runtimeCaps?.forceDurableGate !== true &&
@@ -179,7 +179,7 @@ export function prepareParkAsk(input) {
179
179
  return undefined;
180
180
  if (reprojectedRaced.tag === "threw")
181
181
  throw reprojectedRaced.error;
182
- const reprojected = refuseOutOfContractDecision(reprojectedRaced.value);
182
+ const reprojected = refuseOutOfContractDecision(reprojectedRaced.value, { call: req });
183
183
  const filedAsHeld = ownArgs(parkedArgs);
184
184
  const rewroteTheFiledValue = reprojected.updatedInput !== undefined && !(filedAsHeld.ok && samePlainValue(reprojected.updatedInput, filedAsHeld.value));
185
185
  if (reprojected.action === "deny" || rewroteTheFiledValue) {
@@ -188,7 +188,7 @@ export function prepareParkAsk(input) {
188
188
  `refusing to file a row whose executable form nothing adjudicated`);
189
189
  }
190
190
  if (reprojected.action === "ask")
191
- storedShapeFacts = ownedClearanceFacts(reprojected);
191
+ storedShapeFacts = ownedClearanceFacts(reprojected, req);
192
192
  }
193
193
  const rowRealApproval = realApproval ?? (storedShapeFacts?.requiresRealApproval === true ? { origin: carry?.origin ?? wordlessDemand(req.toolName) } : undefined);
194
194
  if (offloadStore && isVolatileOffloadStore(offloadStore) && !offloadStore.isEmpty()) {
@@ -311,7 +311,7 @@ export function prepareParkAsk(input) {
311
311
  toolCallId: req.toolCallId,
312
312
  toolName: req.toolName,
313
313
  ...parkedToolIdentity(toolRosterDeltas.current, req.toolName), ...parkedToolFace(toolRosterDeltas.current, req),
314
- ...approvalTargetsOf(licenseCovers(parkedHash, req.args) ? callTargetReadingOf(req) : undefined),
314
+ ...(licenseCovers(parkedHash, req.args) ? approvalTargetsOf(callTargetReadingOf(req), shellReadLandings?.(req.toolCallId)) : {}),
315
315
  args: parkedArgs,
316
316
  ...(() => {
317
317
  const p = approvalPreviewOf(req.toolName, parkedArgs);
@@ -6,8 +6,8 @@
6
6
  * inherited-unavailable marker channel, the grant record, the sandbox-admission mode's arming and its three
7
7
  * sideband maps, the source-identity and risk-axes factories, the two permission-rule lanes and the rule-offer
8
8
  * factory, the approved-edit re-check, the inherited-constraint wrappers (the same-instance adapter and the true
9
- * wrapper), the rewrite-emitter index and the instrumented chain, the integrity guards, the fold, and the final-form
10
- * re-check that is the effective policy. The advised-names dedupe pair only this section reads moved with it.
9
+ * wrapper), the instrumented chain, the integrity guards, the fold, and the same-instance arbitration refresh that is the
10
+ * effective policy. The advised-names dedupe pair only this section reads moved with it.
11
11
  * The interface is the dependency list the segment had implicitly.
12
12
  *
13
13
  * ASYNC PHASE: the stretch awaits the session-policy store (the task's own rules and each ancestor's live re-read)
@@ -42,7 +42,10 @@ import { type ModeGateSeats, type PermissionModeController } from "../mode-polic
42
42
  import { type InheritedAskGrant } from "./inherited-ask-grants.js";
43
43
  import { createRuleOffersOf, type PermissionRuleLanes } from "./permission-rule-lanes.js";
44
44
  import type { ToolCallLike } from "../tool-registry.js";
45
+ import { type HostFloor } from "../host-floor.js";
45
46
  export interface PreparePolicyChainInput {
47
+ /** borrowed-readonly — the deployment's host floor as the config doors compiled it: the leading narrowing layer when declared. */
48
+ hostFloor: HostFloor | undefined;
46
49
  /** borrowed-readonly — the REBOUND spec. Read: `sessionId` / `principal` (the session-rule read and the lanes' identity),
47
50
  * `durableApproval` / `checkpointStore` (the mandate-park facility test and the sandbox arming's park prerequisites), `taskId` (the late-ask observer's detail),
48
51
  * `tools` (the names the caller mounted, for the name audit). Never mutated. */
@@ -202,7 +205,7 @@ export interface PreparePolicyChainResult {
202
205
  };
203
206
  /** owned — the caller-facing policy layers (the wiring manifest reads their COUNT). */
204
207
  policyLayers: ToolPolicy[];
205
- /** owned — THE effective policy the gate station adjudicates with (the fold plus its final-form re-check), or undefined. */
208
+ /** owned — THE effective policy the gate station adjudicates with (the fold, plus the same-instance arbitration refresh), or undefined. */
206
209
  effectivePolicy: ToolPolicy | undefined;
207
210
  /** borrowed-mutable — the inherited-unavailable marker channel. Writers: the inherited arms here (mark); the gate station
208
211
  * (the lifecycle-end sweep) and the park lane's consumers (delete on consumption). */