@namzu/sdk 46.0.0 → 48.1.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 (768) hide show
  1. package/CHANGELOG.md +351 -8
  2. package/README.md +7 -8
  3. package/dist/advisory/history.d.ts.map +1 -1
  4. package/dist/advisory/history.js +21 -1
  5. package/dist/advisory/history.js.map +1 -1
  6. package/dist/advisory/index.d.ts +1 -1
  7. package/dist/advisory/index.d.ts.map +1 -1
  8. package/dist/advisory/index.js +1 -1
  9. package/dist/advisory/index.js.map +1 -1
  10. package/dist/advisory/registry.d.ts +17 -0
  11. package/dist/advisory/registry.d.ts.map +1 -1
  12. package/dist/advisory/registry.js +26 -0
  13. package/dist/advisory/registry.js.map +1 -1
  14. package/dist/agents/PipelineAgent.d.ts +2 -46
  15. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  16. package/dist/agents/PipelineAgent.js +2 -242
  17. package/dist/agents/PipelineAgent.js.map +1 -1
  18. package/dist/agents/QueryAgent.d.ts +21 -0
  19. package/dist/agents/QueryAgent.d.ts.map +1 -0
  20. package/dist/agents/QueryAgent.js +214 -0
  21. package/dist/agents/QueryAgent.js.map +1 -0
  22. package/dist/agents/ReactiveAgent.d.ts +4 -16
  23. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  24. package/dist/agents/ReactiveAgent.js +4 -183
  25. package/dist/agents/ReactiveAgent.js.map +1 -1
  26. package/dist/agents/RouterAgent.d.ts +2 -20
  27. package/dist/agents/RouterAgent.d.ts.map +1 -1
  28. package/dist/agents/RouterAgent.js +2 -266
  29. package/dist/agents/RouterAgent.js.map +1 -1
  30. package/dist/agents/SupervisorAgent.d.ts +3 -43
  31. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  32. package/dist/agents/SupervisorAgent.js +3 -418
  33. package/dist/agents/SupervisorAgent.js.map +1 -1
  34. package/dist/agents/defineAgent.d.ts +2 -1
  35. package/dist/agents/defineAgent.d.ts.map +1 -1
  36. package/dist/agents/defineAgent.js +6 -1
  37. package/dist/agents/defineAgent.js.map +1 -1
  38. package/dist/agents/examples/PipelineAgent.d.ts +46 -0
  39. package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
  40. package/dist/agents/examples/PipelineAgent.js +242 -0
  41. package/dist/agents/examples/PipelineAgent.js.map +1 -0
  42. package/dist/agents/examples/RouterAgent.d.ts +22 -0
  43. package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
  44. package/dist/agents/examples/RouterAgent.js +268 -0
  45. package/dist/agents/examples/RouterAgent.js.map +1 -0
  46. package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
  47. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
  48. package/dist/agents/examples/SupervisorAgent.js +406 -0
  49. package/dist/agents/examples/SupervisorAgent.js.map +1 -0
  50. package/dist/agents/explore.d.ts +6 -3
  51. package/dist/agents/explore.d.ts.map +1 -1
  52. package/dist/agents/explore.js +6 -3
  53. package/dist/agents/explore.js.map +1 -1
  54. package/dist/agents/forward-options.d.ts +11 -0
  55. package/dist/agents/forward-options.d.ts.map +1 -0
  56. package/dist/agents/forward-options.js +15 -0
  57. package/dist/agents/forward-options.js.map +1 -0
  58. package/dist/agents/index.d.ts +1 -0
  59. package/dist/agents/index.d.ts.map +1 -1
  60. package/dist/agents/index.js +2 -0
  61. package/dist/agents/index.js.map +1 -1
  62. package/dist/agents/runAgent.d.ts +19 -8
  63. package/dist/agents/runAgent.d.ts.map +1 -1
  64. package/dist/agents/runAgent.js +99 -29
  65. package/dist/agents/runAgent.js.map +1 -1
  66. package/dist/authorization/command-line.d.ts +2 -0
  67. package/dist/authorization/command-line.d.ts.map +1 -1
  68. package/dist/authorization/command-line.js +2 -2
  69. package/dist/authorization/command-line.js.map +1 -1
  70. package/dist/authorization/gate.d.ts +8 -0
  71. package/dist/authorization/gate.d.ts.map +1 -1
  72. package/dist/authorization/gate.js +12 -1
  73. package/dist/authorization/gate.js.map +1 -1
  74. package/dist/authorization/program.d.ts +151 -0
  75. package/dist/authorization/program.d.ts.map +1 -0
  76. package/dist/authorization/program.js +713 -0
  77. package/dist/authorization/program.js.map +1 -0
  78. package/dist/authorization/reexec-wrapper.d.ts +106 -0
  79. package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
  80. package/dist/authorization/reexec-wrapper.js +532 -0
  81. package/dist/authorization/reexec-wrapper.js.map +1 -0
  82. package/dist/authorization/rules.d.ts +9 -0
  83. package/dist/authorization/rules.d.ts.map +1 -1
  84. package/dist/authorization/rules.js +8 -1
  85. package/dist/authorization/rules.js.map +1 -1
  86. package/dist/authorization/shell-lexer.d.ts +19 -4
  87. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  88. package/dist/authorization/shell-lexer.js +91 -65
  89. package/dist/authorization/shell-lexer.js.map +1 -1
  90. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  91. package/dist/bridge/sse/mapper.js +6 -0
  92. package/dist/bridge/sse/mapper.js.map +1 -1
  93. package/dist/capabilities/index.d.ts +54 -0
  94. package/dist/capabilities/index.d.ts.map +1 -0
  95. package/dist/capabilities/index.js +92 -0
  96. package/dist/capabilities/index.js.map +1 -0
  97. package/dist/config/registry.d.ts +2 -1
  98. package/dist/config/registry.d.ts.map +1 -1
  99. package/dist/config/registry.js +3 -2
  100. package/dist/config/registry.js.map +1 -1
  101. package/dist/connector/index.d.ts +4 -4
  102. package/dist/connector/index.d.ts.map +1 -1
  103. package/dist/connector/index.js +3 -3
  104. package/dist/connector/index.js.map +1 -1
  105. package/dist/connector/mcp/adapter.d.ts +16 -1
  106. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  107. package/dist/connector/mcp/adapter.js +71 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +32 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +383 -5
  112. package/dist/connector/mcp/client.js.map +1 -1
  113. package/dist/connector/mcp/discovery.d.ts +24 -1
  114. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  115. package/dist/connector/mcp/discovery.js +44 -0
  116. package/dist/connector/mcp/discovery.js.map +1 -1
  117. package/dist/connector/mcp/era.d.ts.map +1 -1
  118. package/dist/connector/mcp/era.js +7 -0
  119. package/dist/connector/mcp/era.js.map +1 -1
  120. package/dist/connector/mcp/index.d.ts +2 -0
  121. package/dist/connector/mcp/index.d.ts.map +1 -1
  122. package/dist/connector/mcp/index.js +11 -0
  123. package/dist/connector/mcp/index.js.map +1 -1
  124. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  125. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  126. package/dist/connector/mcp/mcp-toolset.js +399 -0
  127. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  128. package/dist/connector/mcp/streamable-http.d.ts +15 -0
  129. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  130. package/dist/connector/mcp/streamable-http.js +281 -6
  131. package/dist/connector/mcp/streamable-http.js.map +1 -1
  132. package/dist/connector/tools/index.d.ts +2 -2
  133. package/dist/connector/tools/index.d.ts.map +1 -1
  134. package/dist/connector/tools/index.js +1 -1
  135. package/dist/connector/tools/index.js.map +1 -1
  136. package/dist/connector/tools/router.d.ts +15 -13
  137. package/dist/connector/tools/router.d.ts.map +1 -1
  138. package/dist/connector/tools/router.js +30 -51
  139. package/dist/connector/tools/router.js.map +1 -1
  140. package/dist/contracts/a2a.d.ts +2 -2
  141. package/dist/directory/derive-supervisor.d.ts +2 -2
  142. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  143. package/dist/directory/derive-supervisor.js +6 -7
  144. package/dist/directory/derive-supervisor.js.map +1 -1
  145. package/dist/directory/derive.d.ts.map +1 -1
  146. package/dist/directory/derive.js +5 -5
  147. package/dist/directory/derive.js.map +1 -1
  148. package/dist/execution/code-runtime/types.d.ts +2 -2
  149. package/dist/execution/code-runtime/types.js +1 -1
  150. package/dist/invariants/index.d.ts +2 -1
  151. package/dist/invariants/index.d.ts.map +1 -1
  152. package/dist/invariants/index.js +3 -2
  153. package/dist/invariants/index.js.map +1 -1
  154. package/dist/manager/agent/lifecycle.d.ts +1 -0
  155. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  156. package/dist/manager/agent/lifecycle.js +146 -18
  157. package/dist/manager/agent/lifecycle.js.map +1 -1
  158. package/dist/manager/connector/environment.d.ts +6 -0
  159. package/dist/manager/connector/environment.d.ts.map +1 -1
  160. package/dist/manager/connector/environment.js +11 -4
  161. package/dist/manager/connector/environment.js.map +1 -1
  162. package/dist/manager/connector/index.d.ts +2 -2
  163. package/dist/manager/connector/index.d.ts.map +1 -1
  164. package/dist/manager/connector/index.js +2 -2
  165. package/dist/manager/connector/index.js.map +1 -1
  166. package/dist/manager/connector/tenant.d.ts +6 -0
  167. package/dist/manager/connector/tenant.d.ts.map +1 -1
  168. package/dist/manager/connector/tenant.js +11 -4
  169. package/dist/manager/connector/tenant.js.map +1 -1
  170. package/dist/manager/index.d.ts +2 -2
  171. package/dist/manager/index.d.ts.map +1 -1
  172. package/dist/manager/index.js +2 -2
  173. package/dist/manager/index.js.map +1 -1
  174. package/dist/manager/resident/initiative.d.ts +6 -6
  175. package/dist/manager/resident/learning-observation.d.ts +4 -4
  176. package/dist/manager/resident/learning.d.ts +36 -36
  177. package/dist/manager/resident/outbox.d.ts +4 -4
  178. package/dist/manager/session/attribution.d.ts +22 -0
  179. package/dist/manager/session/attribution.d.ts.map +1 -0
  180. package/dist/manager/session/attribution.js +64 -0
  181. package/dist/manager/session/attribution.js.map +1 -0
  182. package/dist/manager/session/turn-recorder.d.ts +14 -0
  183. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  184. package/dist/manager/session/turn-recorder.js +208 -55
  185. package/dist/manager/session/turn-recorder.js.map +1 -1
  186. package/dist/peers/address.d.ts +36 -0
  187. package/dist/peers/address.d.ts.map +1 -0
  188. package/dist/peers/address.js +52 -0
  189. package/dist/peers/address.js.map +1 -0
  190. package/dist/peers/client.d.ts +47 -0
  191. package/dist/peers/client.d.ts.map +1 -0
  192. package/dist/peers/client.js +132 -0
  193. package/dist/peers/client.js.map +1 -0
  194. package/dist/peers/dir.d.ts +88 -0
  195. package/dist/peers/dir.d.ts.map +1 -0
  196. package/dist/peers/dir.js +139 -0
  197. package/dist/peers/dir.js.map +1 -0
  198. package/dist/peers/endpoint.d.ts +144 -0
  199. package/dist/peers/endpoint.d.ts.map +1 -0
  200. package/dist/peers/endpoint.js +420 -0
  201. package/dist/peers/endpoint.js.map +1 -0
  202. package/dist/peers/envelope.d.ts +42 -0
  203. package/dist/peers/envelope.d.ts.map +1 -0
  204. package/dist/peers/envelope.js +110 -0
  205. package/dist/peers/envelope.js.map +1 -0
  206. package/dist/peers/index.d.ts +30 -0
  207. package/dist/peers/index.d.ts.map +1 -0
  208. package/dist/peers/index.js +22 -0
  209. package/dist/peers/index.js.map +1 -0
  210. package/dist/peers/protocol.d.ts +645 -0
  211. package/dist/peers/protocol.d.ts.map +1 -0
  212. package/dist/peers/protocol.js +151 -0
  213. package/dist/peers/protocol.js.map +1 -0
  214. package/dist/peers/record.d.ts +71 -0
  215. package/dist/peers/record.d.ts.map +1 -0
  216. package/dist/peers/record.js +45 -0
  217. package/dist/peers/record.js.map +1 -0
  218. package/dist/peers/registry.d.ts +54 -0
  219. package/dist/peers/registry.d.ts.map +1 -0
  220. package/dist/peers/registry.js +213 -0
  221. package/dist/peers/registry.js.map +1 -0
  222. package/dist/plugin/define.d.ts +24 -0
  223. package/dist/plugin/define.d.ts.map +1 -0
  224. package/dist/plugin/define.js +42 -0
  225. package/dist/plugin/define.js.map +1 -0
  226. package/dist/plugin/index.d.ts +2 -0
  227. package/dist/plugin/index.d.ts.map +1 -1
  228. package/dist/plugin/index.js +1 -0
  229. package/dist/plugin/index.js.map +1 -1
  230. package/dist/plugin/lifecycle.d.ts +27 -3
  231. package/dist/plugin/lifecycle.d.ts.map +1 -1
  232. package/dist/plugin/lifecycle.js +242 -92
  233. package/dist/plugin/lifecycle.js.map +1 -1
  234. package/dist/plugin/resolver.d.ts +2 -2
  235. package/dist/plugin/resolver.d.ts.map +1 -1
  236. package/dist/plugin/resolver.js.map +1 -1
  237. package/dist/plugin/shell-hook.d.ts.map +1 -1
  238. package/dist/plugin/shell-hook.js +17 -3
  239. package/dist/plugin/shell-hook.js.map +1 -1
  240. package/dist/probe/errors.d.ts +2 -1
  241. package/dist/probe/errors.d.ts.map +1 -1
  242. package/dist/probe/errors.js +3 -2
  243. package/dist/probe/errors.js.map +1 -1
  244. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  245. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  246. package/dist/prompt/coding-agent-doctrine.js +11 -6
  247. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  248. package/dist/prompt/contributions.d.ts +4 -1
  249. package/dist/prompt/contributions.d.ts.map +1 -1
  250. package/dist/prompt/contributions.js +7 -2
  251. package/dist/prompt/contributions.js.map +1 -1
  252. package/dist/prompt/index.d.ts +1 -1
  253. package/dist/prompt/index.d.ts.map +1 -1
  254. package/dist/prompt/index.js +1 -1
  255. package/dist/prompt/index.js.map +1 -1
  256. package/dist/provider/collect-chat-completion.d.ts +6 -1
  257. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  258. package/dist/provider/collect-chat-completion.js +88 -10
  259. package/dist/provider/collect-chat-completion.js.map +1 -1
  260. package/dist/provider/mock.d.ts.map +1 -1
  261. package/dist/provider/mock.js +23 -6
  262. package/dist/provider/mock.js.map +1 -1
  263. package/dist/provider/registry.d.ts +2 -1
  264. package/dist/provider/registry.d.ts.map +1 -1
  265. package/dist/provider/registry.js +3 -2
  266. package/dist/provider/registry.js.map +1 -1
  267. package/dist/provider/tool-call-framing.d.ts +164 -0
  268. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  269. package/dist/provider/tool-call-framing.js +163 -0
  270. package/dist/provider/tool-call-framing.js.map +1 -0
  271. package/dist/public-runtime.d.ts +24 -11
  272. package/dist/public-runtime.d.ts.map +1 -1
  273. package/dist/public-runtime.js +45 -9
  274. package/dist/public-runtime.js.map +1 -1
  275. package/dist/public-tools.d.ts +6 -4
  276. package/dist/public-tools.d.ts.map +1 -1
  277. package/dist/public-tools.js +8 -3
  278. package/dist/public-tools.js.map +1 -1
  279. package/dist/public-types.d.ts +13 -2
  280. package/dist/public-types.d.ts.map +1 -1
  281. package/dist/read-model/registry.d.ts +2 -1
  282. package/dist/read-model/registry.d.ts.map +1 -1
  283. package/dist/read-model/registry.js +3 -2
  284. package/dist/read-model/registry.js.map +1 -1
  285. package/dist/registry/ManagedRegistry.d.ts +30 -0
  286. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  287. package/dist/registry/ManagedRegistry.js +45 -6
  288. package/dist/registry/ManagedRegistry.js.map +1 -1
  289. package/dist/registry/collision.d.ts +57 -0
  290. package/dist/registry/collision.d.ts.map +1 -0
  291. package/dist/registry/collision.js +41 -0
  292. package/dist/registry/collision.js.map +1 -0
  293. package/dist/registry/command/index.d.ts +5 -3
  294. package/dist/registry/command/index.d.ts.map +1 -1
  295. package/dist/registry/command/index.js +6 -4
  296. package/dist/registry/command/index.js.map +1 -1
  297. package/dist/registry/index.d.ts +3 -4
  298. package/dist/registry/index.d.ts.map +1 -1
  299. package/dist/registry/index.js +2 -2
  300. package/dist/registry/index.js.map +1 -1
  301. package/dist/registry/plugin/index.d.ts.map +1 -1
  302. package/dist/registry/plugin/index.js +14 -1
  303. package/dist/registry/plugin/index.js.map +1 -1
  304. package/dist/registry/tool/callable.d.ts +7 -7
  305. package/dist/registry/tool/callable.d.ts.map +1 -1
  306. package/dist/registry/tool/callable.js +6 -7
  307. package/dist/registry/tool/callable.js.map +1 -1
  308. package/dist/registry/tool/execute.d.ts +14 -77
  309. package/dist/registry/tool/execute.d.ts.map +1 -1
  310. package/dist/registry/tool/execute.js +15 -727
  311. package/dist/registry/tool/execute.js.map +1 -1
  312. package/dist/registry/tool/portable.d.ts +25 -0
  313. package/dist/registry/tool/portable.d.ts.map +1 -1
  314. package/dist/registry/tool/portable.js +50 -0
  315. package/dist/registry/tool/portable.js.map +1 -1
  316. package/dist/registry/tool/presentation.d.ts +6 -5
  317. package/dist/registry/tool/presentation.d.ts.map +1 -1
  318. package/dist/registry/tool/presentation.js +3 -3
  319. package/dist/registry/tool/presentation.js.map +1 -1
  320. package/dist/runtime/bidi/session.d.ts +5 -4
  321. package/dist/runtime/bidi/session.d.ts.map +1 -1
  322. package/dist/runtime/bidi/session.js +18 -1
  323. package/dist/runtime/bidi/session.js.map +1 -1
  324. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  325. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  326. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  327. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  328. package/dist/runtime/query/executor.d.ts +33 -3
  329. package/dist/runtime/query/executor.d.ts.map +1 -1
  330. package/dist/runtime/query/executor.js +86 -10
  331. package/dist/runtime/query/executor.js.map +1 -1
  332. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  333. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  334. package/dist/runtime/query/file-evidence-replay.js +8 -7
  335. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  336. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  337. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  338. package/dist/runtime/query/fork/prepare.js +4 -0
  339. package/dist/runtime/query/fork/prepare.js.map +1 -1
  340. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  341. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  342. package/dist/runtime/query/guardrail-presets.js +4 -3
  343. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  344. package/dist/runtime/query/index.d.ts +23 -10
  345. package/dist/runtime/query/index.d.ts.map +1 -1
  346. package/dist/runtime/query/index.js +149 -70
  347. package/dist/runtime/query/index.js.map +1 -1
  348. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/index.js +8 -1
  350. package/dist/runtime/query/iteration/index.js.map +1 -1
  351. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  352. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  353. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  354. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  355. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  356. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  357. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  358. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  359. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  360. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  361. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  362. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  363. package/dist/runtime/query/iteration/tool-input.js +291 -0
  364. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  365. package/dist/runtime/query/observation-context.d.ts +2 -2
  366. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  367. package/dist/runtime/query/observation-context.js.map +1 -1
  368. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  369. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  370. package/dist/runtime/query/prelude-lease.js +121 -0
  371. package/dist/runtime/query/prelude-lease.js.map +1 -0
  372. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  373. package/dist/runtime/query/prepare-turn.js +386 -187
  374. package/dist/runtime/query/prepare-turn.js.map +1 -1
  375. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  376. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  377. package/dist/runtime/query/prompt.d.ts +2 -2
  378. package/dist/runtime/query/prompt.d.ts.map +1 -1
  379. package/dist/runtime/query/prompt.js +1 -1
  380. package/dist/runtime/query/prompt.js.map +1 -1
  381. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  382. package/dist/runtime/query/resume-session.js +37 -2
  383. package/dist/runtime/query/resume-session.js.map +1 -1
  384. package/dist/runtime/query/review-policy.d.ts +22 -3
  385. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  386. package/dist/runtime/query/review-policy.js +84 -6
  387. package/dist/runtime/query/review-policy.js.map +1 -1
  388. package/dist/runtime/query/tooling.d.ts +3 -2
  389. package/dist/runtime/query/tooling.d.ts.map +1 -1
  390. package/dist/runtime/query/tooling.js.map +1 -1
  391. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  392. package/dist/runtime/query/turn-state.js +5 -0
  393. package/dist/runtime/query/turn-state.js.map +1 -1
  394. package/dist/runtime/system-events.d.ts +112 -0
  395. package/dist/runtime/system-events.d.ts.map +1 -0
  396. package/dist/runtime/system-events.js +183 -0
  397. package/dist/runtime/system-events.js.map +1 -0
  398. package/dist/scheduler/delegating.d.ts +2 -1
  399. package/dist/scheduler/delegating.d.ts.map +1 -1
  400. package/dist/scheduler/delegating.js +3 -2
  401. package/dist/scheduler/delegating.js.map +1 -1
  402. package/dist/scheduler/local.d.ts.map +1 -1
  403. package/dist/scheduler/local.js +2 -0
  404. package/dist/scheduler/local.js.map +1 -1
  405. package/dist/session/retention/archive.js +1 -1
  406. package/dist/session/retention/archive.js.map +1 -1
  407. package/dist/skills/index.d.ts +1 -1
  408. package/dist/skills/index.d.ts.map +1 -1
  409. package/dist/skills/index.js +1 -1
  410. package/dist/skills/index.js.map +1 -1
  411. package/dist/skills/registry.d.ts +12 -0
  412. package/dist/skills/registry.d.ts.map +1 -1
  413. package/dist/skills/registry.js +19 -0
  414. package/dist/skills/registry.js.map +1 -1
  415. package/dist/store/evidence/index-page.d.ts +2 -2
  416. package/dist/store/session/disk.d.ts.map +1 -1
  417. package/dist/store/session/disk.js +2 -0
  418. package/dist/store/session/disk.js.map +1 -1
  419. package/dist/store/session-log/conformance.d.ts +1 -1
  420. package/dist/store/session-log/conformance.d.ts.map +1 -1
  421. package/dist/store/session-log/conformance.js +49 -8
  422. package/dist/store/session-log/conformance.js.map +1 -1
  423. package/dist/store/session-log/core.d.ts +8 -3
  424. package/dist/store/session-log/core.d.ts.map +1 -1
  425. package/dist/store/session-log/core.js +2 -1
  426. package/dist/store/session-log/core.js.map +1 -1
  427. package/dist/store/session-log/fold.d.ts +12 -0
  428. package/dist/store/session-log/fold.d.ts.map +1 -1
  429. package/dist/store/session-log/fold.js +57 -7
  430. package/dist/store/session-log/fold.js.map +1 -1
  431. package/dist/store/session-log/index.d.ts +2 -2
  432. package/dist/store/session-log/index.d.ts.map +1 -1
  433. package/dist/store/session-log/index.js +1 -1
  434. package/dist/store/session-log/index.js.map +1 -1
  435. package/dist/test-support/toolset.d.ts +19 -0
  436. package/dist/test-support/toolset.d.ts.map +1 -0
  437. package/dist/test-support/toolset.js +20 -0
  438. package/dist/test-support/toolset.js.map +1 -0
  439. package/dist/tools/builtins/bash.d.ts +29 -0
  440. package/dist/tools/builtins/bash.d.ts.map +1 -1
  441. package/dist/tools/builtins/bash.js +19 -9
  442. package/dist/tools/builtins/bash.js.map +1 -1
  443. package/dist/tools/builtins/browser-url.d.ts +1 -1
  444. package/dist/tools/builtins/browser-url.js +1 -1
  445. package/dist/tools/builtins/browser.d.ts +6 -6
  446. package/dist/tools/builtins/browser.js +2 -2
  447. package/dist/tools/builtins/browser.js.map +1 -1
  448. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  449. package/dist/tools/builtins/computer-use.js +19 -11
  450. package/dist/tools/builtins/computer-use.js.map +1 -1
  451. package/dist/tools/builtins/edit.d.ts.map +1 -1
  452. package/dist/tools/builtins/edit.js +9 -1
  453. package/dist/tools/builtins/edit.js.map +1 -1
  454. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  455. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  456. package/dist/tools/builtins/json-string-hint.js +17 -0
  457. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  458. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  459. package/dist/tools/builtins/search-tools.js +7 -15
  460. package/dist/tools/builtins/search-tools.js.map +1 -1
  461. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  462. package/dist/tools/builtins/write-file.js +11 -0
  463. package/dist/tools/builtins/write-file.js.map +1 -1
  464. package/dist/tools/command-shell.d.ts +10 -0
  465. package/dist/tools/command-shell.d.ts.map +1 -1
  466. package/dist/tools/command-shell.js +45 -1
  467. package/dist/tools/command-shell.js.map +1 -1
  468. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  469. package/dist/tools/coordinator/agent.js +5 -0
  470. package/dist/tools/coordinator/agent.js.map +1 -1
  471. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  472. package/dist/tools/coordinator/ask-user-question.js +26 -13
  473. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  474. package/dist/tools/coordinator/index.d.ts.map +1 -1
  475. package/dist/tools/coordinator/index.js +5 -0
  476. package/dist/tools/coordinator/index.js.map +1 -1
  477. package/dist/tools/coordinator/question-options.d.ts +78 -0
  478. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  479. package/dist/tools/coordinator/question-options.js +153 -0
  480. package/dist/tools/coordinator/question-options.js.map +1 -0
  481. package/dist/tools/defineTool.d.ts +10 -0
  482. package/dist/tools/defineTool.d.ts.map +1 -1
  483. package/dist/tools/defineTool.js +17 -0
  484. package/dist/tools/defineTool.js.map +1 -1
  485. package/dist/tools/memory/search.d.ts.map +1 -1
  486. package/dist/tools/memory/search.js +4 -1
  487. package/dist/tools/memory/search.js.map +1 -1
  488. package/dist/tools/memory/update.d.ts.map +1 -1
  489. package/dist/tools/memory/update.js +8 -5
  490. package/dist/tools/memory/update.js.map +1 -1
  491. package/dist/tools/render-nonce.d.ts +47 -0
  492. package/dist/tools/render-nonce.d.ts.map +1 -0
  493. package/dist/tools/render-nonce.js +63 -0
  494. package/dist/tools/render-nonce.js.map +1 -0
  495. package/dist/tools/roster.d.ts +46 -19
  496. package/dist/tools/roster.d.ts.map +1 -1
  497. package/dist/tools/roster.js +63 -33
  498. package/dist/tools/roster.js.map +1 -1
  499. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  500. package/dist/tools/schedules/schedule-tool.js +94 -14
  501. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  502. package/dist/tools/schedules/types.d.ts +52 -6
  503. package/dist/tools/schedules/types.d.ts.map +1 -1
  504. package/dist/tools/trusted-read-only.d.ts +9 -5
  505. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  506. package/dist/tools/trusted-read-only.js +14 -10
  507. package/dist/tools/trusted-read-only.js.map +1 -1
  508. package/dist/tools/untrusted-envelope.d.ts +67 -28
  509. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  510. package/dist/tools/untrusted-envelope.js +108 -59
  511. package/dist/tools/untrusted-envelope.js.map +1 -1
  512. package/dist/toolsets/combine.d.ts +44 -0
  513. package/dist/toolsets/combine.d.ts.map +1 -0
  514. package/dist/toolsets/combine.js +153 -0
  515. package/dist/toolsets/combine.js.map +1 -0
  516. package/dist/toolsets/manager.d.ts +201 -0
  517. package/dist/toolsets/manager.d.ts.map +1 -0
  518. package/dist/toolsets/manager.js +837 -0
  519. package/dist/toolsets/manager.js.map +1 -0
  520. package/dist/toolsets/source-glob.d.ts +15 -0
  521. package/dist/toolsets/source-glob.d.ts.map +1 -0
  522. package/dist/toolsets/source-glob.js +23 -0
  523. package/dist/toolsets/source-glob.js.map +1 -0
  524. package/dist/toolsets/toolset.d.ts +20 -0
  525. package/dist/toolsets/toolset.d.ts.map +1 -0
  526. package/dist/toolsets/toolset.js +28 -0
  527. package/dist/toolsets/toolset.js.map +1 -0
  528. package/dist/toolsets/types.d.ts +128 -0
  529. package/dist/toolsets/types.d.ts.map +1 -0
  530. package/dist/toolsets/types.js +33 -0
  531. package/dist/toolsets/types.js.map +1 -0
  532. package/dist/toolsets/wrappers.d.ts +59 -0
  533. package/dist/toolsets/wrappers.d.ts.map +1 -0
  534. package/dist/toolsets/wrappers.js +165 -0
  535. package/dist/toolsets/wrappers.js.map +1 -0
  536. package/dist/types/agent/base.d.ts +27 -16
  537. package/dist/types/agent/base.d.ts.map +1 -1
  538. package/dist/types/agent/index.d.ts +1 -0
  539. package/dist/types/agent/index.d.ts.map +1 -1
  540. package/dist/types/agent/index.js +1 -0
  541. package/dist/types/agent/index.js.map +1 -1
  542. package/dist/types/agent/pipeline.d.ts +2 -0
  543. package/dist/types/agent/pipeline.d.ts.map +1 -1
  544. package/dist/types/agent/query.d.ts +117 -0
  545. package/dist/types/agent/query.d.ts.map +1 -0
  546. package/dist/types/agent/query.js +2 -0
  547. package/dist/types/agent/query.js.map +1 -0
  548. package/dist/types/agent/reactive.d.ts +2 -129
  549. package/dist/types/agent/reactive.d.ts.map +1 -1
  550. package/dist/types/agent/router.d.ts +2 -0
  551. package/dist/types/agent/router.d.ts.map +1 -1
  552. package/dist/types/agent/scheduler.d.ts +6 -1
  553. package/dist/types/agent/scheduler.d.ts.map +1 -1
  554. package/dist/types/agent/supervisor.d.ts +5 -2
  555. package/dist/types/agent/supervisor.d.ts.map +1 -1
  556. package/dist/types/agent/task.d.ts +19 -1
  557. package/dist/types/agent/task.d.ts.map +1 -1
  558. package/dist/types/agent/task.js.map +1 -1
  559. package/dist/types/authorization/index.d.ts +49 -12
  560. package/dist/types/authorization/index.d.ts.map +1 -1
  561. package/dist/types/authorization/index.js +6 -0
  562. package/dist/types/authorization/index.js.map +1 -1
  563. package/dist/types/connector/mcp.d.ts +45 -0
  564. package/dist/types/connector/mcp.d.ts.map +1 -1
  565. package/dist/types/errors/index.d.ts +15 -0
  566. package/dist/types/errors/index.d.ts.map +1 -1
  567. package/dist/types/errors/index.js.map +1 -1
  568. package/dist/types/hitl/index.d.ts +57 -0
  569. package/dist/types/hitl/index.d.ts.map +1 -1
  570. package/dist/types/hitl/index.js.map +1 -1
  571. package/dist/types/message/index.d.ts +130 -9
  572. package/dist/types/message/index.d.ts.map +1 -1
  573. package/dist/types/message/index.js +4 -1
  574. package/dist/types/message/index.js.map +1 -1
  575. package/dist/types/plugin/index.d.ts +22 -4
  576. package/dist/types/plugin/index.d.ts.map +1 -1
  577. package/dist/types/plugin/index.js +1 -0
  578. package/dist/types/plugin/index.js.map +1 -1
  579. package/dist/types/provider/chat.d.ts +5 -0
  580. package/dist/types/provider/chat.d.ts.map +1 -1
  581. package/dist/types/provider/config.d.ts +8 -3
  582. package/dist/types/provider/config.d.ts.map +1 -1
  583. package/dist/types/provider/stream.d.ts +39 -0
  584. package/dist/types/provider/stream.d.ts.map +1 -1
  585. package/dist/types/sandbox/index.d.ts +1 -1
  586. package/dist/types/session/events.d.ts +14 -3
  587. package/dist/types/session/events.d.ts.map +1 -1
  588. package/dist/types/session/events.js.map +1 -1
  589. package/dist/types/session/sub-session.d.ts +2 -0
  590. package/dist/types/session/sub-session.d.ts.map +1 -1
  591. package/dist/types/tool/index.d.ts +152 -91
  592. package/dist/types/tool/index.d.ts.map +1 -1
  593. package/dist/types/tool/index.js.map +1 -1
  594. package/dist/types/toolset/index.d.ts +10 -40
  595. package/dist/types/toolset/index.d.ts.map +1 -1
  596. package/package.json +1 -1
  597. package/src/advisory/history.ts +27 -2
  598. package/src/advisory/index.ts +1 -1
  599. package/src/advisory/registry.ts +33 -0
  600. package/src/agents/AGENTS.md +14 -7
  601. package/src/agents/PipelineAgent.ts +2 -303
  602. package/src/agents/QueryAgent.ts +269 -0
  603. package/src/agents/ReactiveAgent.ts +6 -216
  604. package/src/agents/RouterAgent.ts +2 -337
  605. package/src/agents/SupervisorAgent.ts +3 -476
  606. package/src/agents/defineAgent.ts +13 -2
  607. package/src/agents/examples/PipelineAgent.ts +302 -0
  608. package/src/agents/examples/RouterAgent.ts +338 -0
  609. package/src/agents/examples/SupervisorAgent.ts +472 -0
  610. package/src/agents/explore.ts +6 -3
  611. package/src/agents/forward-options.ts +37 -0
  612. package/src/agents/index.ts +2 -0
  613. package/src/agents/runAgent.ts +144 -37
  614. package/src/authorization/command-line.ts +2 -2
  615. package/src/authorization/gate.ts +21 -1
  616. package/src/authorization/program.ts +773 -0
  617. package/src/authorization/reexec-wrapper.ts +589 -0
  618. package/src/authorization/rules.ts +18 -1
  619. package/src/authorization/shell-lexer.ts +104 -59
  620. package/src/bridge/sse/mapper.ts +6 -0
  621. package/src/capabilities/index.ts +157 -0
  622. package/src/config/registry.ts +4 -1
  623. package/src/connector/index.ts +9 -2
  624. package/src/connector/mcp/adapter.ts +73 -3
  625. package/src/connector/mcp/client.ts +425 -6
  626. package/src/connector/mcp/discovery.ts +60 -0
  627. package/src/connector/mcp/era.ts +7 -0
  628. package/src/connector/mcp/index.ts +13 -0
  629. package/src/connector/mcp/mcp-toolset.ts +515 -0
  630. package/src/connector/mcp/streamable-http.ts +302 -5
  631. package/src/connector/tools/index.ts +2 -2
  632. package/src/connector/tools/router.ts +35 -58
  633. package/src/directory/derive-supervisor.ts +12 -8
  634. package/src/directory/derive.ts +8 -5
  635. package/src/execution/code-runtime/types.ts +2 -2
  636. package/src/invariants/index.ts +4 -1
  637. package/src/manager/agent/lifecycle.ts +167 -19
  638. package/src/manager/connector/environment.ts +17 -4
  639. package/src/manager/connector/index.ts +2 -2
  640. package/src/manager/connector/tenant.ts +17 -4
  641. package/src/manager/index.ts +2 -2
  642. package/src/manager/session/attribution.ts +79 -0
  643. package/src/manager/session/turn-recorder.ts +211 -55
  644. package/src/peers/address.ts +58 -0
  645. package/src/peers/client.ts +202 -0
  646. package/src/peers/dir.ts +176 -0
  647. package/src/peers/endpoint.ts +564 -0
  648. package/src/peers/envelope.ts +121 -0
  649. package/src/peers/index.ts +96 -0
  650. package/src/peers/protocol.ts +196 -0
  651. package/src/peers/record.ts +56 -0
  652. package/src/peers/registry.ts +241 -0
  653. package/src/plugin/define.ts +68 -0
  654. package/src/plugin/index.ts +2 -0
  655. package/src/plugin/lifecycle.ts +286 -106
  656. package/src/plugin/resolver.ts +6 -3
  657. package/src/plugin/shell-hook.ts +21 -5
  658. package/src/probe/errors.ts +4 -1
  659. package/src/prompt/coding-agent-doctrine.ts +22 -10
  660. package/src/prompt/contributions.ts +12 -2
  661. package/src/prompt/index.ts +1 -0
  662. package/src/provider/collect-chat-completion.ts +96 -11
  663. package/src/provider/mock.ts +24 -6
  664. package/src/provider/registry.ts +4 -1
  665. package/src/provider/tool-call-framing.ts +226 -0
  666. package/src/public-runtime.ts +136 -7
  667. package/src/public-tools.ts +24 -4
  668. package/src/public-types.ts +60 -6
  669. package/src/read-model/registry.ts +7 -2
  670. package/src/registry/ManagedRegistry.ts +57 -6
  671. package/src/registry/collision.ts +64 -0
  672. package/src/registry/command/index.ts +7 -3
  673. package/src/registry/index.ts +3 -9
  674. package/src/registry/plugin/index.ts +14 -1
  675. package/src/registry/tool/callable.ts +8 -9
  676. package/src/registry/tool/execute.ts +16 -846
  677. package/src/registry/tool/portable.ts +59 -0
  678. package/src/registry/tool/presentation.ts +6 -5
  679. package/src/runtime/bidi/session.ts +24 -5
  680. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  681. package/src/runtime/query/executor.ts +110 -12
  682. package/src/runtime/query/file-evidence-replay.ts +8 -7
  683. package/src/runtime/query/fork/prepare.ts +6 -1
  684. package/src/runtime/query/guardrail-presets.ts +4 -3
  685. package/src/runtime/query/index.ts +199 -101
  686. package/src/runtime/query/iteration/index.ts +13 -3
  687. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  688. package/src/runtime/query/iteration/phases/context.ts +2 -2
  689. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  690. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  691. package/src/runtime/query/iteration/tool-input.ts +284 -0
  692. package/src/runtime/query/observation-context.ts +2 -2
  693. package/src/runtime/query/prelude-lease.ts +132 -0
  694. package/src/runtime/query/prepare-turn.ts +477 -198
  695. package/src/runtime/query/prompt-cache.ts +2 -2
  696. package/src/runtime/query/prompt.ts +4 -4
  697. package/src/runtime/query/resume-session.ts +42 -3
  698. package/src/runtime/query/review-policy.ts +87 -9
  699. package/src/runtime/query/tooling.ts +3 -6
  700. package/src/runtime/query/turn-state.ts +4 -0
  701. package/src/runtime/system-events.ts +246 -0
  702. package/src/scheduler/delegating.ts +7 -2
  703. package/src/scheduler/local.ts +2 -0
  704. package/src/session/retention/archive.ts +1 -1
  705. package/src/skills/index.ts +1 -1
  706. package/src/skills/registry.ts +25 -0
  707. package/src/store/session/disk.ts +3 -0
  708. package/src/store/session-log/conformance.ts +51 -8
  709. package/src/store/session-log/core.ts +10 -4
  710. package/src/store/session-log/fold.ts +33 -7
  711. package/src/store/session-log/index.ts +2 -0
  712. package/src/test-support/toolset.ts +23 -0
  713. package/src/tools/builtins/bash.ts +27 -10
  714. package/src/tools/builtins/browser-url.ts +1 -1
  715. package/src/tools/builtins/browser.ts +2 -2
  716. package/src/tools/builtins/computer-use.ts +21 -11
  717. package/src/tools/builtins/edit.ts +12 -2
  718. package/src/tools/builtins/json-string-hint.ts +16 -0
  719. package/src/tools/builtins/search-tools.ts +7 -20
  720. package/src/tools/builtins/write-file.ts +12 -0
  721. package/src/tools/command-shell.ts +46 -1
  722. package/src/tools/coordinator/agent.ts +6 -0
  723. package/src/tools/coordinator/ask-user-question.ts +29 -15
  724. package/src/tools/coordinator/index.ts +6 -0
  725. package/src/tools/coordinator/question-options.ts +195 -0
  726. package/src/tools/defineTool.ts +28 -0
  727. package/src/tools/memory/search.ts +4 -1
  728. package/src/tools/memory/update.ts +8 -5
  729. package/src/tools/render-nonce.ts +69 -0
  730. package/src/tools/roster.ts +84 -33
  731. package/src/tools/schedules/schedule-tool.ts +107 -14
  732. package/src/tools/schedules/types.ts +52 -6
  733. package/src/tools/trusted-read-only.ts +19 -10
  734. package/src/tools/untrusted-envelope.ts +121 -57
  735. package/src/toolsets/combine.ts +181 -0
  736. package/src/toolsets/manager.ts +996 -0
  737. package/src/toolsets/source-glob.ts +22 -0
  738. package/src/toolsets/toolset.ts +31 -0
  739. package/src/toolsets/types.ts +154 -0
  740. package/src/toolsets/wrappers.ts +191 -0
  741. package/src/types/agent/base.ts +29 -16
  742. package/src/types/agent/index.ts +1 -0
  743. package/src/types/agent/pipeline.ts +2 -0
  744. package/src/types/agent/query.ts +129 -0
  745. package/src/types/agent/reactive.ts +5 -142
  746. package/src/types/agent/router.ts +2 -0
  747. package/src/types/agent/scheduler.ts +6 -1
  748. package/src/types/agent/supervisor.ts +5 -2
  749. package/src/types/agent/task.ts +21 -1
  750. package/src/types/authorization/index.ts +12 -0
  751. package/src/types/connector/mcp.ts +46 -0
  752. package/src/types/errors/index.ts +15 -0
  753. package/src/types/hitl/index.ts +57 -0
  754. package/src/types/message/index.ts +135 -7
  755. package/src/types/plugin/index.ts +44 -21
  756. package/src/types/provider/chat.ts +5 -0
  757. package/src/types/provider/config.ts +8 -3
  758. package/src/types/provider/stream.ts +39 -0
  759. package/src/types/sandbox/index.ts +1 -1
  760. package/src/types/session/events.ts +14 -3
  761. package/src/types/session/sub-session.ts +2 -0
  762. package/src/types/tool/index.ts +154 -105
  763. package/src/types/toolset/index.ts +10 -47
  764. package/dist/registry/toolset/catalog.d.ts +0 -42
  765. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  766. package/dist/registry/toolset/catalog.js +0 -234
  767. package/dist/registry/toolset/catalog.js.map +0 -1
  768. package/src/registry/toolset/catalog.ts +0 -308
@@ -0,0 +1,713 @@
1
+ /**
2
+ * Where a command line actually execs a program.
3
+ *
4
+ * Three consumers each answered "what program does this command run" their
5
+ * own way — the live `bash` tool's escalation, the scheduled-run floor's
6
+ * `pkill`/`systemctl`/… detection, and a scheduled script's static check —
7
+ * and each guessed differently about a re-exec wrapper (`sudo`, `env`,
8
+ * `nice`, `timeout`, …) standing in front of the real program. A security
9
+ * review found that every one of them only ever looked at
10
+ * `command.words[command.assignments]`, so `env $(echo git) push`,
11
+ * `timeout 5 $(echo systemctl) stop …` and the rest ran unverified: the
12
+ * wrapper's own name is what each check saw, never the word it was actually
13
+ * about to run.
14
+ *
15
+ * `programPositions` is the one place that answer now lives. It unwraps a
16
+ * chain of re-exec wrappers — each with its OWN real option grammar, so
17
+ * `stdbuf -oL prog` and `timeout 5 prog` are read correctly rather than
18
+ * assumed to put the program right after the wrapper's name — and reports
19
+ * every position in the command where a program is actually named: the
20
+ * (possibly wrapped) head, and, for `find`, each `-exec`/`-execdir`/`-ok`/
21
+ * `-okdir` clause's own head.
22
+ *
23
+ * A position is `known` (the literal, non-expanding word that names the
24
+ * program) or `unknown` (why it could not be resolved: the word itself
25
+ * expands, an option this does not recognise stood in the way, or an
26
+ * `xargs` program that is a shell or a `{}` placeholder). Fail closed: an
27
+ * option this does not model makes the position unknown, never "assumed to
28
+ * be the program" and never "assumed harmless".
29
+ *
30
+ * `source`/`.` and `eval` are read the same way a nested `bash -c` payload
31
+ * already is, not as an automatic unknown: `source path`/`. path` with a
32
+ * LITERAL path is known — the position is the `source`/`.` word itself,
33
+ * exactly as `bash path` is known without anyone reading what `path`
34
+ * contains — and unknown only when the path itself expands (`source "$X"`).
35
+ * `eval`'s literal argument words are joined and lexed as a command line of
36
+ * their own, and every position in the commands that come out of that is
37
+ * folded into the result — unknown when that reading is opaque, when any
38
+ * argument word expands, or, transitively, when a position inside the
39
+ * lexed payload is itself unknown (`eval 'env $(echo git) push'`).
40
+ * Consistency review (2026-09-24): treating `eval`/`source`/`.` as
41
+ * automatically unknown "wherever they stand, even literal" made
42
+ * `source .venv/bin/activate` ask alongside `source "$X"`, which is exactly
43
+ * the asymmetry `bash script.sh` (known) versus `bash -c "$X"` (unknown)
44
+ * does not have — the same module read a literal argument two different
45
+ * ways depending only on which command carried it. An `unknown` position
46
+ * still carries `word` when a single word is the reason (the word itself
47
+ * expands, so its value is not known before the line runs) — a caller that
48
+ * only needs "is there a word here that could name any of several tools"
49
+ * (the scheduled-run floor's `pkill`/`systemctl`/… detection) reads that
50
+ * word whether the position is known or not; `unknown` with no `word` is a
51
+ * structural failure with no single culprit (too many wrappers, an
52
+ * unrecognised option, an opaque `eval` payload, a poisoned environment).
53
+ *
54
+ * `hasPoisoningPrefix`, `poisonsLaterCommands` and `poisonedProgramPosition`
55
+ * are the other half a caller iterating a whole script needs: a command
56
+ * that sets `PATH`, `LD_PRELOAD`, `LD_LIBRARY_PATH`, `BASH_ENV`, `ENV` or
57
+ * `IFS` — as a leading assignment (which affects that same command's own
58
+ * program position) or as an `export`/bare assignment (which affects every
59
+ * command after it in the same script) — makes a LATER literal program name
60
+ * unverifiable too: which binary a literal `ls` resolves to depends on
61
+ * `PATH` at the moment it runs, not on the text of the word `ls`.
62
+ * `resolveScriptPrograms` threads that state through a whole script's
63
+ * commands in one pass, for a caller that does not want to write the loop
64
+ * itself.
65
+ */
66
+ import { RUNTIME_EVALUATORS } from './command-line.js';
67
+ import { skipOneReexecWrapper } from './reexec-wrapper.js';
68
+ import { NESTED_SHELLS, basename, lexShellCommandLine, nestedShellCommand, } from './shell-lexer.js';
69
+ /** How many re-exec wrappers a chain unwraps before giving up (`sudo env nice … prog`). */
70
+ const MAX_WRAPPER_DEPTH = 8;
71
+ const LITERAL = (w) => !w.expands;
72
+ /** `NAME=value` read off an assignment word's own text, or null. */
73
+ function assignmentName(word) {
74
+ const text = word.text.replace(/\\\n/g, '');
75
+ const match = /^([A-Za-z_][A-Za-z0-9_]*)\+?=/.exec(text);
76
+ return match && word.value.startsWith(match[0]) ? match[1] : null;
77
+ }
78
+ /**
79
+ * `wrapper NAME=value…` sets `NAME` for the wrapped command only (`env
80
+ * NAME=value prog`, `sudo NAME=value prog`) — the same taint a leading
81
+ * command-prefix assignment gives its own command, just spelled through the
82
+ * wrapper instead of in front of it.
83
+ */
84
+ function poisonedByWrapperAssignment(wrapper, name) {
85
+ return `${wrapper} ${name}=… sets ${name} for the command that follows, so a literal name after it cannot be trusted to resolve to what its text says`;
86
+ }
87
+ /**
88
+ * Scan `words` for a bare `-c`/`--command COMMAND` pair among options this
89
+ * wrapper recognises (everything else validated against `flags`/`withArg`,
90
+ * the same as {@link skipOptions}). `--command=X` is not modelled — a
91
+ * documented, deliberately conservative gap: it falls through to the
92
+ * unrecognised-option path, `unknown` never a silent pass. Returns the `-c`
93
+ * payload when found, the words left after options when it is not (a valid
94
+ * outcome some callers use — `flock`'s positional form, `script`'s bare
95
+ * form), or `unknown` on a bad option or a `-c` given no argument.
96
+ */
97
+ function findDashC(words, flags, withArg, optionalAttached = []) {
98
+ let i = 0;
99
+ while (i < words.length) {
100
+ const w = words[i];
101
+ if (!LITERAL(w))
102
+ return { rest: words.slice(i) };
103
+ if (w.value === '-c' || w.value === '--command') {
104
+ const payload = words[i + 1];
105
+ if (payload === undefined)
106
+ return { unknown: `${w.value} was given no command` };
107
+ return { payload };
108
+ }
109
+ if (w.value === '--')
110
+ return { rest: words.slice(i + 1) };
111
+ if (flags.has(w.value)) {
112
+ i += 1;
113
+ continue;
114
+ }
115
+ if (optionalAttached.some((option) => option.startsWith('--')
116
+ ? w.value.startsWith(`${option}=`)
117
+ : w.value.startsWith(option) && w.value.length > option.length)) {
118
+ i += 1;
119
+ continue;
120
+ }
121
+ if (withArg.has(w.value)) {
122
+ i += 2;
123
+ continue;
124
+ }
125
+ const eq = w.value.indexOf('=');
126
+ if (w.value.startsWith('--') && eq > 0 && withArg.has(w.value.slice(0, eq))) {
127
+ i += 1;
128
+ continue;
129
+ }
130
+ if (/^--?[A-Za-z]/.test(w.value)) {
131
+ return { unknown: `an option this does not read: ${w.value}` };
132
+ }
133
+ return { rest: words.slice(i) };
134
+ }
135
+ return { rest: words.slice(i) };
136
+ }
137
+ /**
138
+ * Skip a wrapper's own recognised, argument-taking or bare options over
139
+ * `words`, stopping at the first word that is not one of them (the
140
+ * boundary between the wrapper's own invocation and whatever runs next).
141
+ * An option-shaped word (`-x`, `--long`) this does not recognise is
142
+ * `unknown`, never treated as the program; a word this cannot classify
143
+ * because it expands is left for the caller, which already knows to call
144
+ * an expanding program word unknown. `explicit`, when given, names options
145
+ * that ARE recognised but never lead to a named program at all (`sudo -i`
146
+ * runs a runtime-chosen login shell) — checked before `flags`/`withArg`, so
147
+ * the reason is explicit rather than an accident of `flags` swallowing them.
148
+ */
149
+ function skipOptions(words, flags, withArg, explicit) {
150
+ let i = 0;
151
+ while (i < words.length) {
152
+ const w = words[i];
153
+ if (!LITERAL(w))
154
+ return { rest: words.slice(i) };
155
+ if (w.value === '--')
156
+ return { rest: words.slice(i + 1) };
157
+ const reason = explicit?.get(w.value);
158
+ if (reason !== undefined)
159
+ return { unknown: reason };
160
+ if (flags.has(w.value)) {
161
+ i += 1;
162
+ continue;
163
+ }
164
+ if (withArg.has(w.value)) {
165
+ i += 2;
166
+ continue;
167
+ }
168
+ const eq = w.value.indexOf('=');
169
+ if (w.value.startsWith('--') && eq > 0 && withArg.has(w.value.slice(0, eq))) {
170
+ i += 1;
171
+ continue;
172
+ }
173
+ // A short option's value attached to its flag (`-c2`, `-n10`, `-oL`),
174
+ // the conventional form for `ionice`, `nice`, `stdbuf` and `taskset`'s
175
+ // `-c` list — one token, no separate argument word.
176
+ if (!w.value.startsWith('--') && w.value.length > 2 && withArg.has(w.value.slice(0, 2))) {
177
+ i += 1;
178
+ continue;
179
+ }
180
+ if (/^--?[A-Za-z]/.test(w.value)) {
181
+ return { unknown: `an option this does not read: ${w.value}` };
182
+ }
183
+ return { rest: words.slice(i) };
184
+ }
185
+ return { none: true };
186
+ }
187
+ /** `xargs`' own options, then its program (the first non-option word, `echo` when there is none). */
188
+ function unwrapXargs(words) {
189
+ const flags = new Set(['-0', '-o', '-p', '-r', '-t', '-x', '--null', '--open-tty', '--verbose']);
190
+ const withArg = new Set(['-a', '-d', '-E', '-e', '-I', '-i', '-L', '-l', '-n', '-P', '-s']);
191
+ const skipped = skipOptions(words, flags, withArg);
192
+ if ('unknown' in skipped)
193
+ return skipped;
194
+ const rest = 'none' in skipped ? [] : skipped.rest;
195
+ const program = rest[0];
196
+ if (program === undefined) {
197
+ // No program named: xargs' own default is `echo`, always safe.
198
+ return {
199
+ rest: [{ text: 'echo', value: 'echo', expands: false, quoted: false, substitutes: false }],
200
+ };
201
+ }
202
+ if (!LITERAL(program))
203
+ return { rest };
204
+ if (program.value === '{}' || NESTED_SHELLS.has(basename(program.value))) {
205
+ return {
206
+ unknown: `xargs' program is built from its input, not named in the line: ${program.text}`,
207
+ };
208
+ }
209
+ return { rest };
210
+ }
211
+ /**
212
+ * Special command runners. Plain re-exec wrappers are all read by the
213
+ * shared skipOneReexecWrapper, also used by the shell lexer to find -c.
214
+ */
215
+ function unwrapOnce(words) {
216
+ const head = words[0];
217
+ const name = basename(head.value);
218
+ const rest = words.slice(1);
219
+ switch (name) {
220
+ case 'xargs':
221
+ return unwrapXargs(rest);
222
+ case 'su':
223
+ case 'runuser': {
224
+ const found = findDashC(rest, new Set(['-p', '--preserve-environment', '-P', '--pty', '-l', '--login', '-']), new Set([
225
+ '-s',
226
+ '--shell',
227
+ '-g',
228
+ '--group',
229
+ '-G',
230
+ '--supp-group',
231
+ '-w',
232
+ '--whitelist-environment',
233
+ ]));
234
+ if ('unknown' in found)
235
+ return found;
236
+ if ('payload' in found)
237
+ return found;
238
+ // No `-c`/`--command` at all: both start the target user's login
239
+ // or default shell — an interactive session, not a fixed next
240
+ // command this can name.
241
+ return {
242
+ unknown: `${name} without -c/--command starts an interactive login shell, not a named program`,
243
+ };
244
+ }
245
+ case 'script': {
246
+ // Per util-linux `script --help`: `-t[<file>], --timing[=<file>]`
247
+ // is a DEPRECATED ALIAS for `-T`/`--log-timing` with an OPTIONAL
248
+ // value (default file is stderr when bare) — it never consumes a
249
+ // separate following word, unlike the real `-T <file>`. Modelling
250
+ // `-t` as taking one used to swallow a following `-c` as `-t`'s own
251
+ // value, reading `script` as known and never looking at `-c`'s
252
+ // argument at all.
253
+ const flags = new Set([
254
+ '-a',
255
+ '--append',
256
+ '-e',
257
+ '--return',
258
+ '-f',
259
+ '--flush',
260
+ '--force',
261
+ '-q',
262
+ '--quiet',
263
+ '-t',
264
+ '--timing',
265
+ ]);
266
+ const withArg = new Set([
267
+ '-I',
268
+ '--log-in',
269
+ '-O',
270
+ '--log-out',
271
+ '-B',
272
+ '--log-io',
273
+ '-T',
274
+ '--log-timing',
275
+ '-m',
276
+ '--logging-format',
277
+ '-E',
278
+ '--echo',
279
+ '-o',
280
+ '--output-limit',
281
+ ]);
282
+ // `script [options] [<file>] [-- <command> [<argument>...]]`: `--`
283
+ // is an alternative to `-c`, running the command directly as an
284
+ // argv (not a joined string re-lexed through a shell) rather than
285
+ // recording an interactive session.
286
+ const dashDash = rest.findIndex((w) => LITERAL(w) && w.value === '--');
287
+ if (dashDash >= 0) {
288
+ const before = skipOptions(rest.slice(0, dashDash), flags, withArg);
289
+ if ('unknown' in before)
290
+ return before;
291
+ const after = rest.slice(dashDash + 1);
292
+ return after.length === 0 ? { none: true } : { rest: after };
293
+ }
294
+ const found = findDashC(rest, flags, withArg, ['-t', '--timing']);
295
+ if ('unknown' in found)
296
+ return found;
297
+ if ('payload' in found)
298
+ return found;
299
+ // No `-c` and no `--`: `script` itself is the program — it
300
+ // records a terminal session (an interactive shell as its own
301
+ // child), and its only other argument is a log file name, not a
302
+ // command to name.
303
+ return { none: true };
304
+ }
305
+ case 'flock': {
306
+ const found = findDashC(rest, new Set([
307
+ '-s',
308
+ '--shared',
309
+ '-x',
310
+ '-e',
311
+ '--exclusive',
312
+ '-n',
313
+ '--nb',
314
+ '--nonblock',
315
+ '-o',
316
+ '--close',
317
+ '-F',
318
+ '--no-fork',
319
+ '--verbose',
320
+ ]), new Set(['-w', '--timeout', '-E', '--conflict-exit-code']));
321
+ if ('unknown' in found)
322
+ return found;
323
+ if ('payload' in found)
324
+ return found;
325
+ // Positional form (`flock file|directory command [args…]`): what
326
+ // is left after options starts with the locked file/directory
327
+ // (or a bare fd, with no command — nothing execs), then the real
328
+ // argv, run directly — no shell, no joining.
329
+ const target = found.rest[0];
330
+ if (target === undefined)
331
+ return { none: true };
332
+ const remaining = found.rest.slice(1);
333
+ return remaining.length === 0 ? { none: true } : { rest: remaining };
334
+ }
335
+ default:
336
+ return null;
337
+ }
338
+ }
339
+ /**
340
+ * `source path [args…]` / `. path [args…]`: known at `head` (the
341
+ * `source`/`.` word itself) when `path` is a literal word, exactly as
342
+ * `bash path` is known without reading what `path` contains — trailing
343
+ * words are the sourced script's own positional parameters, not inspected
344
+ * either, the same as `bash path`'s do not name a second program. Unknown,
345
+ * naming `path` itself, when it expands or is absent.
346
+ */
347
+ function resolveSourceOrDot(head, args) {
348
+ const path = args[0];
349
+ if (path === undefined) {
350
+ return { word: head, unknown: `${basename(head.value)} was given nothing to run` };
351
+ }
352
+ if (!LITERAL(path)) {
353
+ return { word: path, unknown: `the file this runs is decided at runtime: ${path.text}` };
354
+ }
355
+ return { word: head };
356
+ }
357
+ /**
358
+ * `eval word…`: bash joins `eval`'s arguments with a space and reads the
359
+ * result as a command line. When every argument word is literal, that joined
360
+ * text is lexed the same way a `bash -c` payload already is, and every
361
+ * position in the commands it contains (poisoning threaded across them,
362
+ * same as any script) is folded into the result — unknown when the reading
363
+ * is opaque or incomplete, and transitively unknown when a position inside
364
+ * it is. An expanding argument word is unknown outright: its value, and so
365
+ * what `eval` will even read, is not known before the line runs. `eval`
366
+ * with no arguments does nothing in bash and names no position at all.
367
+ */
368
+ function resolveEvalPayload(args, dialect) {
369
+ if (args.length === 0)
370
+ return [];
371
+ for (const arg of args) {
372
+ if (!LITERAL(arg)) {
373
+ return [{ word: arg, unknown: `eval's payload is decided at runtime: ${arg.text}` }];
374
+ }
375
+ }
376
+ const payload = args.map((arg) => arg.value).join(' ');
377
+ const reading = lexShellCommandLine(payload, { dialect });
378
+ if (reading.opaque || !reading.complete) {
379
+ return [
380
+ {
381
+ unknown: `eval's payload cannot be read (${reading.reasons[0] ?? 'a construct the lexer does not model'}): ${payload}`,
382
+ },
383
+ ];
384
+ }
385
+ return resolveScriptPrograms(reading.commands, dialect).flatMap((entry) => entry.positions);
386
+ }
387
+ /** The final position a chain of re-exec wrappers resolves to, from `words` (already literal, non-empty). */
388
+ function resolveChain(words, dialect) {
389
+ let current = words;
390
+ for (let depth = 0; depth < MAX_WRAPPER_DEPTH; depth += 1) {
391
+ const head = current[0];
392
+ if (head === undefined)
393
+ return [{ unknown: 'no program follows this wrapper' }];
394
+ if (!LITERAL(head)) {
395
+ return [{ word: head, unknown: `the program is decided at runtime: ${head.text}` }];
396
+ }
397
+ const name = basename(head.value);
398
+ if (name === 'eval')
399
+ return resolveEvalPayload(current.slice(1), dialect);
400
+ if (name === 'watch')
401
+ return resolveWatchArgs(current.slice(1), dialect);
402
+ if (RUNTIME_EVALUATORS.has(name)) {
403
+ // `source`/`.`: `eval` is handled above, on its own, since a
404
+ // literal `eval` reads its payload rather than being the position
405
+ // itself.
406
+ return [resolveSourceOrDot(head, current.slice(1))];
407
+ }
408
+ const wrapper = skipOneReexecWrapper(current);
409
+ if (wrapper !== null) {
410
+ if ('unknown' in wrapper)
411
+ return [{ unknown: wrapper.unknown }];
412
+ if ('none' in wrapper)
413
+ return [{ word: head }];
414
+ for (const assignment of wrapper.assignments) {
415
+ if (DYNAMIC_RESOLUTION_VARIABLES.has(assignment)) {
416
+ return [{ unknown: poisonedByWrapperAssignment(name, assignment) }];
417
+ }
418
+ }
419
+ if (wrapper.rest.length === 0)
420
+ return [{ word: head }];
421
+ current = wrapper.rest;
422
+ continue;
423
+ }
424
+ const unwrapped = unwrapOnce(current);
425
+ if (unwrapped === null)
426
+ return [{ word: head }];
427
+ if ('unknown' in unwrapped)
428
+ return [{ unknown: unwrapped.unknown }];
429
+ if ('none' in unwrapped)
430
+ return [{ word: head }];
431
+ if ('payload' in unwrapped)
432
+ return resolveDashCPayload(unwrapped.payload, dialect);
433
+ if (unwrapped.rest.length === 0)
434
+ return [{ word: head }];
435
+ current = unwrapped.rest;
436
+ }
437
+ return [{ unknown: 'too many re-exec wrappers to follow' }];
438
+ }
439
+ /**
440
+ * A `-c COMMAND` payload (`su -c`, `runuser -c`, `script -c`, `flock -c`):
441
+ * known — recursed into, the same as a nested `bash -c '<literal>'` payload
442
+ * — when literal, unknown when it expands.
443
+ */
444
+ function resolveDashCPayload(payload, dialect) {
445
+ if (!LITERAL(payload)) {
446
+ return [
447
+ { word: payload, unknown: `the command this runs is decided at runtime: ${payload.text}` },
448
+ ];
449
+ }
450
+ const reading = lexShellCommandLine(payload.value, { dialect });
451
+ if (reading.opaque || !reading.complete) {
452
+ return [
453
+ {
454
+ unknown: `this -c payload cannot be read (${reading.reasons[0] ?? 'a construct the lexer does not model'}): ${payload.value}`,
455
+ },
456
+ ];
457
+ }
458
+ return resolveScriptPrograms(reading.commands, dialect).flatMap((entry) => entry.positions);
459
+ }
460
+ /**
461
+ * `watch [options] command…` joins its trailing words with a space and runs
462
+ * them via a shell, exactly the way `eval` does — except with `-x`/`--exec`,
463
+ * which execs the argv directly, no shell, no joining, read the ordinary way.
464
+ */
465
+ function resolveWatchArgs(rest, dialect) {
466
+ const usesExec = rest.some((w) => LITERAL(w) && (w.value === '-x' || w.value === '--exec'));
467
+ const skipped = skipOptions(rest, new Set([
468
+ '-d',
469
+ '--differences',
470
+ '-p',
471
+ '--precise',
472
+ '-t',
473
+ '--no-title',
474
+ '-b',
475
+ '--beep',
476
+ '-e',
477
+ '--errexit',
478
+ '-g',
479
+ '--chgexit',
480
+ '-c',
481
+ '--color',
482
+ '-x',
483
+ '--exec',
484
+ ]), new Set(['-n', '--interval']));
485
+ if ('unknown' in skipped)
486
+ return [{ unknown: skipped.unknown }];
487
+ const afterOptions = 'rest' in skipped ? skipped.rest : [];
488
+ if (afterOptions.length === 0)
489
+ return [];
490
+ return usesExec ? resolveChain(afterOptions, dialect) : resolveEvalPayload(afterOptions, dialect);
491
+ }
492
+ /** `find`'s own `-exec`/`-execdir`/`-ok`/`-okdir` clauses, each an independent program position. */
493
+ function findExecPositions(words, dialect) {
494
+ const positions = [];
495
+ for (let i = 0; i < words.length; i += 1) {
496
+ const w = words[i];
497
+ if (!LITERAL(w) || !/^-(?:exec|execdir|ok|okdir)$/.test(w.value))
498
+ continue;
499
+ const clauseStart = i + 1;
500
+ let k = clauseStart;
501
+ while (k < words.length) {
502
+ const term = words[k];
503
+ if (LITERAL(term) && (term.value === ';' || term.value === '+'))
504
+ break;
505
+ k += 1;
506
+ }
507
+ const clause = words.slice(clauseStart, k);
508
+ if (clause.length === 0) {
509
+ positions.push({ unknown: `find's ${w.value} clause has no program` });
510
+ }
511
+ else {
512
+ // find execs the entire argv after -exec, including any re-exec
513
+ // wrappers. Inspecting only its first word would mistake `env` for
514
+ // the program and miss a dynamic name further into the clause.
515
+ for (const position of resolveChain(clause, dialect)) {
516
+ if (position.word && LITERAL(position.word) && position.word.value.includes('{}')) {
517
+ positions.push({
518
+ unknown: `find's own \`{}\` placeholder stands for the program, not a name in the line`,
519
+ });
520
+ }
521
+ else {
522
+ positions.push(position);
523
+ }
524
+ }
525
+ // The outer lexer only sees `find`, so it cannot read a shell -c
526
+ // payload inside this clause. Read it here with the same wrapper
527
+ // and shell-option grammar the lexer uses for a top-level shell.
528
+ const nested = nestedShellCommand(clause);
529
+ if (nested !== null) {
530
+ if ('opaque' in nested) {
531
+ positions.push({ unknown: nested.opaque });
532
+ }
533
+ else if (nested.shell === 'zsh' || nested.shell === 'ksh' || nested.shell === 'mksh') {
534
+ positions.push({ unknown: `nested ${nested.shell} is not modeled` });
535
+ }
536
+ else if (LITERAL(nested.payload) && nested.payload.value.includes('{}')) {
537
+ positions.push({
538
+ unknown: 'find substitutes `{}` into this shell payload before it runs',
539
+ });
540
+ }
541
+ else {
542
+ positions.push(...resolveDashCPayload(nested.payload, nested.shell === 'bash' ? 'bash' : 'sh'));
543
+ }
544
+ }
545
+ }
546
+ i = k;
547
+ }
548
+ return positions;
549
+ }
550
+ /**
551
+ * Every position in `command` where a program is actually exec'd: the
552
+ * (possibly re-exec-wrapped) head, and, for `find`, each `-exec`-family
553
+ * clause's own head. Empty for a command with no words at all. `dialect` is
554
+ * the shell that will run the line — needed only to read a literal `eval`
555
+ * payload the same way its own commands would be.
556
+ */
557
+ export function programPositions(command, dialect) {
558
+ const head = command.words[command.assignments];
559
+ if (head === undefined)
560
+ return [];
561
+ const positions = [
562
+ ...resolveChain(command.words.slice(command.assignments), dialect),
563
+ ];
564
+ for (const position of positions.slice()) {
565
+ if (!position.word || !LITERAL(position.word) || basename(position.word.value) !== 'find')
566
+ continue;
567
+ const index = command.words.indexOf(position.word);
568
+ if (index >= 0)
569
+ positions.push(...findExecPositions(command.words.slice(index + 1), dialect));
570
+ }
571
+ return positions;
572
+ }
573
+ /** Variables whose value governs how a LATER literal program name resolves to a binary or to code. */
574
+ export const DYNAMIC_RESOLUTION_VARIABLES = new Set([
575
+ 'PATH',
576
+ 'LD_PRELOAD',
577
+ 'LD_LIBRARY_PATH',
578
+ 'BASH_ENV',
579
+ 'ENV',
580
+ 'IFS',
581
+ ]);
582
+ function assignsPoisoningVariable(words) {
583
+ for (const word of words) {
584
+ const name = assignmentName(word);
585
+ if (name !== null && DYNAMIC_RESOLUTION_VARIABLES.has(name))
586
+ return true;
587
+ }
588
+ return false;
589
+ }
590
+ /**
591
+ * Whether `command`'s OWN leading assignment (`PATH=x prog`) sets one of
592
+ * {@link DYNAMIC_RESOLUTION_VARIABLES} — which affects only `prog`'s own
593
+ * position, the way a real command-prefix assignment is scoped to that one
594
+ * invocation and does not leak to later commands. A caller iterating a
595
+ * whole script applies this to THIS command's own {@link programPositions}.
596
+ */
597
+ export function hasPoisoningPrefix(command) {
598
+ return assignsPoisoningVariable(command.words.slice(0, command.assignments));
599
+ }
600
+ /**
601
+ * Whether `command` sets one of {@link DYNAMIC_RESOLUTION_VARIABLES} for
602
+ * every command AFTER it in the same script: an `export NAME=value` (or a
603
+ * bare re-export, `export NAME`, of an already-set one), or a standalone
604
+ * assignment with no trailing command (`PATH=x` alone), both of which are
605
+ * real, persisting shell-variable assignments rather than a one-call
606
+ * prefix. A caller iterating a whole script applies this to every command
607
+ * that follows, not to `command` itself: a literal `ls` after either one
608
+ * cannot be trusted to resolve to what its text says, since which binary
609
+ * it runs — or what code a shell reads on startup (`BASH_ENV`, `ENV`) —
610
+ * depends on these variables' runtime value.
611
+ */
612
+ export function poisonsLaterCommands(command) {
613
+ const head = command.words[command.assignments];
614
+ if (head === undefined)
615
+ return hasPoisoningPrefix(command);
616
+ if (!LITERAL(head))
617
+ return false;
618
+ const args = command.words.slice(command.assignments + 1);
619
+ if (head.value === 'export') {
620
+ // `export -n NAME` REMOVES the export attribute — the opposite of
621
+ // poisoning — for every name in the same invocation; bash reads it
622
+ // once for the whole command, not per name.
623
+ if (args.some((w) => LITERAL(w) && w.value === '-n'))
624
+ return false;
625
+ return args.some((arg) => namesPoisoningVariable(arg));
626
+ }
627
+ if (head.value === 'declare' || head.value === 'typeset') {
628
+ // `declare -x`/`typeset -x` (and a cluster with it, `-gx`, `-xg`, …,
629
+ // but never `+x`, which removes the attribute) marks a name exported,
630
+ // the same as `export`. `declare` without `-x` only sets a local
631
+ // attribute (type, read-only, …) and does not export anything.
632
+ const exports = args.some((w) => LITERAL(w) && /^-[a-zA-Z]*x[a-zA-Z]*$/.test(w.value));
633
+ if (!exports)
634
+ return false;
635
+ return args.some((arg) => {
636
+ if (LITERAL(arg) && /^[-+]/.test(arg.value))
637
+ return false; // an option, not a name
638
+ return namesPoisoningVariable(arg);
639
+ });
640
+ }
641
+ return false;
642
+ }
643
+ /**
644
+ * `assignmentName`'s prefix, or the word's own literal value for a bare
645
+ * name (`export PATH`, `declare -x PATH`) — read regardless of whether the
646
+ * word's VALUE expands, since only the `NAME` portion (always literal in an
647
+ * assignment word) or the bare word's exact text decides which variable is
648
+ * named.
649
+ */
650
+ function namesPoisoningVariable(arg) {
651
+ const name = assignmentName(arg) ?? (LITERAL(arg) ? arg.value : null);
652
+ return name !== null && DYNAMIC_RESOLUTION_VARIABLES.has(name);
653
+ }
654
+ /**
655
+ * The `unknown` position a command's own program name becomes once
656
+ * {@link hasPoisoningPrefix} or an earlier {@link poisonsLaterCommands} is
657
+ * true for it, in place of whatever {@link programPositions} would
658
+ * otherwise resolve — a literal name is no longer trustworthy once the
659
+ * environment it resolves against is unknown.
660
+ */
661
+ export function poisonedProgramPosition() {
662
+ return {
663
+ unknown: 'PATH, LD_PRELOAD, LD_LIBRARY_PATH, BASH_ENV, ENV or IFS was set earlier in this line, so a literal program name here cannot be trusted to resolve to what its text says',
664
+ };
665
+ }
666
+ /**
667
+ * {@link programPositions} for every command a script reads, in order,
668
+ * threading {@link hasPoisoningPrefix} and {@link poisonsLaterCommands}
669
+ * through so a literal program name after an earlier `PATH=`, `export
670
+ * PATH=`, … comes back {@link poisonedProgramPosition} rather than trusted
671
+ * at face value. This is the one loop the live `bash` tool's escalation, the
672
+ * scheduled-run floor and `verifyScheduledScript` would otherwise each write
673
+ * for themselves — exactly the duplication that let `env $(echo git) push`
674
+ * pass one consumer's check and not another's.
675
+ */
676
+ export function resolveScriptPrograms(commands, dialect) {
677
+ let poisoned = false;
678
+ const out = [];
679
+ for (const command of commands) {
680
+ const selfPoisoned = poisoned || hasPoisoningPrefix(command);
681
+ const positions = selfPoisoned
682
+ ? [poisonedProgramPosition()]
683
+ : programPositions(command, dialect);
684
+ out.push({ command, positions });
685
+ if (poisonsLaterCommands(command))
686
+ poisoned = true;
687
+ }
688
+ return out;
689
+ }
690
+ /**
691
+ * Why a command line's own program name is not knowable ahead of running
692
+ * it, in one call: the line itself, unread whole (`bash -c "$X"`'s outer
693
+ * line is opaque — the lexer could not follow the payload at all, which is
694
+ * a stronger statement than any one position being unresolvable), or a
695
+ * specific command's unresolvable position via {@link resolveScriptPrograms}.
696
+ * The live `bash` tool's escalation (`executor.ts`) calls this directly
697
+ * rather than re-implementing it, so its own tests import the same function
698
+ * they are testing instead of a hand-written mirror that can drift from it.
699
+ */
700
+ export function unknownProgramInLine(value, dialect) {
701
+ const reading = lexShellCommandLine(value, { dialect });
702
+ if (reading.opaque || !reading.complete) {
703
+ return `${value}: the line cannot be read (${reading.reasons[0] ?? 'a construct the lexer does not model'}), so its program cannot be verified`;
704
+ }
705
+ for (const { command, positions } of resolveScriptPrograms(reading.commands, dialect)) {
706
+ for (const position of positions) {
707
+ if (position.unknown !== undefined)
708
+ return `${command.text}: ${position.unknown}`;
709
+ }
710
+ }
711
+ return undefined;
712
+ }
713
+ //# sourceMappingURL=program.js.map