@jevitate/cli 0.1.0 → 0.3.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 (410) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.d.ts +31 -11
  3. package/dist/ai-cli.js +131 -88
  4. package/dist/ai-cli.js.map +1 -1
  5. package/dist/author-journey-cli.d.ts +4 -0
  6. package/dist/author-journey-cli.js +111 -0
  7. package/dist/author-journey-cli.js.map +1 -0
  8. package/dist/bin.js +60349 -16477
  9. package/dist/bin.js.map +1 -1
  10. package/dist/browser-run-options.d.ts +89 -0
  11. package/dist/browser-run-options.js +175 -0
  12. package/dist/browser-run-options.js.map +1 -0
  13. package/dist/build-info.generated.d.ts +2 -0
  14. package/dist/build-info.generated.js +10 -0
  15. package/dist/build-info.generated.js.map +1 -0
  16. package/dist/campaign-api.d.ts +151 -0
  17. package/dist/campaign-api.js +446 -0
  18. package/dist/campaign-api.js.map +1 -0
  19. package/dist/campaign-cli.d.ts +6 -0
  20. package/dist/campaign-cli.js +66 -0
  21. package/dist/campaign-cli.js.map +1 -0
  22. package/dist/check-api.d.ts +5 -0
  23. package/dist/check-api.js +234 -0
  24. package/dist/check-api.js.map +1 -0
  25. package/dist/check-budget.d.ts +26 -0
  26. package/dist/check-budget.js +90 -0
  27. package/dist/check-budget.js.map +1 -0
  28. package/dist/check-cli.d.ts +31 -0
  29. package/dist/check-cli.js +109 -0
  30. package/dist/check-cli.js.map +1 -0
  31. package/dist/check-execute.d.ts +29 -0
  32. package/dist/check-execute.js +420 -0
  33. package/dist/check-execute.js.map +1 -0
  34. package/dist/check-plan.d.ts +118 -0
  35. package/dist/check-plan.js +516 -0
  36. package/dist/check-plan.js.map +1 -0
  37. package/dist/check-suite.d.ts +184 -0
  38. package/dist/check-suite.js +540 -0
  39. package/dist/check-suite.js.map +1 -0
  40. package/dist/check-types.d.ts +181 -0
  41. package/dist/check-types.js +35 -0
  42. package/dist/check-types.js.map +1 -0
  43. package/dist/cli-args.d.ts +26 -0
  44. package/dist/cli-args.js +50 -0
  45. package/dist/cli-args.js.map +1 -0
  46. package/dist/cli-output.d.ts +106 -0
  47. package/dist/cli-output.js +563 -0
  48. package/dist/cli-output.js.map +1 -0
  49. package/dist/cli-reference.d.ts +3 -0
  50. package/dist/cli-reference.js +81 -0
  51. package/dist/cli-reference.js.map +1 -0
  52. package/dist/cli-refusal.d.ts +12 -0
  53. package/dist/cli-refusal.js +52 -0
  54. package/dist/cli-refusal.js.map +1 -0
  55. package/dist/cli-shared.d.ts +340 -0
  56. package/dist/cli-shared.js +537 -0
  57. package/dist/cli-shared.js.map +1 -0
  58. package/dist/cli-surface.d.ts +33 -0
  59. package/dist/cli-surface.js +48 -0
  60. package/dist/cli-surface.js.map +1 -0
  61. package/dist/conversation-options.d.ts +15 -0
  62. package/dist/conversation-options.js +10 -0
  63. package/dist/conversation-options.js.map +1 -0
  64. package/dist/credentials-file.d.ts +15 -0
  65. package/dist/credentials-file.js +56 -0
  66. package/dist/credentials-file.js.map +1 -0
  67. package/dist/data-dir.d.ts +1 -1
  68. package/dist/data-dir.js +1 -1
  69. package/dist/defect-evidence.d.ts +141 -0
  70. package/dist/defect-evidence.js +505 -0
  71. package/dist/defect-evidence.js.map +1 -0
  72. package/dist/demo-aspect-api.d.ts +209 -0
  73. package/dist/demo-aspect-api.js +398 -0
  74. package/dist/demo-aspect-api.js.map +1 -0
  75. package/dist/demo-aspect-cli.d.ts +3 -0
  76. package/dist/demo-aspect-cli.js +243 -0
  77. package/dist/demo-aspect-cli.js.map +1 -0
  78. package/dist/demo-capture.d.ts +142 -0
  79. package/dist/demo-capture.js +537 -0
  80. package/dist/demo-capture.js.map +1 -0
  81. package/dist/engine.d.ts +35 -0
  82. package/dist/engine.js +25 -0
  83. package/dist/engine.js.map +1 -0
  84. package/dist/environments.d.ts +155 -0
  85. package/dist/environments.js +364 -0
  86. package/dist/environments.js.map +1 -0
  87. package/dist/exit-codes.d.ts +46 -0
  88. package/dist/exit-codes.js +91 -0
  89. package/dist/exit-codes.js.map +1 -0
  90. package/dist/explore-adversarial.d.ts +144 -0
  91. package/dist/explore-adversarial.js +227 -0
  92. package/dist/explore-adversarial.js.map +1 -0
  93. package/dist/explore-api.d.ts +7 -187
  94. package/dist/explore-api.js +7 -301
  95. package/dist/explore-api.js.map +1 -1
  96. package/dist/explore-author.d.ts +79 -0
  97. package/dist/explore-author.js +86 -0
  98. package/dist/explore-author.js.map +1 -0
  99. package/dist/explore-cli.d.ts +7 -0
  100. package/dist/explore-cli.js +1199 -0
  101. package/dist/explore-cli.js.map +1 -0
  102. package/dist/explore-coverage.d.ts +173 -0
  103. package/dist/explore-coverage.js +246 -0
  104. package/dist/explore-coverage.js.map +1 -0
  105. package/dist/explore-feature.d.ts +125 -0
  106. package/dist/explore-feature.js +218 -0
  107. package/dist/explore-feature.js.map +1 -0
  108. package/dist/explore-goal.d.ts +271 -0
  109. package/dist/explore-goal.js +417 -0
  110. package/dist/explore-goal.js.map +1 -0
  111. package/dist/explore-shared.d.ts +177 -0
  112. package/dist/explore-shared.js +149 -0
  113. package/dist/explore-shared.js.map +1 -0
  114. package/dist/explore-specs.d.ts +53 -0
  115. package/dist/explore-specs.js +333 -0
  116. package/dist/explore-specs.js.map +1 -0
  117. package/dist/findings-filing.d.ts +64 -0
  118. package/dist/findings-filing.js +108 -0
  119. package/dist/findings-filing.js.map +1 -0
  120. package/dist/fixture-auth.d.ts +63 -0
  121. package/dist/fixture-auth.js +95 -0
  122. package/dist/fixture-auth.js.map +1 -0
  123. package/dist/fixture-cli.d.ts +99 -0
  124. package/dist/fixture-cli.js +292 -0
  125. package/dist/fixture-cli.js.map +1 -0
  126. package/dist/github-issue-filer.d.ts +62 -0
  127. package/dist/github-issue-filer.js +189 -0
  128. package/dist/github-issue-filer.js.map +1 -0
  129. package/dist/host-health-run.d.ts +25 -0
  130. package/dist/host-health-run.js +33 -0
  131. package/dist/host-health-run.js.map +1 -0
  132. package/dist/http-5xx-outcome.d.ts +6 -0
  133. package/dist/http-5xx-outcome.js +39 -0
  134. package/dist/http-5xx-outcome.js.map +1 -0
  135. package/dist/inbox-cli.d.ts +7 -0
  136. package/dist/inbox-cli.js +197 -0
  137. package/dist/inbox-cli.js.map +1 -0
  138. package/dist/index.d.ts +1 -0
  139. package/dist/index.js +1 -0
  140. package/dist/index.js.map +1 -1
  141. package/dist/init-cli.d.ts +4 -0
  142. package/dist/init-cli.js +156 -0
  143. package/dist/init-cli.js.map +1 -0
  144. package/dist/init-keys.d.ts +30 -2
  145. package/dist/init-keys.js +19 -5
  146. package/dist/init-keys.js.map +1 -1
  147. package/dist/init-next-steps.d.ts +35 -0
  148. package/dist/init-next-steps.js +79 -0
  149. package/dist/init-next-steps.js.map +1 -0
  150. package/dist/invariants-file.d.ts +34 -0
  151. package/dist/invariants-file.js +68 -0
  152. package/dist/invariants-file.js.map +1 -0
  153. package/dist/invariants-validate.d.ts +30 -0
  154. package/dist/invariants-validate.js +105 -0
  155. package/dist/invariants-validate.js.map +1 -0
  156. package/dist/journey-annotate-api.d.ts +76 -0
  157. package/dist/journey-annotate-api.js +269 -0
  158. package/dist/journey-annotate-api.js.map +1 -0
  159. package/dist/journey-annotate-cli.d.ts +9 -0
  160. package/dist/journey-annotate-cli.js +181 -0
  161. package/dist/journey-annotate-cli.js.map +1 -0
  162. package/dist/journey-api.d.ts +104 -2
  163. package/dist/journey-api.js +163 -20
  164. package/dist/journey-api.js.map +1 -1
  165. package/dist/journey-cli.d.ts +4 -0
  166. package/dist/journey-cli.js +411 -0
  167. package/dist/journey-cli.js.map +1 -0
  168. package/dist/journey-demo-api.d.ts +114 -0
  169. package/dist/journey-demo-api.js +405 -0
  170. package/dist/journey-demo-api.js.map +1 -0
  171. package/dist/journey-demo-cli.d.ts +10 -0
  172. package/dist/journey-demo-cli.js +158 -0
  173. package/dist/journey-demo-cli.js.map +1 -0
  174. package/dist/journey-prefix.d.ts +194 -0
  175. package/dist/journey-prefix.js +279 -0
  176. package/dist/journey-prefix.js.map +1 -0
  177. package/dist/key-report.d.ts +49 -0
  178. package/dist/key-report.js +101 -0
  179. package/dist/key-report.js.map +1 -0
  180. package/dist/kill-signal.d.ts +193 -0
  181. package/dist/kill-signal.js +283 -0
  182. package/dist/kill-signal.js.map +1 -0
  183. package/dist/launch-armed.d.ts +37 -0
  184. package/dist/launch-armed.js +31 -0
  185. package/dist/launch-armed.js.map +1 -0
  186. package/dist/ledger-api.d.ts +106 -0
  187. package/dist/ledger-api.js +239 -0
  188. package/dist/ledger-api.js.map +1 -0
  189. package/dist/ledger-cli.d.ts +18 -0
  190. package/dist/ledger-cli.js +107 -0
  191. package/dist/ledger-cli.js.map +1 -0
  192. package/dist/load-api.d.ts +29 -11
  193. package/dist/load-api.js +23 -15
  194. package/dist/load-api.js.map +1 -1
  195. package/dist/load-cli.d.ts +4 -0
  196. package/dist/load-cli.js +97 -0
  197. package/dist/load-cli.js.map +1 -0
  198. package/dist/log-correlation.d.ts +200 -0
  199. package/dist/log-correlation.js +394 -0
  200. package/dist/log-correlation.js.map +1 -0
  201. package/dist/log-lines.d.ts +131 -0
  202. package/dist/log-lines.js +389 -0
  203. package/dist/log-lines.js.map +1 -0
  204. package/dist/log-sources.d.ts +71 -0
  205. package/dist/log-sources.js +236 -0
  206. package/dist/log-sources.js.map +1 -0
  207. package/dist/log-trace.d.ts +80 -0
  208. package/dist/log-trace.js +210 -0
  209. package/dist/log-trace.js.map +1 -0
  210. package/dist/logs-cli.d.ts +3 -0
  211. package/dist/logs-cli.js +51 -0
  212. package/dist/logs-cli.js.map +1 -0
  213. package/dist/logs-retention.d.ts +28 -0
  214. package/dist/logs-retention.js +85 -0
  215. package/dist/logs-retention.js.map +1 -0
  216. package/dist/masked-input.d.ts +22 -0
  217. package/dist/masked-input.js +99 -0
  218. package/dist/masked-input.js.map +1 -0
  219. package/dist/mcp-api.d.ts +91 -1
  220. package/dist/mcp-api.js +514 -18
  221. package/dist/mcp-api.js.map +1 -1
  222. package/dist/mcp-args.d.ts +50 -0
  223. package/dist/mcp-args.js +164 -0
  224. package/dist/mcp-args.js.map +1 -0
  225. package/dist/mcp-cli-bridge.d.ts +34 -0
  226. package/dist/mcp-cli-bridge.js +62 -0
  227. package/dist/mcp-cli-bridge.js.map +1 -0
  228. package/dist/mcp-cli-runner.d.ts +29 -0
  229. package/dist/mcp-cli-runner.js +44 -0
  230. package/dist/mcp-cli-runner.js.map +1 -0
  231. package/dist/mcp-cli-tools.d.ts +129 -0
  232. package/dist/mcp-cli-tools.js +737 -0
  233. package/dist/mcp-cli-tools.js.map +1 -0
  234. package/dist/mcp-paths.d.ts +28 -0
  235. package/dist/mcp-paths.js +76 -0
  236. package/dist/mcp-paths.js.map +1 -0
  237. package/dist/mission-actors.d.ts +40 -0
  238. package/dist/mission-actors.js +72 -0
  239. package/dist/mission-actors.js.map +1 -0
  240. package/dist/mission-api.d.ts +35 -0
  241. package/dist/mission-api.js +60 -3
  242. package/dist/mission-api.js.map +1 -1
  243. package/dist/mission-cli.d.ts +4 -0
  244. package/dist/mission-cli.js +248 -0
  245. package/dist/mission-cli.js.map +1 -0
  246. package/dist/mission-exit.d.ts +22 -0
  247. package/dist/mission-exit.js +26 -0
  248. package/dist/mission-exit.js.map +1 -0
  249. package/dist/mission-fixtures.d.ts +234 -0
  250. package/dist/mission-fixtures.js +862 -0
  251. package/dist/mission-fixtures.js.map +1 -0
  252. package/dist/mission-journal.d.ts +60 -0
  253. package/dist/mission-journal.js +115 -0
  254. package/dist/mission-journal.js.map +1 -0
  255. package/dist/mission-queue-cli.d.ts +10 -0
  256. package/dist/mission-queue-cli.js +198 -0
  257. package/dist/mission-queue-cli.js.map +1 -0
  258. package/dist/mission-queue-runner.d.ts +126 -0
  259. package/dist/mission-queue-runner.js +406 -0
  260. package/dist/mission-queue-runner.js.map +1 -0
  261. package/dist/multi-run-cli.d.ts +37 -0
  262. package/dist/multi-run-cli.js +116 -0
  263. package/dist/multi-run-cli.js.map +1 -0
  264. package/dist/multi-run.d.ts +339 -0
  265. package/dist/multi-run.js +619 -0
  266. package/dist/multi-run.js.map +1 -0
  267. package/dist/openrouter-call.d.ts +22 -0
  268. package/dist/openrouter-call.js +64 -0
  269. package/dist/openrouter-call.js.map +1 -0
  270. package/dist/profile-cli.d.ts +4 -0
  271. package/dist/profile-cli.js +57 -0
  272. package/dist/profile-cli.js.map +1 -0
  273. package/dist/program.d.ts +3 -75
  274. package/dist/program.js +123 -1921
  275. package/dist/program.js.map +1 -1
  276. package/dist/project-dir.d.ts +96 -0
  277. package/dist/project-dir.js +221 -0
  278. package/dist/project-dir.js.map +1 -0
  279. package/dist/record-api.d.ts +13 -7
  280. package/dist/record-api.js +44 -30
  281. package/dist/record-api.js.map +1 -1
  282. package/dist/record-cli.d.ts +4 -0
  283. package/dist/record-cli.js +76 -0
  284. package/dist/record-cli.js.map +1 -0
  285. package/dist/recording-cli.d.ts +4 -0
  286. package/dist/recording-cli.js +248 -0
  287. package/dist/recording-cli.js.map +1 -0
  288. package/dist/regression-api.d.ts +107 -0
  289. package/dist/regression-api.js +387 -6
  290. package/dist/regression-api.js.map +1 -1
  291. package/dist/regression-cli.d.ts +4 -0
  292. package/dist/regression-cli.js +284 -0
  293. package/dist/regression-cli.js.map +1 -0
  294. package/dist/report-api.d.ts +146 -0
  295. package/dist/report-api.js +431 -0
  296. package/dist/report-api.js.map +1 -0
  297. package/dist/report-cli.d.ts +12 -0
  298. package/dist/report-cli.js +147 -0
  299. package/dist/report-cli.js.map +1 -0
  300. package/dist/resource-preflight.d.ts +87 -0
  301. package/dist/resource-preflight.js +160 -0
  302. package/dist/resource-preflight.js.map +1 -0
  303. package/dist/result-schema.d.ts +22 -0
  304. package/dist/result-schema.js +28 -0
  305. package/dist/result-schema.js.map +1 -0
  306. package/dist/run-index.d.ts +29 -0
  307. package/dist/run-index.js +70 -0
  308. package/dist/run-index.js.map +1 -0
  309. package/dist/run-key-preflight.d.ts +42 -0
  310. package/dist/run-key-preflight.js +82 -0
  311. package/dist/run-key-preflight.js.map +1 -0
  312. package/dist/run-screenshots.d.ts +123 -0
  313. package/dist/run-screenshots.js +235 -0
  314. package/dist/run-screenshots.js.map +1 -0
  315. package/dist/runtime-env.d.ts +8 -0
  316. package/dist/runtime-env.js +23 -0
  317. package/dist/runtime-env.js.map +1 -0
  318. package/dist/secret-args.d.ts +23 -0
  319. package/dist/secret-args.js +45 -0
  320. package/dist/secret-args.js.map +1 -0
  321. package/dist/serve-cli.d.ts +4 -0
  322. package/dist/serve-cli.js +95 -0
  323. package/dist/serve-cli.js.map +1 -0
  324. package/dist/server-log-verify.d.ts +36 -0
  325. package/dist/server-log-verify.js +120 -0
  326. package/dist/server-log-verify.js.map +1 -0
  327. package/dist/session-check.d.ts +14 -0
  328. package/dist/session-check.js +44 -0
  329. package/dist/session-check.js.map +1 -0
  330. package/dist/site-cli.d.ts +4 -0
  331. package/dist/site-cli.js +127 -0
  332. package/dist/site-cli.js.map +1 -0
  333. package/dist/site-gate-cli.d.ts +28 -0
  334. package/dist/site-gate-cli.js +59 -0
  335. package/dist/site-gate-cli.js.map +1 -0
  336. package/dist/source-api.js +20 -4
  337. package/dist/source-api.js.map +1 -1
  338. package/dist/source-cli.d.ts +4 -0
  339. package/dist/source-cli.js +284 -0
  340. package/dist/source-cli.js.map +1 -0
  341. package/dist/source-run-api.d.ts +27 -1
  342. package/dist/source-run-api.js +22 -11
  343. package/dist/source-run-api.js.map +1 -1
  344. package/dist/storage-state-snapshot.d.ts +50 -0
  345. package/dist/storage-state-snapshot.js +87 -0
  346. package/dist/storage-state-snapshot.js.map +1 -0
  347. package/dist/suite-explore-options.d.ts +321 -0
  348. package/dist/suite-explore-options.js +162 -0
  349. package/dist/suite-explore-options.js.map +1 -0
  350. package/dist/target-config.d.ts +115 -0
  351. package/dist/target-config.js +225 -0
  352. package/dist/target-config.js.map +1 -0
  353. package/dist/transcript-file.d.ts +12 -0
  354. package/dist/transcript-file.js +23 -0
  355. package/dist/transcript-file.js.map +1 -0
  356. package/dist/type-fixture-file.d.ts +9 -0
  357. package/dist/type-fixture-file.js +48 -0
  358. package/dist/type-fixture-file.js.map +1 -0
  359. package/dist/ui-api.d.ts +3 -0
  360. package/dist/ui-api.js +11 -4
  361. package/dist/ui-api.js.map +1 -1
  362. package/dist/usability-capture.d.ts +43 -0
  363. package/dist/usability-capture.js +327 -0
  364. package/dist/usability-capture.js.map +1 -0
  365. package/dist/usage-config.d.ts +36 -0
  366. package/dist/usage-config.js +114 -0
  367. package/dist/usage-config.js.map +1 -0
  368. package/dist/ux-api.d.ts +3 -75
  369. package/dist/ux-api.js +3 -220
  370. package/dist/ux-api.js.map +1 -1
  371. package/dist/ux-claim-probe.d.ts +45 -0
  372. package/dist/ux-claim-probe.js +386 -0
  373. package/dist/ux-claim-probe.js.map +1 -0
  374. package/dist/ux-cli.d.ts +4 -0
  375. package/dist/ux-cli.js +109 -0
  376. package/dist/ux-cli.js.map +1 -0
  377. package/dist/ux-config.d.ts +29 -0
  378. package/dist/ux-config.js +103 -0
  379. package/dist/ux-config.js.map +1 -0
  380. package/dist/ux-evidence.d.ts +54 -0
  381. package/dist/ux-evidence.js +197 -0
  382. package/dist/ux-evidence.js.map +1 -0
  383. package/dist/ux-product.d.ts +14 -0
  384. package/dist/ux-product.js +39 -0
  385. package/dist/ux-product.js.map +1 -0
  386. package/dist/ux-review.d.ts +116 -0
  387. package/dist/ux-review.js +171 -0
  388. package/dist/ux-review.js.map +1 -0
  389. package/dist/ux-usability.d.ts +263 -0
  390. package/dist/ux-usability.js +580 -0
  391. package/dist/ux-usability.js.map +1 -0
  392. package/dist/verify-fix-api.d.ts +194 -0
  393. package/dist/verify-fix-api.js +506 -0
  394. package/dist/verify-fix-api.js.map +1 -0
  395. package/dist/verify-fix-cli.d.ts +4 -0
  396. package/dist/verify-fix-cli.js +115 -0
  397. package/dist/verify-fix-cli.js.map +1 -0
  398. package/package.json +23 -18
  399. package/skills/jevitate-ci-check/SKILL.md +77 -0
  400. package/skills/jevitate-demo/SKILL.md +61 -0
  401. package/skills/jevitate-explore/SKILL.md +96 -87
  402. package/skills/jevitate-getting-started/SKILL.md +89 -0
  403. package/skills/jevitate-load-test/SKILL.md +11 -2
  404. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  405. package/skills/jevitate-record/SKILL.md +23 -5
  406. package/skills/jevitate-run-journey/SKILL.md +61 -17
  407. package/skills/jevitate-sources/SKILL.md +57 -14
  408. package/skills/jevitate-test-campaign/SKILL.md +203 -0
  409. package/skills/jevitate-ux-review/SKILL.md +106 -16
  410. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,406 @@
1
+ import { existsSync } from "node:fs";
2
+ import { hostname } from "node:os";
3
+ import { basename } from "node:path";
4
+ import { validateInvariantSpec } from "@jevitate/recording";
5
+ import { resolveEmulation } from "@jevitate/playwright";
6
+ import { targetAllowlist, } from "@jevitate/missions";
7
+ import { CLI_ADVERSARIAL_STRATEGIES, runAdversarialCliMission, runCoverageMission, runExploration, runFeatureCliMission, } from "./explore-api.js";
8
+ import { parseSecretField, secretFieldSecrets } from "@jevitate/explore";
9
+ import { runWithMissionKillListener } from "./kill-signal.js";
10
+ import { resolveTargetConfig } from "./target-config.js";
11
+ import { parseLogSourceSpecs } from "./log-sources.js";
12
+ import { parseLogDefectSpecs, parseLogIgnoreSpecs, parseLogScopeSpecs } from "./log-correlation.js";
13
+ import { parseCorrelationHeaders, parseLogIdPatterns } from "./log-trace.js";
14
+ import { buildMissionFixtures, checkSetupRefs } from "./fixture-cli.js";
15
+ import { substituteSetupRefs } from "./mission-fixtures.js";
16
+ import { clock } from "@jevitate/domain";
17
+ /** `<dir>/<stem>.result.json` → `<stem>`: the id `get_mission_result` takes. */
18
+ export function resultIdFromPath(resultPath) {
19
+ const name = basename(resultPath);
20
+ return name.endsWith(".result.json") ? name.slice(0, -".result.json".length) : name;
21
+ }
22
+ /** Strategies that need the judgment/generation gateways (every one but the model-free feature mission). */
23
+ export function needsModel(mission) {
24
+ return mission.strategy !== "feature" && !(mission.strategy === "goal-based" && mission.feature !== undefined);
25
+ }
26
+ /**
27
+ * Drains every mission currently `queued`, oldest first, one at a time. A mission another drain
28
+ * already claimed is left alone. Never throws for a single mission: its failure is recorded on its
29
+ * queue record (`failed` + `error`) and the drain moves on.
30
+ */
31
+ export async function drainMissionQueue(opts) {
32
+ const now = opts.nowIso ?? (() => clock.nowIso());
33
+ const self = opts.owner ?? { pid: process.pid, host: hostname() };
34
+ const recovered = await recoverOrphans(opts, self, now);
35
+ const queued = (await opts.queue.list())
36
+ .filter((m) => m.status === "queued")
37
+ .sort((a, b) => a.enqueuedAtIso.localeCompare(b.enqueuedAtIso));
38
+ const ran = [];
39
+ const skipped = [];
40
+ for (const candidate of queued) {
41
+ const accepted = opts.accepts?.(candidate) ?? true;
42
+ if (accepted !== true) {
43
+ skipped.push({ missionId: candidate.id, reason: accepted });
44
+ continue;
45
+ }
46
+ if (!(await opts.queue.claim(candidate.id, { ...self, claimedAtIso: now() })))
47
+ continue; // another drain owns it
48
+ const mission = await opts.queue.get(candidate.id);
49
+ if (mission === null || mission.status !== "queued")
50
+ continue;
51
+ const running = { ...mission, status: "running", startedAtIso: now() };
52
+ await opts.queue.update(running);
53
+ let drained;
54
+ // Killed mid-mission (SIGTERM/SIGINT): the kill switch writes the run's partial `inconclusive`
55
+ // result; record it on the queue record in the same synchronous turn, so the mission reads as
56
+ // done-with-that-result rather than `running` forever.
57
+ // Scoped to THIS item: with several missions in one process, a kill records each queue item
58
+ // with its own mission's result, never another's.
59
+ const onKilled = ({ resultPath, exitCode }) => {
60
+ opts.queue.updateSync({
61
+ ...running,
62
+ status: "done",
63
+ finishedAtIso: now(),
64
+ resultId: resultIdFromPath(resultPath),
65
+ missionOutcome: "inconclusive",
66
+ exitCode,
67
+ });
68
+ };
69
+ try {
70
+ const target = await opts.targets.resolve(mission.target); // promoted-only, re-checked at run time
71
+ const run = await runWithMissionKillListener(onKilled, () => opts.execute({ mission: running, target, allowlist: targetAllowlist(target) }));
72
+ const resultId = resultIdFromPath(run.resultPath);
73
+ await opts.queue.update({
74
+ ...running,
75
+ status: "done",
76
+ finishedAtIso: now(),
77
+ resultId,
78
+ missionOutcome: run.missionOutcome,
79
+ ...(run.goalOutcome === undefined ? {} : { goalOutcome: run.goalOutcome }),
80
+ exitCode: run.exitCode,
81
+ });
82
+ drained = {
83
+ missionId: mission.id,
84
+ strategy: mission.strategy,
85
+ status: "done",
86
+ resultId,
87
+ missionOutcome: run.missionOutcome,
88
+ ...(run.goalOutcome === undefined ? {} : { goalOutcome: run.goalOutcome }),
89
+ exitCode: run.exitCode,
90
+ };
91
+ }
92
+ catch (err) {
93
+ const error = err instanceof Error ? err.message : String(err);
94
+ await opts.queue.update({ ...running, status: "failed", finishedAtIso: now(), error });
95
+ drained = { missionId: mission.id, strategy: mission.strategy, status: "failed", error };
96
+ }
97
+ ran.push(drained);
98
+ opts.onMission?.(drained);
99
+ }
100
+ return { ran, recovered, skipped };
101
+ }
102
+ /** Default: 12h — well past any bounded mission (stall timeouts, action caps), short of a lost week. */
103
+ const ORPHAN_AFTER_MS = 12 * 60 * 60 * 1000;
104
+ function processAlive(pid) {
105
+ try {
106
+ process.kill(pid, 0);
107
+ return true;
108
+ }
109
+ catch (err) {
110
+ // EPERM: it exists, owned by another user. Only ESRCH means it is gone.
111
+ return !(typeof err === "object" && err !== null && "code" in err && err.code === "ESRCH");
112
+ }
113
+ }
114
+ /**
115
+ * A drain that dies hard (SIGKILL, OOM, reboot) leaves its mission `running` forever, and
116
+ * `get_mission_result` would tell an agent to poll again indefinitely. Before claiming new work,
117
+ * a drain records such missions `failed`: when the claiming process on this host is gone, or —
118
+ * when that cannot be checked (another host, a claim from before owners were recorded) — once the
119
+ * mission has been running longer than `orphanAfterMs`. Never re-run: it may already have sent
120
+ * writes; the error says to enqueue it again.
121
+ */
122
+ async function recoverOrphans(opts, self, now) {
123
+ const isAlive = opts.isAlive ?? processAlive;
124
+ const orphanAfterMs = opts.orphanAfterMs ?? ORPHAN_AFTER_MS;
125
+ const out = [];
126
+ for (const m of await opts.queue.list()) {
127
+ if (m.status !== "running")
128
+ continue;
129
+ const owner = await opts.queue.claimOwner(m.id);
130
+ if (owner !== null && owner.host === self.host && owner.pid === self.pid)
131
+ continue; // this drain's own
132
+ const checkable = owner !== null && owner.host === self.host;
133
+ const startedMs = Date.parse(m.startedAtIso ?? owner?.claimedAtIso ?? m.enqueuedAtIso);
134
+ const dead = checkable ? !isAlive(owner.pid) : Date.parse(now()) - startedMs > orphanAfterMs;
135
+ if (!dead)
136
+ continue;
137
+ const who = owner === null ? "its drain" : `its drain (pid ${owner.pid} on ${owner.host})`;
138
+ const error = checkable
139
+ ? `${who} stopped without finishing it; it was not re-run, since it may already have sent writes — enqueue it again to retry`
140
+ : `${who} has not finished it after ${Math.round(orphanAfterMs / 3_600_000)}h; recorded failed, not re-run, since it may already have sent writes — enqueue it again to retry`;
141
+ await opts.queue.update({ ...m, status: "failed", finishedAtIso: now(), error });
142
+ out.push({ missionId: m.id, error });
143
+ }
144
+ return out;
145
+ }
146
+ /**
147
+ * #175: a queued mission never carries a credential (a `QueuedMission` cannot name a path or a
148
+ * secret), so its session is only ever the OPERATOR's: the mission target record (`mission target
149
+ * add|update --storage-state/--save-storage-state/--secret-field`) first, then the
150
+ * `~/.jevitate/targets.json` entry for the target's origin — field by field. `saveStorageState: true`
151
+ * writes back to the effective `storageState`, so the next queued mission (they run one at a time)
152
+ * starts from the rotated session. Throws — the caller records a `failed` mission — when the
153
+ * declared file is missing or a variable is unset (naming the path or variable, never a value);
154
+ * never silently runs logged out.
155
+ */
156
+ function queuedAuth(target, targets, env, persona) {
157
+ let config = {};
158
+ if (targets !== undefined) {
159
+ try {
160
+ config = resolveTargetConfig(targets, new URL(target.baseUrl).origin);
161
+ }
162
+ catch {
163
+ config = {};
164
+ }
165
+ }
166
+ // #255: a queued persona NAME selects the operator's `personas.<name>` session for this origin
167
+ // (targets.json) — it wins over the target's default session. Unknown: the mission fails, never
168
+ // silently runs as the default user.
169
+ if (persona !== undefined) {
170
+ const p = config.personas?.[persona];
171
+ if (p === undefined) {
172
+ const known = Object.keys(config.personas ?? {});
173
+ throw new Error(`persona '${persona}' is not declared for ${target.authorizedOrigin} in ~/.jevitate/targets.json (personas)` +
174
+ (known.length === 0 ? "" : ` — known personas: ${known.join(", ")}`));
175
+ }
176
+ if (p.storageState !== undefined && !existsSync(p.storageState)) {
177
+ throw new Error(`targets.json persona '${persona}' for ${target.authorizedOrigin}: storageState not found: ${p.storageState}`);
178
+ }
179
+ const secretFields = (p.secretFields ?? []).map((s) => parseSecretField(s, "value", env));
180
+ return {
181
+ ...(p.storageState === undefined ? {} : { storageState: p.storageState }),
182
+ secretFields,
183
+ ...(config.fixtures === undefined ? {} : { fixtures: config.fixtures }),
184
+ ...(config.personas === undefined ? {} : { personas: config.personas }),
185
+ };
186
+ }
187
+ const fromRecord = target.storageState !== undefined;
188
+ const storageState = target.storageState ?? config.storageState;
189
+ if (storageState !== undefined && !existsSync(storageState)) {
190
+ throw new Error(`${fromRecord ? `mission target ${target.id}` : `targets.json entry for ${target.authorizedOrigin}`}: storageState not found: ${storageState}`);
191
+ }
192
+ const save = target.saveStorageState ?? config.saveStorageState;
193
+ if (save === true && storageState === undefined)
194
+ throw new Error(`mission target ${target.id}: saveStorageState needs a storageState to write back to`);
195
+ const saveStorageState = save === true ? storageState : save;
196
+ const secretFields = (target.secretFields ?? config.secretFields ?? []).map((s) => parseSecretField(s, "value", env));
197
+ return {
198
+ ...(storageState === undefined ? {} : { storageState }),
199
+ ...(saveStorageState === undefined ? {} : { saveStorageState }),
200
+ secretFields,
201
+ ...(config.fixtures === undefined ? {} : { fixtures: config.fixtures }),
202
+ ...(config.personas === undefined ? {} : { personas: config.personas }),
203
+ };
204
+ }
205
+ /** The operator's targets.json config for `baseUrl`'s origin, or undefined when there is no targets file. */
206
+ function targetConfigFor(targets, baseUrl) {
207
+ if (targets === undefined)
208
+ return undefined;
209
+ try {
210
+ return resolveTargetConfig(targets, new URL(baseUrl).origin);
211
+ }
212
+ catch {
213
+ return undefined;
214
+ }
215
+ }
216
+ /** The operator-declared `--log-source`/`--log-defect` for one origin, already parsed (#142 follow-up).
217
+ * Throws (via `parseLogSourceSpecs`/`parseLogDefectSpecs`) on a malformed targets.json entry — the
218
+ * caller's existing per-mission try/catch turns that into a `failed` queue record, never a crash. */
219
+ export function serverLogFromTargetConfig(targets, baseUrl) {
220
+ if (targets === undefined)
221
+ return undefined;
222
+ let origin;
223
+ try {
224
+ origin = new URL(baseUrl).origin;
225
+ }
226
+ catch {
227
+ return undefined;
228
+ }
229
+ const config = resolveTargetConfig(targets, origin);
230
+ if ((config.logSources?.length ?? 0) === 0 && (config.logDefect?.length ?? 0) === 0)
231
+ return undefined;
232
+ const allowLogCmd = config.allowLogCmd === true;
233
+ return {
234
+ sources: parseLogSourceSpecs(config.logSources ?? [], allowLogCmd),
235
+ logDefect: parseLogDefectSpecs(config.logDefect ?? []),
236
+ allowLogCmd,
237
+ quietOk: config.logQuietOk ?? [],
238
+ logIgnore: parseLogIgnoreSpecs(config.logIgnore ?? []),
239
+ logScope: parseLogScopeSpecs(config.logScope ?? []),
240
+ correlationHeaders: parseCorrelationHeaders(config.logCorrelationHeaders ?? []),
241
+ idPatterns: parseLogIdPatterns(config.logIdPatterns ?? []),
242
+ };
243
+ }
244
+ /**
245
+ * Maps a queued mission onto the runner its strategy uses on the CLI. The start URL is the
246
+ * target's `baseUrl`; `route` is an in-scope glob for coverage/adversarial/feature.
247
+ */
248
+ export function realQueuedMissionExecutor(opts) {
249
+ const common = {
250
+ outDir: opts.outDir,
251
+ ...(opts.browserPortFactory === undefined ? {} : { browserPortFactory: opts.browserPortFactory }),
252
+ ...(opts.browser === undefined ? {} : { browser: opts.browser }),
253
+ };
254
+ return async ({ mission, target, allowlist }) => {
255
+ const bounds = mission.budget;
256
+ // Re-checked against the target as it is NOW (its origins may have changed since the enqueue):
257
+ // a probe may only ever read one of the run's own authorized origins.
258
+ if (mission.invariants !== undefined) {
259
+ validateInvariantSpec(mission.invariants, { allowlist, baseUrl: target.baseUrl });
260
+ }
261
+ const invariants = mission.invariants === undefined ? {} : { invariants: mission.invariants };
262
+ const routeGlobs = mission.route === undefined ? [] : [mission.route];
263
+ const serverLog = serverLogFromTargetConfig(opts.targets, target.baseUrl);
264
+ const withServerLog = serverLog === undefined ? {} : { serverLog };
265
+ // The operator's targets.json entry for this origin — safety (deny/paid/allowDestructive/
266
+ // readRequests/hangReplayWrites), settle, hangs, timing — applies to a queued mission exactly as
267
+ // to `explore` on the CLI. Never from the request.
268
+ const config = targetConfigFor(opts.targets, target.baseUrl);
269
+ const withTarget = config === undefined ? {} : { target: config };
270
+ const withSafety = config?.safety === undefined ? {} : { safety: config.safety };
271
+ // #175: the operator's session for this target (never the request's): every strategy starts
272
+ // from its storage state; a goal mission also types its secret fields and runs its fixtures.
273
+ const auth = queuedAuth(target, opts.targets, opts.env ?? process.env, mission.persona);
274
+ const withStorageState = {
275
+ ...(auth.storageState === undefined ? {} : { storageState: auth.storageState }),
276
+ ...(auth.saveStorageState === undefined ? {} : { saveStorageState: auth.saveStorageState }),
277
+ };
278
+ // #149: per-mission viewport/device emulation. `MissionRequestSchema` already refused an
279
+ // unknown --device / viewport+device together at enqueue time; `resolveEmulation` here is a
280
+ // second, defense-in-depth check — refused BEFORE any browser opens — since a device could in
281
+ // principle have been dropped from Playwright's registry between enqueue and drain.
282
+ const missionEmulation = mission.viewport === undefined && mission.device === undefined
283
+ ? undefined
284
+ : {
285
+ ...(mission.viewport === undefined ? {} : { viewport: mission.viewport }),
286
+ ...(mission.device === undefined ? {} : { device: mission.device }),
287
+ };
288
+ if (missionEmulation !== undefined)
289
+ resolveEmulation(missionEmulation);
290
+ const withEmulation = missionEmulation === undefined ? {} : { emulation: missionEmulation };
291
+ // #255: the media a queued mission asked for — always next to its result (a request never names
292
+ // a path), still headless and overlay-free.
293
+ const withMedia = {
294
+ ...(mission.recordVideo === true ? { browser: { ...opts.browser, recordVideo: {} } } : {}),
295
+ ...(mission.screenshots === undefined ? {} : { screenshots: { mode: mission.screenshots } }),
296
+ ...(mission.evidenceVideo === true ? { evidenceVideo: true } : {}),
297
+ };
298
+ if (mission.strategy === "feature" || (mission.strategy === "goal-based" && mission.feature !== undefined)) {
299
+ const r = await runFeatureCliMission({
300
+ ...common,
301
+ seedUrl: target.baseUrl,
302
+ allowlist,
303
+ capability: mission.feature,
304
+ routeGlobs,
305
+ bounds,
306
+ ...invariants,
307
+ ...withSafety,
308
+ ...withServerLog,
309
+ ...withEmulation,
310
+ ...withStorageState,
311
+ ...withMedia,
312
+ });
313
+ return { resultPath: r.resultPath, missionOutcome: r.missionOutcome, exitCode: r.exitCode };
314
+ }
315
+ if (mission.strategy === "goal-based" && mission.goal === undefined) {
316
+ throw new Error("a goal-based mission with only a route has no runner: queue it as strategy coverage or adversarial with that route");
317
+ }
318
+ const { judge, gen, usage } = await opts.gateways();
319
+ if (mission.strategy === "coverage" || mission.strategy === "exploratory") {
320
+ const r = await runCoverageMission({
321
+ ...common,
322
+ strategy: mission.strategy,
323
+ url: target.baseUrl,
324
+ allowlist,
325
+ judge,
326
+ gen,
327
+ usage,
328
+ bounds,
329
+ ...(routeGlobs.length > 0 ? { routeGlobs } : {}),
330
+ ...invariants,
331
+ ...withTarget,
332
+ ...withServerLog,
333
+ ...withEmulation,
334
+ ...withStorageState,
335
+ ...withMedia,
336
+ });
337
+ return { resultPath: r.resultPath, missionOutcome: r.missionOutcome, exitCode: r.exitCode };
338
+ }
339
+ if (mission.strategy === "adversarial") {
340
+ const r = await runAdversarialCliMission({
341
+ ...common,
342
+ seedUrl: target.baseUrl,
343
+ allowlist,
344
+ strategies: CLI_ADVERSARIAL_STRATEGIES,
345
+ judgment: judge,
346
+ generation: gen,
347
+ usage,
348
+ bounds,
349
+ ...(routeGlobs.length > 0 ? { routeGlobs } : {}),
350
+ ...invariants,
351
+ ...withTarget,
352
+ ...withServerLog,
353
+ ...withEmulation,
354
+ ...withStorageState,
355
+ ...withMedia,
356
+ });
357
+ return { resultPath: r.resultPath, missionOutcome: r.outcome, exitCode: r.exitCode };
358
+ }
359
+ // A goal mission runs the target's fixtures around it (authenticated from the same session and
360
+ // secret fields; validated before any browser) — as `explore --fixtures` does on the CLI.
361
+ const fx = buildMissionFixtures({}, {
362
+ allowlist,
363
+ baseUrl: target.baseUrl,
364
+ ...(auth.storageState === undefined ? {} : { storageState: auth.storageState }),
365
+ secretFields: auth.secretFields,
366
+ secrets: secretFieldSecrets(auth.secretFields),
367
+ ...(auth.fixtures === undefined ? {} : { targetFixtures: auth.fixtures }),
368
+ // #243: a fixture step's `auth.identity` binds to the origin's targets.json persona of that name.
369
+ ...(auth.personas === undefined ? {} : { personas: auth.personas }),
370
+ });
371
+ let goal = mission.goal;
372
+ checkSetupRefs({ goal }, fx);
373
+ try {
374
+ // A failed setup throws (`fixture setup failed: …`, redacted): the mission is recorded
375
+ // `failed` and never runs on unknown state.
376
+ if (fx !== undefined) {
377
+ await fx.setup();
378
+ goal = substituteSetupRefs(goal, fx.bindings(), { where: "goal" });
379
+ }
380
+ const r = await runExploration({
381
+ ...common,
382
+ url: target.baseUrl,
383
+ goal,
384
+ ...(mission.successAssertion === undefined ? {} : { successAssertion: mission.successAssertion }),
385
+ allowlist,
386
+ judge,
387
+ gen,
388
+ usage,
389
+ bounds,
390
+ ...invariants,
391
+ ...withTarget,
392
+ ...withServerLog,
393
+ ...withEmulation,
394
+ ...withStorageState,
395
+ ...withMedia,
396
+ ...(auth.secretFields.length === 0 ? {} : { secretFields: auth.secretFields }),
397
+ ...(fx === undefined ? {} : { fixtures: fx }),
398
+ });
399
+ return { resultPath: r.resultPath, missionOutcome: r.missionOutcome, goalOutcome: r.goalOutcome, exitCode: r.exitCode };
400
+ }
401
+ finally {
402
+ await fx?.restore();
403
+ }
404
+ };
405
+ }
406
+ //# sourceMappingURL=mission-queue-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mission-queue-runner.js","sourceRoot":"","sources":["../src/mission-queue-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Command } from "commander";
2
+ import { type MultiRunPlan, type MultiRunResult, type RunEnvelope } from "./multi-run.js";
3
+ /**
4
+ * The command line a single run is re-invoked with: every option the user actually gave (source
5
+ * `cli`), minus the orchestrator's own and `omit`. Values are forwarded as given; storage-state
6
+ * CONTENTS are never read here (only their paths travel).
7
+ */
8
+ export declare function forwardedArgv(cmd: Command, omit?: ReadonlySet<string>): string[];
9
+ /** A run's own command failed before its mission could run (bad args, missing keys, …): stop the multi-run. */
10
+ export declare class MultiRunAbortedError extends Error {
11
+ readonly envelope: Extract<RunEnvelope, {
12
+ ok: false;
13
+ }>;
14
+ constructor(envelope: Extract<RunEnvelope, {
15
+ ok: false;
16
+ }>);
17
+ }
18
+ /** The last JSON envelope a run wrote (`{v, ok, …}`), or a typed failure when it wrote none. */
19
+ export declare function lastEnvelope(lines: readonly string[]): RunEnvelope;
20
+ export interface ExploreMultiRunArgs {
21
+ /** The `explore` command being run (its parsed options are forwarded). */
22
+ readonly cmd: Command;
23
+ /** A fresh, unparsed program built from the same deps. */
24
+ readonly newProgram: () => Command;
25
+ readonly plan: MultiRunPlan;
26
+ readonly strategy: string;
27
+ /** `--out`: the multi-run directory (default `~/.jevitate/multi-runs/multi-<stamp>`). */
28
+ readonly out?: string;
29
+ readonly nowIso?: () => string;
30
+ /**
31
+ * #220: what a SIGTERM/SIGINT prints for the whole multi-run (the command's own output rule: the
32
+ * envelope with --json, else the human summary) — instead of the killed run's own envelope.
33
+ * Absent: a kill prints the multi-run nothing (a library caller that owns stdout).
34
+ */
35
+ readonly killOutput?: (partial: MultiRunResult) => string;
36
+ }
37
+ export declare function runExploreMultiRun(args: ExploreMultiRunArgs): Promise<MultiRunResult>;
@@ -0,0 +1,116 @@
1
+ import { join } from "node:path";
2
+ import { logsDirFor } from "./project-dir.js";
3
+ import { artifactStamp } from "./mission-journal.js";
4
+ import { runMultiRun } from "./multi-run.js";
5
+ import { setKillSummary } from "./kill-signal.js";
6
+ import { clock } from "@jevitate/domain";
7
+ /**
8
+ * The `explore --repeat/--persona` CLI glue (#141/#143): each run is the SAME `explore` command,
9
+ * re-parsed in a fresh program with the multi-run flags removed and `--out` (plus a persona's
10
+ * `--storage-state`) set per run — so every run goes through exactly the validation, gateways,
11
+ * invariants and checks a single run does, and opens its own fresh browser context.
12
+ */
13
+ /** Flags the orchestrator owns: never forwarded to an individual run. */
14
+ const MULTI_RUN_ATTRS = new Set(["repeat", "minAgreement", "persona", "personas", "out", "json"]);
15
+ /**
16
+ * The command line a single run is re-invoked with: every option the user actually gave (source
17
+ * `cli`), minus the orchestrator's own and `omit`. Values are forwarded as given; storage-state
18
+ * CONTENTS are never read here (only their paths travel).
19
+ */
20
+ export function forwardedArgv(cmd, omit = new Set()) {
21
+ const opts = cmd.opts();
22
+ const argv = [];
23
+ for (const opt of cmd.options) {
24
+ const attr = opt.attributeName();
25
+ if (opt.long === undefined || MULTI_RUN_ATTRS.has(attr) || omit.has(attr))
26
+ continue;
27
+ if (cmd.getOptionValueSource(attr) !== "cli")
28
+ continue;
29
+ const value = opts[attr];
30
+ if (opt.negate) {
31
+ if (value === false)
32
+ argv.push(opt.long);
33
+ }
34
+ else if (opt.isBoolean()) {
35
+ if (value === true)
36
+ argv.push(opt.long);
37
+ }
38
+ else if (opt.optional && value === true) {
39
+ // #290: an optional-value option given bare (`--screenshots`, `--record-video`) stores `true`;
40
+ // forward it bare so each run resolves its own default (next to its result), never `"true"`.
41
+ argv.push(opt.long);
42
+ }
43
+ else if (Array.isArray(value)) {
44
+ for (const v of value)
45
+ argv.push(opt.long, String(v));
46
+ }
47
+ else if (value !== undefined) {
48
+ argv.push(opt.long, String(value));
49
+ }
50
+ }
51
+ return argv;
52
+ }
53
+ /** A run's own command failed before its mission could run (bad args, missing keys, …): stop the multi-run. */
54
+ export class MultiRunAbortedError extends Error {
55
+ envelope;
56
+ constructor(envelope) {
57
+ super(envelope.error.message);
58
+ this.envelope = envelope;
59
+ this.name = "MultiRunAbortedError";
60
+ }
61
+ }
62
+ /** The last JSON envelope a run wrote (`{v, ok, …}`), or a typed failure when it wrote none. */
63
+ export function lastEnvelope(lines) {
64
+ const text = lines.join("");
65
+ const candidates = text.split("\n").filter((l) => l.trim() !== "");
66
+ for (let i = candidates.length - 1; i >= 0; i--) {
67
+ try {
68
+ const parsed = JSON.parse(candidates[i]);
69
+ if (parsed !== null && typeof parsed === "object" && typeof parsed.ok === "boolean") {
70
+ return parsed;
71
+ }
72
+ }
73
+ catch {
74
+ // not an envelope line
75
+ }
76
+ }
77
+ return { ok: false, error: { code: "E_EXPLORE_RUN", message: "the run wrote no result envelope" } };
78
+ }
79
+ export async function runExploreMultiRun(args) {
80
+ const { cmd, plan } = args;
81
+ const outDir = args.out ?? join(logsDirFor((args.nowIso ?? (() => clock.nowIso()))()), `multi-${artifactStamp((args.nowIso ?? (() => clock.nowIso()))())}`);
82
+ // With personas, each run's --storage-state is the persona's; otherwise the mission's own is kept.
83
+ const base = forwardedArgv(cmd, plan.personas === null ? new Set() : new Set(["storageState"]));
84
+ return runMultiRun({
85
+ plan,
86
+ strategy: args.strategy,
87
+ outDir,
88
+ // #220: a kill writes (and prints) the multi-run's partial aggregate — the interrupted run
89
+ // included — synchronously, then the process exits 130/143 like a single run.
90
+ armKill: (onKill) => setKillSummary(({ signal, exitCode, missions }) => {
91
+ const partial = onKill({ signal, exitCode, ...(missions[0] === undefined ? {} : { partial: missions[0].partial }) });
92
+ return args.killOutput?.(partial);
93
+ }),
94
+ runOnce: async ({ storageState, outDir: runDir }) => {
95
+ const lines = [];
96
+ const child = args.newProgram();
97
+ child.exitOverride();
98
+ child.configureOutput({ writeOut: (s) => lines.push(s), writeErr: () => undefined });
99
+ const argv = ["explore", ...base, ...(storageState === undefined ? [] : ["--storage-state", storageState]), "--out", runDir, "--json"];
100
+ let envelope;
101
+ try {
102
+ await child.parseAsync(argv, { from: "user" });
103
+ envelope = lastEnvelope(lines);
104
+ }
105
+ catch (err) {
106
+ envelope = { ok: false, error: { code: "E_EXPLORE_RUN", message: String(err instanceof Error ? err.message : err) } };
107
+ }
108
+ // A command-level failure (arguments, AI setup, an unauthorized target) repeats identically on
109
+ // every run: stop instead of recording N copies of it. A run that broke mid-mission is kept.
110
+ if (!envelope.ok && envelope.error.code !== "E_EXPLORE_RUN")
111
+ throw new MultiRunAbortedError(envelope);
112
+ return envelope;
113
+ },
114
+ });
115
+ }
116
+ //# sourceMappingURL=multi-run-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-run-cli.js","sourceRoot":"","sources":["../src/multi-run-cli.ts"],"names":[],"mappings":"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"}