@sema-agent/core 7.54.1 → 7.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -1,5 +1,6 @@
1
1
  import type { BrainRetryErrClass, BrainStatus } from "../core/types.js";
2
2
  import type { ReasoningWireFacts } from "./reasoning.js";
3
+ import type { CapabilityDeclaration, ModelCapability } from "./model-capability.js";
3
4
  /** Run `fn` with a per-task brain-status sink in scope. ALS propagates it through the async brain calls
4
5
  * inside `fn` (the harness's prompt → brain.stream → connect/retry loop), so {@link emitBrainStatus}
5
6
  * reaches THIS task's sink and nothing else. */
@@ -168,3 +169,22 @@ export declare function runWithCredentialOriginRefusals<T>(observe: (r: Credenti
168
169
  * `routeRefusalError`; a judgment that only advises reports nothing). The
169
170
  * observer is the Runner's own seat, whose one delivery is the guarded `deliverEngineNotice` — nothing is swallowed here. */
170
171
  export declare function reportCredentialOriginRefusal(report: CredentialOriginRefusalReport): void;
172
+ /** A request that withheld a capability from the model it was sent to: the model, the capability, the model's declaration
173
+ * that withheld it (`capabilityOf`), and how many blocks it replaced. */
174
+ export interface CapabilityWithheldReport {
175
+ modelId: string;
176
+ capability: ModelCapability;
177
+ cause: Exclude<CapabilityDeclaration, "declared_on">;
178
+ count: number;
179
+ }
180
+ /**
181
+ * Run `fn` with a per-run withheld-capability sink in scope — the SIXTH brain→runner ALS channel, with the fourth's shape
182
+ * and for its reasons: the WHOLE leg (the end-of-task compaction runs after the leg's prompt, and a child leg running
183
+ * inside its parent's tool call must report to its own leg, not to the scope it inherited), not shielded around the leg's
184
+ * internal calls, not revoked on settlement, no-op outside the scope.
185
+ */
186
+ export declare function runWithCapabilityWithheld<T>(observe: (r: CapabilityWithheldReport) => void, fn: () => Promise<T>): Promise<T>;
187
+ /** Report a withheld capability to the active per-run sink, if any (called by the message assemblers' one emit,
188
+ * `reportImagesWithheld`). The observer is the Runner's own seat, whose one delivery is the guarded `deliverEngineNotice`
189
+ * — nothing is swallowed here: a seat that fails otherwise fails the request build, never the person's notice in silence. */
190
+ export declare function reportCapabilityWithheld(report: CapabilityWithheldReport): void;
@@ -75,3 +75,10 @@ export function runWithCredentialOriginRefusals(observe, fn) {
75
75
  export function reportCredentialOriginRefusal(report) {
76
76
  credentialOriginRefusalSinkStore.getStore()?.observe(report);
77
77
  }
78
+ const capabilityWithheldSinkStore = new AsyncLocalStorage();
79
+ export function runWithCapabilityWithheld(observe, fn) {
80
+ return capabilityWithheldSinkStore.run({ observe }, fn);
81
+ }
82
+ export function reportCapabilityWithheld(report) {
83
+ capabilityWithheldSinkStore.getStore()?.observe(report);
84
+ }
@@ -1,7 +1,7 @@
1
1
  import { createAssistantMessageEventStream, } from "../internal/llm.js";
2
2
  import { STREAM_TORN_WARNING } from "./stream-shared.js";
3
3
  import { FLOOR_OUTPUT_TOKENS, parseContextOverflow, planOutputCapAdjustment } from "./context-overflow.js";
4
- import { abortLikeName, BrainError, brainErrorCodeOf, classifyFetchThrow, classifyHttp, describeNetworkError, isProviderEchoShape, namesTheFailure, proxyTunnelRefusedSentence, readConnectFailure, readProviderErrorCode, readProviderRequestId, refusedTheRequest } from "./errors.js";
4
+ import { abortLikeName, BrainError, brainErrorCodeOf, classifyFetchThrow, classifyHttp, describeNetworkError, isProviderEchoShape, namesTheFailure, proxyTunnelRefusedSentence, readConnectFailure, readProviderErrorCode, readProviderRequestId, refusedTheRequest, thrownBrainFailure } from "./errors.js";
5
5
  import { stripUrlCredentials } from "./route-adjudicator.js";
6
6
  import { admittedRequestRoute } from "./request-route.js";
7
7
  import { isTransientStatus, isProviderCondition, isProviderConditionSource, judgeHttpFailure, PROVIDER_CONDITION_TRAITS, resolveProviderDialect, } from "./provider-dialect.js";
@@ -314,10 +314,11 @@ export function runStreamingBrain(args) {
314
314
  }
315
315
  errorMsg.stopReason = aborted ? "aborted" : "error";
316
316
  errorMsg.errorMessage = thrownText(err);
317
- if (!aborted && brainErrorCodeOf(err) !== undefined) {
318
- if (readMember(err, "inputTooLong") === true)
319
- errorMsg.errorKind = "input_too_long";
320
- else if (readMember(err, "inputTooLongRuledOut") === true)
317
+ const failure = aborted ? {} : thrownBrainFailure(err);
318
+ if (failure.code !== undefined) {
319
+ if (failure.errorKind !== undefined)
320
+ errorMsg.errorKind = failure.errorKind;
321
+ else if (failure.inputTooLongRuledOut === true)
321
322
  errorMsg.inputTooLongRuledOut = true;
322
323
  if (readMember(err, "errorBodyIncomplete") === true)
323
324
  errorMsg.errorBodyIncomplete = true;
@@ -14,7 +14,7 @@ import { type AssistantMessage, type ModelOutputInvalid, type StreamDropCause }
14
14
  *
15
15
  * Internal module: not re-exported from `src/index.ts`.
16
16
  */
17
- /** The warning (CC 2.1.220's words; gone from 2.1.245 on — 2.1.296 asks for a resume instead) stamped beside `partialFinalized` when a stream ended before its close — by the
17
+ /** The warning (the reference's former words; later replaced by a resume request) stamped beside `partialFinalized` when a stream ended before its close — by the
18
18
  * mid-stream promotion (the body threw) and by the parsers' own finalize (content arrived, no finish frame). */
19
19
  export declare const STREAM_TORN_WARNING = "Connection closed mid-response. The response above may be incomplete.";
20
20
  /** A provider word as a stream-end seat carries it: the word in the provider echo shape, else `?` — the fact that a
@@ -1,4 +1,5 @@
1
1
  import type { AgentTool } from "../internal/harness-types.js";
2
+ import { type HostFloor } from "./host-floor.js";
2
3
  import type { A2aServerSpec, ToolEffect } from "./types.js";
3
4
  /** The hard per-skill description bound (ruled 2026-08-03: ~2KiB). */
4
5
  export declare const A2A_SKILL_DESCRIPTION_MAX_CHARS = 2048;
@@ -96,4 +97,4 @@ export declare class A2aRpcError extends Error {
96
97
  * `allSettled` keeps it fail-open: one unreachable peer is a skipped peer with a warning, never a task
97
98
  * that cannot start.
98
99
  */
99
- export declare function materializeA2aTools(specs: readonly A2aServerSpec[], principal?: string, signal?: AbortSignal): Promise<MaterializedA2a>;
100
+ export declare function materializeA2aTools(specs: readonly A2aServerSpec[], principal?: string, signal?: AbortSignal, hostFloor?: HostFloor): Promise<MaterializedA2a>;
package/dist/core/a2a.js CHANGED
@@ -1,7 +1,8 @@
1
1
  import { randomUUID } from "node:crypto";
2
2
  import { Type } from "typebox";
3
3
  import { A2A_TASK_STATES } from "./a2a-task-state.js";
4
- import { assertEndpointBound, redirectPolicy, resolveProtocolHttpHeaders, underDeclaredHeaders } from "./protocol-http-auth.js";
4
+ import { assertEndpointBound, carriesDeclaredHeaders, resolveProtocolHttpHeaders, underDeclaredHeaders } from "./protocol-http-auth.js";
5
+ import { fetchFollowing, hopRefusal, HOST_FLOOR_REFUSED_CODE } from "./host-floor.js";
5
6
  import { describeHttpTransportFailure } from "./mcp-failure.js";
6
7
  import { findNamespacePrefixCollision, mintNamespacePrefix, mintNamespacedToolName } from "./protocol-naming.js";
7
8
  import { A2A_NAMESPACE } from "./protocol-table.js";
@@ -77,6 +78,7 @@ function safeId(v) {
77
78
  return undefined;
78
79
  return inlineUntrusted(s, A2A_ID_MAX_CHARS);
79
80
  }
81
+ const A2A_MAX_REDIRECTS = 20;
80
82
  function withRequestDeadline(outer, timeoutMs) {
81
83
  const controller = new AbortController();
82
84
  let timedOut = false;
@@ -144,21 +146,25 @@ async function readBoundedText(res, what) {
144
146
  async function requestJson(t, what, init) {
145
147
  const doFetch = resolveFetch();
146
148
  const deadline = withRequestDeadline(init.signal, init.timeoutMs);
149
+ const peerLabel = inlineUntrusted(t.peer, A2A_ID_MAX_CHARS);
147
150
  try {
148
- const res = await doFetch(init.url, {
151
+ const followed = await fetchFollowing(doFetch, new URL(init.url), {
149
152
  method: init.method,
150
- signal: deadline.signal,
151
- redirect: redirectPolicy(t.headers),
152
153
  headers: underDeclaredHeaders({ accept: "application/json", "a2a-version": A2A_PROTOCOL_VERSION, ...(init.body !== undefined ? { "content-type": "application/json" } : {}) }, t.headers),
153
154
  ...(init.body !== undefined ? { body: init.body } : {}),
154
- });
155
- const text = await readBoundedText(res, `${what} from A2A peer "${inlineUntrusted(t.peer, A2A_ID_MAX_CHARS)}"`);
155
+ signal: deadline.signal,
156
+ }, { refusal: (url) => hopRefusal(url, t.floor, false), follows: () => !carriesDeclaredHeaders(t.headers), maxRedirects: A2A_MAX_REDIRECTS });
157
+ if (followed.kind === "refused")
158
+ throw Object.assign(new Error(`a2a: ${what} on peer "${peerLabel}" is not sent — ${followed.reason}`), { code: HOST_FLOOR_REFUSED_CODE });
159
+ if (followed.kind === "too_many")
160
+ throw new Error(`a2a: ${what} on peer "${peerLabel}" was redirected more than ${A2A_MAX_REDIRECTS} times`);
161
+ const res = followed.res;
162
+ const text = await readBoundedText(res, `${what} from A2A peer "${peerLabel}"`);
156
163
  return { status: res.status, text };
157
164
  }
158
165
  catch (err) {
159
166
  if (init.signal?.aborted === true)
160
167
  throw err;
161
- const peerLabel = inlineUntrusted(t.peer, A2A_ID_MAX_CHARS);
162
168
  if (deadline.timedOut()) {
163
169
  throw new Error(`a2a: ${what} on peer "${peerLabel}" got no answer within ${init.timeoutMs}ms. The client stopped waiting — the peer may still be acting on the request, so treat the outcome as UNKNOWN and verify before retrying.`, { cause: err });
164
170
  }
@@ -553,16 +559,16 @@ function declaredPeerOf(declared, index) {
553
559
  const judged = judgeEntryToolAxes(snapshot, "a2a");
554
560
  return judged.ok ? { spec: judged.entry } : { spec: snapshot, refusal: judged.error };
555
561
  }
556
- async function materializePeer(peer, principal, lifecycle, signal) {
562
+ async function materializePeer(peer, principal, lifecycle, signal, floor) {
557
563
  if ("refusal" in peer)
558
564
  throw peer.refusal;
559
565
  const { spec } = peer;
560
566
  const declaredAxes = spec.toolAxes;
561
567
  const headers = resolveProtocolHttpHeaders(A2A_NAMESPACE.id, spec, principal);
562
- const discovery = { peer: spec.name, endpoint: spec.url, headers };
568
+ const discovery = { peer: spec.name, endpoint: spec.url, headers, floor };
563
569
  const card = readCard(spec.name, await discoverCardBody(spec, discovery, signal), spec.url);
564
570
  assertEndpointBound(A2A_NAMESPACE.id, spec.name, card.endpoint, spec.cardUrl === undefined ? [spec.url] : [spec.url, spec.cardUrl], headers);
565
- const transport = { peer: spec.name, endpoint: card.endpoint, headers };
571
+ const transport = { peer: spec.name, endpoint: card.endpoint, headers, floor };
566
572
  const tools = [];
567
573
  const skillAxes = [];
568
574
  for (const skill of card.skills) {
@@ -592,7 +598,7 @@ function asPeerWarning(spec, err) {
592
598
  warning.code = "a2a.peer_unavailable";
593
599
  return warning;
594
600
  }
595
- export async function materializeA2aTools(specs, principal, signal) {
601
+ export async function materializeA2aTools(specs, principal, signal, hostFloor) {
596
602
  const peers = specs.map((spec, index) => declaredPeerOf(spec, index));
597
603
  if (peers.length > 0) {
598
604
  const collision = findNamespacePrefixCollision(A2A_NAMESPACE, peers.map((p) => p.spec.name));
@@ -610,7 +616,7 @@ export async function materializeA2aTools(specs, principal, signal) {
610
616
  const toolAxes = [];
611
617
  const warnings = [];
612
618
  const statuses = [];
613
- const settled = await Promise.allSettled(peers.map((peer) => materializePeer(peer, principal, lifecycle, signal)));
619
+ const settled = await Promise.allSettled(peers.map((peer) => materializePeer(peer, principal, lifecycle, signal, hostFloor)));
614
620
  for (let i = 0; i < peers.length; i++) {
615
621
  const spec = peers[i].spec;
616
622
  const outcome = settled[i];
@@ -645,7 +651,7 @@ export async function materializeA2aTools(specs, principal, signal) {
645
651
  }
646
652
  const previous = statuses.find((s) => s.name === spec.name)?.toolNames ?? [];
647
653
  try {
648
- const fresh = await materializePeer(target, principal, lifecycle, signal);
654
+ const fresh = await materializePeer(target, principal, lifecycle, signal, hostFloor);
649
655
  const names = fresh.tools.map((t) => t.name);
650
656
  results.push({
651
657
  peer: spec.name,
@@ -0,0 +1,120 @@
1
+ /**
2
+ * The advisor seat's two answers, each minted here once and read by every reader: whether the advisor tool attaches for
3
+ * a (main model, advisor model) pair on a deployment ({@link advisorAttachVerdict} — the prepare mount, a host's advisor
4
+ * query and its echo all ask this one function), and whether a conversation has switched the advisor off
5
+ * ({@link advisorHoldOf} — read off the transcript, its only source of truth, at the mount, at every call and by a host).
6
+ * The closed sets the answers are spelled in live beside them.
7
+ */
8
+ import type { SessionTreeEntry } from "../internal/harness-types.js";
9
+ import { type BrainErrorCode } from "../brain/errors.js";
10
+ import type { AssertAllKeysHandled } from "./ask-origin.js";
11
+ import type { EngineNotice, Model, ModelRef, RunnerDeps } from "./types.js";
12
+ /** The tool's wire name. */
13
+ export declare const ADVISOR_TOOL_NAME = "advisor";
14
+ /** What a fork is told when it inherits the advisor tool with its parent's prefix — the reference's sentence. */
15
+ export declare const ADVISOR_FORK_SENTENCE = "Never consult the advisor tool.";
16
+ /** Why the advisor tool is not attached on a leg whose spec names an advisor model. The first six are the static verdict's
17
+ * answers; the last three are the mount's (the tool selector unmounted it, its route cannot pair, the transcript could
18
+ * not be read). */
19
+ export declare const ADVISOR_NOT_ATTACHED_REASONS: readonly ["disabled", "unknown_model", "advisor_unranked", "weakest_tier", "main_unranked", "pairing", "route_refused", "excluded", "hold_unknown"];
20
+ export type AdvisorNotAttachedReason = (typeof ADVISOR_NOT_ATTACHED_REASONS)[number];
21
+ /**
22
+ * Each reason's sentence to the person (`advisor.not_attached`, once per conversation per pair) — `null` for a reason that
23
+ * tells nobody: the deployment switched the advisor off (it is ignored), the deployment's tool selector unmounted it
24
+ * (`excluded`), or its route cannot pair with the deployment's credentials (`route_refused`, told to the operator by
25
+ * `route.seat_detached` — only an operator can fix it).
26
+ */
27
+ declare const NOT_ATTACHED_SENTENCE: {
28
+ readonly disabled: null;
29
+ readonly unknown_model: (a: string) => string;
30
+ readonly advisor_unranked: (a: string) => string;
31
+ readonly weakest_tier: (a: string) => string;
32
+ readonly main_unranked: (_a: string, m: string) => string;
33
+ readonly pairing: (a: string, m: string) => string;
34
+ readonly route_refused: null;
35
+ readonly excluded: null;
36
+ readonly hold_unknown: () => string;
37
+ };
38
+ export type NotAttachedSentenceCoversEveryReason = AssertAllKeysHandled<Exclude<AdvisorNotAttachedReason, keyof typeof NOT_ATTACHED_SENTENCE>>;
39
+ /** The shape door of `TaskSpec.advisorModel` (read only while the deployment switch is on): absent, a non-empty ref, or a
40
+ * Model object; anything else refuses (`config.advisor_model_invalid`) — a model the engine cannot read names no advisor. */
41
+ export declare function assertAdvisorModelShape(ref: unknown): void;
42
+ /** The three faces of one advisor call: guidance came back, the advisor model refused, or no guidance could be had. */
43
+ export declare const ADVISOR_OUTCOMES: readonly ["reviewed", "declined", "unavailable"];
44
+ export type AdvisorOutcome = (typeof ADVISOR_OUTCOMES)[number];
45
+ /** The static verdict: the advisor attaches on `model`, or does not and says why. */
46
+ export type AdvisorAttachVerdict = {
47
+ readonly state: "on";
48
+ readonly model: Model;
49
+ } | {
50
+ readonly state: "not_attached";
51
+ readonly reason: Exclude<AdvisorNotAttachedReason, "route_refused" | "excluded" | "hold_unknown">;
52
+ };
53
+ /**
54
+ * Whether the advisor tool attaches for `advisor` beside the run's `main` model, in command order: the deployment switch,
55
+ * then the advisor itself (a model the catalog cannot resolve, one on no declared tier, one on the weakest tier — `lite`,
56
+ * the tier the `haiku` alias names), then the main model (on no declared tier, or on a WEAKER tier than the advisor's:
57
+ * an advisor at least as capable as the main model attaches). Tiers are read by the classifier seat's own reading
58
+ * ({@link tierIndexOf}) over a catalog {@link normalizeSeatDeps} expanded, so a host holding raw deps gets the engine's
59
+ * answer. No tiers declared ⇒ no ranks ⇒ not attached.
60
+ */
61
+ export declare function advisorAttachVerdict(args: {
62
+ deps: Pick<RunnerDeps, "models" | "tiers" | "advisorTool">;
63
+ main: Model;
64
+ advisor: ModelRef;
65
+ }): AdvisorAttachVerdict;
66
+ /**
67
+ * Which failure of an advisor request switches the advisor off for the conversation: the advisor model's credential refused
68
+ * (`auth`), or a provider 400 / 422 its minter ruled out as an over-window request (`invalid_request` with
69
+ * `inputTooLongRuledOut`) — deterministic client faults that repeat until the conversation is compacted. Every other code,
70
+ * an over-window refusal and an unclassified 400 pass (the next call may succeed). Total over the brain codes by its fence.
71
+ */
72
+ export declare const ADVISOR_HOLD_CAUSES: Readonly<{
73
+ readonly auth: "hold";
74
+ readonly invalid_request: "hold_unless_window";
75
+ readonly rate_limit: "pass";
76
+ readonly server: "pass";
77
+ readonly network: "pass";
78
+ readonly http: "pass";
79
+ readonly stream_torn: "pass";
80
+ readonly refusal: "pass";
81
+ readonly length_empty: "pass";
82
+ }>;
83
+ /** What one failure's code does to the conversation's advisor ({@link ADVISOR_HOLD_CAUSES}). */
84
+ export type AdvisorHoldDisposition = "hold" | "hold_unless_window" | "pass";
85
+ export type HoldCausesCoverEveryBrainCode = AssertAllKeysHandled<Exclude<BrainErrorCode, keyof typeof ADVISOR_HOLD_CAUSES>>;
86
+ /** What a failed advisor request said about itself — the fields the hold reads and the card carries. */
87
+ export interface AdvisorFailure {
88
+ readonly code?: BrainErrorCode;
89
+ readonly errorKind?: "input_too_long" | "degenerate" | "length_empty";
90
+ readonly inputTooLongRuledOut?: true;
91
+ }
92
+ /** Whether this failure switches the advisor off for the conversation ({@link ADVISOR_HOLD_CAUSES}). */
93
+ export declare function advisorFailureHolds(f: AdvisorFailure): boolean;
94
+ /** The conversation's advisor switch-off, with the cause of the call that switched it. */
95
+ export interface AdvisorHold {
96
+ readonly code?: BrainErrorCode;
97
+ readonly errorKind?: AdvisorFailure["errorKind"];
98
+ }
99
+ /**
100
+ * Whether the conversation on this branch has switched the advisor off, read off the transcript: an advisor tool result
101
+ * recorded after the latest compaction whose card says `hold: true` — the latest such card's cause. A compaction clears it
102
+ * (the card lands before it); a new conversation has none; a fork copies its parent's branch and with it the hold.
103
+ * `undefined` = not held. Members of a recorded card outside their closed sets are not carried.
104
+ */
105
+ export declare function advisorHoldOf(entries: ReadonlyArray<SessionTreeEntry>): AdvisorHold | undefined;
106
+ /** A not-attached reason the person is told about — its own fact or one they can act on — as a type. */
107
+ export type AdvisorToldReason = {
108
+ [R in AdvisorNotAttachedReason]: (typeof NOT_ATTACHED_SENTENCE)[R] extends null ? never : R;
109
+ }[AdvisorNotAttachedReason];
110
+ /** Whether the person is told about this reason ({@link NOT_ATTACHED_SENTENCE}: the reasons with a sentence). */
111
+ export declare function advisorReasonTold(reason: AdvisorNotAttachedReason): reason is AdvisorToldReason;
112
+ /** The `advisor.not_attached` notice for a reason the person is told about. */
113
+ export declare function advisorNotAttachedNotice(args: {
114
+ reason: AdvisorToldReason;
115
+ advisorModel: string;
116
+ mainModel: string;
117
+ sessionId: string;
118
+ runId?: string;
119
+ }): EngineNotice;
120
+ export {};
@@ -0,0 +1,92 @@
1
+ import { ALL_BRAIN_ERROR_CODES } from "../brain/errors.js";
2
+ import { DEFAULT_TIER_ORDER, resolveModel } from "./roles.js";
3
+ import { normalizeSeatDeps, tierIndexOf } from "./runner/classifier-ladder.js";
4
+ export const ADVISOR_TOOL_NAME = "advisor";
5
+ export const ADVISOR_FORK_SENTENCE = "Never consult the advisor tool.";
6
+ export const ADVISOR_NOT_ATTACHED_REASONS = Object.freeze(["disabled", "unknown_model", "advisor_unranked", "weakest_tier", "main_unranked", "pairing", "route_refused", "excluded", "hold_unknown"]);
7
+ const NOT_ATTACHED_SENTENCE = {
8
+ disabled: null,
9
+ unknown_model: (a) => `The advisor model "${a}" is not in this deployment's model catalog, so the advisor is off.`,
10
+ advisor_unranked: (a) => `"${a}" cannot be used as an advisor: the deployment declares no tier for it (declare RunnerDeps.tiers so the engine knows which model is stronger).`,
11
+ weakest_tier: (a) => `"${a}" cannot be used as an advisor: it is on the weakest tier.`,
12
+ main_unranked: (_a, m) => `The advisor will not activate on the main model (${m}): the deployment declares no tier for it (declare RunnerDeps.tiers). Subagents may still use it.`,
13
+ pairing: (a, m) => `${a} is less capable than the current main model (${m}), so the advisor will not activate. Choose a more capable advisor, or switch to a smaller main model.`,
14
+ route_refused: null,
15
+ excluded: null,
16
+ hold_unknown: () => `The advisor is off for this run: whether this conversation had switched it off could not be read.`,
17
+ };
18
+ export function assertAdvisorModelShape(ref) {
19
+ if (ref === undefined || (typeof ref === "string" ? ref !== "" : typeof ref === "object" && ref !== null && typeof ref.id === "string"))
20
+ return;
21
+ const shown = typeof ref === "string" ? "an empty string" : ref === null ? "null" : Array.isArray(ref) ? "an array" : typeof ref;
22
+ throw Object.assign(new Error(`TaskSpec.advisorModel must be a non-empty model ref or a Model (got ${shown}) — a model the engine cannot read names no advisor.`), { code: "config.advisor_model_invalid" });
23
+ }
24
+ export const ADVISOR_OUTCOMES = Object.freeze(["reviewed", "declined", "unavailable"]);
25
+ export function advisorAttachVerdict(args) {
26
+ if (args.deps.advisorTool === "disabled")
27
+ return { state: "not_attached", reason: "disabled" };
28
+ const deps = normalizeSeatDeps(args.deps);
29
+ let advisor;
30
+ try {
31
+ advisor = resolveModel(args.advisor, deps.models);
32
+ }
33
+ catch {
34
+ return { state: "not_attached", reason: "unknown_model" };
35
+ }
36
+ const advisorTier = tierIndexOf(deps, advisor);
37
+ if (advisorTier === undefined)
38
+ return { state: "not_attached", reason: "advisor_unranked" };
39
+ if (advisorTier === DEFAULT_TIER_ORDER.indexOf("lite"))
40
+ return { state: "not_attached", reason: "weakest_tier" };
41
+ const mainTier = tierIndexOf(deps, args.main);
42
+ if (mainTier === undefined)
43
+ return { state: "not_attached", reason: "main_unranked" };
44
+ if (advisorTier > mainTier)
45
+ return { state: "not_attached", reason: "pairing" };
46
+ return { state: "on", model: advisor };
47
+ }
48
+ export const ADVISOR_HOLD_CAUSES = Object.freeze({
49
+ auth: "hold",
50
+ invalid_request: "hold_unless_window",
51
+ rate_limit: "pass",
52
+ server: "pass",
53
+ network: "pass",
54
+ http: "pass",
55
+ stream_torn: "pass",
56
+ refusal: "pass",
57
+ length_empty: "pass",
58
+ });
59
+ export function advisorFailureHolds(f) {
60
+ if (f.code === undefined)
61
+ return false;
62
+ const row = ADVISOR_HOLD_CAUSES[f.code];
63
+ return row === "hold" || (row === "hold_unless_window" && f.errorKind !== "input_too_long" && f.inputTooLongRuledOut === true);
64
+ }
65
+ const ERROR_KINDS = new Set(["input_too_long", "degenerate", "length_empty"]);
66
+ export function advisorHoldOf(entries) {
67
+ for (let i = entries.length - 1; i >= 0; i--) {
68
+ const e = entries[i];
69
+ if (e.type === "compaction")
70
+ return undefined;
71
+ if (e.type !== "message" || e.message.role !== "toolResult" || e.message.toolName !== ADVISOR_TOOL_NAME)
72
+ continue;
73
+ const d = e.message.details;
74
+ if (d === null || typeof d !== "object" || d.type !== "advisor" || d.hold !== true)
75
+ continue;
76
+ const code = ALL_BRAIN_ERROR_CODES.find((c) => c === d.code);
77
+ const errorKind = typeof d.errorKind === "string" && ERROR_KINDS.has(d.errorKind) ? d.errorKind : undefined;
78
+ return { ...(code !== undefined ? { code } : {}), ...(errorKind !== undefined ? { errorKind } : {}) };
79
+ }
80
+ return undefined;
81
+ }
82
+ export function advisorReasonTold(reason) {
83
+ return NOT_ATTACHED_SENTENCE[reason] !== null;
84
+ }
85
+ export function advisorNotAttachedNotice(args) {
86
+ const sentence = NOT_ATTACHED_SENTENCE[args.reason];
87
+ return {
88
+ code: "advisor.not_attached",
89
+ message: sentence(args.advisorModel, args.mainModel),
90
+ detail: { advisorModel: args.advisorModel, mainModel: args.mainModel, reason: args.reason, sessionId: args.sessionId, ...(args.runId !== undefined ? { runId: args.runId } : {}) },
91
+ };
92
+ }
@@ -19,8 +19,7 @@ export interface AgentDefinition {
19
19
  /** Guidance shown to the model for WHEN to pick this agent (listed in the delegation tool's description). */
20
20
  whenToUse?: string;
21
21
  /**
22
- * F4 (CC 2.1.198 parity, `whenToUseLean` — 锚 pretty.js:409174 `rbm` + selection `tIl` :453029
23
- * `(lean && e.whenToUseLean) || e.whenToUse`): a SHORT variant of {@link whenToUse} preferred on
22
+ * F4 (`whenToUseLean`): a SHORT variant of {@link whenToUse} preferred on
24
23
  * lean-prompt surfaces. sema posture: the engine runs the CC lean-prompt arm wholesale (web.ts
25
24
  * lean-card precedent), so roster listings/descriptions prefer this text whenever present;
26
25
  * {@link whenToUse} remains the fallback. Optional — a single-text agent behaves exactly as before.
@@ -36,7 +35,7 @@ export interface AgentDefinition {
36
35
  /** Tool denylist (a deny always wins), tool NAMES: `Tool(content)` hides the whole `Tool`. See {@link allowTools} for the per-agent delegation-tool note. */
37
36
  denyTools?: string[];
38
37
  /**
39
- * F7 (CC 2.1.198 parity, per-agent `skills` — 锚 pretty.js:422126 `e.skills ?? []`, GA/ungated in 198:
38
+ * F7 (per-agent `skills`:
40
39
  * CC preloads each named skill's prompt content into the child's opening messages, warning on misses).
41
40
  * sema shape: full {@link SkillSpec} objects (sema has no ambient skill registry to resolve bare names
42
41
  * against) threaded into the chosen child's `TaskSpec.skills` — disclosed in its `<skills>` block +
@@ -44,7 +43,7 @@ export interface AgentDefinition {
44
43
  */
45
44
  skills?: SkillSpec[];
46
45
  /**
47
- * F7 (CC 2.1.198 parity, per-agent `background` — 锚 pretty.js:453611 `H.background===!0` OR-ed into
46
+ * F7 (per-agent `background`, OR-ed into
48
47
  * the background predicate, GA/ungated): `true` = this agent ALWAYS launches on the background lane
49
48
  * (an omitted `run_in_background` no longer means sync, and the per-call parameter cannot force sync —
50
49
  * CC-same OR semantics). Requires the delegation tool's `background` surface; without one the child
@@ -52,7 +51,7 @@ export interface AgentDefinition {
52
51
  */
53
52
  background?: boolean;
54
53
  /**
55
- * F7 (CC 2.1.198 parity, per-agent `isolation` — 锚 pretty.js:453599 `z = a ?? H.isolation`, GA):
54
+ * F7 (per-agent `isolation`):
56
55
  * default isolation for this agent; an explicit per-call `isolation` argument wins. sema supports
57
56
  * `"worktree"` (CC's `"remote"` arm is a claude.ai-session concern, not ported).
58
57
  */
@@ -86,8 +85,8 @@ export interface AgentDefinition {
86
85
  */
87
86
  memoryPersistenceCapable?: boolean;
88
87
  /**
89
- * Observer agents (CC 2.1.206 parity — 逐字锚 docs/CC206-OBSERVER-ANCHORS-2026-07-11.md, schema
90
- * 面 C @28385708): "Agent type auto-spawned as a background observer whenever this agent runs.
88
+ * Observer agents (schema
89
+ * 面 C): "Agent type auto-spawned as a background observer whenever this agent runs.
91
90
  * The observer receives read-only activity digests and reports via the ObserverReport tool; it
92
91
  * never participates in the task." Resolution is warn-and-unobserved on an unknown type and
93
92
  * refuses chaining (an observer's own `observer` declaration is ignored). Gated by
@@ -116,7 +115,7 @@ export interface SkillSpec {
116
115
  * either list asks once (`Execute skill: <name>`, the card listing what it releases); a skill the person invoked by
117
116
  * name ({@link import("./task-spec.js").TaskSpec.userInvokedSkills}) grants without asking. The grant holds for that
118
117
  * run (a steer it takes in does not end it) and the next runTask starts without it. An entry this grammar reads as nothing — `*` (it voids an allow list; on a deny list it is inert and the rest of the
119
- * list still refuses), `mcp__*`, a write path, a domain — grants nothing and is announced at the start of the run (`permission.allowed_tool_not_granted`). A table whose value is not a list (a string, an object…) reads as one such entry; `null` is no table.
118
+ * list still refuses), `mcp__*` / `mcp__*__*` (an allow entry names a peer), a write path, a domain — grants nothing and is announced at the start of the run (`permission.allowed_tool_not_granted`). A table whose value is not a list (a string, an object…) reads as one such entry; `null` is no table.
120
119
  */
121
120
  allowedTools?: string[];
122
121
  /** The tools refused for the rest of the run this skill is activated in — the frontmatter `disallowed-tools` list,
@@ -158,4 +157,14 @@ export interface SkillSpec {
158
157
  * byte-identical result; a placeholder with no directory stays verbatim.
159
158
  */
160
159
  baseDir?: string;
160
+ /**
161
+ * The hooks this skill carries — registrations on the mods bus (the `TaskSpec.mods` form: user tier, a name unique in the
162
+ * run), whose handlers take part only while the skill is ACTIVE on the leg that loads it: from its activation (the `Skill`
163
+ * tool's success, or prepare for a skill the person invoked by name; a resumed run reopens the skills its park recorded
164
+ * active) to the end of that run. A host compiles a frontmatter `hooks:` table into one such registration; the engine
165
+ * reads no hook grammar. Each hangs `classic.*` events only (any other event refuses the prepare, `config.mods_invalid`).
166
+ * They are admitted with the leg's other registrations at its prepare (so a skill never activated still counts as a hook
167
+ * the leg may run) and stay the leg's own: a delegated child neither dispatches them nor is screened by them.
168
+ */
169
+ mods?: readonly import("./mods/classic-events.js").EngineModRegistration[];
161
170
  }