@sema-agent/core 7.48.0 → 7.49.1

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 (421) hide show
  1. package/CHANGELOG.md +457 -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 +38 -31
  51. package/dist/core/arg-summary.d.ts +21 -28
  52. package/dist/core/arg-summary.js +235 -88
  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 +94 -65
  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 +43 -11
  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 +21 -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.d.ts +4 -0
  101. package/dist/core/mcp.js +70 -43
  102. package/dist/core/memory-engine/content-origin.js +2 -14
  103. package/dist/core/memory-engine/engine.d.ts +32 -22
  104. package/dist/core/memory-engine/engine.js +103 -55
  105. package/dist/core/memory-engine/file-backend.d.ts +13 -30
  106. package/dist/core/memory-engine/file-backend.js +37 -252
  107. package/dist/core/memory-engine/index.d.ts +1 -1
  108. package/dist/core/memory-engine/index.js +1 -1
  109. package/dist/core/memory-engine/layout.d.ts +139 -9
  110. package/dist/core/memory-engine/layout.js +350 -7
  111. package/dist/core/memory-engine/scope-contract.d.ts +10 -0
  112. package/dist/core/memory-engine/scope-contract.js +8 -0
  113. package/dist/core/memory-engine/session-incarnation.d.ts +14 -4
  114. package/dist/core/memory-engine/session-incarnation.js +5 -2
  115. package/dist/core/memory-engine/types.d.ts +10 -1
  116. package/dist/core/memory.js +5 -17
  117. package/dist/core/model-seat.d.ts +4 -4
  118. package/dist/core/model-seat.js +1 -1
  119. package/dist/core/mounted-mcp.d.ts +57 -0
  120. package/dist/core/mounted-mcp.js +19 -0
  121. package/dist/core/namespaced-rule-name.d.ts +29 -0
  122. package/dist/core/namespaced-rule-name.js +52 -0
  123. package/dist/core/park-selfcheck.d.ts +1 -1
  124. package/dist/core/park-selfcheck.js +16 -6
  125. package/dist/core/path-guard-rows.d.ts +99 -0
  126. package/dist/core/path-guard-rows.js +45 -0
  127. package/dist/core/path-identity.d.ts +22 -16
  128. package/dist/core/path-identity.js +10 -10
  129. package/dist/core/path-rule-binding.d.ts +2 -1
  130. package/dist/core/path-rule-binding.js +3 -1
  131. package/dist/core/pause-registry.d.ts +16 -2
  132. package/dist/core/pause-registry.js +6 -0
  133. package/dist/core/permission-rule-consent.js +0 -7
  134. package/dist/core/permission-rule-model.d.ts +68 -24
  135. package/dist/core/permission-rule-model.js +105 -24
  136. package/dist/core/permission-rule-store.js +2 -2
  137. package/dist/core/permission-rules.d.ts +3 -30
  138. package/dist/core/permission-rules.js +4 -54
  139. package/dist/core/read-root-candidate.d.ts +1 -3
  140. package/dist/core/read-root-candidate.js +4 -15
  141. package/dist/core/real-approval.d.ts +4 -3
  142. package/dist/core/retired-keys.d.ts +13 -0
  143. package/dist/core/retired-keys.js +14 -0
  144. package/dist/core/roles.d.ts +2 -3
  145. package/dist/core/roles.js +15 -6
  146. package/dist/core/runner/assemble-result.d.ts +0 -7
  147. package/dist/core/runner/assemble-result.js +19 -31
  148. package/dist/core/runner/caller-roster.d.ts +78 -0
  149. package/dist/core/runner/caller-roster.js +219 -0
  150. package/dist/core/runner/checkpoint-scope.d.ts +16 -16
  151. package/dist/core/runner/checkpoint-scope.js +2 -2
  152. package/dist/core/runner/child-tree.js +2 -2
  153. package/dist/core/runner/contracts.d.ts +68 -35
  154. package/dist/core/runner/decide-continuation.d.ts +51 -3
  155. package/dist/core/runner/decide-continuation.js +76 -21
  156. package/dist/core/runner/denial-limit-arms.d.ts +17 -5
  157. package/dist/core/runner/denial-limit-arms.js +11 -9
  158. package/dist/core/runner/extra-body-dropped-seat.d.ts +8 -0
  159. package/dist/core/runner/extra-body-dropped-seat.js +22 -0
  160. package/dist/core/runner/finish-reason-seat.d.ts +9 -0
  161. package/dist/core/runner/finish-reason-seat.js +40 -0
  162. package/dist/core/runner/gate-exit.d.ts +44 -32
  163. package/dist/core/runner/gate-exit.js +112 -25
  164. package/dist/core/runner/inherited-ask-grants.js +6 -4
  165. package/dist/core/runner/mcp-redial.d.ts +3 -3
  166. package/dist/core/runner/mcp-redial.js +3 -4
  167. package/dist/core/runner/permission-rule-lanes.d.ts +1 -2
  168. package/dist/core/runner/permission-rule-lanes.js +5 -4
  169. package/dist/core/runner/prepare-artifact.d.ts +4 -0
  170. package/dist/core/runner/prepare-artifact.js +2 -1
  171. package/dist/core/runner/prepare-ask-lane.d.ts +2 -0
  172. package/dist/core/runner/prepare-ask-lane.js +12 -6
  173. package/dist/core/runner/prepare-boundary-parks.d.ts +5 -8
  174. package/dist/core/runner/prepare-boundary-parks.js +4 -7
  175. package/dist/core/runner/prepare-caps-and-workflow.d.ts +11 -15
  176. package/dist/core/runner/prepare-caps-and-workflow.js +19 -27
  177. package/dist/core/runner/prepare-config-doors.d.ts +9 -9
  178. package/dist/core/runner/prepare-config-doors.js +10 -5
  179. package/dist/core/runner/prepare-defer-classify.d.ts +2 -2
  180. package/dist/core/runner/prepare-defer-classify.js +5 -3
  181. package/dist/core/runner/prepare-delegation-surface.d.ts +1 -1
  182. package/dist/core/runner/prepare-delegation-surface.js +3 -3
  183. package/dist/core/runner/prepare-gate-stations.d.ts +4 -4
  184. package/dist/core/runner/prepare-gate-stations.js +9 -7
  185. package/dist/core/runner/prepare-hands-readface.d.ts +7 -7
  186. package/dist/core/runner/prepare-hands-readface.js +7 -7
  187. package/dist/core/runner/prepare-inherited-gate.d.ts +7 -6
  188. package/dist/core/runner/prepare-inherited-gate.js +14 -15
  189. package/dist/core/runner/prepare-listings.d.ts +7 -24
  190. package/dist/core/runner/prepare-listings.js +4 -5
  191. package/dist/core/runner/prepare-memory-engine-session.d.ts +2 -0
  192. package/dist/core/runner/prepare-memory-engine-session.js +4 -3
  193. package/dist/core/runner/prepare-memory.d.ts +6 -0
  194. package/dist/core/runner/prepare-memory.js +13 -13
  195. package/dist/core/runner/prepare-offload-wrappers.d.ts +5 -0
  196. package/dist/core/runner/prepare-offload-wrappers.js +3 -3
  197. package/dist/core/runner/prepare-park-ask.d.ts +7 -8
  198. package/dist/core/runner/prepare-park-ask.js +17 -10
  199. package/dist/core/runner/prepare-policy-chain.js +24 -44
  200. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  201. package/dist/core/runner/prepare-project-context.js +3 -4
  202. package/dist/core/runner/prepare-protocol-tools.d.ts +9 -3
  203. package/dist/core/runner/prepare-protocol-tools.js +3 -4
  204. package/dist/core/runner/prepare-run-refs.d.ts +3 -0
  205. package/dist/core/runner/prepare-run-refs.js +2 -1
  206. package/dist/core/runner/prepare-safety-scan.d.ts +4 -8
  207. package/dist/core/runner/prepare-safety-scan.js +1 -2
  208. package/dist/core/runner/prepare-suspend-saga.d.ts +7 -1
  209. package/dist/core/runner/prepare-suspend-saga.js +28 -12
  210. package/dist/core/runner/prepare-task.d.ts +1 -1
  211. package/dist/core/runner/prepare-task.js +67 -56
  212. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -10
  213. package/dist/core/runner/prepare-wiring-manifest.js +5 -8
  214. package/dist/core/runner/resume-apply.js +7 -14
  215. package/dist/core/runner/resume-checkpoint-screen.js +11 -4
  216. package/dist/core/runner/resume-internals-and-config.js +2 -2
  217. package/dist/core/runner/resume-policy-outcome.js +5 -32
  218. package/dist/core/runner/resume-review-outcome.js +4 -1
  219. package/dist/core/runner/retired-runner-deps.d.ts +6 -0
  220. package/dist/core/runner/retired-runner-deps.js +10 -1
  221. package/dist/core/runner/run-brain-sinks.d.ts +4 -0
  222. package/dist/core/runner/run-brain-sinks.js +5 -2
  223. package/dist/core/runner/run-harness-handlers.js +29 -36
  224. package/dist/core/runner/run-leg.d.ts +0 -2
  225. package/dist/core/runner/run-leg.js +32 -33
  226. package/dist/core/runner/run-terminal-adoption.js +4 -3
  227. package/dist/core/runner/runtask.js +8 -8
  228. package/dist/core/runner/session-rule-policy.js +5 -5
  229. package/dist/core/runner/stream-settle-backstop.js +7 -4
  230. package/dist/core/runner/sub-agent-deny-lists.d.ts +51 -12
  231. package/dist/core/runner/sub-agent-deny-lists.js +111 -80
  232. package/dist/core/runner/terminal-account.d.ts +48 -0
  233. package/dist/core/runner/terminal-account.js +186 -0
  234. package/dist/core/runner/tool-end-body.d.ts +54 -17
  235. package/dist/core/runner/tool-end-body.js +27 -2
  236. package/dist/core/runner/tool-face-overlay.d.ts +3 -1
  237. package/dist/core/runner/tool-face-overlay.js +6 -4
  238. package/dist/core/runner/tool-occurrence.d.ts +106 -0
  239. package/dist/core/runner/tool-occurrence.js +123 -0
  240. package/dist/core/runner/tool-progress-lane.d.ts +16 -8
  241. package/dist/core/runner/tool-progress-lane.js +25 -34
  242. package/dist/core/runner/tool-turn-repair-seat.d.ts +28 -4
  243. package/dist/core/runner/tool-turn-repair-seat.js +36 -13
  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/secret-env.d.ts +16 -5
  249. package/dist/core/secret-env.js +23 -63
  250. package/dist/core/sensitive-path-policy.d.ts +19 -18
  251. package/dist/core/sensitive-path-policy.js +73 -49
  252. package/dist/core/session-reconcile.d.ts +3 -0
  253. package/dist/core/session-reconcile.js +5 -4
  254. package/dist/core/session-store.d.ts +5 -0
  255. package/dist/core/session-store.js +12 -0
  256. package/dist/core/session.d.ts +13 -0
  257. package/dist/core/shared-memory/normalize.d.ts +17 -4
  258. package/dist/core/shared-memory/normalize.js +7 -7
  259. package/dist/core/shell-lexer.js +5 -4
  260. package/dist/core/shell-wrapper-projection.js +1 -1
  261. package/dist/core/skill-grant.js +1 -1
  262. package/dist/core/store-contracts/checkpoint-store-contract.js +13 -0
  263. package/dist/core/store-contracts/mailbox-store-contract.d.ts +7 -14
  264. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +27 -0
  265. package/dist/core/store-contracts/session-store-incarnation-contract.js +92 -0
  266. package/dist/core/stub-env.d.ts +2 -0
  267. package/dist/core/stub-env.js +1 -0
  268. package/dist/core/synthetic-read-verdict.js +2 -2
  269. package/dist/core/task-event.d.ts +59 -5
  270. package/dist/core/task-result.d.ts +1 -1
  271. package/dist/core/task-spec.d.ts +42 -9
  272. package/dist/core/terminal-cause.d.ts +94 -11
  273. package/dist/core/tighten-task-spec.d.ts +5 -4
  274. package/dist/core/tighten-task-spec.js +20 -25
  275. package/dist/core/tool-catalog-entries.d.ts +5 -7
  276. package/dist/core/tool-catalog-entries.js +14 -15
  277. package/dist/core/tool-face.d.ts +47 -0
  278. package/dist/core/tool-face.js +5 -0
  279. package/dist/core/tool-model-gate.d.ts +5 -5
  280. package/dist/core/tool-name-aliases.d.ts +26 -2
  281. package/dist/core/tool-name-aliases.js +13 -0
  282. package/dist/core/tool-name-list.d.ts +30 -0
  283. package/dist/core/tool-name-list.js +55 -0
  284. package/dist/core/tool-name-readings.d.ts +1 -9
  285. package/dist/core/tool-name-readings.js +1 -3
  286. package/dist/core/tool-policy.d.ts +195 -85
  287. package/dist/core/tool-policy.js +165 -380
  288. package/dist/core/tool-registry.d.ts +44 -1
  289. package/dist/core/tool-registry.js +26 -0
  290. package/dist/core/tool-roster.d.ts +19 -1
  291. package/dist/core/tool-roster.js +21 -2
  292. package/dist/core/tool-spec-members.d.ts +45 -0
  293. package/dist/core/tool-spec-members.js +169 -0
  294. package/dist/core/tool-spec.d.ts +46 -8
  295. package/dist/core/tools.d.ts +6 -2
  296. package/dist/core/tools.js +8 -4
  297. package/dist/core/untrusted-egress.js +29 -26
  298. package/dist/core/untrusted-text.d.ts +13 -10
  299. package/dist/core/untrusted-text.js +6 -44
  300. package/dist/core/workflow-journal-store.d.ts +4 -1
  301. package/dist/core/write-protect.d.ts +65 -29
  302. package/dist/core/write-protect.js +235 -177
  303. package/dist/engine/compaction/compaction.d.ts +2 -2
  304. package/dist/engine/execution-env/node-execution-env.d.ts +5 -23
  305. package/dist/engine/execution-env/node-execution-env.js +16 -38
  306. package/dist/engine/execution-env/symlink-chain.d.ts +23 -0
  307. package/dist/engine/execution-env/symlink-chain.js +32 -0
  308. package/dist/engine/harness/types.d.ts +7 -0
  309. package/dist/engine/llm/tool-turns.d.ts +3 -0
  310. package/dist/engine/llm/tool-turns.js +1 -0
  311. package/dist/engine/llm/types.d.ts +59 -23
  312. package/dist/engine/loop/agent-loop.js +16 -2
  313. package/dist/engine/session/memory-repo.js +11 -3
  314. package/dist/engine/session/repo-utils.d.ts +8 -0
  315. package/dist/engine/session/repo-utils.js +13 -0
  316. package/dist/index.d.ts +20 -23
  317. package/dist/index.js +17 -20
  318. package/dist/internal/harness.d.ts +1 -1
  319. package/dist/internal/harness.js +1 -1
  320. package/dist/internal/llm.d.ts +2 -2
  321. package/dist/internal/llm.js +1 -1
  322. package/dist/orchestration/governance-baseline-validity.js +1 -1
  323. package/dist/orchestration/run-spec.js +3 -3
  324. package/dist/orchestration/run-workflow-tool.d.ts +16 -35
  325. package/dist/orchestration/run-workflow-tool.js +38 -78
  326. package/dist/orchestration/workflow-governance.d.ts +21 -25
  327. package/dist/orchestration/workflow-governance.js +38 -78
  328. package/dist/orchestration/workflow-primitives.d.ts +7 -22
  329. package/dist/orchestration/workflow-primitives.js +5 -12
  330. package/dist/orchestration/workflow-types.d.ts +1 -1
  331. package/dist/orchestration/workflow.d.ts +61 -11
  332. package/dist/orchestration/workflow.js +189 -117
  333. package/dist/scenarios/full-body.d.ts +1 -1
  334. package/dist/shell/lex.d.ts +0 -21
  335. package/dist/shell/lex.js +250 -68
  336. package/dist/shell/shell-words.d.ts +35 -0
  337. package/dist/shell/shell-words.js +65 -0
  338. package/dist/stores/file/checkpoint-store.d.ts +5 -5
  339. package/dist/stores/file/checkpoint-store.js +5 -2
  340. package/dist/stores/file/index.d.ts +0 -8
  341. package/dist/stores/file/index.js +0 -12
  342. package/dist/stores/file/session-store.d.ts +3 -0
  343. package/dist/stores/file/session-store.js +44 -19
  344. package/dist/tools/artifact/artifact-tool.js +2 -0
  345. package/dist/tools/fs/bash-program-position.d.ts +12 -4
  346. package/dist/tools/fs/bash-program-position.js +32 -9
  347. package/dist/tools/fs/bash-readonly-classifier.d.ts +1 -1
  348. package/dist/tools/fs/bash-readonly-classifier.js +8 -7
  349. package/dist/tools/fs/containment-face.d.ts +4 -0
  350. package/dist/tools/fs/containment-face.js +3 -0
  351. package/dist/tools/fs/fs-shared.d.ts +10 -0
  352. package/dist/tools/fs/fs-shared.js +18 -0
  353. package/dist/tools/fs/fs-write.js +4 -2
  354. package/dist/tools/fs/index.d.ts +1 -1
  355. package/dist/tools/fs/program-read-model.d.ts +46 -20
  356. package/dist/tools/fs/program-read-model.js +50 -20
  357. package/dist/tools/fs/program-read-model.rows.d.ts +0 -14
  358. package/dist/tools/fs/program-read-model.rows.js +16 -15
  359. package/dist/tools/fs/read-deny-home.d.ts +33 -47
  360. package/dist/tools/fs/read-deny-home.js +35 -49
  361. package/dist/tools/fs/read-deny.d.ts +23 -22
  362. package/dist/tools/fs/read-deny.js +114 -89
  363. package/dist/tools/fs/removal-targets.d.ts +56 -23
  364. package/dist/tools/fs/removal-targets.js +65 -87
  365. package/dist/tools/fs/safety.d.ts +29 -22
  366. package/dist/tools/fs/safety.js +17 -11
  367. package/dist/tools/fs/search.js +10 -8
  368. package/dist/tools/fs/shell-read-argv.js +1 -1
  369. package/dist/tools/fs/shell-read-bindings.d.ts +169 -37
  370. package/dist/tools/fs/shell-read-bindings.js +324 -86
  371. package/dist/tools/fs/shell-read-builtins.d.ts +35 -0
  372. package/dist/tools/fs/shell-read-builtins.js +43 -0
  373. package/dist/tools/fs/shell-read-check.d.ts +15 -1
  374. package/dist/tools/fs/shell-read-check.js +67 -43
  375. package/dist/tools/fs/shell-read-establish.js +6 -6
  376. package/dist/tools/fs/shell-read-functions.d.ts +22 -0
  377. package/dist/tools/fs/shell-read-functions.js +29 -0
  378. package/dist/tools/fs/shell-read-judge.d.ts +51 -18
  379. package/dist/tools/fs/shell-read-judge.js +40 -4
  380. package/dist/tools/fs/shell-read-plan.d.ts +12 -6
  381. package/dist/tools/fs/shell-read-plan.js +118 -113
  382. package/dist/tools/fs/shell-read-start.d.ts +29 -6
  383. package/dist/tools/fs/shell-read-start.js +16 -9
  384. package/dist/tools/fs/shell-read-word.js +4 -0
  385. package/dist/tools/fs/shell-read-workdir.d.ts +156 -0
  386. package/dist/tools/fs/shell-read-workdir.js +281 -0
  387. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -2
  388. package/dist/tools/fs/shell-read-write-targets.js +14 -5
  389. package/dist/tools/fs/shell-reentry-text.d.ts +4 -6
  390. package/dist/tools/fs/shell-reentry-text.js +3 -11
  391. package/dist/tools/task-list.d.ts +1 -2
  392. package/dist/tools/web.js +1 -1
  393. package/package.json +4 -1
  394. package/test/export-surface.snapshot.json +107 -143
  395. package/wire-changes/core@7.49.0.json +4765 -0
  396. package/dist/agents/teacher.d.ts +0 -159
  397. package/dist/agents/teacher.js +0 -577
  398. package/dist/agents/team.d.ts +0 -226
  399. package/dist/agents/team.js +0 -257
  400. package/dist/core/strategy-store.d.ts +0 -238
  401. package/dist/core/strategy-store.js +0 -253
  402. package/dist/orchestration/builtin-workflows.d.ts +0 -133
  403. package/dist/orchestration/builtin-workflows.js +0 -159
  404. package/dist/scenarios/env.d.ts +0 -40
  405. package/dist/scenarios/env.js +0 -39
  406. package/dist/scenarios/scenario-registry.d.ts +0 -110
  407. package/dist/scenarios/scenario-registry.js +0 -140
  408. package/dist/scenarios/teacher-quickstart.d.ts +0 -40
  409. package/dist/scenarios/teacher-quickstart.js +0 -12
  410. package/dist/stores/cc/lockfile.d.ts +0 -10
  411. package/dist/stores/cc/lockfile.js +0 -98
  412. package/dist/stores/cc/mailbox-store.d.ts +0 -20
  413. package/dist/stores/cc/mailbox-store.js +0 -255
  414. package/dist/stores/cc/roster-adapter.d.ts +0 -12
  415. package/dist/stores/cc/roster-adapter.js +0 -117
  416. package/dist/stores/cc/sidecar-transcript.d.ts +0 -97
  417. package/dist/stores/cc/sidecar-transcript.js +0 -264
  418. package/dist/stores/cc/task-list-store.d.ts +0 -2
  419. package/dist/stores/cc/task-list-store.js +0 -125
  420. package/dist/stores/file/strategy-store.d.ts +0 -97
  421. package/dist/stores/file/strategy-store.js +0 -341
@@ -8,7 +8,8 @@
8
8
  * of a candidate that could not be established), then containment over the canonical target alone. The
9
9
  * deny judge is the boundary's own `denyMatch` closure (`readDenySeat`, read-deny.ts) — the same function
10
10
  * object every read face mounts; nothing here compiles a pattern or re-derives a view set. The containment
11
- * judge is `withinAnyRoot` over the roots the boundary declares.
11
+ * judge is `withinAnyRoot` over the roots the boundary declares — a WRITE target's over the write roots, at the
12
+ * seat it is written, under the write face in force ({@link judgeWrite}).
12
13
  * · `foldShellReadFindings` folds a command's findings — every segment, every nested plan — to ONE word by
13
14
  * the priority `identity_changed > deny_hit > outside_roots > unestablishable > declined > none`.
14
15
  * · `SHELL_READ_DECISION` is the total table (finding × seat → disposition) that is the ONLY source of
@@ -22,6 +23,7 @@
22
23
  import type { BashReadonlyRootBoundary } from "./bash-readonly-classifier.js";
23
24
  import type { ReadCandidate, ShellReadPlan, ShellReadSegment } from "./shell-read-plan.js";
24
25
  import type { WriteSeat } from "./shell-read-write-targets.js";
26
+ import { type ContainmentFace } from "./containment-face.js";
25
27
  import type { AssertAllKeysHandled } from "../../core/ask-origin.js";
26
28
  /** WHAT the judge found about a command — a closed set, registered in `docs/CLOSED-SETS.md`. */
27
29
  export declare const SHELL_READ_FINDINGS: readonly ["deny_hit", "outside_roots", "unestablishable", "declined", "identity_changed", "none"];
@@ -108,6 +110,9 @@ export type DecisionTableCoversEverySeat = AssertAllKeysHandled<Exclude<ShellRea
108
110
  * {@link SHELL_READ_SEATS} (an untyped caller, or one still passing a retired word) is refused loudly: an
109
111
  * absent disposition would read as "no verdict", which no caller can act on safely. */
110
112
  export declare function decideShellRead(finding: ShellReadFinding, seat: ShellReadSeat): ShellReadDisposition;
113
+ /** {@link decideShellRead} for a command whose containment findings are all output redirections (`redirectsOnly`) or not — the
114
+ * cell {@link SHELL_REDIRECT_DECISION} states where it states one, else the table's. */
115
+ export declare function decideShellReadForRedirects(finding: ShellReadFinding, seat: ShellReadSeat, redirectsOnly: boolean): ShellReadDisposition;
111
116
  /**
112
117
  * The boundary a shell read is judged against: the declared roots (canonical), the working directory and
113
118
  * home the plan's bases start from, the deny seat (the SAME `denyMatch` closure every read face mounts),
@@ -122,21 +127,27 @@ export interface ShellReadBoundary extends BashReadonlyRootBoundary {
122
127
  /** The read table's rows AT or BELOW a path (`readDenySeat`'s `denyAtOrBelow`, read-deny.ts): read by the station's
123
128
  * `writesPlaced` fact only, through {@link denyRowAtOrBelow}. */
124
129
  readonly denyAtOrBelow?: (resolvedPath: string) => string | null;
125
- /** The WRITE roots (canonical) — where a write may land without a question under a mode that accepts file commands
126
- * (the task root and every additional working directory; never a read-only grant). Read for the station's
127
- * `writesPlaced` fact only; the read judgment never reads it. Absent ⇒ no write is placed. */
130
+ /** The WRITE roots (canonical) — the task root and every additional working directory, never a read-only grant: where a
131
+ * command's write targets must land ({@link judgeRead}'s write face: a target written outside them is an
132
+ * `outside_roots` finding), and so where a mode that accepts file commands may place them. Absent ⇒ where a write may
133
+ * land is unknown: a written target is `unestablishable` and nothing is placed. */
128
134
  readonly writeRoots?: readonly string[];
129
- /** The write-protection TABLE's judge — the one a write tool's target meets (its spelling, its real target and every hop
130
- * of its symlink chain): `true` ⇔ a row covers this ABSOLUTE write target; `canonical` ⇔ the path is a key the station
131
- * established (judged as a key, never as a spelling). Read by the station's write facts only: a covered target is not
132
- * placed, and the verdict says it was found ({@link import("./shell-read-check.js").ShellReadVerdict.writeProtected}). */
133
- readonly writeProtectionJudge?: (target: string, opts?: {
135
+ /** The WRITE face in force — the same seat the structured write tools read (the run's resolved write face, read once per
136
+ * judgment where the boundary is built): `"open"` skips the write roots' containment for a finding, as it skips the
137
+ * structured tools' root fence ({@link skipsRootsContainment}; absent ⇒ roots). Placement still reads the write roots:
138
+ * a mode accepting file commands accepts them inside its own directories, whatever the face. */
139
+ readonly writeFace?: ContainmentFace;
140
+ /** The leg's ONE write judgment of an ABSOLUTE write target — the one a write tool's target meets (its spelling, its real
141
+ * target and every hop of its symlink chain, under the leg's one exempt root), over the write-protection TABLE and the
142
+ * deployment's guarded write rows (`ToolPolicy.writeGuardRows`, every policy of the leg's chain) together; `canonical` ⇔
143
+ * the path is a key the station established (judged as a key, never as a spelling). `"protected"`: the table covers it —
144
+ * the target is not placed and the verdict says so ({@link import("./shell-read-check.js").ShellReadVerdict.writeProtected});
145
+ * `"guarded"`: a deployment row covers it — the target is not placed; `undefined`: nothing covers it. Read by the
146
+ * station's write facts only. A judgment that throws fails the station's answer (the caller's fail-closed arm). */
147
+ readonly writeTargetJudge?: (target: string, opts?: {
134
148
  readonly signal?: AbortSignal;
135
149
  readonly canonical?: true;
136
- }) => Promise<boolean>;
137
- /** The deployment's write-target guard (`ToolPolicy.writeTargetGuard`, every policy of the leg's chain): `true` ⇔ a
138
- * policy guards this ABSOLUTE write target. Read by the station's `writesPlaced` fact only: a guarded target is not placed. */
139
- readonly writeTargetGuard?: (target: string, signal?: AbortSignal) => Promise<boolean>;
150
+ }) => Promise<"protected" | "guarded" | undefined>;
140
151
  }
141
152
  /** How far one candidate got before it was judged. `lexical` = the folded spelling is the judged target
142
153
  * (an isolated sandbox, or a resolver that declares no authority and did not answer); `canonical` = the
@@ -163,6 +174,11 @@ export interface EstablishedRead {
163
174
  readonly walked?: true;
164
175
  /** Why the candidate could not be established. */
165
176
  readonly cause?: string;
177
+ /** The candidate's spelling WAS placed and the environment could not resolve where it leads (the whole chain unanswered by
178
+ * a resolver that declares itself authoritative, or a component it could not follow) — the reading's
179
+ * `target_unresolved` fact, as opposed to a text the station cannot read (a rewritten word, an unsettled working
180
+ * directory). Present only on an `unestablishable` read. */
181
+ readonly unresolved?: true;
166
182
  /** WHERE the command's program writes this target — present only on a write target the program itself writes, at the
167
183
  * seat this read was established at (`landing`: through the path's links; `entry`: the directory entry, a link there
168
184
  * not followed). Absent on a read, and on a write-face target the program only names (a copy's source). `child`: the
@@ -235,16 +251,30 @@ export interface JudgedSegment {
235
251
  export interface JudgedPlan {
236
252
  readonly plan: ShellReadPlan;
237
253
  readonly segments: readonly JudgedSegment[];
238
- /** {@link stationGuards} of the boundary the plan was judged against. */
254
+ /** {@link stationGuards} of the boundary the plan was judged against — what a READ finding folds by. */
239
255
  readonly guards: boolean;
256
+ /** {@link writeFaceGuards} of the same boundary — what a WRITE target's finding folds by. */
257
+ readonly writeGuards: boolean;
240
258
  }
241
259
  /**
242
260
  * Does the station GUARD anything for this boundary — a closed face (roots: containment is what it guards; an absent
243
261
  * face reads as roots, as {@link containmentOf} does), or a deny table with rows (`denyMatch` is present exactly then)?
244
262
  * Where it guards nothing (an open face, no deny row), a read it could not establish has nothing to be confirmed
245
- * against: no finding. The deny judgment itself is untouched (with no row there is nothing to hit).
263
+ * against: no finding. The deny judgment itself is untouched (with no row there is nothing to hit). The READ face's
264
+ * question only: a write target folds by {@link writeFaceGuards}.
246
265
  */
247
266
  export declare function stationGuards(boundary: Pick<ShellReadBoundary, "face" | "denyMatch">): boolean;
267
+ /**
268
+ * Does the station guard anything on the WRITE face — the same shape for the write seats: the write face in force runs
269
+ * the roots-containment step ({@link skipsRootsContainment}, the structured write tools' reading; absent ⇒ roots), or
270
+ * the write deny table has rows. Where it guards nothing (an open write face, no write row), a write target the station
271
+ * could not establish has nothing to be confirmed against — as a structured write under that face is not fenced.
272
+ */
273
+ export declare function writeFaceGuards(boundary: Pick<ShellReadBoundary, "writeFace" | "writeDenyMatch">): boolean;
274
+ /** Does the station guard anything on EITHER face? What a finding about the text's own structure folds by — a text the
275
+ * lexer could not read, a program it cannot name, program text it does not read, a working directory it lost, a text the
276
+ * shell re-enters — since what such a text reads AND what it writes are both unknown. */
277
+ export declare function anyFaceGuards(boundary: Pick<ShellReadBoundary, "face" | "denyMatch" | "writeFace" | "writeDenyMatch">): boolean;
248
278
  /** The command-level fold and the finding that produced it. `witness` is absent for `none`; for `declined`
249
279
  * the segment that declined stands in for a candidate. */
250
280
  export interface ShellReadFold {
@@ -256,8 +286,10 @@ export interface ShellReadFold {
256
286
  }
257
287
  /**
258
288
  * Fold a judged plan to ONE finding by {@link SHELL_READ_FINDING_RANK}, over every segment and every nested
259
- * plan. Where the station guards nothing ({@link JudgedPlan.guards}) an `unestablishable` or `declined` finding is no
260
- * finding: there is nothing to confirm the read against. Two structural rules ride the fold:
289
+ * plan. Where the station guards nothing an `unestablishable` or `declined` finding is no finding: there is nothing to
290
+ * confirm it against. Which guard is asked is the face the finding is about — a read candidate's by the read face's
291
+ * ({@link JudgedPlan.guards}), a write target's by the write face's ({@link JudgedPlan.writeGuards}), and a finding about
292
+ * the text's own structure (no candidate stands in for it) by either ({@link anyFaceGuards}). Two structural rules ride the fold:
261
293
  * · a plan the lexer refused (`unreadable`) is `unestablishable`, unconditionally — a quote-blind re-read
262
294
  * yields more words, never zero, so an unreadable text is never "no candidates";
263
295
  * · a SHELL re-entry segment (`sh -c S`, `eval S`, `env -S 'S'`, a launcher handing text to a shell) is at
@@ -289,7 +321,8 @@ export declare function deepestCommonDir(a: string, b: string): string | undefin
289
321
  * The ONE directory whose addition to the declared roots would answer every `outside_roots` finding of a
290
322
  * command — offered only when re-judging the same established reads with that root added leaves no
291
323
  * finding at all (MEASURED, not argued: a deny row or an unestablishable candidate beside the out-of-root
292
- * one leaves the ask standing whatever root is granted, and then nothing is offered). `exact` ⇒ the value
324
+ * one leaves the ask standing whatever root is granted, and then nothing is offered; so does a target written outside
325
+ * the WRITE roots, which no read root answers — a read grant grants no write). `exact` ⇒ the value
293
326
  * is the one path the command NAMED, offered verbatim, because the containing directory would hand out the
294
327
  * home or a root. A `..` spelling gets no offer: the folded and the kernel reading of it can disagree about
295
328
  * whether the target is back inside, which no replay of the text settles.
@@ -1,6 +1,7 @@
1
1
  import { hasWin32AliasedComponent, normalizeAbsPathLexically, withinAnyRoot } from "./safety.js";
2
2
  import { globInWord } from "./bash-readonly-classifier.js";
3
3
  import { readOfText } from "./shell-read-word.js";
4
+ import { skipsRootsContainment } from "./containment-face.js";
4
5
  export const SHELL_READ_FINDINGS = Object.freeze(["deny_hit", "outside_roots", "unestablishable", "declined", "identity_changed", "none"]);
5
6
  export const SHELL_READ_SEATS = Object.freeze(["full_shell", "readonly", "rejudge"]);
6
7
  export const SHELL_READ_FINDING_RANK = {
@@ -27,6 +28,13 @@ export function decideShellRead(finding, seat) {
27
28
  }
28
29
  return disposition;
29
30
  }
31
+ const SHELL_REDIRECT_DECISION = {
32
+ outside_roots: { full_shell: "ordinary" },
33
+ };
34
+ export function decideShellReadForRedirects(finding, seat, redirectsOnly) {
35
+ const cell = redirectsOnly && Object.hasOwn(SHELL_REDIRECT_DECISION, finding) ? SHELL_REDIRECT_DECISION[finding]?.[seat] : undefined;
36
+ return cell ?? decideShellRead(finding, seat);
37
+ }
30
38
  export function judgeRead(read, boundary) {
31
39
  const writeTarget = read.candidate.face === "write";
32
40
  const deny = writeTarget ? boundary.writeDenyMatch : boundary.denyMatch;
@@ -37,11 +45,11 @@ export function judgeRead(read, boundary) {
37
45
  const folded = normalizeAbsPathLexically(view);
38
46
  const pattern = writeTarget ? boundary.writeDenyMatch(folded) : boundary.denyMatch(folded, walked);
39
47
  if (pattern !== null)
40
- return { read, kind: "deny_hit", deny: { pattern, matchedView: folded, ...(writeTarget ? { face: "write" } : {}) }, containment: containmentOf(read, boundary) };
48
+ return { read, kind: "deny_hit", deny: { pattern, matchedView: folded, ...(writeTarget ? { face: "write" } : {}) }, containment: writeTarget ? writeContainmentOf(read, boundary) : containmentOf(read, boundary) };
41
49
  }
42
50
  }
43
51
  if (writeTarget)
44
- return { read, kind: "none", containment: containmentOf(read, boundary) };
52
+ return judgeWrite(read, boundary);
45
53
  const containment = containmentOf(read, boundary);
46
54
  if (read.candidate.denyOnly === true)
47
55
  return { read, kind: "none", containment };
@@ -72,19 +80,45 @@ function containmentOf(read, boundary) {
72
80
  return "unknown";
73
81
  return withinAnyRoot(boundary.roots, read.target) ? "inside" : "outside";
74
82
  }
83
+ const NULL_DEVICE = "/dev/null";
84
+ function writeContainmentOf(read, boundary) {
85
+ const device = read.written?.seat === "landing" && read.candidate.expands === false && read.candidate.spelled === NULL_DEVICE;
86
+ if (read.written === undefined || read.candidate.denyOnly === true || device)
87
+ return "open";
88
+ const roots = boundary.writeRoots;
89
+ if (roots === undefined || read.target === undefined)
90
+ return "unknown";
91
+ return withinAnyRoot(roots, read.target) ? "inside" : "outside";
92
+ }
93
+ function judgeWrite(read, boundary) {
94
+ const containment = writeContainmentOf(read, boundary);
95
+ if (containment === "open")
96
+ return { read, kind: "none", containment };
97
+ if (read.established === "unestablishable" || boundary.writeRoots === undefined)
98
+ return { read, kind: "unestablishable", containment };
99
+ return { read, kind: containment === "outside" && !skipsRootsContainment(boundary.writeFace) ? "outside_roots" : "none", containment };
100
+ }
75
101
  export function stationGuards(boundary) {
76
102
  return boundary.face !== "open" || boundary.denyMatch !== undefined;
77
103
  }
104
+ export function writeFaceGuards(boundary) {
105
+ return !skipsRootsContainment(boundary.writeFace) || boundary.writeDenyMatch !== undefined;
106
+ }
107
+ export function anyFaceGuards(boundary) {
108
+ return stationGuards(boundary) || writeFaceGuards(boundary);
109
+ }
78
110
  export function foldShellReadFindings(judged) {
79
111
  let best = { finding: "none" };
80
112
  let unestablished = false;
81
113
  const raise = (next) => {
82
114
  if (next.finding === "unestablishable" || next.finding === "declined") {
83
- if (!judged.guards)
115
+ const face = next.witness?.read.candidate.face;
116
+ if (!(next.witness === undefined ? judged.guards || judged.writeGuards : face === "write" ? judged.writeGuards : judged.guards))
84
117
  return;
85
118
  unestablished = true;
86
119
  }
87
- if (SHELL_READ_FINDING_RANK[next.finding] > SHELL_READ_FINDING_RANK[best.finding])
120
+ const rank = SHELL_READ_FINDING_RANK[next.finding] - SHELL_READ_FINDING_RANK[best.finding];
121
+ if (rank > 0 || (rank === 0 && next.witness?.read.candidate.face === "write" && best.witness?.read.candidate.face !== "write"))
88
122
  best = next;
89
123
  };
90
124
  const walk = (j, denyOnly) => {
@@ -125,6 +159,7 @@ export function judgeEstablishedPlan(plan, established, boundary, nestedOf) {
125
159
  nested: segment.nested.map(nestedOf),
126
160
  })),
127
161
  guards: stationGuards(boundary),
162
+ writeGuards: writeFaceGuards(boundary),
128
163
  };
129
164
  }
130
165
  export function allFindings(judged) {
@@ -208,5 +243,6 @@ export function rejudge(judged, boundary) {
208
243
  nested: s.nested.map((n) => rejudge(n, boundary)),
209
244
  })),
210
245
  guards: stationGuards(boundary),
246
+ writeGuards: writeFaceGuards(boundary),
211
247
  };
212
248
  }
@@ -24,9 +24,9 @@
24
24
  * and here-strings are data (an UNQUOTED here-document body's substitutions are nested plans) — except to a shell
25
25
  * whose argv names no script: what arrives on its standard input is its script, a nested plan where the text spells it;
26
26
  * · `$(…)`, backticks and `<(…)` bodies are nested plans; a word carrying one cannot be resolved from the text;
27
- * · `cd` moves the base the LATER segments resolve against, as a candidate SET (`&&` proves a move, nothing
28
- * else does); `pushd`/`popd` lose the base; a loop body with a base move is replayed per LITERAL beat and
29
- * otherwise loses the base for what follows.
27
+ * · the working-directory thread (`shell-read-workdir.ts`) moves the base the LATER segments resolve against, as a
28
+ * candidate SET (`&&` proves a move, nothing else does), and gives `PWD` / `OLDPWD` their values; a loop body with
29
+ * a base move is replayed per LITERAL beat and otherwise loses the base for what follows.
30
30
  * Every ambiguity resolves toward MORE candidates, never fewer.
31
31
  */
32
32
  import { type LenientConnector, type LexedRedirect, type LexedWord } from "../../shell/lex.js";
@@ -47,6 +47,9 @@ export interface ShellReadDeclarations {
47
47
  readonly cwd: string;
48
48
  readonly roots: readonly string[];
49
49
  readonly face?: "open" | "roots";
50
+ /** The `CDPATH` the shell starts with (the environment's declared one, `ExecutionEnv.cdPath`; a bare relative `cd` is
51
+ * searched through it): absent ⇒ none declared, read as unset; `unknown` ⇒ the text cannot know it. */
52
+ readonly cdPath?: readonly string[] | "unknown";
50
53
  }
51
54
  export interface ReadCandidate {
52
55
  /** The folded word (quotes removed, a literal leading tilde spelled `./~`) — a pattern's name where nothing matches. */
@@ -70,10 +73,10 @@ export interface ReadCandidate {
70
73
  /** A home word the plan does not place (the text may rebind `HOME`, it sits in a value, or it is a literal tilde the
71
74
  * program may expand itself): spelled with the DECLARED home. The judge reads it for deny rows ONLY. */
72
75
  readonly floorSpelled?: string;
73
- /** A deny-floor shadow of a `floorSpelled` spelling, established as a read and judged for deny rows only. */
76
+ /** Deny rows only (never containment): a `floorSpelled` shadow, or the read copy of a word the program only writes. */
74
77
  readonly denyOnly?: true;
75
- /** A WRITE target of the command (a `>`-family redirection, a `sed` `w` file, the operands of a file-writing command):
76
- * established like a read and judged against the deny table's WRITE face only — never for containment, never a read. */
78
+ /** A WRITE target (a `>`-family redirection, a `sed` `w` file, a file-writing command's operand): established like a
79
+ * read, judged on the WRITE face — the write deny rows, then the write roots where written — never as a read. */
77
80
  readonly face?: "write";
78
81
  /** A reading the station takes where no row says the program opens the word — a word of a program with no row, a
79
82
  * role only another implementation reads — so the filesystem decides it: `containment` = the spelling always meets
@@ -129,6 +132,9 @@ export interface ShellReadSegment {
129
132
  /** Substitution bodies, unquoted here-document substitutions, and re-entered shell text, each its own plan. */
130
133
  readonly nested: readonly ShellReadPlan[];
131
134
  readonly reach: SegmentReach;
135
+ /** The names a change that can reach this segment touched (`BindingTable.rebound`): any other name still holds what the
136
+ * shell provides here. `all`: any name may have changed. */
137
+ readonly rebound: ReadonlySet<string> | "all";
132
138
  }
133
139
  export interface ShellReadPlan {
134
140
  readonly segments: readonly ShellReadSegment[];