@sema-agent/core 7.47.0 → 7.49.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 (431) hide show
  1. package/CHANGELOG.md +472 -0
  2. package/README.md +2 -2
  3. package/dist/agents/cascade.d.ts +2 -5
  4. package/dist/agents/child-failure.d.ts +20 -0
  5. package/dist/agents/child-failure.js +28 -0
  6. package/dist/agents/cross-session-ref.d.ts +11 -3
  7. package/dist/agents/cross-session-ref.js +6 -0
  8. package/dist/agents/cumulative-stats.d.ts +12 -15
  9. package/dist/agents/cumulative-stats.js +1 -1
  10. package/dist/agents/extra-tool-names.js +1 -1
  11. package/dist/agents/inherited-tool-pool.d.ts +17 -13
  12. package/dist/agents/inherited-tool-pool.js +4 -3
  13. package/dist/agents/peer-session-drain.d.ts +3 -2
  14. package/dist/agents/peer-session-drain.js +5 -4
  15. package/dist/agents/send-message-tool.js +2 -9
  16. package/dist/agents/subagent.d.ts +10 -29
  17. package/dist/agents/subagent.js +65 -53
  18. package/dist/agents/suspend-guard.d.ts +1 -1
  19. package/dist/agents/tool-filter.d.ts +76 -65
  20. package/dist/agents/tool-filter.js +122 -92
  21. package/dist/agents/verify.d.ts +4 -7
  22. package/dist/agents/verify.js +6 -7
  23. package/dist/bench/metrics.d.ts +1 -2
  24. package/dist/brain/anthropic.js +133 -79
  25. package/dist/brain/errors.d.ts +53 -6
  26. package/dist/brain/errors.js +22 -2
  27. package/dist/brain/input-too-long.d.ts +40 -19
  28. package/dist/brain/input-too-long.js +3 -16
  29. package/dist/brain/open-responses.js +19 -10
  30. package/dist/brain/openai.js +123 -32
  31. package/dist/brain/provider-dialect.d.ts +214 -0
  32. package/dist/brain/provider-dialect.js +186 -0
  33. package/dist/brain/request-params.d.ts +27 -8
  34. package/dist/brain/request-params.js +7 -12
  35. package/dist/brain/request-route.d.ts +84 -0
  36. package/dist/brain/request-route.js +41 -0
  37. package/dist/brain/retry.d.ts +8 -0
  38. package/dist/brain/retry.js +10 -4
  39. package/dist/brain/route-adjudicator.d.ts +7 -0
  40. package/dist/brain/route-adjudicator.js +5 -1
  41. package/dist/brain/status-sink.d.ts +20 -0
  42. package/dist/brain/status-sink.js +11 -0
  43. package/dist/brain/stream-engine.d.ts +52 -1
  44. package/dist/brain/stream-engine.js +81 -24
  45. package/dist/brain/stream-shared.d.ts +57 -11
  46. package/dist/brain/stream-shared.js +28 -2
  47. package/dist/core/a2a.d.ts +1 -0
  48. package/dist/core/agent-config-dir.js +3 -2
  49. package/dist/core/allow-entry.d.ts +21 -12
  50. package/dist/core/allow-entry.js +39 -32
  51. package/dist/core/arg-summary.d.ts +17 -24
  52. package/dist/core/arg-summary.js +169 -68
  53. package/dist/core/ask-origin.d.ts +42 -24
  54. package/dist/core/ask-origin.js +18 -13
  55. package/dist/core/auto-mode-prompt-assets.d.ts +2 -2
  56. package/dist/core/auto-mode-prompt-assets.js +1 -1
  57. package/dist/core/auto-mode-prompt.d.ts +11 -1
  58. package/dist/core/auto-mode-prompt.js +13 -10
  59. package/dist/core/auto-mode-rebuild.d.ts +7 -0
  60. package/dist/core/auto-mode-rebuild.js +4 -1
  61. package/dist/core/canonical-json.d.ts +3 -0
  62. package/dist/core/canonical-json.js +2 -1
  63. package/dist/core/checkpoint-requirements.d.ts +892 -0
  64. package/dist/core/checkpoint-requirements.js +333 -0
  65. package/dist/core/checkpoint-store.d.ts +95 -66
  66. package/dist/core/checkpoint-store.js +14 -26
  67. package/dist/core/child-clamp-seats.d.ts +228 -69
  68. package/dist/core/child-clamp-seats.js +211 -17
  69. package/dist/core/classifier-unavailable-arm.d.ts +5 -1
  70. package/dist/core/classifier-unavailable-arm.js +3 -3
  71. package/dist/core/compliance.d.ts +3 -0
  72. package/dist/core/compliance.js +9 -4
  73. package/dist/core/credential-vocabulary.d.ts +140 -0
  74. package/dist/core/credential-vocabulary.js +131 -0
  75. package/dist/core/decision-receipt.js +1 -1
  76. package/dist/core/effective-path-target.d.ts +73 -16
  77. package/dist/core/effective-path-target.js +63 -33
  78. package/dist/core/engine-notice.d.ts +32 -7
  79. package/dist/core/file-history-store.js +2 -2
  80. package/dist/core/fs-write-gate-policy.d.ts +4 -0
  81. package/dist/core/fs-write-gate-policy.js +22 -5
  82. package/dist/core/gate-bounded-await.d.ts +28 -13
  83. package/dist/core/gate-bounded-await.js +41 -4
  84. package/dist/core/gate-fold.d.ts +1 -1
  85. package/dist/core/gate-fold.js +24 -25
  86. package/dist/core/gate-lanes.js +16 -15
  87. package/dist/core/gate-outcome.d.ts +20 -5
  88. package/dist/core/gate-outcome.js +5 -0
  89. package/dist/core/governance-codes.d.ts +11 -4
  90. package/dist/core/governance-codes.js +14 -3
  91. package/dist/core/hooks.d.ts +4 -0
  92. package/dist/core/locked-config.d.ts +8 -0
  93. package/dist/core/locked-config.js +14 -2
  94. package/dist/core/lsp.js +3 -5
  95. package/dist/core/mailbox-store.d.ts +3 -4
  96. package/dist/core/mcp-connection-pool.d.ts +75 -0
  97. package/dist/core/mcp-connection-pool.js +128 -0
  98. package/dist/core/mcp-failure.d.ts +2 -1
  99. package/dist/core/mcp-failure.js +13 -2
  100. package/dist/core/mcp-server-spec.d.ts +1 -1
  101. package/dist/core/mcp.d.ts +4 -0
  102. package/dist/core/mcp.js +70 -43
  103. package/dist/core/memory-engine/content-origin.js +2 -14
  104. package/dist/core/memory-engine/engine.d.ts +32 -22
  105. package/dist/core/memory-engine/engine.js +103 -55
  106. package/dist/core/memory-engine/file-backend.d.ts +13 -30
  107. package/dist/core/memory-engine/file-backend.js +37 -252
  108. package/dist/core/memory-engine/index.d.ts +1 -1
  109. package/dist/core/memory-engine/index.js +1 -1
  110. package/dist/core/memory-engine/layout.d.ts +139 -9
  111. package/dist/core/memory-engine/layout.js +350 -7
  112. package/dist/core/memory-engine/scope-contract.d.ts +10 -0
  113. package/dist/core/memory-engine/scope-contract.js +8 -0
  114. package/dist/core/memory-engine/session-incarnation.d.ts +14 -4
  115. package/dist/core/memory-engine/session-incarnation.js +5 -2
  116. package/dist/core/memory-engine/types.d.ts +10 -1
  117. package/dist/core/memory.js +5 -17
  118. package/dist/core/model-seat.d.ts +4 -4
  119. package/dist/core/model-seat.js +1 -1
  120. package/dist/core/mounted-mcp.d.ts +57 -0
  121. package/dist/core/mounted-mcp.js +19 -0
  122. package/dist/core/namespaced-rule-name.d.ts +29 -0
  123. package/dist/core/namespaced-rule-name.js +52 -0
  124. package/dist/core/park-selfcheck.d.ts +1 -1
  125. package/dist/core/park-selfcheck.js +16 -6
  126. package/dist/core/path-guard-rows.d.ts +99 -0
  127. package/dist/core/path-guard-rows.js +45 -0
  128. package/dist/core/path-identity.d.ts +22 -16
  129. package/dist/core/path-identity.js +10 -10
  130. package/dist/core/path-rule-binding.d.ts +2 -1
  131. package/dist/core/path-rule-binding.js +3 -1
  132. package/dist/core/pause-registry.d.ts +16 -2
  133. package/dist/core/pause-registry.js +6 -0
  134. package/dist/core/permission-rule-consent.js +0 -7
  135. package/dist/core/permission-rule-model.d.ts +68 -24
  136. package/dist/core/permission-rule-model.js +105 -24
  137. package/dist/core/permission-rule-store.js +2 -2
  138. package/dist/core/permission-rules.d.ts +3 -30
  139. package/dist/core/permission-rules.js +4 -54
  140. package/dist/core/read-root-candidate.d.ts +1 -3
  141. package/dist/core/read-root-candidate.js +4 -15
  142. package/dist/core/real-approval.d.ts +4 -3
  143. package/dist/core/retired-keys.d.ts +13 -0
  144. package/dist/core/retired-keys.js +14 -0
  145. package/dist/core/roles.d.ts +2 -3
  146. package/dist/core/roles.js +15 -6
  147. package/dist/core/runner/assemble-result.d.ts +0 -7
  148. package/dist/core/runner/assemble-result.js +19 -31
  149. package/dist/core/runner/caller-roster.d.ts +78 -0
  150. package/dist/core/runner/caller-roster.js +219 -0
  151. package/dist/core/runner/checkpoint-scope.d.ts +16 -16
  152. package/dist/core/runner/checkpoint-scope.js +2 -2
  153. package/dist/core/runner/child-tree.js +2 -2
  154. package/dist/core/runner/contracts.d.ts +68 -35
  155. package/dist/core/runner/decide-continuation.d.ts +51 -3
  156. package/dist/core/runner/decide-continuation.js +76 -21
  157. package/dist/core/runner/denial-limit-arms.d.ts +17 -5
  158. package/dist/core/runner/denial-limit-arms.js +11 -9
  159. package/dist/core/runner/extra-body-dropped-seat.d.ts +8 -0
  160. package/dist/core/runner/extra-body-dropped-seat.js +22 -0
  161. package/dist/core/runner/finish-reason-seat.d.ts +9 -0
  162. package/dist/core/runner/finish-reason-seat.js +40 -0
  163. package/dist/core/runner/gate-exit.d.ts +44 -32
  164. package/dist/core/runner/gate-exit.js +112 -25
  165. package/dist/core/runner/inherited-ask-grants.js +6 -4
  166. package/dist/core/runner/mcp-redial.d.ts +3 -3
  167. package/dist/core/runner/mcp-redial.js +3 -4
  168. package/dist/core/runner/park-commit.d.ts +1 -1
  169. package/dist/core/runner/permission-rule-lanes.d.ts +1 -2
  170. package/dist/core/runner/permission-rule-lanes.js +5 -4
  171. package/dist/core/runner/prepare-artifact.d.ts +4 -0
  172. package/dist/core/runner/prepare-artifact.js +2 -1
  173. package/dist/core/runner/prepare-ask-lane.d.ts +2 -0
  174. package/dist/core/runner/prepare-ask-lane.js +12 -6
  175. package/dist/core/runner/prepare-boundary-parks.d.ts +5 -8
  176. package/dist/core/runner/prepare-boundary-parks.js +4 -7
  177. package/dist/core/runner/prepare-caps-and-workflow.d.ts +11 -15
  178. package/dist/core/runner/prepare-caps-and-workflow.js +19 -27
  179. package/dist/core/runner/prepare-config-doors.d.ts +9 -9
  180. package/dist/core/runner/prepare-config-doors.js +10 -5
  181. package/dist/core/runner/prepare-defer-classify.d.ts +2 -2
  182. package/dist/core/runner/prepare-defer-classify.js +5 -3
  183. package/dist/core/runner/prepare-delegation-surface.d.ts +1 -1
  184. package/dist/core/runner/prepare-delegation-surface.js +3 -3
  185. package/dist/core/runner/prepare-gate-stations.d.ts +4 -4
  186. package/dist/core/runner/prepare-gate-stations.js +9 -7
  187. package/dist/core/runner/prepare-hands-readface.d.ts +7 -7
  188. package/dist/core/runner/prepare-hands-readface.js +7 -7
  189. package/dist/core/runner/prepare-inherited-gate.d.ts +7 -6
  190. package/dist/core/runner/prepare-inherited-gate.js +14 -15
  191. package/dist/core/runner/prepare-listings.d.ts +7 -24
  192. package/dist/core/runner/prepare-listings.js +4 -5
  193. package/dist/core/runner/prepare-memory-engine-session.d.ts +2 -0
  194. package/dist/core/runner/prepare-memory-engine-session.js +4 -3
  195. package/dist/core/runner/prepare-memory.d.ts +6 -0
  196. package/dist/core/runner/prepare-memory.js +13 -13
  197. package/dist/core/runner/prepare-offload-wrappers.d.ts +5 -0
  198. package/dist/core/runner/prepare-offload-wrappers.js +3 -3
  199. package/dist/core/runner/prepare-park-ask.d.ts +7 -8
  200. package/dist/core/runner/prepare-park-ask.js +17 -10
  201. package/dist/core/runner/prepare-policy-chain.js +24 -44
  202. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  203. package/dist/core/runner/prepare-project-context.js +3 -4
  204. package/dist/core/runner/prepare-protocol-tools.d.ts +9 -3
  205. package/dist/core/runner/prepare-protocol-tools.js +3 -4
  206. package/dist/core/runner/prepare-run-refs.d.ts +3 -0
  207. package/dist/core/runner/prepare-run-refs.js +2 -1
  208. package/dist/core/runner/prepare-safety-scan.d.ts +4 -8
  209. package/dist/core/runner/prepare-safety-scan.js +1 -2
  210. package/dist/core/runner/prepare-suspend-saga.d.ts +7 -1
  211. package/dist/core/runner/prepare-suspend-saga.js +28 -12
  212. package/dist/core/runner/prepare-task.d.ts +1 -1
  213. package/dist/core/runner/prepare-task.js +67 -56
  214. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -10
  215. package/dist/core/runner/prepare-wiring-manifest.js +5 -8
  216. package/dist/core/runner/resume-apply.js +7 -14
  217. package/dist/core/runner/resume-checkpoint-screen.js +11 -4
  218. package/dist/core/runner/resume-internals-and-config.js +2 -2
  219. package/dist/core/runner/resume-policy-outcome.js +5 -32
  220. package/dist/core/runner/resume-review-outcome.js +4 -1
  221. package/dist/core/runner/retired-runner-deps.d.ts +6 -0
  222. package/dist/core/runner/retired-runner-deps.js +10 -1
  223. package/dist/core/runner/run-brain-sinks.d.ts +4 -0
  224. package/dist/core/runner/run-brain-sinks.js +5 -2
  225. package/dist/core/runner/run-harness-handlers.js +27 -34
  226. package/dist/core/runner/run-leg.d.ts +0 -2
  227. package/dist/core/runner/run-leg.js +32 -33
  228. package/dist/core/runner/run-terminal-adoption.js +4 -3
  229. package/dist/core/runner/runtask.js +8 -8
  230. package/dist/core/runner/session-rule-policy.js +5 -5
  231. package/dist/core/runner/stream-settle-backstop.js +7 -4
  232. package/dist/core/runner/sub-agent-deny-lists.d.ts +51 -12
  233. package/dist/core/runner/sub-agent-deny-lists.js +111 -80
  234. package/dist/core/runner/terminal-account.d.ts +48 -0
  235. package/dist/core/runner/terminal-account.js +186 -0
  236. package/dist/core/runner/tool-end-body.d.ts +54 -17
  237. package/dist/core/runner/tool-end-body.js +27 -2
  238. package/dist/core/runner/tool-face-overlay.d.ts +3 -1
  239. package/dist/core/runner/tool-face-overlay.js +6 -4
  240. package/dist/core/runner/tool-occurrence.d.ts +106 -0
  241. package/dist/core/runner/tool-occurrence.js +123 -0
  242. package/dist/core/runner/tool-progress-lane.d.ts +16 -8
  243. package/dist/core/runner/tool-progress-lane.js +25 -34
  244. package/dist/core/runner/turn-attachments.d.ts +1 -1
  245. package/dist/core/runner/write-protection-station.d.ts +21 -9
  246. package/dist/core/runner/write-protection-station.js +20 -17
  247. package/dist/core/runner-deps.d.ts +12 -22
  248. package/dist/core/safety-axis-vocab.d.ts +1 -1
  249. package/dist/core/safety-merge-corpus.d.ts +1 -1
  250. package/dist/core/secret-env.d.ts +16 -5
  251. package/dist/core/secret-env.js +23 -63
  252. package/dist/core/sensitive-path-policy.d.ts +19 -18
  253. package/dist/core/sensitive-path-policy.js +73 -49
  254. package/dist/core/session-policy-store.d.ts +6 -3
  255. package/dist/core/session-policy-store.js +28 -10
  256. package/dist/core/session-reconcile.d.ts +3 -0
  257. package/dist/core/session-reconcile.js +5 -4
  258. package/dist/core/session-store.d.ts +5 -0
  259. package/dist/core/session-store.js +12 -0
  260. package/dist/core/session.d.ts +13 -0
  261. package/dist/core/shared-memory/normalize.d.ts +17 -4
  262. package/dist/core/shared-memory/normalize.js +7 -7
  263. package/dist/core/shell-lexer.js +5 -4
  264. package/dist/core/shell-wrapper-table.d.ts +2 -2
  265. package/dist/core/shell-wrapper-table.js +1 -1
  266. package/dist/core/skill-grant.js +1 -1
  267. package/dist/core/store-contracts/checkpoint-store-contract.js +13 -0
  268. package/dist/core/store-contracts/mailbox-store-contract.d.ts +7 -14
  269. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +27 -0
  270. package/dist/core/store-contracts/session-store-incarnation-contract.js +92 -0
  271. package/dist/core/stub-env.d.ts +2 -0
  272. package/dist/core/stub-env.js +1 -0
  273. package/dist/core/synthetic-read-verdict.js +2 -2
  274. package/dist/core/task-event.d.ts +59 -5
  275. package/dist/core/task-result.d.ts +1 -1
  276. package/dist/core/task-spec.d.ts +42 -9
  277. package/dist/core/terminal-cause.d.ts +94 -11
  278. package/dist/core/tighten-task-spec.d.ts +5 -4
  279. package/dist/core/tighten-task-spec.js +20 -25
  280. package/dist/core/tool-catalog-entries.d.ts +5 -7
  281. package/dist/core/tool-catalog-entries.js +14 -15
  282. package/dist/core/tool-face.d.ts +47 -0
  283. package/dist/core/tool-face.js +5 -0
  284. package/dist/core/tool-model-gate.d.ts +5 -5
  285. package/dist/core/tool-name-aliases.d.ts +35 -10
  286. package/dist/core/tool-name-aliases.js +15 -0
  287. package/dist/core/tool-name-list.d.ts +30 -0
  288. package/dist/core/tool-name-list.js +55 -0
  289. package/dist/core/tool-name-readings.d.ts +1 -9
  290. package/dist/core/tool-name-readings.js +1 -3
  291. package/dist/core/tool-policy.d.ts +195 -85
  292. package/dist/core/tool-policy.js +165 -381
  293. package/dist/core/tool-registry.d.ts +44 -1
  294. package/dist/core/tool-registry.js +26 -0
  295. package/dist/core/tool-roster.d.ts +19 -1
  296. package/dist/core/tool-roster.js +21 -2
  297. package/dist/core/tool-spec-members.d.ts +45 -0
  298. package/dist/core/tool-spec-members.js +169 -0
  299. package/dist/core/tool-spec.d.ts +46 -8
  300. package/dist/core/tools.d.ts +6 -2
  301. package/dist/core/tools.js +8 -4
  302. package/dist/core/untrusted-egress.js +29 -26
  303. package/dist/core/untrusted-text.d.ts +13 -10
  304. package/dist/core/untrusted-text.js +6 -44
  305. package/dist/core/workflow-journal-store.d.ts +4 -1
  306. package/dist/core/write-protect.d.ts +65 -29
  307. package/dist/core/write-protect.js +235 -177
  308. package/dist/engine/compaction/compaction.d.ts +2 -2
  309. package/dist/engine/execution-env/node-execution-env.d.ts +5 -23
  310. package/dist/engine/execution-env/node-execution-env.js +16 -38
  311. package/dist/engine/execution-env/symlink-chain.d.ts +23 -0
  312. package/dist/engine/execution-env/symlink-chain.js +32 -0
  313. package/dist/engine/harness/types.d.ts +7 -0
  314. package/dist/engine/llm/tool-turns.d.ts +3 -0
  315. package/dist/engine/llm/tool-turns.js +1 -0
  316. package/dist/engine/llm/types.d.ts +59 -23
  317. package/dist/engine/loop/agent-loop.js +16 -2
  318. package/dist/engine/session/memory-repo.js +11 -3
  319. package/dist/engine/session/repo-utils.d.ts +8 -0
  320. package/dist/engine/session/repo-utils.js +13 -0
  321. package/dist/index.d.ts +20 -23
  322. package/dist/index.js +17 -20
  323. package/dist/internal/harness.d.ts +1 -1
  324. package/dist/internal/harness.js +1 -1
  325. package/dist/internal/llm.d.ts +2 -2
  326. package/dist/internal/llm.js +1 -1
  327. package/dist/orchestration/governance-baseline-validity.js +1 -1
  328. package/dist/orchestration/run-spec.js +3 -3
  329. package/dist/orchestration/run-workflow-tool.d.ts +16 -35
  330. package/dist/orchestration/run-workflow-tool.js +38 -78
  331. package/dist/orchestration/workflow-governance.d.ts +21 -25
  332. package/dist/orchestration/workflow-governance.js +38 -78
  333. package/dist/orchestration/workflow-primitives.d.ts +7 -22
  334. package/dist/orchestration/workflow-primitives.js +5 -12
  335. package/dist/orchestration/workflow-types.d.ts +1 -1
  336. package/dist/orchestration/workflow.d.ts +61 -11
  337. package/dist/orchestration/workflow.js +191 -119
  338. package/dist/prompt-assembly/types.d.ts +1 -1
  339. package/dist/scenarios/full-body.d.ts +1 -1
  340. package/dist/shell/lex.d.ts +0 -21
  341. package/dist/shell/lex.js +278 -70
  342. package/dist/shell/shell-words.d.ts +35 -0
  343. package/dist/shell/shell-words.js +65 -0
  344. package/dist/stores/file/checkpoint-store.d.ts +5 -5
  345. package/dist/stores/file/checkpoint-store.js +5 -2
  346. package/dist/stores/file/index.d.ts +0 -8
  347. package/dist/stores/file/index.js +0 -12
  348. package/dist/stores/file/session-store.d.ts +3 -0
  349. package/dist/stores/file/session-store.js +44 -19
  350. package/dist/tools/artifact/artifact-tool.js +2 -0
  351. package/dist/tools/fs/bash-program-position.d.ts +17 -3
  352. package/dist/tools/fs/bash-program-position.js +25 -10
  353. package/dist/tools/fs/bash-readonly-classifier.d.ts +1 -1
  354. package/dist/tools/fs/bash-readonly-classifier.js +8 -7
  355. package/dist/tools/fs/containment-face.d.ts +4 -0
  356. package/dist/tools/fs/containment-face.js +3 -0
  357. package/dist/tools/fs/fs-shared.d.ts +10 -0
  358. package/dist/tools/fs/fs-shared.js +18 -0
  359. package/dist/tools/fs/fs-write.js +4 -2
  360. package/dist/tools/fs/index.d.ts +3 -2
  361. package/dist/tools/fs/index.js +2 -2
  362. package/dist/tools/fs/program-read-model.d.ts +99 -23
  363. package/dist/tools/fs/program-read-model.js +129 -55
  364. package/dist/tools/fs/program-read-model.rows.d.ts +0 -14
  365. package/dist/tools/fs/program-read-model.rows.js +18 -10
  366. package/dist/tools/fs/read-deny-home.d.ts +35 -30
  367. package/dist/tools/fs/read-deny-home.js +45 -38
  368. package/dist/tools/fs/read-deny.d.ts +35 -27
  369. package/dist/tools/fs/read-deny.js +126 -92
  370. package/dist/tools/fs/removal-targets.d.ts +56 -23
  371. package/dist/tools/fs/removal-targets.js +74 -87
  372. package/dist/tools/fs/safety.d.ts +29 -22
  373. package/dist/tools/fs/safety.js +17 -11
  374. package/dist/tools/fs/search.js +10 -8
  375. package/dist/tools/fs/shell-read-argv.d.ts +4 -7
  376. package/dist/tools/fs/shell-read-argv.js +6 -8
  377. package/dist/tools/fs/shell-read-bindings.d.ts +203 -46
  378. package/dist/tools/fs/shell-read-bindings.js +488 -144
  379. package/dist/tools/fs/shell-read-builtins.d.ts +35 -0
  380. package/dist/tools/fs/shell-read-builtins.js +43 -0
  381. package/dist/tools/fs/shell-read-check.d.ts +15 -1
  382. package/dist/tools/fs/shell-read-check.js +51 -42
  383. package/dist/tools/fs/shell-read-establish.js +9 -10
  384. package/dist/tools/fs/shell-read-functions.d.ts +22 -0
  385. package/dist/tools/fs/shell-read-functions.js +29 -0
  386. package/dist/tools/fs/shell-read-judge.d.ts +48 -18
  387. package/dist/tools/fs/shell-read-judge.js +33 -4
  388. package/dist/tools/fs/shell-read-plan.d.ts +13 -20
  389. package/dist/tools/fs/shell-read-plan.js +200 -194
  390. package/dist/tools/fs/shell-read-start.d.ts +80 -0
  391. package/dist/tools/fs/shell-read-start.js +99 -0
  392. package/dist/tools/fs/shell-read-word.d.ts +35 -6
  393. package/dist/tools/fs/shell-read-word.js +89 -9
  394. package/dist/tools/fs/shell-read-workdir.d.ts +156 -0
  395. package/dist/tools/fs/shell-read-workdir.js +281 -0
  396. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -2
  397. package/dist/tools/fs/shell-read-write-targets.js +14 -5
  398. package/dist/tools/fs/shell-reentry-text.d.ts +26 -26
  399. package/dist/tools/fs/shell-reentry-text.js +31 -34
  400. package/dist/tools/task-list.d.ts +1 -2
  401. package/dist/tools/web.js +1 -1
  402. package/package.json +4 -1
  403. package/test/export-surface.snapshot.json +107 -143
  404. package/wire-changes/core@7.48.0.json +252 -0
  405. package/wire-changes/core@7.49.0.json +4765 -0
  406. package/dist/agents/teacher.d.ts +0 -159
  407. package/dist/agents/teacher.js +0 -577
  408. package/dist/agents/team.d.ts +0 -226
  409. package/dist/agents/team.js +0 -257
  410. package/dist/core/strategy-store.d.ts +0 -238
  411. package/dist/core/strategy-store.js +0 -253
  412. package/dist/orchestration/builtin-workflows.d.ts +0 -133
  413. package/dist/orchestration/builtin-workflows.js +0 -159
  414. package/dist/scenarios/env.d.ts +0 -40
  415. package/dist/scenarios/env.js +0 -39
  416. package/dist/scenarios/scenario-registry.d.ts +0 -110
  417. package/dist/scenarios/scenario-registry.js +0 -140
  418. package/dist/scenarios/teacher-quickstart.d.ts +0 -40
  419. package/dist/scenarios/teacher-quickstart.js +0 -12
  420. package/dist/stores/cc/lockfile.d.ts +0 -10
  421. package/dist/stores/cc/lockfile.js +0 -98
  422. package/dist/stores/cc/mailbox-store.d.ts +0 -20
  423. package/dist/stores/cc/mailbox-store.js +0 -255
  424. package/dist/stores/cc/roster-adapter.d.ts +0 -12
  425. package/dist/stores/cc/roster-adapter.js +0 -117
  426. package/dist/stores/cc/sidecar-transcript.d.ts +0 -97
  427. package/dist/stores/cc/sidecar-transcript.js +0 -264
  428. package/dist/stores/cc/task-list-store.d.ts +0 -2
  429. package/dist/stores/cc/task-list-store.js +0 -125
  430. package/dist/stores/file/strategy-store.d.ts +0 -97
  431. package/dist/stores/file/strategy-store.js +0 -341
@@ -1,6 +1,7 @@
1
1
  import { forkGovernanceDenial, resolveDelegationEntryCaps } from "../../agents/subagent.js";
2
2
  import { isLiveQuestionFace } from "../ask-question.js";
3
3
  import { parentSpecSeatOf } from "../parent-spec-seat.js";
4
+ import { childClampSeats, clampSourceOf } from "../child-clamp-seats.js";
4
5
  import { createPreToolUseConstraintPolicy } from "../hooks.js";
5
6
  import { continuesLineage } from "../session-policy-store.js";
6
7
  import { StubExecutionEnv } from "../stub-env.js";
@@ -91,7 +92,6 @@ export function prepareInheritedGate(input) {
91
92
  const ancestorRulesNow = () => inheritedAncestorRules === undefined ? undefined : inheritedAncestorRules.map((a, i) => ancestorSessionRulesRef.current.get(i) ?? a);
92
93
  const memoryAdmittedOrgScopesRef = { current: [] };
93
94
  const ownOrgVerdictRef = { current: undefined };
94
- const orgAdmissionCheckpointState = () => inheritedAdmittedOrgScopes !== undefined || ownOrgVerdictRef.current !== undefined || orgGovernedProvenance;
95
95
  const faceCheckpointSection = () => {
96
96
  const resolvedReadFace = input.resolvedReadFace();
97
97
  const handsLessResolvedFace = input.handsLessResolvedFace();
@@ -110,15 +110,11 @@ export function prepareInheritedGate(input) {
110
110
  }
111
111
  return undefined;
112
112
  };
113
- const faceCheckpointState = () => faceCheckpointSection() !== undefined;
114
113
  const writeFaceCheckpointSection = () => {
115
114
  const seat = input.resolvedWriteFace() ?? input.handsLessResolvedWriteFace();
116
115
  return seat === undefined ? undefined : seat.inForce() === "open" ? { face: "open" } : seat.fenced ? { face: "roots" } : undefined;
117
116
  };
118
117
  const skillGrantCheckpointSection = () => frozenSkillGrants(skillGrants);
119
- const f012CheckpointState = () => (inheritedParentConstraints?.length ?? 0) > 0 ||
120
- seedInheritedGate?.constraintChain !== undefined ||
121
- internals?.delegationProvenance !== undefined;
122
118
  const frozenOnAsk = askSeat.value;
123
119
  const hookEnvSource = (ownedEnv ?? deps.executionEnv) != null ? executionEnv : undefined;
124
120
  const notifyOwnHookCrash = (err) => {
@@ -198,17 +194,23 @@ export function prepareInheritedGate(input) {
198
194
  };
199
195
  const carrierReadFace = () => input.resolvedReadFace() ?? input.handsLessResolvedFace();
200
196
  const carrierWriteFace = () => (input.resolvedWriteFace() ?? input.handsLessResolvedWriteFace())?.inForce();
197
+ const runClampSource = () => ({
198
+ ...clampSourceOf(spec, "clamp"),
199
+ readFace: carrierReadFace(),
200
+ writeFace: carrierWriteFace(),
201
+ readDenyPatterns: input.readDenyAdditionsNormalized(),
202
+ approvalReach: askSeat.reach,
203
+ });
201
204
  const fullShellReachable = handsEnabled &&
202
205
  !(executionEnv instanceof StubExecutionEnv) &&
203
206
  spec.handsReadOnly !== true &&
204
207
  spec.excludeAllTools !== true &&
205
- !(toolFaceSnapshot.exclude?.includes("Bash") ?? false);
208
+ toolFaceSnapshot.selector.admits({ name: "Bash" });
206
209
  const { gateStopRef, stopForDenialLimit } = createDenialLimitStop({ sessionId, runId, onNotice: deps.onNotice, abort: abortRun });
207
210
  const delegationEntryCapsResolved = resolveDelegationEntryCaps(deps.delegationEntryCaps);
208
211
  const enrichSpecToolCtx = (ctx) => {
209
212
  const agentForkDenial = input.agentForkDenial();
210
213
  const observersActive = input.observersActive();
211
- const readDenyAdditionsNormalized = input.readDenyAdditionsNormalized();
212
214
  const autoModeDecider = input.autoModeDecider();
213
215
  const centerAdoption = input.centerAdoption();
214
216
  return {
@@ -220,18 +222,14 @@ export function prepareInheritedGate(input) {
220
222
  thinkingLevel: harnessRef.current?.getThinkingLevel(),
221
223
  principal: spec.principal,
222
224
  ...(frozenOnAsk !== undefined ? { onAsk: frozenOnAsk } : {}),
223
- ...(askSeat.reach !== undefined ? { approvalReach: askSeat.reach } : {}),
225
+ ...childClampSeats(runClampSource()),
224
226
  ...(frozenOnQuestion !== undefined ? { onQuestion: frozenOnQuestion } : {}),
225
- ...(spec.handsReadOnly === true ? { handsReadOnly: true } : {}),
226
- ...(carrierReadFace() === "roots" ? { readFace: "roots" } : {}),
227
- ...(carrierWriteFace() === "roots" ? { writeFace: "roots" } : {}),
228
- ...(readDenyAdditionsNormalized.length > 0 ? { readDenyPatterns: Object.freeze(readDenyAdditionsNormalized.map((e) => ({ ...e }))) } : {}),
229
- ...(spec.interactiveTools === false ? { interactiveTools: false } : {}),
230
227
  oneShot: spec.oneShot,
231
228
  mountsCallerTool,
229
+ ...(input.mountedMcp !== undefined ? { mountedMcp: input.mountedMcp } : {}),
232
230
  parentSpecSeat,
233
231
  ...(internals?.questionFaceStripped === true ? { questionFaceStripped: true } : {}),
234
- excludeTools: toolFaceSnapshot.exclude,
232
+ toolSelector: toolFaceSnapshot.selector,
235
233
  deferTools: toolFaceSnapshot.defer,
236
234
  alwaysLoadTools: toolFaceSnapshot.alwaysLoad,
237
235
  ...(toolFaceSnapshot.restoreGated !== undefined ? { restoreGatedTools: toolFaceSnapshot.restoreGated } : {}),
@@ -265,6 +263,7 @@ export function prepareInheritedGate(input) {
265
263
  ...(autoModeDecider ? { autoModeReview: { decider: autoModeDecider } } : {}),
266
264
  ...(spec.durableApproval !== undefined ? { durableApprovalForChildren: { ...spec.durableApproval } } : {}),
267
265
  ...(input.checkpointSeat !== undefined ? { checkpointStoreForChildren: input.checkpointSeat } : {}),
266
+ checkpointScopeForChildren: input.checkpointScope,
268
267
  taskId: hostTaskId,
269
268
  ...(internals?.parentTaskId !== undefined ? { parentTaskId: internals.parentTaskId } : {}),
270
269
  ...(internals?.parentSessionId !== undefined ? { parentSessionId: internals.parentSessionId } : {}),
@@ -305,5 +304,5 @@ export function prepareInheritedGate(input) {
305
304
  ...(spec.enablePlanMode === true ? { enterPlanMode } : {}),
306
305
  };
307
306
  };
308
- return { liveInheritedGate, seedInheritedGate, inheritedAncestorRules, inheritedShellGate, inheritedParentConstraints, permissionMode, commitModeSeats, endModeCeiling, inheritedAdmittedOrgScopes, priorOwnOrgVerdict, orgGovernedProvenance, effectiveShellGate, ownSessionRulesRef, ancestorSessionRulesRef, ancestorRulesNow, memoryAdmittedOrgScopesRef, ownOrgVerdictRef, orgAdmissionCheckpointState, faceCheckpointSection, faceCheckpointState, writeFaceCheckpointSection, skillGrantCheckpointSection, f012CheckpointState, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, frozenOnQuestion, parentSpecSeat, provenanceForChildrenRef, delegationSettlementRef, inheritedGateForChildren, carrierReadFace, carrierWriteFace, fullShellReachable, gateStopRef, stopForDenialLimit, enrichSpecToolCtx };
307
+ return { liveInheritedGate, seedInheritedGate, inheritedAncestorRules, inheritedShellGate, inheritedParentConstraints, permissionMode, commitModeSeats, endModeCeiling, inheritedAdmittedOrgScopes, priorOwnOrgVerdict, orgGovernedProvenance, effectiveShellGate, ownSessionRulesRef, ancestorSessionRulesRef, ancestorRulesNow, memoryAdmittedOrgScopesRef, ownOrgVerdictRef, runClampSource, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, frozenOnQuestion, parentSpecSeat, provenanceForChildrenRef, delegationSettlementRef, inheritedGateForChildren, carrierReadFace, carrierWriteFace, fullShellReachable, gateStopRef, stopForDenialLimit, enrichSpecToolCtx };
309
308
  }
@@ -1,31 +1,11 @@
1
- /**
2
- * PrepareTask's LISTINGS phase: the sub-agent tool lists' audit (`sub-agent-deny-lists.ts`),
3
- * the agent-listing announce face read off the
4
- * delegation tool's roster (with its deferred / excluded / removal-to-zero arms), the two listing
5
- * opt-out advisories, the announced-listings mirror seeded from the once-per-session ledger, the
6
- * deferred roster's ToolSearch ride, and the date_change seam. The body is the driver's stretch moved
7
- * verbatim; the interface is the dependency list it had implicitly.
8
- *
9
- * SYNCHRONOUS FUNCTION, SYNCHRONOUS CALL: the stretch has no await, so the phase adds no yield between
10
- * the disclosure mount before it and the context-lane seats after it (a stretch
11
- * with no await is extracted as a sync function — an `async` wrapper would open a microtask window).
12
- *
13
- * Throws pass through unchanged: `config.agent.unknown_tool` (a denied-tools entry that names no
14
- * tool — one judgment for every list a deployment writes, in `sub-agent-deny-lists.ts`).
15
- */
16
- import type { AgentTool } from "../../internal/harness.js";
17
1
  import type { TaskSpec } from "../types.js";
18
2
  import type { AnnounceOnceSink, DateAnchorRead, Prepared, PrepareResume, ToolFaceSnapshot } from "./contracts.js";
19
3
  import type { AnnouncedListingSnapshot } from "../../internal/harness.js";
20
4
  import type { ResolvedSkillListingBudget } from "../skill-listing-budget.js";
21
5
  export interface PrepareListingsInput {
22
- /** borrowed-readonly — the REBOUND spec (`spec′`). Read: `agents` (the audit's subject), `tools`
23
- * (the roster-bearing delegation tool, by its `agentListing` marker), `sessionId` (continuation
24
- * ⇒ seeded/removal projections), `attachments` (the two opt-outs). Never mutated. */
6
+ /** borrowed-readonly — the REBOUND spec (`spec′`). Read: `tools` (the roster-bearing delegation tool, by its `agentListing`
7
+ * marker), `sessionId` (continuation ⇒ seeded/removal projections), `attachments` (the two opt-outs). Never mutated. */
25
8
  spec: Pick<TaskSpec, "agents" | "tools" | "sessionId" | "attachments">;
26
- /** borrowed-readonly — the FULLY ASSEMBLED mount array (names + aliases = the audit's universe).
27
- * Read only; this phase never mutates the roster. */
28
- tools: ReadonlyArray<AgentTool>;
29
9
  /** borrowed-readonly — the once-per-session ledger: its deduplicated operator sink (`onError`) and
30
10
  * the whole announced snapshot (`arms()`) the mirror is seeded from. */
31
11
  onceLedger: AnnounceOnceSink & {
@@ -33,12 +13,15 @@ export interface PrepareListingsInput {
33
13
  };
34
14
  /** borrowed-readonly — the acquired session's id (operator-line context). */
35
15
  sessionId: string;
36
- /** borrowed-readonly — the frozen tool face: `exclude` / `defer` decide the roster face's arm. */
37
- toolFaceSnapshot: Pick<ToolFaceSnapshot, "exclude" | "defer">;
16
+ /** borrowed-readonly — the frozen tool face: the selector and `defer` decide the roster face's arm. */
17
+ toolFaceSnapshot: Pick<ToolFaceSnapshot, "selector" | "defer">;
38
18
  /** borrowed-readonly — the activated deferred names as of prepare (transcript replay / checkpoint
39
19
  * seed); only `has()` is read: an already-ACTIVE roster tool un-defers its listing face. The set
40
20
  * keeps mutating mid-run (ToolSearch activations) — this phase reads it once, here. */
41
21
  activeTools: ReadonlySet<string>;
22
+ /** borrowed-readonly — the leg's EFFECTIVE deferred set (the defer classification's answer): a name the caller listed in `deferTools`
23
+ * is deferred only if it is in here — a leg whose selector leaves ToolSearch out defers nothing, so its roster tool ships inline with its listing. */
24
+ deferred: ReadonlySet<string>;
42
25
  /** borrowed-readonly — the durable-resume carrier: presence (seedAnnounced) and
43
26
  * `seed.announcedListings.agents` (the removal-to-zero projection's gate). */
44
27
  resume: Pick<PrepareResume, "seed"> | undefined;
@@ -1,18 +1,17 @@
1
1
  import { formatLocalDate } from "../../prompts/default.js";
2
- import { auditSubAgentToolLists } from "./sub-agent-deny-lists.js";
3
2
  import { SKILL_TOOL_NAME } from "./synthetic-tools.js";
4
3
  import { renderAgentListingDelta } from "./turn-attachments.js";
5
4
  export function prepareListings(input) {
6
- const { spec, tools, onceLedger, sessionId, toolFaceSnapshot, activeTools, resume, skillsListing, listingBudget, listingRideRef, renderWithDate, envFacts, tzValid, userTz, dateAnchor } = input;
7
- auditSubAgentToolLists({ spec, tools, onceLedger, sessionId });
5
+ const { spec, onceLedger, sessionId, toolFaceSnapshot, activeTools, deferred, resume, skillsListing, listingBudget, listingRideRef, renderWithDate, envFacts, tzValid, userTz, dateAnchor } = input;
8
6
  const rosterBearingSpec = (spec.tools ?? []).find((t) => t.agentListing !== undefined && t.agentListing.length > 0);
9
7
  const rosterFaceDeferred = rosterBearingSpec !== undefined &&
10
- !(toolFaceSnapshot.exclude?.includes(rosterBearingSpec.name) ?? false) &&
8
+ toolFaceSnapshot.selector.admits(rosterBearingSpec) &&
11
9
  (toolFaceSnapshot.defer?.includes(rosterBearingSpec.name) ?? false) &&
10
+ deferred.has(rosterBearingSpec.name) &&
12
11
  !activeTools.has(rosterBearingSpec.name);
13
12
  const agentListingSpec = rosterBearingSpec !== undefined &&
14
13
  !rosterFaceDeferred &&
15
- !(toolFaceSnapshot.exclude?.includes(rosterBearingSpec.name) ?? false)
14
+ toolFaceSnapshot.selector.admits(rosterBearingSpec)
16
15
  ? rosterBearingSpec
17
16
  : undefined;
18
17
  const agentListing = agentListingSpec
@@ -38,6 +38,8 @@ export interface PrepareMemoryEngineSessionInput {
38
38
  externalContentTargetActive: boolean;
39
39
  /** borrowed-readonly — the frozen preflight; only `mcp` (the declared entries the announcement walks). */
40
40
  lockedPreflight: Pick<LockedPreflight, "mcp">;
41
+ /** borrowed-readonly — the run's MCP mount, read at call time (present iff the run declared a server): the children a delegation tool spawns inherit it, so its tools are rows of their pool. */
42
+ mountedMcp?: () => import("../mounted-mcp.js").MountedMcp;
41
43
  /** borrowed-readonly — the materialized MCP handle; only `statuses` (the announcement's mounted-tool count). */
42
44
  mcp: Pick<MaterializedMcp, "statuses">;
43
45
  /** borrowed-readonly — the acquired session id (notice detail). */
@@ -1,4 +1,5 @@
1
1
  import { classifyToolContentOrigin, contentOriginPollutes, delegationCallIsExternal } from "../memory-engine/content-origin.js";
2
+ import { mountedMcpPoolRows } from "../mounted-mcp.js";
2
3
  import { narrowContentSafety, readCardAttestation } from "../memory-engine/delegation-provenance.js";
3
4
  import { recordSyncUnattestable, sessionSettlements } from "../memory-engine/delegation-settlement.js";
4
5
  import { protocolOf } from "../protocol-table.js";
@@ -8,7 +9,7 @@ import { fileArgPath } from "../../tools/fs/safety.js";
8
9
  import { RosterBuilder } from "../tool-roster.js";
9
10
  import { thrownText } from "../thrown-value.js";
10
11
  export function prepareMemoryEngineSession(input) {
11
- const { memoryEngineSession, internals, memoryDelegationEvidence, externalContentTargetActive, lockedPreflight, mcp, sessionId, runId, deps, provenanceForChildrenRef, delegationSettlementRef, spec, envHandToolNames, roster, contentOriginWrapRef } = input;
12
+ const { memoryEngineSession, internals, memoryDelegationEvidence, externalContentTargetActive, lockedPreflight, mcp, mountedMcp, sessionId, runId, deps, provenanceForChildrenRef, delegationSettlementRef, spec, envHandToolNames, roster, contentOriginWrapRef } = input;
12
13
  const tools = roster.tools;
13
14
  const delegationProvenanceChannel = internals?.delegationProvenance;
14
15
  if (memoryEngineSession !== undefined || delegationProvenanceChannel !== undefined) {
@@ -53,7 +54,7 @@ export function prepareMemoryEngineSession(input) {
53
54
  const withFaces = t;
54
55
  if (withFaces.agentToolFaces === undefined && t.agentListing === undefined)
55
56
  continue;
56
- delegationByName.set(t.name, { faces: withFaces.agentToolFaces, pool: withFaces.agentToolPool });
57
+ delegationByName.set(t.name, { faces: withFaces.agentToolFaces, pool: withFaces.agentToolPool, inheritsMcp: t.agentToolInheritsMcp === true });
57
58
  }
58
59
  const poolToolPollutes = (t) => contentOriginPollutes(classifyToolContentOrigin({
59
60
  declared: t.contentOrigin,
@@ -128,7 +129,7 @@ export function prepareMemoryEngineSession(input) {
128
129
  const external = delegationCallIsExternal({
129
130
  requestedType: typeof requested === "string" ? requested : undefined,
130
131
  faces: delegation.faces,
131
- pool: delegation.pool,
132
+ pool: delegation.pool !== undefined && delegation.inheritsMcp && mountedMcp !== undefined ? [...delegation.pool, ...mountedMcpPoolRows(mountedMcp())] : delegation.pool,
132
133
  isPolluting: poolToolPollutes,
133
134
  });
134
135
  const result = await inner(toolCallId, params, signal, onUpdate);
@@ -140,6 +140,9 @@ export interface PrepareMemoryInput {
140
140
  * record-query walk, so a source that flips WHILE the fork runs suppresses it live.
141
141
  */
142
142
  captureForkOrigin?: string;
143
+ /** borrowed-readonly — the occupant of {@link captureForkOrigin} the fork COPIED (`SessionMetadata.forkedFromIncarnation`);
144
+ * absent ⇒ unknown, which binds the source's records whoever holds that id now. */
145
+ captureForkOriginIncarnation?: string;
143
146
  /** borrowed-readonly — design/383 §2.5 (rescan, codex adversarial round): the fork-lineage read itself FAULTED
144
147
  * (session metadata unreadable): whether this session forks an opted-out source is unknowable,
145
148
  * so the capture arm runs INDETERMINATE (suppress fail-closed, disclose, mint nothing) — a
@@ -156,6 +159,9 @@ export interface PrepareMemoryInput {
156
159
  sessionId: string;
157
160
  controlDir?: string;
158
161
  }>;
162
+ /** borrowed-readonly — the ACQUIRED session's own `incarnation` (prepare-task's one metadata read): the engines'
163
+ * occupant seat answers this run's id from it and from nothing else; absent ⇒ unknown (binds). */
164
+ sessionIncarnation?: string;
159
165
  /**
160
166
  * borrowed-readonly — the org-memory admission context (ruled 2026-08-05), assembled by
161
167
  * prepare-task:
@@ -1,7 +1,7 @@
1
1
  import { isAbsolute, sep } from "node:path";
2
2
  import { deliverEngineNotice } from "../types.js";
3
3
  import { admitMemoryScopes } from "../memory-admission.js";
4
- import { adoptLegacyRepoDirs, canonicalize, deriveRepoControlPlaneDir, deriveProjectControlDir, deriveProjectMemoryDir, deriveRepoMemoryDir, drainMemoryAnnouncements, enqueueMemoryAnnouncement, isContainedIn, lookupProjectIdHint, recordProjectIdHint, resolveMemoryEngineRoot } from "../memory-engine/layout.js";
4
+ import { adoptLegacyRepoDirs, canonicalize, deriveRepoControlPlaneDir, deriveProjectControlDir, deriveProjectMemoryDir, deriveRepoMemoryDir, drainMemoryAnnouncements, effectiveControlRootOf, enqueueMemoryAnnouncement, isContainedIn, lookupProjectIdHint, recordProjectIdHint, resolveMemoryEngineRoot } from "../memory-engine/layout.js";
5
5
  import { classifyScopePlanes, derivePersonalControlDir, derivePersonalMemoryDir, mergeHarvestReports, mergeInjections, needsDualRoots, parsedProjectPlane } from "../memory-engine/dual-root.js";
6
6
  import { memoryProjectScopeAbsentNotice, normalizeMemorySpec } from "../memory.js";
7
7
  import { deriveSupersededSet } from "../memory-engine/consolidation.js";
@@ -9,6 +9,7 @@ import { shadowNamesOf } from "../memory-engine/shadowing.js";
9
9
  import { MEMORY_ANNOUNCEMENT_CAPTURE_OPTOUT_CODA, MEMORY_ANNOUNCEMENT_READONLY_CODA, MEMORY_CAPTURE_INDETERMINATE_NOTICE, MEMORY_CAPTURE_OPTOUT_NOTICE, MEMORY_PREFERENCE_DISCIPLINE, MEMORY_READONLY_NOTICE, MemoryEngine, entryFileHeadCarriesOrigin, memoryCaptureOptedOutNotice, memoryCaptureOptOutUnpersistedNotice, memoryConsolidationRecommendedNotice, memoryHarvestQuarantinedNotice, memoryHoldNotices, memoryRecallDisciplineSegment, memoryRestoreWithheldNotice, memorySessionPollutedNotice, pollutionContainmentCounts, } from "../memory-engine/engine.js";
10
10
  import { adjudicateCaptureOptOut, captureOptOutDeniedError, captureOptOutUnpersistedError } from "./memory-capture-optout.js";
11
11
  import { readSessionCaptureOptOut } from "../memory-engine/layout.js";
12
+ import { sessionIncarnationResolver } from "../memory-engine/session-incarnation.js";
12
13
  import { createMemoryEngineTools } from "../memory-engine/tools.js";
13
14
  import { assertScopeContractPlacement, parseScopeKey, resolveProjectId } from "../memory-engine/scope-contract.js";
14
15
  import { FileMemoryEngineBackend } from "../memory-engine/file-backend.js";
@@ -97,6 +98,8 @@ export async function prepareMemory(input) {
97
98
  if (useMemoryEngine && memorySpec) {
98
99
  try {
99
100
  const backend = deps.memoryBackend;
101
+ const lineageTokens = new Map(input.captureForkOrigin !== undefined && input.captureForkOriginIncarnation !== undefined ? [[input.captureForkOrigin, input.captureForkOriginIncarnation]] : []);
102
+ const incarnationOpt = { sessionIncarnation: sessionIncarnationResolver(sessionId, input.sessionIncarnation, lineageTokens) };
100
103
  const pinned = backend.directoryRoot;
101
104
  const engineRoot = resolveMemoryEngineRoot(deps.memoryEngineDir);
102
105
  const repoRoot = deps.rootPath ?? taskRootPath;
@@ -156,6 +159,7 @@ export async function prepareMemory(input) {
156
159
  : identityKey !== undefined
157
160
  ? deriveProjectMemoryDir(engineRoot, identityKey)
158
161
  : deriveRepoMemoryDir(engineRoot, repoRoot);
162
+ const projectControlDir = identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveRepoControlPlaneDir(engineRoot, repoRoot);
159
163
  const planes = memorySpec.scopeContract === "v2" ? classifyScopePlanes(memorySpec.scopes, memorySpec.writeScope) : undefined;
160
164
  const dual = planes !== undefined && needsDualRoots(planes);
161
165
  const personalOnly = planes !== undefined && !dual && planes.project.length === 0 && planes.writePlane !== "project" && (planes.personal.length > 0 || planes.writePlane === "personal");
@@ -170,15 +174,11 @@ export async function prepareMemory(input) {
170
174
  }
171
175
  const personalMemoryDir = derivePersonalMemoryDir(engineRoot);
172
176
  const personalControlDir = derivePersonalControlDir(engineRoot);
173
- const effectiveControlDir = (b, fallback) => {
174
- const pinnedCtl = b.controlPlaneRoot;
175
- return typeof pinnedCtl === "string" && pinnedCtl ? pinnedCtl : fallback;
176
- };
177
- const captureStoreOpt = (b, fallback) => deps.memoryCaptureRecordStore !== undefined ? { captureRecordStore: deps.memoryCaptureRecordStore({ controlDir: effectiveControlDir(b, fallback) }) } : {};
177
+ const captureStoreOpt = (dir, b, configured) => deps.memoryCaptureRecordStore !== undefined ? { captureRecordStore: deps.memoryCaptureRecordStore({ controlDir: effectiveControlRootOf(dir, { pinnedBy: b, controlDir: configured }) }) } : {};
178
178
  const choosePersonalBackend = () => typeof pinned === "string" && pinned ? new FileMemoryEngineBackend(personalMemoryDir, { controlDir: personalControlDir }) : backend;
179
179
  const createPersonalEngine = (personalBackend) => {
180
180
  return {
181
- engine: new MemoryEngine({ backend: personalBackend, memoryDir: personalMemoryDir, controlDir: personalControlDir, onIncident: onEngineIncident, provenance: input.memoryProvenance, ...captureStoreOpt(personalBackend, personalControlDir), ...(deps.memorySessionIncarnation !== undefined ? { sessionIncarnation: deps.memorySessionIncarnation } : {}), ...(input.deps.memoryConsolidation !== undefined ? { consolidation: input.deps.memoryConsolidation } : {}) }),
181
+ engine: new MemoryEngine({ backend: personalBackend, memoryDir: personalMemoryDir, controlDir: personalControlDir, onIncident: onEngineIncident, provenance: input.memoryProvenance, ...captureStoreOpt(personalMemoryDir, personalBackend, personalControlDir), ...incarnationOpt, ...(input.deps.memoryConsolidation !== undefined ? { consolidation: input.deps.memoryConsolidation } : {}) }),
182
182
  backend: personalBackend,
183
183
  };
184
184
  };
@@ -341,8 +341,8 @@ export async function prepareMemory(input) {
341
341
  if (dual) {
342
342
  const personalBackendChosen = choosePersonalBackend();
343
343
  {
344
- const projCtl = effectiveControlDir(backend, identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveRepoControlPlaneDir(engineRoot, repoRoot));
345
- const persCtl = effectiveControlDir(personalBackendChosen, personalControlDir);
344
+ const projCtl = effectiveControlRootOf(memoryDir, { pinnedBy: backend, controlDir: projectControlDir });
345
+ const persCtl = effectiveControlRootOf(personalMemoryDir, { pinnedBy: personalBackendChosen, controlDir: personalControlDir });
346
346
  const overlap = (a, b) => isContainedIn(a, b) || isContainedIn(b, a);
347
347
  const refuse = (what, a, b) => {
348
348
  const e = new Error(`memory dual-root configuration error: ${what} overlap (${canonicalize(a)} vs ${canonicalize(b)}) — the planes' data roots and control planes must all be disjoint.`);
@@ -363,10 +363,10 @@ export async function prepareMemory(input) {
363
363
  const projectEngine = new MemoryEngine({
364
364
  backend,
365
365
  memoryDir,
366
- controlDir: identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveRepoControlPlaneDir(engineRoot, repoRoot),
366
+ controlDir: projectControlDir,
367
367
  onIncident: onEngineIncident,
368
368
  provenance: input.memoryProvenance,
369
- ...captureStoreOpt(backend, identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveRepoControlPlaneDir(engineRoot, repoRoot)), ...(deps.memorySessionIncarnation !== undefined ? { sessionIncarnation: deps.memorySessionIncarnation } : {}),
369
+ ...captureStoreOpt(memoryDir, backend, projectControlDir), ...incarnationOpt,
370
370
  ...(input.deps.memoryConsolidation !== undefined ? { consolidation: input.deps.memoryConsolidation } : {}),
371
371
  });
372
372
  const personal = createPersonalEngine(personalBackendChosen);
@@ -472,10 +472,10 @@ export async function prepareMemory(input) {
472
472
  const engine = new MemoryEngine({
473
473
  backend,
474
474
  memoryDir,
475
- controlDir: identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveRepoControlPlaneDir(engineRoot, repoRoot),
475
+ controlDir: projectControlDir,
476
476
  onIncident: onEngineIncident,
477
477
  provenance: input.memoryProvenance,
478
- ...captureStoreOpt(backend, identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveRepoControlPlaneDir(engineRoot, repoRoot)), ...(deps.memorySessionIncarnation !== undefined ? { sessionIncarnation: deps.memorySessionIncarnation } : {}),
478
+ ...captureStoreOpt(memoryDir, backend, projectControlDir), ...incarnationOpt,
479
479
  ...(input.deps.memoryConsolidation !== undefined ? { consolidation: input.deps.memoryConsolidation } : {}),
480
480
  });
481
481
  await armCaptureOptOut(engine);
@@ -16,10 +16,15 @@ import { type ToolResultStore } from "../tool-result-store.js";
16
16
  import type { AgentTool } from "../../internal/harness.js";
17
17
  import type { NestedUsage, NestedUsageAccum, RunnerDeps, TaskSpec } from "../types.js";
18
18
  import type { PrepareResume } from "./contracts.js";
19
+ import type { ToolSelector } from "../tool-face.js";
19
20
  export interface PrepareOffloadWrappersInput {
20
21
  /** borrowed-readonly — the REBOUND spec (the config-doors result); read for the per-task coarse
21
22
  * offload knob only. */
22
23
  spec: Pick<TaskSpec, "toolResultThresholdChars">;
24
+ /** borrowed-readonly — the leg's compiled selector: an offloaded result is read back through the reader tool, so a leg whose selector
25
+ * does not admit the reader (a sub-agent whose lists leave it out, a deployment that excludes it) offloads nothing — a preview that
26
+ * sends the model to a tool it does not have is a dead end. */
27
+ selector: Pick<ToolSelector, "admits">;
23
28
  /** borrowed-readonly — the deployment's coarse offload knob and its injected store (used AS-IS when
24
29
  * present; a Runner-shared instance is viewed per task, see the body). */
25
30
  deps: Pick<RunnerDeps, "toolResultThresholdChars" | "toolResultStore">;
@@ -1,8 +1,8 @@
1
- import { DEFAULT_TOOL_RESULT_THRESHOLD_CHARS, InMemoryToolResultStore, RunnerSharedToolResultStore, ScopedToolResultStore, withToolResultOffload, } from "../tool-result-store.js";
1
+ import { DEFAULT_TOOL_RESULT_THRESHOLD_CHARS, InMemoryToolResultStore, OFFLOAD_TOOL_NAME, RunnerSharedToolResultStore, ScopedToolResultStore, withToolResultOffload, } from "../tool-result-store.js";
2
2
  import { faceOf } from "../tool-roster.js";
3
3
  const FIRST_PARTY_OFFLOAD_THRESHOLD_CHARS = 50_000;
4
4
  export function prepareOffloadWrappers(input) {
5
- const { spec, deps, resume, offloadScope, sessionId } = input;
5
+ const { spec, deps, resume, offloadScope, sessionId, selector } = input;
6
6
  const nestedStats = { tokens: 0, turns: 0, tasks: 0, costMicroUsd: 0, anyUnpriced: false };
7
7
  if (resume) {
8
8
  nestedStats.tokens = resume.seed.nestedStats.tokens;
@@ -21,7 +21,7 @@ export function prepareOffloadWrappers(input) {
21
21
  };
22
22
  const explicitGlobalThreshold = spec.toolResultThresholdChars ?? deps.toolResultThresholdChars;
23
23
  const offloadThreshold = explicitGlobalThreshold ?? DEFAULT_TOOL_RESULT_THRESHOLD_CHARS;
24
- const offloadEnabled = Number.isFinite(offloadThreshold) && offloadThreshold > 0;
24
+ const offloadEnabled = Number.isFinite(offloadThreshold) && offloadThreshold > 0 && selector.admits({ name: OFFLOAD_TOOL_NAME });
25
25
  const rawOffloadStore = offloadEnabled ? (deps.toolResultStore ?? new InMemoryToolResultStore()) : undefined;
26
26
  const offloadStore = rawOffloadStore instanceof RunnerSharedToolResultStore
27
27
  ? new ScopedToolResultStore(rawOffloadStore, offloadScope)
@@ -42,9 +42,12 @@ export interface PrepareParkAskInput {
42
42
  * `parkOnlyHandle` (the pause target), `suspendLoopCapHit`, `serializeCheckpointState`, `inFlightSpendMicroUsd`,
43
43
  * `compensatePausedVM` (the pause-then-cut arm), `commitSuspendSaga` (the point of no return). */
44
44
  saga: SuspendSaga | undefined;
45
- /** borrowed-readonly — the REBOUND spec. Read: `principal` (the question's source identity, the unattended re-scope, the
46
- * row's identity record), `retainBackgroundProcesses` (the park-only sweep gate). Never mutated. */
45
+ /** borrowed-readonly — the REBOUND spec. Read: `principal` (the question's source identity, the row's identity record),
46
+ * `retainBackgroundProcesses` (the park-only sweep gate). Never mutated. */
47
47
  spec: Pick<TaskSpec, "principal" | "retainBackgroundProcesses">;
48
+ /** borrowed-readonly — this leg's checkpoint scope (the driver's one `checkpointScopeOf` derivation): the scope every row
49
+ * this closure mints is filed under. */
50
+ checkpointScope: string;
48
51
  /** borrowed-readonly — the deployment's error face, as a Pick over the SAME `deps` object (receiver preserved for
49
52
  * `deps.onError?.()`): the park refusals' disclosure, the pin failure. */
50
53
  deps: Pick<RunnerDeps, "onError">;
@@ -101,6 +104,8 @@ export interface PrepareParkAskInput {
101
104
  stampCallTarget: CallTargetStamp | undefined;
102
105
  /** borrowed-readonly — the SAME seat the live gate stamps from ({@link import("./prepare-ask-lane.js").PrepareAskLaneInput.advertisedWritableDirs}): a parked call's projection re-adjudication asks one question about one call, so it must ask it against the same admitted list. Read at park time, not written here. */
103
106
  advertisedWritableDirs: Pick<AdvertisedWritableDirs, "roots"> | undefined;
107
+ /** borrowed-readonly — the leg's ONE exempt root, the SAME list the live gate stamps ({@link import("./prepare-ask-lane.js").PrepareAskLaneInput.exemptRoots}). */
108
+ exemptRoots: readonly string[];
104
109
  /** borrowed-readonly — the run's offload store, or undefined (a volatile store holding results refuses the park). */
105
110
  offloadStore: ToolResultStore | undefined;
106
111
  /** borrowed-readonly — the per-task owned env, or undefined (a non-remote per-task env refuses the park). Never destroyed. */
@@ -138,12 +143,6 @@ export interface PrepareParkAskInput {
138
143
  totalBudgetMicroUsd?: number;
139
144
  totalTokens?: number;
140
145
  } | undefined;
141
- /** borrowed-readonly — the inherited-gate phase's three version-stamp predicates (face / F-012 / org admission). */
142
- faceCheckpointState: () => boolean;
143
- /** borrowed-readonly — see `faceCheckpointState`. */
144
- f012CheckpointState: () => boolean;
145
- /** borrowed-readonly — see `faceCheckpointState`. */
146
- orgAdmissionCheckpointState: () => boolean;
147
146
  /** borrowed-readonly — the policy-chain phase's rule-offer factory (the row's suggestion members). */
148
147
  ruleOffersOf: ReturnType<typeof createRuleOffersOf>;
149
148
  /** borrowed-readonly — the policy-chain phase's Skill-card binding factory: a parked `Skill` call's row carries the named skill and
@@ -1,22 +1,22 @@
1
1
  import { uuidv7 } from "../../engine/session/uuid.js";
2
2
  import { Value } from "typebox/value";
3
- import { ASK_USER_QUESTION_TOOL_NAME, classifyQuestionOutcome, validateAskQuestions } from "../ask-question.js";
3
+ import { classifyQuestionOutcome, validateAskQuestions } from "../ask-question.js";
4
4
  import { hasBackgroundShell, sweepBackgroundShells, sweepRunBoundaryBackgroundShells } from "../background-shell.js";
5
5
  import { boundInputHashOf } from "../canonical-json.js";
6
- import { buildRiskDescriptor, checkpointVersionFor, debitLedger, encodeAtFidelity, mintCheckpointId, mintCheckpointToken, resolveDeclaredFidelity, samePlainValue, } from "../checkpoint-store.js";
6
+ import { unencodableIn } from "../checkpoint-requirements.js";
7
+ import { buildRiskDescriptor, debitLedger, encodeAtFidelity, mintCheckpointId, mintCheckpointToken, resolveDeclaredFidelity, samePlainValue, } from "../checkpoint-store.js";
7
8
  import { pauseOf } from "../pause-registry.js";
8
9
  import { askCarryRowMembers } from "../hooks.js";
9
10
  import { askMandateMember, ownedClearanceFacts } from "../ask-origin.js";
10
11
  import { defaultTaskRegistry } from "../task-registry.js";
11
- import { advertisedWritableRootsSeat, isLiveApproverSeat, carriesBidiControls, describeThrown, refuseOutOfContractDecision, tryCloneArgs } from "../tool-policy.js";
12
+ import { advertisedWritableRootsSeat, exemptRootsSeat, isLiveApproverSeat, carriesBidiControls, describeThrown, refuseOutOfContractDecision, tryCloneArgs } from "../tool-policy.js";
12
13
  import { InMemoryToolResultStore, ScopedToolResultStore, isVolatileOffloadStore } from "../tool-result-store.js";
13
14
  import { raceAbort, raceSettlementAgainstSignal } from "./abort-race.js";
14
- import { checkpointScopeOf } from "./checkpoint-scope.js";
15
15
  import { CONTENT_ASK_BINDING_CAP } from "./content-ask-bindings.js";
16
16
  import { DEFAULT_UNATTENDED_APPROVAL_TTL_MS, publishCommittedSuspend, sanitizedTtlMs } from "./park-commit.js";
17
17
  import { remoteEnvFailureNote } from "./remote-env-retry.js";
18
- import { callFaceSeat, parkedToolIdentity, parkedToolFace } from "../tool-roster.js";
19
- import { seatOf, wireOf } from "../tool-name-readings.js";
18
+ import { approvalCardMemberOf, callFaceSeat, engineCardOf, parkedToolIdentity, parkedToolFace } from "../tool-roster.js";
19
+ import { seatOf } from "../tool-name-readings.js";
20
20
  class ParkRefusal extends Error {
21
21
  constructor(message, options) {
22
22
  super(message, options);
@@ -27,7 +27,7 @@ const wordlessDemand = (toolName) => {
27
27
  throw new Error(`a real-approval demand for "${toolName}" reached the park with no origin word — the origin stamp precedes every park`);
28
28
  };
29
29
  export function prepareParkAsk(input) {
30
- const { askLane, saga, spec, deps, sessionId, checkpointStore, toolRosterDeltas, parkLaneArmed, contentAskRoutable, liveQuestionFace, mountedQuestionTool, contentAskBindings, lateStrandedAnswers, discloseStrandedAnswers, onAsk, runtimeCaps, inheritedUnavailableAsks, basePolicyForResumeEdit, budgetSnapshot, handsCwdRef, handsRoot, stampCallTarget, advertisedWritableDirs, offloadStore, ownedEnv, incompleteSuspendAdapter, session, sessions, suspendChainBase, maxSuspends, remoteEnvFailures, shellGatedTools, irreversibilityTier, toolMarkSources, effectiveShellGate, durableApproval, priorLedger, liveSpendRef, resourceTotal, faceCheckpointState, f012CheckpointState, orgAdmissionCheckpointState, ruleOffersOf, grantBindingOf, now, humanReviewRef, abortController, harness, pausedRef } = input;
30
+ const { askLane, saga, spec, deps, sessionId, checkpointStore, checkpointScope, toolRosterDeltas, parkLaneArmed, contentAskRoutable, liveQuestionFace, mountedQuestionTool, contentAskBindings, lateStrandedAnswers, discloseStrandedAnswers, onAsk, runtimeCaps, inheritedUnavailableAsks, basePolicyForResumeEdit, budgetSnapshot, handsCwdRef, handsRoot, stampCallTarget, advertisedWritableDirs, exemptRoots, offloadStore, ownedEnv, incompleteSuspendAdapter, session, sessions, suspendChainBase, maxSuspends, remoteEnvFailures, shellGatedTools, irreversibilityTier, toolMarkSources, effectiveShellGate, durableApproval, priorLedger, liveSpendRef, resourceTotal, ruleOffersOf, grantBindingOf, now, humanReviewRef, abortController, harness, pausedRef } = input;
31
31
  if (askLane === undefined || saga === undefined)
32
32
  return { parkAsk: undefined };
33
33
  const { composedCallSignal, approvalPreviewOf } = askLane;
@@ -115,7 +115,8 @@ export function prepareParkAsk(input) {
115
115
  };
116
116
  const suspendAsk = parkLaneArmed && checkpointStore !== undefined
117
117
  ? async (req, postHookArgs, safety, liveFaceUnavailable, realApproval, allowRuleShadowed, askDecisionReason, probeReason, probeCause, segmentCoverage, matchedAskRule, probeMandated, carry) => {
118
- const syncFirstEligible = wireOf("park.syncFirstRoute", req) === ASK_USER_QUESTION_TOOL_NAME ? contentAskRoutable(req.toolCallId) : isLiveApproverSeat(onAsk);
118
+ const contentAsk = engineCardOf(req) === "question";
119
+ const syncFirstEligible = contentAsk ? contentAskRoutable(req.toolCallId) : isLiveApproverSeat(onAsk);
119
120
  if (syncFirstEligible &&
120
121
  runtimeCaps?.forceDurableGate !== true &&
121
122
  liveFaceUnavailable !== true &&
@@ -148,6 +149,9 @@ export function prepareParkAsk(input) {
148
149
  `a durable approval row must hold an inert snapshot of exactly what a human approves and a resume executes`, { cause: captured.cause });
149
150
  }
150
151
  const parkedArgs = captured.value;
152
+ const unencodable = unencodableIn(parkedArgs, "pendingAction.args");
153
+ if (unencodable !== undefined)
154
+ throw new ParkRefusal(`the arguments of "${req.toolName}" cannot be bound into the approval row's digest (${unencodable.kind} at ${unencodable.path}) — a durable approval row must hold an inert snapshot of exactly what a human approves and a resume executes`);
151
155
  const projectionMovedArgs = backendFidelity !== "structured-clone" && !samePlainValue(parked.value, parkedArgs);
152
156
  if (projectionMovedArgs && basePolicyForResumeEdit === undefined) {
153
157
  throw new ParkRefusal(`the arguments of "${req.toolName}" change shape when stored by this checkpoint backend, and no policy is wired to re-adjudicate the stored shape ` +
@@ -167,6 +171,7 @@ export function prepareParkAsk(input) {
167
171
  ...callFaceSeat(req.face),
168
172
  ...(handsCwdRef !== undefined ? { cwd: handsCwdRef.current } : {}), ...(handsRoot !== undefined ? { root: handsRoot } : {}),
169
173
  ...advertisedWritableRootsSeat(advertisedWritableDirs),
174
+ ...exemptRootsSeat(exemptRoots),
170
175
  });
171
176
  const withReading = stampCallTarget?.(reprojectedReq(), cutSignal);
172
177
  const reprojectedRaced = await raceSettlementAgainstSignal(withReading === undefined ? Promise.resolve(basePolicyForResumeEdit.check(reprojectedReq(), cutSignal)) : withReading.then((r) => basePolicyForResumeEdit.check(r, cutSignal)), cutSignal);
@@ -252,6 +257,7 @@ export function prepareParkAsk(input) {
252
257
  ? `human approval required before safety-tightened tool "${req.toolName}"`
253
258
  : `real human approval required for tool "${req.toolName}" (non-budgetable: ${rowRealApproval.origin})`,
254
259
  toolName: req.toolName,
260
+ ...approvalCardMemberOf(req),
255
261
  ...(safety !== undefined ? { safetyAxis: safety } : {}),
256
262
  ...(rowRealApproval !== undefined ? { realApproval: rowRealApproval } : {}),
257
263
  riskDescriptor,
@@ -261,15 +267,17 @@ export function prepareParkAsk(input) {
261
267
  kind: "human",
262
268
  reason: `human approval required for tool "${req.toolName}"`,
263
269
  toolName: req.toolName,
270
+ ...approvalCardMemberOf(req),
264
271
  riskDescriptor,
265
272
  }
266
273
  : {
267
274
  kind: "irreversible_ask",
268
275
  reason: `human approval required before irreversible tool "${req.toolName}"`,
269
276
  toolName: req.toolName,
277
+ ...approvalCardMemberOf(req),
270
278
  riskDescriptor,
271
279
  };
272
- const scope = durableApproval?.scope || checkpointScopeOf({ principal: spec.principal });
280
+ const scope = checkpointScope;
273
281
  const ttlMs = sanitizedTtlMs(durableApproval?.ttlMs);
274
282
  const checkpointState = serializeCheckpointState(remoteHandle, inFlightSpendMicroUsd());
275
283
  if (rowRealApproval !== undefined && checkpointState.readFace !== undefined) {
@@ -294,7 +302,6 @@ export function prepareParkAsk(input) {
294
302
  cp = {
295
303
  token,
296
304
  checkpointId: mintCheckpointId(),
297
- version: checkpointVersionFor({ resource: false, binding: true, token: approvalLedger.totalTokens !== undefined, orgAdmission: orgAdmissionCheckpointState(), f012: f012CheckpointState(), realApproval: rowRealApproval !== undefined, face: faceCheckpointState() }),
298
305
  scope,
299
306
  sessionId,
300
307
  leafId,