@sema-agent/core 7.51.2 → 7.53.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 (446) hide show
  1. package/CHANGELOG.md +698 -2
  2. package/README.md +3 -1
  3. package/dist/agents/agent-transcript-tool.d.ts +1 -1
  4. package/dist/agents/cascade.js +4 -0
  5. package/dist/agents/cross-session-envelope.d.ts +8 -0
  6. package/dist/agents/cross-session-envelope.js +6 -0
  7. package/dist/agents/cross-session-judge.d.ts +21 -1
  8. package/dist/agents/cross-session-judge.js +8 -0
  9. package/dist/agents/cross-session-ref.d.ts +5 -0
  10. package/dist/agents/cross-session-ref.js +1 -0
  11. package/dist/agents/cumulative-stats.d.ts +3 -0
  12. package/dist/agents/cumulative-stats.js +3 -0
  13. package/dist/agents/list-agents-tool.d.ts +1 -1
  14. package/dist/agents/org-delivery-gate.d.ts +122 -0
  15. package/dist/agents/org-delivery-gate.js +69 -0
  16. package/dist/agents/peer-held-queue.d.ts +9 -4
  17. package/dist/agents/peer-held-queue.js +6 -5
  18. package/dist/agents/peer-session-drain.d.ts +35 -5
  19. package/dist/agents/peer-session-drain.js +271 -180
  20. package/dist/agents/read-inbox-tool.d.ts +8 -1
  21. package/dist/agents/read-inbox-tool.js +5 -1
  22. package/dist/agents/repair-loop.js +4 -0
  23. package/dist/agents/send-message-tool.d.ts +11 -16
  24. package/dist/agents/send-message-tool.js +11 -13
  25. package/dist/agents/subagent.d.ts +3 -0
  26. package/dist/agents/subagent.js +105 -76
  27. package/dist/agents/tool-filter.d.ts +58 -13
  28. package/dist/agents/tool-filter.js +34 -14
  29. package/dist/bench/metrics.d.ts +1 -0
  30. package/dist/brain/anthropic.d.ts +6 -1
  31. package/dist/brain/anthropic.js +17 -13
  32. package/dist/brain/model-presets.d.ts +4 -5
  33. package/dist/brain/model-presets.js +6 -5
  34. package/dist/brain/open-responses.js +16 -12
  35. package/dist/brain/openai.js +16 -12
  36. package/dist/brain/request-params.d.ts +12 -33
  37. package/dist/brain/request-params.js +5 -2
  38. package/dist/brain/request-route.d.ts +9 -8
  39. package/dist/brain/request-route.js +1 -0
  40. package/dist/brain/route-adjudicator.d.ts +123 -47
  41. package/dist/brain/route-adjudicator.js +171 -42
  42. package/dist/brain/route-conformance.js +2 -2
  43. package/dist/brain/routing.d.ts +24 -1
  44. package/dist/brain/routing.js +54 -19
  45. package/dist/brain/status-sink.d.ts +18 -0
  46. package/dist/brain/status-sink.js +7 -0
  47. package/dist/brain/timeout.js +5 -4
  48. package/dist/core/a2a.d.ts +5 -2
  49. package/dist/core/a2a.js +30 -13
  50. package/dist/core/allow-entry.d.ts +42 -9
  51. package/dist/core/allow-entry.js +25 -18
  52. package/dist/core/auto-compaction.d.ts +80 -20
  53. package/dist/core/auto-compaction.js +65 -18
  54. package/dist/core/auto-promote.d.ts +2 -1
  55. package/dist/core/auto-promote.js +2 -2
  56. package/dist/core/caller-tool-name.d.ts +9 -0
  57. package/dist/core/caller-tool-name.js +13 -0
  58. package/dist/core/checkpoint-requirements.d.ts +7 -1
  59. package/dist/core/checkpoint-requirements.js +2 -0
  60. package/dist/core/checkpoint-store.d.ts +57 -24
  61. package/dist/core/checkpoint-store.js +3 -3
  62. package/dist/core/child-clamp-seats.d.ts +6 -0
  63. package/dist/core/child-clamp-seats.js +2 -1
  64. package/dist/core/compliance.js +3 -1
  65. package/dist/core/credential-vocabulary.d.ts +33 -8
  66. package/dist/core/credential-vocabulary.js +32 -7
  67. package/dist/core/decision-receipt.d.ts +2 -2
  68. package/dist/core/delegation-frames.d.ts +9 -2
  69. package/dist/core/delegation-name.d.ts +18 -0
  70. package/dist/core/delegation-name.js +47 -0
  71. package/dist/core/effective-path-target.d.ts +25 -6
  72. package/dist/core/effective-path-target.js +24 -2
  73. package/dist/core/engine-capabilities.d.ts +8 -1
  74. package/dist/core/engine-capabilities.js +1 -1
  75. package/dist/core/engine-notice.d.ts +49 -21
  76. package/dist/core/frontmatter-fence.d.ts +10 -0
  77. package/dist/core/frontmatter-fence.js +6 -0
  78. package/dist/core/gate-fold.js +8 -25
  79. package/dist/core/gate-lanes.js +358 -274
  80. package/dist/core/gate-outcome.d.ts +11 -6
  81. package/dist/core/governance-codes.d.ts +11 -4
  82. package/dist/core/governance-codes.js +12 -3
  83. package/dist/core/hands-band-screen.d.ts +7 -0
  84. package/dist/core/hands-band-screen.js +32 -0
  85. package/dist/core/hooks.d.ts +283 -739
  86. package/dist/core/hooks.js +100 -193
  87. package/dist/{tools/fs → core}/image-admission.d.ts +21 -3
  88. package/dist/{tools/fs → core}/image-admission.js +24 -6
  89. package/dist/core/locked-config.d.ts +84 -32
  90. package/dist/core/locked-config.js +128 -42
  91. package/dist/core/mcp-connection-pool.d.ts +4 -1
  92. package/dist/core/mcp-connection-pool.js +7 -2
  93. package/dist/core/mcp-probe.d.ts +12 -9
  94. package/dist/core/mcp-probe.js +3 -3
  95. package/dist/core/mcp-server-spec.d.ts +104 -10
  96. package/dist/core/mcp-server-spec.js +183 -33
  97. package/dist/core/mcp.d.ts +31 -20
  98. package/dist/core/mcp.js +66 -56
  99. package/dist/core/memory-engine/data-plane.js +5 -1
  100. package/dist/core/memory-engine/distiller.js +16 -2
  101. package/dist/core/memory-engine/engine.d.ts +22 -30
  102. package/dist/core/memory-engine/engine.js +16 -10
  103. package/dist/core/memory-engine/frontmatter.d.ts +6 -0
  104. package/dist/core/memory-engine/frontmatter.js +19 -16
  105. package/dist/core/memory.d.ts +2 -2
  106. package/dist/core/mode-policy.d.ts +5 -16
  107. package/dist/core/mode-policy.js +7 -19
  108. package/dist/core/model-seat.d.ts +4 -1
  109. package/dist/core/mods/dollar.d.ts +109 -0
  110. package/dist/core/mods/dollar.js +154 -0
  111. package/dist/core/mods/host.d.ts +23 -0
  112. package/dist/core/mods/host.js +21 -0
  113. package/dist/core/mods/kernel/budget.d.ts +43 -0
  114. package/dist/core/mods/kernel/budget.js +83 -0
  115. package/dist/core/mods/kernel/dispatch.d.ts +100 -0
  116. package/dist/core/mods/kernel/dispatch.js +699 -0
  117. package/dist/core/mods/kernel/events.d.ts +245 -0
  118. package/dist/core/mods/kernel/events.js +210 -0
  119. package/dist/core/mods/kernel/index.d.ts +6 -0
  120. package/dist/core/mods/kernel/index.js +5 -0
  121. package/dist/core/mods/kernel/receive.d.ts +94 -0
  122. package/dist/core/mods/kernel/receive.js +188 -0
  123. package/dist/core/mods/kernel/registration.d.ts +131 -0
  124. package/dist/core/mods/kernel/registration.js +102 -0
  125. package/dist/core/mods/kernel/site-rules.d.ts +149 -0
  126. package/dist/core/mods/kernel/site-rules.js +296 -0
  127. package/dist/core/mods/stations.d.ts +344 -0
  128. package/dist/core/mods/stations.js +437 -0
  129. package/dist/core/mounted-mcp.d.ts +57 -0
  130. package/dist/core/mounted-mcp.js +71 -2
  131. package/dist/core/own-property-receipt.d.ts +13 -0
  132. package/dist/core/own-property-receipt.js +13 -23
  133. package/dist/core/parent-spec-seat.d.ts +18 -7
  134. package/dist/core/parent-spec-seat.js +6 -2
  135. package/dist/core/path-identity.js +2 -1
  136. package/dist/core/permission-rule-model.d.ts +58 -9
  137. package/dist/core/permission-rule-model.js +81 -7
  138. package/dist/core/permission-rule-org.d.ts +163 -33
  139. package/dist/core/permission-rule-org.js +205 -71
  140. package/dist/core/permission-rule-syntax.d.ts +15 -0
  141. package/dist/core/permission-rule-syntax.js +24 -16
  142. package/dist/core/permission-rules.d.ts +14 -2
  143. package/dist/core/permission-rules.js +63 -23
  144. package/dist/core/prompt-section-seat.d.ts +15 -27
  145. package/dist/core/prompt-section-seat.js +73 -40
  146. package/dist/core/protocol-http-auth.d.ts +3 -1
  147. package/dist/core/protocol-http-auth.js +2 -0
  148. package/dist/core/reminder-mint.d.ts +2 -2
  149. package/dist/core/remote-env.d.ts +24 -12
  150. package/dist/core/remote-env.js +1 -0
  151. package/dist/core/resume-startup-cause.d.ts +16 -1
  152. package/dist/core/resume-startup-cause.js +4 -1
  153. package/dist/core/retention.js +7 -2
  154. package/dist/core/retired-keys.d.ts +12 -2
  155. package/dist/core/retired-keys.js +15 -1
  156. package/dist/core/roles.js +60 -10
  157. package/dist/core/rule-lane-reads.js +1 -1
  158. package/dist/core/runner/announce-once-ledger.d.ts +31 -1
  159. package/dist/core/runner/announce-once-ledger.js +22 -0
  160. package/dist/core/runner/assemble-result.d.ts +9 -0
  161. package/dist/core/runner/assemble-result.js +3 -1
  162. package/dist/core/runner/call-hook-stations.d.ts +23 -27
  163. package/dist/core/runner/call-hook-stations.js +58 -42
  164. package/dist/core/runner/caller-stop-gate.d.ts +25 -0
  165. package/dist/core/runner/caller-stop-gate.js +7 -0
  166. package/dist/core/runner/compaction-seams.d.ts +8 -22
  167. package/dist/core/runner/compaction-seams.js +28 -53
  168. package/dist/core/runner/construction-doors.js +11 -1
  169. package/dist/core/runner/contracts.d.ts +86 -83
  170. package/dist/core/runner/credential-origin-seat.d.ts +2 -0
  171. package/dist/core/runner/credential-origin-seat.js +19 -0
  172. package/dist/core/runner/extra-body-dropped-seat.d.ts +2 -6
  173. package/dist/core/runner/gate-exit.d.ts +47 -36
  174. package/dist/core/runner/gate-exit.js +12 -5
  175. package/dist/core/runner/image.js +1 -2
  176. package/dist/core/runner/inline-image.js +1 -1
  177. package/dist/core/runner/mcp-redial.d.ts +52 -10
  178. package/dist/core/runner/mcp-redial.js +38 -9
  179. package/dist/core/runner/notice-seat-input.d.ts +11 -0
  180. package/dist/core/runner/notice-seat-input.js +1 -0
  181. package/dist/core/runner/permission-rule-lanes.d.ts +5 -2
  182. package/dist/core/runner/permission-rule-lanes.js +22 -10
  183. package/dist/core/runner/person-path-rows.d.ts +3 -1
  184. package/dist/core/runner/person-path-rows.js +3 -2
  185. package/dist/core/runner/prepare-acquire-reconcile.js +5 -1
  186. package/dist/core/runner/prepare-ask-lane.d.ts +5 -7
  187. package/dist/core/runner/prepare-ask-lane.js +6 -15
  188. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -2
  189. package/dist/core/runner/prepare-caps-and-workflow.js +25 -8
  190. package/dist/core/runner/prepare-config-doors.d.ts +52 -1
  191. package/dist/core/runner/prepare-config-doors.js +168 -143
  192. package/dist/core/runner/prepare-defer-classify.js +7 -11
  193. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  194. package/dist/core/runner/prepare-delegation-surface.js +7 -5
  195. package/dist/core/runner/prepare-gate-stations.d.ts +8 -11
  196. package/dist/core/runner/prepare-gate-stations.js +11 -10
  197. package/dist/core/runner/prepare-hands-readface.d.ts +1 -1
  198. package/dist/core/runner/prepare-hands-readface.js +2 -1
  199. package/dist/core/runner/prepare-inherited-gate.d.ts +8 -12
  200. package/dist/core/runner/prepare-inherited-gate.js +10 -23
  201. package/dist/core/runner/prepare-listings.d.ts +1 -1
  202. package/dist/core/runner/prepare-listings.js +4 -2
  203. package/dist/core/runner/prepare-memory-engine-session.d.ts +0 -6
  204. package/dist/core/runner/prepare-memory-engine-session.js +20 -7
  205. package/dist/core/runner/prepare-memory.d.ts +3 -2
  206. package/dist/core/runner/prepare-memory.js +6 -2
  207. package/dist/core/runner/prepare-offload-wrappers.d.ts +4 -4
  208. package/dist/core/runner/prepare-offload-wrappers.js +2 -1
  209. package/dist/core/runner/prepare-park-ask.js +10 -14
  210. package/dist/core/runner/prepare-policy-chain.d.ts +17 -15
  211. package/dist/core/runner/prepare-policy-chain.js +104 -109
  212. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  213. package/dist/core/runner/prepare-project-context.js +11 -12
  214. package/dist/core/runner/prepare-prompt-assembly.d.ts +45 -40
  215. package/dist/core/runner/prepare-prompt-assembly.js +138 -101
  216. package/dist/core/runner/prepare-prompt-inputs.d.ts +28 -23
  217. package/dist/core/runner/prepare-prompt-inputs.js +11 -10
  218. package/dist/core/runner/prepare-protocol-tools.d.ts +11 -7
  219. package/dist/core/runner/prepare-protocol-tools.js +20 -13
  220. package/dist/core/runner/prepare-question-face.d.ts +4 -2
  221. package/dist/core/runner/prepare-question-face.js +4 -3
  222. package/dist/core/runner/prepare-safety-scan.js +6 -10
  223. package/dist/core/runner/prepare-suspend-saga.d.ts +6 -0
  224. package/dist/core/runner/prepare-suspend-saga.js +7 -5
  225. package/dist/core/runner/prepare-task.js +41 -23
  226. package/dist/core/runner/prepare-turn-wiring.d.ts +13 -15
  227. package/dist/core/runner/prepare-turn-wiring.js +29 -27
  228. package/dist/core/runner/prepare-wiring-manifest.d.ts +13 -9
  229. package/dist/core/runner/prepare-wiring-manifest.js +14 -11
  230. package/dist/core/runner/resume-admission.d.ts +4 -1
  231. package/dist/core/runner/resume-admission.js +7 -5
  232. package/dist/core/runner/resume-apply.d.ts +5 -2
  233. package/dist/core/runner/resume-apply.js +24 -42
  234. package/dist/core/runner/resume-checkpoint-screen.d.ts +1 -0
  235. package/dist/core/runner/resume-checkpoint-screen.js +9 -1
  236. package/dist/core/runner/resume-internals-and-config.d.ts +3 -3
  237. package/dist/core/runner/resume-internals-and-config.js +3 -8
  238. package/dist/core/runner/resume-preflight.js +38 -16
  239. package/dist/core/runner/retired-runner-deps.d.ts +5 -6
  240. package/dist/core/runner/retired-runner-deps.js +4 -5
  241. package/dist/core/runner/run-brain-sinks.d.ts +3 -2
  242. package/dist/core/runner/run-brain-sinks.js +5 -1
  243. package/dist/core/runner/run-compaction-machinery.d.ts +7 -1
  244. package/dist/core/runner/run-compaction-machinery.js +7 -33
  245. package/dist/core/runner/run-harness-handlers.js +4 -2
  246. package/dist/core/runner/run-identity-wiring.d.ts +3 -1
  247. package/dist/core/runner/run-identity-wiring.js +3 -2
  248. package/dist/core/runner/run-leg.js +103 -95
  249. package/dist/core/runner/run-notification-lane.js +1 -0
  250. package/dist/core/runner/run-recovery-lanes.d.ts +3 -0
  251. package/dist/core/runner/run-recovery-lanes.js +14 -11
  252. package/dist/core/runner/run-settle-and-teardown.js +9 -28
  253. package/dist/core/runner/run-stop-and-final-verify.js +18 -25
  254. package/dist/core/runner/run-terminal-adoption.d.ts +3 -0
  255. package/dist/core/runner/run-terminal-adoption.js +34 -22
  256. package/dist/core/runner/run-tool-mount-facts.js +5 -3
  257. package/dist/core/runner/run-turn-boundary.js +32 -37
  258. package/dist/core/runner/runtask.d.ts +6 -7
  259. package/dist/core/runner/runtask.js +15 -73
  260. package/dist/core/runner/session-rule-policy.d.ts +5 -5
  261. package/dist/core/runner/session-rule-policy.js +13 -8
  262. package/dist/core/runner/side-call-account.d.ts +68 -0
  263. package/dist/core/runner/side-call-account.js +61 -0
  264. package/dist/core/runner/skills-seat.d.ts +15 -0
  265. package/dist/core/runner/skills-seat.js +57 -0
  266. package/dist/core/runner/stream-halt-verbs.js +12 -17
  267. package/dist/core/runner/stream-lifecycle-verbs.js +8 -5
  268. package/dist/core/runner/stream-steer-verb.d.ts +1 -1
  269. package/dist/core/runner/stream-steer-verb.js +20 -38
  270. package/dist/core/runner/sub-agent-deny-lists.d.ts +124 -23
  271. package/dist/core/runner/sub-agent-deny-lists.js +230 -71
  272. package/dist/core/runner/synthetic-tools.d.ts +5 -2
  273. package/dist/core/runner/synthetic-tools.js +2 -12
  274. package/dist/core/runner/tool-end-body.d.ts +5 -6
  275. package/dist/core/runner/tool-end-body.js +6 -4
  276. package/dist/core/runner/tool-not-executed.d.ts +15 -0
  277. package/dist/core/runner/tool-not-executed.js +30 -0
  278. package/dist/core/runner/tool-occurrence.d.ts +8 -7
  279. package/dist/core/runner/tool-occurrence.js +5 -5
  280. package/dist/core/runner/tool-result-media-seat.d.ts +1 -1
  281. package/dist/core/runner-deps.d.ts +43 -36
  282. package/dist/core/safety-merge-corpus.js +18 -2
  283. package/dist/core/secret-env.d.ts +88 -20
  284. package/dist/core/secret-env.js +192 -38
  285. package/dist/core/session-policy-store.d.ts +71 -16
  286. package/dist/core/session-policy-store.js +138 -28
  287. package/dist/core/session-reconcile.d.ts +4 -0
  288. package/dist/core/session-reconcile.js +2 -1
  289. package/dist/core/shell-read-silence.js +3 -32
  290. package/dist/core/side-query.d.ts +5 -3
  291. package/dist/core/skill-grant.d.ts +3 -2
  292. package/dist/core/skill-grant.js +17 -9
  293. package/dist/core/skills-directory.d.ts +31 -11
  294. package/dist/core/skills-directory.js +655 -104
  295. package/dist/core/store-contracts/mailbox-store-contract.js +13 -0
  296. package/dist/core/task-event.d.ts +49 -3
  297. package/dist/core/task-notification.js +2 -2
  298. package/dist/core/task-result.d.ts +8 -0
  299. package/dist/core/task-spec.d.ts +20 -19
  300. package/dist/core/task-stream.d.ts +14 -4
  301. package/dist/core/tighten-task-spec.d.ts +4 -3
  302. package/dist/core/tighten-task-spec.js +2 -4
  303. package/dist/core/tool-check-reading.d.ts +74 -0
  304. package/dist/core/tool-check-reading.js +80 -0
  305. package/dist/core/tool-policy.d.ts +62 -18
  306. package/dist/core/tool-policy.js +86 -15
  307. package/dist/core/tool-registry.d.ts +20 -0
  308. package/dist/core/tool-registry.js +4 -0
  309. package/dist/core/tool-spec.d.ts +10 -6
  310. package/dist/core/tools.js +2 -0
  311. package/dist/core/trace.d.ts +51 -32
  312. package/dist/core/types.d.ts +2 -2
  313. package/dist/core/types.js +1 -1
  314. package/dist/core/unc-spelling.d.ts +10 -0
  315. package/dist/core/unc-spelling.js +3 -0
  316. package/dist/core/untrusted-egress.d.ts +8 -0
  317. package/dist/core/untrusted-egress.js +4 -1
  318. package/dist/core/untrusted-text.d.ts +16 -0
  319. package/dist/core/untrusted-text.js +7 -2
  320. package/dist/core/user-attachment.d.ts +25 -4
  321. package/dist/core/user-attachment.js +63 -42
  322. package/dist/core/wiring-manifest.d.ts +18 -15
  323. package/dist/core/wiring-manifest.js +2 -2
  324. package/dist/engine/compaction/utils.js +1 -2
  325. package/dist/engine/execution-env/node-execution-env.d.ts +4 -3
  326. package/dist/engine/execution-env/symlink-chain.js +1 -1
  327. package/dist/engine/harness/agent-harness.d.ts +1 -1
  328. package/dist/engine/harness/agent-harness.js +5 -4
  329. package/dist/engine/harness/types.d.ts +20 -16
  330. package/dist/engine/harness/types.js +7 -1
  331. package/dist/engine/llm/types.d.ts +12 -7
  332. package/dist/engine/loop/agent-loop.d.ts +12 -1
  333. package/dist/engine/loop/agent-loop.js +18 -6
  334. package/dist/engine/loop/types.d.ts +8 -2
  335. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  336. package/dist/engine/session/import-validate.js +3 -10
  337. package/dist/engine/session/session.d.ts +4 -4
  338. package/dist/engine/session/session.js +4 -4
  339. package/dist/index.d.ts +33 -23
  340. package/dist/index.js +23 -15
  341. package/dist/internal/harness.d.ts +2 -1
  342. package/dist/internal/harness.js +2 -1
  343. package/dist/orchestration/goal.d.ts +24 -1
  344. package/dist/orchestration/goal.js +3 -2
  345. package/dist/orchestration/run-spec.d.ts +4 -6
  346. package/dist/orchestration/run-spec.js +39 -63
  347. package/dist/orchestration/run-workflow-tool.js +1 -2
  348. package/dist/orchestration/workflow.d.ts +11 -3
  349. package/dist/orchestration/workflow.js +11 -2
  350. package/dist/prompt-assembly/artifact-store.d.ts +72 -56
  351. package/dist/prompt-assembly/artifact-store.js +60 -52
  352. package/dist/prompt-assembly/artifact.d.ts +90 -76
  353. package/dist/prompt-assembly/artifact.js +197 -145
  354. package/dist/prompt-assembly/assemble.d.ts +36 -29
  355. package/dist/prompt-assembly/assemble.js +34 -220
  356. package/dist/prompt-assembly/bands.d.ts +20 -0
  357. package/dist/prompt-assembly/bands.js +18 -0
  358. package/dist/prompt-assembly/catalog/constitution.d.ts +23 -0
  359. package/dist/prompt-assembly/catalog/constitution.js +69 -0
  360. package/dist/prompt-assembly/catalog/core-behavior.d.ts +9 -0
  361. package/dist/prompt-assembly/catalog/core-behavior.js +85 -0
  362. package/dist/prompt-assembly/catalog/index.d.ts +11 -0
  363. package/dist/prompt-assembly/catalog/index.js +60 -0
  364. package/dist/prompt-assembly/catalog/memory.d.ts +13 -0
  365. package/dist/prompt-assembly/catalog/memory.js +6 -0
  366. package/dist/prompt-assembly/catalog/modes.d.ts +15 -0
  367. package/dist/prompt-assembly/catalog/modes.js +137 -0
  368. package/dist/prompt-assembly/catalog/role.d.ts +10 -0
  369. package/dist/prompt-assembly/catalog/role.js +157 -0
  370. package/dist/prompt-assembly/catalog/schema.d.ts +138 -0
  371. package/dist/prompt-assembly/catalog/schema.js +25 -0
  372. package/dist/prompt-assembly/catalog/sections.d.ts +9 -0
  373. package/dist/prompt-assembly/catalog/sections.js +98 -0
  374. package/dist/prompt-assembly/catalog/team.d.ts +4 -0
  375. package/dist/prompt-assembly/catalog/team.js +258 -0
  376. package/dist/prompt-assembly/composer.d.ts +26 -28
  377. package/dist/prompt-assembly/composer.js +124 -46
  378. package/dist/prompt-assembly/epoch.d.ts +89 -79
  379. package/dist/prompt-assembly/epoch.js +115 -142
  380. package/dist/prompt-assembly/explain.d.ts +58 -34
  381. package/dist/prompt-assembly/explain.js +21 -24
  382. package/dist/prompt-assembly/overlay.d.ts +137 -0
  383. package/dist/prompt-assembly/overlay.js +339 -0
  384. package/dist/prompt-assembly/renderers.d.ts +21 -0
  385. package/dist/prompt-assembly/renderers.js +39 -0
  386. package/dist/prompt-assembly/section-usage.d.ts +3 -3
  387. package/dist/prompt-assembly/section-usage.js +1 -1
  388. package/dist/prompt-assembly/select.d.ts +71 -0
  389. package/dist/prompt-assembly/select.js +106 -0
  390. package/dist/prompt-assembly/sugar.d.ts +31 -0
  391. package/dist/prompt-assembly/sugar.js +20 -0
  392. package/dist/prompt-assembly/turn-snapshot.d.ts +3 -2
  393. package/dist/prompt-assembly/types.d.ts +45 -148
  394. package/dist/prompts/coordinator.d.ts +2 -21
  395. package/dist/prompts/coordinator.js +3 -255
  396. package/dist/prompts/cowork.d.ts +27 -16
  397. package/dist/prompts/cowork.js +2 -23
  398. package/dist/prompts/default.d.ts +38 -511
  399. package/dist/prompts/default.js +20 -288
  400. package/dist/prompts/supervisor.d.ts +6 -71
  401. package/dist/prompts/supervisor.js +6 -117
  402. package/dist/stores/file/permission-rule-store.d.ts +1 -1
  403. package/dist/stores/file/permission-rule-store.js +2 -1
  404. package/dist/tools/artifact/artifact-tool.js +4 -3
  405. package/dist/tools/fs/bash-readonly-classifier.d.ts +6 -5
  406. package/dist/tools/fs/dir-entries.d.ts +4 -2
  407. package/dist/tools/fs/dir-entries.js +16 -4
  408. package/dist/tools/fs/fs-bash.d.ts +1 -1
  409. package/dist/tools/fs/fs-bash.js +22 -11
  410. package/dist/tools/fs/fs-pdf.js +17 -13
  411. package/dist/tools/fs/fs-read.js +4 -3
  412. package/dist/tools/fs/fs-shared.d.ts +1 -10
  413. package/dist/tools/fs/fs-shared.js +3 -4
  414. package/dist/tools/fs/fs-write.js +2 -1
  415. package/dist/tools/fs/notebook.js +1 -1
  416. package/dist/tools/fs/pdf.d.ts +20 -10
  417. package/dist/tools/fs/pdf.js +19 -10
  418. package/dist/tools/fs/program-read-model.d.ts +68 -8
  419. package/dist/tools/fs/program-read-model.js +112 -33
  420. package/dist/tools/fs/program-read-model.rows.js +30 -10
  421. package/dist/tools/fs/read-deny-home.d.ts +25 -9
  422. package/dist/tools/fs/read-deny-home.js +28 -27
  423. package/dist/tools/fs/read-deny.d.ts +41 -11
  424. package/dist/tools/fs/read-deny.js +51 -5
  425. package/dist/tools/fs/safety.d.ts +4 -26
  426. package/dist/tools/fs/safety.js +10 -32
  427. package/dist/tools/fs/search.js +15 -10
  428. package/dist/tools/fs/shell-read-argv.d.ts +3 -2
  429. package/dist/tools/fs/shell-read-argv.js +118 -38
  430. package/dist/tools/fs/shell-read-establish.d.ts +5 -5
  431. package/dist/tools/fs/shell-read-establish.js +11 -61
  432. package/dist/tools/fs/shell-read-identity.js +6 -3
  433. package/dist/tools/fs/shell-read-judge.d.ts +13 -15
  434. package/dist/tools/fs/shell-read-judge.js +18 -4
  435. package/dist/tools/fs/shell-read-plan.d.ts +2 -2
  436. package/dist/tools/web.js +1 -1
  437. package/package.json +13 -1
  438. package/test/export-surface.snapshot.json +306 -103
  439. package/wire-changes/core@7.52.0.json +5859 -0
  440. package/wire-changes/core@7.53.0.json +1946 -0
  441. package/dist/core/hook-seats.d.ts +0 -66
  442. package/dist/core/hook-seats.js +0 -37
  443. package/dist/prompt-assembly/packs/sema-default.d.ts +0 -2
  444. package/dist/prompt-assembly/packs/sema-default.js +0 -147
  445. package/dist/prompts/simple-sections.d.ts +0 -58
  446. package/dist/prompts/simple-sections.js +0 -43
@@ -0,0 +1,437 @@
1
+ import { types } from "node:util";
2
+ import { resolveModel } from "../roles.js";
3
+ import { brainToRuntime } from "../runtime.js";
4
+ import { deliverEngineNotice } from "../engine-notice.js";
5
+ import { inlineUntrusted } from "../untrusted-text.js";
6
+ import { extensionWords } from "../untrusted-egress.js";
7
+ import { askApproverIdentity, describeThrown, ownArgs } from "../tool-policy.js";
8
+ import { admitMods, expandModPattern } from "./kernel/index.js";
9
+ import { validateOverlay } from "../../prompt-assembly/overlay.js";
10
+ import { modsInvalid } from "./kernel/registration.js";
11
+ import { isPlainRecord } from "./kernel/receive.js";
12
+ import { engineMethodBottoms } from "./dollar.js";
13
+ import { modSeatsOf, modsReportToOnError, registrationRefusedNotice } from "./host.js";
14
+ export const ENGINE_CORE_ANSWER = Object.freeze({});
15
+ export function engineCore() {
16
+ return ENGINE_CORE_ANSWER;
17
+ }
18
+ export function agentIdOf(identity) {
19
+ return identity?.isDelegatedChild === true ? identity.taskId : undefined;
20
+ }
21
+ export function stopEventOf(identity) {
22
+ return identity?.isDelegatedChild === true ? "classic.SubagentStop" : "classic.Stop";
23
+ }
24
+ export function judgedInputOf(args) {
25
+ const owned = ownArgs(args);
26
+ return owned.ok ? owned.value : args;
27
+ }
28
+ export function admittedChainOf(bus, spec, deps) {
29
+ const offered = new Map();
30
+ for (const r of [...(deps.mods ?? []), ...(spec.mods ?? [])])
31
+ offered.set(r.name, r);
32
+ const hung = bus.mounted();
33
+ const links = [];
34
+ for (const rec of bus.records) {
35
+ if ("refusedBy" in rec)
36
+ continue;
37
+ const registration = offered.get(rec.name);
38
+ if (registration !== undefined)
39
+ links.push(Object.freeze({ registration, handlers: Object.freeze(hung.filter((h) => h.plugin === rec.name)) }));
40
+ }
41
+ return Object.freeze(links);
42
+ }
43
+ const ADMITTED_CHAINS = new WeakMap();
44
+ function recordAdmittedChain(bus, seats) {
45
+ const chain = admittedChainOf(bus, { ...(seats.task !== undefined ? { mods: [...seats.task] } : {}) }, { ...(seats.deployment !== undefined ? { mods: [...seats.deployment] } : {}) });
46
+ ADMITTED_CHAINS.set(bus, chain);
47
+ return chain;
48
+ }
49
+ export function chainOfBus(bus) {
50
+ return ADMITTED_CHAINS.get(bus);
51
+ }
52
+ const sameMatcher = (a, b) => {
53
+ if (a === undefined || b === undefined)
54
+ return a === b;
55
+ const ka = Object.keys(a).sort();
56
+ const kb = Object.keys(b).sort();
57
+ return ka.length === kb.length && ka.every((k, i) => k === kb[i] && a[k] === b[k]);
58
+ };
59
+ const sameHandler = (a, b) => a.seat === b.seat && a.pattern === b.pattern && a.observe === b.observe && a.caught === b.caught && sameMatcher(a.matcher, b.matcher);
60
+ function sameModLink(a, b) {
61
+ return a.registration === b.registration && a.handlers.length === b.handlers.length && a.handlers.every((h, j) => sameHandler(h, b.handlers[j]));
62
+ }
63
+ export function sameModChain(a, b) {
64
+ return a.length === b.length && a.every((l, i) => sameModLink(l, b[i]));
65
+ }
66
+ const judgesCall = (p) => !p.observe;
67
+ export function chainJudges(bus) {
68
+ return bus.hasHandlers("classic.PreToolUse", judgesCall) || bus.hasHandlers("tool.check", judgesCall);
69
+ }
70
+ const SCREENING_CHAINS = new WeakMap();
71
+ export function recordScreeningChain(policy, chain) {
72
+ SCREENING_CHAINS.set(policy, chain);
73
+ }
74
+ export function screeningChainOf(policy) {
75
+ return SCREENING_CHAINS.get(policy);
76
+ }
77
+ export function sameInstallation(pc, leg) {
78
+ const bus = screeningChainOf(pc.policy);
79
+ const chain = bus !== undefined ? chainOfBus(bus) : undefined;
80
+ return (chain !== undefined &&
81
+ sameModChain(chain, leg.chain) &&
82
+ askApproverIdentity(pc.onAsk) === askApproverIdentity(leg.onAsk) &&
83
+ (pc.durableMandate === true) === leg.durableMandate &&
84
+ (pc.contentMandate === true) === leg.contentMandate &&
85
+ pc.hookEnv === leg.hookEnv &&
86
+ pc.autoMode?.decider === leg.decider);
87
+ }
88
+ export function standsInFor(pc, leg, legChainJudges) {
89
+ return legChainJudges && sameInstallation(pc, { ...leg, durableMandate: false, contentMandate: false });
90
+ }
91
+ const judgesToolCheck = (h) => {
92
+ const selected = expandModPattern(h.pattern);
93
+ return !h.observe && "names" in selected && selected.names.includes("tool.check");
94
+ };
95
+ export function screeningInstallationsOf(entries) {
96
+ return entries.flatMap((pc) => {
97
+ const bus = screeningChainOf(pc.policy);
98
+ return bus !== undefined || pc.mods !== undefined ? [{ bus, chain: pc.mods }] : [];
99
+ });
100
+ }
101
+ export function unraisableGuardsOf(installations) {
102
+ const guards = installations.flatMap((i) => (i.bus !== undefined ? [] : (i.chain ?? []).filter((l) => l.handlers.some(judgesToolCheck)).map((l) => `"${inlineUntrusted(l.registration.name, 80)}"`)));
103
+ return guards.length === 0 ? undefined : `an inherited screening entry names the tool.check guard of ${guards.join(", ")}, but its policy is not one createPreToolUseConstraintPolicy minted, so the guard has no chain to judge this leg's calls on — hand the minted policy back as it is`;
104
+ }
105
+ const judges = (p) => judgesCall(p);
106
+ export function inheritedToolChecks(entries, standsIn, settleOf) {
107
+ const unraisable = unraisableGuardsOf(screeningInstallationsOf(entries));
108
+ if (unraisable !== undefined)
109
+ throw modsInvalid(unraisable);
110
+ const checks = [];
111
+ for (const pc of entries) {
112
+ const bus = screeningChainOf(pc.policy);
113
+ if (bus === undefined || standsIn(pc) || !bus.hasHandlers("tool.check", judges))
114
+ continue;
115
+ checks.push(Object.freeze({ bus, judges, settle: settleOf(pc) }));
116
+ }
117
+ return Object.freeze(checks);
118
+ }
119
+ export function classicEventBase(identity, permissionMode) {
120
+ const agentId = agentIdOf(identity);
121
+ return {
122
+ ...(identity !== undefined ? { identity } : {}),
123
+ ...(agentId !== undefined ? { agentId } : {}),
124
+ ...(permissionMode !== undefined ? { permissionMode } : {}),
125
+ };
126
+ }
127
+ export async function observeClassic(bus, event, e, signal) {
128
+ if (!bus.hasHandlers(event))
129
+ return;
130
+ try {
131
+ await bus.dispatch(event, e, { bottom: engineCore, ...(signal !== undefined ? { signal } : {}) });
132
+ }
133
+ catch {
134
+ }
135
+ }
136
+ export async function dispatchClassic(bus, event, e, options) {
137
+ if (!bus.hasHandlers(event))
138
+ return undefined;
139
+ const check = options.checkAnswer;
140
+ return await bus.dispatch(event, e, {
141
+ bottom: engineCore,
142
+ ...(options.signal !== undefined ? { signal: options.signal } : {}),
143
+ ...(check !== undefined ? { checkAnswer: (a) => (a === ENGINE_CORE_ANSWER ? undefined : check(a)) } : {}),
144
+ });
145
+ }
146
+ export function stringMembersAnswer(event, members) {
147
+ return (answer) => {
148
+ if (answer === null || answer === false)
149
+ return undefined;
150
+ if (typeof answer !== "object")
151
+ return `answered ${typeof answer}; ${event} takes { ${members.map((m) => `${m}?`).join(", ")} }`;
152
+ for (const m of members) {
153
+ const v = Reflect.get(answer, m);
154
+ if (v !== undefined && typeof v !== "string")
155
+ return `answered a ${typeof v} "${m}"; it is a string`;
156
+ }
157
+ return undefined;
158
+ };
159
+ }
160
+ export function stringMembersOf(answer, members) {
161
+ const out = {};
162
+ if (typeof answer !== "object" || answer === null)
163
+ return out;
164
+ for (const m of members) {
165
+ const v = Reflect.get(answer, m);
166
+ if (typeof v === "string")
167
+ out[m] = v;
168
+ }
169
+ return out;
170
+ }
171
+ const FAILURE_CLAUSE = Object.freeze({
172
+ threw: (who, why) => `crashed (extension "${who}" ${why})`,
173
+ timeout: (who, why) => `did not answer (extension "${who}" ${why})`,
174
+ violation: (who, why) => `gave an answer the station cannot take (extension "${who}" ${why})`,
175
+ reentry: (who, why) => `was skipped on re-entry and its .catch did not answer (extension "${who}" ${why})`,
176
+ });
177
+ export function failedHandlerClause(f) {
178
+ return FAILURE_CLAUSE[f.cause](extensionWords(f.registration, 80), extensionWords(f.reason, 200));
179
+ }
180
+ export async function observePermissionDenied(input) {
181
+ const { payload, hostObserver } = input;
182
+ const e = { ...payload, ...classicEventBase(payload.identity, payload.permissionMode) };
183
+ if (input.legBus?.hasHandlers("classic.PermissionDenied") === true)
184
+ await observeClassic(input.legBus, "classic.PermissionDenied", e, input.signal);
185
+ if (hostObserver === undefined)
186
+ return;
187
+ const own = await admitModChain({
188
+ deployment: [
189
+ {
190
+ name: "toolGate.permissionDenied",
191
+ tier: "user",
192
+ uses: { events: ["classic.PermissionDenied"], calls: [] },
193
+ register: (on) => on("classic.PermissionDenied", async () => void (await hostObserver(payload)), { observe: true }),
194
+ },
195
+ ],
196
+ }, input.onHostObserverFailure);
197
+ await observeClassic(own, "classic.PermissionDenied", e, input.signal);
198
+ }
199
+ export async function screenUserPrompt(bus, e, signal) {
200
+ let outcome;
201
+ try {
202
+ outcome = await dispatchClassic(bus, "classic.UserPromptSubmit", e, {
203
+ ...(signal !== undefined ? { signal } : {}),
204
+ checkAnswer: stringMembersAnswer("classic.UserPromptSubmit", ["block", "additionalContext"]),
205
+ });
206
+ }
207
+ catch (err) {
208
+ return { kind: "failed", registration: "engine", cause: "threw", reason: `could not raise the screen: ${describeThrown(err)}`, skipped: [] };
209
+ }
210
+ if (outcome === undefined)
211
+ return undefined;
212
+ if (outcome.kind !== "answered")
213
+ return outcome;
214
+ return { kind: "answered", ...stringMembersOf(outcome.answer, ["block", "additionalContext"]) };
215
+ }
216
+ export const TOOL_CHECK_DECISIONS = Object.freeze(["allow", "ask", "deny"]);
217
+ const isToolCheckDecision = (v) => TOOL_CHECK_DECISIONS.some((d) => d === v);
218
+ function readToolCheckAnswer(answer) {
219
+ if (typeof answer !== "object" || answer === null)
220
+ return `answered ${answer === null ? "null" : typeof answer}; tool.check takes { decision, reason? }`;
221
+ const decision = Reflect.get(answer, "decision");
222
+ const reason = Reflect.get(answer, "reason");
223
+ if (!isToolCheckDecision(decision))
224
+ return `no { decision } (one of ${TOOL_CHECK_DECISIONS.join(", ")})`;
225
+ if (reason !== undefined && typeof reason !== "string")
226
+ return `answered a ${typeof reason} "reason"; it is a string`;
227
+ return { decision, ...(reason !== undefined ? { reason } : {}) };
228
+ }
229
+ export async function raiseToolCheck(bus, e, projection, signal, judges) {
230
+ if (!bus.hasHandlers("tool.check", judges))
231
+ return undefined;
232
+ let outcome;
233
+ try {
234
+ outcome = await bus.dispatch("tool.check", e, {
235
+ bottom: () => projection,
236
+ ...(judges !== undefined ? { participant: judges } : {}),
237
+ ...(signal !== undefined ? { signal } : {}),
238
+ checkAnswer: (a) => {
239
+ const read = readToolCheckAnswer(a);
240
+ return typeof read === "string" ? read : undefined;
241
+ },
242
+ });
243
+ }
244
+ catch (err) {
245
+ return { kind: "failed", registration: "engine", cause: "threw", reason: `could not raise the check: ${describeThrown(err)}`, skipped: [] };
246
+ }
247
+ if (outcome.kind !== "answered")
248
+ return outcome;
249
+ const read = readToolCheckAnswer(outcome.answer);
250
+ if (typeof read === "string")
251
+ return { kind: "failed", registration: outcome.answeredBy ?? "engine", cause: "violation", reason: read, skipped: outcome.skipped };
252
+ return { kind: "answered", ...read, ...(outcome.answeredBy !== undefined ? { by: outcome.answeredBy } : {}) };
253
+ }
254
+ const NO_COMPOSE = Object.freeze({ deploy: Object.freeze([]), task: Object.freeze([]), warnings: Object.freeze([]) });
255
+ function composeOverlaysOf(answer) {
256
+ if (!isPlainRecord(answer)) {
257
+ return `answered ${answer === null ? "null" : Array.isArray(answer) ? "an array" : typeof answer === "object" ? "an object that is not a plain record" : typeof answer}; prompt.compose takes a plain { overlays }`;
258
+ }
259
+ const stray = Object.keys(answer).filter((k) => k !== "overlays");
260
+ if (stray.length > 0)
261
+ return `the answer carries ${stray.slice(0, 5).map((k) => JSON.stringify(extensionWords(k, 40))).join(", ")} (overlays only)`;
262
+ const overlays = answer["overlays"];
263
+ return Array.isArray(overlays) && Object.getPrototypeOf(overlays) === Array.prototype ? overlays : "the answer's overlays is not an ordinary array";
264
+ }
265
+ export async function raisePromptCompose(bus, e, options) {
266
+ if (!bus.hasHandlers("prompt.compose"))
267
+ return NO_COMPOSE;
268
+ const sourceOf = (seat) => (seat === "deployment" ? "deploy" : "task");
269
+ const bottom = Object.freeze({ overlays: Object.freeze([]) });
270
+ const taken = new WeakMap([[bottom, Object.freeze([])]]);
271
+ const HEAD = "the answer does not carry what next() returned unchanged at its head (a handler adds overlays; it never rewrites or removes another's)";
272
+ let outcome;
273
+ try {
274
+ outcome = await bus.dispatch("prompt.compose", e, {
275
+ bottom: () => bottom,
276
+ ...(options.signal !== undefined ? { signal: options.signal } : {}),
277
+ checkAnswer: (answer, _e, by, below) => {
278
+ if (typeof answer === "object" && answer !== null && taken.has(answer))
279
+ return undefined;
280
+ const mine = composeOverlaysOf(answer);
281
+ if (typeof mine === "string")
282
+ return mine;
283
+ const returned = below[below.length - 1];
284
+ const lower = typeof returned === "object" && returned !== null ? taken.get(returned) : undefined;
285
+ if (lower === undefined) {
286
+ return below.length === 0
287
+ ? "it answered without next(e) — prompt.compose collects: a handler awaits next(e) and adds after what it returned"
288
+ : "next() is still running; prompt.compose answers after it";
289
+ }
290
+ if (mine.length < lower.length)
291
+ return HEAD;
292
+ const out = [...lower];
293
+ for (let i = 0; i < mine.length; i++) {
294
+ const under = lower[i];
295
+ const v = validateOverlay(mine[i], { source: sourceOf(under?.by.seat ?? by.seat), event: "prompt.compose", lowerAdds: options.lowerAdds });
296
+ if (under !== undefined) {
297
+ if ("violation" in v || JSON.stringify(v.overlay) !== JSON.stringify(under.overlay))
298
+ return HEAD;
299
+ continue;
300
+ }
301
+ if ("violation" in v)
302
+ return v.violation;
303
+ out.push(Object.freeze({ overlay: v.overlay, by: Object.freeze({ plugin: by.plugin, seat: by.seat }) }));
304
+ }
305
+ taken.set(answer, Object.freeze(out));
306
+ return undefined;
307
+ },
308
+ });
309
+ }
310
+ catch (err) {
311
+ return { deploy: [], task: [], warnings: [`prompt.compose could not be raised (${describeThrown(err)}); no mods overlay applies this run`] };
312
+ }
313
+ const warnings = (outcome.kind === "aborted" ? [] : outcome.skipped).map((s) => `prompt.compose: extension "${extensionWords(s.registration, 80)}" ${s.cause === "violation" ? "gave an answer the station cannot take" : s.cause}: ${extensionWords(s.reason, 300)} — that answer is skipped; what is below it stands`);
314
+ if (outcome.kind !== "answered")
315
+ return { deploy: [], task: [], warnings };
316
+ const answer = outcome.answer;
317
+ const contributions = typeof answer === "object" && answer !== null ? taken.get(answer) : undefined;
318
+ if (contributions === undefined)
319
+ return { deploy: [], task: [], warnings: [...warnings, "prompt.compose: the chain's answer is not one the station took; no mods overlay applies this run"] };
320
+ const blocks = [];
321
+ for (const { overlay, by } of contributions) {
322
+ const item = { overlay, origin: { source: sourceOf(by.seat), by: by.plugin } };
323
+ const last = blocks[blocks.length - 1];
324
+ if (last !== undefined && last.by.plugin === by.plugin && last.by.seat === by.seat)
325
+ last.items.push(item);
326
+ else
327
+ blocks.push({ by, items: [item] });
328
+ }
329
+ const inChainOrder = blocks.reverse().flatMap((b) => b.items);
330
+ return {
331
+ deploy: Object.freeze(inChainOrder.filter((o) => o.origin.source === "deploy")),
332
+ task: Object.freeze(inChainOrder.filter((o) => o.origin.source === "task")),
333
+ warnings,
334
+ };
335
+ }
336
+ function lateView() {
337
+ let seats;
338
+ const need = (method) => {
339
+ if (seats === undefined)
340
+ throw new Error(`${method}: the engine facade is not available before the leg is prepared`);
341
+ return seats;
342
+ };
343
+ const view = {
344
+ env: { exec: (command, options) => need("process.run").exec(command, options) },
345
+ complete: (request, signal) => need("model.complete").complete(request, signal),
346
+ book: (reply) => need("model.complete").book(reply),
347
+ session: {
348
+ id: () => need("session.id").sessionId,
349
+ cwd: () => need("session.cwd").cwd(),
350
+ root: () => need("session.root").root(),
351
+ model: () => need("session.model").model(),
352
+ messages: () => need("session.messages").messages(),
353
+ },
354
+ now: () => need("clock.now").now(),
355
+ tools: () => need("tool.list").tools(),
356
+ agents: () => need("agent.list").agents(),
357
+ };
358
+ return {
359
+ view,
360
+ bind: (s) => {
361
+ seats = s;
362
+ },
363
+ };
364
+ }
365
+ export async function admitLegMods(input) {
366
+ const late = lateView();
367
+ const seats = modSeatsOf(input.spec, input.deps);
368
+ const bus = await admitMods({
369
+ side: "engine",
370
+ seats,
371
+ bottoms: engineMethodBottoms(late.view),
372
+ report: modsReportToOnError(input.deps.onError, input.sessionId),
373
+ describeThrown,
374
+ isProxy: types.isProxy,
375
+ });
376
+ for (const record of bus.records) {
377
+ if ("refusedBy" in record)
378
+ deliverEngineNotice(input.deps.onNotice, registrationRefusedNotice(record, input.sessionId));
379
+ }
380
+ return { bus, chain: recordAdmittedChain(bus, seats), bindFacade: late.bind };
381
+ }
382
+ function replyText(reply) {
383
+ return reply.content.flatMap((c) => (c.type === "text" ? [c.text] : [])).join("");
384
+ }
385
+ export function legFacadeSeats(input) {
386
+ const runtime = brainToRuntime(input.deps.brain);
387
+ const answeredBy = new Map();
388
+ const byUsage = new WeakMap();
389
+ return {
390
+ exec: (command, options) => input.executionEnv.exec(command, options),
391
+ complete: async (request, signal) => {
392
+ const model = request.model !== undefined ? resolveModel(request.model, input.deps.models) : input.model;
393
+ answeredBy.set(model.id, model);
394
+ const auth = await input.spec.getApiKeyAndHeaders?.(model);
395
+ const reply = await runtime.completeSimple(model, { ...request.context, messages: [...request.context.messages] }, { signal, maxTokens: request.maxTokens, ...(auth?.apiKey !== undefined ? { apiKey: auth.apiKey } : {}), ...(auth?.headers !== undefined ? { headers: auth.headers } : {}) });
396
+ if (reply.stopReason === "error" || reply.stopReason === "aborted")
397
+ throw new Error(`model.complete: ${reply.errorMessage ?? reply.stopReason}`);
398
+ if (reply.usage !== undefined)
399
+ byUsage.set(reply.usage, { model, ...(reply.diagnostics !== undefined ? { diagnostics: reply.diagnostics } : {}) });
400
+ return Object.freeze({ text: replyText(reply), model: model.id, ...(reply.usage !== undefined ? { usage: reply.usage } : {}) });
401
+ },
402
+ sessionId: input.sessionId,
403
+ book: (reply) => {
404
+ const seen = reply.usage !== undefined ? byUsage.get(reply.usage) : undefined;
405
+ const record = seen !== undefined && seen.model.id === reply.model ? seen : undefined;
406
+ const model = record?.model ?? answeredBy.get(reply.model);
407
+ if (model === undefined)
408
+ throw new Error(`model.complete: the reply names model "${reply.model}", which no call of this leg resolved; it is not booked`);
409
+ input.book(model, { usage: reply.usage, ...(record?.diagnostics !== undefined ? { diagnostics: record.diagnostics } : {}) });
410
+ },
411
+ cwd: () => input.cwdRef?.current ?? input.taskRoot,
412
+ root: () => input.taskRoot,
413
+ model: () => input.model.id,
414
+ messages: () => input.lastBrainContext()?.messages ?? [],
415
+ now: () => (input.deps.now ?? Date.now)(),
416
+ tools: () => [...input.activeTools],
417
+ agents: () => (input.agentListing?.entries ?? []).map((e) => e.name),
418
+ };
419
+ }
420
+ export async function admitModChain(seats, onError) {
421
+ const bus = await admitMods({
422
+ side: "engine",
423
+ seats,
424
+ bottoms: engineMethodBottoms(lateView().view),
425
+ report: (err) => {
426
+ try {
427
+ onError?.(err);
428
+ }
429
+ catch {
430
+ }
431
+ },
432
+ describeThrown,
433
+ isProxy: types.isProxy,
434
+ });
435
+ recordAdmittedChain(bus, seats);
436
+ return bus;
437
+ }
@@ -10,9 +10,58 @@
10
10
  import type { McpServerSpec } from "./mcp-server-spec.js";
11
11
  import type { ToolContentOrigin } from "./tool-spec.js";
12
12
  import type { McpConnectionPool } from "./mcp-connection-pool.js";
13
+ import type { McpInstructionsEntry } from "./prompt-section-seat.js";
13
14
  /** The two names a server's `allowTools` carries to let the cross-server resource readers reach its resources (a server whose allowlist omits one is left out of that reader). */
14
15
  export declare const MCP_RESOURCE_LIST_ALLOW = "list_resources";
15
16
  export declare const MCP_RESOURCE_READ_ALLOW = "read_resource";
17
+ /** The canonical names of the resource tools (the trio: list-all / read-one / list-under-a-directory). They belong to no one server: each aggregates the resources of every connected server that advertises them. */
18
+ export declare const LIST_MCP_RESOURCES = "ListMcpResourcesTool";
19
+ export declare const READ_MCP_RESOURCE = "ReadMcpResourceTool";
20
+ export declare const READ_MCP_RESOURCE_DIR = "ReadMcpResourceDirTool";
21
+ /** Does the valve (`leaves`: its one predicate) leave at least one of the cross-server resource tools? While it does, a connected server may contribute to them whatever it lists. */
22
+ export declare function resourceFacesLeft(leaves: (tool: {
23
+ readonly name: string;
24
+ }) => boolean): boolean;
25
+ /**
26
+ * Are a server's instructions about something the run holds? Yes when the run's roster (`held`) holds a tool of the server's prefix
27
+ * domain the valve leaves, or a cross-server resource tool the valve leaves (the aggregates exist only if some connected server
28
+ * advertised resources, and which one is not recorded, so a held face keeps the instructions of every server); a server whose own
29
+ * listing (`listed` — any superset of it) has no tool at all (instructions only) is taught while any resource face is left. Read off
30
+ * the roster, a tool the deployment's `toolFaces` overlay refused counts as what it is — not held. A server the run holds nothing of
31
+ * is not taught: its instructions describe tools the model will not hold.
32
+ *
33
+ * The one answer to "should the model be taught them": the initial instructions block and the delta lane's adds after a roster change read
34
+ * it. Whether the model HOLDS them is the ledger's ({@link instructionsTold}), which the disconnect line reads.
35
+ */
36
+ export declare function instructionsTaught(leaves: (tool: {
37
+ readonly name: string;
38
+ readonly aliases?: readonly string[];
39
+ }) => boolean, serverName: string, held: ReadonlyArray<{
40
+ readonly name: string;
41
+ readonly aliases?: readonly string[];
42
+ }>, listed: ReadonlyArray<{
43
+ readonly name: string;
44
+ }>): boolean;
45
+ /** A materialization's instructions delta lane (`MaterializedMcp.instructionsDelta`): what the run drains at its next boundary. */
46
+ export interface InstructionsLane {
47
+ pendingAdds: McpInstructionsEntry[];
48
+ pendingRemovals: string[];
49
+ }
50
+ /** Are this server's instructions in the model's context now? */
51
+ export declare function instructionsTold(lane: InstructionsLane, server: string): boolean;
52
+ /** A dial's default: the server's instructions are taught (a materialization alone takes every entry it returns as taught, until a run states its block). */
53
+ export declare function toldOnDial(lane: InstructionsLane, server: string): void;
54
+ /** The run's start: the stable block is what the model is told. A removal already queued for a server outside the block names instructions the model
55
+ * never held, so it is withdrawn; a server inside the block with a removal queued is not in context (the frame will retract it). */
56
+ export declare function toldAtStart(lane: InstructionsLane, servers: ReadonlySet<string>): void;
57
+ /** Take this server's unread adds off the lane; a first copy that never reached the model leaves the ledger with it. */
58
+ export declare function withdrawInstructionAdds(lane: InstructionsLane, server: string): void;
59
+ /** Queue this server's current text (superseding an unread copy). In context already ⇒ stays so; otherwise a first copy, queued. */
60
+ export declare function tellInstructions(lane: InstructionsLane, entry: McpInstructionsEntry): void;
61
+ /** The server's connection is gone: unread adds are withdrawn, and the model is told its instructions no longer apply only if it holds them. */
62
+ export declare function retractInstructions(lane: InstructionsLane, server: string): void;
63
+ /** A re-dial that connected: a retraction still unread never reached the model, so it is withdrawn and the text the model holds stands. */
64
+ export declare function unretractInstructions(lane: InstructionsLane, server: string): void;
16
65
  /** One declared MCP server and its mounted tools. */
17
66
  export interface MountedMcpServer {
18
67
  readonly server: McpServerSpec;
@@ -33,6 +82,14 @@ interface RosterEntry {
33
82
  readonly name: string;
34
83
  readonly mcpRemoteName?: string;
35
84
  }
85
+ /**
86
+ * The names among `names` that belong to the declared server `serverName`: those under its prefix domain (`mcp__<server>__`), which
87
+ * is the roster's own definition of a server's tools (the live roster swaps a server's tools by it). Handed a roster's names, it is
88
+ * the ONE answer to "how many tools of this server does the run hold" — the re-dial's receipt and notice, the content-class
89
+ * declaration line, the wiring manifest's per-server count and {@link mountedMcpOf} all read it, so no two of them can count
90
+ * differently. Handed a server's own listing it answers what the server offers, which is not a mount count.
91
+ */
92
+ export declare function toolNamesOfServer(names: Iterable<string>, serverName: string): string[];
36
93
  /**
37
94
  * Read the run's MCP surface off its roster. `declared` is the run's frozen server declarations; `aggregateNames` the names of the
38
95
  * tools its materialization minted that no server owns. A tool is a server's when its wire name sits under the server's prefix
@@ -2,10 +2,79 @@ import { mintNamespacePrefix } from "./protocol-naming.js";
2
2
  import { MCP_NAMESPACE } from "./protocol-table.js";
3
3
  export const MCP_RESOURCE_LIST_ALLOW = "list_resources";
4
4
  export const MCP_RESOURCE_READ_ALLOW = "read_resource";
5
+ export const LIST_MCP_RESOURCES = "ListMcpResourcesTool";
6
+ export const READ_MCP_RESOURCE = "ReadMcpResourceTool";
7
+ export const READ_MCP_RESOURCE_DIR = "ReadMcpResourceDirTool";
8
+ const MCP_RESOURCE_FACES = [LIST_MCP_RESOURCES, READ_MCP_RESOURCE, READ_MCP_RESOURCE_DIR];
9
+ export function resourceFacesLeft(leaves) {
10
+ return MCP_RESOURCE_FACES.some((name) => leaves({ name }));
11
+ }
12
+ export function instructionsTaught(leaves, serverName, held, listed) {
13
+ const own = new Set(toolNamesOfServer(held.map((t) => t.name), serverName));
14
+ return held.some((t) => (own.has(t.name) || MCP_RESOURCE_FACES.includes(t.name)) && leaves(t)) || (toolNamesOfServer(listed.map((t) => t.name), serverName).length === 0 && resourceFacesLeft(leaves));
15
+ }
16
+ const ledgers = new WeakMap();
17
+ function ledgerOf(lane) {
18
+ let ledger = ledgers.get(lane);
19
+ if (ledger === undefined)
20
+ ledgers.set(lane, (ledger = new Map()));
21
+ return ledger;
22
+ }
23
+ const queuedFor = (lane, server) => lane.pendingAdds.some((e) => e.server === server);
24
+ export function instructionsTold(lane, server) {
25
+ const state = ledgerOf(lane).get(server);
26
+ return state === "context" || (state === "queued" && !queuedFor(lane, server));
27
+ }
28
+ export function toldOnDial(lane, server) {
29
+ ledgerOf(lane).set(server, "context");
30
+ }
31
+ export function toldAtStart(lane, servers) {
32
+ const ledger = ledgerOf(lane);
33
+ ledger.clear();
34
+ for (let i = lane.pendingRemovals.length - 1; i >= 0; i--)
35
+ if (!servers.has(lane.pendingRemovals[i]))
36
+ lane.pendingRemovals.splice(i, 1);
37
+ for (const server of servers)
38
+ if (!lane.pendingRemovals.includes(server))
39
+ ledger.set(server, "context");
40
+ }
41
+ export function withdrawInstructionAdds(lane, server) {
42
+ const told = instructionsTold(lane, server);
43
+ for (let i = lane.pendingAdds.length - 1; i >= 0; i--)
44
+ if (lane.pendingAdds[i].server === server)
45
+ lane.pendingAdds.splice(i, 1);
46
+ if (!told)
47
+ ledgerOf(lane).delete(server);
48
+ }
49
+ export function tellInstructions(lane, entry) {
50
+ const told = instructionsTold(lane, entry.server);
51
+ withdrawInstructionAdds(lane, entry.server);
52
+ lane.pendingAdds.push(entry);
53
+ ledgerOf(lane).set(entry.server, told ? "context" : "queued");
54
+ }
55
+ export function retractInstructions(lane, server) {
56
+ const told = instructionsTold(lane, server);
57
+ withdrawInstructionAdds(lane, server);
58
+ if (told && !lane.pendingRemovals.includes(server))
59
+ lane.pendingRemovals.push(server);
60
+ ledgerOf(lane).delete(server);
61
+ }
62
+ export function unretractInstructions(lane, server) {
63
+ if (!lane.pendingRemovals.includes(server))
64
+ return;
65
+ for (let i = lane.pendingRemovals.length - 1; i >= 0; i--)
66
+ if (lane.pendingRemovals[i] === server)
67
+ lane.pendingRemovals.splice(i, 1);
68
+ ledgerOf(lane).set(server, "context");
69
+ }
70
+ export function toolNamesOfServer(names, serverName) {
71
+ const prefix = mintNamespacePrefix(MCP_NAMESPACE, serverName);
72
+ return [...names].filter((name) => name.startsWith(prefix));
73
+ }
5
74
  export function mountedMcpOf(input) {
6
75
  const servers = (input.declared ?? []).map((server) => {
7
- const prefix = mintNamespacePrefix(MCP_NAMESPACE, server.name);
8
- const tools = input.roster.flatMap((t) => (t.name.startsWith(prefix) && typeof t.mcpRemoteName === "string" ? [{ name: t.name, remoteName: t.mcpRemoteName }] : []));
76
+ const owned = new Set(toolNamesOfServer(input.roster.map((t) => t.name), server.name));
77
+ const tools = input.roster.flatMap((t) => (owned.has(t.name) && typeof t.mcpRemoteName === "string" ? [{ name: t.name, remoteName: t.mcpRemoteName }] : []));
9
78
  return { server, tools };
10
79
  });
11
80
  const aggregate = input.roster.filter((t) => input.aggregateNames.has(t.name)).map((t) => t.name);
@@ -1,3 +1,4 @@
1
+ import { type ReceiptMode } from "./mods/kernel/receive.js";
1
2
  /** How a refusal names the object being received. */
2
3
  export interface OwnPropertyReceiptWords {
3
4
  /** The object, e.g. `RunnerDeps`. */
@@ -14,5 +15,17 @@ export declare function receiptRefusal(message: string): Error & {
14
15
  /** The receipt's first look, before ANY reflection on the object (a door that must look at the caller's object before
15
16
  * the receipt — a retired-name door reading its prototype chain — calls this first): a Proxy is refused. */
16
17
  export declare function refuseProxy(given: object, words: OwnPropertyReceiptWords): void;
18
+ /** The configuration receipt's mode of the one receipt: the top record read, each getter once, its members as given (a declared list's
19
+ * own read too: the list itself, each element once, the elements as given). */
20
+ export declare const CONFIG_RECEIPT_MODE: ReceiptMode;
21
+ /**
22
+ * The declaration receipt's mode of the one receipt — a declaration the engine judges and then holds (an MCP server's or an A2A peer's
23
+ * entry, a `toolAxes` record, a lock declaration) received as plain data held to the engine's one depth for a caller's value,
24
+ * {@link MODS_VALUE_DEPTH} levels of records and lists below the declaration itself (the bound a mods handler's answer is held to): every
25
+ * own string-keyed member read once off its captured descriptor (a getter called once, enumerable or not), every level copied, anything
26
+ * that is not data refused (a Proxy at any level, a function, a bigint, an object of another prototype, a structure that contains
27
+ * itself, a container nested deeper — a shared one measured where it sits each time it is met), every copied container frozen.
28
+ */
29
+ export declare const DECLARATION_RECEIPT_MODE: ReceiptMode;
17
30
  /** Read `given` by the receipt law (module note): the plain copy, every own member taken once from its captured descriptor. */
18
31
  export declare function receiveOwnProperties<T extends object>(given: T, words: OwnPropertyReceiptWords): T;