@jevitate/cli 0.1.0 → 0.2.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 (375) hide show
  1. package/README.md +23 -0
  2. package/dist/ai-cli.js +40 -30
  3. package/dist/ai-cli.js.map +1 -1
  4. package/dist/author-journey-cli.d.ts +4 -0
  5. package/dist/author-journey-cli.js +109 -0
  6. package/dist/author-journey-cli.js.map +1 -0
  7. package/dist/bin.js +58077 -22454
  8. package/dist/bin.js.map +1 -1
  9. package/dist/browser-run-options.d.ts +58 -0
  10. package/dist/browser-run-options.js +106 -0
  11. package/dist/browser-run-options.js.map +1 -0
  12. package/dist/build-info.generated.d.ts +2 -0
  13. package/dist/build-info.generated.js +10 -0
  14. package/dist/build-info.generated.js.map +1 -0
  15. package/dist/check-api.d.ts +5 -0
  16. package/dist/check-api.js +233 -0
  17. package/dist/check-api.js.map +1 -0
  18. package/dist/check-budget.d.ts +26 -0
  19. package/dist/check-budget.js +89 -0
  20. package/dist/check-budget.js.map +1 -0
  21. package/dist/check-cli.d.ts +31 -0
  22. package/dist/check-cli.js +109 -0
  23. package/dist/check-cli.js.map +1 -0
  24. package/dist/check-execute.d.ts +25 -0
  25. package/dist/check-execute.js +385 -0
  26. package/dist/check-execute.js.map +1 -0
  27. package/dist/check-plan.d.ts +113 -0
  28. package/dist/check-plan.js +448 -0
  29. package/dist/check-plan.js.map +1 -0
  30. package/dist/check-suite.d.ts +171 -0
  31. package/dist/check-suite.js +515 -0
  32. package/dist/check-suite.js.map +1 -0
  33. package/dist/check-types.d.ts +181 -0
  34. package/dist/check-types.js +35 -0
  35. package/dist/check-types.js.map +1 -0
  36. package/dist/cli-args.d.ts +26 -0
  37. package/dist/cli-args.js +50 -0
  38. package/dist/cli-args.js.map +1 -0
  39. package/dist/cli-output.d.ts +102 -0
  40. package/dist/cli-output.js +516 -0
  41. package/dist/cli-output.js.map +1 -0
  42. package/dist/cli-reference.d.ts +3 -0
  43. package/dist/cli-reference.js +81 -0
  44. package/dist/cli-reference.js.map +1 -0
  45. package/dist/cli-refusal.d.ts +12 -0
  46. package/dist/cli-refusal.js +52 -0
  47. package/dist/cli-refusal.js.map +1 -0
  48. package/dist/cli-shared.d.ts +330 -0
  49. package/dist/cli-shared.js +492 -0
  50. package/dist/cli-shared.js.map +1 -0
  51. package/dist/cli-surface.d.ts +33 -0
  52. package/dist/cli-surface.js +48 -0
  53. package/dist/cli-surface.js.map +1 -0
  54. package/dist/conversation-options.d.ts +15 -0
  55. package/dist/conversation-options.js +10 -0
  56. package/dist/conversation-options.js.map +1 -0
  57. package/dist/credentials-file.d.ts +15 -0
  58. package/dist/credentials-file.js +56 -0
  59. package/dist/credentials-file.js.map +1 -0
  60. package/dist/data-dir.d.ts +1 -1
  61. package/dist/data-dir.js +1 -1
  62. package/dist/defect-evidence.d.ts +141 -0
  63. package/dist/defect-evidence.js +502 -0
  64. package/dist/defect-evidence.js.map +1 -0
  65. package/dist/demo-aspect-api.d.ts +209 -0
  66. package/dist/demo-aspect-api.js +397 -0
  67. package/dist/demo-aspect-api.js.map +1 -0
  68. package/dist/demo-aspect-cli.d.ts +3 -0
  69. package/dist/demo-aspect-cli.js +241 -0
  70. package/dist/demo-aspect-cli.js.map +1 -0
  71. package/dist/demo-capture.d.ts +108 -0
  72. package/dist/demo-capture.js +438 -0
  73. package/dist/demo-capture.js.map +1 -0
  74. package/dist/engine.d.ts +35 -0
  75. package/dist/engine.js +25 -0
  76. package/dist/engine.js.map +1 -0
  77. package/dist/environments.d.ts +155 -0
  78. package/dist/environments.js +364 -0
  79. package/dist/environments.js.map +1 -0
  80. package/dist/exit-codes.d.ts +46 -0
  81. package/dist/exit-codes.js +91 -0
  82. package/dist/exit-codes.js.map +1 -0
  83. package/dist/explore-adversarial.d.ts +137 -0
  84. package/dist/explore-adversarial.js +218 -0
  85. package/dist/explore-adversarial.js.map +1 -0
  86. package/dist/explore-api.d.ts +7 -187
  87. package/dist/explore-api.js +7 -301
  88. package/dist/explore-api.js.map +1 -1
  89. package/dist/explore-author.d.ts +79 -0
  90. package/dist/explore-author.js +86 -0
  91. package/dist/explore-author.js.map +1 -0
  92. package/dist/explore-cli.d.ts +7 -0
  93. package/dist/explore-cli.js +963 -0
  94. package/dist/explore-cli.js.map +1 -0
  95. package/dist/explore-coverage.d.ts +158 -0
  96. package/dist/explore-coverage.js +240 -0
  97. package/dist/explore-coverage.js.map +1 -0
  98. package/dist/explore-feature.d.ts +127 -0
  99. package/dist/explore-feature.js +220 -0
  100. package/dist/explore-feature.js.map +1 -0
  101. package/dist/explore-goal.d.ts +253 -0
  102. package/dist/explore-goal.js +374 -0
  103. package/dist/explore-goal.js.map +1 -0
  104. package/dist/explore-shared.d.ts +152 -0
  105. package/dist/explore-shared.js +129 -0
  106. package/dist/explore-shared.js.map +1 -0
  107. package/dist/explore-specs.d.ts +53 -0
  108. package/dist/explore-specs.js +333 -0
  109. package/dist/explore-specs.js.map +1 -0
  110. package/dist/findings-filing.d.ts +64 -0
  111. package/dist/findings-filing.js +108 -0
  112. package/dist/findings-filing.js.map +1 -0
  113. package/dist/fixture-auth.d.ts +52 -0
  114. package/dist/fixture-auth.js +82 -0
  115. package/dist/fixture-auth.js.map +1 -0
  116. package/dist/fixture-cli.d.ts +70 -0
  117. package/dist/fixture-cli.js +178 -0
  118. package/dist/fixture-cli.js.map +1 -0
  119. package/dist/github-issue-filer.d.ts +62 -0
  120. package/dist/github-issue-filer.js +188 -0
  121. package/dist/github-issue-filer.js.map +1 -0
  122. package/dist/host-health-run.d.ts +24 -0
  123. package/dist/host-health-run.js +27 -0
  124. package/dist/host-health-run.js.map +1 -0
  125. package/dist/http-5xx-outcome.d.ts +6 -0
  126. package/dist/http-5xx-outcome.js +39 -0
  127. package/dist/http-5xx-outcome.js.map +1 -0
  128. package/dist/inbox-cli.d.ts +7 -0
  129. package/dist/inbox-cli.js +197 -0
  130. package/dist/inbox-cli.js.map +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +1 -0
  133. package/dist/index.js.map +1 -1
  134. package/dist/init-cli.d.ts +4 -0
  135. package/dist/init-cli.js +127 -0
  136. package/dist/init-cli.js.map +1 -0
  137. package/dist/init-keys.d.ts +19 -2
  138. package/dist/init-keys.js +15 -4
  139. package/dist/init-keys.js.map +1 -1
  140. package/dist/init-next-steps.d.ts +35 -0
  141. package/dist/init-next-steps.js +79 -0
  142. package/dist/init-next-steps.js.map +1 -0
  143. package/dist/invariants-file.d.ts +34 -0
  144. package/dist/invariants-file.js +68 -0
  145. package/dist/invariants-file.js.map +1 -0
  146. package/dist/invariants-validate.d.ts +30 -0
  147. package/dist/invariants-validate.js +105 -0
  148. package/dist/invariants-validate.js.map +1 -0
  149. package/dist/journey-annotate-api.d.ts +76 -0
  150. package/dist/journey-annotate-api.js +256 -0
  151. package/dist/journey-annotate-api.js.map +1 -0
  152. package/dist/journey-annotate-cli.d.ts +9 -0
  153. package/dist/journey-annotate-cli.js +179 -0
  154. package/dist/journey-annotate-cli.js.map +1 -0
  155. package/dist/journey-api.d.ts +79 -2
  156. package/dist/journey-api.js +136 -19
  157. package/dist/journey-api.js.map +1 -1
  158. package/dist/journey-cli.d.ts +4 -0
  159. package/dist/journey-cli.js +370 -0
  160. package/dist/journey-cli.js.map +1 -0
  161. package/dist/journey-demo-api.d.ts +112 -0
  162. package/dist/journey-demo-api.js +392 -0
  163. package/dist/journey-demo-api.js.map +1 -0
  164. package/dist/journey-demo-cli.d.ts +10 -0
  165. package/dist/journey-demo-cli.js +155 -0
  166. package/dist/journey-demo-cli.js.map +1 -0
  167. package/dist/kill-signal.d.ts +193 -0
  168. package/dist/kill-signal.js +284 -0
  169. package/dist/kill-signal.js.map +1 -0
  170. package/dist/launch-armed.d.ts +37 -0
  171. package/dist/launch-armed.js +31 -0
  172. package/dist/launch-armed.js.map +1 -0
  173. package/dist/ledger-api.d.ts +106 -0
  174. package/dist/ledger-api.js +237 -0
  175. package/dist/ledger-api.js.map +1 -0
  176. package/dist/ledger-cli.d.ts +18 -0
  177. package/dist/ledger-cli.js +107 -0
  178. package/dist/ledger-cli.js.map +1 -0
  179. package/dist/load-api.d.ts +29 -11
  180. package/dist/load-api.js +23 -15
  181. package/dist/load-api.js.map +1 -1
  182. package/dist/load-cli.d.ts +4 -0
  183. package/dist/load-cli.js +97 -0
  184. package/dist/load-cli.js.map +1 -0
  185. package/dist/log-correlation.d.ts +147 -0
  186. package/dist/log-correlation.js +325 -0
  187. package/dist/log-correlation.js.map +1 -0
  188. package/dist/log-lines.d.ts +131 -0
  189. package/dist/log-lines.js +389 -0
  190. package/dist/log-lines.js.map +1 -0
  191. package/dist/log-sources.d.ts +71 -0
  192. package/dist/log-sources.js +235 -0
  193. package/dist/log-sources.js.map +1 -0
  194. package/dist/logs-cli.d.ts +3 -0
  195. package/dist/logs-cli.js +51 -0
  196. package/dist/logs-cli.js.map +1 -0
  197. package/dist/logs-retention.d.ts +28 -0
  198. package/dist/logs-retention.js +84 -0
  199. package/dist/logs-retention.js.map +1 -0
  200. package/dist/mcp-api.d.ts +89 -1
  201. package/dist/mcp-api.js +472 -18
  202. package/dist/mcp-api.js.map +1 -1
  203. package/dist/mcp-args.d.ts +38 -0
  204. package/dist/mcp-args.js +131 -0
  205. package/dist/mcp-args.js.map +1 -0
  206. package/dist/mcp-cli-bridge.d.ts +34 -0
  207. package/dist/mcp-cli-bridge.js +62 -0
  208. package/dist/mcp-cli-bridge.js.map +1 -0
  209. package/dist/mcp-cli-runner.d.ts +29 -0
  210. package/dist/mcp-cli-runner.js +44 -0
  211. package/dist/mcp-cli-runner.js.map +1 -0
  212. package/dist/mcp-cli-tools.d.ts +125 -0
  213. package/dist/mcp-cli-tools.js +680 -0
  214. package/dist/mcp-cli-tools.js.map +1 -0
  215. package/dist/mcp-paths.d.ts +28 -0
  216. package/dist/mcp-paths.js +76 -0
  217. package/dist/mcp-paths.js.map +1 -0
  218. package/dist/mission-actors.d.ts +40 -0
  219. package/dist/mission-actors.js +72 -0
  220. package/dist/mission-actors.js.map +1 -0
  221. package/dist/mission-api.d.ts +35 -0
  222. package/dist/mission-api.js +58 -2
  223. package/dist/mission-api.js.map +1 -1
  224. package/dist/mission-cli.d.ts +4 -0
  225. package/dist/mission-cli.js +247 -0
  226. package/dist/mission-cli.js.map +1 -0
  227. package/dist/mission-exit.d.ts +22 -0
  228. package/dist/mission-exit.js +26 -0
  229. package/dist/mission-exit.js.map +1 -0
  230. package/dist/mission-fixtures.d.ts +225 -0
  231. package/dist/mission-fixtures.js +828 -0
  232. package/dist/mission-fixtures.js.map +1 -0
  233. package/dist/mission-journal.d.ts +60 -0
  234. package/dist/mission-journal.js +115 -0
  235. package/dist/mission-journal.js.map +1 -0
  236. package/dist/mission-queue-cli.d.ts +10 -0
  237. package/dist/mission-queue-cli.js +198 -0
  238. package/dist/mission-queue-cli.js.map +1 -0
  239. package/dist/mission-queue-runner.d.ts +126 -0
  240. package/dist/mission-queue-runner.js +397 -0
  241. package/dist/mission-queue-runner.js.map +1 -0
  242. package/dist/multi-run-cli.d.ts +37 -0
  243. package/dist/multi-run-cli.js +110 -0
  244. package/dist/multi-run-cli.js.map +1 -0
  245. package/dist/multi-run.d.ts +339 -0
  246. package/dist/multi-run.js +619 -0
  247. package/dist/multi-run.js.map +1 -0
  248. package/dist/openrouter-call.d.ts +22 -0
  249. package/dist/openrouter-call.js +63 -0
  250. package/dist/openrouter-call.js.map +1 -0
  251. package/dist/profile-cli.d.ts +4 -0
  252. package/dist/profile-cli.js +57 -0
  253. package/dist/profile-cli.js.map +1 -0
  254. package/dist/program.d.ts +3 -75
  255. package/dist/program.js +119 -1921
  256. package/dist/program.js.map +1 -1
  257. package/dist/project-dir.d.ts +96 -0
  258. package/dist/project-dir.js +220 -0
  259. package/dist/project-dir.js.map +1 -0
  260. package/dist/record-api.d.ts +10 -6
  261. package/dist/record-api.js +39 -28
  262. package/dist/record-api.js.map +1 -1
  263. package/dist/record-cli.d.ts +4 -0
  264. package/dist/record-cli.js +64 -0
  265. package/dist/record-cli.js.map +1 -0
  266. package/dist/recording-cli.d.ts +4 -0
  267. package/dist/recording-cli.js +248 -0
  268. package/dist/recording-cli.js.map +1 -0
  269. package/dist/regression-api.d.ts +101 -0
  270. package/dist/regression-api.js +384 -5
  271. package/dist/regression-api.js.map +1 -1
  272. package/dist/regression-cli.d.ts +4 -0
  273. package/dist/regression-cli.js +232 -0
  274. package/dist/regression-cli.js.map +1 -0
  275. package/dist/report-api.d.ts +146 -0
  276. package/dist/report-api.js +430 -0
  277. package/dist/report-api.js.map +1 -0
  278. package/dist/report-cli.d.ts +12 -0
  279. package/dist/report-cli.js +147 -0
  280. package/dist/report-cli.js.map +1 -0
  281. package/dist/result-schema.d.ts +22 -0
  282. package/dist/result-schema.js +28 -0
  283. package/dist/result-schema.js.map +1 -0
  284. package/dist/run-index.d.ts +29 -0
  285. package/dist/run-index.js +70 -0
  286. package/dist/run-index.js.map +1 -0
  287. package/dist/run-screenshots.d.ts +123 -0
  288. package/dist/run-screenshots.js +229 -0
  289. package/dist/run-screenshots.js.map +1 -0
  290. package/dist/runtime-env.d.ts +8 -0
  291. package/dist/runtime-env.js +22 -0
  292. package/dist/runtime-env.js.map +1 -0
  293. package/dist/secret-args.d.ts +23 -0
  294. package/dist/secret-args.js +45 -0
  295. package/dist/secret-args.js.map +1 -0
  296. package/dist/serve-cli.d.ts +4 -0
  297. package/dist/serve-cli.js +95 -0
  298. package/dist/serve-cli.js.map +1 -0
  299. package/dist/server-log-verify.d.ts +34 -0
  300. package/dist/server-log-verify.js +115 -0
  301. package/dist/server-log-verify.js.map +1 -0
  302. package/dist/session-check.d.ts +14 -0
  303. package/dist/session-check.js +44 -0
  304. package/dist/session-check.js.map +1 -0
  305. package/dist/site-cli.d.ts +4 -0
  306. package/dist/site-cli.js +127 -0
  307. package/dist/site-cli.js.map +1 -0
  308. package/dist/site-gate-cli.d.ts +28 -0
  309. package/dist/site-gate-cli.js +58 -0
  310. package/dist/site-gate-cli.js.map +1 -0
  311. package/dist/source-api.js +18 -3
  312. package/dist/source-api.js.map +1 -1
  313. package/dist/source-cli.d.ts +4 -0
  314. package/dist/source-cli.js +284 -0
  315. package/dist/source-cli.js.map +1 -0
  316. package/dist/source-run-api.d.ts +27 -1
  317. package/dist/source-run-api.js +22 -11
  318. package/dist/source-run-api.js.map +1 -1
  319. package/dist/storage-state-snapshot.d.ts +50 -0
  320. package/dist/storage-state-snapshot.js +87 -0
  321. package/dist/storage-state-snapshot.js.map +1 -0
  322. package/dist/suite-explore-options.d.ts +289 -0
  323. package/dist/suite-explore-options.js +140 -0
  324. package/dist/suite-explore-options.js.map +1 -0
  325. package/dist/target-config.d.ts +109 -0
  326. package/dist/target-config.js +216 -0
  327. package/dist/target-config.js.map +1 -0
  328. package/dist/transcript-file.d.ts +12 -0
  329. package/dist/transcript-file.js +23 -0
  330. package/dist/transcript-file.js.map +1 -0
  331. package/dist/ui-api.d.ts +3 -0
  332. package/dist/ui-api.js +7 -1
  333. package/dist/ui-api.js.map +1 -1
  334. package/dist/usability-capture.d.ts +43 -0
  335. package/dist/usability-capture.js +326 -0
  336. package/dist/usability-capture.js.map +1 -0
  337. package/dist/usage-config.d.ts +36 -0
  338. package/dist/usage-config.js +114 -0
  339. package/dist/usage-config.js.map +1 -0
  340. package/dist/ux-api.d.ts +3 -75
  341. package/dist/ux-api.js +3 -220
  342. package/dist/ux-api.js.map +1 -1
  343. package/dist/ux-cli.d.ts +4 -0
  344. package/dist/ux-cli.js +102 -0
  345. package/dist/ux-cli.js.map +1 -0
  346. package/dist/ux-config.d.ts +29 -0
  347. package/dist/ux-config.js +103 -0
  348. package/dist/ux-config.js.map +1 -0
  349. package/dist/ux-evidence.d.ts +54 -0
  350. package/dist/ux-evidence.js +197 -0
  351. package/dist/ux-evidence.js.map +1 -0
  352. package/dist/ux-review.d.ts +112 -0
  353. package/dist/ux-review.js +151 -0
  354. package/dist/ux-review.js.map +1 -0
  355. package/dist/ux-usability.d.ts +238 -0
  356. package/dist/ux-usability.js +494 -0
  357. package/dist/ux-usability.js.map +1 -0
  358. package/dist/verify-fix-api.d.ts +173 -0
  359. package/dist/verify-fix-api.js +454 -0
  360. package/dist/verify-fix-api.js.map +1 -0
  361. package/dist/verify-fix-cli.d.ts +4 -0
  362. package/dist/verify-fix-cli.js +110 -0
  363. package/dist/verify-fix-cli.js.map +1 -0
  364. package/package.json +19 -14
  365. package/skills/jevitate-ci-check/SKILL.md +77 -0
  366. package/skills/jevitate-demo/SKILL.md +61 -0
  367. package/skills/jevitate-explore/SKILL.md +88 -87
  368. package/skills/jevitate-getting-started/SKILL.md +88 -0
  369. package/skills/jevitate-load-test/SKILL.md +11 -2
  370. package/skills/jevitate-mission-scope/SKILL.md +19 -11
  371. package/skills/jevitate-record/SKILL.md +23 -5
  372. package/skills/jevitate-run-journey/SKILL.md +61 -17
  373. package/skills/jevitate-sources/SKILL.md +57 -14
  374. package/skills/jevitate-ux-review/SKILL.md +106 -16
  375. package/skills/jevitate-verify-fix/SKILL.md +76 -0
@@ -0,0 +1,374 @@
1
+ // explore-goal.ts — the goal-directed explore runner (`runExploration`) and its goal-only helpers (#231).
2
+ import { sessionLostReason } from "./session-check.js";
3
+ import { logsDirFor } from "./project-dir.js";
4
+ import { join, resolve as resolvePath } from "node:path";
5
+ import { PlaywrightBrowserPort, resolveEmulation } from "@jevitate/playwright";
6
+ import { closeOnce, demoOverlayOf, finalizeVideos, runVideoDir, sessionLaunchOptions } from "./browser-run-options.js";
7
+ import { runCaptureFor } from "./run-screenshots.js";
8
+ import { evidenceOf, withRunEvidence } from "./defect-evidence.js";
9
+ import { CastActor, BrowseTheWeb } from "@jevitate/screenplay";
10
+ import { runGoalBasedMission, assertAuthorizedExploreTarget, resolveMissionFixture, Http5xxOracle, secretFieldSecrets } from "@jevitate/explore";
11
+ import { conversationConfig } from "./conversation-options.js";
12
+ import { foldGoalOutcome } from "@jevitate/domain";
13
+ import { draftForCrash, draftForHang } from "@jevitate/explore";
14
+ import { processIssueDrafts } from "./findings-filing.js";
15
+ import { currentEngineInfo } from "./engine.js";
16
+ import { MissionJournal, artifactStamp, closeQuietly, resultPathFor, writeMissionResult } from "./mission-journal.js";
17
+ import { MISSION_RESULT_SCHEMA_VERSION, unifiedDefects } from "./result-schema.js";
18
+ import { applyHttp5xxGoalOutcome, describeHttp5xx, http5xxGoalReason } from "./http-5xx-outcome.js";
19
+ import { goalExitCode } from "./mission-exit.js";
20
+ import { launchArmed } from "./launch-armed.js";
21
+ import { finishHostHealth } from "./host-health-run.js";
22
+ import { openServerLogRuntime } from "./log-correlation.js";
23
+ import { fixtureReplayOpener, recordingFixture } from "./mission-fixtures.js";
24
+ import { observerSessions, persistedActors } from "./mission-actors.js";
25
+ import { serverLogResult, recordingEmulation, DRAFTS_ONLY, NO_FILER, draftContext, freshSessionOpener, currentUrlSafe, assertSaveStorageStateOutsideProject, persistStorageState, browserVersionOf, declaredResult } from "./explore-shared.js";
26
+ /** Outcomes that already mean the run itself broke or hung — a server-log finding never downgrades
27
+ * (or, for the oracle-unreadable case, elevates) one of these; they already prove more, or the same. */
28
+ const BROKEN_GOAL_OUTCOMES = new Set(["inconclusive", "crashed", "hang", "intermittent"]);
29
+ /**
30
+ * Folds a server-log correlation result into the goal mission's own `GoalBasedOutcome` (#142): a
31
+ * found `server-log` defect makes an otherwise-not-broken run `defects-found`; an unreadable
32
+ * `--log-defect` oracle turns an otherwise-`succeeded` run `inconclusive` — mirrors
33
+ * `applyServerLogOutcome` (the `MissionOutcome` version the other three builders use), but
34
+ * `GoalBasedOutcome` has its own extra values (`succeeded`/`exhausted`/`blocked`).
35
+ */
36
+ function applyServerLogGoalOutcome(outcome, run) {
37
+ if (run === undefined)
38
+ return outcome;
39
+ if (run.defects.length > 0 && !BROKEN_GOAL_OUTCOMES.has(outcome))
40
+ return "defects-found";
41
+ if (!run.summary.oracleOk && outcome === "succeeded")
42
+ return "inconclusive";
43
+ return outcome;
44
+ }
45
+ /** One-line reason for a server-log-driven outcome change (`reason` is unset otherwise for `succeeded`). */
46
+ function serverLogOutcomeReason(newOutcome, run) {
47
+ if (newOutcome === "defects-found") {
48
+ const n = run?.defects.length ?? 0;
49
+ return `${n} server-log defect${n === 1 ? "" : "s"} found (--log-defect)`;
50
+ }
51
+ // #169: the summary already knows WHICH source(s) made the oracle unhealthy and why (failed to
52
+ // open vs. declared but silent) — this default only covers the (should-be-unreachable) case of no
53
+ // summary at all.
54
+ return (run?.summary.oracleReason ??
55
+ "the --log-defect oracle could not run: every declared --log-source failed to open or read a line — an absence of server-log defects proves nothing");
56
+ }
57
+ /** Outcomes whose `reason` describes a UI-side blocker worth pairing with a correlated server cause. */
58
+ const BLOCKED_LIKE_OUTCOMES = new Set(["blocked", "exhausted", "failed", "inconclusive"]);
59
+ const SERVER_CAUSE_MAX_CHARS = 160;
60
+ /**
61
+ * The most informative correlated server-log line attached to the LAST transcript step (#165's
62
+ * "Also" — the step the run ended on is the one whose UI blocker `mission.reason` already
63
+ * describes): an `error` line wins over a `warn` one; ties keep the first (arrival order). `undefined`
64
+ * when `--log-source` was not given, or nothing warn/error-level attached to that step.
65
+ */
66
+ function lastStepServerCause(transcript) {
67
+ const logs = transcript?.[transcript.length - 1]?.serverLogs;
68
+ if (logs === undefined || logs.length === 0)
69
+ return undefined;
70
+ let line;
71
+ for (const l of logs) {
72
+ if (l.level !== "error" && l.level !== "warn")
73
+ continue;
74
+ if (line === undefined || (line.level !== "error" && l.level === "error"))
75
+ line = l;
76
+ }
77
+ if (line === undefined)
78
+ return undefined;
79
+ const body = line.message.length > SERVER_CAUSE_MAX_CHARS ? `${line.message.slice(0, SERVER_CAUSE_MAX_CHARS)}…` : line.message;
80
+ return `${line.level}${line.target === undefined ? "" : ` ${line.target}`} ${quote(body)}`;
81
+ }
82
+ function quote(s) {
83
+ return `"${s}"`;
84
+ }
85
+ /**
86
+ * Pairs an already-computed UI-side `reason` with the correlated server cause on the step the run
87
+ * ended on (#165 "Also"): `"<UI reason>; server: <level> \"<message>\""`. A no-op when there is no
88
+ * `reason` to pair with, the outcome isn't one of blocked/exhausted/inconclusive (a `defects-found`
89
+ * or an oracle-unhealthy `inconclusive` already gets its own `serverLogOutcomeReason`), or no
90
+ * server-log evidence attached to that step — including when `--log-source` was never given.
91
+ */
92
+ export function withServerCause(reason, outcome, transcript) {
93
+ if (reason === undefined || !BLOCKED_LIKE_OUTCOMES.has(outcome))
94
+ return reason;
95
+ const cause = lastStepServerCause(transcript);
96
+ return cause === undefined ? reason : `${reason}; server: ${cause}`;
97
+ }
98
+ export async function runExploration(opts) {
99
+ // Guardrail #1 — authorize BEFORE opening a browser. Throws on refusal.
100
+ const origin = assertAuthorizedExploreTarget(opts.url, opts.allowlist);
101
+ assertSaveStorageStateOutsideProject(opts.saveStorageState);
102
+ // Fail fast on a missing fixture BEFORE launching Chromium.
103
+ const fixture = opts.fixture === undefined ? undefined : await resolveMissionFixture(opts.fixture);
104
+ // A bound secret (or TOTP seed) is a run secret too: kept out of the issue drafts as well. So is a
105
+ // declared probe's resolved auth token (#135) — redacted everywhere a run secret is, not only in
106
+ // the invariant monitor's own evidence.
107
+ const authTokenValues = [...(opts.invariantAuthTokens?.values() ?? [])];
108
+ const bound = [...secretFieldSecrets(opts.secretFields), ...(opts.fixtures?.secrets() ?? []), ...authTokenValues];
109
+ const secrets = opts.secrets === undefined && bound.length === 0 ? undefined : [...(opts.secrets ?? []), ...bound];
110
+ // The state the mission starts from — replays restore THIS fixture and rebind its recorded outputs.
111
+ const fx = opts.fixtures;
112
+ const missionFixture = fx === undefined ? undefined : { record: fx.record(), persisted: fx.persisted() };
113
+ // #149: refused BEFORE any browser opens (an unknown --device, or --viewport + --device together).
114
+ const resolvedEmulation = resolveEmulation(opts.emulation);
115
+ if (opts.actors !== undefined && opts.storageState !== undefined && resolvePath(opts.storageState) !== opts.actors.primary.storageState) {
116
+ throw new Error("runExploration: storageState must be the primary actor's own");
117
+ }
118
+ const primaryState = opts.actors?.primary.storageState ?? opts.storageState;
119
+ // #250/#251: a recorded or screenshotted run's sessions carry the live pixel mask from their first
120
+ // paint; `--screenshots` captures after each step (the Recording path names their folder).
121
+ const capture = runCaptureFor({
122
+ recordsVideo: opts.browser?.recordVideo !== undefined,
123
+ screenshots: opts.screenshots,
124
+ secrets: secrets ?? [],
125
+ artifactPath: () => journal.recordingPath,
126
+ title: `goal: ${opts.goal}`,
127
+ });
128
+ const portFactory = capture.wrap(opts.browserPortFactory ?? (() => new PlaywrightBrowserPort()));
129
+ const port = portFactory();
130
+ const outDir = opts.outDir ?? logsDirFor();
131
+ const iso = (opts.nowIso ?? (() => new Date().toISOString()))();
132
+ // Crash-safe: the transcript and partial Recording are flushed after every step. `MissionJournal`
133
+ // itself creates `outDir` synchronously (mkdirSync).
134
+ const journal = new MissionJournal(join(outDir, `explore-${artifactStamp(iso)}.json`));
135
+ // #245: every session this run opens (mission, observers, hang replays) is shown/recorded alike.
136
+ const videoDir = runVideoDir(opts.browser, journal.recordingPath);
137
+ const shown = sessionLaunchOptions(opts.browser, videoDir);
138
+ const launch = {
139
+ ...shown,
140
+ allowedOrigins: [...opts.allowlist],
141
+ baseUrl: origin,
142
+ ...opts.emulation,
143
+ ...(primaryState !== undefined ? { storageState: primaryState } : {}),
144
+ };
145
+ // Crash-safe on SIGTERM/SIGINT too (#94): a partial `inconclusive` result is written from
146
+ // whatever the journal has already flushed, and the process exits with the conventional code.
147
+ // #163: this run's own share of a (possibly shared) tracker: its usage and sidecar.
148
+ const runUsage = opts.usage?.scope();
149
+ // #226: the kill switch is armed BEFORE the host sampler and the browser launch (see launch-armed.ts).
150
+ const { disarmKillSwitch, health, session, snapshotter } = await launchArmed({
151
+ hostHealth: opts.hostHealth,
152
+ saveStorageState: opts.saveStorageState !== undefined,
153
+ open: () => port.open(launch),
154
+ mission: (hooks) => ({
155
+ // #220: the killed run's partial result carries the unified schema's common fields too.
156
+ strategy: "goal",
157
+ target: { seedUrl: opts.url, allowlist: [...opts.allowlist], ...(primaryState !== undefined ? { storageStatePath: resolvePath(primaryState) } : {}) },
158
+ recordingPath: journal.recordingPath,
159
+ hostHealth: hooks.hostHealth,
160
+ transcriptPath: journal.transcriptPath,
161
+ transcript: () => journal.transcript,
162
+ ...(videoDir === undefined ? {} : { videoDir }),
163
+ ...(runUsage === undefined ? {} : { usage: runUsage }),
164
+ ...(opts.saveStorageState === undefined ? {} : { storageState: { path: opts.saveStorageState, snapshot: hooks.snapshot } }),
165
+ }),
166
+ });
167
+ // #208: the shared HTTP 5xx hard signal, listening from before the first navigation.
168
+ const http5xx = new Http5xxOracle(session.page, { allowlist: opts.allowlist });
169
+ // #147: each observer in its OWN fresh context (only its own storageState), opened on first use.
170
+ const observers = opts.actors === undefined || opts.actors.observers.length === 0
171
+ ? undefined
172
+ : observerSessions(portFactory, { ...shown, allowedOrigins: [...opts.allowlist], baseUrl: origin }, opts.actors.observers);
173
+ // Backend log correlation (#142): opened BEFORE the mission runs so its window covers the seed
174
+ // load too; a no-op (`undefined`) when `--log-source` was not given.
175
+ const serverLog = openServerLogRuntime({
176
+ sources: opts.serverLog?.sources ?? [],
177
+ logDefect: opts.serverLog?.logDefect ?? [],
178
+ quietOk: opts.serverLog?.quietOk ?? [],
179
+ logIgnore: opts.serverLog?.logIgnore ?? [],
180
+ ...(opts.serverLog?.drainMs === undefined ? {} : { drainMs: opts.serverLog.drainMs }),
181
+ secrets: secrets ?? [],
182
+ onTranscriptEntry: journal.onTranscriptEntry,
183
+ });
184
+ // #159: every settled step also refreshes the in-memory storageState snapshot (cheap no-op when
185
+ // `--save-storage-state` was not given — `snapshotter.noteSettledStep` checks `enabled` itself).
186
+ const onTranscriptEntry = (entry, all) => {
187
+ capture.noteEntry(session.page, entry);
188
+ health.noteStep(entry);
189
+ http5xx.noteStep(entry);
190
+ (serverLog?.onTranscriptEntry ?? journal.onTranscriptEntry)(entry, all);
191
+ snapshotter.noteSettledStep(currentUrlSafe(session));
192
+ };
193
+ // #159/#245: persisted and closed once — early (before the result is written) when recording video.
194
+ const closeSession = closeOnce(async () => {
195
+ await persistStorageState(session, opts.saveStorageState, snapshotter);
196
+ await closeQuietly(session);
197
+ });
198
+ try {
199
+ const actor = CastActor.named("explorer").whoCan(new BrowseTheWeb(session, [...opts.allowlist]));
200
+ const mission = await runGoalBasedMission({
201
+ ...(opts.target?.timing === undefined ? {} : { timingConfig: opts.target.timing }),
202
+ ...(opts.target?.settle === undefined ? {} : { settle: opts.target.settle }),
203
+ ...(opts.target?.hangs === undefined ? {} : { hangs: opts.target.hangs }),
204
+ ...(opts.target?.safety === undefined ? {} : { safety: opts.target.safety }),
205
+ // A hang is reproduced by replaying its steps in fresh contexts (same auth, same fixture state).
206
+ openFreshSession: fx === undefined || missionFixture === undefined
207
+ ? freshSessionOpener(portFactory, launch, opts.allowlist)
208
+ : fixtureReplayOpener(freshSessionOpener(portFactory, launch, opts.allowlist), fx, missionFixture.record.outputs),
209
+ ...(opts.hangReplays === undefined ? {} : { hangReplays: opts.hangReplays }),
210
+ onTranscriptEntry,
211
+ onRecording: journal.onRecording,
212
+ actor,
213
+ judge: opts.judge,
214
+ gen: opts.gen,
215
+ goal: opts.goal,
216
+ allowlist: opts.allowlist,
217
+ startUrl: opts.url,
218
+ ...(opts.successAssertion === undefined ? {} : { successAssertion: opts.successAssertion }),
219
+ ...(opts.successChecks === undefined ? {} : { successChecks: opts.successChecks }),
220
+ ...(opts.successWhen === undefined ? {} : { successWhen: opts.successWhen }),
221
+ ...(opts.allowVacuousChecks === true ? { allowVacuousChecks: true } : {}),
222
+ bounds: opts.bounds,
223
+ secrets,
224
+ ...(opts.secretFields === undefined ? {} : { secretFields: opts.secretFields }),
225
+ site: origin,
226
+ fixture,
227
+ ...conversationConfig(opts.conversation),
228
+ ...(opts.invariants === undefined ? {} : { invariants: opts.invariants }),
229
+ ...(opts.invariantAuthTokens === undefined ? {} : { invariantAuthTokens: opts.invariantAuthTokens }),
230
+ ...(observers === undefined ? {} : { observers }),
231
+ ...(opts.actors === undefined ? {} : { primaryActor: opts.actors.primary.name }),
232
+ hostHealth: health,
233
+ demoOverlay: demoOverlayOf(opts.browser),
234
+ });
235
+ await observers?.close();
236
+ // The mission (and its hang replays) is done: restore now, so the persisted log includes it. The
237
+ // caller restores again on every exit path (a no-op once restored).
238
+ await fx?.restore();
239
+ const recording = {
240
+ ...mission.recording,
241
+ ...(missionFixture === undefined ? {} : { fixture: recordingFixture(missionFixture.record) }),
242
+ ...(resolvedEmulation === undefined ? {} : { emulation: recordingEmulation(resolvedEmulation) }),
243
+ };
244
+ // Never blocks the mission itself: the drain wait happens AFTER `runGoalBasedMission` returned.
245
+ const serverLogRun = serverLog === undefined ? undefined : await serverLog.finish(mission.transcript);
246
+ // #142 follow-up: a found server-log defect counts as `defects-found` (exit 1); an unreadable
247
+ // `--log-defect` oracle turns an otherwise-`succeeded` run `inconclusive` (exit 2) — never clean.
248
+ const loggedOutcome = applyServerLogGoalOutcome(mission.outcome, serverLogRun);
249
+ // #208: an HTTP 5xx is a hard-signal defect — `defects-found` even when the goal's checks held.
250
+ const httpDefects = http5xx.defects(mission.transcript, mission.recording.pages.flatMap((p) => p.steps)[0]?.step.kind === "navigate" ? 1 : 0);
251
+ const hardOutcome = applyHttp5xxGoalOutcome(loggedOutcome, httpDefects);
252
+ // #203: most steps on a starved host → `inconclusive` (degraded-environment), never a pass/fail.
253
+ // #213: a starved `failed` goal keeps the check that did not hold in its degraded reason.
254
+ const host = await finishHostHealth(health, hardOutcome, {
255
+ ...(hardOutcome === mission.outcome && (mission.failure?.message ?? mission.reason) !== undefined
256
+ ? { wouldHaveBeen: mission.failure?.message ?? mission.reason }
257
+ : {}),
258
+ });
259
+ const goalOutcome = host.outcome;
260
+ journal.writeRecording(recording);
261
+ journal.writeTranscript(serverLogRun?.transcript ?? mission.transcript);
262
+ const engine = currentEngineInfo();
263
+ const ctx = draftContext(origin, journal, secrets ?? [], browserVersionOf(session.page), engine);
264
+ const resultPath = resultPathFor(journal.recordingPath);
265
+ const drafts = [];
266
+ if (mission.run.crash !== undefined)
267
+ drafts.push(draftForCrash(mission.run.crash, mission.transcript, ctx));
268
+ if (mission.hang !== undefined) {
269
+ drafts.push(draftForHang(mission.hang, {
270
+ ...ctx,
271
+ verifyCommand: `jevitate verify-fix --result ${resultPath} --fingerprint ${mission.hang.fingerprint}`,
272
+ }));
273
+ }
274
+ const issues = await processIssueDrafts(journal.recordingPath, drafts, opts.filing ?? DRAFTS_ONLY, opts.issueFiler ?? NO_FILER, iso);
275
+ // #245: every context closed (videos finalized) before the result naming them is written.
276
+ const shotFields = await capture.finish();
277
+ const videos = await finalizeVideos(videoDir, closeSession);
278
+ const result = {
279
+ schemaVersion: MISSION_RESULT_SCHEMA_VERSION,
280
+ strategy: "goal",
281
+ missionOutcome: foldGoalOutcome(goalOutcome),
282
+ goalOutcome,
283
+ issues,
284
+ timing: mission.run.timing,
285
+ outcome: goalOutcome,
286
+ runOutcome: mission.run.outcome,
287
+ ...(mission.run.answer === undefined ? {} : { answer: mission.run.answer }),
288
+ assertionPassed: mission.assertionPassed,
289
+ checks: mission.checks,
290
+ ...(mission.warnings === undefined ? {} : { checkWarnings: mission.warnings }),
291
+ ...(() => {
292
+ const lost = sessionLostReason({
293
+ target: primaryState === undefined ? {} : { storageStatePath: resolvePath(primaryState) },
294
+ transcript: serverLogRun?.transcript ?? mission.transcript,
295
+ });
296
+ return lost === undefined ? {} : { sessionLost: { reason: lost } };
297
+ })(),
298
+ stop: mission.run.stop,
299
+ finalUrl: mission.finalUrl,
300
+ decisions: mission.run.decisions,
301
+ actions: mission.run.actions,
302
+ recordingPaths: [journal.recordingPath],
303
+ recordingPath: journal.recordingPath,
304
+ ...videos,
305
+ ...shotFields,
306
+ transcriptPath: journal.transcriptPath,
307
+ transcript: serverLogRun?.transcript ?? mission.transcript,
308
+ exitCode: goalExitCode(goalOutcome),
309
+ resultPath,
310
+ target: {
311
+ seedUrl: opts.url,
312
+ allowlist: [...opts.allowlist],
313
+ ...(primaryState !== undefined ? { storageStatePath: resolvePath(primaryState) } : {}),
314
+ ...(opts.actors === undefined ? {} : { actors: persistedActors(opts.actors) }),
315
+ },
316
+ recording,
317
+ hangs: mission.hang === undefined ? [] : [mission.hang],
318
+ ...(mission.intermittentHangs === undefined ? {} : { intermittentHangs: mission.intermittentHangs }),
319
+ ...(mission.run.crash === undefined ? {} : { crash: mission.run.crash }),
320
+ // #180: the declared budgets' observed trajectory, whatever the outcome (a hang included).
321
+ ...(mission.budget === undefined ? {} : { budget: mission.budget }),
322
+ sideEffects: mission.run.sideEffects,
323
+ ...(mission.run.sideEffectsTruncated === undefined ? {} : { sideEffectsTruncated: mission.run.sideEffectsTruncated }),
324
+ engine,
325
+ ...(fx === undefined || missionFixture === undefined
326
+ ? {}
327
+ : {
328
+ fixtures: {
329
+ ...missionFixture.record,
330
+ cycles: fx.record().cycles,
331
+ log: fx.record().log,
332
+ ...(missionFixture.persisted.spec === undefined ? {} : { spec: missionFixture.persisted.spec }),
333
+ ...(missionFixture.persisted.hooks === undefined ? {} : { hooks: missionFixture.persisted.hooks }),
334
+ },
335
+ }),
336
+ // #209: a goal-specific miss (`success-check-failed`, `vacuous-check`) is typed too — after an
337
+ // engine failure or a starved host, which explain the run before the check does.
338
+ ...(() => {
339
+ const f = mission.run.failure ?? host.failure ?? mission.failure;
340
+ return f === undefined ? {} : { failure: f };
341
+ })(),
342
+ ...(host.failure !== undefined
343
+ ? { reason: host.failure.message }
344
+ : goalOutcome === mission.outcome
345
+ ? (() => {
346
+ const reason = withServerCause(mission.reason, goalOutcome, serverLogRun?.transcript);
347
+ // #208: a broken run keeps its outcome, but its reason still names the server error.
348
+ const withHttp = httpDefects.length === 0 ? reason : `${reason ?? goalOutcome}; HTTP 5xx: ${describeHttp5xx(httpDefects)}`;
349
+ return withHttp === undefined ? {} : { reason: withHttp };
350
+ })()
351
+ : loggedOutcome === mission.outcome
352
+ ? { reason: http5xxGoalReason(httpDefects, mission.assertionPassed) }
353
+ : { reason: serverLogOutcomeReason(goalOutcome, serverLogRun) }),
354
+ ...declaredResult(opts.invariants, mission.invariantDefects, mission.invariants),
355
+ ...(runUsage === undefined ? {} : { usage: runUsage.snapshot() }),
356
+ ...serverLogResult(serverLogRun),
357
+ defects: unifiedDefects([...(opts.invariants === undefined ? [] : (mission.invariantDefects ?? [])), ...httpDefects], serverLogRun?.defects),
358
+ ...host.fields,
359
+ };
360
+ // Persisted so `verify-fix` can replay a hang later (the typed result next to the Recording).
361
+ writeMissionResult(journal.recordingPath, result.missionOutcome, result.exitCode, result, runUsage);
362
+ return await withRunEvidence(result, evidenceOf(opts, secrets ?? []));
363
+ }
364
+ finally {
365
+ disarmKillSwitch();
366
+ health.stop();
367
+ // Safety net: if the mission threw before `serverLog.finish()` ran, close sources immediately
368
+ // (no drain wait) rather than leaving them open until process exit.
369
+ await serverLog?.abort();
370
+ await observers?.close().catch(() => undefined);
371
+ await closeSession();
372
+ }
373
+ }
374
+ //# sourceMappingURL=explore-goal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-goal.js","sourceRoot":"","sources":["../src/explore-goal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import type { JudgmentPort, GenerationPort, CredentialKey, UsageTracker } from "@jevitate/ai-core";
2
+ import { type BrowserPort } from "@jevitate/playwright";
3
+ import { type InvariantSpec, type RecordingEmulation } from "@jevitate/recording";
4
+ import type { InvariantDefect, InvariantReport } from "@jevitate/explore";
5
+ import { type DraftContext, type VerifySession } from "@jevitate/explore";
6
+ import { type FilingConfig, type IssueFilerPort } from "@jevitate/domain";
7
+ import { type EngineInfo } from "./engine.js";
8
+ import { MissionJournal } from "./mission-journal.js";
9
+ import { StorageStateSnapshotter } from "./storage-state-snapshot.js";
10
+ import { type ServerLogDefect, type ServerLogsSummary } from "./log-correlation.js";
11
+ import type { LogSourceSpec } from "./log-sources.js";
12
+ import type { LogDefectMatcher, LogIgnoreMatcher } from "./log-lines.js";
13
+ /**
14
+ * Backend log correlation (#142): already-validated `--log-source`/`--log-defect` specs, threaded
15
+ * into every mission-type builder below the same way `invariants` is. `undefined`/empty ⇒ no
16
+ * sources ⇒ `openServerLogRuntime` is a complete no-op (existing runs pay nothing).
17
+ */
18
+ export interface ServerLogOptions {
19
+ readonly sources: readonly LogSourceSpec[];
20
+ readonly logDefect: readonly LogDefectMatcher[];
21
+ readonly allowLogCmd?: boolean;
22
+ readonly drainMs?: number;
23
+ /** Raw `--log-source` specs (`--log-quiet-ok`, #169) allowed to deliver zero lines without making
24
+ * `serverLogs.oracleOk` false — for a source the operator KNOWS is legitimately quiet. */
25
+ readonly quietOk?: readonly string[];
26
+ /** Already-parsed `--log-ignore` matchers (#169 item 3): known-noise lines excluded from
27
+ * correlation and the defect oracle. */
28
+ readonly logIgnore?: readonly LogIgnoreMatcher[];
29
+ }
30
+ export declare function serverLogResult(runtimeResult: {
31
+ summary: ServerLogsSummary;
32
+ defects: ServerLogDefect[];
33
+ } | undefined): {
34
+ serverLogs?: ServerLogsSummary;
35
+ serverLogDefects?: ServerLogDefect[];
36
+ };
37
+ /**
38
+ * Overflow/emulation CLI flags shared by every strategy (#149): `emulation` is validated and
39
+ * resolved by `PlaywrightBrowserPort.open` itself (an unknown device or --viewport+--device
40
+ * together refuses BEFORE any browser opens); `overflow` gates and configures the horizontal-
41
+ * overflow hard signal (coverage only, for now).
42
+ */
43
+ export interface OverflowFlags {
44
+ readonly checkOverflow?: boolean;
45
+ readonly toleranceCss?: number;
46
+ readonly ignoreSelectors?: readonly string[];
47
+ }
48
+ /** The viewport/device emulation actually applied to a session — recorded on the Recording (#149). */
49
+ export declare function recordingEmulation(resolved: {
50
+ viewport: {
51
+ width: number;
52
+ height: number;
53
+ };
54
+ device?: string;
55
+ deviceScaleFactor?: number;
56
+ isMobile?: boolean;
57
+ hasTouch?: boolean;
58
+ } | undefined): RecordingEmulation | undefined;
59
+ /** Filing is off by default: drafts only, never a tracker call. */
60
+ export declare const DRAFTS_ONLY: FilingConfig;
61
+ export declare const NO_FILER: () => IssueFilerPort;
62
+ export declare function draftContext(origin: string, journal: MissionJournal, secrets: readonly string[], browserVersion: string | undefined, engine: EngineInfo): DraftContext;
63
+ /**
64
+ * Opens a FRESH browser session for replays (hang reproduction): a new context from the same port
65
+ * and options — same authenticated storageState, never the session the finding was made in.
66
+ */
67
+ export declare function freshSessionOpener(portFactory: () => BrowserPort, launch: Parameters<BrowserPort["open"]>[0], allowlist: readonly string[]): () => Promise<VerifySession>;
68
+ /** `session.page.url()`, or `undefined` when reading it throws (a closed/crashed page/context). */
69
+ export declare function currentUrlSafe(session: {
70
+ page: {
71
+ url(): string;
72
+ };
73
+ }): string | undefined;
74
+ /**
75
+ * Writes the browser context's storageState (cookies + origin storage) to `file` when the caller
76
+ * asked for one (CLI `--save-storage-state`, #82) — so a rotating refresh token stays usable across
77
+ * runs instead of the `--storage-state` file it started from going stale on first use. Called from
78
+ * every mission's `finally`, so a thrown error still reaches it (#159) — the context is still open at
79
+ * that point, whatever failed inside the mission itself. A no-op when `file` is undefined.
80
+ *
81
+ * #159 — never persists a lost/logged-out session over a good file: when the CURRENT page looks
82
+ * login-like (`isLoginLikeUrl`, the #82 signal), a live capture is skipped in favor of `snapshotter`'s
83
+ * last known-good in-memory snapshot (refreshed after each settled step — see
84
+ * `storage-state-snapshot.ts` — and itself never updated from a login-like page, so it always holds
85
+ * the most recent GOOD state). The same fallback covers a live capture that simply fails (a
86
+ * crashed/closed context after the page url could still be read). If neither a safe live capture nor
87
+ * a snapshot is available, nothing is written — any existing file at `file` is left untouched. There
88
+ * is no flag today for an operator to force the write anyway; see `saveStorageState`'s own doc.
89
+ *
90
+ * The file holds live session credentials: written with mode 0600 (owner read/write only), and its
91
+ * contents are never logged either way.
92
+ */
93
+ /**
94
+ * #195: refused BEFORE a browser opens — a `saveStorageState` inside a repo's `.jevitate/` (which
95
+ * never holds sessions or secrets). `persistStorageState` re-checks at the write itself.
96
+ */
97
+ export declare function assertSaveStorageStateOutsideProject(file: string | undefined): void;
98
+ export declare function persistStorageState(session: {
99
+ page: {
100
+ url(): string;
101
+ };
102
+ saveStorageState(file: string): Promise<void>;
103
+ }, file: string | undefined, snapshotter?: StorageStateSnapshotter): Promise<void>;
104
+ export declare function browserVersionOf(page: {
105
+ context(): {
106
+ browser(): {
107
+ version(): string;
108
+ } | null;
109
+ };
110
+ }): string | undefined;
111
+ /** The adversarial outcome plus where its Recording and decision transcript were written. */
112
+ /** Where a mission ran — enough for `verify-fix` to replay one of its defects in a fresh session. */
113
+ export interface MissionTarget {
114
+ readonly seedUrl: string;
115
+ readonly allowlist: string[];
116
+ /** Absolute path of the storageState file the run started from (never its contents). */
117
+ readonly storageStatePath?: string;
118
+ /** #147: every actor's name, role and storageState PATH (never its contents) — for verify-fix. */
119
+ readonly actors?: ReadonlyArray<{
120
+ readonly name: string;
121
+ readonly storageStatePath: string;
122
+ readonly role: "primary" | "observer";
123
+ }>;
124
+ }
125
+ /**
126
+ * The declared-invariant fields of a persisted result (#86): the defects (top-level `defects`, where
127
+ * `verify-fix` looks), the per-invariant report, and the spec itself so a later `verify-fix`
128
+ * re-checks exactly what the run checked. Nothing at all when the run had no `--invariants`.
129
+ */
130
+ export declare function declaredResult(spec: InvariantSpec | undefined, defects: readonly InvariantDefect[] | undefined, report: readonly InvariantReport[] | undefined): {
131
+ defects?: InvariantDefect[];
132
+ invariants?: InvariantReport[];
133
+ invariantSpec?: InvariantSpec;
134
+ };
135
+ /** Injectable wiring for the `explore` CLI command (all optional). */
136
+ export interface ExploreCliDeps {
137
+ /** Injected issue filer (tests use a fake — nothing real is ever filed from a test). */
138
+ issueFiler?: () => IssueFilerPort;
139
+ /** Injected filing config file path (tests). Default `~/.jevitate/filing.json`. */
140
+ filingConfigPath?: string;
141
+ /** Injected per-target config file path (tests). Default `~/.jevitate/targets.json`. */
142
+ targetsConfigPath?: string;
143
+ /** Injected judgment gateway (tests). */
144
+ judge?: JudgmentPort;
145
+ /** Injected generation gateway (tests). */
146
+ gen?: GenerationPort;
147
+ /** Injected usage tracker (tests): injected gateways that record into it report known costs (#163). */
148
+ usage?: UsageTracker;
149
+ browserPortFactory?: () => BrowserPort;
150
+ env?: Record<string, string | undefined>;
151
+ localConfig?: Partial<Record<CredentialKey, string>>;
152
+ }