@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
@@ -117,10 +117,10 @@ function announceDurableGateUnavailable(args) {
117
117
  });
118
118
  }
119
119
  export function prepareWiringManifest(input) {
120
- const { spec, deps, internals, resume, sessionId, runId, hostTaskId, taskScope, modBus, checkpointScope, policyLayers, effectivePolicy, handsEnabled, taskRootFinal, legWriteGuard, mcp, irreversibleTools, egressTools, toolEffects, ownedEnv, executionEnv, offloadStore, onceLedger, usageWindows, envLifetimeSuspendAt, runtimeCaps, resolvedInteractionPosture, durableQuestionFace, liveQuestionFace, checkpointStore, sessions, modelGateManifest, autoModeArmReason, permissionMode, lockedPreflight, peerLaneRefs, frameSettlement, sessionBox, harness, pausedRef, askSeat, liveInheritedGate, delegation, toolRoster, readDenyBuiltinTiersActive, lspManagerWired, shellReadStationArmed, crossBoundaryStationEngaged, lspDiagnosticsLive, fileHistoryFact, projectMemoryFact, sessionRulesChildrenReadLive, memoryPollution, advisorFact } = input;
120
+ const { spec, deps, internals, resume, sessionId, runId, hostTaskId, taskScope, modBus, standingModBus, checkpointScope, policyLayers, effectivePolicy, handsEnabled, taskRootFinal, legWriteGuard, mcp, irreversibleTools, egressTools, toolEffects, ownedEnv, executionEnv, offloadStore, onceLedger, usageWindows, envLifetimeSuspendAt, runtimeCaps, resolvedInteractionPosture, durableQuestionFace, liveQuestionFace, checkpointStore, sessions, modelGateManifest, autoModeArmReason, permissionMode, lockedPreflight, peerLaneRefs, frameSettlement, sessionBox, harness, pausedRef, askSeat, liveInheritedGate, delegation, toolRoster, readDenyBuiltinTiersActive, lspManagerWired, shellReadStationArmed, crossBoundaryStationEngaged, lspDiagnosticsLive, fileHistoryFact, projectMemoryFact, sessionRulesChildrenReadLive, memoryPollution, advisorFact, hostFloorPosture } = input;
121
121
  const onAsk = askSeat.value;
122
122
  const handWriteTools = toolRoster.entries.filter((e) => e.mountedBy === "hands" && (e.effect === "write" || e.effect === "idempotent")).map((e) => e.name);
123
- const hasEffectAwareGate = policyLayers.length > 0 || chainJudges(modBus);
123
+ const hasEffectAwareGate = policyLayers.length > 0 || chainJudges(standingModBus);
124
124
  const rosterHolds = new Set(toolRoster.entries.map((e) => e.name));
125
125
  const peerWriteUngated = modePolicyOf(permissionMode.current).unstated === "ask"
126
126
  ? []
@@ -223,7 +223,7 @@ export function prepareWiringManifest(input) {
223
223
  mods: modBus.records,
224
224
  ...(lspManagerWired ? { lsp: deriveLspSeam(toolRoster.entries.some((e) => e.contract.contractId === LSP_CONTRACT_ID), lspDiagnosticsLive) } : {}),
225
225
  hands: deriveHandsSeam(handsEnabled),
226
- fileHistory: fileHistoryFact, projectMemory: projectMemoryFact, sessionRulesChildrenReadLive, ...(advisorFact !== undefined ? { advisor: advisorFact } : {}),
226
+ fileHistory: fileHistoryFact, projectMemory: projectMemoryFact, sessionRulesChildrenReadLive, ...(advisorFact !== undefined ? { advisor: advisorFact } : {}), ...(hostFloorPosture !== undefined ? { hostFloor: hostFloorPosture } : {}),
227
227
  });
228
228
  peerLaneRefs.askEffective = askSeatEffective(wiringManifest);
229
229
  peerLaneRefs.permissionMode = () => permissionMode.current;
@@ -49,7 +49,7 @@ export async function resumeAdmission(input) {
49
49
  const resumeSignal = config.signal;
50
50
  let suppliedMessage;
51
51
  refuseRetiredModeSeed(cp.state);
52
- config = refuseResumeDoors(config, cp.state.inheritedGate, runner.deps, sessions);
52
+ config = refuseResumeDoors(config, cp.state.inheritedGate, runner.deps, sessions, internals?.holder);
53
53
  const parkedSteers = readPendingSteerQueue(cp.state);
54
54
  if (outcomeGate === "wake") {
55
55
  suppliedMessage = outcome.message;
@@ -1,5 +1,4 @@
1
1
  import { snapshotActorAssertion } from "../../internal/llm.js";
2
- import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
3
2
  import { CheckpointError, remainingBudgetMicroUsd } from "../checkpoint-store.js";
4
3
  import { chainPolicyOnLeg, chainTopAnchors } from "./child-tree.js";
5
4
  import { mintHookInvocationIdentity } from "../hooks.js";
@@ -8,14 +7,15 @@ import { checkToolPolicyProjection, policyCannotAnswer, refuseOutOfContractDecis
8
7
  import { callFaceSeat, parkedCallFaceOf } from "../tool-roster.js";
9
8
  import { readCallTarget } from "../effective-path-target.js";
10
9
  import { inlineUntrusted } from "../untrusted-text.js";
11
- import { deepJsonEqual, describeSuppliedValue, mintDecideRecord } from "./decide-continuation.js";
10
+ import { describeSuppliedValue, mintDecideRecord } from "./decide-continuation.js";
11
+ import { editRewrittenSentence, readRejudge } from "../rewrite-rejudge.js";
12
12
  import { orgVerdictBeforeClaim } from "./permission-rule-lanes.js";
13
13
  import { chainCannotJudge } from "./call-hook-stations.js";
14
14
  import { thrownText } from "../thrown-value.js";
15
- import { wireOf } from "../tool-name-readings.js";
16
15
  import { judgeApprovalObject } from "../approval-object.js";
17
- import { SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, normalizeSkills } from "./synthetic-tools.js";
18
- import { skillLoadReading } from "./skill-base-dir.js";
16
+ import { SKILL_TOOL_NAME, normalizeSkills, skillsThatLoad } from "./synthetic-tools.js";
17
+ import { readSkillsSeat } from "./skills-seat.js";
18
+ import { frozenSkillScopesOf } from "../mods/spec-seats.js";
19
19
  export async function resumeApply(input) {
20
20
  const { cp, config, internals, outcomeGate, wakeMessage, resumeSignal, recheckGovernanceWindow, plainReviewOutcome, plainParkOutcome, runner, effectiveDelegationFacts } = input;
21
21
  let plainPolicyOutcome = input.plainPolicyOutcome;
@@ -23,7 +23,7 @@ export async function resumeApply(input) {
23
23
  let legMods;
24
24
  if (outcomeGate === "wake" && wakeMessage !== undefined) {
25
25
  if (resumeSignal?.aborted !== true) {
26
- legMods = await admitLegMods({ spec: config, deps: runner.deps, sessionId: cp.sessionId });
26
+ legMods = await admitLegMods({ spec: config, deps: runner.deps, sessionId: cp.sessionId, skills: skillsThatLoad(readSkillsSeat(config.skills)), reopenedSkills: frozenSkillScopesOf(cp.state) });
27
27
  }
28
28
  if (legMods !== undefined && legMods.bus.hasHandlers("classic.UserPromptSubmit")) {
29
29
  const screenedMessage = wakeMessage;
@@ -75,7 +75,7 @@ export async function resumeApply(input) {
75
75
  });
76
76
  };
77
77
  if (plainPolicyOutcome?.decision === "allow" && cp.pendingAction.kind === "tool_approval") {
78
- const servedSkills = normalizeSkills(config.skills).filter((s) => skillLoadReading(s, SKILL_CONTENT_MAX_CHARS).loads);
78
+ const servedSkills = skillsThatLoad(normalizeSkills(config.skills));
79
79
  const claimed = judgeApprovalObject(cp.pendingAction, { args: plainPolicyOutcome.updatedInput ?? cp.pendingAction.args, skills: servedSkills, skillToolName: SKILL_TOOL_NAME }, "claim");
80
80
  if (claimed !== "match")
81
81
  throw new CheckpointError("checkpoint.invalid_outcome", claimed.message, { field: "boundGrantDigest" });
@@ -83,8 +83,7 @@ export async function resumeApply(input) {
83
83
  if (plainPolicyOutcome !== undefined &&
84
84
  plainPolicyOutcome.decision === "allow" &&
85
85
  plainPolicyOutcome.updatedInput !== undefined &&
86
- cp.pendingAction.kind === "tool_approval" &&
87
- wireOf("resume.editRecheckQuestionSkip", cp.pendingAction) !== ASK_USER_QUESTION_TOOL_NAME) {
86
+ cp.pendingAction.kind === "tool_approval") {
88
87
  const editedArgs = plainPolicyOutcome.updatedInput;
89
88
  const editBudget = {
90
89
  resourceRemainingMicroUsd: remainingBudgetMicroUsd(cp.resourceLedger),
@@ -148,9 +147,9 @@ export async function resumeApply(input) {
148
147
  }
149
148
  if (policyCannotAnswer(rechecked, plainPolicyOutcome.hostDecision.decidedBy))
150
149
  throw new CheckpointError("checkpoint.invalid_outcome", `the approver EDITED this call's input, the edited args raise a question that requires real approval, and the decision is the deployment's policy — a policy's answer is not a person's (decide the edit as "person", or approve the shown input); refusing pre-CAS, the checkpoint stays pending`, { field: "hostDecision" });
151
- if (rechecked.updatedInput !== undefined && !deepJsonEqual(rechecked.updatedInput, editedArgs)) {
152
- throw new CheckpointError("resume.constraint_rejected", `the deployment's resume-edit policy REWROTE the approver's edited args to a different value than was approved — the durable resume cannot execute either the un-adjudicated edit or an unapproved rewrite; ` +
153
- `refused pre-CAS (the checkpoint stays pending); re-submit the edited action so the rewrite is adjudicated and approved synchronously`);
150
+ const reread = readRejudge(editedReq, editedArgs, rechecked);
151
+ if (reread.kind === "rewritten") {
152
+ throw new CheckpointError("resume.constraint_rejected", `${editRewrittenSentence(cp.pendingAction.toolName)} (detail.editRewritten) — refused pre-CAS, the checkpoint stays pending and decidable`, { editRewritten: { acceptableForm: reread.form } });
154
153
  }
155
154
  }
156
155
  }
@@ -5,6 +5,7 @@ import { CHECKPOINT_FEATURES, CheckpointError, checkpointVersionOf, MAX_SUPPORTE
5
5
  import { judgeCheckpointRequirements } from "../checkpoint-requirements.js";
6
6
  import { constraintChainDigest, constraintChainEntryOfSuppliedLayer } from "../tool-policy.js";
7
7
  import { readFrozenSkillGrants } from "../skill-grant.js";
8
+ import { readFrozenSkillScopes } from "../mods/spec-seats.js";
8
9
  import { chainInstallationGaps, chainInstallationRefusal } from "./child-tree.js";
9
10
  import { screeningInstallationsOf, unraisableGuardsOf } from "../mods/stations.js";
10
11
  import { refusePersistedToolNames, refuseRenamedDelegationMounts } from "./sub-agent-deny-lists.js";
@@ -61,6 +62,8 @@ export function resumeCheckpointScreen(input) {
61
62
  }
62
63
  if (readFrozenSkillGrants(cp.state.skillGrants) === undefined)
63
64
  throw new CheckpointError("checkpoint.invalid_outcome", "this checkpoint carries a skill-grant section (state.skillGrants) that does not read as grant rows under this engine — a damaged section, or a row an earlier release wrote whose entry this release reads as nothing (an entry with a surrounding space, say) — refusing to resume without the grant rows and refusals it carries; the checkpoint stays pending: finish it on a worker of the release that parked it, or expire it", { reason: "skill_grants_damaged" });
65
+ if (readFrozenSkillScopes(cp.state.skillScopes) === undefined)
66
+ throw new CheckpointError("checkpoint.invalid_outcome", "this checkpoint carries a skill-scope section (state.skillScopes) that does not read as a list of SkillSpec names — a damaged section — refusing to resume without the active skills' hooks it records; the checkpoint stays pending: finish it on a worker of the release that parked it, or expire it", { reason: "skill_scopes_damaged" });
64
67
  for (const field of ["handsRoot", "handsHome", "handsCwd"]) {
65
68
  const coordinate = cp.state[field];
66
69
  if (coordinate !== undefined && validatePath(coordinate, { intent: "validate-coordinate" }) === undefined)
@@ -2,8 +2,8 @@
2
2
  * The resume ladder's CLAIM rung (E10), verbatim from `Runner.resumeStream`: the atomic
3
3
  * CAS (`claimTerminal` when the store provides it — one round trip carrying the loser's truth — else the
4
4
  * two-step `resolve` + diagnostic read), the same-Runner claim mark around it, and the loss classification
5
- * (`reopened_concurrently` for a live row whose rev moved, `already_resolved` for a consumed one, with the
6
- * dead parked-constraint entry evicted). Winning is the SOLE trigger to execute the pending action.
5
+ * (`reopened_concurrently` for a live row whose rev moved, `resume.holder_superseded` for the validated row a carried claim holder
6
+ * lost, `already_resolved` for a consumed one, with the dead parked-constraint entry evicted). Winning is the SOLE trigger to execute.
7
7
  *
8
8
  * Async (the CAS). It ends by handing off to the driver's post-claim rung (`next`) in its LAST continuation
9
9
  * — the post-consume hook fires on the tick the win was read — and returns what that rung returns.
@@ -19,6 +19,8 @@ export interface ResumeClaimInput<R> {
19
19
  store: CheckpointStore;
20
20
  /** borrowed-readonly — the twin the store persists as the resolved outcome. */
21
21
  outcomeForStore: ResumeRun["outcome"];
22
+ /** borrowed-readonly — the deployment's claim holder the resume acts under (`RunInternals.holder`), carried into the CAS. */
23
+ holder?: string | undefined;
22
24
  /** borrowed-mutable — the Runner's same-Runner claim marks: opened with the resolve attempt, released on a loss. */
23
25
  locallyClaimedTokens: Set<CheckpointToken>;
24
26
  /** borrowed-mutable — the Runner's parked-constraint registry: a terminally consumed token's entry is evicted. */
@@ -1,23 +1,30 @@
1
1
  import { CheckpointError } from "../checkpoint-store.js";
2
+ import { checkpointRevOf } from "../checkpoint-generation.js";
2
3
  export async function resumeClaim(input) {
3
- const { token, cp, store, outcomeForStore, locallyClaimedTokens, parentConstraintRegistry } = input;
4
+ const { token, cp, store, outcomeForStore, holder, locallyClaimedTokens, parentConstraintRegistry } = input;
5
+ const expect = { rev: checkpointRevOf(cp), ...(holder !== undefined ? { holder } : {}) };
4
6
  locallyClaimedTokens.add(token);
5
- let won;
6
- let claimLossStatus;
7
+ let won, loss;
7
8
  if (store.claimTerminal !== undefined) {
8
- const claim = await store.claimTerminal(token, cp.scope, { kind: "resolve", outcome: outcomeForStore, expect: { rev: cp.rev ?? 0 } });
9
+ const claim = await store.claimTerminal(token, cp.scope, { kind: "resolve", outcome: outcomeForStore, expect });
9
10
  won = claim.claimed;
10
11
  if (!claim.claimed)
11
- claimLossStatus = claim.current.status;
12
+ loss = { status: claim.current.status, rev: claim.current.status === "absent" ? undefined : claim.current.rev, sameRow: true };
12
13
  }
13
14
  else {
14
- won = await store.resolve(token, cp.scope, outcomeForStore, { rev: cp.rev ?? 0 });
15
+ won = await store.resolve(token, cp.scope, outcomeForStore, expect);
15
16
  }
16
17
  if (!won)
17
18
  locallyClaimedTokens.delete(token);
18
19
  if (!won) {
19
- const stillPending = claimLossStatus !== undefined ? claimLossStatus === "pending" : (await store.get(token))?.status === "pending";
20
- if (stillPending) {
20
+ if (loss === undefined) {
21
+ const row = await store.get(token);
22
+ loss = row ? { status: row.status, rev: checkpointRevOf(row), sameRow: row.scope === cp.scope } : { status: "absent", rev: undefined, sameRow: false };
23
+ }
24
+ if (loss.status === "pending") {
25
+ if (holder !== undefined && loss.sameRow && loss.rev === expect.rev) {
26
+ throw new CheckpointError("resume.holder_superseded", "the claim this resume acts under is no longer the deployment's current grant — nothing was applied and the checkpoint is unchanged by this resume; the run is superseded: do not retry it (the current holder delivers)");
27
+ }
21
28
  throw new CheckpointError("checkpoint.reopened_concurrently", "checkpoint changed concurrently (its revision advanced via a resolve/reopen cycle since this resume validated) — not executed; re-resume against the current state");
22
29
  }
23
30
  parentConstraintRegistry.delete(token);
@@ -7,6 +7,7 @@ const RETIRED_RUNNER_DEPS_KEYS = {
7
7
  graderEnvFactory: "the grader env reaches the repair loop as `RepairLoopConfig.graderEnv`, minted by the trusted control plane (`assertOracleIsolation` / `GraderEnv` unchanged)",
8
8
  "hands.readCyberReminder": "a Read result carries only the reminders about that read (an empty file, an offset past the end, a file already in context) — no standing content-safety tail, so there is nothing to switch; a deployment that wants that sentence states it in its own `appendSystemPrompt`",
9
9
  promptProvider: "a deployment changes prompt text through overlays: register a `prompt.compose` handler on `RunnerDeps.mods` answering `{ overlays }` (role base `replace`, a brand line `add` to the role band, a behavior or scenario `add`, a core-behavior `replace` / `append` / `drop`), choose the role base per task with `TaskSpec.promptRole`, and dispose of an MCP server's instructions with a `prompt.section` registration answering `{ text }` / `{ text: null }`",
10
+ allowImageUrl: "a remote image URL is judged by the one egress guard (https, the private-network floor) and the deployment's host floor — declare a CDN list as `RunnerDeps.hostFloor.only` (it bounds every structured egress: the fetch tool, task images, MCP http, A2A, WebSearch's SearXNG backend), or send the image inline",
10
11
  memorySessionIncarnation: "the occupant behind a session id is a cell of the session row now — `SessionMetadata.incarnation` on the metadata `Session.getMetadata()` returns (forks also `forkedFromIncarnation`), with `SessionStore.headOf` (its `incarnation`) for by-id readers; put the token the old seat answered on your sessions instead. A deployment that drops the seat without surfacing the cell loses the axis: records bind by session id alone",
11
12
  };
12
13
  export function assertNoRetiredRunnerDeps(deps) {
@@ -0,0 +1,12 @@
1
+ import type { RewindFilesRequest, RewindFilesResult } from "../file-history-store.js";
2
+ import type { SessionStore } from "../session.js";
3
+ import type { RunnerDeps } from "../types.js";
4
+ import type { SessionReadFileStates } from "./session-read-file-states.js";
5
+ import { type SessionLockSeats } from "./session-verb-doors.js";
6
+ /** What the Runner lends the rewind: its current deps, its session store, its read-state seats, and its lock. */
7
+ export interface RewindFilesSeats extends SessionLockSeats {
8
+ deps: RunnerDeps;
9
+ sessions: SessionStore;
10
+ readStates: SessionReadFileStates;
11
+ }
12
+ export declare function rewindSessionFiles(seats: RewindFilesSeats, request: RewindFilesRequest): Promise<RewindFilesResult>;
@@ -0,0 +1,90 @@
1
+ import { hasDestroy } from "../remote-env.js";
2
+ import { resolveDeploymentFileHistory, storeUnconfiguredRefusal } from "./file-history-request.js";
3
+ import { prepareExecutionEnv } from "./prepare-execution-env.js";
4
+ import { noBoundaryRefusal, settleFileHistoryRestore } from "./file-history-restore.js";
5
+ import { adoptForkedFileHistory, resolveFileHistoryCoordinates } from "./prepare-file-history.js";
6
+ import { createRollbackStack } from "./rollback-stack.js";
7
+ import { acquireExistingSession, claimIdleSession, readPlainRequest, shownValue } from "./session-verb-doors.js";
8
+ import { settleTeardownLeg } from "./teardown-bounded.js";
9
+ const REQUEST_KEYS = new Set(["sessionId", "to", "dryRun", "signal"]);
10
+ export async function rewindSessionFiles(seats, request) {
11
+ const req = screenRewindFilesRequest(request);
12
+ const { deps } = seats;
13
+ const { wiredSeat, fileHistoryStore, captureStore } = resolveDeploymentFileHistory(deps);
14
+ if (fileHistoryStore === undefined)
15
+ throw storeUnconfiguredRefusal(wiredSeat, req.to);
16
+ const release = await claimIdleSession(seats, req.sessionId, () => sessionBusyRefusal(req.sessionId, req.to));
17
+ try {
18
+ const session = await acquireExistingSession(seats.sessions, req.sessionId, "Runner.rewindFiles", "nothing was rewound");
19
+ const report = (err) => {
20
+ try {
21
+ deps.onError?.(err, { phase: "config", sessionId: req.sessionId });
22
+ }
23
+ catch {
24
+ }
25
+ };
26
+ const rollback = createRollbackStack(report);
27
+ let envPhase;
28
+ try {
29
+ envPhase = await prepareExecutionEnv({ deps, spec: {}, internals: undefined, resume: undefined, placementRootResolved: req.sessionId, sessionId: req.sessionId, forgetOnThrow: async () => { }, rollback });
30
+ }
31
+ catch (err) {
32
+ await rollback.unwindAll();
33
+ throw err;
34
+ }
35
+ rollback.commit();
36
+ try {
37
+ return await rewindOnEnv(req, envPhase.executionEnv, envPhase.handsEnabled, envPhase.taskRootInitial, { store: fileHistoryStore, captureStore, session: session.session, seats });
38
+ }
39
+ finally {
40
+ const owned = envPhase.ownedEnvSeat.current;
41
+ if (owned !== undefined && hasDestroy(owned))
42
+ await settleTeardownLeg(() => owned.destroy(), "ownedEnv.destroy (rewindFiles)", report);
43
+ }
44
+ }
45
+ finally {
46
+ release();
47
+ }
48
+ }
49
+ async function rewindOnEnv(req, env, handsEnabled, taskRoot, ctx) {
50
+ if (!handsEnabled)
51
+ throw filesEnvUnsupportedRefusal(req.sessionId, req.to);
52
+ const { historyRoot, historyScope } = await resolveFileHistoryCoordinates(true, env, taskRoot, undefined, req.sessionId);
53
+ if (ctx.captureStore !== undefined)
54
+ await adoptForkedFileHistory(ctx.captureStore, ctx.session, req.sessionId, ctx.seats.deps.onError);
55
+ if (req.dryRun) {
56
+ if (!(await ctx.store.canRestore(historyScope, req.to)))
57
+ throw noBoundaryRefusal(req.to, req.sessionId, true);
58
+ const preview = ctx.store.diffStats === undefined ? null : await ctx.store.diffStats(historyScope, req.to, env, historyRoot);
59
+ return { dryRun: true, preview: preview ?? null };
60
+ }
61
+ const restore = await settleFileHistoryRestore({ store: ctx.store, sessionId: req.sessionId, target: req.to, before: false, env, root: historyRoot, signal: req.signal, readStates: ctx.seats.readStates });
62
+ return { dryRun: false, restore };
63
+ }
64
+ function screenRewindFilesRequest(request) {
65
+ const bad = (what) => {
66
+ const e = new Error(`Runner.rewindFiles: ${what} — nothing was rewound. The request is { sessionId, to, dryRun?, signal? }.`);
67
+ e.code = "rewind.invalid_spec";
68
+ throw e;
69
+ };
70
+ const { sessionId, to, dryRun, signal } = readPlainRequest(request, REQUEST_KEYS, bad);
71
+ if (typeof sessionId !== "string" || sessionId === "")
72
+ return bad(`sessionId must be a non-empty string, got ${shownValue(sessionId)}`);
73
+ if (typeof to !== "string" || to === "")
74
+ return bad(`to must be a non-empty entry id, got ${shownValue(to)}`);
75
+ if (dryRun !== undefined && typeof dryRun !== "boolean")
76
+ return bad(`dryRun must be a boolean when given, got ${shownValue(dryRun)}`);
77
+ if (signal !== undefined && !(signal instanceof AbortSignal))
78
+ return bad(`signal must be an AbortSignal when given, got ${shownValue(signal)}`);
79
+ return { sessionId, to, dryRun: dryRun === true, signal };
80
+ }
81
+ function sessionBusyRefusal(sessionId, target) {
82
+ const e = new Error(`Runner.rewindFiles: a task is running or queued on session "${sessionId}" in this Runner, or a write one of its tasks issued has not settled — rewinding its files to entry "${target}" now would move them under that work, so nothing was rewound; retry once it has ended and its writes have settled`);
83
+ e.code = "rewind.session_busy";
84
+ return e;
85
+ }
86
+ function filesEnvUnsupportedRefusal(sessionId, target) {
87
+ const e = new Error(`Runner.rewindFiles: this deployment mounts no filesystem-capable ExecutionEnv, so session "${sessionId}" has no working tree to rewind to entry "${target}" — nothing was rewound`);
88
+ e.code = "rewind.files_env_unsupported";
89
+ return e;
90
+ }
@@ -4,6 +4,7 @@ import { SKILLS_LISTING_PROBE_HEADER } from "./synthetic-tools.js";
4
4
  import { AGENT_LISTING_REMOVED_HEADER, SKILLS_LISTING_DELTA_HEADER, SKILLS_LISTING_REMOVED_HEADER, agentListingDeltaHeader, agentListingInitialHeader, createAttachmentState, replayAnnouncedListing, replayAnnouncedModels } from "./turn-attachments.js";
5
5
  import { wireOf } from "../tool-name-readings.js";
6
6
  import { rosterToolName } from "../tool-roster.js";
7
+ import { rowNotExecuted } from "./tool-not-executed.js";
7
8
  export async function runAttachmentSeats(input) {
8
9
  const { spec, prepared, resume, rs, runner, next } = input;
9
10
  rs.counters.wroteThisRun = false;
@@ -175,7 +176,7 @@ export async function runAttachmentSeats(input) {
175
176
  if ((fvMarked || text.includes("<system-reminder>[final verification]")) && rs.counters.finalVerifyInjections < 2)
176
177
  rs.counters.finalVerifyInjections += 1;
177
178
  }
178
- else if (m.role === "toolResult" && !rs.counters.wroteThisRun && (prepared.toolEffects.get(wireOf("verify.wroteThisRunSeed", { toolName: rosterToolName(prepared.toolRosterDeltas.current, m.toolName) })) ?? "write") !== "read") {
179
+ else if (m.role === "toolResult" && !rs.counters.wroteThisRun && !rowNotExecuted(m.details) && (prepared.toolEffects.get(wireOf("verify.wroteThisRunSeed", { toolName: rosterToolName(prepared.toolRosterDeltas.current, m.toolName) })) ?? "write") !== "read") {
179
180
  rs.counters.wroteThisRun = true;
180
181
  }
181
182
  }
@@ -3,6 +3,7 @@ import { type ExtraBodyDroppedSeatInput } from "./extra-body-dropped-seat.js";
3
3
  import type { PushQueue } from "../push-queue.js";
4
4
  import type { TaskEvent } from "../types.js";
5
5
  import type { RunInternals, RunState } from "./contracts.js";
6
+ import { type CapabilityWithheldRecord } from "./capability-withheld-seat.js";
6
7
  export interface RunBrainSinksInput {
7
8
  /** borrowed-mutable — the run's event queue: the `status` frames. */
8
9
  queue: PushQueue<TaskEvent>;
@@ -20,11 +21,13 @@ export interface RunBrainSinksInput {
20
21
  observeReasoningWireFacts: (facts: ReasoningWireFacts) => void;
21
22
  /** borrowed-readonly — the notice sink and the leg's ids; the fourth and fifth sinks' announcers are minted from them. */
22
23
  notice: ExtraBodyDroppedSeatInput;
24
+ /** borrowed-mutable — the session's announced record: the sixth sink's announcer says a withheld capability once per session. */
25
+ announced: CapabilityWithheldRecord;
23
26
  }
24
27
  export interface RunBrainSinksResult {
25
28
  /** Compose the three brain ALS sinks around a brain-driving call. */
26
29
  withBrainSinks: <T>(fn: () => Promise<T>) => Promise<T>;
27
- /** Compose the two leg-wide request sinks (the extraBody strip, the credential-origin refusal) around the whole leg. */
30
+ /** Compose the three leg-wide request sinks (the extraBody strip, the credential-origin refusal, the withheld capability) around the whole leg. */
28
31
  withLegRequestSinks: <T>(fn: () => Promise<T>) => Promise<T>;
29
32
  }
30
33
  export declare function runBrainSinks(input: RunBrainSinksInput): RunBrainSinksResult;
@@ -3,8 +3,9 @@ import { createExtraBodyDroppedScope } from "./extra-body-dropped-seat.js";
3
3
  import { createCredentialOriginRefusalScope } from "./credential-origin-seat.js";
4
4
  import { createSafeNotifier, observeThenableRejection } from "../safe-notify.js";
5
5
  import { emitTrace } from "../trace.js";
6
+ import { createCapabilityWithheldScope } from "./capability-withheld-seat.js";
6
7
  export function runBrainSinks(input) {
7
- const { queue, internals, rs, ident, observeReasoningWireFacts, notice } = input;
8
+ const { queue, internals, rs, ident, observeReasoningWireFacts, notice, announced } = input;
8
9
  const statusSinkNotifier = createSafeNotifier({
9
10
  onError: (f) => console.warn(`[sema-core] ${f.site}: run-internals status sink threw (contained; further failures counted, not re-disclosed): ${f.error.message}`),
10
11
  });
@@ -63,6 +64,7 @@ export function runBrainSinks(input) {
63
64
  const withBrainSinks = (fn) => runWithStatusSink(statusEmit, () => runWithBrainTelemetry(telemetryEmit, () => runWithReasoningWireFacts(observeReasoningWireFacts, fn)));
64
65
  const withExtraBodyDropped = createExtraBodyDroppedScope(notice);
65
66
  const withCredentialOriginRefusals = createCredentialOriginRefusalScope(notice);
66
- const withLegRequestSinks = (fn) => withExtraBodyDropped(() => withCredentialOriginRefusals(fn));
67
+ const withCapabilityWithheld = createCapabilityWithheldScope(notice, announced);
68
+ const withLegRequestSinks = (fn) => withExtraBodyDropped(() => withCredentialOriginRefusals(() => withCapabilityWithheld(fn)));
67
69
  return { withBrainSinks, withLegRequestSinks };
68
70
  }
@@ -11,11 +11,13 @@ import { advanceCadenceClock, reduceToolEnd } from "./turn-attachments.js";
11
11
  import { gatedCallIdOf } from "./park-commit.js";
12
12
  import { hasVerifiableStructureSignal } from "./grounding-signal.js";
13
13
  import { announceToolCall, batchResponseDigest, emitSettled } from "./tool-end-body.js";
14
- import { stampRowNotExecuted } from "./tool-not-executed.js";
14
+ import { neverExecuted, stampRowNotExecuted } from "./tool-not-executed.js";
15
+ import { extensionCallOf, noteExtensionCallDenied, requesterOf } from "../mods/extension-call.js";
15
16
  import { createResponseModelSeat } from "./response-model-seat.js";
16
17
  import { createToolCallIdFoldSeat } from "./tool-call-id-fold-seat.js";
17
18
  import { createFinishReasonSeat } from "./finish-reason-seat.js";
18
19
  import { createToolTurnIncompleteSeat } from "./tool-turn-repair-seat.js";
20
+ import { createWithheldShellEnvSeat } from "./shell-env-withheld.js";
19
21
  import { wireOf } from "../tool-name-readings.js";
20
22
  import { rosterToolName } from "../tool-roster.js";
21
23
  export function createHarnessHandlers(input) {
@@ -24,11 +26,12 @@ export function createHarnessHandlers(input) {
24
26
  const toolCallIdFoldSeat = createToolCallIdFoldSeat(deps.runnerHooks.onNotice, { sessionId: prepared.sessionId, runId: prepared.runId });
25
27
  const toolTurnIncompleteSeat = createToolTurnIncompleteSeat(deps.runnerHooks.onNotice, { sessionId: prepared.sessionId, runId: prepared.runId });
26
28
  const finishReasonSeat = createFinishReasonSeat(deps.runnerHooks.onNotice, { sessionId: prepared.sessionId, runId: prepared.runId });
29
+ const withheldShellEnvSeat = createWithheldShellEnvSeat(prepared, deps.runnerHooks.onNotice);
27
30
  const { spec, queue, internals, ident, pushContent, emitCommitted, startedToolCallIds, toolStartAt, toolProgress, writeFamilyOf, toolLabels, postToolBatchArmed, batchArgs, internalsNotifier, mediaByteCapBytes } = deps;
28
31
  const frames = { push: (f) => pushContent({ ...f, ...ident() }), structured: prepared.structuredProjector, mediaByteCapBytes };
29
32
  const startOf = (e) => {
30
33
  const label = toolLabels.get(e.toolName);
31
- return { toolCallId: e.toolCallId, spelledName: e.toolName, wireName: rosterToolName(prepared.toolRosterDeltas.current, e.toolName), ...(label !== undefined ? { label } : {}), args: e.args };
34
+ return { toolCallId: e.toolCallId, spelledName: e.toolName, wireName: rosterToolName(prepared.toolRosterDeltas.current, e.toolName), ...(label !== undefined ? { label } : {}), args: e.args, ...requesterOf(prepared.modBus, e.toolCallId) };
32
35
  };
33
36
  let lastWorkspaceCwd = prepared.cwdRef?.current;
34
37
  const announceWorkspaceMove = () => {
@@ -222,12 +225,15 @@ export function createHarnessHandlers(input) {
222
225
  const activityArg = primaryActivityArg(event.args);
223
226
  internalsNotifier.notify(() => observeThenableRejection(internals?.onActivity?.({ phase: "start", toolCallId: event.toolCallId, toolName: event.toolName, at: startAt, ...(activityArg !== undefined ? { arg: activityArg } : {}) }), internalsNotifier, "runtask.onActivity.start"), "runtask.onActivity.start");
224
227
  announceToolCall(prepared.toolOccurrences, startOf(event), frames);
228
+ withheldShellEnvSeat.onToolStart(event.toolName);
225
229
  };
226
230
  const onToolEnd = (event) => {
227
231
  const toolStarted = toolStartAt.get(event.toolCallId);
228
232
  toolStartAt.delete(event.toolCallId);
229
233
  const toolNow = Date.now();
230
- if (!rs.counters.wroteThisRun && (prepared.toolEffects.get(wireOf("verify.wroteThisRun", { toolName: rosterToolName(prepared.toolRosterDeltas.current, event.toolName) })) ?? "write") !== "read") {
234
+ const occ = prepared.toolOccurrences.get(event.toolCallId);
235
+ const ran = event.notExecuted !== true && !(occ !== undefined && neverExecuted(occ));
236
+ if (ran && !rs.counters.wroteThisRun && (prepared.toolEffects.get(wireOf("verify.wroteThisRun", { toolName: rosterToolName(prepared.toolRosterDeltas.current, event.toolName) })) ?? "write") !== "read") {
231
237
  rs.counters.wroteThisRun = true;
232
238
  }
233
239
  if (rs.attach.attachState !== undefined && !event.isError) {
@@ -236,7 +242,7 @@ export function createHarnessHandlers(input) {
236
242
  reduceToolEnd(rs.attach.attachState, det);
237
243
  }
238
244
  if (postToolBatchArmed) {
239
- if (prepared.blockedToolCalls.delete(event.toolCallId) || event.notExecuted === true) {
245
+ if (prepared.blockedToolCalls.delete(event.toolCallId) || !ran || extensionCallOf(prepared.modBus, event.toolCallId) !== undefined) {
240
246
  batchArgs?.delete(event.toolCallId);
241
247
  }
242
248
  else {
@@ -266,6 +272,8 @@ export function createHarnessHandlers(input) {
266
272
  ...(event.notExecuted === true ? { notExecuted: true } : {}),
267
273
  ...(() => { const id = prepared.abortController.signal.aborted ? gatedCallIdOf(prepared) : undefined; return id !== undefined ? { gatedCallIdOfRun: id } : {}; })(),
268
274
  }, frames);
275
+ if (settled.gate?.disposition.kind === "denied")
276
+ noteExtensionCallDenied(prepared.modBus, event.toolCallId);
269
277
  stampRowNotExecuted(event.result, settled.notExecuted === true);
270
278
  emitTrace(rs.telemetry.tracer, () => ({
271
279
  kind: "tool.call",
@@ -82,7 +82,7 @@ export interface RunLegInput<R> {
82
82
  unsubBoundary: () => void;
83
83
  /** borrowed-readonly — the git lane's harness-event release, called third. */
84
84
  unsub: () => void;
85
- /** borrowed-readonly — the Runner's deployment deps, read LIVE (`onError`, `hooks`, `onNotice`, `allowImageUrl`, `mediaByteCapBytes`; the resumed
85
+ /** borrowed-readonly — the Runner's deployment deps, read LIVE (`onError`, `hooks`, `onNotice`, `mediaByteCapBytes`; the resumed
86
86
  * decision's resolver files its execution record's word through `onNotice` too); the one home of why it is a seat and not a
87
87
  * captured object is {@link RunnerDepsSeat}. */
88
88
  runner: RunnerDepsSeat;