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