@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
@@ -0,0 +1,152 @@
1
+ import { formatHookFeedback } from "../reminder-mint.js";
2
+ import { toolFace } from "../tool-catalog-entries.js";
3
+ import { declaredDelegationNameOf } from "../delegation-name.js";
4
+ import { describeThrown } from "../tool-policy.js";
5
+ import { extensionWords } from "../untrusted-egress.js";
6
+ import { ENGINE_ORIGIN } from "./kernel/index.js";
7
+ import { isPlainRecord } from "./kernel/receive.js";
8
+ import { NEXT_IN_FLIGHT } from "./kernel/site-rules.js";
9
+ import { classicEventBase, failedHandlerClause, judgedInputOf } from "./stations.js";
10
+ import { runExtensionCall } from "./extension-call.js";
11
+ import { randomUUID } from "node:crypto";
12
+ const FORM = "tool.call takes next(e), { deny: <reason> } or { result } (a string, or a list of text blocks)";
13
+ const denyOf = (a) => isPlainRecord(a) && Object.keys(a).length === 1 && typeof a["deny"] === "string" && a["deny"] !== "" ? a["deny"] : undefined;
14
+ function substituteOf(a) {
15
+ if (!isPlainRecord(a) || Object.keys(a).length !== 1 || !Object.hasOwn(a, "result"))
16
+ return undefined;
17
+ const r = a["result"];
18
+ if (typeof r === "string")
19
+ return [{ type: "text", text: r }];
20
+ if (!Array.isArray(r) || r.length === 0)
21
+ return undefined;
22
+ const out = [];
23
+ for (const b of r) {
24
+ if (!isPlainRecord(b) || b["type"] !== "text" || typeof b["text"] !== "string" || Object.keys(b).some((k) => k !== "type" && k !== "text"))
25
+ return undefined;
26
+ out.push({ type: "text", text: b["text"] });
27
+ }
28
+ return out;
29
+ }
30
+ function viewOf(result) {
31
+ let blocks = [];
32
+ try {
33
+ const content = result.content;
34
+ blocks = (Array.isArray(content) ? content : []).map((b) => Object.freeze(Object.fromEntries(Object.entries(typeof b === "object" && b !== null ? b : {}).filter(([, v]) => v === null || typeof v === "string" || typeof v === "number" || typeof v === "boolean"))));
35
+ }
36
+ catch {
37
+ blocks = [];
38
+ }
39
+ return Object.freeze({ result: Object.freeze({ content: Object.freeze([...blocks]), isError: result.isError === true }) });
40
+ }
41
+ function letGoUnasked(occurrences, toolCallId) {
42
+ const latest = occurrences.get(toolCallId)?.gateRounds.at(-1);
43
+ if (latest === undefined || latest.disposition.kind !== "allowed" || latest.settlement !== undefined)
44
+ return false;
45
+ return latest.disposition.released === undefined && latest.disposition.clearedBy === undefined;
46
+ }
47
+ const RANKS = Object.freeze({ of: (a) => (denyOf(a) !== undefined ? 1 : 0), top: 1 });
48
+ export function createToolCallStation(input) {
49
+ if (!input.bus.hasHandlers("tool.call"))
50
+ return undefined;
51
+ const refusal = (call, by, text) => {
52
+ if (input.occurrences.get(call.toolCallId) !== undefined) {
53
+ input.occurrences.refuse(call.toolCallId, "hook");
54
+ input.occurrences.answeredInPlace(call.toolCallId, by);
55
+ }
56
+ input.blockedToolCalls.add(call.toolCallId);
57
+ return { content: [{ type: "text", text: formatHookFeedback(text, input.reminderMark) }], details: {}, isError: true };
58
+ };
59
+ return async (call, run, signal) => {
60
+ const e = { ...classicEventBase(input.identity), tool: call.toolName, tool_use_id: call.toolCallId, input: judgedInputOf(call.args) };
61
+ const bodies = new Map();
62
+ let body;
63
+ const bottom = async () => {
64
+ body = run();
65
+ const result = await body;
66
+ const view = viewOf(result);
67
+ bodies.set(view, result);
68
+ return view;
69
+ };
70
+ const checkAnswer = (a, _e, _by, below, ran) => {
71
+ if (typeof a === "object" && a !== null && bodies.has(a))
72
+ return undefined;
73
+ const denied = denyOf(a) !== undefined;
74
+ if (!denied && substituteOf(a) === undefined)
75
+ return FORM;
76
+ if (ran.bottomStarted)
77
+ return `a ${denied ? "deny" : "result"} after the tool started (once the tool runs, only its own outcome stands)`;
78
+ if (denied)
79
+ return below.some((b) => denyOf(b) === undefined) ? "a deny while its next(e) still runs or after it was answered (deny in place of next)" : undefined;
80
+ if (below.includes(NEXT_IN_FLIGHT))
81
+ return "a result while its next(e) still runs (result in place of next)";
82
+ return letGoUnasked(input.occurrences, call.toolCallId) ? undefined : "a result in place of a call someone was asked about (a person's or a rule's yes is a yes to running the tool, so only the tool answers it)";
83
+ };
84
+ let outcome;
85
+ try {
86
+ outcome = await input.bus.dispatch("tool.call", e, { bottom, checkAnswer, ranks: RANKS, ...(signal !== undefined ? { signal } : {}) });
87
+ }
88
+ catch (err) {
89
+ if (body !== undefined)
90
+ return body;
91
+ return refusal(call, ENGINE_ORIGIN.plugin, `the tool.call station could not be raised (${describeThrown(err)}); this call to "${extensionWords(call.toolName, 80)}" was NOT executed (fail-closed)`);
92
+ }
93
+ if (outcome.kind === "aborted") {
94
+ if (body !== undefined)
95
+ return body;
96
+ return { content: [{ type: "text", text: "Operation aborted" }], details: {}, isError: true };
97
+ }
98
+ if (outcome.kind === "failed") {
99
+ return refusal(call, outcome.registration, `a tool.call extension ${failedHandlerClause(outcome)} before this call to "${extensionWords(call.toolName, 80)}" ran; the call was NOT executed (fail-closed)`);
100
+ }
101
+ const answer = outcome.answer;
102
+ const ran = typeof answer === "object" && answer !== null ? bodies.get(answer) : undefined;
103
+ if (ran !== undefined)
104
+ return ran;
105
+ const by = outcome.answeredBy ?? ENGINE_ORIGIN.plugin;
106
+ const reason = denyOf(answer);
107
+ if (reason !== undefined)
108
+ return refusal(call, by, `extension "${extensionWords(by, 80)}" refused this call to "${extensionWords(call.toolName, 80)}" before it ran: ${extensionWords(reason, 300)}`);
109
+ const content = substituteOf(answer);
110
+ if (content === undefined)
111
+ return refusal(call, by, `extension "${extensionWords(by, 80)}" answered this call in a form tool.call does not take; the call was NOT executed (fail-closed)`);
112
+ if (input.occurrences.get(call.toolCallId) !== undefined)
113
+ input.occurrences.answeredInPlace(call.toolCallId, by);
114
+ input.blockedToolCalls.add(call.toolCallId);
115
+ return { content, details: {} };
116
+ };
117
+ }
118
+ const AGENT_DOOR = "runs the Agent tool: that is $.agent.spawn";
119
+ const OTHER_DOOR = new Map([
120
+ [toolFace("ask-user-question").contract.contractId, "runs the AskUserQuestion tool, which puts a question to the person: an extension's call does not ask the person"],
121
+ [toolFace("workflow").contract.contractId, "runs the Workflow tool, whose agents run outside the at-once bound on spawns: $.agent.spawn is the door"],
122
+ ]);
123
+ export function createToolCallEntry(input) {
124
+ return async (args, ctx) => {
125
+ const by = ctx.origin.plugin;
126
+ const { tool, ...callInput } = args;
127
+ if (typeof tool !== "string" || tool === "")
128
+ throw new TypeError(`${by}: $.tool.call takes the event's input: { tool, ...args }`);
129
+ const toolCallId = `ext-${randomUUID()}`;
130
+ return runExtensionCall(input.bus, toolCallId, ctx, async (call) => {
131
+ const finalized = await input.harness.callTool({ type: "toolCall", id: toolCallId, name: tool, arguments: { ...callInput } }, ctx.signal, (t) => {
132
+ const contractId = input.faceOf(t.name)?.contractId;
133
+ const door = declaredDelegationNameOf(input.specOf(t.name)) !== undefined ? AGENT_DOOR : contractId !== undefined ? OTHER_DOOR.get(contractId) : undefined;
134
+ if (door !== undefined)
135
+ throw new TypeError(`${by}: $.tool.call(${extensionWords(t.name, 80)}) ${door}`);
136
+ });
137
+ if (call.denied)
138
+ return Object.freeze({ deny: textOf(finalized.result.content) });
139
+ return viewOf({ ...finalized.result, isError: finalized.isError });
140
+ });
141
+ };
142
+ }
143
+ export function extensionCallOverlap(input) {
144
+ const others = input.occurrences.live().filter((o) => o.toolCallId !== input.toolCallId);
145
+ const name = extensionWords(input.toolName, 80);
146
+ if (!input.batchSafe(input.toolName, input.args)) {
147
+ return others.length === 0 ? undefined : `${name}: an extension's call of a tool that has the run to itself cannot run while another call is in flight`;
148
+ }
149
+ const exclusive = others.find((o) => o.life === "released" && !input.batchSafe(o.wireName ?? o.spelledName, o.finalInput ?? o.args));
150
+ return exclusive === undefined ? undefined : `${name}: an extension's call cannot run beside "${extensionWords(exclusive.wireName ?? exclusive.spelledName, 80)}", which has the run to itself`;
151
+ }
152
+ const textOf = (content) => (Array.isArray(content) ? content.map((b) => (isPlainRecord(b) && b["type"] === "text" && typeof b["text"] === "string" ? b["text"] : "")).join("") : "");
@@ -1,9 +1,10 @@
1
1
  /**
2
- * The name matchers of the rule grammar and of a sub-agent's tool-name lists: the linear `*` glob and the protocol-namespace covering forms
3
- * (`<ns>__<peer>`, `<ns>__<peer>__*`, `<ns>__<peer>__get_*`). A leaf module — the allow layer's rule model and the sub-agent list reader both import it,
4
- * so neither needs the other's dependency tree.
2
+ * The name matchers of the rule grammar and of a run's tool-name lists: the linear `*` glob and the covering forms of a tool name —
3
+ * a glob over the whole name (`Re*d`, `mcp__*`, the lone `*`; read by a list that restricts) and the protocol-namespace peer
4
+ * (`<ns>__<peer>`). A leaf module — the allow layer's rule model and the run's list reader both import it, so neither needs the
5
+ * other's dependency tree.
5
6
  */
6
- import type { ProtocolId } from "./protocol-table.js";
7
+ import type { ProtocolNamespace } from "./protocol-table.js";
7
8
  import type { RuleBehavior } from "./permission-rule-model.js";
8
9
  /**
9
10
  * `*` glob match (design/127 M6: NOT a RegExp — patterns may come from tenant-supplied Settings layers; the same semantics as
@@ -18,38 +19,31 @@ import type { RuleBehavior } from "./permission-rule-model.js";
18
19
  */
19
20
  export declare function wildcardMatch(pattern: string, value: string): boolean;
20
21
  /**
21
- * Does a namespaced RULE name cover `toolName`? — the tail branch of CC's rule matcher `VRp`
22
- * (:595780), which is UNCONDITIONAL there (its `globMatching` option gates only the whole-name glob
23
- * branch, so CC's allow lane — `mVo` :595803, which passes no options — matches MCP segments too).
24
- * Three covering forms, matching CC's three disjuncts (`<ns>` = any protocol-table prefix):
25
- * · `<ns>__<peer>` — every tool of that peer (rule tool segment absent);
26
- * · `<ns>__<peer>__*` — the same set, spelled with the star CC's own settings validator
27
- * recommends (`"MCP rules do not support patterns in parentheses …
28
- * use mcp__srv__*"`);
29
- * · `<ns>__<peer>__get_*` — a glob over the tool segment;
30
- * · `<ns>__*` / `<ns>__*__*` — every tool of the namespace, in the lists that restrict only: CC's deny and ask rules
31
- * reach it through the whole-name glob (`globMatching`), and its agent denied-tools set
32
- * reads both spellings as every server.
33
- * A LITERAL tool segment is deliberately NOT covered here: it is an exact tool name, and the exact
34
- * table already answers it — the same split CC makes with its leading `ruleName === toolName`.
35
- *
36
- * Rule and target must be in the SAME namespace, and peer segments compare EXACTLY (CC
37
- * `s.serverName === a.serverName`). A rule must therefore spell the peer the way the mint does; that
38
- * is the same string an operator reads off any mounted tool name, and inventing a fuzzier comparison
39
- * here would let one rule reach a peer — or a protocol — it does not name. The one peer spelling that
40
- * is not a peer is the wildcard of the whole-protocol name (`<ns>__*`, `<ns>__*__*`, {@link wholeProtocolOf}):
41
- * every tool of the namespace. This matcher does not know whose list a name was written in — a caller
42
- * asks {@link isNamespacedCoveringRuleName} with the list's behavior first and matches only what it admits.
22
+ * True ⇔ this rule name reaches a SET of tool names rather than one exact name — the shapes {@link ruleNameCovers} answers and an
23
+ * exact-name table cannot hold — on a list of `behavior`. Every lane that keys entries by exact tool name asks it to know which
24
+ * entries it must NOT key that way. Two shapes:
25
+ * · a `*` in the name — on a list that RESTRICTS (`deny`, `ask`; {@link readsNameGlob}) anywhere in it (`Re*d`, `mcp__*`, `*`);
26
+ * on a list that GRANTS only in the tool segment after a literal `<ns>__<peer>__` (`mcp__srv__*`, `mcp__srv__get_*`): any other
27
+ * `*` names no scope an allow widens ({@link grantWildcardRefusalOf}), so it is no covering name there — the readers refuse it;
28
+ * · a protocol peer with no tool segment (`<ns>__<peer>`): every tool of that peer, in every list.
29
+ * `behavior` = the behavior of the list the name is written in — required: a list's `*` has no reading without it, so a value
30
+ * that is no behavior word (an array index handed by `filter`, say) is refused loudly, never read as either list.
43
31
  */
44
- export declare function namespacedRuleNameCovers(ruleName: string, toolName: string): boolean;
45
- /** How far a rule name reaches into the peer `peer` of protocol `ns`: `"all"` — every tool of it (`<ns>__<peer>`,
46
- * `<ns>__<peer>__*`, or the whole-protocol name); `"some"` — it names tools of that peer (an exact name, a glob over the tool
47
- * segment); `"none"` — it names no tool of it. The one reading of a name against a peer that the tool-name lists take. */
48
- export declare function namespacedRuleReachInto(ruleName: string, ns: ProtocolId, peer: string): "all" | "some" | "none";
49
- /** True ⇔ this rule name is a namespaced name whose reach is a SET of tools rather than one exact tool
50
- * — i.e. the shapes {@link namespacedRuleNameCovers} answers and an exact name table cannot. Every
51
- * lane that keys rules by exact tool name needs this to know which entries it must NOT key that way.
52
- * `behavior` = the behavior of the list the name is written in: the whole-protocol name is a covering name for a
53
- * restricting list (`deny`, `ask`) only — given `allow`, or no behavior, it is not one (it names no peer). A wildcard in
54
- * any other peer segment is a covering name in no list. */
55
- export declare function isNamespacedCoveringRuleName(name: string, behavior?: RuleBehavior): boolean;
32
+ export declare function isCoveringRuleName(name: string, behavior: RuleBehavior): boolean;
33
+ /**
34
+ * Does a covering rule name ({@link isCoveringRuleName}) cover `toolName`? A name with a `*` is a glob over the WHOLE name
35
+ * ({@link wildcardMatch} — the reference's `p` matcher): `mcp__srv__get_*` reaches `mcp__srv__get_issue`, `mcp__*` every MCP tool,
36
+ * `*` every tool. A protocol peer (`<ns>__<peer>`) reaches every tool minted under that peer, in the SAME namespace, the peer
37
+ * compared EXACTLY (CC `s.serverName === a.serverName`): a rule spells the peer the way the mint does. A literal name is an exact
38
+ * tool name, not a covering one — the exact tables answer it. This matcher does not know whose list a name was written in: a caller
39
+ * asks {@link isCoveringRuleName} with the list's behavior first and matches only what it admits.
40
+ */
41
+ export declare function ruleNameCovers(ruleName: string, toolName: string): boolean;
42
+ /**
43
+ * How far a covering rule name reaches into the peer `peer` of namespace `ns`: `"all"` — every tool of it; `"some"` — some tools of
44
+ * it (a glob over that peer's tool segment); `"none"` — none of it, as far as a list that dials peers needs to know. A glob reaches
45
+ * EVERY tool of the peer exactly when it ends in `*` and matches the peer's own prefix (`<ns>__<peer>__`): a prefix of every name
46
+ * minted under the peer is then matched by the glob up to its last `*`, which takes the rest; a glob that does not end in `*` leaves
47
+ * a tool name it does not match. The one reading of a name against a peer that the tool-name lists take.
48
+ */
49
+ export declare function ruleNameReachIntoPeer(ruleName: string, ns: ProtocolNamespace, peer: string): "all" | "some" | "none";
@@ -1,4 +1,4 @@
1
- import { readsWholeProtocol, splitNamespacedName, wholeProtocolOf } from "./tool-name-aliases.js";
1
+ import { grantWildcardRefusalOf, readsNameGlob, splitNamespacedName } from "./tool-name-aliases.js";
2
2
  export function wildcardMatch(pattern, value) {
3
3
  const first = pattern.indexOf("*");
4
4
  if (first < 0)
@@ -23,44 +23,37 @@ export function wildcardMatch(pattern, value) {
23
23
  }
24
24
  return true;
25
25
  }
26
- function parseNamespacedRuleName(name) {
26
+ function namespacedPeerOf(name) {
27
27
  const split = splitNamespacedName(name);
28
- if (split === undefined || split.peer === "")
29
- return undefined;
30
- return split.tool !== undefined ? { protocol: split.ns.id, peer: split.peer, tool: split.tool } : { protocol: split.ns.id, peer: split.peer };
28
+ return split === undefined || split.peer === "" ? undefined : split;
31
29
  }
32
- export function namespacedRuleNameCovers(ruleName, toolName) {
33
- const rule = parseNamespacedRuleName(ruleName);
34
- if (rule === undefined)
35
- return false;
36
- const target = parseNamespacedRuleName(toolName);
37
- if (target === undefined)
38
- return false;
39
- if (rule.protocol !== target.protocol)
40
- return false;
41
- if (wholeProtocolOf(ruleName) !== undefined)
42
- return true;
43
- if (rule.peer !== target.peer)
30
+ export function isCoveringRuleName(name, behavior) {
31
+ if (behavior !== "deny" && behavior !== "ask" && behavior !== "allow") {
32
+ throw new TypeError(`isCoveringRuleName: the list's behavior must be "deny", "ask" or "allow" (got ${typeof behavior === "string" ? JSON.stringify(behavior) : typeof behavior}) — a "*" in a name reads one way on a list that restricts and another on one that grants`);
33
+ }
34
+ if (name.includes("*"))
35
+ return readsNameGlob(behavior) || grantWildcardRefusalOf(name) === undefined;
36
+ const peer = namespacedPeerOf(name);
37
+ return peer !== undefined && peer.tool === undefined;
38
+ }
39
+ export function ruleNameCovers(ruleName, toolName) {
40
+ if (ruleName.includes("*"))
41
+ return wildcardMatch(ruleName, toolName);
42
+ const rule = namespacedPeerOf(ruleName);
43
+ if (rule === undefined || rule.tool !== undefined)
44
44
  return false;
45
- if (rule.tool === undefined || rule.tool === "*")
46
- return true;
47
- return target.tool !== undefined && rule.tool.includes("*") && wildcardMatch(rule.tool, target.tool);
45
+ const target = namespacedPeerOf(toolName);
46
+ return target !== undefined && target.ns.id === rule.ns.id && target.peer === rule.peer;
48
47
  }
49
- export function namespacedRuleReachInto(ruleName, ns, peer) {
50
- const rule = parseNamespacedRuleName(ruleName);
51
- if (rule === undefined || rule.protocol !== ns)
52
- return "none";
53
- if (wholeProtocolOf(ruleName) !== undefined)
54
- return "all";
55
- if (rule.peer !== peer)
48
+ export function ruleNameReachIntoPeer(ruleName, ns, peer) {
49
+ if (ruleName.includes("*")) {
50
+ if (ruleName.endsWith("*") && wildcardMatch(ruleName, `${ns.prefix}${peer}__`))
51
+ return "all";
52
+ const rule = namespacedPeerOf(ruleName);
53
+ return rule !== undefined && rule.ns.id === ns.id && rule.peer === peer ? "some" : "none";
54
+ }
55
+ const rule = namespacedPeerOf(ruleName);
56
+ if (rule === undefined || rule.ns.id !== ns.id || rule.peer !== peer)
56
57
  return "none";
57
- return rule.tool === undefined || rule.tool === "*" ? "all" : "some";
58
- }
59
- export function isNamespacedCoveringRuleName(name, behavior) {
60
- const parsed = parseNamespacedRuleName(name);
61
- if (parsed === undefined)
62
- return false;
63
- if (parsed.peer.includes("*"))
64
- return wholeProtocolOf(name) !== undefined && readsWholeProtocol(behavior);
65
- return parsed.tool === undefined || parsed.tool.includes("*");
58
+ return rule.tool === undefined ? "all" : "some";
66
59
  }
@@ -14,7 +14,7 @@ import type { EngineDollar } from "./mods/dollar.js";
14
14
  import type { ToolExecuteContext } from "./tool-spec.js";
15
15
  import type { TaskSpec } from "./types.js";
16
16
  /** The fields of a spec the seat carries — one `Pick`, shared by the mint's input and the apply's target. */
17
- export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "clientContext" | "onQuestion" | "mods" | "additionalDirectories" | "additionalReadDirectories" | "envFacts" | "memoryPersistenceCapable" | "memory" | "compaction" | "skillListingBudgetFraction" | "skillListingMaxDescChars" | "fileHistory" | "projectMemory" | "promptForm" | "promptBinding" | "advisorModel">;
17
+ export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "clientContext" | "onQuestion" | "mods" | "additionalDirectories" | "additionalReadDirectories" | "envFacts" | "memoryPersistenceCapable" | "memory" | "compaction" | "skillListingBudgetFraction" | "skillListingMaxDescChars" | "fileHistory" | "projectMemory" | "promptForm" | "promptBinding" | "advisorModel" | "attachments">;
18
18
  /**
19
19
  * The seat a run hands its children. Every member is the parent's own value, frozen at mint (arrays copied and
20
20
  * frozen; the facts object copied). Members present iff the parent carries them — an absent member is "nothing to
@@ -60,6 +60,10 @@ export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "cli
60
60
  * · `advisorModel` — the person's advisor setting: every engine-built child judges it against its OWN model (an advisor
61
61
  * weaker than the child's model does not attach there). An ORDINARY member (fill law); the observer sidecar takes it and
62
62
  * excludes the tool by name.
63
+ * · `attachments` — the request's attachment-lane declaration, WHOLE (which frames ride the legs' requests and which are
64
+ * switched off): one declaration for the delegation tree, so a lane the parent turned on or off is on or off for the
65
+ * delegates that work for it. An ORDINARY member (fill law): a child that authors `attachments` at all keeps exactly what it
66
+ * authored, never half to the parent.
63
67
  */
64
68
  export interface ParentSpecSeat {
65
69
  readonly principal?: string;
@@ -82,6 +86,7 @@ export interface ParentSpecSeat {
82
86
  readonly promptForm?: "minimal";
83
87
  readonly promptBinding?: string;
84
88
  readonly advisorModel?: TaskSpec["advisorModel"];
89
+ readonly attachments?: TaskSpec["attachments"];
85
90
  }
86
91
  /** Refuse (by name, `config.deps_retired_key`) a seat that still carries a retired member. Read at every door a seat enters
87
92
  * by hand: the ctx reader, the apply, and the send lane's waker clamps. */
@@ -26,6 +26,7 @@ export function parentSpecSeatOf(spec, frozenOnQuestion) {
26
26
  ...(spec.promptForm !== undefined ? { promptForm: spec.promptForm } : {}),
27
27
  ...(spec.promptBinding !== undefined ? { promptBinding: spec.promptBinding } : {}),
28
28
  ...(spec.advisorModel !== undefined ? { advisorModel: spec.advisorModel } : {}),
29
+ ...(spec.attachments !== undefined ? { attachments: Object.freeze({ ...spec.attachments }) } : {}),
29
30
  ...clampFieldSeatsOf(spec),
30
31
  });
31
32
  }
@@ -51,6 +52,7 @@ export function applyParentSpecSeat(child, seat) {
51
52
  ...fill("promptForm", seat.promptForm),
52
53
  ...fill("promptBinding", seat.promptBinding),
53
54
  ...fill("advisorModel", seat.advisorModel),
55
+ ...fill("attachments", (seat.attachments !== undefined ? { ...seat.attachments } : undefined)),
54
56
  ...(seat.oneShot === true ? { oneShot: true } : {}),
55
57
  ...(seat.memoryPersistenceCapable === false ? { memoryPersistenceCapable: false } : fill("memoryPersistenceCapable", seat.memoryPersistenceCapable)),
56
58
  };
@@ -80,6 +80,9 @@ function syntheticCheckpoint(scope, fidelity) {
80
80
  origin: "denial_limit_fallback",
81
81
  askClass: "denial_limit_fallback",
82
82
  classes: ["denial_limit_fallback"],
83
+ engineMounted: true,
84
+ targets: { protective: "/park-selfcheck/target", declared: null },
85
+ targetReads: { ["0".repeat(64)]: "f".repeat(64) },
83
86
  batchToolCallIds: [`${scope}:call`],
84
87
  completedCallIds: [],
85
88
  },
@@ -29,6 +29,7 @@
29
29
  */
30
30
  import { RULE_OFFER_KINDS, type EditedRuleBreadthWarning, type UncoveredSegmentDetail, type RuleBehavior, type RuleOffer, type RuleRejectCode, type RuleScope, type RuleDot } from "./permission-rule-model.js";
31
31
  import { type RuleOwner } from "./rule-owner.js";
32
+ import type { RuleOfferShapeProblem } from "./rule-offer-read.js";
32
33
  import type { AssertAllKeysHandled } from "./ask-origin.js";
33
34
  import { type PermissionRuleStoreProvider } from "./permission-rule-provider.js";
34
35
  /** One candidate rule inside an approval record: what it says (`behavior`), the exact text and where it
@@ -90,6 +91,24 @@ export type RuleOffer2 = {
90
91
  export type RuleOffer2KindsCoverEveryArm = AssertAllKeysHandled<Exclude<RuleOffer2["kind"], (typeof RULE_OFFER_KINDS)[number]>>;
91
92
  /** {@link import("./permission-rule-model.js").RuleOfferArmsCoverEveryKind}'s twin over the record's option form. */
92
93
  export type RuleOffer2ArmsCoverEveryKind = AssertAllKeysHandled<Exclude<(typeof RULE_OFFER_KINDS)[number], RuleOffer2["kind"]>>;
94
+ /** {@link readRuleOffer2}'s answer: the option as read, or why it is not one (the offer read-back judge's two element words). */
95
+ export type RuleOffer2Reading = {
96
+ readonly offer: RuleOffer2;
97
+ } | {
98
+ readonly problem: Exclude<RuleOfferShapeProblem, "not_an_array">;
99
+ };
100
+ /**
101
+ * The one SHAPE reading of a stored record option ({@link RuleOffer2}), for every reader of an approval record the engine did not
102
+ * just build — the consent entries' record check, and a durable backend reading its rows back. Not a plain record, a member the form
103
+ * does not declare, a candidate index that is not a non-negative safe integer, a batch with no members, a `segments` that is not a
104
+ * list of strings, an uncovered count that is not a non-negative safe integer, a reason row that is not exactly a segment and a reason
105
+ * ⇒ `malformed`; a `kind` or a reason that is a string outside its closed set ⇒ `unknown_word`. A member the form does not declare is
106
+ * refused, not dropped: the record's `schema` stamp is the version gate, so a same-stamp row carrying one was written by another writer.
107
+ * Which batch seats a record of which kind must carry, and whether the indices name its candidates, are the record's own facts —
108
+ * judged by the record check, not here. The answer is a fresh object holding the members it judged; each member is read once, a list
109
+ * by position with its length read once.
110
+ */
111
+ export declare function readRuleOffer2(raw: unknown): RuleOffer2Reading;
93
112
  /** The CURRENT record-form version stamp ({@link RuleApprovalRecord.schema}), spelled once: every mint writes it and
94
113
  * every readback compares against it by equality (an older or absent stamp is a stale row, never a floor). A
95
114
  * durable backend's stale gate reads this value rather than its own number. */
@@ -298,11 +317,13 @@ export declare function prepareCardApproval(opts: {
298
317
  principal?: string;
299
318
  /** design/182 §4.5 (additive): the structural owner — only the local-owner path needs it. */
300
319
  owner?: RuleOwner;
301
- /** The tool whose ask this card belongs to. Only the shell tool the rule lane speaks for, the name tools (the skill-activation
302
- * card) and the host tools (the fetch card) are accepted. */
320
+ /** The tool whose ask this card belongs to: a tool whose card the offer factory mints a rule on (`cardRuleFormOf`) — the shell
321
+ * tool, a name tool (the skill-activation card), a host tool (the fetch card), a tool with no rule grammar (the whole-tool card).
322
+ * Any other tool (a path tool, a shell-face sibling) draws no card. */
303
323
  toolName: string;
304
324
  /** The command as adjudicated — the same bytes the ask carried; for a name tool (`Skill`), the name its call carried (`args.skill`);
305
- * for a host tool (`WebFetch`), the host its call reaches (the offer's `command`). */
325
+ * for a host tool (`WebFetch`), the host its call reaches (the offer's `command`); for a tool with no rule grammar, `""` (the
326
+ * offer's `command`: the whole tool binds no value). */
306
327
  command: string;
307
328
  /** The ask's call id and argument digest, recorded for reconciliation. */
308
329
  toolCallId?: string;