@sema-agent/core 7.54.1 → 7.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -1,8 +1,10 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { homedir } from "node:os";
3
3
  import { argsReadFrom, carryArgsReadFrom, withArgsReading } from "./effective-path-target.js";
4
+ import { editRewrittenSentence, readRejudge, rewriteChasedSentence } from "./rewrite-rejudge.js";
4
5
  import { brandPolicyAskClass } from "./ask-class.js";
5
6
  import { decisionAskClassesOf, headlessDenialMessage } from "./ask-origin.js";
7
+ import { attest, attestationOf, isEngineAttestation, mergeAttestation, mintAttestation, withAttestation } from "./engine-attestation.js";
6
8
  import { ownReadRootCandidate, readRootGrantSeat } from "./read-root-grant-screen.js";
7
9
  import { decidersNote, settledByDecider } from "./gate-outcome.js";
8
10
  import { unjudgedAllowRefused } from "./real-approval.js";
@@ -19,7 +21,9 @@ import { egressText, egressThrownText } from "./untrusted-egress.js";
19
21
  import { assertNoRetiredKeys, assertNoRetiredToolPolicyKeys, RETIRED_DECISION_MEMBERS, RETIRED_TOOL_POLICY_KEYS } from "./retired-keys.js";
20
22
  import { DECISION_MEMBER_ARMS, isEngineRefusal, nestedRecordsOf, receiveContract, receiveNestedRecords, refusedOutOfContract, screenContractValues } from "./decision-receipt.js";
21
23
  export { isEngineRefusal } from "./decision-receipt.js";
22
- import { isNamespacedCoveringRuleName, namespacedRuleNameCovers } from "./permission-rules.js";
24
+ import { isCoveringRuleName, ruleNameCovers } from "./namespaced-rule-name.js";
25
+ import { ruleContentOf } from "./permission-rule-model.js";
26
+ import { grantWildcardRefusalOf } from "./tool-name-aliases.js";
23
27
  import { ruleSpellingOf } from "./permission-rule-syntax.js";
24
28
  import { protocolOf } from "./protocol-table.js";
25
29
  import { anchorSpelling, isAbsoluteForFamily, normalizeAbsPathLexically, pathFamilyOf, writeTargetPath } from "../tools/fs/safety.js";
@@ -35,75 +39,7 @@ export function exemptRootsSeat(exemptRoots) {
35
39
  function settledByNobody(kind) {
36
40
  return { kind, who: { party: "none" }, when: Date.now() };
37
41
  }
38
- const ATTESTATION_GROUP_OF = {
39
- settlement: "answer",
40
- origin: "answer",
41
- classes: "answer",
42
- inputDigest: "answer",
43
- classifierCause: "classifierCause",
44
- classifierRound: "classifierRound",
45
- unresolvableCause: "unresolvableCause",
46
- foldedClasses: "foldedClasses",
47
- pathDenial: "pathDenial",
48
- bindingRefusal: "bindingRefusal",
49
- };
50
- const ATTESTATION_MEMBERS = Object.keys(ATTESTATION_GROUP_OF);
51
- const groupLead = (g) => ATTESTATION_MEMBERS.find((k) => ATTESTATION_GROUP_OF[k] === g);
52
- const ENGINE_ATTESTATIONS = new WeakSet();
53
- function detachedMember(v) {
54
- if (Array.isArray(v))
55
- return Object.freeze([...v]);
56
- if (typeof v !== "object" || v === null)
57
- return v;
58
- return Object.freeze(Object.fromEntries(Object.entries(v).map(([k, x]) => [k, typeof x === "object" && x !== null ? Object.freeze(Array.isArray(x) ? [...x] : { ...x }) : x])));
59
- }
60
- export function mintAttestation(call, members) {
61
- const record = { toolCallId: call.toolCallId, toolName: call.toolName };
62
- for (const k of ATTESTATION_MEMBERS)
63
- if (members[k] !== undefined)
64
- record[k] = detachedMember(members[k]);
65
- const minted = Object.freeze(record);
66
- ENGINE_ATTESTATIONS.add(minted);
67
- return minted;
68
- }
69
- export function isEngineAttestation(v) {
70
- return typeof v === "object" && v !== null && ENGINE_ATTESTATIONS.has(v);
71
- }
72
- const boundTo = (r, call) => isEngineAttestation(r) && r.toolCallId === call.toolCallId && r.toolName === call.toolName ? r : undefined;
73
- export function attestationOf(d, call) {
74
- if (typeof d !== "object" || d === null)
75
- return undefined;
76
- return boundTo(Object.getOwnPropertyDescriptor(d, "attestation")?.value, call);
77
- }
78
- export function mergeAttestation(call, earlier, later, scope = "all") {
79
- const a = boundTo(earlier, call);
80
- const b = boundTo(later, call);
81
- if (a === undefined)
82
- return b;
83
- const members = {};
84
- if (b !== undefined)
85
- for (const k of ATTESTATION_MEMBERS)
86
- if (b[k] !== undefined)
87
- members[k] = b[k];
88
- let filled = false;
89
- for (const g of new Set(Object.values(ATTESTATION_GROUP_OF))) {
90
- if ((scope === "answer" && g !== "answer") || members[groupLead(g)] !== undefined || a[groupLead(g)] === undefined)
91
- continue;
92
- for (const k of ATTESTATION_MEMBERS)
93
- if (ATTESTATION_GROUP_OF[k] === g && a[k] !== undefined)
94
- members[k] = a[k];
95
- filled = true;
96
- }
97
- if (!filled)
98
- return b;
99
- return mintAttestation(call, members);
100
- }
101
- export function attest(d, call, members) {
102
- return withAttestation(d, mergeAttestation(call, attestationOf(d, call), mintAttestation(call, members)));
103
- }
104
- export function withAttestation(d, record) {
105
- return record === undefined ? d : { ...d, attestation: record };
106
- }
42
+ export { attest, attestationOf, isEngineAttestation, mergeAttestation, mintAttestation, withAttestation } from "./engine-attestation.js";
107
43
  const UNASKED_SEAT_SETTLEMENTS = new Set(["task_aborted", "no_approver"]);
108
44
  function seatNeverAsked(settlement) {
109
45
  return settlement !== undefined && UNASKED_SEAT_SETTLEMENTS.has(settlement.kind);
@@ -194,11 +130,11 @@ export function toolPolicyWriteGuardRows(policies) {
194
130
  return undefined;
195
131
  return async (at) => (await Promise.all(sources.map((rowsOf) => rowsOf(at)))).flat();
196
132
  }
197
- export function namespacedCoveringEntries(entries) {
198
- return (entries ?? []).filter(isNamespacedCoveringRuleName);
133
+ export function coveringRuleEntries(entries, behavior) {
134
+ return (entries ?? []).filter((entry) => isCoveringRuleName(entry, behavior));
199
135
  }
200
- export function namespacedCoveringHit(covering, call) {
201
- return covering.length > 0 && nameListHolds({ has: (name) => covering.some((e) => namespacedRuleNameCovers(e, name)) }, call);
136
+ export function coveringRuleHit(covering, call) {
137
+ return covering.length > 0 && nameListHolds({ has: (name) => covering.some((e) => ruleNameCovers(e, name)) }, call);
202
138
  }
203
139
  export function projectionToolNames(c) {
204
140
  return c.kind === "shell_command" ? { member: "tools", list: c.tools } : { member: "names", list: c.names };
@@ -207,13 +143,13 @@ export function checkToolPolicyProjection(projection, req) {
207
143
  const listed = (list) => heldBy("policy.projectionReplay", { has: (n) => list.includes(n) }, req);
208
144
  for (const c of projection.components) {
209
145
  if (c.kind === "tool_deny") {
210
- if (listed(c.names) || namespacedCoveringHit(namespacedCoveringEntries(c.names), req)) {
146
+ if (listed(c.names) || coveringRuleHit(coveringRuleEntries(c.names, "deny"), req)) {
211
147
  return { action: "deny", message: `tool "${req.toolName}" is denied by a frozen inherited policy projection` };
212
148
  }
213
149
  continue;
214
150
  }
215
151
  if (c.kind === "tool_allowlist") {
216
- if (!listed(c.names) && !namespacedCoveringHit(namespacedCoveringEntries(c.names), req)) {
152
+ if (!listed(c.names) && !coveringRuleHit(coveringRuleEntries(c.names, "allow"), req)) {
217
153
  return { action: "deny", message: `tool "${req.toolName}" is not in a frozen inherited policy projection's allowlist` };
218
154
  }
219
155
  continue;
@@ -288,6 +224,12 @@ const HOOK_SEAM_UNREAD = new Set(["decisionReason"]);
288
224
  const HOOK_SEAM_OPTIONAL = new Set(["action"]);
289
225
  const HOOK_RECEIPTS = new WeakSet();
290
226
  const ENGINE_RECEIPTS = new WeakSet();
227
+ function askOfAnotherCall(d, call) {
228
+ if (call === undefined || d.action !== "ask" || d.attestation === undefined || attestationOf(d, call) !== undefined)
229
+ return undefined;
230
+ return refusedOutOfContract(`a permission decision asks with the engine's record of another call — what the engine found about that call's question is not this call's; ` +
231
+ `a policy answers the call it is asked about (a cached or relayed ask is asked again); denied fail-closed rather than reading the findings as absent`);
232
+ }
291
233
  export function refuseOutOfContractDecision(d, opts) {
292
234
  const hookSeam = opts?.reasonIsNonInput === true;
293
235
  if (hookSeam && (d === null || d === undefined || Object.is(d, false)))
@@ -296,7 +238,7 @@ export function refuseOutOfContractDecision(d, opts) {
296
238
  return refusedOutOfContract(`a permission decision's "action" is absent (the decision is ${d === null || d === undefined ? String(d) : `a ${typeof d}`}, not an object) — the closed set is allow/deny/ask; denied fail-closed rather than reading a word outside it as an allow`);
297
239
  }
298
240
  if ((hookSeam ? HOOK_RECEIPTS : ENGINE_RECEIPTS).has(d) || isEngineRefusal(d))
299
- return d;
241
+ return askOfAnotherCall(d, opts?.call) ?? d;
300
242
  const decision = receiveContract(d, hookSeam ? HOOK_RESULT_MEMBERS : DECISION_MEMBERS, "", RETIRED_DECISION_MEMBERS);
301
243
  if (decision.kind === "refused")
302
244
  return decision.refused;
@@ -311,13 +253,9 @@ export function refuseOutOfContractDecision(d, opts) {
311
253
  : `a permission decision carries an "attestation" the engine did not mint — the member is an engine record (who settled the call, ` +
312
254
  `which question it answered); denied fail-closed rather than reading a caller's value as a settlement`);
313
255
  }
314
- const folded = contract.foldedAskClasses;
315
- const signed = attestation?.foldedClasses;
316
- if (folded !== undefined && !(signed !== undefined && Array.isArray(folded) && signed.length === folded.length && signed.every((c, i) => c === folded[i]))) {
317
- return refusedOutOfContract(`a permission decision carries "foldedAskClasses" that no policy fold of the engine attested on it — the member is ` +
318
- `engine-written (combinePolicies records the classes of the asks it collapsed); denied fail-closed rather than letting a ` +
319
- `class no station judged reach the class derivation`);
320
- }
256
+ const foreign = askOfAnotherCall({ action: contract.action, attestation }, opts?.call);
257
+ if (foreign !== undefined)
258
+ return foreign;
321
259
  if (hookSeam && contract.additionalContext !== undefined && typeof contract.additionalContext !== "string") {
322
260
  return refusedOutOfContract(`a PreToolUse hook result's "additionalContext" is not a string — the member is the text appended for the model; denied fail-closed rather than rendering a value this layer cannot classify`);
323
261
  }
@@ -375,81 +313,75 @@ export function toolPolicyNameSets(p) {
375
313
  const sets = p?.nameSets;
376
314
  return Array.isArray(sets) ? sets : [];
377
315
  }
378
- export function createAllowDenyPolicy(opts) {
379
- assertNoRetiredKeys(opts, RETIRED_ALLOW_DENY_POLICY_OPTIONS, "createAllowDenyPolicy");
380
- const invalid = [];
381
- const screen = (entries, list) => {
382
- if (entries === undefined)
383
- return undefined;
384
- const kept = [];
385
- const seen = new Set();
386
- for (const entry of entries) {
387
- const ns = protocolOf(entry);
388
- if (ns !== undefined) {
389
- const suffix = entry.slice(ns.prefix.length);
390
- const sep = suffix.indexOf("__");
391
- const malformed = suffix.length === 0 || sep === 0 || (sep > 0 && suffix.length === sep + 2);
392
- if (malformed) {
393
- const family = ns.id.toUpperCase();
394
- const lesson = `a malformed ${family} tool name (empty peer or tool segment) — it can never match any mounted tool. ` +
395
- `Use \`${ns.prefix}<peer>\` for every tool of a peer, or \`${ns.prefix}<peer>__<tool>\` for one tool.`;
396
- invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
397
- continue;
398
- }
399
- }
400
- const spelled = ruleSpellingOf(entry);
401
- if (spelled === undefined) {
402
- const lesson = `a spelling no tool name can have — the rule syntax reads no tool name in it, so a name set never names a tool by it. Fix the entry.`;
316
+ function screenToolNameList(entries, list, behavior, invalid) {
317
+ if (entries === undefined)
318
+ return undefined;
319
+ const kept = [];
320
+ const seen = new Set();
321
+ for (const entry of entries) {
322
+ const ns = protocolOf(entry);
323
+ if (ns !== undefined) {
324
+ const suffix = entry.slice(ns.prefix.length);
325
+ const sep = suffix.indexOf("__");
326
+ if (suffix.length === 0 || sep === 0 || (sep > 0 && suffix.length === sep + 2)) {
327
+ const lesson = `a malformed ${ns.id.toUpperCase()} tool name (empty peer or tool segment) — it can never match any mounted tool. ` +
328
+ `Use \`${ns.prefix}<peer>\` for every tool of a peer, or \`${ns.prefix}<peer>__<tool>\` for one tool.`;
403
329
  invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
404
330
  continue;
405
331
  }
406
- if (spelled.ruleContent === undefined) {
407
- if (spelled.toolName === "*" && list === "deny") {
408
- const lesson = `the wildcard — \`*\` names no tool, and a deny entry reaches the tool it names, so this one would be kept and never match ` +
409
- `(a deny that reads protective and denies nothing). Name the tools to deny; to leave a run no tools, write an empty allow list.`;
410
- invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
411
- continue;
412
- }
413
- if (!seen.has(spelled.toolName)) {
414
- seen.add(spelled.toolName);
415
- kept.push(spelled.toolName);
416
- }
417
- continue;
418
- }
332
+ }
333
+ const spelled = ruleSpellingOf(entry);
334
+ if (spelled === undefined) {
335
+ const lesson = `a spelling no tool name can have — the rule syntax reads no tool name in it, so a name set never names a tool by it. Fix the entry.`;
336
+ invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
337
+ continue;
338
+ }
339
+ if (ruleContentOf(spelled) !== undefined) {
419
340
  const lesson = `a rule CONTENT form, not a tool name — a name set matches raw tool names, so this entry ` +
420
341
  `can never match any mounted tool (in an allow list it removes the tool entirely). Use the tool NAME here, ` +
421
342
  `and route the narrowing through the lane that speaks this grammar: parameter rules via ` +
422
343
  `createPermissionRulePolicy, Bash command prefixes via the persisted allow-rule lane.`;
423
344
  invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
345
+ continue;
424
346
  }
425
- return kept;
426
- };
427
- const screenedAllow = screen(opts.allow, "allow");
428
- const screenedDeny = screen(opts.deny, "deny");
429
- if (invalid.length > 0) {
430
- if ((opts.onInvalidName ?? "throw") === "throw") {
431
- const byLesson = new Map();
432
- for (const i of invalid) {
433
- const group = byLesson.get(i.lesson) ?? [];
434
- group.push({ entry: i.entry, list: i.list });
435
- byLesson.set(i.lesson, group);
436
- }
437
- const e = new Error(`createAllowDenyPolicy: ${invalid.length} entr${invalid.length === 1 ? "y is" : "ies are"} not tool name(s):\n` +
438
- [...byLesson.entries()]
439
- .map(([lesson, group]) => ` Each of the following is ${lesson}\n` + group.map((g) => ` [${g.list}] "${g.entry}"`).join("\n"))
440
- .join("\n"));
441
- e.code = "config.invalid_tool_name_set";
442
- e.issues = invalid;
443
- throw e;
347
+ const wild = behavior === "allow" ? grantWildcardRefusalOf(spelled.toolName) : undefined;
348
+ if (wild !== undefined) {
349
+ invalid.push({ entry, list, message: `"${entry}": ${wild}`, lesson: wild });
350
+ continue;
351
+ }
352
+ if (!seen.has(spelled.toolName)) {
353
+ seen.add(spelled.toolName);
354
+ kept.push(spelled.toolName);
444
355
  }
356
+ }
357
+ return kept;
358
+ }
359
+ function toolNameSetRefusal(who, invalid) {
360
+ const byLesson = new Map();
361
+ for (const i of invalid)
362
+ byLesson.set(i.lesson, [...(byLesson.get(i.lesson) ?? []), { entry: i.entry, list: i.list }]);
363
+ const e = new Error(`${who}: ${invalid.length} entr${invalid.length === 1 ? "y is" : "ies are"} not tool name(s):\n` +
364
+ [...byLesson.entries()].map(([lesson, group]) => ` Each of the following is ${lesson}\n` + group.map((g) => ` [${g.list}] "${g.entry}"`).join("\n")).join("\n"));
365
+ e.code = "config.invalid_tool_name_set";
366
+ e.issues = invalid;
367
+ return e;
368
+ }
369
+ export function createAllowDenyPolicy(opts) {
370
+ assertNoRetiredKeys(opts, RETIRED_ALLOW_DENY_POLICY_OPTIONS, "createAllowDenyPolicy");
371
+ const invalid = [];
372
+ const screenedAllow = screenToolNameList(opts.allow, "allow", "allow", invalid);
373
+ const screenedDeny = screenToolNameList(opts.deny, "deny", "deny", invalid);
374
+ if (invalid.length > 0) {
375
+ if ((opts.onInvalidName ?? "throw") === "throw")
376
+ throw toolNameSetRefusal("createAllowDenyPolicy", invalid);
445
377
  for (const issue of invalid)
446
378
  opts.onInvalidNameIssue?.(issue);
447
379
  }
448
380
  opts = { ...opts, ...(screenedAllow ? { allow: screenedAllow } : {}), ...(screenedDeny ? { deny: screenedDeny } : {}) };
449
381
  const allow = opts.allow ? new Set(opts.allow) : undefined;
450
382
  const deny = new Set(opts.deny ?? []);
451
- const denyCovering = namespacedCoveringEntries(opts.deny);
452
- const allowCovering = namespacedCoveringEntries(opts.allow);
383
+ const denyCovering = coveringRuleEntries(opts.deny, "deny");
384
+ const allowCovering = coveringRuleEntries(opts.allow, "allow");
453
385
  return {
454
386
  projection: {
455
387
  components: [
@@ -460,10 +392,10 @@ export function createAllowDenyPolicy(opts) {
460
392
  },
461
393
  nameSets: [{ ...(opts.allow ? { allow: [...opts.allow] } : {}), ...(opts.deny ? { deny: [...opts.deny] } : {}) }],
462
394
  check(req) {
463
- if (nameListHolds(deny, req) || namespacedCoveringHit(denyCovering, req)) {
395
+ if (nameListHolds(deny, req) || coveringRuleHit(denyCovering, req)) {
464
396
  return { action: "deny", message: `tool "${req.toolName}" is denied by policy` };
465
397
  }
466
- if (allow && !nameListHolds(allow, req) && !namespacedCoveringHit(allowCovering, req)) {
398
+ if (allow && !nameListHolds(allow, req) && !coveringRuleHit(allowCovering, req)) {
467
399
  return { action: "deny", message: `tool "${req.toolName}" is not in the allowlist` };
468
400
  }
469
401
  return ALLOW;
@@ -480,12 +412,21 @@ export function createApprovalPolicy(opts) {
480
412
  if (opts.approvalTimeoutMs !== undefined && opts.approvalTimeoutMs > 2_147_483_647) {
481
413
  throw new Error(`createApprovalPolicy: approvalTimeoutMs must not exceed 2147483647ms (~24.8 days) (got ${opts.approvalTimeoutMs}) — a host timer truncates a larger delay and fires immediately, denying every request at once; omit it to wait indefinitely`);
482
414
  }
415
+ const invalid = [];
416
+ const requireApproval = screenToolNameList(opts.requireApproval, "requireApproval", "ask", invalid) ?? [];
417
+ const denied = screenToolNameList(opts.deny, "deny", "deny", invalid);
418
+ const autoAllow = screenToolNameList(opts.autoAllow, "autoAllow", "allow", invalid);
419
+ if (opts.denyByDefault === true)
420
+ screenToolNameList(requireApproval, "requireApproval", "allow", invalid);
421
+ if (invalid.length > 0)
422
+ throw toolNameSetRefusal("createApprovalPolicy", invalid);
423
+ opts = { ...opts, requireApproval, ...(denied !== undefined ? { deny: denied } : {}), ...(autoAllow !== undefined ? { autoAllow } : {}) };
483
424
  const need = new Set(opts.requireApproval);
484
425
  const deny = new Set(opts.deny ?? []);
485
426
  const auto = new Set(opts.autoAllow ?? []);
486
- const needCovering = namespacedCoveringEntries(opts.requireApproval);
487
- const denyCovering = namespacedCoveringEntries(opts.deny);
488
- const autoCovering = namespacedCoveringEntries(opts.autoAllow);
427
+ const needCovering = coveringRuleEntries(opts.requireApproval, "ask");
428
+ const denyCovering = coveringRuleEntries(opts.deny, "deny");
429
+ const autoCovering = coveringRuleEntries(opts.autoAllow, "allow");
489
430
  return {
490
431
  projection: {
491
432
  components: [
@@ -502,10 +443,10 @@ export function createApprovalPolicy(opts) {
502
443
  },
503
444
  ],
504
445
  async check(req, signal) {
505
- if (nameListHolds(deny, req) || namespacedCoveringHit(denyCovering, req)) {
446
+ if (nameListHolds(deny, req) || coveringRuleHit(denyCovering, req)) {
506
447
  return { action: "deny", message: `tool "${req.toolName}" is denied by policy` };
507
448
  }
508
- if (nameListHolds(need, req) || namespacedCoveringHit(needCovering, req)) {
449
+ if (nameListHolds(need, req) || coveringRuleHit(needCovering, req)) {
509
450
  const attestOver = (inputDigest) => (d, settlement, bindingRefusal) => ({ ...d, attestation: mintAttestation(req, { settlement, origin: "policy", ...(inputDigest !== undefined ? { inputDigest } : {}), ...(bindingRefusal !== undefined ? { bindingRefusal } : {}) }) });
510
451
  const unasked = unaskedSeatAnswer(req, signal, { aborted: `approval aborted for "${req.toolName}" (run or turn interrupted)`, unreachable: `approval for "${req.toolName}" was not requested: nobody can be asked about this call` }, "policy");
511
452
  if (unasked !== undefined)
@@ -568,7 +509,7 @@ export function createApprovalPolicy(opts) {
568
509
  }
569
510
  return attest({ action: "deny", message: `approval denied for "${req.toolName}"` }, settledByDecider("person", "refused", undefined));
570
511
  }
571
- if (nameListHolds(auto, req) || namespacedCoveringHit(autoCovering, req))
512
+ if (nameListHolds(auto, req) || coveringRuleHit(autoCovering, req))
572
513
  return ALLOW;
573
514
  if (opts.denyByDefault) {
574
515
  return { action: "deny", message: `tool "${req.toolName}" requires explicit allow` };
@@ -612,7 +553,6 @@ export function combinePolicies(...policies) {
612
553
  let asked;
613
554
  let current = Object.freeze({ ...req });
614
555
  let rewrite;
615
- let records;
616
556
  let ruleAskText;
617
557
  let probeMandateSeen = false;
618
558
  let mandateSeen = false;
@@ -620,25 +560,64 @@ export function combinePolicies(...policies) {
620
560
  let noRulingSeen;
621
561
  let authoredBySeen = false;
622
562
  const contributors = [];
623
- const settleDeny = (d) => {
563
+ const decisions = [];
564
+ const recordsExcept = (at) => decisions.reduce((acc, d, j) => (j !== at && d?.action === "allow" && d.attestation !== undefined ? mergeAttestation(req, acc, d.attestation) : acc), undefined);
565
+ const settleDeny = (d, at) => {
624
566
  const out = rewrite !== undefined ? refusalOf(d, current.args) : d;
567
+ const records = recordsExcept(at);
625
568
  if (records === undefined)
626
569
  return out;
627
570
  return { ...out, attestation: mergeAttestation(req, records, d.attestation) };
628
571
  };
629
572
  let seatDeny;
630
- for (const p of policies) {
631
- const d = refuseOutOfContractDecision(await p.check(current, signal));
573
+ const denied = (d, at) => {
574
+ decisions[at] = undefined;
575
+ if (!seatNeverAsked(attestationOf(d, current)?.settlement))
576
+ return settleDeny(d, at);
577
+ seatDeny ??= settleDeny(d, at);
578
+ return undefined;
579
+ };
580
+ let emitter = -1;
581
+ let personWrote = false;
582
+ for (const [at, p] of policies.entries()) {
583
+ const d = refuseOutOfContractDecision(await p.check(current, signal), { call: req });
632
584
  if (d.action === "deny") {
633
- if (!seatNeverAsked(attestationOf(d, current)?.settlement))
634
- return settleDeny(d);
635
- seatDeny ??= settleDeny(d);
585
+ const ended = denied(d, at);
586
+ if (ended !== undefined)
587
+ return ended;
636
588
  continue;
637
589
  }
638
- if (d.updatedInput !== undefined) {
590
+ decisions[at] = d;
591
+ if (readRejudge(current, current.args, d).kind === "rewritten") {
592
+ if (personWrote)
593
+ return settleDeny({ action: "deny", message: `${editRewrittenSentence(req.toolName)}, which a later policy layer wrote over a person's edit — denied fail-closed` }, at);
639
594
  current = Object.freeze(await withArgsReading(current, d.updatedInput, signal));
640
595
  rewrite = d;
596
+ emitter = at;
597
+ personWrote = attestationOf(d, current)?.settlement?.who.party === "person" && answeredFor(d, req, current.args);
641
598
  }
599
+ }
600
+ for (let at = 0; at < emitter; at++) {
601
+ const p = policies[at];
602
+ const d = refuseOutOfContractDecision(await p.check(current, signal), { call: req });
603
+ if (d.action === "deny") {
604
+ const ended = denied(d, at);
605
+ if (ended !== undefined)
606
+ return ended;
607
+ continue;
608
+ }
609
+ if (readRejudge(current, current.args, d).kind === "rewritten")
610
+ return settleDeny({ action: "deny", message: rewriteChasedSentence(req.toolName) }, at);
611
+ const { updatedInput: _sameBytes, ...asIs } = d;
612
+ const first = decisions[at];
613
+ decisions[at] = asIs.action === "allow" && first?.action === "allow" && first.attestation !== undefined ? withAttestation(asIs, mergeAttestation(req, first.attestation, asIs.attestation)) : asIs;
614
+ }
615
+ if (seatDeny !== undefined)
616
+ return seatDeny;
617
+ let records;
618
+ for (const d of decisions) {
619
+ if (d === undefined)
620
+ continue;
642
621
  if (d.action === "allow" && d.attestation !== undefined)
643
622
  records = mergeAttestation(req, records, d.attestation);
644
623
  if (d.action === "ask" && (asked === undefined || (d.requiresRealApproval === true && asked.requiresRealApproval !== true))) {
@@ -660,8 +639,6 @@ export function combinePolicies(...policies) {
660
639
  if (d.action === "ask")
661
640
  contributors.push(d);
662
641
  }
663
- if (seatDeny !== undefined)
664
- return seatDeny;
665
642
  if (asked) {
666
643
  const merged = rewrite?.updatedInput;
667
644
  const withRuleAsk = ruleAskText !== undefined && asked.matchedAskRule === undefined ? { ...asked, matchedAskRule: ruleAskText } : asked;
@@ -670,16 +647,15 @@ export function combinePolicies(...policies) {
670
647
  const withFallback = fallbackSeen !== undefined && withMandate.denialLimitFallback === undefined ? { ...withMandate, denialLimitFallback: fallbackSeen, requiresRealApproval: true } : withMandate;
671
648
  const withNoRuling = noRulingSeen !== undefined && withFallback.classifierNoRuling === undefined ? { ...withFallback, classifierNoRuling: noRulingSeen, requiresRealApproval: true } : withFallback;
672
649
  const withAuthor = authoredBySeen && withNoRuling.authoredBy === undefined ? { ...withNoRuling, authoredBy: "deployment" } : withNoRuling;
673
- const folded = new Set(withAuthor.foldedAskClasses ?? []);
650
+ const folded = new Set(attestationOf(asked, req)?.foldedClasses ?? []);
674
651
  for (const c of contributors)
675
652
  if (c !== asked)
676
- for (const k of decisionAskClassesOf(c))
653
+ for (const k of decisionAskClassesOf(c, req))
677
654
  folded.add(k);
678
655
  if (withNoRuling !== withMandate)
679
- for (const k of decisionAskClassesOf(asked))
656
+ for (const k of decisionAskClassesOf(asked, req))
680
657
  folded.add(k);
681
- const withClasses = folded.size > 0 ? { ...withAuthor, foldedAskClasses: [...folded] } : withAuthor;
682
- const out = merged !== undefined ? { ...withClasses, updatedInput: merged } : withClasses;
658
+ const out = merged !== undefined ? { ...withAuthor, updatedInput: merged } : withAuthor;
683
659
  return folded.size > 0 ? attest(out, req, { foldedClasses: [...folded] }) : out;
684
660
  }
685
661
  const allowed = rewrite ?? ALLOW;
@@ -756,17 +732,17 @@ export function createUnverifiableDeletePolicy(opts) {
756
732
  if (typeof command !== "string")
757
733
  return ALLOW;
758
734
  const removal = removalReadingOf(command, req, opts?.removalSeat, safeRoots);
759
- return removal === undefined ? ALLOW : removal.judge(signal).then((found) => (found === undefined ? ALLOW : removalAsk(found.guard, found.text)));
735
+ return removal === undefined ? ALLOW : removal.judge(signal).then((found) => (found === undefined ? ALLOW : removalAsk(req, found.guard, found.text)));
760
736
  },
761
737
  }, "external_authority");
762
738
  }
763
- function removalAsk(guard, text) {
739
+ function removalAsk(req, guard, text) {
764
740
  const messages = {
765
741
  dangerous_delete: `Dangerous removal: ${text}. No permission mode, allow rule or classifier clears this — only a person confirming this call does.`,
766
742
  unverifiable_delete: `Unverifiable recursive delete (fail-closed unless cleared): ${text}. Re-run the delete with the resolved literal path written into the command itself (or assign the variable a literal path in the same command, e.g. \`DIR=/exact/path; rm -rf "$DIR"\`) so the target can be verified.`,
767
- unverifiable_shell_text: `Unverifiable shell text (fail-closed unless cleared): ${text}. Write the text into the command itself (a \`-c\` string, a here-document or a here-string) and the engine reads it as it reads any command.`,
743
+ unverifiable_shell_text: `Unverifiable shell text (fail-closed unless cleared): ${text}.`,
768
744
  };
769
- return { action: "ask", decisionReason: "safety", requiresRealApproval: true, guards: [guard], message: messages[guard] };
745
+ return attest({ action: "ask", decisionReason: "safety", requiresRealApproval: true, message: messages[guard] }, req, { guards: [guard] });
770
746
  }
771
747
  function pathSegments(p) {
772
748
  return p.split(/[\\/]/).filter(Boolean);
@@ -835,16 +811,15 @@ export function createTranscriptIntegrityPolicy(opts) {
835
811
  }
836
812
  return false;
837
813
  };
838
- const askReason = (what) => ({
814
+ const askReason = (req, what) => attest({
839
815
  action: "ask",
840
816
  decisionReason: "safety",
841
817
  requiresRealApproval: true,
842
- guards: ["transcript_write"],
843
818
  message: `Session-transcript write (fail-closed unless cleared): ${what}. Session transcripts (the .jsonl files ` +
844
819
  `under the agent data dir's sessions/ directory) are harness-written session state, not agent working ` +
845
820
  `files — modifying or deleting them tampers with the run's own audit trail. Reading them (ls/cat/grep ` +
846
821
  `as a single simple command) is fine.`,
847
- });
822
+ }, req, { guards: ["transcript_write"] });
848
823
  return brandPolicyAskClass({
849
824
  check(req) {
850
825
  if (shellToolsListHolds(shellTools, req)) {
@@ -858,7 +833,7 @@ export function createTranscriptIntegrityPolicy(opts) {
858
833
  const parsed = parseLeadingCommandName(command);
859
834
  if ("name" in parsed && readAllow.has(parsed.name))
860
835
  return ALLOW;
861
- return askReason("name" in parsed
836
+ return askReason(req, "name" in parsed
862
837
  ? `\`${parsed.name}\` is not a read-only command${cwdInsideProtected ? " and the shell's working directory is inside the transcript directory" : ""}`
863
838
  : cwdInsideProtected
864
839
  ? "the shell's working directory is inside the transcript directory and this is not a single read-only command (fail-closed)"
@@ -868,7 +843,7 @@ export function createTranscriptIntegrityPolicy(opts) {
868
843
  if (writeTarget !== undefined && writeTarget.access !== "read") {
869
844
  const p = writeTargetPath(req);
870
845
  if (typeof p === "string" && inProtectedDir(p, req.cwd)) {
871
- return askReason(`"${p}" is inside the session-transcript directory`);
846
+ return askReason(req, `"${p}" is inside the session-transcript directory`);
872
847
  }
873
848
  }
874
849
  return ALLOW;
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Layer-0 vocabulary: depends on the leaf catalog and the face vocabulary only.
12
12
  */
13
- import { type ToolCallPathTarget, type ToolCatalogEntry, type ToolFamily, type ToolMountTag, type ToolPathAccess } from "./tool-face.js";
13
+ import { type ToolCallPathTarget, type ToolCatalogEntry, type ToolFamily, type ToolHostTarget, type ToolMountTag, type ToolPathAccess } from "./tool-face.js";
14
14
  /** The whole static catalog, one frozen row per definition (design/388 §2.1 `describeToolCatalog()`).
15
15
  * Replaces the retired name-keyed exports `HAND_TOOL_EFFECTS` / `DEFAULT_BUDGET_EXEMPT_TOOLS` /
16
16
  * `COMPACTABLE_TOOLS`: filter this instead (`e.mountedBy.includes("hands")`, `e.face.budgetExempt`,
@@ -68,6 +68,8 @@ export declare function rosterCanPersistMemory(tools: ReadonlyArray<PersistenceP
68
68
  export declare function persistenceCandidateToolNames(): string[];
69
69
  /** A-8 — every definition that names a path target at all (read or write): the file-tool glob lane. */
70
70
  export declare function pathTargetingToolNames(): ReadonlySet<string>;
71
+ /** Every definition that names a host target (the URL its call reaches): the names a host rule is written for. */
72
+ export declare function hostTargetingToolNames(): ReadonlySet<string>;
71
73
  /**
72
74
  * The SHELL FACE: every definition whose `command` argument is a shell command line the command grammar judges (today the two
73
75
  * `Bash` definitions and `Monitor`). A `Bash(<command>)` rule reaches a call that answers to any of these names; the coarse
@@ -117,6 +119,7 @@ export interface ToolCallLike {
117
119
  args: unknown;
118
120
  face?: {
119
121
  pathTarget?: ToolCallPathTarget;
122
+ hostTarget?: ToolHostTarget;
120
123
  names?: readonly string[];
121
124
  } | undefined;
122
125
  }
@@ -165,13 +168,17 @@ export declare function isDeclaredWrite(call: ToolCallLike): boolean;
165
168
  * records nothing (retired spellings in persisted transcripts read the frozen history table at the call site). */
166
169
  export declare function fileOpAccessOf(name: string): ToolPathAccess | undefined;
167
170
  export declare function pathTargetOf(name: string): ToolCatalogEntry["face"]["pathTarget"];
171
+ /** The host target a wire name's catalog definition declares (the URL slot a host rule of that name is read on), the
172
+ * {@link pathTargetOf} of the host face: the first definition under the name that declares one. */
173
+ export declare function hostTargetOf(name: string): ToolCatalogEntry["face"]["hostTarget"];
168
174
  /**
169
- * The rule vocabulary of a wire name from the STATIC catalog: `primaryParams` = the declared primaries, else
170
- * the path target's `param` + aliases; `params` = the declared vocabulary, else the path target's names —
171
- * and UNDEFINED when the catalog cannot know the full vocabulary (a definition whose schema is built inside
172
- * its factory and declares no `ruleFace.params`): the static half never claims a vocabulary it has not
173
- * read, so the rule compiler judges only what it knows and the leg's roster (which reads the schema)
174
- * judges the rest. `undefined` as a whole for a name with nothing to say.
175
+ * The rule vocabulary of a wire name from the STATIC catalog, over every definition the name (or an alias) answers to:
176
+ * `primaryParams` = the first definition's declared primaries, else its path target's `param` + aliases; `params` = every
177
+ * definition's declared vocabulary, else its path target's names, primaries included — UNDEFINED when no definition
178
+ * under the name declares one (StructuredOutput: its schema is each task's), whose face then names no parameter at all.
179
+ * A definition whose schema is built inside its factory declares its FULLEST mount's vocabulary; a mounted instance's
180
+ * is the roster's, read off the schema it carries (`ruleFaceOfInstance`). `undefined` as a whole for a name the
181
+ * catalog does not carry.
175
182
  */
176
183
  export declare function catalogRuleFaceOf(name: string): {
177
184
  primaryParams: string[];
@@ -55,6 +55,9 @@ export function persistenceCandidateToolNames() {
55
55
  export function pathTargetingToolNames() {
56
56
  return names((e) => e.face.pathTarget !== undefined);
57
57
  }
58
+ export function hostTargetingToolNames() {
59
+ return names((e) => e.face.hostTarget !== undefined);
60
+ }
58
61
  const onShellFace = (e) => e.face.ruleFace?.grammar === "command";
59
62
  export function shellFaceToolNames() {
60
63
  return names(onShellFace);
@@ -125,18 +128,25 @@ export function pathTargetOf(name) {
125
128
  return e.face.pathTarget;
126
129
  return undefined;
127
130
  }
131
+ export function hostTargetOf(name) {
132
+ for (const e of TOOL_CATALOG_ENTRIES)
133
+ if (e.name === name && e.face.hostTarget !== undefined)
134
+ return e.face.hostTarget;
135
+ return undefined;
136
+ }
128
137
  export function catalogRuleFaceOf(name) {
138
+ let face;
129
139
  for (const e of TOOL_CATALOG_ENTRIES) {
130
- if (e.name !== name)
140
+ if (e.name !== name && !(e.face.aliases ?? []).includes(name))
131
141
  continue;
132
142
  const pt = e.face.pathTarget;
133
- const primary = e.face.ruleFace?.primaryParams ?? (pt !== undefined ? [pt.param, ...(pt.aliases ?? [])] : []);
134
- const params = e.face.ruleFace?.params ?? (pt !== undefined ? [pt.param, ...(pt.aliases ?? [])] : undefined);
135
- if (params === undefined && primary.length === 0)
136
- continue;
137
- return { primaryParams: [...primary], ...(params !== undefined ? { params: [...new Set([...params, ...primary])] } : {}) };
143
+ const target = pt !== undefined ? [pt.param, ...(pt.aliases ?? [])] : undefined;
144
+ const primary = e.face.ruleFace?.primaryParams ?? target ?? [];
145
+ const declared = e.face.ruleFace?.params ?? target;
146
+ const params = declared === undefined ? face?.params : [...new Set([...(face?.params ?? []), ...declared, ...primary])];
147
+ face = { primaryParams: face?.primaryParams ?? [...primary], ...(params !== undefined ? { params } : {}) };
138
148
  }
139
- return undefined;
149
+ return face;
140
150
  }
141
151
  export function handBandEffects() {
142
152
  const out = new Map();