@sema-agent/core 7.54.1 → 7.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -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,29 +1,49 @@
1
1
  /**
2
- * Linear-time `*` glob match (design/127 M6: NOT a RegExp — patterns may come from tenant-supplied
3
- * Settings layers; the classic two-pointer walk has zero ReDoS surface and the same semantics as CC's
4
- * anchored `^…$`+dotAll construction: every non-`*` char is literal, `*` spans anything incl. newlines).
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.
6
+ */
7
+ import type { ProtocolNamespace } from "./protocol-table.js";
8
+ import type { RuleBehavior } from "./permission-rule-model.js";
9
+ /**
10
+ * `*` glob match (design/127 M6: NOT a RegExp — patterns may come from tenant-supplied Settings layers; the same semantics as
11
+ * CC's anchored `^…$`+dotAll construction: every non-`*` char is literal, `*` spans anything incl. newlines). The literal
12
+ * before the first star and the one after the last are checked at the two ends, and each literal between two stars is put at
13
+ * its earliest place after the one before it (the earliest placement leaves the most room, so no later one need be tried):
14
+ * there is no backtracking, so no arrangement of stars multiplies the work and there is no ReDoS surface. The cost is at most
15
+ * the product of the two lengths, in the engine's native comparisons: a literal after the last star is refused at the end in
16
+ * one pass over its own length (`*` + k `a` + `b` against 2k `a`s costs k, not k²), and the shape that does reach the product
17
+ * is a long literal between two stars that matches over most of its length at every place — `*` + k `a` + `b` + k `a` + `*`
18
+ * against n `a`s is about k × n comparisons (49 ms at k = 1 000, n = 65 536).
5
19
  */
6
20
  export declare function wildcardMatch(pattern: string, value: string): boolean;
7
21
  /**
8
- * Does a namespaced RULE name cover `toolName`? — the tail branch of CC's rule matcher `VRp`
9
- * (:595780), which is UNCONDITIONAL there (its `globMatching` option gates only the whole-name glob
10
- * branch, so CC's allow lane — `mVo` :595803, which passes no options — matches MCP segments too).
11
- * Three covering forms, matching CC's three disjuncts (`<ns>` = any protocol-table prefix):
12
- * · `<ns>__<peer>` — every tool of that peer (rule tool segment absent);
13
- * · `<ns>__<peer>__*` — the same set, spelled with the star CC's own settings validator
14
- * recommends (`"MCP rules do not support patterns in parentheses …
15
- * use mcp__srv__*"`);
16
- * · `<ns>__<peer>__get_*` — a glob over the tool segment.
17
- * A LITERAL tool segment is deliberately NOT covered here: it is an exact tool name, and the exact
18
- * table already answers it — the same split CC makes with its leading `ruleName === toolName`.
19
- *
20
- * Rule and target must be in the SAME namespace, and peer segments compare EXACTLY (CC
21
- * `s.serverName === a.serverName`). A rule must therefore spell the peer the way the mint does; that
22
- * is the same string an operator reads off any mounted tool name, and inventing a fuzzier comparison
23
- * here would let one rule reach a peer — or a protocol — it does not name.
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.
31
+ */
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.
24
48
  */
25
- export declare function namespacedRuleNameCovers(ruleName: string, toolName: string): boolean;
26
- /** True ⇔ this rule name is a namespaced name whose reach is a SET of tools rather than one exact tool
27
- * — i.e. the shapes {@link namespacedRuleNameCovers} answers and an exact name table cannot. Every
28
- * lane that keys rules by exact tool name needs this to know which entries it must NOT key that way. */
29
- export declare function isNamespacedCoveringRuleName(name: string): boolean;
49
+ export declare function ruleNameReachIntoPeer(ruleName: string, ns: ProtocolNamespace, peer: string): "all" | "some" | "none";
@@ -1,52 +1,59 @@
1
- import { splitNamespacedName } from "./tool-name-aliases.js";
1
+ import { grantWildcardRefusalOf, readsNameGlob, splitNamespacedName } from "./tool-name-aliases.js";
2
2
  export function wildcardMatch(pattern, value) {
3
- let p = 0;
4
- let v = 0;
5
- let star = -1;
6
- let mark = 0;
7
- while (v < value.length) {
8
- if (p < pattern.length && pattern[p] === value[v] && pattern[p] !== "*") {
9
- p++;
10
- v++;
11
- }
12
- else if (p < pattern.length && pattern[p] === "*") {
13
- star = p++;
14
- mark = v;
15
- }
16
- else if (star >= 0) {
17
- p = star + 1;
18
- v = ++mark;
19
- }
20
- else {
21
- return false;
3
+ const first = pattern.indexOf("*");
4
+ if (first < 0)
5
+ return pattern === value;
6
+ const last = pattern.lastIndexOf("*");
7
+ const head = pattern.slice(0, first);
8
+ const tail = pattern.slice(last + 1);
9
+ if (value.length < head.length + tail.length || !value.startsWith(head) || !value.endsWith(tail))
10
+ return false;
11
+ const end = value.length - tail.length;
12
+ let at = head.length;
13
+ for (let from = first + 1; from <= last;) {
14
+ const next = pattern.indexOf("*", from);
15
+ if (next > from) {
16
+ const literal = pattern.slice(from, next);
17
+ const found = value.indexOf(literal, at);
18
+ if (found < 0 || found + literal.length > end)
19
+ return false;
20
+ at = found + literal.length;
22
21
  }
22
+ from = next + 1;
23
23
  }
24
- while (p < pattern.length && pattern[p] === "*")
25
- p++;
26
- return p === pattern.length;
24
+ return true;
27
25
  }
28
- function parseNamespacedRuleName(name) {
26
+ function namespacedPeerOf(name) {
29
27
  const split = splitNamespacedName(name);
30
- if (split === undefined || split.peer === "")
31
- return undefined;
32
- 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;
33
29
  }
34
- export function namespacedRuleNameCovers(ruleName, toolName) {
35
- const rule = parseNamespacedRuleName(ruleName);
36
- if (rule === undefined)
37
- return false;
38
- const target = parseNamespacedRuleName(toolName);
39
- if (target === undefined)
40
- return false;
41
- if (rule.protocol !== target.protocol)
42
- return false;
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 isNamespacedCoveringRuleName(name) {
50
- const parsed = parseNamespacedRuleName(name);
51
- return parsed !== undefined && (parsed.tool === undefined || parsed.tool.includes("*"));
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)
57
+ return "none";
58
+ return rule.tool === undefined ? "all" : "some";
52
59
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The longest output-style NAME the seat admits — the reference implementation's own bound (its `output_style`
3
- * renderer checks `style.length` against `HQe`, declared `HQe=256`; cli 2.1.280). Past it the reference drops the
3
+ * renderer checks `style.length` against `HQe`, declared `HQe=256`). Past it the reference drops the
4
4
  * per-turn reminder and logs an error; here the seat is refused at prepare (`config.output_style_invalid`), so a
5
5
  * name the deployment declared is never silently not stated.
6
6
  */
@@ -0,0 +1,15 @@
1
+ /** The longest scalar an argument rule reads, unless a policy states its own (`caps.maxScalarValueChars`): a longer value is not
2
+ * read, and the rule's lane wins (fail-closed). */
3
+ export declare const DEFAULT_MAX_SCALAR_VALUE_CHARS = 16384;
4
+ /** The call an argument rule is judged on: its arguments as the loop handed them, and its face (the tool's reading). */
5
+ export interface ParamRuleCall {
6
+ readonly args: unknown;
7
+ readonly face?: object | undefined;
8
+ }
9
+ /**
10
+ * Does the rule on argument `param` with `pattern` reach this call? Non-object arguments ⇒ no; own top-level properties only
11
+ * (`param` is a literal key, never a dotted path); scalar values only, trimmed, matched whole by the `*` glob; a value longer than
12
+ * `maxScalarValueChars` FAIL-CLOSES (reached: it cannot be read, so the rule's lane wins). A call without the parameter is reached
13
+ * by a rule whose value the tool's reading folds away ({@link readingAbsorbs}).
14
+ */
15
+ export declare function paramRuleReaches(call: ParamRuleCall, param: string, pattern: string, maxScalarValueChars?: number): boolean;
@@ -0,0 +1,30 @@
1
+ import { canonicalize, UNCANONICALIZABLE } from "./canonical-json.js";
2
+ import { argsAsTheToolReads } from "./effective-path-target.js";
3
+ import { wildcardMatch } from "./namespaced-rule-name.js";
4
+ export const DEFAULT_MAX_SCALAR_VALUE_CHARS = 16_384;
5
+ export function paramRuleReaches(call, param, pattern, maxScalarValueChars = DEFAULT_MAX_SCALAR_VALUE_CHARS) {
6
+ const args = call.args;
7
+ if (typeof args !== "object" || args === null || Array.isArray(args))
8
+ return false;
9
+ if (!Object.hasOwn(args, param))
10
+ return readingAbsorbs(call, args, param, pattern);
11
+ const raw = args[param];
12
+ if (raw === undefined || raw === null)
13
+ return false;
14
+ const t = typeof raw;
15
+ if (t === "object" || t === "function" || t === "symbol")
16
+ return false;
17
+ const value = String(raw).trim();
18
+ return value.length > maxScalarValueChars || wildcardMatch(pattern, value);
19
+ }
20
+ function readingAbsorbs(call, args, param, pattern) {
21
+ if (pattern.includes("*"))
22
+ return false;
23
+ try {
24
+ const read = canonicalize(argsAsTheToolReads(call, { ...args, [param]: pattern }));
25
+ return read !== UNCANONICALIZABLE && read === canonicalize(args);
26
+ }
27
+ catch {
28
+ return false;
29
+ }
30
+ }
@@ -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" | "promptForm" | "promptBinding">;
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
@@ -50,11 +50,20 @@ export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "cli
50
50
  * and every leg multiplies it by its own.
51
51
  * · `fileHistory` — the request's file-history off switch (`"disabled"`, its only word), for the edits its delegates
52
52
  * make on its behalf too. An ORDINARY member (fill law); with one word no child can author it back on.
53
+ * · `projectMemory` — the request's off switch for the deployment's project context (`"disabled"`, its only word): the
54
+ * delegates that work for it read no project context either. An ORDINARY member (fill law), the `fileHistory` shape.
53
55
  * · `promptForm` — the host form of the system prompt (`"minimal"`, its only word: the core-behavior band is out). A
54
56
  * host's product choice for the whole delegation tree, so every engine-built child (both delegation lanes and the
55
57
  * observer sidecar) composes the same set of sections. An ORDINARY member (fill law).
56
58
  * · `promptBinding` — the binding (a deployment's scenario name), a prompt selector value. A child composes its
57
59
  * parent's center artifact, so its overlays' `when.binding` reads the same binding. An ORDINARY member (fill law).
60
+ * · `advisorModel` — the person's advisor setting: every engine-built child judges it against its OWN model (an advisor
61
+ * weaker than the child's model does not attach there). An ORDINARY member (fill law); the observer sidecar takes it and
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.
58
67
  */
59
68
  export interface ParentSpecSeat {
60
69
  readonly principal?: string;
@@ -73,8 +82,11 @@ export interface ParentSpecSeat {
73
82
  readonly skillListingBudgetFraction?: number;
74
83
  readonly skillListingMaxDescChars?: number;
75
84
  readonly fileHistory?: "disabled";
85
+ readonly projectMemory?: "disabled";
76
86
  readonly promptForm?: "minimal";
77
87
  readonly promptBinding?: string;
88
+ readonly advisorModel?: TaskSpec["advisorModel"];
89
+ readonly attachments?: TaskSpec["attachments"];
78
90
  }
79
91
  /** Refuse (by name, `config.deps_retired_key`) a seat that still carries a retired member. Read at every door a seat enters
80
92
  * by hand: the ctx reader, the apply, and the send lane's waker clamps. */
@@ -22,8 +22,11 @@ export function parentSpecSeatOf(spec, frozenOnQuestion) {
22
22
  ...(spec.skillListingBudgetFraction !== undefined ? { skillListingBudgetFraction: spec.skillListingBudgetFraction } : {}),
23
23
  ...(spec.skillListingMaxDescChars !== undefined ? { skillListingMaxDescChars: spec.skillListingMaxDescChars } : {}),
24
24
  ...(spec.fileHistory !== undefined ? { fileHistory: spec.fileHistory } : {}),
25
+ ...(spec.projectMemory !== undefined ? { projectMemory: spec.projectMemory } : {}),
25
26
  ...(spec.promptForm !== undefined ? { promptForm: spec.promptForm } : {}),
26
27
  ...(spec.promptBinding !== undefined ? { promptBinding: spec.promptBinding } : {}),
28
+ ...(spec.advisorModel !== undefined ? { advisorModel: spec.advisorModel } : {}),
29
+ ...(spec.attachments !== undefined ? { attachments: Object.freeze({ ...spec.attachments }) } : {}),
27
30
  ...clampFieldSeatsOf(spec),
28
31
  });
29
32
  }
@@ -45,8 +48,11 @@ export function applyParentSpecSeat(child, seat) {
45
48
  ...fill("skillListingBudgetFraction", seat.skillListingBudgetFraction),
46
49
  ...fill("skillListingMaxDescChars", seat.skillListingMaxDescChars),
47
50
  ...fill("fileHistory", seat.fileHistory),
51
+ ...fill("projectMemory", seat.projectMemory),
48
52
  ...fill("promptForm", seat.promptForm),
49
53
  ...fill("promptBinding", seat.promptBinding),
54
+ ...fill("advisorModel", seat.advisorModel),
55
+ ...fill("attachments", (seat.attachments !== undefined ? { ...seat.attachments } : undefined)),
50
56
  ...(seat.oneShot === true ? { oneShot: true } : {}),
51
57
  ...(seat.memoryPersistenceCapable === false ? { memoryPersistenceCapable: false } : fill("memoryPersistenceCapable", seat.memoryPersistenceCapable)),
52
58
  };
@@ -80,6 +80,7 @@ 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,
83
84
  batchToolCallIds: [`${scope}:call`],
84
85
  completedCallIds: [],
85
86
  },
@@ -82,15 +82,26 @@ export type PendingKind = (typeof PAUSE_REGISTRY)[GateKind]["pending"];
82
82
  export type ResumeGate = (typeof PAUSE_REGISTRY)[GateKind]["resume"] | "wake";
83
83
  /** Runtime twin of {@link GateKind}. */
84
84
  export declare function isGateKind(v: unknown): v is GateKind;
85
- /** The deadline semantic of a parked row — the registry's `facet` column, read with the gate's card: a question parked
86
- * under an approval gate kind is not an approval, so its deadline voids it (`B`) instead of denying it (`A`). No gate
87
- * kind of its own (the once-only winner, the reaper deadline and the batch stay one family). Only the literal
88
- * `"question"` card marks a question. */
85
+ /**
86
+ * The approval cards whose parked row takes another deadline semantic than its gate kind's: a question parked under an
87
+ * approval gate kind is not an approval, so its deadline voids it (`B`) instead of denying it (`A`). Read only on an
88
+ * approval gate, and only for a word of the closed card set ({@link parkedApprovalCardOf}). It is data so that a backend
89
+ * keeping the row's stored card word beside its gate kind (`checkpointIndexFacts`) generates its facet predicate from
90
+ * this table and the registry's `facet` column — the column's word IN this table's keys takes the key's facet, any other
91
+ * word, NULL or a non-approval kind takes the kind's — rather than from a list of its own. The facet itself is never
92
+ * stored: a stored copy goes stale the day a row of this table changes.
93
+ */
94
+ export declare const CARD_FACET_OVERRIDES: Readonly<{
95
+ readonly question: "B";
96
+ }>;
97
+ /** The deadline semantic of a parked row — the registry's `facet` column, unless the approval gate's card is a key of
98
+ * {@link CARD_FACET_OVERRIDES}. No gate kind of its own (the once-only winner, the reaper deadline and the batch stay
99
+ * one family). */
89
100
  export declare function facetOf(gate: {
90
101
  readonly kind: GateKind;
91
102
  readonly approvalCard?: unknown;
92
103
  }): "A" | "B" | "-";
93
- /** Is this parked row a question to the user: an approval-kind gate whose card is the reserved `"question"`. */
104
+ /** Is this parked row a question to the user: an approval gate whose card is the reserved `"question"`. */
94
105
  export declare function isQuestionGate(gate: {
95
106
  readonly kind: GateKind;
96
107
  readonly approvalCard?: unknown;
@@ -10,11 +10,15 @@ export const PAUSE_REGISTRY = {
10
10
  export function isGateKind(v) {
11
11
  return typeof v === "string" && Object.prototype.hasOwnProperty.call(PAUSE_REGISTRY, v);
12
12
  }
13
+ export const CARD_FACET_OVERRIDES = Object.freeze({ question: "B" });
13
14
  export function facetOf(gate) {
14
- return isQuestionGate(gate) ? "B" : PAUSE_REGISTRY[gate.kind].facet;
15
+ const reading = parkedApprovalCardOf(gate);
16
+ const overrides = CARD_FACET_OVERRIDES;
17
+ return (reading.kind === "card" ? overrides[reading.card] : undefined) ?? PAUSE_REGISTRY[gate.kind].facet;
15
18
  }
16
19
  export function isQuestionGate(gate) {
17
- return PAUSE_REGISTRY[gate.kind].pending === "tool_approval" && gate.approvalCard === "question";
20
+ const reading = parkedApprovalCardOf(gate);
21
+ return reading.kind === "card" && reading.card === "question";
18
22
  }
19
23
  export function parkedApprovalCardOf(gate) {
20
24
  const kind = gate.kind;
@@ -0,0 +1,70 @@
1
+ import type { PeerSendVerdict } from "../agents/cross-session-judge.js";
2
+ import type { PermissionModeClass } from "../agents/cross-session-envelope.js";
3
+ /** The listening session: whose box an inbound frame lands in, and the host's hooks. */
4
+ export interface PeerChannelSelf {
5
+ /** This session's id — its box is `session.<sessionId>`; a frame addressed to another id is not appended. */
6
+ sessionId: string;
7
+ /** The mailbox scope this session's box lives in. */
8
+ scope: string;
9
+ /** The doorbell rang (a peer appended to this session's box). The HOST decides what to do with it —
10
+ * start a turn now, or let the next boundary drain; the engine never starts a turn on a frame. */
11
+ onNudge?: () => void;
12
+ /** One event per refused connection, dropped frame or appended frame (the channel's account — a host
13
+ * logs or counts it). Never thrown into the listener. */
14
+ onEvent?: (event: PeerChannelEvent) => void;
15
+ }
16
+ /**
17
+ * Why the listener dropped a connection or a frame (closed set):
18
+ * - `first_line_deadline` — no complete line within the first-line deadline (the connection closes);
19
+ * - `line_too_long` — a line grew past the line wall before its newline (the connection closes);
20
+ * - `unauthenticated` — the first line was not an auth frame, or was blank / not JSON (the connection closes);
21
+ * - `bad_token` — the auth frame's token is not this session's (the connection closes);
22
+ * - `malformed_line` — an authenticated line that is not JSON, not an object, or a message without text;
23
+ * - `session_mismatch` — a message addressed to another session id;
24
+ * - `box_full` — this session's box is at its queued-message bound, so the message was not appended;
25
+ * - `unhandled_frame` — a frame type, control action or attachment this engine does not take over the socket;
26
+ * - `append_failed` — the box refused the append (the store's own error).
27
+ */
28
+ export declare const PEER_CHANNEL_DROP_REASONS: readonly ["first_line_deadline", "line_too_long", "unauthenticated", "bad_token", "malformed_line", "session_mismatch", "box_full", "unhandled_frame", "append_failed"];
29
+ export type PeerChannelDropReason = (typeof PEER_CHANNEL_DROP_REASONS)[number];
30
+ export type PeerChannelEvent = {
31
+ kind: "dropped";
32
+ reason: PeerChannelDropReason;
33
+ detail?: string;
34
+ } | {
35
+ kind: "appended";
36
+ seq: number;
37
+ } | {
38
+ kind: "nudged";
39
+ };
40
+ /** A bound listener. */
41
+ export interface PeerChannelListener {
42
+ /** The address peers reach this session at (the socket path). */
43
+ readonly address: string;
44
+ /** Stop listening and withdraw everything `listen` published. */
45
+ close(): Promise<void>;
46
+ }
47
+ /** One outbound message (the reference agent's dialect is the channel's business). */
48
+ export interface PeerChannelMessage {
49
+ /** The message text. */
50
+ body: string;
51
+ /** The sender's session id (self-claimed on the wire). */
52
+ fromSession?: string;
53
+ /** The sender's display name. */
54
+ fromName?: string;
55
+ /** The sender's self-attested permission-mode class. */
56
+ fromMode?: PermissionModeClass;
57
+ /** The prospective forwarding chain (this sender's own token already appended). */
58
+ hopChain: readonly string[];
59
+ }
60
+ /** The transport contract. A host wires one implementation; the engine dials and rings through it. */
61
+ export interface PeerChannel {
62
+ /** Bind this session's inbound address and publish whatever peers need to reach it. */
63
+ listen(self: PeerChannelSelf): Promise<PeerChannelListener>;
64
+ /** Carry one message to a reference-agent session at `address`. Never throws: every outcome is a verdict
65
+ * (`via: "uds"` on success; the `peer_send.*` transport codes otherwise). */
66
+ dial(address: string, message: PeerChannelMessage): Promise<PeerSendVerdict>;
67
+ /** Ring the doorbell of a session of this engine at `address`. Best-effort: `false` when the frame did not
68
+ * go out; never throws — the message is already in the recipient's box either way. */
69
+ nudge(address: string): Promise<boolean>;
70
+ }
@@ -0,0 +1 @@
1
+ export const PEER_CHANNEL_DROP_REASONS = Object.freeze(["first_line_deadline", "line_too_long", "unauthenticated", "bad_token", "malformed_line", "session_mismatch", "box_full", "unhandled_frame", "append_failed"]);