@sema-agent/core 7.55.0 → 7.57.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 (502) hide show
  1. package/CHANGELOG.md +1054 -0
  2. package/LICENSE +1 -1
  3. package/dist/agents/cascade.js +1 -1
  4. package/dist/agents/cc-peer-directory.js +1 -0
  5. package/dist/agents/child-model-seat.d.ts +0 -11
  6. package/dist/agents/child-model-seat.js +0 -3
  7. package/dist/agents/list-agents-tool.d.ts +3 -1
  8. package/dist/agents/list-agents-tool.js +7 -7
  9. package/dist/agents/org-delivery-gate.js +3 -4
  10. package/dist/agents/peer-directory.d.ts +22 -4
  11. package/dist/agents/peer-directory.js +24 -2
  12. package/dist/agents/peer-held-queue.d.ts +69 -49
  13. package/dist/agents/peer-held-queue.js +255 -106
  14. package/dist/agents/peer-session-drain.js +65 -45
  15. package/dist/agents/repair-loop.js +2 -2
  16. package/dist/agents/send-message-tool.js +7 -6
  17. package/dist/agents/subagent.d.ts +6 -4
  18. package/dist/agents/subagent.js +72 -68
  19. package/dist/agents/tool-filter.d.ts +7 -5
  20. package/dist/agents/tool-filter.js +12 -9
  21. package/dist/agents/verify.d.ts +3 -2
  22. package/dist/agents/verify.js +3 -3
  23. package/dist/brain/anthropic.js +45 -80
  24. package/dist/brain/media-degrade.d.ts +18 -7
  25. package/dist/brain/media-degrade.js +13 -2
  26. package/dist/brain/model-capability.d.ts +37 -0
  27. package/dist/brain/model-capability.js +34 -0
  28. package/dist/brain/model-presets.d.ts +2 -8
  29. package/dist/brain/model-presets.js +1 -6
  30. package/dist/brain/open-responses.js +23 -34
  31. package/dist/brain/openai.js +25 -96
  32. package/dist/brain/provider-dialect.d.ts +3 -2
  33. package/dist/brain/provider-dialect.js +2 -2
  34. package/dist/brain/reasoning-request.d.ts +96 -0
  35. package/dist/brain/reasoning-request.js +174 -0
  36. package/dist/brain/reasoning.d.ts +11 -11
  37. package/dist/brain/reasoning.js +4 -3
  38. package/dist/brain/request-params.d.ts +13 -4
  39. package/dist/brain/request-params.js +21 -5
  40. package/dist/brain/status-sink.d.ts +20 -0
  41. package/dist/brain/status-sink.js +7 -0
  42. package/dist/brain/stream-engine.d.ts +9 -0
  43. package/dist/brain/stream-engine.js +24 -10
  44. package/dist/brain/stream-shared.d.ts +5 -4
  45. package/dist/brain/stream-shared.js +4 -4
  46. package/dist/core/a2a.d.ts +2 -1
  47. package/dist/core/a2a.js +19 -13
  48. package/dist/core/agent-definition.d.ts +10 -0
  49. package/dist/core/allow-entry.d.ts +23 -23
  50. package/dist/core/allow-entry.js +42 -46
  51. package/dist/core/allow-rule-shadow.d.ts +3 -3
  52. package/dist/core/approval-object.d.ts +21 -5
  53. package/dist/core/approval-object.js +44 -17
  54. package/dist/core/ask-origin.d.ts +66 -20
  55. package/dist/core/ask-origin.js +63 -23
  56. package/dist/core/ask-question.d.ts +51 -8
  57. package/dist/core/ask-question.js +3 -4
  58. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  59. package/dist/core/ask-unresolvable-notice.js +16 -2
  60. package/dist/core/auto-compaction.d.ts +71 -6
  61. package/dist/core/auto-compaction.js +42 -26
  62. package/dist/core/background-agent-store.d.ts +6 -2
  63. package/dist/core/background-agent-store.js +1 -1
  64. package/dist/core/checkpoint-generation.d.ts +53 -0
  65. package/dist/core/checkpoint-generation.js +35 -0
  66. package/dist/core/checkpoint-queries.d.ts +180 -0
  67. package/dist/core/checkpoint-queries.js +272 -0
  68. package/dist/core/checkpoint-requirements.d.ts +19 -1
  69. package/dist/core/checkpoint-requirements.js +6 -0
  70. package/dist/core/checkpoint-store.d.ts +105 -53
  71. package/dist/core/checkpoint-store.js +43 -20
  72. package/dist/core/cross-boundary-taint.d.ts +6 -5
  73. package/dist/core/cross-boundary-taint.js +5 -5
  74. package/dist/core/decision-receipt.d.ts +37 -3
  75. package/dist/core/decision-receipt.js +17 -17
  76. package/dist/core/delegation-not-started.d.ts +6 -0
  77. package/dist/core/delegation-not-started.js +17 -0
  78. package/dist/core/engine-attestation.d.ts +93 -0
  79. package/dist/core/engine-attestation.js +70 -0
  80. package/dist/core/engine-capabilities.d.ts +4 -1
  81. package/dist/core/engine-capabilities.js +1 -1
  82. package/dist/core/engine-notice.d.ts +32 -12
  83. package/dist/core/engine-notice.js +6 -0
  84. package/dist/core/file-history-store.d.ts +104 -22
  85. package/dist/core/file-history-store.js +37 -19
  86. package/dist/core/gate-fold.d.ts +1 -1
  87. package/dist/core/gate-fold.js +22 -10
  88. package/dist/core/gate-lanes.js +73 -65
  89. package/dist/core/gate-outcome.d.ts +26 -5
  90. package/dist/core/gate-outcome.js +26 -0
  91. package/dist/core/governance-codes.d.ts +5 -1
  92. package/dist/core/governance-codes.js +6 -0
  93. package/dist/core/hooks.d.ts +19 -18
  94. package/dist/core/hooks.js +3 -1
  95. package/dist/core/host-floor.d.ts +128 -0
  96. package/dist/core/host-floor.js +206 -0
  97. package/dist/core/host-target.d.ts +38 -3
  98. package/dist/core/host-target.js +38 -5
  99. package/dist/core/mailbox-store.d.ts +62 -1
  100. package/dist/core/mailbox-store.js +59 -0
  101. package/dist/core/mcp-name-judge.d.ts +46 -0
  102. package/dist/core/mcp-name-judge.js +61 -0
  103. package/dist/core/mcp-probe.d.ts +1 -1
  104. package/dist/core/mcp-probe.js +2 -5
  105. package/dist/core/mcp.d.ts +5 -1
  106. package/dist/core/mcp.js +70 -64
  107. package/dist/core/memory-engine/consolidation-driver.js +4 -3
  108. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  109. package/dist/core/memory-engine/distiller.js +26 -17
  110. package/dist/core/memory-engine/engine.js +4 -4
  111. package/dist/core/memory-engine/layout.d.ts +60 -8
  112. package/dist/core/memory-engine/layout.js +70 -8
  113. package/dist/core/model-seat.d.ts +10 -3
  114. package/dist/core/mods/classic-events.d.ts +67 -0
  115. package/dist/core/mods/classic-events.js +1 -0
  116. package/dist/core/mods/dollar.d.ts +13 -0
  117. package/dist/core/mods/extension-call.d.ts +31 -0
  118. package/dist/core/mods/extension-call.js +43 -0
  119. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  120. package/dist/core/mods/kernel/dispatch.js +140 -69
  121. package/dist/core/mods/kernel/events.d.ts +47 -11
  122. package/dist/core/mods/kernel/events.js +66 -42
  123. package/dist/core/mods/kernel/index.d.ts +4 -4
  124. package/dist/core/mods/kernel/index.js +2 -2
  125. package/dist/core/mods/kernel/receive.d.ts +39 -5
  126. package/dist/core/mods/kernel/receive.js +290 -17
  127. package/dist/core/mods/kernel/registration.d.ts +33 -2
  128. package/dist/core/mods/kernel/registration.js +6 -7
  129. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  130. package/dist/core/mods/kernel/site-rules.js +24 -42
  131. package/dist/core/mods/spec-seats.d.ts +69 -0
  132. package/dist/core/mods/spec-seats.js +114 -0
  133. package/dist/core/mods/stations.d.ts +28 -8
  134. package/dist/core/mods/stations.js +29 -13
  135. package/dist/core/mods/tool-call.d.ts +79 -0
  136. package/dist/core/mods/tool-call.js +152 -0
  137. package/dist/core/namespaced-rule-name.d.ts +32 -38
  138. package/dist/core/namespaced-rule-name.js +29 -36
  139. package/dist/core/parent-spec-seat.d.ts +6 -1
  140. package/dist/core/parent-spec-seat.js +2 -0
  141. package/dist/core/park-selfcheck.js +3 -0
  142. package/dist/core/permission-rule-consent.d.ts +24 -3
  143. package/dist/core/permission-rule-consent.js +136 -41
  144. package/dist/core/permission-rule-model.d.ts +57 -5
  145. package/dist/core/permission-rule-model.js +90 -31
  146. package/dist/core/permission-rule-org.d.ts +6 -2
  147. package/dist/core/permission-rule-org.js +8 -4
  148. package/dist/core/permission-rule-provider.d.ts +5 -2
  149. package/dist/core/permission-rule-provider.js +41 -11
  150. package/dist/core/permission-rule-store.d.ts +3 -2
  151. package/dist/core/permission-rule-store.js +11 -2
  152. package/dist/core/permission-rule-sync.js +3 -2
  153. package/dist/core/permission-rule-syntax.d.ts +5 -4
  154. package/dist/core/permission-rule-syntax.js +2 -2
  155. package/dist/core/permission-rules.d.ts +4 -4
  156. package/dist/core/permission-rules.js +11 -20
  157. package/dist/core/persisted-rule-arms.d.ts +2 -2
  158. package/dist/core/persisted-rule-arms.js +10 -12
  159. package/dist/core/principal-name.d.ts +20 -0
  160. package/dist/core/principal-name.js +22 -0
  161. package/dist/core/prompt-section-seat.js +4 -6
  162. package/dist/core/protocol-http-auth.d.ts +40 -5
  163. package/dist/core/protocol-http-auth.js +168 -4
  164. package/dist/core/protocol-naming.d.ts +20 -0
  165. package/dist/core/protocol-naming.js +20 -3
  166. package/dist/core/read-only-shell.d.ts +20 -5
  167. package/dist/core/read-only-shell.js +29 -14
  168. package/dist/core/remote-env.d.ts +37 -1
  169. package/dist/core/remote-env.js +11 -0
  170. package/dist/core/resume-startup-cause.d.ts +24 -2
  171. package/dist/core/resume-startup-cause.js +20 -1
  172. package/dist/core/retired-keys.d.ts +16 -0
  173. package/dist/core/retired-keys.js +16 -4
  174. package/dist/core/rewrite-rejudge.d.ts +60 -0
  175. package/dist/core/rewrite-rejudge.js +36 -0
  176. package/dist/core/roles.d.ts +28 -1
  177. package/dist/core/roles.js +81 -26
  178. package/dist/core/rule-lane-reads.d.ts +20 -15
  179. package/dist/core/rule-lane-reads.js +45 -17
  180. package/dist/core/rule-owner.d.ts +3 -3
  181. package/dist/core/rule-owner.js +3 -2
  182. package/dist/core/runner/announce-once-ledger.d.ts +14 -0
  183. package/dist/core/runner/announce-once-ledger.js +5 -0
  184. package/dist/core/runner/assemble-result.d.ts +1 -0
  185. package/dist/core/runner/assemble-result.js +1 -1
  186. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  187. package/dist/core/runner/caller-roster.d.ts +16 -4
  188. package/dist/core/runner/caller-roster.js +33 -6
  189. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  190. package/dist/core/runner/capability-withheld-seat.js +24 -0
  191. package/dist/core/runner/classifier-ladder.d.ts +7 -9
  192. package/dist/core/runner/classifier-ladder.js +3 -3
  193. package/dist/core/runner/compact-session.d.ts +10 -0
  194. package/dist/core/runner/compact-session.js +202 -0
  195. package/dist/core/runner/compaction-call-options.d.ts +2 -2
  196. package/dist/core/runner/compaction-seams.d.ts +21 -1
  197. package/dist/core/runner/compaction-seams.js +11 -8
  198. package/dist/core/runner/construction-doors.js +3 -0
  199. package/dist/core/runner/contracts.d.ts +50 -40
  200. package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
  201. package/dist/core/runner/cross-boundary-lane.js +40 -27
  202. package/dist/core/runner/denial-limit-arms.d.ts +2 -2
  203. package/dist/core/runner/denial-limit-arms.js +1 -1
  204. package/dist/core/runner/derived-route-fallback.d.ts +13 -0
  205. package/dist/core/runner/derived-route-fallback.js +6 -0
  206. package/dist/core/runner/env-capability-census.d.ts +3 -2
  207. package/dist/core/runner/env-capability-census.js +9 -3
  208. package/dist/core/runner/file-history-request.d.ts +18 -0
  209. package/dist/core/runner/file-history-request.js +21 -13
  210. package/dist/core/runner/file-history-restore.d.ts +45 -0
  211. package/dist/core/runner/file-history-restore.js +46 -0
  212. package/dist/core/runner/gate-exit.d.ts +3 -3
  213. package/dist/core/runner/gate-exit.js +4 -3
  214. package/dist/core/runner/image.d.ts +7 -17
  215. package/dist/core/runner/image.js +9 -60
  216. package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
  217. package/dist/core/runner/permission-rule-lanes.js +39 -17
  218. package/dist/core/runner/person-path-rows.d.ts +12 -9
  219. package/dist/core/runner/person-path-rows.js +18 -7
  220. package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
  221. package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
  222. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  223. package/dist/core/runner/prepare-ask-lane.js +5 -2
  224. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  225. package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
  226. package/dist/core/runner/prepare-config-doors.d.ts +35 -38
  227. package/dist/core/runner/prepare-config-doors.js +46 -28
  228. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  229. package/dist/core/runner/prepare-defer-classify.js +7 -8
  230. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  231. package/dist/core/runner/prepare-file-history.js +7 -39
  232. package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
  233. package/dist/core/runner/prepare-gate-stations.js +10 -1
  234. package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
  235. package/dist/core/runner/prepare-hands-readface.js +17 -14
  236. package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
  237. package/dist/core/runner/prepare-inherited-gate.js +5 -3
  238. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  239. package/dist/core/runner/prepare-park-ask.d.ts +2 -0
  240. package/dist/core/runner/prepare-park-ask.js +7 -7
  241. package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
  242. package/dist/core/runner/prepare-policy-chain.js +67 -76
  243. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  244. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  245. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  246. package/dist/core/runner/prepare-prompt-inputs.js +3 -5
  247. package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
  248. package/dist/core/runner/prepare-protocol-tools.js +3 -3
  249. package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
  250. package/dist/core/runner/prepare-safety-scan.js +0 -17
  251. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  252. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  253. package/dist/core/runner/prepare-task.d.ts +5 -2
  254. package/dist/core/runner/prepare-task.js +48 -43
  255. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
  256. package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
  257. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  258. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  259. package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
  260. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  261. package/dist/core/runner/resume-admission.js +1 -1
  262. package/dist/core/runner/resume-apply.js +11 -12
  263. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  264. package/dist/core/runner/resume-claim.d.ts +4 -2
  265. package/dist/core/runner/resume-claim.js +15 -8
  266. package/dist/core/runner/retired-runner-deps.js +1 -0
  267. package/dist/core/runner/rewind-files.d.ts +12 -0
  268. package/dist/core/runner/rewind-files.js +90 -0
  269. package/dist/core/runner/run-attachment-seats.js +2 -1
  270. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  271. package/dist/core/runner/run-brain-sinks.js +4 -2
  272. package/dist/core/runner/run-harness-handlers.js +12 -4
  273. package/dist/core/runner/run-leg.d.ts +1 -1
  274. package/dist/core/runner/run-leg.js +40 -39
  275. package/dist/core/runner/run-notification-lane.d.ts +2 -0
  276. package/dist/core/runner/run-notification-lane.js +2 -2
  277. package/dist/core/runner/run-recovery-lanes.js +3 -4
  278. package/dist/core/runner/run-settle-and-teardown.js +7 -12
  279. package/dist/core/runner/run-terminal-adoption.js +3 -4
  280. package/dist/core/runner/run-turn-boundary.js +4 -15
  281. package/dist/core/runner/runtask.d.ts +10 -0
  282. package/dist/core/runner/runtask.js +35 -42
  283. package/dist/core/runner/send-message-continuation.js +1 -1
  284. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  285. package/dist/core/runner/session-read-file-states.js +28 -0
  286. package/dist/core/runner/session-rule-policy.js +4 -3
  287. package/dist/core/runner/session-verb-doors.d.ts +28 -0
  288. package/dist/core/runner/session-verb-doors.js +48 -0
  289. package/dist/core/runner/session-write-ledger.d.ts +30 -0
  290. package/dist/core/runner/session-write-ledger.js +101 -0
  291. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  292. package/dist/core/runner/shell-env-withheld.js +51 -0
  293. package/dist/core/runner/skills-seat.js +6 -2
  294. package/dist/core/runner/stream-settle-backstop.js +12 -15
  295. package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
  296. package/dist/core/runner/sub-agent-deny-lists.js +25 -17
  297. package/dist/core/runner/synthetic-tools.d.ts +6 -0
  298. package/dist/core/runner/synthetic-tools.js +4 -1
  299. package/dist/core/runner/teardown-bounded.d.ts +1 -0
  300. package/dist/core/runner/teardown-bounded.js +1 -0
  301. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  302. package/dist/core/runner/tool-disclosure.js +1 -3
  303. package/dist/core/runner/tool-end-body.d.ts +1 -1
  304. package/dist/core/runner/tool-end-body.js +10 -9
  305. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  306. package/dist/core/runner/tool-not-executed.js +11 -0
  307. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  308. package/dist/core/runner/tool-occurrence.js +7 -0
  309. package/dist/core/runner/turn-attachments.d.ts +33 -15
  310. package/dist/core/runner/turn-attachments.js +62 -37
  311. package/dist/core/runner-deps.d.ts +7 -7
  312. package/dist/core/safety-axis-vocab.d.ts +6 -4
  313. package/dist/core/safety-axis-vocab.js +6 -5
  314. package/dist/core/safety-merge-corpus.js +11 -3
  315. package/dist/core/secret-env.d.ts +30 -3
  316. package/dist/core/secret-env.js +47 -8
  317. package/dist/core/select-model.js +3 -3
  318. package/dist/core/session-policy-store.d.ts +32 -15
  319. package/dist/core/session-policy-store.js +156 -36
  320. package/dist/core/session-store.d.ts +29 -10
  321. package/dist/core/session-store.js +51 -19
  322. package/dist/core/session.d.ts +82 -16
  323. package/dist/core/session.js +53 -0
  324. package/dist/core/shell-read-silence.d.ts +11 -12
  325. package/dist/core/shell-read-silence.js +9 -5
  326. package/dist/core/shell-run-candidates.js +3 -1
  327. package/dist/core/shell-wrapper-projection.d.ts +1 -1
  328. package/dist/core/shell-wrapper-projection.js +1 -1
  329. package/dist/core/shell-wrapper-table.d.ts +14 -7
  330. package/dist/core/shell-wrapper-table.js +5 -4
  331. package/dist/core/side-query.js +10 -1
  332. package/dist/core/skill-grant.d.ts +7 -2
  333. package/dist/core/skill-grant.js +5 -0
  334. package/dist/core/skills-directory.js +6 -2
  335. package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
  336. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  337. package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
  338. package/dist/core/store-contracts/file-history-store-contract.js +40 -1
  339. package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
  340. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  341. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  342. package/dist/core/store-contracts/session-repo-contract.js +51 -0
  343. package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
  344. package/dist/core/store-contracts/session-store-contract.js +150 -14
  345. package/dist/core/stub-env.d.ts +2 -0
  346. package/dist/core/stub-env.js +1 -0
  347. package/dist/core/synthetic-read-verdict.js +3 -3
  348. package/dist/core/task-event.d.ts +32 -4
  349. package/dist/core/task-notification.d.ts +16 -12
  350. package/dist/core/task-registry-agent.d.ts +8 -4
  351. package/dist/core/task-registry-agent.js +14 -8
  352. package/dist/core/task-registry-shared.d.ts +35 -6
  353. package/dist/core/task-registry-shared.js +11 -0
  354. package/dist/core/task-registry.d.ts +10 -1
  355. package/dist/core/task-registry.js +12 -2
  356. package/dist/core/task-result.d.ts +18 -0
  357. package/dist/core/task-spec.d.ts +18 -13
  358. package/dist/core/tighten-task-spec.js +2 -1
  359. package/dist/core/tool-catalog-entries.d.ts +23 -0
  360. package/dist/core/tool-catalog-entries.js +14 -2
  361. package/dist/core/tool-check-reading.d.ts +11 -0
  362. package/dist/core/tool-check-reading.js +11 -6
  363. package/dist/core/tool-model-gate.d.ts +2 -2
  364. package/dist/core/tool-name-aliases.d.ts +48 -18
  365. package/dist/core/tool-name-aliases.js +36 -19
  366. package/dist/core/tool-name-readings.d.ts +6 -32
  367. package/dist/core/tool-name-readings.js +2 -9
  368. package/dist/core/tool-policy.d.ts +78 -204
  369. package/dist/core/tool-policy.js +152 -204
  370. package/dist/core/tool-result-store.js +3 -0
  371. package/dist/core/tool-roster.d.ts +14 -19
  372. package/dist/core/tool-roster.js +11 -44
  373. package/dist/core/tool-spec-members.js +7 -2
  374. package/dist/core/tool-spec.d.ts +19 -11
  375. package/dist/core/tools.js +49 -9
  376. package/dist/core/trace.d.ts +6 -3
  377. package/dist/core/trace.js +2 -1
  378. package/dist/core/types.d.ts +1 -1
  379. package/dist/core/untrusted-egress.d.ts +20 -0
  380. package/dist/core/untrusted-egress.js +77 -3
  381. package/dist/core/user-attachment.d.ts +8 -1
  382. package/dist/core/user-attachment.js +64 -4
  383. package/dist/core/wiring-manifest.d.ts +9 -0
  384. package/dist/core/wiring-manifest.js +1 -0
  385. package/dist/core/workflow-journal-store.js +1 -1
  386. package/dist/engine/compaction/compaction.js +3 -2
  387. package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
  388. package/dist/engine/execution-env/node-execution-env.js +11 -2
  389. package/dist/engine/harness/agent-harness.d.ts +32 -6
  390. package/dist/engine/harness/agent-harness.js +65 -9
  391. package/dist/engine/harness/types.d.ts +29 -2
  392. package/dist/engine/llm/types.d.ts +28 -11
  393. package/dist/engine/loop/agent-loop.d.ts +23 -4
  394. package/dist/engine/loop/agent-loop.js +42 -30
  395. package/dist/engine/loop/types.d.ts +16 -6
  396. package/dist/engine/session/memory-repo.d.ts +9 -2
  397. package/dist/engine/session/memory-repo.js +11 -1
  398. package/dist/engine/session/repo-utils.d.ts +6 -5
  399. package/dist/engine/session/repo-utils.js +14 -6
  400. package/dist/index.d.ts +34 -17
  401. package/dist/index.js +22 -11
  402. package/dist/internal/harness-types.d.ts +1 -1
  403. package/dist/internal/harness.d.ts +2 -1
  404. package/dist/internal/harness.js +1 -0
  405. package/dist/internal/llm.d.ts +1 -1
  406. package/dist/orchestration/run-workflow-tool.d.ts +6 -4
  407. package/dist/orchestration/run-workflow-tool.js +5 -3
  408. package/dist/orchestration/workflow.d.ts +3 -0
  409. package/dist/orchestration/workflow.js +36 -18
  410. package/dist/primitives/credential-ref.d.ts +89 -0
  411. package/dist/primitives/credential-ref.js +125 -0
  412. package/dist/primitives/index.d.ts +2 -0
  413. package/dist/primitives/index.js +1 -0
  414. package/dist/prompt-assembly/artifact.d.ts +2 -2
  415. package/dist/prompt-assembly/artifact.js +5 -3
  416. package/dist/prompt-assembly/assemble.d.ts +3 -2
  417. package/dist/prompt-assembly/assemble.js +1 -1
  418. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  419. package/dist/prompt-assembly/catalog/schema.js +34 -2
  420. package/dist/prompt-assembly/catalog/sections.js +0 -1
  421. package/dist/prompt-assembly/composer.d.ts +3 -1
  422. package/dist/prompt-assembly/composer.js +1 -1
  423. package/dist/prompt-assembly/event-registry.js +1 -0
  424. package/dist/prompt-assembly/overlay.js +3 -3
  425. package/dist/prompt-assembly/renderers.d.ts +1 -1
  426. package/dist/prompt-assembly/renderers.js +0 -3
  427. package/dist/prompt-assembly/role-base.d.ts +15 -0
  428. package/dist/prompt-assembly/role-base.js +9 -0
  429. package/dist/prompt-assembly/select.d.ts +39 -14
  430. package/dist/prompt-assembly/select.js +47 -16
  431. package/dist/prompt-assembly/sugar.d.ts +17 -11
  432. package/dist/prompt-assembly/sugar.js +8 -3
  433. package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
  434. package/dist/prompt-assembly/tool-catalog.js +114 -4
  435. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  436. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  437. package/dist/prompt-assembly/types.d.ts +0 -7
  438. package/dist/scenarios/full-body.d.ts +11 -11
  439. package/dist/scenarios/full-body.js +4 -3
  440. package/dist/shell/lex.js +10 -1
  441. package/dist/stores/file/adoption/adopt.js +4 -3
  442. package/dist/stores/file/adoption/marker.js +3 -2
  443. package/dist/stores/file/checkpoint-store.d.ts +21 -4
  444. package/dist/stores/file/checkpoint-store.js +38 -7
  445. package/dist/stores/file/file-history-store.js +18 -11
  446. package/dist/stores/file/index.js +2 -1
  447. package/dist/stores/file/mailbox-store.d.ts +2 -1
  448. package/dist/stores/file/mailbox-store.js +26 -1
  449. package/dist/stores/file/permission-rule-adopt.js +4 -3
  450. package/dist/stores/file/permission-rule-store.js +11 -5
  451. package/dist/stores/file/session-store.d.ts +29 -6
  452. package/dist/stores/file/session-store.js +42 -50
  453. package/dist/tools/artifact/artifact-tool.js +3 -2
  454. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  455. package/dist/tools/fs/bash-program-position.js +56 -9
  456. package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
  457. package/dist/tools/fs/bash-readonly-classifier.js +5 -10
  458. package/dist/tools/fs/fs-bash.js +15 -8
  459. package/dist/tools/fs/fs-glob.d.ts +86 -0
  460. package/dist/tools/fs/fs-glob.js +226 -0
  461. package/dist/tools/fs/fs-read.js +14 -14
  462. package/dist/tools/fs/fs-search-tools.js +7 -7
  463. package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
  464. package/dist/tools/fs/pattern-kill-guard.js +429 -0
  465. package/dist/tools/fs/pdf.d.ts +9 -6
  466. package/dist/tools/fs/pdf.js +3 -3
  467. package/dist/tools/fs/program-read-model.d.ts +57 -7
  468. package/dist/tools/fs/program-read-model.js +11 -1
  469. package/dist/tools/fs/program-read-model.rows.js +78 -21
  470. package/dist/tools/fs/read-deny-home.js +3 -2
  471. package/dist/tools/fs/removal-targets.d.ts +17 -7
  472. package/dist/tools/fs/removal-targets.js +47 -20
  473. package/dist/tools/fs/search.d.ts +10 -0
  474. package/dist/tools/fs/search.js +20 -26
  475. package/dist/tools/fs/shell-read-argv.js +89 -12
  476. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  477. package/dist/tools/fs/shell-read-bindings.js +41 -0
  478. package/dist/tools/fs/shell-read-check.d.ts +10 -0
  479. package/dist/tools/fs/shell-read-check.js +13 -20
  480. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  481. package/dist/tools/fs/shell-read-environment.js +3 -2
  482. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  483. package/dist/tools/fs/shell-read-establish.js +19 -20
  484. package/dist/tools/fs/shell-read-identity.d.ts +12 -9
  485. package/dist/tools/fs/shell-read-identity.js +9 -4
  486. package/dist/tools/fs/shell-read-plan.js +24 -16
  487. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  488. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  489. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  490. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  491. package/dist/tools/fs/shell-reentry-text.js +40 -2
  492. package/dist/tools/todo.js +63 -63
  493. package/dist/tools/web.d.ts +19 -14
  494. package/dist/tools/web.js +46 -61
  495. package/package.json +1 -1
  496. package/test/export-surface.snapshot.json +221 -7
  497. package/wire-changes/core-stores-sql@7.57.0.json +29 -0
  498. package/wire-changes/core@7.56.0.json +3891 -0
  499. package/wire-changes/core@7.57.0.json +1487 -0
  500. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  501. package/wire-changes/mods-kernel@7.57.0.json +29 -0
  502. package/wire-changes/primitives@7.57.0.json +245 -0
@@ -12,7 +12,8 @@
12
12
  * (string and symbol keys — what the mount's spread carries) plus every ToolSpec member name read through an ordinary
13
13
  * property read (how the phases read a declaration — non-enumerable, inherited or Proxy-answered included), each read once;
14
14
  * every declaration value is deep-copied and frozen by the one copier. A primitive is immutable and stays as read. A
15
- * read that throws refuses the run at the snapshot. Whether the ToolSpec arm can build the entry ({@link specArmCanConstruct})
15
+ * read that throws refuses the run at the snapshot, and so does an entry that carries a retired ToolSpec member under any
16
+ * reading of the key ({@link refuseRetiredMember}: the entry is asked once, before any face is minted). Whether the ToolSpec arm can build the entry ({@link specArmCanConstruct})
16
17
  * is asked of the entry once, there, and recorded on its face ({@link specArmCanBuild}); the mount refuses an entry it
17
18
  * cannot build from that record, so an `execute` that grows on the caller's object later is never read. The mount calls a
18
19
  * spec face's `execute` with the caller's own object as `this` ({@link callerEntryOrigin}). A `defineTool` product's face is
@@ -57,16 +58,27 @@ export declare function callerEntryOrigin(entry: object): object;
57
58
  /** Can the mount's ToolSpec arm build this roster entry? Only the verdict recorded at the snapshot answers: an object that
58
59
  * is no face of this snapshot, a primitive, a product's face, is not built from. */
59
60
  export declare function specArmCanBuild(entry: RosterFace): boolean;
60
- /** A `TaskSpec.tools` spec declaring an engine contract (a `core.` id) its catalog did not mint for it — the id written by hand — refused where the
61
- * declaration enters. An engine definition under any declared name carries the minted object; a host can forge the string, never the object. */
61
+ /** A roster entry claiming an engine contract its catalog did not mint for it — the id written by hand, on a spec or on a product — refused where the
62
+ * declaration enters. */
62
63
  export declare function callerEngineContractProblem(face: RosterFace): {
63
64
  code: ToolDeclarationCode;
64
65
  message: string;
65
66
  } | undefined;
67
+ /** The retired-key door for one roster entry, asked of the LIVE entry once, before any member is copied: the key is present
68
+ * iff ordinary property lookup answers a defined value ({@link retiredKeyOf} — an own enumerable member, a non-enumerable
69
+ * one, a prototype's getter, a Proxy's trap alike), and a present one refuses the run by name with the sentence and code
70
+ * the factory gives the same key on a `defineTool` spec (`config.deps_retired_key`). A lookup that throws is an entry whose
71
+ * members cannot be read, refused as such. No face is ever minted from an entry that carries a retired member, so no later
72
+ * phase has a key table of its own to consult for one. Every live object that is about to become a face meets it first:
73
+ * {@link rosterFaceOf} asks it of each entry, and the per-task agents rebuild asks it of the object `withAgents` returned
74
+ * before the stamp copy-back spreads that object (a spread drops a prototype's and a non-enumerable member). A value that
75
+ * is no object holds no member. */
76
+ export declare function refuseRetiredMember(entry: unknown, index: number): void;
66
77
  /** One entry of the roster, and the ONLY place a {@link RosterFace} is minted. Every object entry (a function included) becomes a frozen face, so no entry the snapshot holds is a
67
78
  * live object: a primitive is immutable and stays as read; a `defineTool` product's face names the product for its sealed
68
79
  * rebind; an entry the ToolSpec arm cannot build gets a face too, and the mount refuses it from the verdict recorded here —
69
- * an `execute` or a mark that grows on the caller's object afterwards is never read. A read that throws refuses the run. */
80
+ * an `execute` or a mark that grows on the caller's object afterwards is never read. An entry carrying a retired member is
81
+ * refused first ({@link refuseRetiredMember}). A read that throws refuses the run. */
70
82
  export declare function rosterFaceOf(t: unknown, index: number): RosterFace;
71
83
  /** The mount's arm for a roster entry that is the face of a `defineTool` product: the exact product object is rebound to
72
84
  * the run's ctx through the factory's sealed seat, compared with its face ({@link refuseProductDrift}), and the tool the
@@ -1,7 +1,8 @@
1
1
  import { TOOL_SPEC_MEMBERS, frozenExtra, frozenMember, newCopyState } from "../tool-spec-members.js";
2
+ import { RETIRED_TOOL_SPEC_KEYS, retiredKeyOf, retiredKeyRefusal } from "../retired-keys.js";
2
3
  import { isDefineToolProduct, rebindDefineToolCtx } from "../tools.js";
3
4
  import { isCatalogContract } from "../tool-catalog-entries.js";
4
- import { contractOriginOf } from "../../prompt-assembly/tool-catalog.js";
5
+ import { attachedContractOf, computeShapeDigest, contractOriginOf, isEngineDescriptor } from "../../prompt-assembly/tool-catalog.js";
5
6
  function specArmCanConstruct(t) {
6
7
  if (typeof t !== "object" || t === null)
7
8
  return false;
@@ -19,6 +20,8 @@ function faceKeys(t) {
19
20
  const keys = new Set(Reflect.ownKeys(t).filter((k) => Object.getOwnPropertyDescriptor(t, k)?.enumerable === true));
20
21
  for (const name of TOOL_SPEC_MEMBERS)
21
22
  keys.add(name);
23
+ for (const name of Object.keys(RETIRED_TOOL_SPEC_KEYS))
24
+ keys.delete(name);
22
25
  return [...keys];
23
26
  }
24
27
  const BUILDABLE = new WeakSet();
@@ -45,16 +48,42 @@ function refuseUnreadableEntry(index, entry, cause) {
45
48
  e.code = "config.tool_mount_denied";
46
49
  throw e;
47
50
  }
48
- const CATALOG_CONTRACT_FACES = new WeakSet();
51
+ function unmintedEngineClaim(face) {
52
+ const declared = face.contract?.contractId;
53
+ if (typeof declared === "string" && contractOriginOf(declared) === "core" && !isCatalogContract(face.contract))
54
+ return declared;
55
+ const carried = attachedContractOf(face);
56
+ if (carried === undefined || carried === null || typeof carried !== "object")
57
+ return undefined;
58
+ const id = carried.contractId;
59
+ if (carried.origin !== "core" && !(typeof id === "string" && contractOriginOf(id) === "core"))
60
+ return undefined;
61
+ const describesFace = isEngineDescriptor(carried) && carried.wireName === face.name && carried.shapeDigest === computeShapeDigest(face.parameters);
62
+ return describesFace ? undefined : String(id);
63
+ }
49
64
  export function callerEngineContractProblem(face) {
50
- const id = face.contract?.contractId;
51
- if (typeof id !== "string" || contractOriginOf(id) !== "core" || CATALOG_CONTRACT_FACES.has(face))
65
+ const id = unmintedEngineClaim(face);
66
+ if (id === undefined)
52
67
  return undefined;
53
68
  return { code: "config.tool_face_invalid", message: `tool ${JSON.stringify(String(face.name).slice(0, 40))} declares the engine contract ${JSON.stringify(id.slice(0, 64))}, which no engine definition minted for it — a contract id under \`core.\` belongs to the engine's own definitions; declare an id of your own, or none` };
54
69
  }
70
+ export function refuseRetiredMember(entry, index) {
71
+ if ((typeof entry !== "object" && typeof entry !== "function") || entry === null)
72
+ return;
73
+ let hit;
74
+ try {
75
+ hit = retiredKeyOf(entry, RETIRED_TOOL_SPEC_KEYS);
76
+ }
77
+ catch (cause) {
78
+ return refuseEntry(index, entry, cause);
79
+ }
80
+ if (hit !== undefined)
81
+ throw retiredKeyRefusal(hit, "ToolSpec");
82
+ }
55
83
  export function rosterFaceOf(t, index) {
56
84
  if ((typeof t !== "object" && typeof t !== "function") || t === null)
57
85
  return t;
86
+ refuseRetiredMember(t, index);
58
87
  try {
59
88
  const product = isDefineToolProduct(t) ? t : undefined;
60
89
  const buildable = product === undefined && specArmCanConstruct(t);
@@ -67,8 +96,6 @@ export function rosterFaceOf(t, index) {
67
96
  if (value === undefined && !own)
68
97
  continue;
69
98
  let kept;
70
- if (key === "contract" && isCatalogContract(value))
71
- CATALOG_CONTRACT_FACES.add(face);
72
99
  if (typeof key === "string" && IS_MEMBER.has(key))
73
100
  kept = frozenMember(key, value, ledger);
74
101
  else {
@@ -0,0 +1,5 @@
1
+ import type { Prepared } from "./contracts.js";
2
+ import type { NoticeSeatInput } from "./notice-seat-input.js";
3
+ /** The session's announced record and the leg's receipt ledger (the parked write). */
4
+ export type CapabilityWithheldRecord = Pick<Prepared, "announcedListingsRef" | "frameReceipts">;
5
+ export declare function createCapabilityWithheldScope(ids: NoticeSeatInput, announced: CapabilityWithheldRecord): <T>(fn: () => Promise<T>) => Promise<T>;
@@ -0,0 +1,24 @@
1
+ import { runWithCapabilityWithheld } from "../../brain/status-sink.js";
2
+ import { deliverEngineNotice } from "../engine-notice.js";
3
+ import { announceDigest, withAnnounceDigests } from "./announce-once-ledger.js";
4
+ const CAPABILITY_DOWNGRADED = "model.capability_downgraded";
5
+ export function createCapabilityWithheldScope(ids, announced) {
6
+ const announce = (report) => {
7
+ const digest = announceDigest(CAPABILITY_DOWNGRADED, `${report.modelId}\n${report.capability}`);
8
+ const record = announced.announcedListingsRef;
9
+ if (record.advisories?.includes(digest) === true)
10
+ return;
11
+ const why = report.cause === "declared_off"
12
+ ? `its catalog entry declares no image input (Model.input has no "image")`
13
+ : `its catalog entry does not declare image input, and images are not sent to an entry that does not`;
14
+ deliverEngineNotice(ids.onNotice, {
15
+ code: CAPABILITY_DOWNGRADED,
16
+ message: `Images in this conversation are not being sent to model "${report.modelId}": ${why}, so each image reaches the model as a one-line placeholder. ` +
17
+ `If the model reads images, declare it (input: ["text","image"]); otherwise switch to a model that reads images. Said once per conversation for this model.`,
18
+ detail: { model: report.modelId, capability: report.capability, status: report.cause, sessionId: ids.sessionId, runId: ids.runId },
19
+ });
20
+ record.advisories = withAnnounceDigests(record.advisories, [digest]);
21
+ announced.frameReceipts.listingSnapshotOwed = true;
22
+ };
23
+ return (fn) => runWithCapabilityWithheld(announce, fn);
24
+ }
@@ -179,14 +179,11 @@ export interface ClassifierUnavailableStation {
179
179
  budgetMs?: number;
180
180
  }
181
181
  /**
182
- * The classifier's REASONING SEAT, read off the model a classification is actually asked on — ONE predicate:
183
- * does the wire SPELL off ({@link thinkingOffSpelled})? Yes ⇒ `off` + the verdict-sized cap (the request pays
184
- * for the answer alone); no ⇒ `low` + the verdict cap + the low allowance (a model whose thinking the wire
185
- * cannot turn off is asked for the least it can grade, in the room that costs — spell off,
186
- * or leave thinking to the provider and pay 2048). A model that declares no reasoning at all is on the `low`
187
- * seat too: its wire carries nothing either way, so the request is the gateway's default, and a default-on
188
- * gateway thinks — the arm that used to read it as "never thinks" is the one the field report was about.
189
- * PER RUNG, not once per arming: the second rung is a different model with its own wire.
182
+ * The classifier's REASONING SEATS, read off the model a classification is actually asked on. The tier is the shared
183
+ * verdict ({@link lowestReasoningSeat}); the cap is the classifier's own: `off` carries the verdict-sized cap (the
184
+ * request pays for the answer alone), `low` carries the verdict cap plus the low allowance (spell off, or leave
185
+ * thinking to the provider and pay 2048). PER RUNG, not once per arming: the second rung is a different model with
186
+ * its own wire.
190
187
  *
191
188
  * The THINK seat is the RE-ASK seat ({@link classifierReplyAsksAgain}): a first attempt that produced no
192
189
  * verdict is asked once more with thinking allowed the room of CC's stage-2 classifier (8192) — an unknown
@@ -212,7 +209,8 @@ export type ClassifierSeatRequest = typeof CLASSIFIER_OFF_SEAT | typeof CLASSIFI
212
209
  * bound the engine can vouch for: a gateway may exclude reasoning tokens from `max_tokens` (a vLLM-fronted
213
210
  * Qwen gateway answered a cap of 128 with 938 output tokens and `stop`), so an over-long think is cut by the
214
211
  * round-trip timeout (`unavailable` / `timeout`), not by the cap (`parse_error` on an empty reply), and the
215
- * two are attested as the two different facts they are.
212
+ * two are attested as the two different facts they are. The seat's tier is not the classifier's to decide: it reads
213
+ * {@link lowestReasoningSeat}, and only the cap is its own.
216
214
  */
217
215
  export declare function classifierRungSeat(model: Model): typeof CLASSIFIER_OFF_SEAT | typeof CLASSIFIER_LOW_SEAT;
218
216
  /**
@@ -1,5 +1,5 @@
1
1
  import { sameRouteIdentity } from "../../brain/route-adjudicator.js";
2
- import { thinkingOffSpelled } from "../../brain/reasoning.js";
2
+ import { lowestReasoningSeat } from "../../brain/reasoning-request.js";
3
3
  import { AUTO_MODE_CLASSIFIER_CONTRACT_BROKEN_AFTER, AUTO_MODE_CLASSIFIER_LOW_REASONING_BUDGET_TOKENS, AUTO_MODE_CLASSIFIER_MAX_TOKENS, AUTO_MODE_CLASSIFIER_THINK_BUDGET_TOKENS } from "../auto-mode-defaults.js";
4
4
  import { autoModeClassifierFallbackOf, parseAutoModeResponse } from "../auto-mode.js";
5
5
  import { classifierUnavailableDispositionOf } from "../classifier-unavailable-arm.js";
@@ -80,7 +80,7 @@ export function announceClassifierRoleDefaulted(args) {
80
80
  const { seat } = args;
81
81
  if (seat.defaulted === undefined)
82
82
  return;
83
- const spelled = thinkingOffSpelled(seat.model);
83
+ const spelled = lowestReasoningSeat(seat.model) === "off";
84
84
  deliverEngineNotice(args.onNotice, {
85
85
  code: "classifier.role_defaulted",
86
86
  message: `no classifier role names a model — "${seat.model.id}" classifies this run (${seat.defaulted}); ` +
@@ -195,7 +195,7 @@ export const CLASSIFIER_OFF_SEAT = { reasoning: "off", maxTokens: AUTO_MODE_CLAS
195
195
  export const CLASSIFIER_LOW_SEAT = { reasoning: "low", maxTokens: AUTO_MODE_CLASSIFIER_MAX_TOKENS + AUTO_MODE_CLASSIFIER_LOW_REASONING_BUDGET_TOKENS };
196
196
  export const CLASSIFIER_THINK_SEAT = { reasoning: "low", maxTokens: AUTO_MODE_CLASSIFIER_MAX_TOKENS + AUTO_MODE_CLASSIFIER_THINK_BUDGET_TOKENS };
197
197
  export function classifierRungSeat(model) {
198
- return thinkingOffSpelled(model) ? CLASSIFIER_OFF_SEAT : CLASSIFIER_LOW_SEAT;
198
+ return lowestReasoningSeat(model) === "off" ? CLASSIFIER_OFF_SEAT : CLASSIFIER_LOW_SEAT;
199
199
  }
200
200
  export const CLASSIFIER_ATTEMPT_SUFFIX = {
201
201
  first: '\nErr on the side of blocking. Your ENTIRE response MUST begin with <block>. Do NOT output any analysis, reasoning, or commentary before <block>. No "Looking at..." or similar preamble.',
@@ -0,0 +1,10 @@
1
+ import { type CompactSessionRequest, type CompactSessionResult } from "../auto-compaction.js";
2
+ import { type SessionStore } from "../session.js";
3
+ import type { RunnerDeps } from "../types.js";
4
+ import { type SessionLockSeats } from "./session-verb-doors.js";
5
+ /** What the Runner lends the compaction: its current deps, its session store, and its lock. */
6
+ export interface CompactSessionSeats extends SessionLockSeats {
7
+ deps: RunnerDeps;
8
+ sessions: SessionStore;
9
+ }
10
+ export declare function compactIdleSession(seats: CompactSessionSeats, request: CompactSessionRequest): Promise<CompactSessionResult>;
@@ -0,0 +1,202 @@
1
+ import { convertToLlm, uuidv7 } from "../../internal/harness.js";
2
+ import { compactionFailureReason, compactionPassReport, DEFAULT_COMPACTION_INSTRUCTIONS, isCompactionManualCancel, manualCompactOutcomeOf, maybeCompact, mintCompactedEvent } from "../auto-compaction.js";
3
+ import { contextOverlayFor } from "../context-settings.js";
4
+ import { admitLegMods, legFacadeSeats } from "../mods/stations.js";
5
+ import { malformedPricingField } from "../pricing.js";
6
+ import { resolveTaskModel } from "../roles.js";
7
+ import { StoredSession } from "../session.js";
8
+ import { emitTrace } from "../trace.js";
9
+ import { egressThrownText } from "../untrusted-egress.js";
10
+ import { emitInputTruncated, legCompactionSettings } from "./compaction-call-options.js";
11
+ import { compactionHookOptions, summaryProviderOptions } from "./compaction-seams.js";
12
+ import { compactionSummaryFallback, compactionSummaryIsDerived } from "./derived-route-fallback.js";
13
+ import { resolveCompactionModel } from "./prepare-config-doors.js";
14
+ import { compactionActivationSnapshot } from "./prepare-tool-disclosure-mount.js";
15
+ import { derivedLegBrain, sideCallBookOf } from "./side-call-account.js";
16
+ import { acquireExistingSession, claimIdleSession, readPlainRequest, shownValue } from "./session-verb-doors.js";
17
+ const VERB = "Runner.compactSession";
18
+ const REQUEST_KEYS = new Set(["sessionId", "model", "instructions", "compaction", "compactionModel", "getApiKeyAndHeaders", "signal"]);
19
+ const SETTINGS_KEYS = new Set(["enabled", "reserveTokens", "keepRecentTokens", "instructions", "clampTolerance"]);
20
+ export async function compactIdleSession(seats, request) {
21
+ const req = screenCompactSessionRequest(request);
22
+ const { deps } = seats;
23
+ const resolved = resolveTaskModel({ model: req.model }, deps);
24
+ const named = resolveCompactionModel(req.compactionModel !== undefined ? { compactionModel: req.compactionModel } : {}, deps, "compactSession.compactionModel");
25
+ if (req.signal?.aborted === true)
26
+ return { outcome: "mooted", events: [] };
27
+ const release = await claimIdleSession(seats, req.sessionId, () => sessionBusyRefusal(req.sessionId));
28
+ try {
29
+ const acquired = await acquireExistingSession(seats.sessions, req.sessionId, VERB, "nothing was compacted");
30
+ const legMods = await admitLegMods({ spec: {}, deps, sessionId: req.sessionId });
31
+ return await compactOnSession(req, deps, new StoredSession(acquired.session.getStorage()), resolved, named, legMods);
32
+ }
33
+ finally {
34
+ release();
35
+ }
36
+ }
37
+ async function compactOnSession(req, deps, session, resolved, named, legMods) {
38
+ const { sessionId } = req;
39
+ const events = [];
40
+ const ident = () => ({ eventId: uuidv7() });
41
+ const passReport = compactionPassReport({ push: (e) => events.push(e) }, ident);
42
+ const stats = { turns: 0, tokens: 0, toolCalls: 0, promptTokens: 0, totalInputTokens: 0, cachedTokens: 0, cacheWriteTokens: 0, cacheWriteTokensLong: 0, outputTokens: 0, costMicroUsd: 0 };
43
+ const telemetry = { unpricedSpend: false, tracer: deps.tracer, taskId: sessionId };
44
+ const accountBook = sideCallBookOf(stats, { telemetry, pricing: () => deps.pricing, noteUnevaluablePriceTable: (p) => void (malformedPricingField(p) !== undefined && (telemetry.unpricedSpend = true)), catalog: deps.models });
45
+ let calls = 0;
46
+ const book = (lane, model, reply) => {
47
+ calls += 1;
48
+ accountBook(lane, model, reply);
49
+ };
50
+ const answer = (outcome) => ({
51
+ outcome,
52
+ events,
53
+ ...(calls > 0
54
+ ? {
55
+ usage: {
56
+ tokens: stats.tokens,
57
+ totalInputTokens: stats.totalInputTokens,
58
+ promptTokens: stats.promptTokens,
59
+ cachedTokens: stats.cachedTokens,
60
+ cacheWriteTokens: stats.cacheWriteTokens,
61
+ outputTokens: stats.outputTokens,
62
+ costMicroUsd: stats.costMicroUsd,
63
+ ...(stats.usageMissing === true ? { usageMissing: true } : {}),
64
+ ...(telemetry.unpricedSpend ? { unpriced: true } : {}),
65
+ },
66
+ }
67
+ : {}),
68
+ });
69
+ const trace = deps.tracer;
70
+ try {
71
+ const compactionModel = compactionSummaryIsDerived(req.compactionModel !== undefined, named) ? await compactionSummaryFallback({ derived: named, primary: resolved.model, brain: deps.brain, getApiKeyAndHeaders: req.getApiKeyAndHeaders, onNotice: deps.onNotice, sessionId }) : named;
72
+ const branch = await session.getBranch();
73
+ const contextMessages = convertToLlm((await session.buildContext()).messages);
74
+ bindSessionFacade(legMods, { deps, req, model: resolved.model, messages: contextMessages, book });
75
+ const overlay = contextOverlayFor(deps.contextSettings, resolved.modelRef, deps);
76
+ const activeTools = compactionActivationSnapshot(branch);
77
+ const thinking = resolved.thinking ?? resolved.model.defaultThinking;
78
+ const comp = await maybeCompact({
79
+ session,
80
+ model: resolved.model,
81
+ ...(overlay !== undefined ? { contextOverlay: overlay } : {}),
82
+ ...(compactionModel !== undefined ? { compactionModel } : {}),
83
+ brain: derivedLegBrain(() => deps.brain, "compaction", book),
84
+ ...(req.getApiKeyAndHeaders !== undefined ? { getApiKeyAndHeaders: req.getApiKeyAndHeaders } : {}),
85
+ ...(thinking !== undefined ? { thinking } : {}),
86
+ settings: legCompactionSettings(req.compaction !== undefined ? { compaction: req.compaction } : {}, overlay),
87
+ customInstructions: req.instructions ?? req.compaction?.instructions ?? DEFAULT_COMPACTION_INSTRUCTIONS,
88
+ ...(req.signal !== undefined ? { signal: req.signal, manualCancelSignal: req.signal } : {}),
89
+ minTokens: 0,
90
+ force: true,
91
+ onInputTruncated: emitInputTruncated(trace, sessionId),
92
+ ...(activeTools.length > 0 ? { activeTools } : {}),
93
+ ...summaryProviderOptions({ deps }, 0),
94
+ ...compactionHookOptions({ deps }, { modBus: legMods.bus, hookIdentity: undefined, sessionId }, "manual", req.signal),
95
+ onStarted: passReport.onStarted,
96
+ });
97
+ const outcome = manualCompactOutcomeOf(comp);
98
+ if (comp.compacted) {
99
+ events.push(mintCompactedEvent(comp, "manual", ident()));
100
+ return answer(outcome);
101
+ }
102
+ if (comp.blocked)
103
+ emitTrace(trace, () => ({ kind: "compaction.blocked", version: 1, taskId: sessionId, trigger: "manual", ts: Date.now() }));
104
+ else if (comp.disabled)
105
+ emitTrace(trace, () => ({ kind: "compaction.disabled", version: 1, taskId: sessionId, ts: Date.now() }));
106
+ else
107
+ emitTrace(trace, () => ({ kind: "compaction.noop", version: 1, taskId: sessionId, ts: Date.now() }));
108
+ events.push({ type: "compaction_outcome", outcome: outcome, trigger: "manual", ...ident() });
109
+ return answer(outcome);
110
+ }
111
+ catch (err) {
112
+ if (isCompactionManualCancel(err)) {
113
+ emitTrace(trace, () => ({ kind: "compaction.mooted", version: 1, taskId: sessionId, reason: "cancelled", ts: Date.now() }));
114
+ events.push({ type: "compaction_outcome", outcome: "mooted", trigger: "manual", reason: "cancelled", ...passReport.end, ...ident() });
115
+ return answer("mooted");
116
+ }
117
+ deps.onError?.(asError(err), { phase: "compaction", sessionId });
118
+ const reason = compactionFailureReason(err);
119
+ emitTrace(trace, () => ({ kind: "compaction.failed", version: 1, taskId: sessionId, trigger: "manual", reason, ts: Date.now() }));
120
+ events.push({ type: "compaction_outcome", outcome: "failed", trigger: "manual", reason, ...passReport.end, ...ident() });
121
+ return answer("failed");
122
+ }
123
+ }
124
+ function bindSessionFacade(legMods, input) {
125
+ const unavailable = (method) => {
126
+ throw new Error(`${method}: not available on a session-level compaction (${VERB}) — there is no run, so no execution environment, working directory, tool roster or agent listing`);
127
+ };
128
+ const seats = legFacadeSeats({
129
+ deps: input.deps,
130
+ spec: input.req.getApiKeyAndHeaders !== undefined ? { getApiKeyAndHeaders: input.req.getApiKeyAndHeaders } : {},
131
+ sessionId: input.req.sessionId,
132
+ model: input.model,
133
+ executionEnv: { exec: () => unavailable("process.run") },
134
+ taskRoot: "",
135
+ cwdRef: undefined,
136
+ lastBrainContext: () => ({ messages: input.messages }),
137
+ activeTools: new Set(),
138
+ agentListing: undefined,
139
+ book: (answeredBy, reply) => input.book("mod", answeredBy, reply),
140
+ toolCall: () => unavailable("tool.call"),
141
+ });
142
+ legMods.bindFacade({
143
+ ...seats,
144
+ cwd: () => unavailable("session.cwd"),
145
+ root: () => unavailable("session.root"),
146
+ tools: () => unavailable("tool.list"),
147
+ agents: () => unavailable("agent.list"),
148
+ });
149
+ }
150
+ function asError(err) {
151
+ return err instanceof Error ? err : new Error(egressThrownText("same-principal", err));
152
+ }
153
+ function screenCompactSessionRequest(request) {
154
+ const bad = (what) => {
155
+ const e = new Error(`${VERB}: ${what} — nothing was compacted. The request is { sessionId, model, instructions?, compaction?, compactionModel?, getApiKeyAndHeaders?, signal? }.`);
156
+ e.code = "compact.invalid_request";
157
+ throw e;
158
+ };
159
+ const { sessionId, model, instructions, compaction, compactionModel, getApiKeyAndHeaders, signal } = readPlainRequest(request, REQUEST_KEYS, bad);
160
+ if (typeof sessionId !== "string" || sessionId === "")
161
+ return bad(`sessionId must be a non-empty string, got ${shownValue(sessionId)}`);
162
+ if (model === undefined)
163
+ return bad("model is required — the model the session's next turn runs on, whose window bounds the pass");
164
+ if (instructions !== undefined && typeof instructions !== "string")
165
+ return bad(`instructions must be a string when given, got ${shownValue(instructions)}`);
166
+ if (getApiKeyAndHeaders !== undefined && typeof getApiKeyAndHeaders !== "function")
167
+ return bad(`getApiKeyAndHeaders must be a function when given, got ${shownValue(getApiKeyAndHeaders)}`);
168
+ if (signal !== undefined && !(signal instanceof AbortSignal))
169
+ return bad(`signal must be an AbortSignal when given, got ${shownValue(signal)}`);
170
+ return {
171
+ sessionId,
172
+ model: model,
173
+ instructions,
174
+ compaction: compaction === undefined ? undefined : screenSettings(compaction, bad),
175
+ compactionModel: compactionModel,
176
+ getApiKeyAndHeaders: getApiKeyAndHeaders,
177
+ signal,
178
+ };
179
+ }
180
+ function screenSettings(raw, bad) {
181
+ const { enabled, reserveTokens, keepRecentTokens, instructions, clampTolerance } = readPlainRequest(raw, SETTINGS_KEYS, (what) => bad(`compaction: ${what}`));
182
+ if (enabled !== undefined && typeof enabled !== "boolean")
183
+ return bad(`compaction.enabled must be a boolean when given, got ${shownValue(enabled)}`);
184
+ for (const [name, v] of [["reserveTokens", reserveTokens], ["keepRecentTokens", keepRecentTokens], ["clampTolerance", clampTolerance]]) {
185
+ if (v !== undefined && typeof v !== "number")
186
+ return bad(`compaction.${name} must be a number when given, got ${shownValue(v)}`);
187
+ }
188
+ if (instructions !== undefined && typeof instructions !== "string")
189
+ return bad(`compaction.instructions must be a string when given, got ${shownValue(instructions)}`);
190
+ return {
191
+ ...(enabled !== undefined ? { enabled: enabled } : {}),
192
+ ...(reserveTokens !== undefined ? { reserveTokens: reserveTokens } : {}),
193
+ ...(keepRecentTokens !== undefined ? { keepRecentTokens: keepRecentTokens } : {}),
194
+ ...(instructions !== undefined ? { instructions: instructions } : {}),
195
+ ...(clampTolerance !== undefined ? { clampTolerance: clampTolerance } : {}),
196
+ };
197
+ }
198
+ function sessionBusyRefusal(sessionId) {
199
+ const e = new Error(`${VERB}: a task is running or queued on session "${sessionId}" in this Runner, or a write one of its tasks issued has not settled — compacting it now would rewrite the transcript under that work, so nothing was compacted; a running task takes the request through its own stream (TaskStream.compact), otherwise retry once it has ended and its writes have settled`);
200
+ e.code = "compact.session_busy";
201
+ return e;
202
+ }
@@ -156,7 +156,7 @@ export declare function emitInputTruncated(tracer: TracerHook | undefined, taskI
156
156
  */
157
157
  export declare function legContextOverlayOption(prepared: Prepared, runner: RunnerDepsSeat): Pick<MaybeCompactOptions, "contextOverlay">;
158
158
  /**
159
- * The compaction SETTINGS a pass runs under — the assembly all three lanes share.
159
+ * The compaction SETTINGS a pass runs under — the assembly all three lanes and the out-of-run `Runner.compactSession` share.
160
160
  *
161
161
  * `{ ...DEFAULT_COMPACTION_SETTINGS, ...spec.compaction }` was hand-copied at each lane, and it is where the
162
162
  * deployment's live `enabled` declaration belongs: `maybeCompact` has exactly one enablement gate (it reads
@@ -165,4 +165,4 @@ export declare function legContextOverlayOption(prepared: Prepared, runner: Runn
165
165
  * compaction runs" a single expression ({@link compactionEnabled}: the request authored it > the deployment
166
166
  * declared it > on).
167
167
  */
168
- export declare function legCompactionSettings(spec: TaskSpec, overlay: ContextWindowOverlay | undefined): CompactionSettings;
168
+ export declare function legCompactionSettings(spec: Pick<TaskSpec, "compaction">, overlay: ContextWindowOverlay | undefined): CompactionSettings;
@@ -1,4 +1,15 @@
1
+ /**
2
+ * The run loop's COMPACTION SEAMS, verbatim from three private methods of `Runner`: the Seam C
3
+ * cost-optimization options every `maybeCompact` call site spreads, the pre/postCompact hook-option wrapper and
4
+ * the consecutive-reuse counter fold. Layer-1 machinery under a name of its own (the S1 reading: a module the lanes stand
5
+ * on is not a lane) — the turn-boundary lane, the recovery lane and the terminal adoption's end-of-task pass reach DOWN
6
+ * for these three where the driver used to hand each lane the methods as delegates on its Input. Every function reads
7
+ * the Runner's deps LIVE through {@link RunnerDepsSeat}: `runner.deps.x` here is exactly `this.deps.x` in the method it
8
+ * came from, on the tick it is read.
9
+ */
10
+ import type { HookInvocationIdentity } from "../hooks.js";
1
11
  import type { MaybeCompactOptions } from "../auto-compaction.js";
12
+ import { type LegModBus } from "../mods/stations.js";
2
13
  import type { Prepared, RunnerDepsSeat } from "./contracts.js";
3
14
  /**
4
15
  * The cost-optimization compaction options threaded into BOTH `maybeCompact` call
@@ -12,6 +23,11 @@ import type { Prepared, RunnerDepsSeat } from "./contracts.js";
12
23
  * function itself always returns an object.
13
24
  */
14
25
  export declare function seamCCompactionOptions(runner: RunnerDepsSeat, prepared: Prepared): Pick<MaybeCompactOptions, "summaryProvider" | "onCompaction" | "maxConsecutiveProviderReuse" | "consecutiveProviderReuse" | "onCommitted">;
26
+ /** The Seam C PROVIDER half — the deployment's summary provider, its observer and its drift guard, fed the caller's
27
+ * consecutive-reuse count (a run's counter; `0` for a pass outside a run, which has no earlier reuse to count). Still
28
+ * provider-gated: with no provider wired the four keys stay ABSENT, so every caller spreads exactly what it spread
29
+ * before. */
30
+ export declare function summaryProviderOptions(runner: RunnerDepsSeat, consecutive: number): Pick<MaybeCompactOptions, "summaryProvider" | "onCompaction" | "maxConsecutiveProviderReuse" | "consecutiveProviderReuse">;
15
31
  /** The pre/postCompact stations threaded into maybeCompact: `classic.PreCompact` and `classic.PostCompact` raised on the
16
32
  * leg's bus (a station is wired only when a handler hangs on its event). Their failure and abort columns are the
17
33
  * bus's — a handler that throws or runs past its budget is skipped and reported, so a failed gate is "no block, no
@@ -19,7 +35,11 @@ export declare function seamCCompactionOptions(runner: RunnerDepsSeat, prepared:
19
35
  * trigger is reported as ignored (maybeCompact enforces the ignore — blocking a compaction the provider/trim layer
20
36
  * already demanded would kill the run). `signal` is the pass's abort (absent ⇒ each handler's own budget is the
21
37
  * whole bound). */
22
- export declare function compactionHookOptions(runner: RunnerDepsSeat, prepared: Pick<Prepared, "modBus" | "hookIdentity" | "sessionId">, trigger: "auto" | "manual" | "forced", signal: AbortSignal | undefined): Pick<MaybeCompactOptions, "trigger" | "preCompact" | "postCompact">;
38
+ export declare function compactionHookOptions(runner: RunnerDepsSeat, prepared: {
39
+ readonly modBus: LegModBus;
40
+ readonly hookIdentity: HookInvocationIdentity | undefined;
41
+ readonly sessionId: string;
42
+ }, trigger: "auto" | "manual" | "forced", signal: AbortSignal | undefined): Pick<MaybeCompactOptions, "trigger" | "preCompact" | "postCompact">;
23
43
  /** Fold a finished compaction's `reused` flag into the run-scoped consecutive-reuse
24
44
  * counter: a reused (provider) summary increments it, a real (LLM) summary resets it to 0. A no-op
25
45
  * compaction (`compacted:false`) leaves the counter untouched. No-op when no provider is wired. */
@@ -1,14 +1,7 @@
1
1
  import { classicEventBase, dispatchClassic, observeClassic, stringMembersAnswer, stringMembersOf } from "../mods/stations.js";
2
2
  export function seamCCompactionOptions(runner, prepared) {
3
3
  return {
4
- ...(runner.deps.summaryProvider
5
- ? {
6
- summaryProvider: runner.deps.summaryProvider,
7
- onCompaction: runner.deps.onCompaction,
8
- maxConsecutiveProviderReuse: runner.deps.maxConsecutiveProviderReuse,
9
- consecutiveProviderReuse: prepared.compactionReuseRef.consecutive,
10
- }
11
- : {}),
4
+ ...summaryProviderOptions(runner, prepared.compactionReuseRef.consecutive),
12
5
  onCommitted: (effect) => {
13
6
  if (prepared.frameSettlement.wantsEffects?.() !== true)
14
7
  return;
@@ -16,6 +9,16 @@ export function seamCCompactionOptions(runner, prepared) {
16
9
  },
17
10
  };
18
11
  }
12
+ export function summaryProviderOptions(runner, consecutive) {
13
+ return runner.deps.summaryProvider
14
+ ? {
15
+ summaryProvider: runner.deps.summaryProvider,
16
+ onCompaction: runner.deps.onCompaction,
17
+ maxConsecutiveProviderReuse: runner.deps.maxConsecutiveProviderReuse,
18
+ consecutiveProviderReuse: consecutive,
19
+ }
20
+ : {};
21
+ }
19
22
  export function compactionHookOptions(runner, prepared, trigger, signal) {
20
23
  const bus = prepared.modBus;
21
24
  const base = classicEventBase(prepared.hookIdentity);
@@ -3,6 +3,7 @@ import { checkedMediaByteCap } from "../media-byte-cap.js";
3
3
  import { receiptRefusal, receiveOwnProperties, refuseProxy } from "../own-property-receipt.js";
4
4
  import { assertNoRetiredRunnerDeps } from "./retired-runner-deps.js";
5
5
  import { copyReadDenySeat, READ_DENY_DEPLOYMENT_SEATS } from "../read-face-seats.js";
6
+ import { receiveHostFloor } from "../host-floor.js";
6
7
  import { holdOwnCredentialValues } from "../secret-env.js";
7
8
  export function retainRunnerDeps(deps) {
8
9
  const words = { subject: "RunnerDeps", unit: "seat", moment: "at new Runner" };
@@ -15,6 +16,8 @@ export function retainRunnerDeps(deps) {
15
16
  if (Object.hasOwn(retained, seat))
16
17
  Object.defineProperty(retained, seat, { value: copyReadDenySeat(Reflect.get(retained, seat)), enumerable: true, writable: true, configurable: true });
17
18
  }
19
+ if (Object.hasOwn(retained, "hostFloor"))
20
+ Object.defineProperty(retained, "hostFloor", { value: receiveHostFloor(Reflect.get(retained, "hostFloor")), enumerable: true, writable: true, configurable: true });
18
21
  let consolidationKey;
19
22
  try {
20
23
  const chat = retained.memoryConsolidationDriver?.chat;