@sema-agent/core 7.55.0 → 7.57.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/CHANGELOG.md +1054 -0
  2. package/LICENSE +1 -1
  3. package/dist/agents/cascade.js +1 -1
  4. package/dist/agents/cc-peer-directory.js +1 -0
  5. package/dist/agents/child-model-seat.d.ts +0 -11
  6. package/dist/agents/child-model-seat.js +0 -3
  7. package/dist/agents/list-agents-tool.d.ts +3 -1
  8. package/dist/agents/list-agents-tool.js +7 -7
  9. package/dist/agents/org-delivery-gate.js +3 -4
  10. package/dist/agents/peer-directory.d.ts +22 -4
  11. package/dist/agents/peer-directory.js +24 -2
  12. package/dist/agents/peer-held-queue.d.ts +69 -49
  13. package/dist/agents/peer-held-queue.js +255 -106
  14. package/dist/agents/peer-session-drain.js +65 -45
  15. package/dist/agents/repair-loop.js +2 -2
  16. package/dist/agents/send-message-tool.js +7 -6
  17. package/dist/agents/subagent.d.ts +6 -4
  18. package/dist/agents/subagent.js +72 -68
  19. package/dist/agents/tool-filter.d.ts +7 -5
  20. package/dist/agents/tool-filter.js +12 -9
  21. package/dist/agents/verify.d.ts +3 -2
  22. package/dist/agents/verify.js +3 -3
  23. package/dist/brain/anthropic.js +45 -80
  24. package/dist/brain/media-degrade.d.ts +18 -7
  25. package/dist/brain/media-degrade.js +13 -2
  26. package/dist/brain/model-capability.d.ts +37 -0
  27. package/dist/brain/model-capability.js +34 -0
  28. package/dist/brain/model-presets.d.ts +2 -8
  29. package/dist/brain/model-presets.js +1 -6
  30. package/dist/brain/open-responses.js +23 -34
  31. package/dist/brain/openai.js +25 -96
  32. package/dist/brain/provider-dialect.d.ts +3 -2
  33. package/dist/brain/provider-dialect.js +2 -2
  34. package/dist/brain/reasoning-request.d.ts +96 -0
  35. package/dist/brain/reasoning-request.js +174 -0
  36. package/dist/brain/reasoning.d.ts +11 -11
  37. package/dist/brain/reasoning.js +4 -3
  38. package/dist/brain/request-params.d.ts +13 -4
  39. package/dist/brain/request-params.js +21 -5
  40. package/dist/brain/status-sink.d.ts +20 -0
  41. package/dist/brain/status-sink.js +7 -0
  42. package/dist/brain/stream-engine.d.ts +9 -0
  43. package/dist/brain/stream-engine.js +24 -10
  44. package/dist/brain/stream-shared.d.ts +5 -4
  45. package/dist/brain/stream-shared.js +4 -4
  46. package/dist/core/a2a.d.ts +2 -1
  47. package/dist/core/a2a.js +19 -13
  48. package/dist/core/agent-definition.d.ts +10 -0
  49. package/dist/core/allow-entry.d.ts +23 -23
  50. package/dist/core/allow-entry.js +42 -46
  51. package/dist/core/allow-rule-shadow.d.ts +3 -3
  52. package/dist/core/approval-object.d.ts +21 -5
  53. package/dist/core/approval-object.js +44 -17
  54. package/dist/core/ask-origin.d.ts +66 -20
  55. package/dist/core/ask-origin.js +63 -23
  56. package/dist/core/ask-question.d.ts +51 -8
  57. package/dist/core/ask-question.js +3 -4
  58. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  59. package/dist/core/ask-unresolvable-notice.js +16 -2
  60. package/dist/core/auto-compaction.d.ts +71 -6
  61. package/dist/core/auto-compaction.js +42 -26
  62. package/dist/core/background-agent-store.d.ts +6 -2
  63. package/dist/core/background-agent-store.js +1 -1
  64. package/dist/core/checkpoint-generation.d.ts +53 -0
  65. package/dist/core/checkpoint-generation.js +35 -0
  66. package/dist/core/checkpoint-queries.d.ts +180 -0
  67. package/dist/core/checkpoint-queries.js +272 -0
  68. package/dist/core/checkpoint-requirements.d.ts +19 -1
  69. package/dist/core/checkpoint-requirements.js +6 -0
  70. package/dist/core/checkpoint-store.d.ts +105 -53
  71. package/dist/core/checkpoint-store.js +43 -20
  72. package/dist/core/cross-boundary-taint.d.ts +6 -5
  73. package/dist/core/cross-boundary-taint.js +5 -5
  74. package/dist/core/decision-receipt.d.ts +37 -3
  75. package/dist/core/decision-receipt.js +17 -17
  76. package/dist/core/delegation-not-started.d.ts +6 -0
  77. package/dist/core/delegation-not-started.js +17 -0
  78. package/dist/core/engine-attestation.d.ts +93 -0
  79. package/dist/core/engine-attestation.js +70 -0
  80. package/dist/core/engine-capabilities.d.ts +4 -1
  81. package/dist/core/engine-capabilities.js +1 -1
  82. package/dist/core/engine-notice.d.ts +32 -12
  83. package/dist/core/engine-notice.js +6 -0
  84. package/dist/core/file-history-store.d.ts +104 -22
  85. package/dist/core/file-history-store.js +37 -19
  86. package/dist/core/gate-fold.d.ts +1 -1
  87. package/dist/core/gate-fold.js +22 -10
  88. package/dist/core/gate-lanes.js +73 -65
  89. package/dist/core/gate-outcome.d.ts +26 -5
  90. package/dist/core/gate-outcome.js +26 -0
  91. package/dist/core/governance-codes.d.ts +5 -1
  92. package/dist/core/governance-codes.js +6 -0
  93. package/dist/core/hooks.d.ts +19 -18
  94. package/dist/core/hooks.js +3 -1
  95. package/dist/core/host-floor.d.ts +128 -0
  96. package/dist/core/host-floor.js +206 -0
  97. package/dist/core/host-target.d.ts +38 -3
  98. package/dist/core/host-target.js +38 -5
  99. package/dist/core/mailbox-store.d.ts +62 -1
  100. package/dist/core/mailbox-store.js +59 -0
  101. package/dist/core/mcp-name-judge.d.ts +46 -0
  102. package/dist/core/mcp-name-judge.js +61 -0
  103. package/dist/core/mcp-probe.d.ts +1 -1
  104. package/dist/core/mcp-probe.js +2 -5
  105. package/dist/core/mcp.d.ts +5 -1
  106. package/dist/core/mcp.js +70 -64
  107. package/dist/core/memory-engine/consolidation-driver.js +4 -3
  108. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  109. package/dist/core/memory-engine/distiller.js +26 -17
  110. package/dist/core/memory-engine/engine.js +4 -4
  111. package/dist/core/memory-engine/layout.d.ts +60 -8
  112. package/dist/core/memory-engine/layout.js +70 -8
  113. package/dist/core/model-seat.d.ts +10 -3
  114. package/dist/core/mods/classic-events.d.ts +67 -0
  115. package/dist/core/mods/classic-events.js +1 -0
  116. package/dist/core/mods/dollar.d.ts +13 -0
  117. package/dist/core/mods/extension-call.d.ts +31 -0
  118. package/dist/core/mods/extension-call.js +43 -0
  119. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  120. package/dist/core/mods/kernel/dispatch.js +140 -69
  121. package/dist/core/mods/kernel/events.d.ts +47 -11
  122. package/dist/core/mods/kernel/events.js +66 -42
  123. package/dist/core/mods/kernel/index.d.ts +4 -4
  124. package/dist/core/mods/kernel/index.js +2 -2
  125. package/dist/core/mods/kernel/receive.d.ts +39 -5
  126. package/dist/core/mods/kernel/receive.js +290 -17
  127. package/dist/core/mods/kernel/registration.d.ts +33 -2
  128. package/dist/core/mods/kernel/registration.js +6 -7
  129. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  130. package/dist/core/mods/kernel/site-rules.js +24 -42
  131. package/dist/core/mods/spec-seats.d.ts +69 -0
  132. package/dist/core/mods/spec-seats.js +114 -0
  133. package/dist/core/mods/stations.d.ts +28 -8
  134. package/dist/core/mods/stations.js +29 -13
  135. package/dist/core/mods/tool-call.d.ts +79 -0
  136. package/dist/core/mods/tool-call.js +152 -0
  137. package/dist/core/namespaced-rule-name.d.ts +32 -38
  138. package/dist/core/namespaced-rule-name.js +29 -36
  139. package/dist/core/parent-spec-seat.d.ts +6 -1
  140. package/dist/core/parent-spec-seat.js +2 -0
  141. package/dist/core/park-selfcheck.js +3 -0
  142. package/dist/core/permission-rule-consent.d.ts +24 -3
  143. package/dist/core/permission-rule-consent.js +136 -41
  144. package/dist/core/permission-rule-model.d.ts +57 -5
  145. package/dist/core/permission-rule-model.js +90 -31
  146. package/dist/core/permission-rule-org.d.ts +6 -2
  147. package/dist/core/permission-rule-org.js +8 -4
  148. package/dist/core/permission-rule-provider.d.ts +5 -2
  149. package/dist/core/permission-rule-provider.js +41 -11
  150. package/dist/core/permission-rule-store.d.ts +3 -2
  151. package/dist/core/permission-rule-store.js +11 -2
  152. package/dist/core/permission-rule-sync.js +3 -2
  153. package/dist/core/permission-rule-syntax.d.ts +5 -4
  154. package/dist/core/permission-rule-syntax.js +2 -2
  155. package/dist/core/permission-rules.d.ts +4 -4
  156. package/dist/core/permission-rules.js +11 -20
  157. package/dist/core/persisted-rule-arms.d.ts +2 -2
  158. package/dist/core/persisted-rule-arms.js +10 -12
  159. package/dist/core/principal-name.d.ts +20 -0
  160. package/dist/core/principal-name.js +22 -0
  161. package/dist/core/prompt-section-seat.js +4 -6
  162. package/dist/core/protocol-http-auth.d.ts +40 -5
  163. package/dist/core/protocol-http-auth.js +168 -4
  164. package/dist/core/protocol-naming.d.ts +20 -0
  165. package/dist/core/protocol-naming.js +20 -3
  166. package/dist/core/read-only-shell.d.ts +20 -5
  167. package/dist/core/read-only-shell.js +29 -14
  168. package/dist/core/remote-env.d.ts +37 -1
  169. package/dist/core/remote-env.js +11 -0
  170. package/dist/core/resume-startup-cause.d.ts +24 -2
  171. package/dist/core/resume-startup-cause.js +20 -1
  172. package/dist/core/retired-keys.d.ts +16 -0
  173. package/dist/core/retired-keys.js +16 -4
  174. package/dist/core/rewrite-rejudge.d.ts +60 -0
  175. package/dist/core/rewrite-rejudge.js +36 -0
  176. package/dist/core/roles.d.ts +28 -1
  177. package/dist/core/roles.js +81 -26
  178. package/dist/core/rule-lane-reads.d.ts +20 -15
  179. package/dist/core/rule-lane-reads.js +45 -17
  180. package/dist/core/rule-owner.d.ts +3 -3
  181. package/dist/core/rule-owner.js +3 -2
  182. package/dist/core/runner/announce-once-ledger.d.ts +14 -0
  183. package/dist/core/runner/announce-once-ledger.js +5 -0
  184. package/dist/core/runner/assemble-result.d.ts +1 -0
  185. package/dist/core/runner/assemble-result.js +1 -1
  186. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  187. package/dist/core/runner/caller-roster.d.ts +16 -4
  188. package/dist/core/runner/caller-roster.js +33 -6
  189. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  190. package/dist/core/runner/capability-withheld-seat.js +24 -0
  191. package/dist/core/runner/classifier-ladder.d.ts +7 -9
  192. package/dist/core/runner/classifier-ladder.js +3 -3
  193. package/dist/core/runner/compact-session.d.ts +10 -0
  194. package/dist/core/runner/compact-session.js +202 -0
  195. package/dist/core/runner/compaction-call-options.d.ts +2 -2
  196. package/dist/core/runner/compaction-seams.d.ts +21 -1
  197. package/dist/core/runner/compaction-seams.js +11 -8
  198. package/dist/core/runner/construction-doors.js +3 -0
  199. package/dist/core/runner/contracts.d.ts +50 -40
  200. package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
  201. package/dist/core/runner/cross-boundary-lane.js +40 -27
  202. package/dist/core/runner/denial-limit-arms.d.ts +2 -2
  203. package/dist/core/runner/denial-limit-arms.js +1 -1
  204. package/dist/core/runner/derived-route-fallback.d.ts +13 -0
  205. package/dist/core/runner/derived-route-fallback.js +6 -0
  206. package/dist/core/runner/env-capability-census.d.ts +3 -2
  207. package/dist/core/runner/env-capability-census.js +9 -3
  208. package/dist/core/runner/file-history-request.d.ts +18 -0
  209. package/dist/core/runner/file-history-request.js +21 -13
  210. package/dist/core/runner/file-history-restore.d.ts +45 -0
  211. package/dist/core/runner/file-history-restore.js +46 -0
  212. package/dist/core/runner/gate-exit.d.ts +3 -3
  213. package/dist/core/runner/gate-exit.js +4 -3
  214. package/dist/core/runner/image.d.ts +7 -17
  215. package/dist/core/runner/image.js +9 -60
  216. package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
  217. package/dist/core/runner/permission-rule-lanes.js +39 -17
  218. package/dist/core/runner/person-path-rows.d.ts +12 -9
  219. package/dist/core/runner/person-path-rows.js +18 -7
  220. package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
  221. package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
  222. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  223. package/dist/core/runner/prepare-ask-lane.js +5 -2
  224. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  225. package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
  226. package/dist/core/runner/prepare-config-doors.d.ts +35 -38
  227. package/dist/core/runner/prepare-config-doors.js +46 -28
  228. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  229. package/dist/core/runner/prepare-defer-classify.js +7 -8
  230. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  231. package/dist/core/runner/prepare-file-history.js +7 -39
  232. package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
  233. package/dist/core/runner/prepare-gate-stations.js +10 -1
  234. package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
  235. package/dist/core/runner/prepare-hands-readface.js +17 -14
  236. package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
  237. package/dist/core/runner/prepare-inherited-gate.js +5 -3
  238. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  239. package/dist/core/runner/prepare-park-ask.d.ts +2 -0
  240. package/dist/core/runner/prepare-park-ask.js +7 -7
  241. package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
  242. package/dist/core/runner/prepare-policy-chain.js +67 -76
  243. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  244. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  245. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  246. package/dist/core/runner/prepare-prompt-inputs.js +3 -5
  247. package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
  248. package/dist/core/runner/prepare-protocol-tools.js +3 -3
  249. package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
  250. package/dist/core/runner/prepare-safety-scan.js +0 -17
  251. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  252. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  253. package/dist/core/runner/prepare-task.d.ts +5 -2
  254. package/dist/core/runner/prepare-task.js +48 -43
  255. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
  256. package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
  257. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  258. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  259. package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
  260. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  261. package/dist/core/runner/resume-admission.js +1 -1
  262. package/dist/core/runner/resume-apply.js +11 -12
  263. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  264. package/dist/core/runner/resume-claim.d.ts +4 -2
  265. package/dist/core/runner/resume-claim.js +15 -8
  266. package/dist/core/runner/retired-runner-deps.js +1 -0
  267. package/dist/core/runner/rewind-files.d.ts +12 -0
  268. package/dist/core/runner/rewind-files.js +90 -0
  269. package/dist/core/runner/run-attachment-seats.js +2 -1
  270. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  271. package/dist/core/runner/run-brain-sinks.js +4 -2
  272. package/dist/core/runner/run-harness-handlers.js +12 -4
  273. package/dist/core/runner/run-leg.d.ts +1 -1
  274. package/dist/core/runner/run-leg.js +40 -39
  275. package/dist/core/runner/run-notification-lane.d.ts +2 -0
  276. package/dist/core/runner/run-notification-lane.js +2 -2
  277. package/dist/core/runner/run-recovery-lanes.js +3 -4
  278. package/dist/core/runner/run-settle-and-teardown.js +7 -12
  279. package/dist/core/runner/run-terminal-adoption.js +3 -4
  280. package/dist/core/runner/run-turn-boundary.js +4 -15
  281. package/dist/core/runner/runtask.d.ts +10 -0
  282. package/dist/core/runner/runtask.js +35 -42
  283. package/dist/core/runner/send-message-continuation.js +1 -1
  284. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  285. package/dist/core/runner/session-read-file-states.js +28 -0
  286. package/dist/core/runner/session-rule-policy.js +4 -3
  287. package/dist/core/runner/session-verb-doors.d.ts +28 -0
  288. package/dist/core/runner/session-verb-doors.js +48 -0
  289. package/dist/core/runner/session-write-ledger.d.ts +30 -0
  290. package/dist/core/runner/session-write-ledger.js +101 -0
  291. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  292. package/dist/core/runner/shell-env-withheld.js +51 -0
  293. package/dist/core/runner/skills-seat.js +6 -2
  294. package/dist/core/runner/stream-settle-backstop.js +12 -15
  295. package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
  296. package/dist/core/runner/sub-agent-deny-lists.js +25 -17
  297. package/dist/core/runner/synthetic-tools.d.ts +6 -0
  298. package/dist/core/runner/synthetic-tools.js +4 -1
  299. package/dist/core/runner/teardown-bounded.d.ts +1 -0
  300. package/dist/core/runner/teardown-bounded.js +1 -0
  301. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  302. package/dist/core/runner/tool-disclosure.js +1 -3
  303. package/dist/core/runner/tool-end-body.d.ts +1 -1
  304. package/dist/core/runner/tool-end-body.js +10 -9
  305. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  306. package/dist/core/runner/tool-not-executed.js +11 -0
  307. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  308. package/dist/core/runner/tool-occurrence.js +7 -0
  309. package/dist/core/runner/turn-attachments.d.ts +33 -15
  310. package/dist/core/runner/turn-attachments.js +62 -37
  311. package/dist/core/runner-deps.d.ts +7 -7
  312. package/dist/core/safety-axis-vocab.d.ts +6 -4
  313. package/dist/core/safety-axis-vocab.js +6 -5
  314. package/dist/core/safety-merge-corpus.js +11 -3
  315. package/dist/core/secret-env.d.ts +30 -3
  316. package/dist/core/secret-env.js +47 -8
  317. package/dist/core/select-model.js +3 -3
  318. package/dist/core/session-policy-store.d.ts +32 -15
  319. package/dist/core/session-policy-store.js +156 -36
  320. package/dist/core/session-store.d.ts +29 -10
  321. package/dist/core/session-store.js +51 -19
  322. package/dist/core/session.d.ts +82 -16
  323. package/dist/core/session.js +53 -0
  324. package/dist/core/shell-read-silence.d.ts +11 -12
  325. package/dist/core/shell-read-silence.js +9 -5
  326. package/dist/core/shell-run-candidates.js +3 -1
  327. package/dist/core/shell-wrapper-projection.d.ts +1 -1
  328. package/dist/core/shell-wrapper-projection.js +1 -1
  329. package/dist/core/shell-wrapper-table.d.ts +14 -7
  330. package/dist/core/shell-wrapper-table.js +5 -4
  331. package/dist/core/side-query.js +10 -1
  332. package/dist/core/skill-grant.d.ts +7 -2
  333. package/dist/core/skill-grant.js +5 -0
  334. package/dist/core/skills-directory.js +6 -2
  335. package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
  336. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  337. package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
  338. package/dist/core/store-contracts/file-history-store-contract.js +40 -1
  339. package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
  340. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  341. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  342. package/dist/core/store-contracts/session-repo-contract.js +51 -0
  343. package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
  344. package/dist/core/store-contracts/session-store-contract.js +150 -14
  345. package/dist/core/stub-env.d.ts +2 -0
  346. package/dist/core/stub-env.js +1 -0
  347. package/dist/core/synthetic-read-verdict.js +3 -3
  348. package/dist/core/task-event.d.ts +32 -4
  349. package/dist/core/task-notification.d.ts +16 -12
  350. package/dist/core/task-registry-agent.d.ts +8 -4
  351. package/dist/core/task-registry-agent.js +14 -8
  352. package/dist/core/task-registry-shared.d.ts +35 -6
  353. package/dist/core/task-registry-shared.js +11 -0
  354. package/dist/core/task-registry.d.ts +10 -1
  355. package/dist/core/task-registry.js +12 -2
  356. package/dist/core/task-result.d.ts +18 -0
  357. package/dist/core/task-spec.d.ts +18 -13
  358. package/dist/core/tighten-task-spec.js +2 -1
  359. package/dist/core/tool-catalog-entries.d.ts +23 -0
  360. package/dist/core/tool-catalog-entries.js +14 -2
  361. package/dist/core/tool-check-reading.d.ts +11 -0
  362. package/dist/core/tool-check-reading.js +11 -6
  363. package/dist/core/tool-model-gate.d.ts +2 -2
  364. package/dist/core/tool-name-aliases.d.ts +48 -18
  365. package/dist/core/tool-name-aliases.js +36 -19
  366. package/dist/core/tool-name-readings.d.ts +6 -32
  367. package/dist/core/tool-name-readings.js +2 -9
  368. package/dist/core/tool-policy.d.ts +78 -204
  369. package/dist/core/tool-policy.js +152 -204
  370. package/dist/core/tool-result-store.js +3 -0
  371. package/dist/core/tool-roster.d.ts +14 -19
  372. package/dist/core/tool-roster.js +11 -44
  373. package/dist/core/tool-spec-members.js +7 -2
  374. package/dist/core/tool-spec.d.ts +19 -11
  375. package/dist/core/tools.js +49 -9
  376. package/dist/core/trace.d.ts +6 -3
  377. package/dist/core/trace.js +2 -1
  378. package/dist/core/types.d.ts +1 -1
  379. package/dist/core/untrusted-egress.d.ts +20 -0
  380. package/dist/core/untrusted-egress.js +77 -3
  381. package/dist/core/user-attachment.d.ts +8 -1
  382. package/dist/core/user-attachment.js +64 -4
  383. package/dist/core/wiring-manifest.d.ts +9 -0
  384. package/dist/core/wiring-manifest.js +1 -0
  385. package/dist/core/workflow-journal-store.js +1 -1
  386. package/dist/engine/compaction/compaction.js +3 -2
  387. package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
  388. package/dist/engine/execution-env/node-execution-env.js +11 -2
  389. package/dist/engine/harness/agent-harness.d.ts +32 -6
  390. package/dist/engine/harness/agent-harness.js +65 -9
  391. package/dist/engine/harness/types.d.ts +29 -2
  392. package/dist/engine/llm/types.d.ts +28 -11
  393. package/dist/engine/loop/agent-loop.d.ts +23 -4
  394. package/dist/engine/loop/agent-loop.js +42 -30
  395. package/dist/engine/loop/types.d.ts +16 -6
  396. package/dist/engine/session/memory-repo.d.ts +9 -2
  397. package/dist/engine/session/memory-repo.js +11 -1
  398. package/dist/engine/session/repo-utils.d.ts +6 -5
  399. package/dist/engine/session/repo-utils.js +14 -6
  400. package/dist/index.d.ts +34 -17
  401. package/dist/index.js +22 -11
  402. package/dist/internal/harness-types.d.ts +1 -1
  403. package/dist/internal/harness.d.ts +2 -1
  404. package/dist/internal/harness.js +1 -0
  405. package/dist/internal/llm.d.ts +1 -1
  406. package/dist/orchestration/run-workflow-tool.d.ts +6 -4
  407. package/dist/orchestration/run-workflow-tool.js +5 -3
  408. package/dist/orchestration/workflow.d.ts +3 -0
  409. package/dist/orchestration/workflow.js +36 -18
  410. package/dist/primitives/credential-ref.d.ts +89 -0
  411. package/dist/primitives/credential-ref.js +125 -0
  412. package/dist/primitives/index.d.ts +2 -0
  413. package/dist/primitives/index.js +1 -0
  414. package/dist/prompt-assembly/artifact.d.ts +2 -2
  415. package/dist/prompt-assembly/artifact.js +5 -3
  416. package/dist/prompt-assembly/assemble.d.ts +3 -2
  417. package/dist/prompt-assembly/assemble.js +1 -1
  418. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  419. package/dist/prompt-assembly/catalog/schema.js +34 -2
  420. package/dist/prompt-assembly/catalog/sections.js +0 -1
  421. package/dist/prompt-assembly/composer.d.ts +3 -1
  422. package/dist/prompt-assembly/composer.js +1 -1
  423. package/dist/prompt-assembly/event-registry.js +1 -0
  424. package/dist/prompt-assembly/overlay.js +3 -3
  425. package/dist/prompt-assembly/renderers.d.ts +1 -1
  426. package/dist/prompt-assembly/renderers.js +0 -3
  427. package/dist/prompt-assembly/role-base.d.ts +15 -0
  428. package/dist/prompt-assembly/role-base.js +9 -0
  429. package/dist/prompt-assembly/select.d.ts +39 -14
  430. package/dist/prompt-assembly/select.js +47 -16
  431. package/dist/prompt-assembly/sugar.d.ts +17 -11
  432. package/dist/prompt-assembly/sugar.js +8 -3
  433. package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
  434. package/dist/prompt-assembly/tool-catalog.js +114 -4
  435. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  436. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  437. package/dist/prompt-assembly/types.d.ts +0 -7
  438. package/dist/scenarios/full-body.d.ts +11 -11
  439. package/dist/scenarios/full-body.js +4 -3
  440. package/dist/shell/lex.js +10 -1
  441. package/dist/stores/file/adoption/adopt.js +4 -3
  442. package/dist/stores/file/adoption/marker.js +3 -2
  443. package/dist/stores/file/checkpoint-store.d.ts +21 -4
  444. package/dist/stores/file/checkpoint-store.js +38 -7
  445. package/dist/stores/file/file-history-store.js +18 -11
  446. package/dist/stores/file/index.js +2 -1
  447. package/dist/stores/file/mailbox-store.d.ts +2 -1
  448. package/dist/stores/file/mailbox-store.js +26 -1
  449. package/dist/stores/file/permission-rule-adopt.js +4 -3
  450. package/dist/stores/file/permission-rule-store.js +11 -5
  451. package/dist/stores/file/session-store.d.ts +29 -6
  452. package/dist/stores/file/session-store.js +42 -50
  453. package/dist/tools/artifact/artifact-tool.js +3 -2
  454. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  455. package/dist/tools/fs/bash-program-position.js +56 -9
  456. package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
  457. package/dist/tools/fs/bash-readonly-classifier.js +5 -10
  458. package/dist/tools/fs/fs-bash.js +15 -8
  459. package/dist/tools/fs/fs-glob.d.ts +86 -0
  460. package/dist/tools/fs/fs-glob.js +226 -0
  461. package/dist/tools/fs/fs-read.js +14 -14
  462. package/dist/tools/fs/fs-search-tools.js +7 -7
  463. package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
  464. package/dist/tools/fs/pattern-kill-guard.js +429 -0
  465. package/dist/tools/fs/pdf.d.ts +9 -6
  466. package/dist/tools/fs/pdf.js +3 -3
  467. package/dist/tools/fs/program-read-model.d.ts +57 -7
  468. package/dist/tools/fs/program-read-model.js +11 -1
  469. package/dist/tools/fs/program-read-model.rows.js +78 -21
  470. package/dist/tools/fs/read-deny-home.js +3 -2
  471. package/dist/tools/fs/removal-targets.d.ts +17 -7
  472. package/dist/tools/fs/removal-targets.js +47 -20
  473. package/dist/tools/fs/search.d.ts +10 -0
  474. package/dist/tools/fs/search.js +20 -26
  475. package/dist/tools/fs/shell-read-argv.js +89 -12
  476. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  477. package/dist/tools/fs/shell-read-bindings.js +41 -0
  478. package/dist/tools/fs/shell-read-check.d.ts +10 -0
  479. package/dist/tools/fs/shell-read-check.js +13 -20
  480. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  481. package/dist/tools/fs/shell-read-environment.js +3 -2
  482. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  483. package/dist/tools/fs/shell-read-establish.js +19 -20
  484. package/dist/tools/fs/shell-read-identity.d.ts +12 -9
  485. package/dist/tools/fs/shell-read-identity.js +9 -4
  486. package/dist/tools/fs/shell-read-plan.js +24 -16
  487. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  488. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  489. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  490. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  491. package/dist/tools/fs/shell-reentry-text.js +40 -2
  492. package/dist/tools/todo.js +63 -63
  493. package/dist/tools/web.d.ts +19 -14
  494. package/dist/tools/web.js +46 -61
  495. package/package.json +1 -1
  496. package/test/export-surface.snapshot.json +221 -7
  497. package/wire-changes/core-stores-sql@7.57.0.json +29 -0
  498. package/wire-changes/core@7.56.0.json +3891 -0
  499. package/wire-changes/core@7.57.0.json +1487 -0
  500. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  501. package/wire-changes/mods-kernel@7.57.0.json +29 -0
  502. package/wire-changes/primitives@7.57.0.json +245 -0
@@ -0,0 +1,429 @@
1
+ import { spawn } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { errorResult } from "../../core/tools.js";
4
+ import { processTableOf } from "../../core/remote-env.js";
5
+ import { inheritedHostEnv } from "../../core/secret-env.js";
6
+ import { inlineUntrusted } from "../../core/untrusted-text.js";
7
+ import { planShellReads } from "./shell-read-plan.js";
8
+ import { programArgs } from "./shell-read-write-targets.js";
9
+ const PROBE_TIMEOUT_MS = 5_000;
10
+ const ANCESTOR_HOPS_MAX = 128;
11
+ const SHELL_PID_SPELLING = String.raw `\$(?:\$|\{\$\})`;
12
+ const SHELL_PID_WORD = new RegExp(`^${SHELL_PID_SPELLING}$`);
13
+ const SHELL_PID_EXPANSION = new RegExp(SHELL_PID_SPELLING, "g");
14
+ const NAME_SELECTION_KEEPS_ANCESTORS = process.platform === "linux" ? [] : ["-a"];
15
+ const OPTIONS_END_AT_FIRST_OPERAND = process.platform !== "linux";
16
+ const SIGNAL_ONLY_FIRST_ARGUMENT = process.platform !== "linux";
17
+ const HANDLER_SELECTS_BY_SIGNAL = process.platform === "linux";
18
+ const LONG_OPTIONS = new Map([
19
+ ["signal", "signal"], ["ignore-ancestors", "A"], ["require-handler", "H"], ["count", "c"], ["cgroup", "cgroup"], ["delimiter", "d"], ["list-name", "l"],
20
+ ["list-full", "a"], ["full", "f"], ["pgroup", "g"], ["group", "G"], ["ignore-case", "i"], ["newest", "n"], ["oldest", "o"], ["older", "O"], ["parent", "P"],
21
+ ["session", "s"], ["terminal", "t"], ["euid", "u"], ["uid", "U"], ["inverse", "v"], ["lightweight", "w"], ["exact", "x"], ["pidfile", "F"], ["logpidfile", "L"],
22
+ ["echo", "e"], ["ns", "ns"], ["nslist", "nslist"], ["queue", "q"], ["runstates", "r"], ["help", "h"], ["version", "V"],
23
+ ]);
24
+ function longKeyOf(name) {
25
+ if (!name.startsWith("--") || name.length < 3)
26
+ return undefined;
27
+ const word = name.slice(2);
28
+ const exact = LONG_OPTIONS.get(word);
29
+ if (exact !== undefined)
30
+ return exact;
31
+ const named = [...LONG_OPTIONS].filter(([o]) => o.startsWith(word));
32
+ return named.length === 1 ? named[0][1] : undefined;
33
+ }
34
+ const QUEUE_PAYLOAD = process.platform === "linux";
35
+ const VALUED_LETTERS = new Set(["F", "g", "G", "P", "s", "t", "u", "U", "N", "T", "O", "d", "r", ...(QUEUE_PAYLOAD ? ["q"] : [])]);
36
+ const VALUED_LONG_ONLY = new Set(["signal", "cgroup", "ns", "nslist"]);
37
+ const OUTPUT_LETTERS = new Set(["c", "e", "d", ...(QUEUE_PAYLOAD ? ["q"] : [])]);
38
+ const takesValueKey = (key) => VALUED_LETTERS.has(key) || VALUED_LONG_ONLY.has(key);
39
+ const fateOfKey = (key) => (key === "signal" ? "signal" : OUTPUT_LETTERS.has(key) ? "drop" : "ask");
40
+ function bundledLetters(w, valued = VALUED_LETTERS) {
41
+ if (!/^-[A-Za-z]/.test(w))
42
+ return undefined;
43
+ const letters = [];
44
+ for (const ch of w.slice(1)) {
45
+ letters.push(ch);
46
+ if (valued.has(ch))
47
+ break;
48
+ }
49
+ return letters;
50
+ }
51
+ const SIGNAL_NAMES = new Set([
52
+ "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "IOT", "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", "CONT",
53
+ "CHLD", "CLD", "TTIN", "TTOU", "IO", "POLL", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "INFO", "USR1", "USR2", "STKFLT", "PWR", "LOST", "UNUSED", "THR", "LIBRT",
54
+ ]);
55
+ const SIGNAL_WORD = /^-(?:\d+|(?:SIG)?(?:RT(?:MIN|MAX)(?:[+-]\d+)?|([A-Z][A-Z0-9]*)))$/i;
56
+ const isSignalWord = (w) => {
57
+ const m = SIGNAL_WORD.exec(w);
58
+ return m !== null && (m[1] === undefined || SIGNAL_NAMES.has(m[1].toUpperCase()));
59
+ };
60
+ function readSelection(allWords, killer) {
61
+ const signalAt = killer !== "pkill" ? -1 : SIGNAL_ONLY_FIRST_ARGUMENT ? (isSignalWord(allWords[0] ?? "") ? 0 : -1) : allWords.findIndex(isSignalWord);
62
+ const signalWord = signalAt < 0 ? undefined : allWords[signalAt].slice(1);
63
+ const words = signalAt < 0 ? allWords : allWords.filter((_, i) => i !== signalAt);
64
+ const out = [];
65
+ const parentLists = [];
66
+ let ended = false;
67
+ let requireHandler = false;
68
+ let negated = false;
69
+ let signalOption;
70
+ let valueOf;
71
+ const valueGiven = (key, value) => {
72
+ if (key === "P")
73
+ parentLists.push(value.split(","));
74
+ };
75
+ for (const w of words) {
76
+ if (valueOf !== undefined) {
77
+ if (valueOf.fate === "ask")
78
+ out.push(w);
79
+ else if (valueOf.fate === "signal")
80
+ signalOption = w;
81
+ valueGiven(valueOf.key, w);
82
+ valueOf = undefined;
83
+ continue;
84
+ }
85
+ if (ended || w === "--") {
86
+ ended ||= w === "--";
87
+ out.push(w);
88
+ continue;
89
+ }
90
+ const [, longName, longValue] = /^(--[^=]*)(?:=(.*))?$/s.exec(w) ?? [];
91
+ const key = longName === undefined ? undefined : longKeyOf(longName);
92
+ if (key !== undefined && (takesValueKey(key) || longValue === undefined)) {
93
+ if (key === "H")
94
+ requireHandler = true;
95
+ if (key === "v")
96
+ negated = true;
97
+ const fate = fateOfKey(key);
98
+ if (fate === "ask")
99
+ out.push(w);
100
+ if (takesValueKey(key) && longValue === undefined)
101
+ valueOf = { fate, key };
102
+ else if (longValue !== undefined) {
103
+ if (fate === "signal")
104
+ signalOption = longValue;
105
+ valueGiven(key, longValue);
106
+ }
107
+ continue;
108
+ }
109
+ const letters = bundledLetters(w);
110
+ if (letters === undefined) {
111
+ out.push(w);
112
+ if (OPTIONS_END_AT_FIRST_OPERAND && (w === "-" || !w.startsWith("-")))
113
+ ended = true;
114
+ continue;
115
+ }
116
+ if (letters.includes("H"))
117
+ requireHandler = true;
118
+ if (letters.includes("v"))
119
+ negated = true;
120
+ const last = letters[letters.length - 1];
121
+ const fate = fateOfKey(last);
122
+ const kept = letters.filter((ch) => fateOfKey(ch) === "ask").join("");
123
+ const attached = VALUED_LETTERS.has(last) ? w.slice(1 + letters.length) : "";
124
+ if (kept !== "")
125
+ out.push(`-${kept}${fate === "ask" ? attached : ""}`);
126
+ if (VALUED_LETTERS.has(last)) {
127
+ if (attached === "")
128
+ valueOf = { fate, key: last };
129
+ else
130
+ valueGiven(last, attached);
131
+ }
132
+ }
133
+ const signal = signalOption ?? signalWord;
134
+ return { words: HANDLER_SELECTS_BY_SIGNAL && requireHandler && signal !== undefined ? ["--signal", signal, ...out] : out, parentLists, negated };
135
+ }
136
+ const LAST_PARENT_LIST_WINS = process.platform === "linux";
137
+ function boundedToShellChildren(read, unread) {
138
+ if (unread !== undefined)
139
+ return false;
140
+ const standing = LAST_PARENT_LIST_WINS ? read.parentLists.slice(-1) : read.parentLists;
141
+ return standing.length > 0 && standing.every((list) => list.every((pid) => SHELL_PID_WORD.test(pid)));
142
+ }
143
+ const literalName = (name) => name.replace(/[\\.[\]{}()*+?^$|]/g, "\\$&");
144
+ function wordsOf(segment) {
145
+ const args = programArgs(segment);
146
+ const expands = (a) => `\`${inlineUntrusted(a.raw, 60)}\` is expanded by the shell when the command runs`;
147
+ const stream = segment.reentry === "argv" ? "its arguments arrive on a stream" : undefined;
148
+ const opaque = args.find((a) => a.rewritten === true && /[$`*?[~{\\]/.test(a.raw.replace(SHELL_PID_EXPANSION, "0")));
149
+ const first = args.find((a) => a.rewritten === true);
150
+ const unread = stream ?? (opaque === undefined ? undefined : expands(opaque));
151
+ const computed = unread ?? (first === undefined ? undefined : expands(first));
152
+ return { words: args.map((a) => a.spelled), ...(computed !== undefined ? { computed } : {}), ...(unread !== undefined ? { unread } : {}) };
153
+ }
154
+ const shown = (segment) => inlineUntrusted(segment.text, 200);
155
+ function readPkill(segment) {
156
+ const { words, computed, unread } = wordsOf(segment);
157
+ const read = readSelection(words, "pkill");
158
+ if (boundedToShellChildren(read, unread)) {
159
+ return read.negated ? { text: shown(segment), probes: [], computed: "the selection is negated (`-v` / `--inverse`), so `-P` of the shell's pid no longer limits it to the shell's children" } : undefined;
160
+ }
161
+ if (computed !== undefined)
162
+ return { text: shown(segment), probes: [], computed };
163
+ return read.words.length === 0 ? undefined : { text: shown(segment), probes: [read.words] };
164
+ }
165
+ const OPT_FLAG = { does: "flag" };
166
+ const OPT_FILTER = { does: "filter" };
167
+ const OPT_VALUED = { does: "valued" };
168
+ const OPT_CONTEXT = { does: "context" };
169
+ const OPT_REGEX = { does: "regex" };
170
+ const OPT_GROUP = { does: "group" };
171
+ const OPT_USER = { does: "select", pgrep: "-u" };
172
+ const OPT_TTY = { does: "select", pgrep: "-t" };
173
+ const KILLALL_OPTIONS = new Map([
174
+ ["-u", OPT_USER], ["--user", OPT_USER], ["-t", OPT_TTY],
175
+ ["-Z", OPT_CONTEXT], ["--context", OPT_CONTEXT],
176
+ ["-r", OPT_REGEX], ["-m", OPT_REGEX], ["--regexp", OPT_REGEX],
177
+ ["-I", { does: "ignoreCase" }], ["--ignore-case", { does: "ignoreCase" }],
178
+ ["-g", OPT_GROUP], ["--process-group", OPT_GROUP],
179
+ ["-s", OPT_VALUED], ["--signal", OPT_VALUED], ["-o", OPT_VALUED], ["--older-than", OPT_VALUED], ["-y", OPT_VALUED], ["--younger-than", OPT_VALUED],
180
+ ["-n", OPT_VALUED], ["--ns", OPT_VALUED], ["-c", OPT_FILTER],
181
+ ["-e", OPT_FLAG], ["--exact", OPT_FLAG], ["-i", OPT_FLAG], ["--interactive", OPT_FLAG], ["-l", OPT_FLAG], ["--list", OPT_FLAG], ["-q", OPT_FLAG], ["--quiet", OPT_FLAG],
182
+ ["-v", OPT_FLAG], ["--verbose", OPT_FLAG], ["-V", OPT_FLAG], ["--version", OPT_FLAG], ["-w", OPT_FLAG], ["--wait", OPT_FLAG], ["-d", OPT_FLAG], ["-z", OPT_FLAG], ["--help", OPT_FLAG],
183
+ ]);
184
+ const takesValue = (opt) => opt !== undefined && (opt.does === "select" || opt.does === "context" || opt.does === "filter" || opt.does === "valued");
185
+ const KILLALL_VALUED_LETTERS = new Set([...KILLALL_OPTIONS].filter(([spelling, opt]) => !spelling.startsWith("--") && takesValue(opt)).map(([spelling]) => spelling.slice(1)));
186
+ function optionsOf(w) {
187
+ if (w.startsWith("--")) {
188
+ const eq = w.indexOf("=");
189
+ return [eq < 0 ? { opt: w } : { opt: w.slice(0, eq), attached: w.slice(eq + 1) }];
190
+ }
191
+ const letters = bundledLetters(w, KILLALL_VALUED_LETTERS);
192
+ if (letters === undefined)
193
+ return [{ opt: w }];
194
+ const rest = w.slice(1 + letters.length);
195
+ return letters.map((ch, i) => ({ opt: `-${ch}`, ...(i === letters.length - 1 && rest !== "" ? { attached: rest } : {}) }));
196
+ }
197
+ function readKillallWords(words) {
198
+ const names = [];
199
+ const selecting = new Map();
200
+ let filter;
201
+ let byContext = false;
202
+ let regex = false;
203
+ let ignoreCase = false;
204
+ for (let i = 0; i < words.length; i++) {
205
+ const w = words[i];
206
+ if (w === "--") {
207
+ names.push(...words.slice(i + 1));
208
+ break;
209
+ }
210
+ if (!w.startsWith("-") || w === "-") {
211
+ names.push(w);
212
+ if (OPTIONS_END_AT_FIRST_OPERAND) {
213
+ names.push(...words.slice(i + 1));
214
+ break;
215
+ }
216
+ continue;
217
+ }
218
+ if (isSignalWord(w))
219
+ continue;
220
+ for (const { opt: spelling, attached } of optionsOf(w)) {
221
+ const opt = KILLALL_OPTIONS.get(spelling);
222
+ if (opt === undefined || (attached !== undefined && !takesValue(opt)))
223
+ return { unreadable: `\`${inlineUntrusted(w, 60)}\` is not a form of a \`killall\` option this check reads` };
224
+ if (opt.does === "group")
225
+ return { unreadable: "`-g` signals the whole process group of each match, a set this check cannot list" };
226
+ const value = takesValue(opt) ? (attached ?? words[++i]) : undefined;
227
+ if (opt.does === "select" && value !== undefined)
228
+ selecting.set(opt.pgrep, value);
229
+ else if (opt.does === "filter" && value !== undefined)
230
+ filter = value;
231
+ else if (opt.does === "context")
232
+ byContext = true;
233
+ else if (opt.does === "regex")
234
+ regex = true;
235
+ else if (opt.does === "ignoreCase")
236
+ ignoreCase = true;
237
+ }
238
+ }
239
+ if (filter !== undefined && !names.includes(filter))
240
+ names.push(filter);
241
+ if (byContext && names.length === 0 && selecting.size === 0)
242
+ return { unreadable: "`-Z` selects by security context, a set this check cannot ask `pgrep` for" };
243
+ return { names, selecting: [...selecting].flat(), regex, ignoreCase };
244
+ }
245
+ function readKillall(segment) {
246
+ const read = wordsOf(segment);
247
+ if (read.computed !== undefined)
248
+ return { text: shown(segment), probes: [], computed: read.computed };
249
+ const sel = readKillallWords(read.words);
250
+ if ("unreadable" in sel)
251
+ return { text: shown(segment), probes: [], computed: sel.unreadable };
252
+ const narrow = sel.ignoreCase ? ["-i"] : [];
253
+ const pattern = (n) => [...(n.startsWith("-") ? ["--"] : []), sel.regex ? n : literalName(n)];
254
+ const probes = sel.names.length > 0 ? sel.names.map((n) => [...NAME_SELECTION_KEEPS_ANCESTORS, ...(sel.regex ? [] : ["-x"]), ...narrow, ...sel.selecting, ...pattern(n)]) : sel.selecting.length === 0 ? [] : [[...NAME_SELECTION_KEEPS_ANCESTORS, ...sel.selecting]];
255
+ return { text: shown(segment), probes };
256
+ }
257
+ function readSelector(segment) {
258
+ const read = wordsOf(segment);
259
+ if (read.computed !== undefined)
260
+ return { text: shown(segment), probes: [], computed: read.computed };
261
+ if (segment.verb?.basename === "pidof") {
262
+ const names = read.words.filter((w, i) => !w.startsWith("-") && read.words[i - 1] !== "-o");
263
+ return { text: shown(segment), probes: names.map((n) => [...NAME_SELECTION_KEEPS_ANCESTORS, "-x", literalName(n)]) };
264
+ }
265
+ return { text: shown(segment), probes: [readSelection(read.words, "pgrep").words] };
266
+ }
267
+ const SELECTORS = new Set(["pgrep", "pidof"]);
268
+ const EVERY_PROCESS_PID = /^-0*1$/;
269
+ function readKill(segment) {
270
+ const { words } = wordsOf(segment);
271
+ const slot = words[0] === "-s" || words[0] === "-n" ? 2 : words[0]?.startsWith("-") === true && words[0] !== "--" ? 1 : 0;
272
+ const rest = words.slice(slot);
273
+ const pids = rest[0] === "--" ? rest.slice(1) : rest;
274
+ return pids.some((w) => EVERY_PROCESS_PID.test(w)) ? { text: shown(segment), probes: [], everyProcess: true } : undefined;
275
+ }
276
+ const isFedKill = (s) => s.verb?.basename === "kill" && (s.reentry === "argv" || programArgs(s).some((a) => a.rewritten === true));
277
+ const feedsKill = (plan) => plan.segments.some((s) => isFedKill(s) || s.nested.some(feedsKill));
278
+ function selectorsIn(plan) {
279
+ return plan.segments.flatMap((s) => [...(SELECTORS.has(s.verb?.basename ?? "") ? [s] : []), ...s.nested.flatMap(selectorsIn)]);
280
+ }
281
+ function readingsOf(plan, seen = new Set()) {
282
+ const out = [];
283
+ const take = (s, read) => {
284
+ if (seen.has(s))
285
+ return;
286
+ seen.add(s);
287
+ const r = read();
288
+ if (r !== undefined)
289
+ out.push(r);
290
+ };
291
+ for (const s of plan.segments) {
292
+ const program = s.verb?.basename;
293
+ if (program === "pkill")
294
+ take(s, () => readPkill(s));
295
+ else if (program === "killall")
296
+ take(s, () => readKillall(s));
297
+ else if (program === "kill")
298
+ take(s, () => readKill(s));
299
+ for (const n of s.nested)
300
+ out.push(...readingsOf(n, seen));
301
+ }
302
+ if (feedsKill(plan))
303
+ for (const s of selectorsIn(plan))
304
+ take(s, () => readSelector(s));
305
+ return out;
306
+ }
307
+ export function patternKillReadings(command, cwd) {
308
+ return readingsOf(planShellReads(command, { readers: new Set(), cwd, roots: [cwd], cdPath: "unknown" }));
309
+ }
310
+ function runProbe(program, args, signal) {
311
+ return new Promise((resolve) => {
312
+ let stdout = "";
313
+ let stderr = "";
314
+ let settled = false;
315
+ const settle = (r) => {
316
+ if (settled)
317
+ return;
318
+ settled = true;
319
+ clearTimeout(timer);
320
+ signal?.removeEventListener("abort", onAbort);
321
+ resolve(r);
322
+ };
323
+ const child = spawn(program, [...args], { env: inheritedHostEnv("scrub"), stdio: ["ignore", "pipe", "pipe"], windowsHide: true });
324
+ const stop = (why) => {
325
+ child.kill("SIGKILL");
326
+ settle({ ok: false, why });
327
+ };
328
+ const timer = setTimeout(() => stop(`${program} did not answer within ${PROBE_TIMEOUT_MS / 1000}s`), PROBE_TIMEOUT_MS);
329
+ const onAbort = () => stop("the call was cancelled");
330
+ signal?.addEventListener("abort", onAbort, { once: true });
331
+ child.stdout.on("data", (c) => { stdout += c.toString("utf8"); });
332
+ child.stderr.on("data", (c) => { stderr += c.toString("utf8"); });
333
+ child.on("error", (e) => settle({ ok: false, why: e.code === "ENOENT" ? `${program} is not available here` : `${program} could not start (${e.code ?? e.message})` }));
334
+ child.on("close", (code) => settle(code === 0 || code === 1 ? { ok: true, stdout, code } : { ok: false, why: `${program} exited ${code ?? "by signal"}${stderr.trim() === "" ? "" : `: ${inlineUntrusted(stderr, 120)}`}` }));
335
+ });
336
+ }
337
+ async function selected(args, signal) {
338
+ const run = await runProbe("pgrep", args, signal);
339
+ if (!run.ok)
340
+ return { why: run.why };
341
+ return { pids: run.code === 1 ? [] : run.stdout.split("\n").flatMap((line) => { const m = /^\s*(\d+)\b/.exec(line); return m === null ? [] : [Number(m[1])]; }) };
342
+ }
343
+ async function selfAndAncestors(signal) {
344
+ const chain = [process.pid];
345
+ if (process.platform === "linux") {
346
+ for (let pid = process.pid; chain.length <= ANCESTOR_HOPS_MAX && pid > 1;) {
347
+ let stat;
348
+ try {
349
+ stat = await readFile(`/proc/${pid}/stat`, "utf8");
350
+ }
351
+ catch {
352
+ return tableAncestors(signal);
353
+ }
354
+ const parent = Number(stat.slice(stat.lastIndexOf(")") + 2).split(" ")[1]);
355
+ if (!(parent > 0) || parent === pid)
356
+ break;
357
+ chain.push(parent);
358
+ pid = parent;
359
+ }
360
+ return { pids: chain };
361
+ }
362
+ return tableAncestors(signal);
363
+ }
364
+ async function tableAncestors(signal) {
365
+ const run = await runProbe("ps", ["-A", "-o", "pid=", "-o", "ppid="], signal);
366
+ if (!run.ok)
367
+ return { why: run.why };
368
+ const parentOf = new Map();
369
+ for (const line of run.stdout.split("\n")) {
370
+ const m = /^\s*(\d+)\s+(\d+)\s*$/.exec(line);
371
+ if (m !== null)
372
+ parentOf.set(Number(m[1]), Number(m[2]));
373
+ }
374
+ const chain = [process.pid];
375
+ for (let pid = parentOf.get(process.pid); pid !== undefined && pid > 0 && !chain.includes(pid) && chain.length <= ANCESTOR_HOPS_MAX; pid = parentOf.get(pid))
376
+ chain.push(pid);
377
+ return chain.length > 1 ? { pids: chain } : { why: "this process's parent could not be read from the process table" };
378
+ }
379
+ const WAY_OUT = "or stop the process by its PID, or target your own children with `pkill -P $$ ...`";
380
+ const SENTENCE = {
381
+ hit: (f) => `Error (Bash): refusing to run \`${f.text}\` — its selection includes ${f.own ? "this agent's own process" : "a process above this agent (the shell or program that started it)"} (PID ${f.pid}), so running it would terminate the session that is running this command. Narrow the pattern (a word that is in your launcher's command line matches the launcher), ${WAY_OUT}.`,
382
+ computed: (f) => `Error (Bash): refusing to run \`${f.text}\` — which processes it selects is decided when the command runs (${f.why}), so it cannot first be checked against this agent's own process and the processes above it. Write the pattern into the command as a literal, ${WAY_OUT}.`,
383
+ unavailable: (f) => `Error (Bash): refusing to run \`${f.text}\` — the check that its selection holds neither this agent's own process nor a process above it could not run (${f.why}). Stop the process by its PID, or target your own children with \`pkill -P $$ ...\`.`,
384
+ };
385
+ const UNDECLARED_TABLE = "the execution environment does not declare whether its commands run on this agent's process table — `capabilities.sharesProcessTable` is missing or not a boolean";
386
+ async function findingsOnThisTable(readings, signal) {
387
+ const found = [];
388
+ const asked = await Promise.all(readings.map(async (r) => ({ r, answers: await Promise.all(r.probes.map((p) => selected(p, signal))) })));
389
+ let ancestry;
390
+ for (const { r, answers } of asked) {
391
+ if (r.computed !== undefined)
392
+ found.push({ kind: "computed", text: r.text, why: r.computed });
393
+ if (r.everyProcess === true)
394
+ found.push({ kind: "hit", text: r.text, pid: process.pid, own: true });
395
+ for (const a of answers) {
396
+ if ("why" in a) {
397
+ found.push({ kind: "unavailable", text: r.text, why: a.why });
398
+ continue;
399
+ }
400
+ if (a.pids.length === 0)
401
+ continue;
402
+ ancestry ??= await selfAndAncestors(signal);
403
+ if ("why" in ancestry) {
404
+ found.push({ kind: "unavailable", text: r.text, why: ancestry.why });
405
+ continue;
406
+ }
407
+ const pid = ancestry.pids.find((p) => a.pids.includes(p));
408
+ if (pid !== undefined)
409
+ found.push({ kind: "hit", text: r.text, pid, own: pid === process.pid });
410
+ }
411
+ }
412
+ return found;
413
+ }
414
+ export async function patternKillRefusal(command, env, cwd, signal) {
415
+ if (process.platform === "win32")
416
+ return undefined;
417
+ const readings = patternKillReadings(command, cwd).filter((r) => r.probes.length > 0 || r.computed !== undefined || r.everyProcess === true);
418
+ if (readings.length === 0)
419
+ return undefined;
420
+ const table = processTableOf(env);
421
+ if (table === "other")
422
+ return undefined;
423
+ const found = table === "this" ? await findingsOnThisTable(readings, signal) : [{ kind: "unavailable", text: readings[0].text, why: UNDECLARED_TABLE }];
424
+ const f = found.find((x) => x.kind === "hit") ?? found.find((x) => x.kind === "computed") ?? found[0];
425
+ if (f === undefined || signal?.aborted === true)
426
+ return undefined;
427
+ const text = f.kind === "hit" ? SENTENCE.hit(f) : f.kind === "computed" ? SENTENCE.computed(f) : SENTENCE.unavailable(f);
428
+ return errorResult(inlineUntrusted(text, 1_200), { type: "bash_self_kill_refused", code: "bash_self_kill_refused", finding: f.kind, ...(f.kind === "hit" ? { pid: f.pid, relation: f.own ? "engine" : "ancestor" } : {}) });
429
+ }
@@ -54,19 +54,22 @@ export declare function getPdfPageCount(env: ExecutionEnv, absPath: string, byte
54
54
  export declare const PDF_FALLBACK_RENDER_PAGES = 5;
55
55
  /**
56
56
  * PDF capability profile of the SERVING model, consumed by the Read tool's degradation chain (v2):
57
- * - `document` — the brain path can forward a native `{type:"document"}` block (today: anthropic-messages
58
- * WITH vision — anthropic.ts drops document blocks for no-vision models — or an explicit `input`
59
- * declaration containing "document" for a future capability bit).
60
- * - `vision` — `Model.input` contains "image" (absent metadata fails open = today's behavior).
57
+ * - `document` — the brain path can forward a native `{type:"document"}` block: the anthropic-messages lane on a
58
+ * model that holds image input (anthropic.ts drops document blocks exactly when it withholds images).
59
+ * - `vision` — the model holds image input (`capabilityHeld`, the one capability reading; an undeclared `input`
60
+ * is held, as every request reads it).
61
61
  * Structural parameter (no deep Model import): `prepare-task` passes the task's resolved Model.
62
62
  */
63
63
  export interface PdfModelCapabilities {
64
64
  document: boolean;
65
65
  vision: boolean;
66
66
  }
67
- /** Derive {@link PdfModelCapabilities} from a Model-shaped object. `undefined` model = fully capable
68
- * (fail-open: no metadata ⇒ preserve the native document-block behavior, brain-level placeholder guards). */
67
+ /** Derive {@link PdfModelCapabilities} from a Model-shaped object. `undefined` model, or a value with neither `api` nor
68
+ * `input` = fully capable (fail-open: no metadata ⇒ preserve the native document-block behavior, brain-level placeholder
69
+ * guards) — the one reader that looks at the absence itself. A value with an `input` and no `api` is read by its declaration:
70
+ * `vision` follows the image capability and `document` is false (only the anthropic-messages lane forwards a document block). */
69
71
  export declare function pdfModelCapabilitiesOf(model?: {
72
+ id?: string;
70
73
  api?: string;
71
74
  input?: readonly string[];
72
75
  }): PdfModelCapabilities;
@@ -1,4 +1,5 @@
1
1
  import { isTimeCutCode } from "../../internal/harness.js";
2
+ import { capabilityHeld } from "../../brain/model-capability.js";
2
3
  export const PDF_MAX_PAGES_PER_READ = 20;
3
4
  export const PDF_INLINE_PAGE_THRESHOLD = 10;
4
5
  export const PDF_MAX_EXTRACT_SIZE = 100 * 1024 * 1024;
@@ -52,9 +53,8 @@ export const PDF_FALLBACK_RENDER_PAGES = 5;
52
53
  export function pdfModelCapabilitiesOf(model) {
53
54
  if (!model || (model.api === undefined && model.input === undefined))
54
55
  return { document: true, vision: true };
55
- const vision = model.input === undefined ? true : model.input.includes("image");
56
- const document = model.input?.includes("document") === true || (model.api === "anthropic-messages" && vision);
57
- return { document, vision };
56
+ const vision = capabilityHeld(model, "image");
57
+ return { document: model.api === "anthropic-messages" && vision, vision };
58
58
  }
59
59
  export const PDF_EXEC_TIMEOUT_SEC = 120;
60
60
  function cutOf(e) {
@@ -59,6 +59,9 @@ export type ArgRole =
59
59
  /** The program expands `{a,b}` sets and `[a-z]` / `[1-9]` ranges in the value itself before it opens anything
60
60
  * (curl's URL glob), unless the invocation carries an option marked {@link OptionSpec.literalValues}. */
61
61
  readonly programGlob?: true;
62
+ /** The program substitutes its own environment into the value (valgrind's `%q{NAME}`): a value carrying such a substitution
63
+ * names a place the text does not settle. */
64
+ readonly programEnv?: true;
62
65
  /** A writing effect: the seats the program writes the path at (absent: where it lands). */
63
66
  readonly seats?: readonly WriteSeat[];
64
67
  /** A writing effect the program does NOT itself perform at every seat: the seats it does write (`[]`: none — a
@@ -177,13 +180,27 @@ export interface OptionSpec {
177
180
  * reads the station cannot establish ({@link deliversOperands}); the list file itself is a read like any other and meets the deny
178
181
  * rows as itself. */
179
182
  readonly delivers?: "operands";
180
- /** The option's value is a PLACE the program's walk works in or compares (`tar -C DIR`, `diff --from-file=DIR`): a root of a
183
+ /** The option's value is a PLACE the program's walk works in or compares (`diff --from-file=DIR`): a root of a
181
184
  * recursive form, whichever way the value is spelled. Absent: a path value is a file the program READS (a config, ignore or
182
185
  * exclusion file, an archive, a pattern file) or an entry it examines — judged as itself, never a root, so it does not count
183
186
  * as the root the walk was given (`rg --ignore-file ig pat` walks `.`). A list the operands come from ({@link delivers}) is a
184
187
  * root of a recursive form too, in either spelling: the program works on what the list names, not on the working directory
185
188
  * (and, the names not being in the text, the segment is not vouched: {@link deliversOperands}). */
186
189
  readonly walks?: true;
190
+ /** The option's value is the directory the program changes into before it opens the OPERANDS written after it (`tar -C DIR`,
191
+ * both GNU tar and bsdtar): an ordered base — each relative operand after it resolves against it, a second one resolves
192
+ * against the first, the operands before it and every option value (the archive, a list, an exclusion file) against the
193
+ * working directory. The value itself is a place the program names, no root of the walk. */
194
+ readonly rebases?: true;
195
+ /** The option's value is a `KEY=VALUE` setting the program keeps, and the value of a key this table names is a command line the
196
+ * program hands to a shell LATER (`git -c core.pager=…`, `git -c 'alias.x=!…'`): a code body of the program ({@link CodeBody}
197
+ * `option-values`). `valueFrom: "environment"`: the setting's VALUE is the content of the environment variable the word names
198
+ * (`git --config-env=core.pager=VAR`) — text the command does not spell. The table is read off the program's own
199
+ * documentation, never off the command. */
200
+ readonly runsLater?: {
201
+ readonly keys: readonly LaterRunKey[];
202
+ readonly valueFrom?: "environment";
203
+ };
187
204
  /** The option's value bounds the program's output, in bytes or in lines (`head -c` / `head -n`). */
188
205
  readonly bounds?: "bytes" | "lines";
189
206
  /** The option's value is what the row's LAST operand would otherwise be (`cp -t <dir>`), so every operand is an
@@ -192,6 +209,10 @@ export interface OptionSpec {
192
209
  /** An enum option: selecting the value (case-folded, any unambiguous prefix of it) makes the operands roots of a
193
210
  * tree walk (`grep -d recurse`). */
194
211
  readonly selectsWhenValue?: string;
212
+ /** Given exactly this value, the option RUNS what the program holds at once, whatever else is selected — as an
213
+ * `effect: "executes"` option does (`fc -e -`: no editor, the stored line runs even beside `-l`); any other value is
214
+ * read by the option's role alone (`fc -e vi -l` only lists). */
215
+ readonly executesWhenValue?: string;
195
216
  /** This option delivers what the row's first positional would otherwise be (grep's `-e`, sed's `-f`, an
196
217
  * interpreter's `-c`), so the first operand is an ordinary operand after it. */
197
218
  readonly fillsSlot?: true;
@@ -217,6 +238,18 @@ export interface OptionSpec {
217
238
  * the names, `declare -p`; names functions, `-f`; or a bash it runs on refuses the switch, bash 3.2's `declare -g`). */
218
239
  readonly assigns?: DeclaredAttribute;
219
240
  }
241
+ /** One key of {@link OptionSpec.runsLater}: `key` the setting's name, case-folded, `*` standing for any run of characters (a
242
+ * subsection, a variable name); `bang` — only a value led by `!` is a command line (the text after the `!`), any other value
243
+ * names something the program resolves itself; `prefixed` — a value led by `!` is a shell snippet (the text after it), one led
244
+ * by `/` the command as written, any other value is run with this text in front of it (git's credential helpers: `git
245
+ * credential-<value>`); `orBoolean` — a boolean value (`true` / `false` / `yes` / `no` / `on` / `off` / `1` / `0`, or empty)
246
+ * switches a behaviour and is no command line. */
247
+ export interface LaterRunKey {
248
+ readonly key: string;
249
+ readonly bang?: true;
250
+ readonly prefixed?: string;
251
+ readonly orBoolean?: true;
252
+ }
220
253
  /** What a declaration builtin does to the names it binds ({@link OptionSpec.assigns}). */
221
254
  export type DeclaredAttribute = "integer" | "reference" | "transformed" | "frozen" | "unsettled";
222
255
  /** One implementation's option grammar. `any` = every implementation the row was measured on reads it this way. */
@@ -338,11 +371,13 @@ export interface DeliverySpec {
338
371
  readonly stdinWhenUnnamed: boolean;
339
372
  }
340
373
  /** The shell text a re-entry program runs: `-c`'s value, its words joined (`eval`), its non-option words (`parallel`),
341
- * or none (`source FILE` reads a file operand). `stdin: "script"`: where its argv names no text and no script file, it
342
- * runs its STANDARD INPUT (`bash <<EOF`, `… | sh`, `parallel < commands`). */
374
+ * none (`source FILE` reads a file operand), or a line of the shell's own HISTORY list (`fc -s`, `fc -e -`, bare `fc`: no word
375
+ * of the command spells it, so it is a text built when the command runs — unless an option the row marks `banner` makes it
376
+ * print instead, `fc -l`). `stdin: "script"`: where its argv names no text and no script file, it runs its STANDARD INPUT
377
+ * (`bash <<EOF`, `… | sh`, `parallel < commands`). */
343
378
  export type ShellReentry = {
344
379
  readonly kind: "shell";
345
- readonly text: "c-option" | "words" | "non-option-words" | "file-operand";
380
+ readonly text: "c-option" | "words" | "non-option-words" | "file-operand" | "history";
346
381
  readonly stdin?: "script";
347
382
  }
348
383
  /** Its operands arrive on a stream and it execs `defaultProgram` when the chain names none (`xargs`). */
@@ -350,8 +385,9 @@ export type ShellReentry = {
350
385
  readonly kind: "argv";
351
386
  readonly defaultProgram: string;
352
387
  };
353
- /** Where a builtin keeps shell text it runs later: its first operand after the options (`trap`), the values of its
354
- * `NAME=VALUE` operands (`alias`), or the values of its shell-text options (`mapfile -C`). */
388
+ /** Where a program keeps shell text it runs later: its first operand after the options (`trap`), the values of its
389
+ * `NAME=VALUE` operands (`alias`), or the values of its shell-text options (`mapfile -C`) — and of a setting option whose key
390
+ * names a command line ({@link OptionSpec.runsLater}: `git -c core.pager=…`). */
355
391
  export type CodeBody = "first-operand" | "assignment-values" | "option-values";
356
392
  /** How a row is checked against the program: the gate runs the binary, or the row says why it cannot. */
357
393
  export type Witness = "binary" | {
@@ -392,6 +428,10 @@ export interface ProgramRow {
392
428
  /** Modules the interpreter runs by name (`python -m <module>`) whose own argv tail is not argv: the role of every word
393
429
  * after the module name (`timeit` compiles and runs it as program text). */
394
430
  readonly modules?: Readonly<Record<string, ArgRole>>;
431
+ /** Each grammar declares EVERY option its implementation takes (measured): a spelling one does not declare is an option
432
+ * that implementation refuses — getopt reports it and the program runs nothing ({@link rowRefusesArgv}). Absent, an
433
+ * undeclared spelling may be one the row does not model, and no reader concludes anything from it. */
434
+ readonly optionsComplete?: true;
395
435
  readonly witness: Witness;
396
436
  }
397
437
  /** The row bash runs for this basename: the exact key, or — for a row that declares versioned spellings — the name
@@ -518,7 +558,8 @@ export declare function programGlobExpansions(value: string): readonly string[]
518
558
  * the no. A plain path offers itself; an `indirect` one itself and what it names past an `@`; a `header` only a
519
559
  * whole-word `@<file>`; a `form` field spec the files after its `@` / `<`; a `url` the local path of a `file:` URL. A
520
560
  * `programGlob` value offers what each of its expansions offers (`globs: "literal"` = the invocation turned the glob
521
- * off); `undefined` = it expands past {@link PROGRAM_GLOB_MAX}: it names files the reader does not list.
561
+ * off); `undefined` = it expands past {@link PROGRAM_GLOB_MAX}, or it carries a substitution of the program's own environment
562
+ * (`programEnv`): it names files the reader does not list.
522
563
  */
523
564
  export declare function slotValueCandidates(value: string, role: ArgRole, globs?: "expanded" | "literal"): string[] | undefined;
524
565
  /** The paths an object name `<rev>:<path>` ({@link ArgRole} `object-path`) may spell: the text after each `:` (a stage
@@ -677,6 +718,10 @@ interface OptionScan {
677
718
  readonly name: string;
678
719
  }[];
679
720
  readonly operands: readonly number[];
721
+ /** ONE implementation's reading met an option word naming a spelling its grammar does not declare, where that
722
+ * implementation certainly reads the word as an option: before the first operand, or anywhere in a grammar that
723
+ * permutes (`afterFirstOperand: "options"`). Past `--` nothing is an option. */
724
+ readonly undeclared: boolean;
680
725
  }
681
726
  /**
682
727
  * Every option spec an argv selects. A short cluster is read as getopt reads it, scanning left to right: a declared
@@ -698,6 +743,11 @@ export declare function selectedSpellings(row: ProgramRow, args: readonly string
698
743
  * declares (another implementation's) that this one does not? getopt calls it an invalid option: the program runs
699
744
  * nothing. */
700
745
  export declare function implementationRejects(row: ProgramRow, view: ProgramRow, words: readonly string[]): boolean;
746
+ /** Does EVERY implementation of a row whose grammars declare all its options ({@link ProgramRow.optionsComplete}) refuse
747
+ * this argv — an option word it certainly reads as an option names a spelling it does not declare
748
+ * ({@link OptionScan.undeclared})? getopt reports the invalid option and the program runs nothing (`rm -m pytest .`,
749
+ * `rm -rfE .`). One implementation that takes the argv is enough for it to run; a row that is not complete refuses nothing. */
750
+ export declare function rowRefusesArgv(row: ProgramRow, args: readonly string[]): boolean;
701
751
  /** A path role whose effect writes. */
702
752
  export type WritingRole = Extract<ArgRole, {
703
753
  kind: "path";