@sema-agent/core 7.51.2 → 7.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/CHANGELOG.md +698 -2
  2. package/README.md +3 -1
  3. package/dist/agents/agent-transcript-tool.d.ts +1 -1
  4. package/dist/agents/cascade.js +4 -0
  5. package/dist/agents/cross-session-envelope.d.ts +8 -0
  6. package/dist/agents/cross-session-envelope.js +6 -0
  7. package/dist/agents/cross-session-judge.d.ts +21 -1
  8. package/dist/agents/cross-session-judge.js +8 -0
  9. package/dist/agents/cross-session-ref.d.ts +5 -0
  10. package/dist/agents/cross-session-ref.js +1 -0
  11. package/dist/agents/cumulative-stats.d.ts +3 -0
  12. package/dist/agents/cumulative-stats.js +3 -0
  13. package/dist/agents/list-agents-tool.d.ts +1 -1
  14. package/dist/agents/org-delivery-gate.d.ts +122 -0
  15. package/dist/agents/org-delivery-gate.js +69 -0
  16. package/dist/agents/peer-held-queue.d.ts +9 -4
  17. package/dist/agents/peer-held-queue.js +6 -5
  18. package/dist/agents/peer-session-drain.d.ts +35 -5
  19. package/dist/agents/peer-session-drain.js +271 -180
  20. package/dist/agents/read-inbox-tool.d.ts +8 -1
  21. package/dist/agents/read-inbox-tool.js +5 -1
  22. package/dist/agents/repair-loop.js +4 -0
  23. package/dist/agents/send-message-tool.d.ts +11 -16
  24. package/dist/agents/send-message-tool.js +11 -13
  25. package/dist/agents/subagent.d.ts +3 -0
  26. package/dist/agents/subagent.js +105 -76
  27. package/dist/agents/tool-filter.d.ts +58 -13
  28. package/dist/agents/tool-filter.js +34 -14
  29. package/dist/bench/metrics.d.ts +1 -0
  30. package/dist/brain/anthropic.d.ts +6 -1
  31. package/dist/brain/anthropic.js +17 -13
  32. package/dist/brain/model-presets.d.ts +4 -5
  33. package/dist/brain/model-presets.js +6 -5
  34. package/dist/brain/open-responses.js +16 -12
  35. package/dist/brain/openai.js +16 -12
  36. package/dist/brain/request-params.d.ts +12 -33
  37. package/dist/brain/request-params.js +5 -2
  38. package/dist/brain/request-route.d.ts +9 -8
  39. package/dist/brain/request-route.js +1 -0
  40. package/dist/brain/route-adjudicator.d.ts +123 -47
  41. package/dist/brain/route-adjudicator.js +171 -42
  42. package/dist/brain/route-conformance.js +2 -2
  43. package/dist/brain/routing.d.ts +24 -1
  44. package/dist/brain/routing.js +54 -19
  45. package/dist/brain/status-sink.d.ts +18 -0
  46. package/dist/brain/status-sink.js +7 -0
  47. package/dist/brain/timeout.js +5 -4
  48. package/dist/core/a2a.d.ts +5 -2
  49. package/dist/core/a2a.js +30 -13
  50. package/dist/core/allow-entry.d.ts +42 -9
  51. package/dist/core/allow-entry.js +25 -18
  52. package/dist/core/auto-compaction.d.ts +80 -20
  53. package/dist/core/auto-compaction.js +65 -18
  54. package/dist/core/auto-promote.d.ts +2 -1
  55. package/dist/core/auto-promote.js +2 -2
  56. package/dist/core/caller-tool-name.d.ts +9 -0
  57. package/dist/core/caller-tool-name.js +13 -0
  58. package/dist/core/checkpoint-requirements.d.ts +7 -1
  59. package/dist/core/checkpoint-requirements.js +2 -0
  60. package/dist/core/checkpoint-store.d.ts +57 -24
  61. package/dist/core/checkpoint-store.js +3 -3
  62. package/dist/core/child-clamp-seats.d.ts +6 -0
  63. package/dist/core/child-clamp-seats.js +2 -1
  64. package/dist/core/compliance.js +3 -1
  65. package/dist/core/credential-vocabulary.d.ts +33 -8
  66. package/dist/core/credential-vocabulary.js +32 -7
  67. package/dist/core/decision-receipt.d.ts +2 -2
  68. package/dist/core/delegation-frames.d.ts +9 -2
  69. package/dist/core/delegation-name.d.ts +18 -0
  70. package/dist/core/delegation-name.js +47 -0
  71. package/dist/core/effective-path-target.d.ts +25 -6
  72. package/dist/core/effective-path-target.js +24 -2
  73. package/dist/core/engine-capabilities.d.ts +8 -1
  74. package/dist/core/engine-capabilities.js +1 -1
  75. package/dist/core/engine-notice.d.ts +49 -21
  76. package/dist/core/frontmatter-fence.d.ts +10 -0
  77. package/dist/core/frontmatter-fence.js +6 -0
  78. package/dist/core/gate-fold.js +8 -25
  79. package/dist/core/gate-lanes.js +358 -274
  80. package/dist/core/gate-outcome.d.ts +11 -6
  81. package/dist/core/governance-codes.d.ts +11 -4
  82. package/dist/core/governance-codes.js +12 -3
  83. package/dist/core/hands-band-screen.d.ts +7 -0
  84. package/dist/core/hands-band-screen.js +32 -0
  85. package/dist/core/hooks.d.ts +283 -739
  86. package/dist/core/hooks.js +100 -193
  87. package/dist/{tools/fs → core}/image-admission.d.ts +21 -3
  88. package/dist/{tools/fs → core}/image-admission.js +24 -6
  89. package/dist/core/locked-config.d.ts +84 -32
  90. package/dist/core/locked-config.js +128 -42
  91. package/dist/core/mcp-connection-pool.d.ts +4 -1
  92. package/dist/core/mcp-connection-pool.js +7 -2
  93. package/dist/core/mcp-probe.d.ts +12 -9
  94. package/dist/core/mcp-probe.js +3 -3
  95. package/dist/core/mcp-server-spec.d.ts +104 -10
  96. package/dist/core/mcp-server-spec.js +183 -33
  97. package/dist/core/mcp.d.ts +31 -20
  98. package/dist/core/mcp.js +66 -56
  99. package/dist/core/memory-engine/data-plane.js +5 -1
  100. package/dist/core/memory-engine/distiller.js +16 -2
  101. package/dist/core/memory-engine/engine.d.ts +22 -30
  102. package/dist/core/memory-engine/engine.js +16 -10
  103. package/dist/core/memory-engine/frontmatter.d.ts +6 -0
  104. package/dist/core/memory-engine/frontmatter.js +19 -16
  105. package/dist/core/memory.d.ts +2 -2
  106. package/dist/core/mode-policy.d.ts +5 -16
  107. package/dist/core/mode-policy.js +7 -19
  108. package/dist/core/model-seat.d.ts +4 -1
  109. package/dist/core/mods/dollar.d.ts +109 -0
  110. package/dist/core/mods/dollar.js +154 -0
  111. package/dist/core/mods/host.d.ts +23 -0
  112. package/dist/core/mods/host.js +21 -0
  113. package/dist/core/mods/kernel/budget.d.ts +43 -0
  114. package/dist/core/mods/kernel/budget.js +83 -0
  115. package/dist/core/mods/kernel/dispatch.d.ts +100 -0
  116. package/dist/core/mods/kernel/dispatch.js +699 -0
  117. package/dist/core/mods/kernel/events.d.ts +245 -0
  118. package/dist/core/mods/kernel/events.js +210 -0
  119. package/dist/core/mods/kernel/index.d.ts +6 -0
  120. package/dist/core/mods/kernel/index.js +5 -0
  121. package/dist/core/mods/kernel/receive.d.ts +94 -0
  122. package/dist/core/mods/kernel/receive.js +188 -0
  123. package/dist/core/mods/kernel/registration.d.ts +131 -0
  124. package/dist/core/mods/kernel/registration.js +102 -0
  125. package/dist/core/mods/kernel/site-rules.d.ts +149 -0
  126. package/dist/core/mods/kernel/site-rules.js +296 -0
  127. package/dist/core/mods/stations.d.ts +344 -0
  128. package/dist/core/mods/stations.js +437 -0
  129. package/dist/core/mounted-mcp.d.ts +57 -0
  130. package/dist/core/mounted-mcp.js +71 -2
  131. package/dist/core/own-property-receipt.d.ts +13 -0
  132. package/dist/core/own-property-receipt.js +13 -23
  133. package/dist/core/parent-spec-seat.d.ts +18 -7
  134. package/dist/core/parent-spec-seat.js +6 -2
  135. package/dist/core/path-identity.js +2 -1
  136. package/dist/core/permission-rule-model.d.ts +58 -9
  137. package/dist/core/permission-rule-model.js +81 -7
  138. package/dist/core/permission-rule-org.d.ts +163 -33
  139. package/dist/core/permission-rule-org.js +205 -71
  140. package/dist/core/permission-rule-syntax.d.ts +15 -0
  141. package/dist/core/permission-rule-syntax.js +24 -16
  142. package/dist/core/permission-rules.d.ts +14 -2
  143. package/dist/core/permission-rules.js +63 -23
  144. package/dist/core/prompt-section-seat.d.ts +15 -27
  145. package/dist/core/prompt-section-seat.js +73 -40
  146. package/dist/core/protocol-http-auth.d.ts +3 -1
  147. package/dist/core/protocol-http-auth.js +2 -0
  148. package/dist/core/reminder-mint.d.ts +2 -2
  149. package/dist/core/remote-env.d.ts +24 -12
  150. package/dist/core/remote-env.js +1 -0
  151. package/dist/core/resume-startup-cause.d.ts +16 -1
  152. package/dist/core/resume-startup-cause.js +4 -1
  153. package/dist/core/retention.js +7 -2
  154. package/dist/core/retired-keys.d.ts +12 -2
  155. package/dist/core/retired-keys.js +15 -1
  156. package/dist/core/roles.js +60 -10
  157. package/dist/core/rule-lane-reads.js +1 -1
  158. package/dist/core/runner/announce-once-ledger.d.ts +31 -1
  159. package/dist/core/runner/announce-once-ledger.js +22 -0
  160. package/dist/core/runner/assemble-result.d.ts +9 -0
  161. package/dist/core/runner/assemble-result.js +3 -1
  162. package/dist/core/runner/call-hook-stations.d.ts +23 -27
  163. package/dist/core/runner/call-hook-stations.js +58 -42
  164. package/dist/core/runner/caller-stop-gate.d.ts +25 -0
  165. package/dist/core/runner/caller-stop-gate.js +7 -0
  166. package/dist/core/runner/compaction-seams.d.ts +8 -22
  167. package/dist/core/runner/compaction-seams.js +28 -53
  168. package/dist/core/runner/construction-doors.js +11 -1
  169. package/dist/core/runner/contracts.d.ts +86 -83
  170. package/dist/core/runner/credential-origin-seat.d.ts +2 -0
  171. package/dist/core/runner/credential-origin-seat.js +19 -0
  172. package/dist/core/runner/extra-body-dropped-seat.d.ts +2 -6
  173. package/dist/core/runner/gate-exit.d.ts +47 -36
  174. package/dist/core/runner/gate-exit.js +12 -5
  175. package/dist/core/runner/image.js +1 -2
  176. package/dist/core/runner/inline-image.js +1 -1
  177. package/dist/core/runner/mcp-redial.d.ts +52 -10
  178. package/dist/core/runner/mcp-redial.js +38 -9
  179. package/dist/core/runner/notice-seat-input.d.ts +11 -0
  180. package/dist/core/runner/notice-seat-input.js +1 -0
  181. package/dist/core/runner/permission-rule-lanes.d.ts +5 -2
  182. package/dist/core/runner/permission-rule-lanes.js +22 -10
  183. package/dist/core/runner/person-path-rows.d.ts +3 -1
  184. package/dist/core/runner/person-path-rows.js +3 -2
  185. package/dist/core/runner/prepare-acquire-reconcile.js +5 -1
  186. package/dist/core/runner/prepare-ask-lane.d.ts +5 -7
  187. package/dist/core/runner/prepare-ask-lane.js +6 -15
  188. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -2
  189. package/dist/core/runner/prepare-caps-and-workflow.js +25 -8
  190. package/dist/core/runner/prepare-config-doors.d.ts +52 -1
  191. package/dist/core/runner/prepare-config-doors.js +168 -143
  192. package/dist/core/runner/prepare-defer-classify.js +7 -11
  193. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  194. package/dist/core/runner/prepare-delegation-surface.js +7 -5
  195. package/dist/core/runner/prepare-gate-stations.d.ts +8 -11
  196. package/dist/core/runner/prepare-gate-stations.js +11 -10
  197. package/dist/core/runner/prepare-hands-readface.d.ts +1 -1
  198. package/dist/core/runner/prepare-hands-readface.js +2 -1
  199. package/dist/core/runner/prepare-inherited-gate.d.ts +8 -12
  200. package/dist/core/runner/prepare-inherited-gate.js +10 -23
  201. package/dist/core/runner/prepare-listings.d.ts +1 -1
  202. package/dist/core/runner/prepare-listings.js +4 -2
  203. package/dist/core/runner/prepare-memory-engine-session.d.ts +0 -6
  204. package/dist/core/runner/prepare-memory-engine-session.js +20 -7
  205. package/dist/core/runner/prepare-memory.d.ts +3 -2
  206. package/dist/core/runner/prepare-memory.js +6 -2
  207. package/dist/core/runner/prepare-offload-wrappers.d.ts +4 -4
  208. package/dist/core/runner/prepare-offload-wrappers.js +2 -1
  209. package/dist/core/runner/prepare-park-ask.js +10 -14
  210. package/dist/core/runner/prepare-policy-chain.d.ts +17 -15
  211. package/dist/core/runner/prepare-policy-chain.js +104 -109
  212. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  213. package/dist/core/runner/prepare-project-context.js +11 -12
  214. package/dist/core/runner/prepare-prompt-assembly.d.ts +45 -40
  215. package/dist/core/runner/prepare-prompt-assembly.js +138 -101
  216. package/dist/core/runner/prepare-prompt-inputs.d.ts +28 -23
  217. package/dist/core/runner/prepare-prompt-inputs.js +11 -10
  218. package/dist/core/runner/prepare-protocol-tools.d.ts +11 -7
  219. package/dist/core/runner/prepare-protocol-tools.js +20 -13
  220. package/dist/core/runner/prepare-question-face.d.ts +4 -2
  221. package/dist/core/runner/prepare-question-face.js +4 -3
  222. package/dist/core/runner/prepare-safety-scan.js +6 -10
  223. package/dist/core/runner/prepare-suspend-saga.d.ts +6 -0
  224. package/dist/core/runner/prepare-suspend-saga.js +7 -5
  225. package/dist/core/runner/prepare-task.js +41 -23
  226. package/dist/core/runner/prepare-turn-wiring.d.ts +13 -15
  227. package/dist/core/runner/prepare-turn-wiring.js +29 -27
  228. package/dist/core/runner/prepare-wiring-manifest.d.ts +13 -9
  229. package/dist/core/runner/prepare-wiring-manifest.js +14 -11
  230. package/dist/core/runner/resume-admission.d.ts +4 -1
  231. package/dist/core/runner/resume-admission.js +7 -5
  232. package/dist/core/runner/resume-apply.d.ts +5 -2
  233. package/dist/core/runner/resume-apply.js +24 -42
  234. package/dist/core/runner/resume-checkpoint-screen.d.ts +1 -0
  235. package/dist/core/runner/resume-checkpoint-screen.js +9 -1
  236. package/dist/core/runner/resume-internals-and-config.d.ts +3 -3
  237. package/dist/core/runner/resume-internals-and-config.js +3 -8
  238. package/dist/core/runner/resume-preflight.js +38 -16
  239. package/dist/core/runner/retired-runner-deps.d.ts +5 -6
  240. package/dist/core/runner/retired-runner-deps.js +4 -5
  241. package/dist/core/runner/run-brain-sinks.d.ts +3 -2
  242. package/dist/core/runner/run-brain-sinks.js +5 -1
  243. package/dist/core/runner/run-compaction-machinery.d.ts +7 -1
  244. package/dist/core/runner/run-compaction-machinery.js +7 -33
  245. package/dist/core/runner/run-harness-handlers.js +4 -2
  246. package/dist/core/runner/run-identity-wiring.d.ts +3 -1
  247. package/dist/core/runner/run-identity-wiring.js +3 -2
  248. package/dist/core/runner/run-leg.js +103 -95
  249. package/dist/core/runner/run-notification-lane.js +1 -0
  250. package/dist/core/runner/run-recovery-lanes.d.ts +3 -0
  251. package/dist/core/runner/run-recovery-lanes.js +14 -11
  252. package/dist/core/runner/run-settle-and-teardown.js +9 -28
  253. package/dist/core/runner/run-stop-and-final-verify.js +18 -25
  254. package/dist/core/runner/run-terminal-adoption.d.ts +3 -0
  255. package/dist/core/runner/run-terminal-adoption.js +34 -22
  256. package/dist/core/runner/run-tool-mount-facts.js +5 -3
  257. package/dist/core/runner/run-turn-boundary.js +32 -37
  258. package/dist/core/runner/runtask.d.ts +6 -7
  259. package/dist/core/runner/runtask.js +15 -73
  260. package/dist/core/runner/session-rule-policy.d.ts +5 -5
  261. package/dist/core/runner/session-rule-policy.js +13 -8
  262. package/dist/core/runner/side-call-account.d.ts +68 -0
  263. package/dist/core/runner/side-call-account.js +61 -0
  264. package/dist/core/runner/skills-seat.d.ts +15 -0
  265. package/dist/core/runner/skills-seat.js +57 -0
  266. package/dist/core/runner/stream-halt-verbs.js +12 -17
  267. package/dist/core/runner/stream-lifecycle-verbs.js +8 -5
  268. package/dist/core/runner/stream-steer-verb.d.ts +1 -1
  269. package/dist/core/runner/stream-steer-verb.js +20 -38
  270. package/dist/core/runner/sub-agent-deny-lists.d.ts +124 -23
  271. package/dist/core/runner/sub-agent-deny-lists.js +230 -71
  272. package/dist/core/runner/synthetic-tools.d.ts +5 -2
  273. package/dist/core/runner/synthetic-tools.js +2 -12
  274. package/dist/core/runner/tool-end-body.d.ts +5 -6
  275. package/dist/core/runner/tool-end-body.js +6 -4
  276. package/dist/core/runner/tool-not-executed.d.ts +15 -0
  277. package/dist/core/runner/tool-not-executed.js +30 -0
  278. package/dist/core/runner/tool-occurrence.d.ts +8 -7
  279. package/dist/core/runner/tool-occurrence.js +5 -5
  280. package/dist/core/runner/tool-result-media-seat.d.ts +1 -1
  281. package/dist/core/runner-deps.d.ts +43 -36
  282. package/dist/core/safety-merge-corpus.js +18 -2
  283. package/dist/core/secret-env.d.ts +88 -20
  284. package/dist/core/secret-env.js +192 -38
  285. package/dist/core/session-policy-store.d.ts +71 -16
  286. package/dist/core/session-policy-store.js +138 -28
  287. package/dist/core/session-reconcile.d.ts +4 -0
  288. package/dist/core/session-reconcile.js +2 -1
  289. package/dist/core/shell-read-silence.js +3 -32
  290. package/dist/core/side-query.d.ts +5 -3
  291. package/dist/core/skill-grant.d.ts +3 -2
  292. package/dist/core/skill-grant.js +17 -9
  293. package/dist/core/skills-directory.d.ts +31 -11
  294. package/dist/core/skills-directory.js +655 -104
  295. package/dist/core/store-contracts/mailbox-store-contract.js +13 -0
  296. package/dist/core/task-event.d.ts +49 -3
  297. package/dist/core/task-notification.js +2 -2
  298. package/dist/core/task-result.d.ts +8 -0
  299. package/dist/core/task-spec.d.ts +20 -19
  300. package/dist/core/task-stream.d.ts +14 -4
  301. package/dist/core/tighten-task-spec.d.ts +4 -3
  302. package/dist/core/tighten-task-spec.js +2 -4
  303. package/dist/core/tool-check-reading.d.ts +74 -0
  304. package/dist/core/tool-check-reading.js +80 -0
  305. package/dist/core/tool-policy.d.ts +62 -18
  306. package/dist/core/tool-policy.js +86 -15
  307. package/dist/core/tool-registry.d.ts +20 -0
  308. package/dist/core/tool-registry.js +4 -0
  309. package/dist/core/tool-spec.d.ts +10 -6
  310. package/dist/core/tools.js +2 -0
  311. package/dist/core/trace.d.ts +51 -32
  312. package/dist/core/types.d.ts +2 -2
  313. package/dist/core/types.js +1 -1
  314. package/dist/core/unc-spelling.d.ts +10 -0
  315. package/dist/core/unc-spelling.js +3 -0
  316. package/dist/core/untrusted-egress.d.ts +8 -0
  317. package/dist/core/untrusted-egress.js +4 -1
  318. package/dist/core/untrusted-text.d.ts +16 -0
  319. package/dist/core/untrusted-text.js +7 -2
  320. package/dist/core/user-attachment.d.ts +25 -4
  321. package/dist/core/user-attachment.js +63 -42
  322. package/dist/core/wiring-manifest.d.ts +18 -15
  323. package/dist/core/wiring-manifest.js +2 -2
  324. package/dist/engine/compaction/utils.js +1 -2
  325. package/dist/engine/execution-env/node-execution-env.d.ts +4 -3
  326. package/dist/engine/execution-env/symlink-chain.js +1 -1
  327. package/dist/engine/harness/agent-harness.d.ts +1 -1
  328. package/dist/engine/harness/agent-harness.js +5 -4
  329. package/dist/engine/harness/types.d.ts +20 -16
  330. package/dist/engine/harness/types.js +7 -1
  331. package/dist/engine/llm/types.d.ts +12 -7
  332. package/dist/engine/loop/agent-loop.d.ts +12 -1
  333. package/dist/engine/loop/agent-loop.js +18 -6
  334. package/dist/engine/loop/types.d.ts +8 -2
  335. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  336. package/dist/engine/session/import-validate.js +3 -10
  337. package/dist/engine/session/session.d.ts +4 -4
  338. package/dist/engine/session/session.js +4 -4
  339. package/dist/index.d.ts +33 -23
  340. package/dist/index.js +23 -15
  341. package/dist/internal/harness.d.ts +2 -1
  342. package/dist/internal/harness.js +2 -1
  343. package/dist/orchestration/goal.d.ts +24 -1
  344. package/dist/orchestration/goal.js +3 -2
  345. package/dist/orchestration/run-spec.d.ts +4 -6
  346. package/dist/orchestration/run-spec.js +39 -63
  347. package/dist/orchestration/run-workflow-tool.js +1 -2
  348. package/dist/orchestration/workflow.d.ts +11 -3
  349. package/dist/orchestration/workflow.js +11 -2
  350. package/dist/prompt-assembly/artifact-store.d.ts +72 -56
  351. package/dist/prompt-assembly/artifact-store.js +60 -52
  352. package/dist/prompt-assembly/artifact.d.ts +90 -76
  353. package/dist/prompt-assembly/artifact.js +197 -145
  354. package/dist/prompt-assembly/assemble.d.ts +36 -29
  355. package/dist/prompt-assembly/assemble.js +34 -220
  356. package/dist/prompt-assembly/bands.d.ts +20 -0
  357. package/dist/prompt-assembly/bands.js +18 -0
  358. package/dist/prompt-assembly/catalog/constitution.d.ts +23 -0
  359. package/dist/prompt-assembly/catalog/constitution.js +69 -0
  360. package/dist/prompt-assembly/catalog/core-behavior.d.ts +9 -0
  361. package/dist/prompt-assembly/catalog/core-behavior.js +85 -0
  362. package/dist/prompt-assembly/catalog/index.d.ts +11 -0
  363. package/dist/prompt-assembly/catalog/index.js +60 -0
  364. package/dist/prompt-assembly/catalog/memory.d.ts +13 -0
  365. package/dist/prompt-assembly/catalog/memory.js +6 -0
  366. package/dist/prompt-assembly/catalog/modes.d.ts +15 -0
  367. package/dist/prompt-assembly/catalog/modes.js +137 -0
  368. package/dist/prompt-assembly/catalog/role.d.ts +10 -0
  369. package/dist/prompt-assembly/catalog/role.js +157 -0
  370. package/dist/prompt-assembly/catalog/schema.d.ts +138 -0
  371. package/dist/prompt-assembly/catalog/schema.js +25 -0
  372. package/dist/prompt-assembly/catalog/sections.d.ts +9 -0
  373. package/dist/prompt-assembly/catalog/sections.js +98 -0
  374. package/dist/prompt-assembly/catalog/team.d.ts +4 -0
  375. package/dist/prompt-assembly/catalog/team.js +258 -0
  376. package/dist/prompt-assembly/composer.d.ts +26 -28
  377. package/dist/prompt-assembly/composer.js +124 -46
  378. package/dist/prompt-assembly/epoch.d.ts +89 -79
  379. package/dist/prompt-assembly/epoch.js +115 -142
  380. package/dist/prompt-assembly/explain.d.ts +58 -34
  381. package/dist/prompt-assembly/explain.js +21 -24
  382. package/dist/prompt-assembly/overlay.d.ts +137 -0
  383. package/dist/prompt-assembly/overlay.js +339 -0
  384. package/dist/prompt-assembly/renderers.d.ts +21 -0
  385. package/dist/prompt-assembly/renderers.js +39 -0
  386. package/dist/prompt-assembly/section-usage.d.ts +3 -3
  387. package/dist/prompt-assembly/section-usage.js +1 -1
  388. package/dist/prompt-assembly/select.d.ts +71 -0
  389. package/dist/prompt-assembly/select.js +106 -0
  390. package/dist/prompt-assembly/sugar.d.ts +31 -0
  391. package/dist/prompt-assembly/sugar.js +20 -0
  392. package/dist/prompt-assembly/turn-snapshot.d.ts +3 -2
  393. package/dist/prompt-assembly/types.d.ts +45 -148
  394. package/dist/prompts/coordinator.d.ts +2 -21
  395. package/dist/prompts/coordinator.js +3 -255
  396. package/dist/prompts/cowork.d.ts +27 -16
  397. package/dist/prompts/cowork.js +2 -23
  398. package/dist/prompts/default.d.ts +38 -511
  399. package/dist/prompts/default.js +20 -288
  400. package/dist/prompts/supervisor.d.ts +6 -71
  401. package/dist/prompts/supervisor.js +6 -117
  402. package/dist/stores/file/permission-rule-store.d.ts +1 -1
  403. package/dist/stores/file/permission-rule-store.js +2 -1
  404. package/dist/tools/artifact/artifact-tool.js +4 -3
  405. package/dist/tools/fs/bash-readonly-classifier.d.ts +6 -5
  406. package/dist/tools/fs/dir-entries.d.ts +4 -2
  407. package/dist/tools/fs/dir-entries.js +16 -4
  408. package/dist/tools/fs/fs-bash.d.ts +1 -1
  409. package/dist/tools/fs/fs-bash.js +22 -11
  410. package/dist/tools/fs/fs-pdf.js +17 -13
  411. package/dist/tools/fs/fs-read.js +4 -3
  412. package/dist/tools/fs/fs-shared.d.ts +1 -10
  413. package/dist/tools/fs/fs-shared.js +3 -4
  414. package/dist/tools/fs/fs-write.js +2 -1
  415. package/dist/tools/fs/notebook.js +1 -1
  416. package/dist/tools/fs/pdf.d.ts +20 -10
  417. package/dist/tools/fs/pdf.js +19 -10
  418. package/dist/tools/fs/program-read-model.d.ts +68 -8
  419. package/dist/tools/fs/program-read-model.js +112 -33
  420. package/dist/tools/fs/program-read-model.rows.js +30 -10
  421. package/dist/tools/fs/read-deny-home.d.ts +25 -9
  422. package/dist/tools/fs/read-deny-home.js +28 -27
  423. package/dist/tools/fs/read-deny.d.ts +41 -11
  424. package/dist/tools/fs/read-deny.js +51 -5
  425. package/dist/tools/fs/safety.d.ts +4 -26
  426. package/dist/tools/fs/safety.js +10 -32
  427. package/dist/tools/fs/search.js +15 -10
  428. package/dist/tools/fs/shell-read-argv.d.ts +3 -2
  429. package/dist/tools/fs/shell-read-argv.js +118 -38
  430. package/dist/tools/fs/shell-read-establish.d.ts +5 -5
  431. package/dist/tools/fs/shell-read-establish.js +11 -61
  432. package/dist/tools/fs/shell-read-identity.js +6 -3
  433. package/dist/tools/fs/shell-read-judge.d.ts +13 -15
  434. package/dist/tools/fs/shell-read-judge.js +18 -4
  435. package/dist/tools/fs/shell-read-plan.d.ts +2 -2
  436. package/dist/tools/web.js +1 -1
  437. package/package.json +13 -1
  438. package/test/export-surface.snapshot.json +306 -103
  439. package/wire-changes/core@7.52.0.json +5859 -0
  440. package/wire-changes/core@7.53.0.json +1946 -0
  441. package/dist/core/hook-seats.d.ts +0 -66
  442. package/dist/core/hook-seats.js +0 -37
  443. package/dist/prompt-assembly/packs/sema-default.d.ts +0 -2
  444. package/dist/prompt-assembly/packs/sema-default.js +0 -147
  445. package/dist/prompts/simple-sections.d.ts +0 -58
  446. package/dist/prompts/simple-sections.js +0 -43
@@ -16,10 +16,11 @@ import { boundInputHashOf } from "./canonical-json.js";
16
16
  import { delimitUntrusted, inlineUntrusted, REVIEWER_NOTE_MAX_BODY } from "./untrusted-text.js";
17
17
  import { describeRejectedValue } from "./tool-search-setting.js";
18
18
  import { egressText, egressThrownText } from "./untrusted-egress.js";
19
- import { assertNoRetiredToolPolicyKeys, RETIRED_DECISION_MEMBERS } from "./retired-keys.js";
19
+ import { assertNoRetiredKeys, assertNoRetiredToolPolicyKeys, RETIRED_DECISION_MEMBERS, RETIRED_TOOL_POLICY_KEYS } from "./retired-keys.js";
20
20
  import { isEngineRefusal, nestedRecordsOf, receiveContract, receiveNestedRecords, refusedOutOfContract, screenContractValues } from "./decision-receipt.js";
21
21
  export { isEngineRefusal } from "./decision-receipt.js";
22
- import { isNamespacedCoveringRuleName, namespacedRuleNameCovers, parsePermissionRule } from "./permission-rules.js";
22
+ import { isNamespacedCoveringRuleName, namespacedRuleNameCovers } from "./permission-rules.js";
23
+ import { ruleSpellingOf } from "./permission-rule-syntax.js";
23
24
  import { protocolOf } from "./protocol-table.js";
24
25
  import { anchorSpelling, isAbsoluteForFamily, normalizeAbsPathLexically, pathFamilyOf, writeTargetPath } from "../tools/fs/safety.js";
25
26
  import { KNOWN_SAFE_ROOTS, removalReadingOf } from "../tools/fs/removal-targets.js";
@@ -147,7 +148,7 @@ export function decisionText(d) {
147
148
  }
148
149
  const TOOL_POLICY_CARRIED_MEMBERS = ["projection", "pathRules", "writeGuardRows", "nameSets"];
149
150
  export function carriedMembersOf(p) {
150
- assertNoRetiredToolPolicyKeys(p);
151
+ assertNoRetiredKeys(p, RETIRED_TOOL_POLICY_KEYS, "ToolPolicy");
151
152
  const out = {};
152
153
  const carry = (k) => {
153
154
  const v = p[k];
@@ -176,6 +177,9 @@ export function namespacedCoveringEntries(entries) {
176
177
  export function namespacedCoveringHit(covering, call) {
177
178
  return covering.length > 0 && nameListHolds({ has: (name) => covering.some((e) => namespacedRuleNameCovers(e, name)) }, call);
178
179
  }
180
+ export function projectionToolNames(c) {
181
+ return c.kind === "shell_command" ? { member: "tools", list: c.tools } : { member: "names", list: c.names };
182
+ }
179
183
  export function checkToolPolicyProjection(projection, req) {
180
184
  const listed = (list) => heldBy("policy.projectionReplay", { has: (n) => list.includes(n) }, req);
181
185
  for (const c of projection.components) {
@@ -305,6 +309,12 @@ export function refuseOutOfContractDecision(d, opts) {
305
309
  return refusedOutOfContract(`a permission decision's members could not be detached from the layer that returned them (${detached.reason}) — ` +
306
310
  `the engine keeps its own copy of what it read; denied fail-closed`);
307
311
  }
312
+ const rewrite = detached.value.updatedInput;
313
+ const ownedRewrite = rewrite !== undefined ? ownedCopy(rewrite, "updatedInput") : undefined;
314
+ if (ownedRewrite !== undefined && !ownedRewrite.ok) {
315
+ return refusedOutOfContract(`a permission decision's members could not be detached from the layer that returned them (${ownedRewrite.reason}) — ` +
316
+ `the engine keeps its own copy of what it read; denied fail-closed`);
317
+ }
308
318
  const receipt = Object.freeze(attestation !== undefined ? { ...detached.value, attestation } : detached.value);
309
319
  for (const v of Object.values(receipt))
310
320
  if (Array.isArray(v))
@@ -318,9 +328,6 @@ export function refuseOutOfContractDecision(d, opts) {
318
328
  (hookSeam ? HOOK_RECEIPTS : ENGINE_RECEIPTS).add(receipt);
319
329
  return receipt;
320
330
  }
321
- export function receiveHookResult(result) {
322
- return refuseOutOfContractDecision(result, { reasonIsNonInput: true });
323
- }
324
331
  const DEADLINE_ELAPSED = Symbol("approval.deadline_elapsed");
325
332
  function withTimeout(p, ms, onTimeout) {
326
333
  if (ms === undefined) {
@@ -353,6 +360,7 @@ export function createAllowDenyPolicy(opts) {
353
360
  if (entries === undefined)
354
361
  return undefined;
355
362
  const kept = [];
363
+ const seen = new Set();
356
364
  for (const entry of entries) {
357
365
  const ns = protocolOf(entry);
358
366
  if (ns !== undefined) {
@@ -367,8 +375,23 @@ export function createAllowDenyPolicy(opts) {
367
375
  continue;
368
376
  }
369
377
  }
370
- if (parsePermissionRule(entry).ruleContent === undefined) {
371
- kept.push(entry);
378
+ const spelled = ruleSpellingOf(entry);
379
+ if (spelled === undefined) {
380
+ const lesson = `a spelling no tool name can have — the rule syntax reads no tool name in it, so a name set never names a tool by it. Fix the entry.`;
381
+ invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
382
+ continue;
383
+ }
384
+ if (spelled.ruleContent === undefined) {
385
+ if (spelled.toolName === "*" && list === "deny") {
386
+ const lesson = `the wildcard — \`*\` names no tool, and a deny entry reaches the tool it names, so this one would be kept and never match ` +
387
+ `(a deny that reads protective and denies nothing). Name the tools to deny; to leave a run no tools, write an empty allow list.`;
388
+ invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
389
+ continue;
390
+ }
391
+ if (!seen.has(spelled.toolName)) {
392
+ seen.add(spelled.toolName);
393
+ kept.push(spelled.toolName);
394
+ }
372
395
  continue;
373
396
  }
374
397
  const lesson = `a rule CONTENT form, not a tool name — a name set matches raw tool names, so this entry ` +
@@ -562,7 +585,7 @@ export function combinePolicies(...policies) {
562
585
  ...carriedMembersOf(folded),
563
586
  async check(req, signal) {
564
587
  let asked;
565
- let current = req;
588
+ let current = Object.freeze({ ...req });
566
589
  let rewrite;
567
590
  let stated;
568
591
  let records;
@@ -574,7 +597,7 @@ export function combinePolicies(...policies) {
574
597
  let authoredBySeen = false;
575
598
  const contributors = [];
576
599
  const settleDeny = (d) => {
577
- const out = rewrite?.updatedInput !== undefined ? { ...d, updatedInput: rewrite.updatedInput } : d;
600
+ const out = rewrite !== undefined ? refusalOf(d, current.args) : d;
578
601
  if (records === undefined)
579
602
  return out;
580
603
  return { ...out, attestation: mergeAttestation(req, records, d.attestation) };
@@ -589,8 +612,7 @@ export function combinePolicies(...policies) {
589
612
  continue;
590
613
  }
591
614
  if (d.updatedInput !== undefined) {
592
- const reread = withArgsReading(current, d.updatedInput, signal);
593
- current = reread !== undefined ? await reread : { ...current, args: d.updatedInput };
615
+ current = Object.freeze(await withArgsReading(current, d.updatedInput, signal));
594
616
  rewrite = d;
595
617
  stated = d.action === "allow" ? d.decisionReason : undefined;
596
618
  }
@@ -871,6 +893,55 @@ export function tryCloneArgs(v) {
871
893
  return { ok: false, reason: describeThrown(err), cause: err };
872
894
  }
873
895
  }
896
+ export function refusalOf(deny, judged) {
897
+ return deny.action !== "deny" || deny.updatedInput !== undefined ? deny : { ...deny, updatedInput: judged };
898
+ }
899
+ export function foldHookAsk(verdict, hookAsk) {
900
+ if (verdict.action === "deny")
901
+ return verdict;
902
+ const mandate = hookAsk.requiresRealApproval === true ? { requiresRealApproval: true } : {};
903
+ if (verdict.action === "allow") {
904
+ return { action: "ask", ...(hookAsk.message !== undefined ? { message: hookAsk.message } : {}), decisionReason: "hook", ...mandate, ...(hookAsk.updatedInput !== undefined ? { updatedInput: hookAsk.updatedInput } : {}) };
905
+ }
906
+ const hookMessage = hookAsk.message;
907
+ const message = hookMessage !== undefined && hookMessage !== verdict.message ? `${verdict.message !== undefined ? `${verdict.message} ` : ""}(a PreToolUse hook also asks: ${hookMessage})` : verdict.message;
908
+ return { ...verdict, decisionReason: "hook", ...(message !== undefined ? { message } : {}), ...mandate };
909
+ }
910
+ const OWNED_ARGS = new WeakSet();
911
+ export function ownArgs(v, root = "args") {
912
+ if (v === null || (typeof v !== "object" && typeof v !== "function") || OWNED_ARGS.has(v))
913
+ return { ok: true, value: v };
914
+ const copy = tryCloneArgs(v);
915
+ return copy.ok ? ownedCopy(copy.value, root) : { ...copy, reason: `unclonable value: ${copy.reason}` };
916
+ }
917
+ export function ownedReading(read) {
918
+ return (args) => {
919
+ const out = read(args);
920
+ const owned = ownArgs(out);
921
+ return owned.ok ? owned.value : out;
922
+ };
923
+ }
924
+ function ownedCopy(fresh, root) {
925
+ const pending = [[fresh, root]];
926
+ for (let next = pending.pop(); next !== undefined; next = pending.pop()) {
927
+ const [x, at] = next;
928
+ if (typeof x !== "object" || x === null || Object.isFrozen(x))
929
+ continue;
930
+ const proto = Object.getPrototypeOf(x);
931
+ if (proto !== Object.prototype && proto !== Array.prototype && proto !== null) {
932
+ return { ok: false, reason: `${inlineUntrusted(at, 200)} is a ${Object.prototype.toString.call(x).slice(8, -1)}, whose contents cannot be made immutable — args are plain data` };
933
+ }
934
+ Object.freeze(x);
935
+ for (const key of Reflect.ownKeys(x)) {
936
+ const d = Object.getOwnPropertyDescriptor(x, key);
937
+ if (d !== undefined && "value" in d)
938
+ pending.push([d.value, Array.isArray(x) ? `${at}[${String(key)}]` : `${at}.${String(key)}`]);
939
+ }
940
+ }
941
+ if (typeof fresh === "object" && fresh !== null)
942
+ OWNED_ARGS.add(fresh);
943
+ return { ok: true, value: fresh };
944
+ }
874
945
  export function describeThrown(err) {
875
946
  const contained = containThrownText(egressThrownText("same-principal", err));
876
947
  if (contained !== "")
@@ -1127,7 +1198,7 @@ function readApproverOutcomeObject(ok, toolName, editLane) {
1127
1198
  `re-adjudication an approver's edit gets; denied fail-closed (approve or refuse what was shown, and route edits ` +
1128
1199
  `through the run's approver seat)`, settledByNobody("approver_contract"));
1129
1200
  }
1130
- const edit = tryCloneArgs(suppliedEdit);
1201
+ const edit = ownArgs(suppliedEdit);
1131
1202
  if (!edit.ok) {
1132
1203
  return refused(`the approved edit for "${toolName}" is not safely clonable (${edit.reason}) — denied fail-closed`, settledByNobody("presentation_failed"));
1133
1204
  }
@@ -1150,11 +1221,11 @@ async function resolveAskArms(req, onAsk, signal, onLateSettlement) {
1150
1221
  if (signal?.aborted) {
1151
1222
  return { action: "deny", message: `approval aborted for "${req.toolName}" (run or turn interrupted)`, decisionReason: "mode", settlement: settledByNobody("task_aborted") };
1152
1223
  }
1153
- const presented = tryCloneArgs(req.args);
1224
+ const presented = ownArgs(req.args);
1154
1225
  if (!presented.ok) {
1155
1226
  return {
1156
1227
  action: "deny",
1157
- message: `approval for "${req.toolName}" could not present the args safely (unclonable value: ${presented.reason}) — denied fail-closed`,
1228
+ message: `approval for "${req.toolName}" could not present the args safely (${presented.reason}) — denied fail-closed`,
1158
1229
  decisionReason: "mode",
1159
1230
  settlement: settledByNobody("presentation_failed"),
1160
1231
  };
@@ -88,6 +88,26 @@ export declare function pathTargetValue(args: unknown, pt: {
88
88
  param: string;
89
89
  aliases?: readonly string[];
90
90
  }): string | undefined;
91
+ /**
92
+ * CC parity: Read/Edit/Write take the file path as `file_path`. Read the target the same way
93
+ * EVERYWHERE the path is consumed from a tool-call's args — not just the tool body but ALSO every gate that
94
+ * extracts the write target to confine it (sensitive-path, session allowDirs, the fs-write gate). A gate that only
95
+ * read `args.path` would see `undefined` for a `file_path` call and either fail-OPEN (circumvent the guard — a real
96
+ * hole) or fail-closed (deny a legitimate write). Single source.
97
+ *
98
+ * The `path` arm is deliberately BROADER than what Read/Edit/Write accept: their schema requires
99
+ * `file_path` (fs-shared.ts FILE_PATH_PARAMS; Write alone repairs the `path` spelling onto it BEFORE validation,
100
+ * `coerceWriteArguments`, so a gate never sees the alias there), but this reader is
101
+ * shared with gates that judge OTHER tool vocabularies — Glob's real `path` parameter, deployment-authored tools —
102
+ * and a gate must never see LESS than the tool it is confining might act on. So the asymmetry is the design: the
103
+ * schema decides what a caller may send, this decides what gets judged, and this side over-reads on purpose.
104
+ *
105
+ * `file_path` wins; an empty/non-string `file_path` falls back to `path` (NOT an alias for Read/Edit/Write, whose
106
+ * schema requires `file_path`). Empty string ⇒ undefined (treated as "no path") so every caller's `=== undefined`
107
+ * check is sufficient — no separate length-0 guard needed. It lives beside {@link pathTargetValue} and is that
108
+ * reader over the one slot above: the engine's compaction metadata reads it too, and the engine never imports tools/.
109
+ */
110
+ export declare function fileArgPath(args: unknown): string | undefined;
91
111
  /** The path target of a wire name — the FIRST definition's (every definition under one name declares
92
112
  * the same target; the conformance test pins that). */
93
113
  /** A gated call as every fence sees it: the wire name, the args, and the OBJECT face a prepared leg stamped on the
@@ -85,6 +85,10 @@ export function pathTargetValue(args, pt) {
85
85
  }
86
86
  return undefined;
87
87
  }
88
+ const FILE_ARG_PATH_TARGET = { param: "file_path", aliases: ["path"] };
89
+ export function fileArgPath(args) {
90
+ return pathTargetValue(args, FILE_ARG_PATH_TARGET);
91
+ }
88
92
  export function protectivePathTargetOf(call) {
89
93
  if (call.face?.pathTarget !== undefined)
90
94
  return call.face.pathTarget;
@@ -121,10 +121,14 @@ export interface ReadRootGrantCandidate {
121
121
  }
122
122
  export interface ToolSpec<TParams extends TSchema = TSchema> {
123
123
  /**
124
- * Model-facing tool name. MUST NOT contain `__` — that separator is reserved by the PROTOCOL TABLE
125
- * (`protocol-table.ts`), the umbrella over every namespaced family the engine speaks: `mcp__<server>__<tool>`,
126
- * `a2a__<peer>__<skill>`, and whatever a third protocol appends. A caller tool name carrying it is rejected
127
- * at prepare-time (`config.tool_name_invalid`).
124
+ * Model-facing tool name. It keeps the caller tool name contract (`caller-tool-name.ts`), judged at prepare-time — a
125
+ * name that breaks it is refused there (`config.tool_name_invalid`) and the run does not start:
126
+ * - it is a name a rule can name: ASCII letters, digits and `_ - . : *`, starting with a letter, a digit or `_`, not
127
+ * ending with `.` or `:`, and not the lone wildcard `*` — so every allow / deny list can name the tool (a leading `-`,
128
+ * a character outside ASCII, a blank or an empty name is refused);
129
+ * - it does not contain `__` — that separator is reserved by the PROTOCOL TABLE (`protocol-table.ts`), the umbrella over
130
+ * every namespaced family the engine speaks: `mcp__<server>__<tool>`, `a2a__<peer>__<skill>`, and whatever a third
131
+ * protocol appends.
128
132
  *
129
133
  * The live reason (not the retired durable-resume name shim, RB-476-A): every table-driven site — the
130
134
  * namespace `parse`, the grouped display key, the permission-rule lanes, the tool-manifest origin
@@ -136,7 +140,7 @@ export interface ToolSpec<TParams extends TSchema = TSchema> {
136
140
  /**
137
141
  * Backward-compatible model-facing names that should dispatch to this tool. New transcripts and tool rosters
138
142
  * should use {@link name}; aliases exist only so old model calls / SDK payloads / resumed sessions don't strand
139
- * across a canonical rename.
143
+ * across a canonical rename. Each alias keeps the same contract as {@link name} (a rule naming an alias reaches the tool).
140
144
  */
141
145
  aliases?: string[];
142
146
  description: string;
@@ -711,7 +715,7 @@ export interface ToolExecuteContext {
711
715
  * PreToolUse SCREENING entry (issue #33), whose policy the engine mints. Rebuild it with the
712
716
  * exported `createPreToolUseConstraintPolicy(hook, env)` — same callback, same installed env —
713
717
  * or the chain handed back here will be short and rejected on the count check. A face that only
714
- * observes should carry `Hooks.preToolUseObservational` instead, and then never enters the chain
718
+ * observes should be declared `{ observe: true }` instead, and then never enters the chain
715
719
  * at all; a park under a screening entry announces the requirement on `onError`
716
720
  * (classification `screening-constraint-in-durable-chain`) at park time.
717
721
  */
@@ -2,6 +2,7 @@ import { Value } from "typebox/value";
2
2
  import { formatToolError, formatZodValidationError } from "./tool-errors.js";
3
3
  import { readMember } from "./thrown-value.js";
4
4
  import { frozenToolSpec } from "./tool-spec-members.js";
5
+ import { carryDelegationName } from "./delegation-name.js";
5
6
  import { attachToolContract } from "../prompt-assembly/tool-catalog.js";
6
7
  function normalizeContent(ret) {
7
8
  if (typeof ret === "string") {
@@ -135,6 +136,7 @@ function buildProduct(spec, owner, options) {
135
136
  }
136
137
  },
137
138
  };
139
+ carryDelegationName(spec.execute, tool.execute);
138
140
  if (spec.contract) {
139
141
  attachToolContract(tool, {
140
142
  contractId: spec.contract.contractId,
@@ -19,6 +19,44 @@
19
19
  import type { BrainRetryErrClass, TaskStatus, ToolEffect } from "./types.js";
20
20
  import type { ThinkingLevel } from "../internal/harness-types.js";
21
21
  import type { ToolManifestRow } from "../prompt-assembly/tool-catalog.js";
22
+ import type { PromptEpochActivation, PromptIdentityLayers } from "../prompt-assembly/epoch.js";
23
+ import type { ChainLink, SupersededOverlay } from "../prompt-assembly/overlay.js";
24
+ import type { HostForm, HostRole, RendererId } from "../prompt-assembly/catalog/schema.js";
25
+ /** The run's prompt identity as the manifest reports it: the identity digest, its inputs, and the session record that
26
+ * names it (the record's counter and how it came to be). */
27
+ export interface PromptManifestIdentity {
28
+ artifact: string;
29
+ layers: PromptIdentityLayers;
30
+ epoch: number;
31
+ activatedBy: PromptEpochActivation;
32
+ }
33
+ /** The run's selector values — the plain form of the identity's `binding` element. */
34
+ export interface PromptManifestSelectors {
35
+ binding?: string;
36
+ traits: string[];
37
+ host: {
38
+ role: HostRole;
39
+ form: HostForm;
40
+ };
41
+ facts: Record<string, boolean>;
42
+ }
43
+ /** One rendered section: where it sits, which variant and renderer made it, whose text it carries (`locale`: the
44
+ * catalog's canonical text, or text an overlay author wrote), its content digest (`sha256:` unsalted for published
45
+ * text, `salted:` for text carrying the task's or the run's own inputs) and its history (`chain`). */
46
+ export interface PromptManifestSection {
47
+ id: string;
48
+ band: string;
49
+ rank: number;
50
+ variant?: string;
51
+ renderer?: {
52
+ id: RendererId;
53
+ version: number;
54
+ };
55
+ chars: number;
56
+ locale: "canonical" | "overlay";
57
+ contentHash: string;
58
+ chain: ChainLink[];
59
+ }
22
60
  /**
23
61
  * R4 (1.285): the scalar face of `TaskResult.stats.mechanisms`, echoed on `task.end` so "did the
24
62
  * engine machinery fire" is answerable from the trace alone. Counters/flags only —
@@ -82,46 +120,27 @@ export type TraceEvent = {
82
120
  ts: number;
83
121
  } | {
84
122
  /**
85
- * 提示词主权批 — the labelled composition of the assembled system prompt, emitted once right after
86
- * `task.start`. Kills the "which blocks were actually in the prompt" black box: a deployment can
87
- * assert the constitution/safety blocks are present (or that their absence was a deliberate
88
- * `replaceAll`) instead of diagnosing missing-prompt incidents by archaeology. Metadata-only
89
- * (block ids + sizes + short content hashes — never prompt text, per the file-header privacy rule).
123
+ * The labelled composition of the assembled system prompt (manifest v3), emitted once right after `task.start`:
124
+ * which prompt this is (the identity and its selector values), which blocks and sections composed it, and where
125
+ * each section's text came from (its chain of overlays, the superseded ones marked). Metadata-only — ids, sizes
126
+ * and digests, never prompt text (the file-header privacy rule).
90
127
  */
91
128
  kind: "prompt.assembled";
92
- version: 1;
129
+ version: 3;
93
130
  taskId: string;
94
- /** Who owned the constitution layer: "core" (structural default) / "replaced" (provider
95
- * `replaceAll` opt-out) / "provider-assembled" (migration guard pass-through). */
96
- constitution: "core" | "replaced" | "provider-assembled";
97
- /** Ordered blocks: stable id (e.g. `role.base`, `harness.context`, `memory.safety`,
98
- * `env.context`, `memory.tail`), size in chars, sha256-prefix content hash. [c209-C]:
99
- * `skills.block` is GONE — the skills listing left the stable prefix for the skills_listing
100
- * reminder frame (observable via `steering_injected` source "skills_listing"). */
131
+ identity: PromptManifestIdentity;
132
+ selectors: PromptManifestSelectors;
133
+ /** Ordered blocks: stable id (e.g. `role.base`, `harness.context`, `memory.safety`, `env.context`,
134
+ * `memory.tail`), size in chars, salted short content hash — the block-view id wordlist is a downstream contract. */
101
135
  blocks: Array<{
102
136
  id: string;
103
137
  chars: number;
104
138
  hash: string;
105
139
  }>;
106
- /**
107
- * Manifest v2 (stage S1, ADDITIVE — the v1 `blocks` id wordlist above is a downstream
108
- * contract and stays as-is): the compiled-IR view, one entry per pack section, carrying the
109
- * assembly protocol's semantic/lifecycle dimensions (slot/carrier/cadence/cacheClass).
110
- * Absent on the legacy free-form provider path (single opaque block, no section structure).
111
- * `contentHash` (digest tiering): UNSALTED full sha256, present ONLY on
112
- * operator-declared sections (typed `stableBlocks` lane) — the center-publish ↔ manifest
113
- * reconciliation anchor. Core-native sections stay salted-only (`hash`).
114
- */
115
- sections?: Array<{
116
- id: string;
117
- slot: string;
118
- carrier: string;
119
- cadence: string;
120
- cacheClass: string;
121
- chars: number;
122
- hash: string;
123
- contentHash?: string;
124
- }>;
140
+ sections: PromptManifestSection[];
141
+ /** Every overlay the composition superseded (a later one on the same target won, or it changed nothing this
142
+ * run); absent when none was. */
143
+ superseded?: SupersededOverlay[];
125
144
  /**
126
145
  * S2 (additive): the mounted tools plane — per-tool contract identity, durable-replay
127
146
  * aliases, presentation-invariant shape digest and full wire-schema digest (initial mount face;
@@ -18,8 +18,8 @@ export type { PermissionMode } from "./ask-origin.js";
18
18
  export type { ToolEffect, ToolContentOrigin, ReversibilityVerdict, ReadRootGrantCandidate, ToolSpec, ToolReturn, NestedUsage, NestedUsageAccum, ToolExecuteContext } from "./tool-spec.js";
19
19
  export type { BeforeWriteRequest, BeforeWriteResult, BeforeWriteHook, TrackEditRequest, TrackEditResult, TrackFileEditHook, FileEditedNotice, FileEditedHook, HandsBandOptions } from "./hands-band.js";
20
20
  export type { AgentDefinition, SkillSpec } from "./agent-definition.js";
21
- export type { McpServerSpec, A2aServerSpec, McpElicitRequest, McpElicitResponse, OnElicit, McpRevocationLedger, McpMountIdentity, McpToolAxesRead } from "./mcp-server-spec.js";
22
- export { readMcpToolAxes } from "./mcp-server-spec.js";
21
+ export type { McpServerSpec, A2aServerSpec, McpElicitRequest, McpElicitResponse, OnElicit, McpRevocationLedger, McpMountIdentity, DeclarationFault, DeclarationPathRule, DeclarationRead, ToolAxesRead, ToolAxesSurface } from "./mcp-server-spec.js";
22
+ export { DECLARATION_PATH_RULES, declarationFaultOf, declarerWord, readMcpToolAxes, readToolAxes, receiveDeclaration, toolAxesRefusal } from "./mcp-server-spec.js";
23
23
  export type { TaskLimits } from "./task-limits.js";
24
24
  export type { TaskStatus, RemoteEnvFailureNote, EffectiveMemoryScopes, TaskResult, HumanReviewGateRow } from "./task-result.js";
25
25
  export type { TerminalCause, PausedCause } from "./terminal-cause.js";
@@ -1,5 +1,5 @@
1
1
  export { MODEL_ROLES } from "./model-seat.js";
2
- export { readMcpToolAxes } from "./mcp-server-spec.js";
2
+ export { DECLARATION_PATH_RULES, declarationFaultOf, declarerWord, readMcpToolAxes, readToolAxes, receiveDeclaration, toolAxesRefusal } from "./mcp-server-spec.js";
3
3
  export { AUTO_MODE_DENY_SOURCES, isAutoModeDenySource } from "./runtime-caps.js";
4
4
  export { __resetMalformedDelegationSeatAnnouncement, backgroundChildTerminal, deliverDelegationLifecycle, emitsChildRowFrames, taskStartedFrame } from "./delegation-frames.js";
5
5
  export { __resetMalformedNoticeSeatAnnouncement, deliverEngineNotice, owedUserInputCounts, parentLegIds, settleOwedUserInput, undrainedUserInputNotices, USER_INPUT_UNDRAINED_CAUSES, USER_INPUT_UNDRAINED_FAMILIES } from "./engine-notice.js";
@@ -0,0 +1,10 @@
1
+ /**
2
+ * UNC under the win family: two leading separators, a host, a share — either separator, as `path.win32`
3
+ * reads it. The ONE UNC recognizer behind `isAbsoluteForFamily`, `pathIdentityOf` and `joinForFamily`
4
+ * (tools/fs/safety.ts), the symlink-chain reader (core/path-identity.ts) and the engine's own chain walk
5
+ * (engine/execution-env/symlink-chain.ts).
6
+ *
7
+ * A pure spelling test with no dependency, so the engine layer and the tools layer both read it from here:
8
+ * the engine never imports tools/, and tools reach the engine only through the `internal/harness` facade.
9
+ */
10
+ export declare function isUncSpelling(p: string): boolean;
@@ -0,0 +1,3 @@
1
+ export function isUncSpelling(p) {
2
+ return /^[\\/]{2}[^\\/]+[\\/]+[^\\/]/.test(p);
3
+ }
@@ -34,6 +34,14 @@ export declare function egressText<T extends EgressTier>(tier: T, text: string,
34
34
  export declare function egressThrownText<T extends EgressTier>(tier: T, err: unknown): Egress<T>;
35
35
  /** The `same-principal` tier's pass, under the name hosts call it by (the engine calls {@link egressText}). */
36
36
  export declare function redactSecrets(s: string, report?: RedactionReport): Egress<"same-principal">;
37
+ /**
38
+ * An extension's own words — its registration name, a bus reason, a key it wrote — made fit for an operator line: the
39
+ * `same-principal` egress pass first, then one line and bounded. The pass runs before the cut, so a cut never leaves part
40
+ * of a credential the pass would have recognised whole. Every station sentence that carries such words reads them here.
41
+ * It lives beside the pass, not in the stations module: a value import of the stations graph from a station's consumer
42
+ * closed a load-order cycle through the fs tools' barrel (an export the barrel copied before it existed).
43
+ */
44
+ export declare function extensionWords(s: string, max: number): string;
37
45
  /** The `human` tier's pass, under the name hosts call it by (the engine calls {@link egressText}). */
38
46
  export declare function redactHostLeaks(s: string, report?: RedactionReport): Egress<"human">;
39
47
  /**
@@ -1,4 +1,4 @@
1
- import { delimitUntrusted, neutralizeForFence } from "./untrusted-text.js";
1
+ import { delimitUntrusted, inlineUntrusted, neutralizeForFence } from "./untrusted-text.js";
2
2
  import { egressPasses, runRedactionPasses } from "./redaction-passes.js";
3
3
  import { CREDENTIAL_VOCABULARY, egressPassGroups, isSensitiveRecordKey, URI_SCHEME_SOURCE } from "./credential-vocabulary.js";
4
4
  import { isErrorLike, readMember, thrownText } from "./thrown-value.js";
@@ -34,6 +34,9 @@ export function egressThrownText(tier, err) {
34
34
  export function redactSecrets(s, report) {
35
35
  return egressText("same-principal", s, report);
36
36
  }
37
+ export function extensionWords(s, max) {
38
+ return inlineUntrusted(egressText("same-principal", s), max);
39
+ }
37
40
  export function redactHostLeaks(s, report) {
38
41
  return egressText("human", s, report);
39
42
  }
@@ -397,6 +397,12 @@ export declare function defuseControlChars(text: string): string;
397
397
  * Defense-in-depth, NOT a guarantee (same posture as the rest of this module).
398
398
  */
399
399
  export declare function inlineUntrusted(text: string, maxLen?: number): string;
400
+ /** The mark a cut text ends in: {@link inlineUntrusted}'s, and a notice's machine-read rule text's
401
+ * ({@link import("./permission-rule-model.js").noticeRuleText}) — one ellipsis, spelled once. */
402
+ export declare const INLINE_TRUNCATION_MARK = "\u2026";
403
+ /** The code points {@link inlineUntrusted} may return beyond its content cap: the one truncation mark. The longest result for a cap
404
+ * of `maxLen` is `maxLen` plus this. */
405
+ export declare const INLINE_TRUNCATION_MARK_CODEPOINTS: number;
400
406
  /** The per-ENTRY ceiling inside a `ProbeCause` operand family (checkpoint-store's
401
407
  * structured probe account), sized like the descriptor's own `touchedPaths` entries (the same thing
402
408
  * on the same card). Per entry, not per cause: that is the whole point of the structured shape —
@@ -414,6 +420,16 @@ export declare const PROBE_CAUSE_PATH_MAX = 200;
414
420
  * (tools/fs) and must fit every load-bearing part inside this bound, the gate, the persist boundary — and
415
421
  * a value import from tools/fs into checkpoint-store closes an ESM cycle. */
416
422
  export declare const PROBE_REASON_MAX = 200;
423
+ /**
424
+ * Whether `text` is a probe's one-sentence account the engine itself could have minted: every mint passes the sentence through
425
+ * {@link inlineUntrusted} at {@link PROBE_REASON_MAX}, so the longest one is the cap's content plus the truncation ellipsis
426
+ * ({@link INLINE_TRUNCATION_MARK_CODEPOINTS}), counted in code points. A host that relays the sentence (`RiskDescriptor.probeReason`,
427
+ * `AskRequest.probeReason`) and meets a longer one has met text the engine did not mint (a third-party producer, a generation
428
+ * with another cap) — to be dropped whole, not cut, because a cut is another sentence. The bound lives here once; a host asks, it does not count.
429
+ * The question is total: a value that is not a string is not a sentence the engine mints (every mint is a string), so it answers
430
+ * `false` — the relay's answer to it, dropping it whole, is the same as to an over-long one.
431
+ */
432
+ export declare function isMintableProbeReason(text: unknown): boolean;
417
433
  /** The one body bound every "reviewer note" relay passes to {@link delimitUntrusted} — the decider's
418
434
  * free text attached to a deny (sync `AskOutcome.reason` and the durable `ResumeOutcome` `reason`
419
435
  * legs alike). A note is steering, not payload: unbounded it can flood the transcript/context the
@@ -568,18 +568,23 @@ const LABEL_MAX = 160;
568
568
  export function inlineUntrusted(text, maxLen = LABEL_MAX) {
569
569
  const oneLine = text.replace(/[\s\u0000-\u001f\u007f-\u009f]+/g, " ").trim();
570
570
  const cps = [...oneLine];
571
- const capped = cps.length > maxLen ? cps.slice(0, maxLen).join("") + "…" : oneLine;
571
+ const capped = cps.length > maxLen ? cps.slice(0, maxLen).join("") + INLINE_TRUNCATION_MARK : oneLine;
572
572
  const out = neutralizeForFence(capped);
573
573
  if (maxLen <= 0)
574
574
  return "";
575
575
  const outCps = [...out];
576
- return outCps.length > maxLen + 1 ? outCps.slice(0, maxLen).join("") + "…" : out;
576
+ return outCps.length > maxLen + INLINE_TRUNCATION_MARK_CODEPOINTS ? outCps.slice(0, maxLen).join("") + INLINE_TRUNCATION_MARK : out;
577
577
  }
578
+ export const INLINE_TRUNCATION_MARK = "…";
579
+ export const INLINE_TRUNCATION_MARK_CODEPOINTS = [...INLINE_TRUNCATION_MARK].length;
578
580
  function sanitizeLabel(label) {
579
581
  return inlineUntrusted(label, LABEL_MAX);
580
582
  }
581
583
  export const PROBE_CAUSE_PATH_MAX = 200;
582
584
  export const PROBE_REASON_MAX = 200;
585
+ export function isMintableProbeReason(text) {
586
+ return typeof text === "string" && [...text].length <= PROBE_REASON_MAX + INLINE_TRUNCATION_MARK_CODEPOINTS;
587
+ }
583
588
  export const REVIEWER_NOTE_MAX_BODY = 2048;
584
589
  export function delimitUntrusted(label, text, maxBody) {
585
590
  return delimitUntrustedWithClip(label, text, maxBody).text;
@@ -27,6 +27,7 @@ import type { HumanInputAttachment } from "./task-event.js";
27
27
  import { type ModelFileReader } from "../tools/fs/fs-read.js";
28
28
  import type { SyntheticReadJudge } from "./synthetic-read-verdict.js";
29
29
  import { type ReminderDisclosureCounts } from "./reminder-disclosure.js";
30
+ import type { ContextWindowOverlay } from "./context-settings.js";
30
31
  /** At most this many attachments on one objective. */
31
32
  export declare const USER_ATTACHMENTS_MAX = 20;
32
33
  /** The longest path or name an entry may carry (the platform path limit). */
@@ -72,9 +73,20 @@ export type ScreenedUserAttachment = {
72
73
  readonly data: string;
73
74
  readonly mimeType: string;
74
75
  };
75
- /** The door's refusal: one code, the field named first. */
76
- export declare function userAttachmentRefusal(field: string, detail: string): Error & {
76
+ /**
77
+ * The field a refusal names, as one value: `path` is the field path the sentence opens with, and `index` the attachment's
78
+ * position in the seat (0-based, the `[i]` of that path) — present exactly when the sentence names one attachment; a refusal of
79
+ * the seat as a whole (not a list, too many, a resume, the window) has no index. Built only by {@link SEAT_REF} /
80
+ * {@link entryRef} / {@link memberRef}, so the index and the path can never name two attachments.
81
+ */
82
+ export interface UserAttachmentFieldRef {
83
+ readonly path: string;
84
+ readonly index?: number;
85
+ }
86
+ /** The door's refusal: one code, the field named first in the sentence and again in `detail` ({@link UserAttachmentFieldRef}). */
87
+ export declare function userAttachmentRefusal(at: UserAttachmentFieldRef, problem: string): Error & {
77
88
  code: "config.user_attachment_invalid";
89
+ detail: UserAttachmentFieldRef;
78
90
  };
79
91
  /**
80
92
  * The door: screen the seat's value (synchronous; the caller's object is read once, member by member, before the
@@ -133,9 +145,18 @@ export interface ReadUserAttachmentsInput {
133
145
  * frame carries the commit its delivery owes, run only when the frame is in the transcript.
134
146
  */
135
147
  export declare function readUserAttachments(input: ReadUserAttachmentsInput): Promise<MintedAttachmentFrame[]>;
148
+ /** The objective as the window check sees it: a reader of the live overlay over the model's window declarations (the
149
+ * same seat the request guard reads) and the objective text's length — it rides the first request ahead of the
150
+ * frames. The overlay is a GETTER because it is read when the frames exist, not when the call is made: the reads are
151
+ * asynchronous and a deployment may swap its window declarations meanwhile, as it may before any request. */
152
+ export interface AttachmentWindowInput {
153
+ readonly overlay: () => ContextWindowOverlay | undefined;
154
+ readonly objectiveChars: number;
155
+ }
136
156
  /** The objective lane's read: once the UserPromptSubmit hook let the objective through (a blocked objective reads
137
- * nothing), and before the pre-call gate, which prices the frames (`chars`). Commits nothing. */
138
- export declare function readObjectiveAttachments(prepared: Pick<import("./runner/contracts.js").Prepared, "userAttachments" | "modelFileReader" | "syntheticReadVerdict" | "cwdRef" | "reminderMark" | "reminderDisclosureCounts" | "abortController">, inputId: string, blocked: boolean): Promise<{
157
+ * nothing), and before the pre-call gate, which prices the frames (`chars`). Refuses the whole objective when the frames
158
+ * and the objective cannot ride one request ({@link refuseFramesOverWindow}). Commits nothing. */
159
+ export declare function readObjectiveAttachments(prepared: Pick<import("./runner/contracts.js").Prepared, "userAttachments" | "modelFileReader" | "syntheticReadVerdict" | "cwdRef" | "reminderMark" | "reminderDisclosureCounts" | "abortController" | "harness">, inputId: string, blocked: boolean, window: AttachmentWindowInput): Promise<{
139
160
  frames: MintedAttachmentFrame[];
140
161
  chars: number;
141
162
  }>;