@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,77 @@
1
+ import { valveLeaves } from "../../agents/tool-filter.js";
2
+ import { ADVISOR_TOOL_NAME, advisorAttachVerdict, advisorHoldOf, advisorNotAttachedNotice, advisorReasonTold } from "../advisor-verdict.js";
3
+ import { deliverEngineNotice } from "../types.js";
4
+ import { advisorInstructionFrame } from "./advisor-instructions.js";
5
+ import { createAdvisorTool } from "./advisor-tool.js";
6
+ import { announceDigest } from "./announce-once-ledger.js";
7
+ import { conversationSegmentOf } from "./conversation-segment.js";
8
+ import { derivedRouteFallsBack } from "./derived-route-fallback.js";
9
+ import { derivedLegBrain } from "./side-call-account.js";
10
+ import { withBrainCallGuardrail } from "../../brain/timeout.js";
11
+ export async function prepareAdvisor(input) {
12
+ const { spec, deps, model, onceLedger, sessionId, runId } = input;
13
+ const told = onceLedger.arms().advisor;
14
+ if (spec.advisorModel === undefined && told === undefined)
15
+ return { manifest: undefined, instruction: undefined };
16
+ const requested = spec.advisorModel === undefined || input.advisorTool === "disabled" ? undefined : typeof spec.advisorModel === "string" ? spec.advisorModel : spec.advisorModel.id;
17
+ const fact = (f) => ({ ...(requested !== undefined ? { requested } : {}), main: model.id, ...f });
18
+ const notAttached = (reason, extra = {}) => {
19
+ if (input.rootLeg && requested !== undefined && advisorReasonTold(reason)) {
20
+ onceLedger.oncePerSession(announceDigest("advisor.not_attached", `${reason}\n${requested}\n${model.id}`), () => deliverEngineNotice(deps.onNotice, advisorNotAttachedNotice({ reason, advisorModel: requested, mainModel: model.id, sessionId, ...(runId !== undefined ? { runId } : {}) })));
21
+ }
22
+ return fact({ state: "not_attached", reason, ...extra });
23
+ };
24
+ let branch;
25
+ const readBranch = async () => (branch ??= await input.session.getBranch().catch(() => undefined));
26
+ let mounted = false;
27
+ const mount = async (advisor) => {
28
+ if ((spec.tools ?? []).some((t) => t.name === ADVISOR_TOOL_NAME)) {
29
+ const e = new Error(`Tool name "${ADVISOR_TOOL_NAME}" is reserved when TaskSpec.advisorModel attaches the advisor tool.`);
30
+ e.code = "config.reserved_tool_name";
31
+ throw e;
32
+ }
33
+ if (!valveLeaves(spec, input.selector)({ name: ADVISOR_TOOL_NAME }))
34
+ return fact({ state: "not_attached", reason: "excluded" });
35
+ const entries = await readBranch();
36
+ if (entries === undefined)
37
+ return notAttached("hold_unknown");
38
+ const held = advisorHoldOf(entries);
39
+ if (held !== undefined)
40
+ return fact({ state: "held", model: advisor.id, hold: held });
41
+ const route = await derivedRouteFallsBack({ seat: "advisor", derived: advisor, primary: model, brain: deps.brain, getApiKeyAndHeaders: spec.getApiKeyAndHeaders, onNotice: deps.onNotice, sessionId, ...(runId !== undefined ? { runId } : {}), onBrokenPairing: "detach" });
42
+ if (route.action === "detach")
43
+ return notAttached("route_refused", { routeCode: route.cause });
44
+ input.roster.mount(createAdvisorTool(advisorSeat(input, advisor)), { source: "builtin", mountedBy: "optional" });
45
+ mounted = true;
46
+ return fact({ state: "on", model: advisor.id });
47
+ };
48
+ let manifest;
49
+ if (spec.advisorModel !== undefined) {
50
+ const verdict = advisorAttachVerdict({ deps: { ...deps, ...(input.advisorTool !== undefined ? { advisorTool: input.advisorTool } : {}) }, main: model, advisor: spec.advisorModel });
51
+ manifest = verdict.state === "on" ? await mount(verdict.model) : notAttached(verdict.reason);
52
+ }
53
+ const entries = told !== undefined || mounted ? await readBranch() : undefined;
54
+ if (entries === undefined)
55
+ return { manifest, instruction: undefined };
56
+ const segment = conversationSegmentOf(entries);
57
+ const owed = advisorInstructionFrame(told !== undefined && told.segment === segment ? told.state : undefined, mounted);
58
+ return { manifest, instruction: { ...(owed !== undefined ? { owed } : {}), segment, mounted } };
59
+ }
60
+ function advisorSeat(input, model) {
61
+ const book = (lane, m, reply) => {
62
+ const door = input.sideCallBookRef.book;
63
+ if (door === undefined)
64
+ throw new Error("the advisor was consulted before the run body bound the leg's usage account, which it does before any tool call");
65
+ door(lane, m, reply);
66
+ };
67
+ const ms = input.brainCallGuardrailMs;
68
+ const guarded = (b) => (ms === undefined ? b : { ...b, stream: withBrainCallGuardrail((m, c, o) => b.stream(m, c, o), ms, {}) });
69
+ return {
70
+ model,
71
+ brain: derivedLegBrain(() => guarded(input.deps.brain), "advisor", book),
72
+ lastSentRequest: input.lastSentRequest,
73
+ readBranch: () => input.session.getBranch(),
74
+ getApiKeyAndHeaders: input.spec.getApiKeyAndHeaders,
75
+ markUsageUnknown: () => book("advisor", model, undefined),
76
+ };
77
+ }
@@ -38,8 +38,8 @@ export interface PrepareAskLaneInput {
38
38
  advertisedWritableDirs: Pick<AdvertisedWritableDirs, "roots"> | undefined;
39
39
  /** borrowed-readonly — the leg's ONE exempt root, stamped on every request a policy judges (`ToolCallRequest.exemptRoots`). */
40
40
  exemptRoots: readonly string[];
41
- /** borrowed-readonly — the shared mount roster; read at RUN time by the approval-preview projection (alias-aware
42
- * lookup over whatever the roster holds when the ask is minted). Never mutated here. */
41
+ /** borrowed-readonly — the shared mount roster; read at RUN time by the approval-preview projection (the dispatcher's
42
+ * resolution over whatever the roster holds when the ask is minted). Never mutated here. */
43
43
  tools: readonly AgentTool[];
44
44
  /** borrowed-mutable — the inherited-unavailable marker set. Writer here: `resolveAskBound` consumes (`delete`) a
45
45
  * marked call at its fail-closed intercept; the policy-chain phase records, the gate station sweeps. */
@@ -6,9 +6,11 @@ import { exactBoundInputHashOf } from "../canonical-json.js";
6
6
  import { composeCallSignal, raceSettlementAgainstSignal } from "./abort-race.js";
7
7
  import { failedJudgmentDeny, policyCheckAbortedDeny } from "./policy-throw.js";
8
8
  import { askMandateMember } from "../ask-origin.js";
9
- import { approvalCardMemberOf } from "../tool-roster.js";
9
+ import { approvalCardMemberOf, survivorsByName } from "../tool-roster.js";
10
+ import { toolNameIndex } from "../../internal/llm.js";
10
11
  import { gateAskCarry, lateAskSettlementObserver } from "./denial-limit-arms.js";
11
12
  import { consumeInheritedAskGrant } from "./inherited-ask-grants.js";
13
+ import { requesterOf } from "../mods/extension-call.js";
12
14
  import { settleReadRootGrant } from "./read-root-grant.js";
13
15
  function createDenyObserverNotifier(bus, signal) {
14
16
  if (bus === undefined || !bus.hasHandlers("classic.PermissionDenied"))
@@ -32,7 +34,7 @@ const sanitizePreview = (node, depth = 0) => {
32
34
  return out;
33
35
  };
34
36
  function resolveApprovalPreview(tools, toolName, args) {
35
- const t = tools.find((x) => x.name === toolName || (x.aliases?.includes(toolName) ?? false));
37
+ const t = toolNameIndex([...survivorsByName(tools).values()])(toolName);
36
38
  if (t?.approvalPreview === undefined)
37
39
  return {};
38
40
  try {
@@ -106,6 +108,7 @@ export function prepareAskLane(input) {
106
108
  ...askSourceIdentity(),
107
109
  ...riskAxesOf(req),
108
110
  ...approvalCardMemberOf(req),
111
+ ...requesterOf(modBus, req.toolCallId),
109
112
  ...(decision.action === "ask" && decision.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
110
113
  ...(decision.action === "ask" ? askMandateMember(decision) : {}),
111
114
  ...(decision.action === "ask" ? gateAskCarry(decision, isLiveApproverSeat(onAsk), autoModeDenialTracking.current) : {}),
@@ -36,7 +36,7 @@ import type { AssertAllKeysHandled } from "../ask-origin.js";
36
36
  import { type ChildClampSource } from "../child-clamp-seats.js";
37
37
  import type { InheritedGate, Prepared, RunInternals, RunnerSelfSeat, ToolFaceSnapshot } from "./contracts.js";
38
38
  import { type BlockedRef } from "./synthetic-tools.js";
39
- import { RosterBuilder, type RosterAxisTables } from "../tool-roster.js";
39
+ import { RosterBuilder } from "../tool-roster.js";
40
40
  import type { ParentSpecSeat } from "../parent-spec-seat.js";
41
41
  import { type RosterSpec } from "./caller-roster.js";
42
42
  export interface PrepareCapsAndWorkflowInput {
@@ -56,7 +56,7 @@ export interface PrepareCapsAndWorkflowInput {
56
56
  /** borrowed-readonly — the trusted spawn-side channel; the Workflow mount forwards `rootSessionId`, `placementRoot`,
57
57
  * `onTaskNotification`, `workflowDepth`, the capture-floor getter reads `memoryCaptureAncestors`, and the arming reads
58
58
  * the chain's auto-mode face (`inheritedGate.autoModeFace`). */
59
- internals: Pick<RunInternals, "rootSessionId" | "placementRoot" | "onTaskNotification" | "workflowDepth" | "memoryCaptureAncestors" | "workflowParkedResume" | "questionFaceStripped" | "inheritedGate"> | undefined;
59
+ internals: Pick<RunInternals, "rootSessionId" | "placementRoot" | "onTaskNotification" | "workflowDepth" | "memoryCaptureAncestors" | "workflowParkedResume" | "holder" | "questionFaceStripped" | "inheritedGate"> | undefined;
60
60
  /** borrowed-readonly — the tree's cross-boundary token (inherited or minted), which the Workflow mount hands to its children. */ crossBoundaryTree: import("../cross-boundary-taint.js").CrossBoundaryTreeToken;
61
61
  /** borrowed-readonly — the acquired session; the classifier leg rebuilds its transcript window from `buildContext`. */
62
62
  session: Pick<StoredSession, "buildContext">;
@@ -78,12 +78,10 @@ export interface PrepareCapsAndWorkflowInput {
78
78
  lockedPreflight: Pick<LockedPreflight, "mcp">;
79
79
  /** borrowed-mutable — the effect collection (`Prepared.toolEffects`): the safety scan's caller entries, then the mounts' writes. */
80
80
  toolEffects: Prepared["toolEffects"];
81
- /** borrowed-mutable — the scan's axis tables, so the builder moves an alias's axes with its member (a phase test may omit them). */
82
- safetyAxes?: RosterAxisTables;
83
81
  /** borrowed-readonly — the frozen tool-face snapshot the Workflow mount forwards (exclude / defer / alwaysLoad / restoreGated). */
84
82
  toolFaceSnapshot: ToolFaceSnapshot;
85
- /** borrowed-readonly — the resolved prompt profile (the Workflow mount's parentPromptProfile). */
86
- promptProfile: ToolExecuteContext["promptProfile"];
83
+ /** borrowed-readonly — the task-level lean switch (the Workflow mount's parentPromptLean; absent ⇒ no key). */
84
+ promptLean: ToolExecuteContext["promptLean"];
87
85
  /** borrowed-readonly — the resolved interaction posture (the Workflow mount's parentInteractionPosture; absent ⇒ no key). */
88
86
  resolvedInteractionPosture: ToolExecuteContext["interactionPosture"];
89
87
  /** borrowed-readonly — the harness seat; the Workflow mount's parentModel / parentThinking getters read it call-time. */
@@ -117,8 +117,8 @@ function autoModeArmReasonOf(intent, facePresent, caps, capsFaulted) {
117
117
  return { armed: true, reason: "armed" };
118
118
  }
119
119
  export async function prepareCapsAndWorkflow(input) {
120
- const { spec, deps, parentSpecSeat, checkpointSeat, internals, session, sessionId, runId, hostTaskId, taskScope, taskRootFinal, model, thinking, lockedPreflight, toolEffects, safetyAxes, toolFaceSnapshot, promptProfile, resolvedInteractionPosture, harnessRef, askSeat, runClampSource, forwardEvent, inheritedGateForChildren, enrichSpecToolCtx, maybeOffload, requestReview, enterPlanMode, permissionMode, readDenyEntries, peerLaneActive, peerSendMessageBuiltIn, runnerSelf, delegated, sideCallBookRef } = input;
121
- const roster = new RosterBuilder(toolEffects, safetyAxes);
120
+ const { spec, deps, parentSpecSeat, checkpointSeat, internals, session, sessionId, runId, hostTaskId, taskScope, taskRootFinal, model, thinking, lockedPreflight, toolEffects, toolFaceSnapshot, promptLean, resolvedInteractionPosture, harnessRef, askSeat, runClampSource, forwardEvent, inheritedGateForChildren, enrichSpecToolCtx, maybeOffload, requestReview, enterPlanMode, permissionMode, readDenyEntries, peerLaneActive, peerSendMessageBuiltIn, runnerSelf, delegated, sideCallBookRef } = input;
121
+ const roster = new RosterBuilder(toolEffects);
122
122
  for (const t of spec.tools ?? []) {
123
123
  const mounted = mountCallerTool(t);
124
124
  roster.mount(mounted, { source: callerMountSource(mounted), mountedBy: "scenario" });
@@ -223,7 +223,7 @@ export async function prepareCapsAndWorkflow(input) {
223
223
  const am = autoModeFace;
224
224
  const classifierSeat = classifierSeatModel({ deps, main: model });
225
225
  let classifierModel = classifierSeat.model;
226
- if (await derivedRouteFallsBack({ seat: "auto-mode-classifier", derived: classifierModel, primary: model, brain: deps.brain, getApiKeyAndHeaders: spec.getApiKeyAndHeaders, onNotice: deps.onNotice, sessionId, runId, onBrokenPairing: autoModeClassifierFallbackOf(am.classifierFallback) === "none" ? "refuse" : "fall_back" })) {
226
+ if ((await derivedRouteFallsBack({ seat: "auto-mode-classifier", derived: classifierModel, primary: model, brain: deps.brain, getApiKeyAndHeaders: spec.getApiKeyAndHeaders, onNotice: deps.onNotice, sessionId, runId, onBrokenPairing: autoModeClassifierFallbackOf(am.classifierFallback) === "none" ? "refuse" : "fall_back" })).action === "fall_back") {
227
227
  classifierModel = model;
228
228
  }
229
229
  announceClassifierRoleDefaulted({ onNotice: deps.onNotice, seat: { ...classifierSeat, model: classifierModel }, ...(sessionId !== undefined ? { sessionId } : {}), ...(runId !== undefined ? { runId } : {}) });
@@ -317,7 +317,7 @@ export async function prepareCapsAndWorkflow(input) {
317
317
  parentDeferTools: toolFaceSnapshot.defer,
318
318
  parentAlwaysLoadTools: toolFaceSnapshot.alwaysLoad,
319
319
  ...(toolFaceSnapshot.restoreGated !== undefined ? { parentRestoreGatedTools: toolFaceSnapshot.restoreGated } : {}),
320
- parentPromptProfile: promptProfile,
320
+ ...(promptLean !== undefined ? { parentPromptLean: promptLean } : {}),
321
321
  models: deps.models,
322
322
  agents: deps.agents,
323
323
  builtinAgents: deps.builtinAgents,
@@ -352,6 +352,7 @@ export async function prepareCapsAndWorkflow(input) {
352
352
  return mine.length > 0 ? mine : undefined;
353
353
  } }
354
354
  : {}),
355
+ ...(internals?.holder !== undefined ? { holder: internals.holder } : {}),
355
356
  parentSpecSeat, ...(internals?.questionFaceStripped === true ? { parentQuestionFaceStripped: true } : {}),
356
357
  ...(resolvedInteractionPosture !== undefined ? { parentInteractionPosture: resolvedInteractionPosture } : {}),
357
358
  parentMemoryCaptureState: () => {
@@ -23,6 +23,7 @@ import type { Model } from "../../internal/llm.js";
23
23
  import type { ThinkingLevel } from "../../internal/harness.js";
24
24
  import { type MicroCompactMachine } from "../context-edit.js";
25
25
  import { type CrossBoundaryPosture } from "../cross-boundary-taint.js";
26
+ import { type HostFloor } from "../host-floor.js";
26
27
  import { recordedModeSeed } from "../checkpoint-store.js";
27
28
  import { type ConfigDoorEntry, type LockedPreflight } from "../locked-config.js";
28
29
  import { type ResolvedRole } from "../roles.js";
@@ -33,10 +34,18 @@ import { type UsageWindow } from "../usage-window-store.js";
33
34
  import { type AskSeat } from "../wiring-manifest.js";
34
35
  import type { PrepareResume, RunInternals, ToolFaceLists } from "./contracts.js";
35
36
  import { resolveHost } from "../../prompt-assembly/select.js";
37
+ import type { PromptTraitName } from "../../prompt-assembly/catalog/schema.js";
36
38
  import { type RosterSpec } from "./caller-roster.js";
37
39
  export declare function limitConfigError(code: string, message: string): Error & {
38
40
  code?: string;
39
41
  };
42
+ /**
43
+ * `TaskSpec.principal`: absent (omitted, or the empty string the engine has always read as no principal) or a principal name. A
44
+ * principal that was PROVIDED and is no name (white space, an invisible or control character, a non-string) is refused at the task, on
45
+ * every leg a resume's re-supplied config included — read as "no principal" it would reach the unauthenticated floor, or, on a
46
+ * deployment that declared local-owner rules, the machine owner's standing approvals.
47
+ */
48
+ export declare function assertPrincipalValue(raw: unknown): void;
40
49
  /**
41
50
  * Validate `TaskSpec.limits` at the door and return it unchanged.
42
51
  *
@@ -52,8 +61,9 @@ export declare function limitConfigError(code: string, message: string): Error &
52
61
  */
53
62
  export declare function resolveTaskLimits(limits: TaskLimits | undefined): TaskLimits | undefined;
54
63
  /**
55
- * Validate the MODE-VALUED members of `TaskSpec.attachments` at the same door, and return the
56
- * config unchanged. Today that is exactly one member, `totalTokensReminderMode`.
64
+ * Validate the members of `TaskSpec.attachments` that refuse a value they cannot read at the same door, and return the
65
+ * config unchanged. Today that is two: the mode-valued `totalTokensReminderMode` and the boolean switch `mcpUnavailable`
66
+ * (read by its own reader, `mcpUnavailableOn`, which the leg asks as well).
57
67
  *
58
68
  * WHY A DOOR AT ALL (坏值响亮度律): a knob whose bad value silently folds to the default is a knob the
59
69
  * deployment believes is armed. `totalTokensReminderMode: "padded_countdown"` (underscore) or
@@ -86,36 +96,13 @@ export declare function resolveTaskLimits(limits: TaskLimits | undefined): TaskL
86
96
  */
87
97
  export declare function resolveAttachmentsConfig(attachments: TaskSpec["attachments"]): TaskSpec["attachments"];
88
98
  /**
89
- * R2 双形轴(追加令 2026-07-18): CC 2.1.212's fable-variant prompt gate (b9e —
90
- * `fable_5_mitigations` capability / claude-mythos-5), ORTHOGONAL to the simple/classic profile.
91
- * sema is BYOM, so the id may carry provider prefixes ("anthropic/claude-fable-5",
92
- * "openrouter/anthropic/claude-fable-5"): BOUNDARY-AWARE family match on the last path segment
93
- * (raw substring classified "vendor/not-claude-fable-5" and "claude-mythos-50"
94
- * as fable), case-normalized. Recognition set = CC's _Nr (startsWith "claude-fable-") + b9e
95
- * (mythos-5). R3 system sections fork on the resulting fact.
96
- */
97
- export declare function isFableFamilyModelId(id: string): boolean;
98
- /**
99
- * The SINGLE decision point for the two prompt-shape axes.
100
- * Both were resolved in separate places with different mechanisms — `promptProfile` off a TaskSpec field,
101
- * `fableMitigations` off a raw model-id prefix test — so "which shape does this task speak" had no one
102
- * place to read. CC 2.1.220's counterpart is a model-registry `capabilities` array (one table drives
103
- * `lean_prompt` + `fable_5_mitigations` alike; anchors/2.1.220/CC-218-220-DIFF.md §2).
104
- *
105
- * sema stays BYOM: we cannot key off a capability table for arbitrary model ids, so the RESOLUTION RULES
106
- * are unchanged — profile: spec > inherited internals > "simple"; mitigations: model family. This is a
107
- * consolidation, not a behavior change (the axes stay ORTHOGONAL: neither rewrites the other).
99
+ * The run's prompt traits — the one place prepare forms them: the model's declared set (`Model.promptTraits`, read
100
+ * through the model door: a retired `promptGuidance` or a name that is no trait refuses the task by name) with the
101
+ * task's switch on `lean_prompt` (`promptLean`, as the spec writes it — an engine-built child's spec carries its
102
+ * parent's), bundles expanded ({@link effectiveTraitsOf}). The reference's counterpart is a model registry's capability list; sema is
103
+ * BYOM, so the model entry carries the list and no model id is read.
108
104
  */
109
- export declare function resolveModelPromptTraits(model: {
110
- id: string;
111
- }, spec: {
112
- promptProfile?: "simple" | "classic";
113
- }, internals?: {
114
- promptProfile?: "simple" | "classic";
115
- }): {
116
- promptProfile: "simple" | "classic";
117
- fableMitigations: boolean;
118
- };
105
+ export declare function resolvePromptTraits(model: Model, promptLean: boolean | undefined): ReadonlySet<PromptTraitName>;
119
106
  export interface PrepareConfigDoorsInput {
120
107
  /** borrowed-readonly — the snapshot spec (its roster is faces). NEVER mutated here: the per-task agents rebind returns a
121
108
  * SHALLOW COPY on {@link PrepareConfigDoorsResult.spec} (only `tools` replaced, each rebuilt entry through the snapshot). */
@@ -130,7 +117,7 @@ export interface PrepareConfigDoorsInput {
130
117
  /** borrowed-readonly — presence gates the resumeAt-conflict door and exempts the empty-objective
131
118
  * door (a checkpoint resume passes `objective: ""` by design). */
132
119
  resume?: PrepareResume | undefined;
133
- /** borrowed-readonly — trusted engine channel: prompt-profile inheritance, the spawning run's
120
+ /** borrowed-readonly — trusted engine channel: the spawning run's
134
121
  * interaction posture, the engine question-strip flag. */
135
122
  internals?: RunInternals | undefined;
136
123
  }
@@ -142,8 +129,12 @@ export interface PrepareConfigDoorsResult {
142
129
  /** owned — the frozen task-start copies of the caller's tool-face control arrays; the driver compiles the leg's selector
143
130
  * from them, and the selector (with the disclosure lists) is the ONLY thing later face reads consult. Frozen-immutable. */
144
131
  toolFaceLists: ToolFaceLists;
145
- /** owned — the profile half of the single decision point (model-independent by contract). */
146
- promptProfile: "simple" | "classic";
132
+ /** owned — the task-level switch on the lean shape (`TaskSpec.promptLean`, validated; an engine-built child's spec
133
+ * carries its parent's): what the run hands its children and workflow agents, never its effective traits. */
134
+ promptLean: boolean | undefined;
135
+ /** owned, frozen-by-contract — the run's effective prompt traits ({@link resolvePromptTraits}): the catalog's
136
+ * variants, every overlay's `when.traits` and each tool's description variants select on them. */
137
+ promptTraits: ReadonlySet<PromptTraitName>;
147
138
  /** owned — the host selector values (`TaskSpec.promptRole` / `TaskSpec.promptForm`, validated) the assembly selects on. */
148
139
  promptHost: ReturnType<typeof resolveHost>;
149
140
  /** owned — the run's binding (`TaskSpec.promptBinding`, validated): the selector value every overlay's `when.binding` reads. */
@@ -170,8 +161,6 @@ export interface PrepareConfigDoorsResult {
170
161
  /** owned — the compaction model: explicit wins, else the `summarize` role, else undefined (main
171
162
  * model fallback inside maybeCompact). NOT derivable from {@link resolvedRole}. */
172
163
  compModel: Model | undefined;
173
- /** owned — the mitigations half of the decision point (model-family fact). */
174
- fableMitigations: boolean;
175
164
  /** owned, frozen — model-gate DISCLOSURE data (the application itself already
176
165
  * happened on {@link spec}: its `tools` is the survivor rebind when anything was removed).
177
166
  * prepareTask emits the notices from this after the doors return (the onNotice station);
@@ -213,6 +202,8 @@ export interface PrepareConfigDoorsResult {
213
202
  brainCallGuardrailMs: number | undefined;
214
203
  /** owned — the screened cross-boundary posture: the deps seat read ONCE, a bad value refused; absent stays `undefined` (undeclared is its own fact). */
215
204
  crossBoundaryPosture: CrossBoundaryPosture | undefined;
205
+ advisorTool: "disabled" | undefined;
206
+ hostFloor: HostFloor | undefined;
216
207
  }
217
208
  /** The microCompact knob door (坏值响亮度默认律, the sibling knob doors' form:
218
209
  * interactionPosture / toolModelGate / staleToolResultOffload). Placement is load-bearing:
@@ -237,12 +228,13 @@ export declare const checkpointStoreSeat: (spec: {
237
228
  export declare function assertResumeConfigRecord(config: unknown): void;
238
229
  /** The spec the value doors read: a prepare's (its roster is faces) or a resume's re-supplied config (no objective, no session id). */
239
230
  type ValueDoorSpec = Omit<TaskSpec, "tools" | "objective" | "sessionId" | "userAttachments"> & Partial<Pick<TaskSpec, "objective" | "sessionId">>;
240
- type ConfigValueDoorsResult = Pick<PrepareConfigDoorsResult, "toolFaceLists" | "promptHost" | "promptBinding" | "lockedPreflight" | "microCompactKnob" | "memoryDelegationEvidence" | "memoryProvenance" | "memoryCapturePolicy" | "usageWindows" | "brainCallGuardrailMs" | "crossBoundaryPosture"> & {
231
+ type ConfigValueDoorsResult = Pick<PrepareConfigDoorsResult, "toolFaceLists" | "promptHost" | "promptBinding" | "lockedPreflight" | "microCompactKnob" | "memoryDelegationEvidence" | "memoryProvenance" | "memoryCapturePolicy" | "usageWindows" | "brainCallGuardrailMs" | "crossBoundaryPosture" | "advisorTool" | "promptLean" | "hostFloor"> & {
241
232
  skillListingSeats: {
242
233
  fraction: unknown;
243
234
  maxDescChars: unknown;
244
235
  };
245
236
  skills: TaskSpec["skills"];
237
+ projectMemory: TaskSpec["projectMemory"];
246
238
  };
247
239
  /**
248
240
  * The phase's VALUE doors as ONE function with two callers — each judges a declared value against its own vocabulary, reading only the
@@ -257,6 +249,7 @@ export declare function configValueDoors(input: {
257
249
  deps: RunnerDeps;
258
250
  resumeLeg: boolean;
259
251
  sessions: SessionStore;
252
+ holder?: string | undefined;
260
253
  }, enter?: ConfigDoorEntry): ConfigValueDoorsResult;
261
254
  /**
262
255
  * The doors a RESUMED leg's prepare refuses at, run as one screen BEFORE the claim — prepare's own functions, so a refusal carries
@@ -271,6 +264,6 @@ export declare function configValueDoors(input: {
271
264
  * corrected resume redeems the same token. A throw that is none of prepare's codes leaves as it was thrown. Returns the config the
272
265
  * leg is handed: the caller's, its MCP servers and A2A peers the frozen entries the lock layer judged (read once, dialed as judged).
273
266
  */
274
- export declare function refuseResumeDoors<C extends ValueDoorSpec & Pick<TaskSpec, "userAttachments">>(config: C, recordedGate: Parameters<typeof recordedModeSeed>[0], deps: RunnerDeps, sessions: SessionStore): C;
267
+ export declare function refuseResumeDoors<C extends ValueDoorSpec & Pick<TaskSpec, "userAttachments">>(config: C, recordedGate: Parameters<typeof recordedModeSeed>[0], deps: RunnerDeps, sessions: SessionStore, holder?: string): C;
275
268
  export declare function prepareConfigDoors(input: PrepareConfigDoorsInput): PrepareConfigDoorsResult;
276
269
  export {};
@@ -3,8 +3,10 @@ import { assertContainmentFaceValue } from "../../tools/fs/index.js";
3
3
  import { MICRO_COMPACT_MACHINES } from "../context-edit.js";
4
4
  import { assertAddOnlySeats } from "../child-clamp-seats.js";
5
5
  import { CROSS_BOUNDARY_POSTURES } from "../cross-boundary-taint.js";
6
+ import { compileHostFloor } from "../host-floor.js";
6
7
  import { assertNoRetiredRunnerDeps } from "./retired-runner-deps.js";
7
8
  import { recordedModeSeed, resolveCheckpointStore } from "../checkpoint-store.js";
9
+ import { assertCheckpointStoreJudgesHolder, assertHolderValue } from "../checkpoint-generation.js";
8
10
  import { asResumeConfigRefusal, refusePermissionModeDoors } from "../mode-policy.js";
9
11
  import { resolveOutputStyleFrame } from "../output-style.js";
10
12
  import { screenUserAttachments } from "../user-attachment.js";
@@ -15,20 +17,24 @@ import { assertAutoConsolidationWirable } from "./memory-consolidation-driver.js
15
17
  import { isModelPriced, malformedPricingField, modelCostToPricing } from "../pricing.js";
16
18
  import { ENTER_AS_IS, preflightLockedConfig } from "../locked-config.js";
17
19
  import { assertRetentionCapability } from "../retention.js";
18
- import { resolveModel, resolveTaskModel, roleModelIfSet } from "../roles.js";
20
+ import { resolveModel, resolveTaskModel, roleModelIfSet, screenRoleMap } from "../roles.js";
19
21
  import { resolveSkillListingBudget } from "../skill-listing-budget.js";
20
22
  import { describeRejectedValue } from "../tool-search-setting.js";
21
- import { applyToolModelGate, assertRestoreGatedToolsValue, modelIdTail } from "../tool-model-gate.js";
23
+ import { assertAdvisorModelShape } from "../advisor-verdict.js";
24
+ import { applyToolModelGate, assertRestoreGatedToolsValue } from "../tool-model-gate.js";
22
25
  import { resolveUsageWindows } from "../usage-window-store.js";
23
26
  import { deriveAskEffective, resolveAskSeat, resolveQuestionSeam, screenApprovalReach } from "../wiring-manifest.js";
24
- import { resolveHost } from "../../prompt-assembly/select.js";
27
+ import { effectiveTraitsOf, readModelPromptTraits, resolveHost, resolvePromptLean } from "../../prompt-assembly/select.js";
28
+ import { assertNoRetiredKeys, RETIRED_MODEL_KEYS } from "../retired-keys.js";
25
29
  import { resolvePromptBinding } from "../../prompt-assembly/overlay.js";
26
30
  import { assertPeerPresenceValue } from "../../agents/peer-directory.js";
27
31
  import { snapshotDefinitionLists } from "../../agents/tool-filter.js";
28
- import { TOTAL_TOKENS_REMINDER_MODES } from "./turn-attachments.js";
29
- import { rosterFaceOf } from "./caller-roster.js";
32
+ import { mcpUnavailableOn, TOTAL_TOKENS_REMINDER_MODES } from "./turn-attachments.js";
33
+ import { refuseRetiredMember, rosterFaceOf } from "./caller-roster.js";
30
34
  import { assertToolBoundaryLegs } from "../tool-roster.js";
35
+ import { assertToolCardDeclarations } from "../../prompt-assembly/tool-catalog.js";
31
36
  import { refuseRenamedDelegationMounts } from "./sub-agent-deny-lists.js";
37
+ import { readPrincipal } from "../principal-name.js";
32
38
  const TASK_LIMIT_KEY_DICT = {
33
39
  maxTokens: true,
34
40
  maxCostUsd: true,
@@ -53,6 +59,12 @@ export function limitConfigError(code, message) {
53
59
  e.code = code;
54
60
  return e;
55
61
  }
62
+ export function assertPrincipalValue(raw) {
63
+ const reading = readPrincipal(raw);
64
+ if (reading.kind === "invalid") {
65
+ throw limitConfigError("config.invalid_argument", `TaskSpec.principal must be a principal name when present (got ${reading.fault}) — omit the key for a task with no principal; a provided value that names nobody is refused, never read as "no principal".`);
66
+ }
67
+ }
56
68
  export function resolveTaskLimits(limits) {
57
69
  if (limits === undefined)
58
70
  return undefined;
@@ -98,6 +110,7 @@ export function resolveTaskLimits(limits) {
98
110
  export function resolveAttachmentsConfig(attachments) {
99
111
  if (attachments === null || (typeof attachments !== "object" && typeof attachments !== "function"))
100
112
  return attachments;
113
+ mcpUnavailableOn(attachments);
101
114
  const mode = attachments.totalTokensReminderMode;
102
115
  if (mode !== undefined) {
103
116
  const legal = TOTAL_TOKENS_REMINDER_MODES;
@@ -108,15 +121,9 @@ export function resolveAttachmentsConfig(attachments) {
108
121
  }
109
122
  return attachments;
110
123
  }
111
- export function isFableFamilyModelId(id) {
112
- const tail = modelIdTail(id);
113
- return /^claude-fable-\d/.test(tail) || /^claude-mythos-5(?!\d)/.test(tail);
114
- }
115
- export function resolveModelPromptTraits(model, spec, internals) {
116
- return {
117
- promptProfile: spec.promptProfile ?? internals?.promptProfile ?? "simple",
118
- fableMitigations: isFableFamilyModelId(model.id),
119
- };
124
+ export function resolvePromptTraits(model, promptLean) {
125
+ assertNoRetiredKeys(model, RETIRED_MODEL_KEYS, "Model");
126
+ return effectiveTraitsOf(readModelPromptTraits(model), promptLean);
120
127
  }
121
128
  function microCompactConfigError(field, value, legal) {
122
129
  let shown;
@@ -155,7 +162,7 @@ function resolveClearOnRejection(bag) {
155
162
  }
156
163
  return declared ?? true;
157
164
  }
158
- function deploymentWord(raw, seat, words, absent, code, why) {
165
+ function closedWord(raw, seat, words, absent, code, why) {
159
166
  if (raw === undefined)
160
167
  return absent;
161
168
  const word = words.find((w) => w === raw);
@@ -163,7 +170,7 @@ function deploymentWord(raw, seat, words, absent, code, why) {
163
170
  return word;
164
171
  const got = typeof raw === "string" ? JSON.stringify(raw.length > 64 ? `${raw.slice(0, 64)}…` : raw) : raw === null ? "null" : Array.isArray(raw) ? "an array" : typeof raw;
165
172
  const spelled = words.map((w) => `"${w}"`);
166
- throw limitConfigError(code, `RunnerDeps.${seat} must be ${spelled.slice(0, -1).join(", ")} or ${spelled.at(-1)} when present (got ${got}) — ${why}`);
173
+ throw limitConfigError(code, `${seat} must be ${spelled.length > 1 ? `${spelled.slice(0, -1).join(", ")} or ` : ""}${spelled.at(-1)} when present (got ${got}) — ${why}`);
167
174
  }
168
175
  export const checkpointStoreSeat = (spec) => (spec.checkpointStore !== undefined ? "taskConfig" : "deps");
169
176
  export function assertResumeConfigRecord(config) {
@@ -172,8 +179,9 @@ export function assertResumeConfigRecord(config) {
172
179
  }
173
180
  }
174
181
  export function configValueDoors(input, enter = ENTER_AS_IS) {
175
- const { spec, deps, resumeLeg, sessions } = input;
182
+ const { spec, deps, resumeLeg, sessions, holder } = input;
176
183
  enter("deps", () => assertNoRetiredRunnerDeps(deps));
184
+ enter("taskConfig", () => assertPrincipalValue(spec.principal));
177
185
  enter("taskConfig", () => assertPeerPresenceValue(spec.peerPresence));
178
186
  enter("taskConfig", () => assertRestoreGatedToolsValue(spec.restoreGatedTools));
179
187
  const microCompactKnob = enter("deps", () => resolveMicroCompactKnob(deps.microCompact));
@@ -212,7 +220,10 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
212
220
  : undefined,
213
221
  };
214
222
  const promptHost = enter("taskConfig", () => resolveHost(spec));
223
+ enter("deps", () => screenRoleMap(deps.roles, "RunnerDeps.roles"));
224
+ enter("taskConfig", () => screenRoleMap(spec.roles, "TaskSpec.roles"));
215
225
  const promptBinding = enter("taskConfig", () => resolvePromptBinding(spec));
226
+ const promptLean = enter("taskConfig", () => resolvePromptLean(spec));
216
227
  if (spec.resumeAt !== undefined)
217
228
  enter("taskConfig", () => {
218
229
  if (resumeLeg) {
@@ -231,10 +242,15 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
231
242
  enter("taskConfig", () => assertContainmentFaceValue(spec.writeFace, "write", "spec"));
232
243
  enter("deps", () => assertContainmentFaceValue(deps.writeFace, "write", "deps"));
233
244
  enter("taskConfig", () => assertAddOnlySeats(spec));
234
- const memoryDelegationEvidence = enter("deps", () => deploymentWord(deps.memoryDelegationEvidence, "memoryDelegationEvidence", ["static-face", "attested-only"], "static-face", "config.memory_delegation_evidence", "an unevaluable evidence standard is refused loudly, never folded to either standard."));
235
- const memoryProvenance = enter("deps", () => deploymentWord(deps.memoryProvenance, "memoryProvenance", ["off", "carry"], "carry", "config.memory_provenance", "an unevaluable provenance mode is refused loudly, never folded to either mode."));
236
- const memoryCapturePolicy = enter("deps", () => deploymentWord(deps.memoryCapturePolicy, "memoryCapturePolicy", ["open", "governed", "capture-required"], "open", "config.memory_capture_policy", "an unevaluable capture posture is refused loudly, never folded to any posture (the fault arms differ per posture, so a guess would pick a polarity nobody configured)."));
237
- const crossBoundaryPosture = enter("deps", () => deploymentWord(deps.crossBoundaryPosture, "crossBoundaryPosture", CROSS_BOUNDARY_POSTURES, undefined, "config.cross_boundary_posture", "an unevaluable posture is refused loudly, never folded to either word (an absent seat is undeclared, which is its own fact)."));
245
+ const memoryDelegationEvidence = enter("deps", () => closedWord(deps.memoryDelegationEvidence, "RunnerDeps.memoryDelegationEvidence", ["static-face", "attested-only"], "static-face", "config.memory_delegation_evidence", "an unevaluable evidence standard is refused loudly, never folded to either standard."));
246
+ const memoryProvenance = enter("deps", () => closedWord(deps.memoryProvenance, "RunnerDeps.memoryProvenance", ["off", "carry"], "carry", "config.memory_provenance", "an unevaluable provenance mode is refused loudly, never folded to either mode."));
247
+ const memoryCapturePolicy = enter("deps", () => closedWord(deps.memoryCapturePolicy, "RunnerDeps.memoryCapturePolicy", ["open", "governed", "capture-required"], "open", "config.memory_capture_policy", "an unevaluable capture posture is refused loudly, never folded to any posture (the fault arms differ per posture, so a guess would pick a polarity nobody configured)."));
248
+ const crossBoundaryPosture = enter("deps", () => closedWord(deps.crossBoundaryPosture, "RunnerDeps.crossBoundaryPosture", CROSS_BOUNDARY_POSTURES, undefined, "config.cross_boundary_posture", "an unevaluable posture is refused loudly, never folded to either word (an absent seat is undeclared, which is its own fact)."));
249
+ const hostFloor = enter("deps", () => compileHostFloor(deps.hostFloor));
250
+ const advisorTool = enter("deps", () => closedWord(deps.advisorTool, "RunnerDeps.advisorTool", ["disabled"], undefined, "config.advisor_tool_invalid", "the switch has one word; anything else is refused, never read as either state."));
251
+ if (advisorTool === undefined)
252
+ enter("taskConfig", () => assertAdvisorModelShape(spec.advisorModel));
253
+ const projectMemory = enter("taskConfig", () => closedWord(spec.projectMemory, "TaskSpec.projectMemory", ["disabled"], undefined, "config.invalid_argument", "the switch has one word; omit the key to leave the deployment's project context in force."));
238
254
  enter("deps", () => assertAutoConsolidationWirable(deps));
239
255
  if (spec.resumeAtMode !== undefined)
240
256
  enter("taskConfig", () => {
@@ -305,6 +321,8 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
305
321
  const taskGuardrail = spec.limits?.brainCallGuardrailMs;
306
322
  const brainCallGuardrailMs = enter(taskGuardrail != null ? "taskConfig" : "deps", () => resolveBrainCallGuardrailMs(taskGuardrail ?? deps.brainCallGuardrailMs));
307
323
  const checkpointStore = enter(checkpointStoreSeat(spec), () => resolveCheckpointStore(spec, deps));
324
+ enter("deps", () => assertHolderValue(holder));
325
+ enter(checkpointStoreSeat(spec), () => assertCheckpointStoreJudgesHolder(checkpointStoreSeat(spec) === "taskConfig" ? "TaskSpec.checkpointStore" : "RunnerDeps.checkpointStore", checkpointStore, holder));
308
326
  const taskStore = checkpointStoreSeat(spec) === "taskConfig" ? checkpointStore : undefined;
309
327
  const retention = { policy: deps.retentionPolicy, locked: lockedPreflight.lockedKeys.has("retentionPolicy") };
310
328
  enter("deps", () => assertRetentionCapability({
@@ -317,9 +335,9 @@ export function configValueDoors(input, enter = ENTER_AS_IS) {
317
335
  }));
318
336
  if (taskStore !== undefined)
319
337
  enter("taskConfig", () => assertRetentionCapability({ ...retention, stores: [{ name: "checkpointStore", store: taskStore }] }));
320
- return { toolFaceLists, promptHost, promptBinding, lockedPreflight, skillListingSeats, skills, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture };
338
+ return { toolFaceLists, promptHost, promptBinding, promptLean, lockedPreflight, skillListingSeats, skills, projectMemory, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture, advisorTool, hostFloor };
321
339
  }
322
- export function refuseResumeDoors(config, recordedGate, deps, sessions) {
340
+ export function refuseResumeDoors(config, recordedGate, deps, sessions, holder) {
323
341
  asResumeConfigRefusal("taskConfig", () => {
324
342
  refusePermissionModeDoors(config);
325
343
  resolveOutputStyleFrame(config.outputStyle);
@@ -327,18 +345,20 @@ export function refuseResumeDoors(config, recordedGate, deps, sessions) {
327
345
  screenUserInvokedSkills(config);
328
346
  screenUserAttachments(config.userAttachments, { resumeLeg: true });
329
347
  assertToolBoundaryLegs(config.tools);
348
+ assertToolCardDeclarations(config.tools);
330
349
  });
331
- const { lockedPreflight, skills } = configValueDoors({ spec: config, deps, resumeLeg: true, sessions }, asResumeConfigRefusal);
350
+ const { lockedPreflight, skills } = configValueDoors({ spec: config, deps, resumeLeg: true, sessions, holder }, asResumeConfigRefusal);
332
351
  asResumeConfigRefusal("inheritedGate", () => void recordedModeSeed(recordedGate));
333
352
  return { ...config, ...(config.mcp !== undefined ? { mcp: lockedPreflight.mcp ?? [] } : {}), ...(config.a2a !== undefined ? { a2a: lockedPreflight.a2a ?? [] } : {}), skills };
334
353
  }
335
354
  export function prepareConfigDoors(input) {
336
355
  const { deps, sessions, resume, internals } = input;
337
356
  assertToolBoundaryLegs(input.spec.tools);
357
+ assertToolCardDeclarations(input.spec.tools);
338
358
  let spec = input.spec;
339
- const { toolFaceLists, promptHost, promptBinding, lockedPreflight, skillListingSeats, skills, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture } = configValueDoors({ spec, deps, resumeLeg: resume !== undefined, sessions });
340
- spec = Object.create(Object.getPrototypeOf(spec), { ...Object.getOwnPropertyDescriptors(spec), skills: { value: skills, enumerable: skills !== undefined, writable: false, configurable: false } });
341
- const promptProfile = resolveModelPromptTraits({ id: "" }, spec, internals).promptProfile;
359
+ const { toolFaceLists, promptHost, promptBinding, promptLean, lockedPreflight, skillListingSeats, skills, projectMemory, microCompactKnob, memoryDelegationEvidence, memoryProvenance, memoryCapturePolicy, usageWindows, brainCallGuardrailMs, crossBoundaryPosture, advisorTool, hostFloor } = configValueDoors({ spec, deps, resumeLeg: resume !== undefined, sessions, holder: internals?.holder });
360
+ const doorRead = (value) => ({ value, enumerable: value !== undefined, writable: false, configurable: false });
361
+ spec = Object.create(Object.getPrototypeOf(spec), { ...Object.getOwnPropertyDescriptors(spec), skills: doorRead(skills), projectMemory: doorRead(projectMemory) });
342
362
  const resolvedInteractionPosture = spec.interactionPosture ?? internals?.parentInteractionPosture ?? deps.interactionPosture;
343
363
  const askSeat = resolveAskSeat(spec, deps);
344
364
  {
@@ -404,7 +424,10 @@ export function prepareConfigDoors(input) {
404
424
  if (typeof t.withAgents !== "function")
405
425
  return t;
406
426
  const rebuilt = t.withAgents(perTask);
407
- return rosterFaceOf(t.modelGate !== undefined && rebuilt.modelGate === undefined ? { ...rebuilt, modelGate: t.modelGate } : rebuilt, index);
427
+ const restamp = t.modelGate !== undefined && rebuilt.modelGate === undefined;
428
+ if (restamp)
429
+ refuseRetiredMember(rebuilt, index);
430
+ return rosterFaceOf(restamp ? { ...rebuilt, modelGate: t.modelGate } : rebuilt, index);
408
431
  }),
409
432
  };
410
433
  }
@@ -441,7 +464,7 @@ export function prepareConfigDoors(input) {
441
464
  throw limitConfigError("config.limit_invalid", `TaskSpec.${dollarCeiling} is a money ceiling, but the price table for model ${JSON.stringify(model.id)} declares an unevaluable ${bad} — every rate must be a finite, non-negative number of USD per 1M tokens. A table like this prices every turn at zero (or below), so the ceiling would never trip: refused rather than enforced in name only.`);
442
465
  }
443
466
  }
444
- const fableMitigations = resolveModelPromptTraits(model, spec, internals).fableMitigations;
467
+ const promptTraits = resolvePromptTraits(model, promptLean);
445
468
  const gateDecision = applyToolModelGate({
446
469
  tools: spec.tools,
447
470
  modelId: model.id,
@@ -459,13 +482,14 @@ export function prepareConfigDoors(input) {
459
482
  discardedEnvRaw: gateDecision.discardedEnvRaw,
460
483
  });
461
484
  const thinking = spec.thinking ?? resolvedRole.thinking ?? model.defaultThinking;
462
- const compModel = spec.compactionModel
463
- ? resolveModel(spec.compactionModel, deps.models)
485
+ const compModel = spec.compactionModel !== undefined
486
+ ? resolveModel(spec.compactionModel, deps.models, "TaskSpec.compactionModel")
464
487
  : roleModelIfSet("summarize", spec, deps);
465
488
  return {
466
489
  spec,
467
490
  toolFaceLists,
468
- promptProfile,
491
+ promptLean,
492
+ promptTraits,
469
493
  promptHost,
470
494
  promptBinding,
471
495
  lockedPreflight,
@@ -476,12 +500,11 @@ export function prepareConfigDoors(input) {
476
500
  model,
477
501
  thinking,
478
502
  compModel,
479
- fableMitigations,
480
503
  modelGate,
481
504
  memoryDelegationEvidence,
482
505
  skillListingBudget,
483
506
  memoryProvenance,
484
- memoryCapturePolicy, crossBoundaryPosture,
507
+ memoryCapturePolicy, crossBoundaryPosture, advisorTool, hostFloor,
485
508
  usageWindows,
486
509
  brainCallGuardrailRef,
487
510
  brainCallGuardrailMs,
@@ -1,4 +1,5 @@
1
1
  import type { Model } from "../../internal/llm.js";
2
+ import type { PromptTraitName } from "../../prompt-assembly/catalog/schema.js";
2
3
  import type { MaterializedA2a } from "../a2a.js";
3
4
  import type { MaterializedMcp } from "../mcp.js";
4
5
  import type { RunnerDeps, TaskSpec } from "../types.js";
@@ -11,7 +12,7 @@ export interface PrepareDeferClassifyInput {
11
12
  deps: Pick<RunnerDeps, "deferMode" | "toolSearch">;
12
13
  /** borrowed-mutable — the shared mount array (later refs alias it; in-place contract, never
13
14
  * re-created). Mutated here, in order: `splice` of every excluded name; element REPLACEMENT with a
14
- * shallow copy for the classic-profile description swap (the caller's ToolSpec object is never
15
+ * shallow copy for a description variant chosen by the run's traits (the caller's ToolSpec object is never
15
16
  * mutated); `splice` of a retracted memory group. After this phase: the content-origin wrap
16
17
  * (element replacement with the wrapped object), the disclosure mount, the MCP refresh re-splice. Since
17
18
  * Every one of those writes is a builder verb (`unmountWhere` / `replaceAt`). */
@@ -22,8 +23,8 @@ export interface PrepareDeferClassifyInput {
22
23
  handsEnabled: boolean;
23
24
  /** borrowed-readonly — the spec-time precomputation the invariant checks the post-exclusion roster against: a mismatch is an engine bug, thrown. */
24
25
  fullShellReachable: boolean;
25
- /** borrowed-readonly — the resolved prompt profile (`classic` swaps in `descriptionClassic`). */
26
- promptProfile: "simple" | "classic";
26
+ /** borrowed-readonly — the run's effective prompt traits (each tool's description variants are chosen on them). */
27
+ promptTraits: ReadonlySet<PromptTraitName>;
27
28
  /** borrowed-readonly — the resolved model (the deferral gate's threshold reads its context window). */
28
29
  model: Model;
29
30
  /** borrowed-readonly — the materialized MCP roster; only `tools` is read (protocol names; `mcpAlwaysLoad` self-declarations lose to an operator defer). */