@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,269 @@
|
|
|
1
|
+
import { expectedResultFromDelta } from "@jevitate/explore";
|
|
2
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import { AnnotationDraftMismatchError, AnnotationDraftSchema, FsJourneyStore, applyAnnotationDraft, describeStep, flatJourneySteps, intentCoverage, secretParamValues, } from "@jevitate/journey";
|
|
5
|
+
import { assertNoSecretInPayload, redactText, redactUrl } from "@jevitate/ai-core";
|
|
6
|
+
import { contentHash, clock } from "@jevitate/domain";
|
|
7
|
+
import { BrowseTheWebToken } from "@jevitate/screenplay";
|
|
8
|
+
import { runJourneyProgrammatically, UnknownJourneyError } from "./journey-api.js";
|
|
9
|
+
/**
|
|
10
|
+
* #246 — `jevitate journey annotate`: replay a Journey, capture redacted before/after page evidence
|
|
11
|
+
* per step, and ask the generation gateway to DRAFT each step's objective / expected result (and the
|
|
12
|
+
* Journey's goal / success criteria when missing). The draft goes to a sidecar file and NEVER into
|
|
13
|
+
* the Journey: `approveJourneyAnnotations` writes it only on an explicit human approval, and only
|
|
14
|
+
* while the Journey is unchanged since the draft (content hash).
|
|
15
|
+
*/
|
|
16
|
+
/** Visible text kept per page for the model (redacted first, then bounded). */
|
|
17
|
+
const EVIDENCE_TEXT_CHARS = 1500;
|
|
18
|
+
export class AnnotationDraftNotFoundError extends Error {
|
|
19
|
+
code = "E_JOURNEY_ANNOTATIONS_NOT_FOUND";
|
|
20
|
+
}
|
|
21
|
+
export class InvalidAnnotationDraftError extends Error {
|
|
22
|
+
code = "E_INVALID_ANNOTATIONS_DRAFT";
|
|
23
|
+
}
|
|
24
|
+
/** The Journey changed after the draft was made — approving would annotate steps it never saw. */
|
|
25
|
+
export class StaleAnnotationDraftError extends Error {
|
|
26
|
+
code = "E_JOURNEY_ANNOTATIONS_STALE";
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Where a Journey's draft lives: `<journeys>/.drafts/<id>.annotations.json` (`<ns>/<id>` for a shared
|
|
30
|
+
* Journey). A dot-folder, so `journey list` and namespace discovery never read it as a Journey.
|
|
31
|
+
*/
|
|
32
|
+
export function annotationDraftPath(journeysDir, id) {
|
|
33
|
+
const parts = id.split("/");
|
|
34
|
+
return join(journeysDir, ".drafts", ...parts.slice(0, -1), `${parts[parts.length - 1] ?? id}.annotations.json`);
|
|
35
|
+
}
|
|
36
|
+
/** The Journey's content hash — what a draft is bound to. */
|
|
37
|
+
export function journeyContentHash(journey) {
|
|
38
|
+
return contentHash(journey);
|
|
39
|
+
}
|
|
40
|
+
async function loadJourney(dir, id) {
|
|
41
|
+
const journey = await new FsJourneyStore(dir).get(id);
|
|
42
|
+
if (journey === null)
|
|
43
|
+
throw new UnknownJourneyError(`unknown journey '${id}'`);
|
|
44
|
+
return journey;
|
|
45
|
+
}
|
|
46
|
+
/** BROWSER CODE — the page's main heading (else its title) and visible text. */
|
|
47
|
+
function readPage() {
|
|
48
|
+
const h1 = document.querySelector("h1");
|
|
49
|
+
const heading = (h1?.innerText ?? h1?.textContent ?? "").trim() || (document.title ?? "");
|
|
50
|
+
return { heading, text: document.body?.innerText ?? "" };
|
|
51
|
+
}
|
|
52
|
+
/** Redacted page evidence (never throws: an unreadable page is empty evidence). */
|
|
53
|
+
async function capture(actor, secrets) {
|
|
54
|
+
const page = actor.ability(BrowseTheWebToken).session.page;
|
|
55
|
+
const raw = await page.evaluate(readPage).catch(() => ({ heading: "", text: "" }));
|
|
56
|
+
const scrub = (s) => redactText(s, secrets);
|
|
57
|
+
return {
|
|
58
|
+
url: scrub(redactUrl(page.url())),
|
|
59
|
+
heading: scrub(raw.heading.replace(/\s+/g, " ").trim()).slice(0, 300),
|
|
60
|
+
// Redact the WHOLE text before bounding it, so a cut never splits a secret past the redactor.
|
|
61
|
+
text: scrub(raw.text.replace(/[ \t]+/g, " ").replace(/\n{3,}/g, "\n\n").trim()).slice(0, EVIDENCE_TEXT_CHARS),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Replays the Journey through `runJourneyProgrammatically` (the same session, site policy, fixtures
|
|
66
|
+
* and fail-closed policy as `journey run`) with an observing interpreter, then drafts. A replay that
|
|
67
|
+
* stops early still drafts the steps it reached (`replay.outcome: "stopped"`).
|
|
68
|
+
*
|
|
69
|
+
* Environments (#247): every browser/session option `journey run` takes rides in `opts` and is
|
|
70
|
+
* handed to `runJourneyProgrammatically` unchanged — including `environment` (`--env`/`--base-url`,
|
|
71
|
+
* resolved by `resolveJourneyEnvironment`), so the replay is rebased and allowlisted exactly as a run.
|
|
72
|
+
*/
|
|
73
|
+
export async function annotateJourney(opts) {
|
|
74
|
+
const journey = await loadJourney(opts.dir, opts.id);
|
|
75
|
+
const journeyHash = journeyContentHash(journey);
|
|
76
|
+
const secrets = secretParamValues(journey, opts.params);
|
|
77
|
+
const flat = flatJourneySteps(journey);
|
|
78
|
+
const before = new Map();
|
|
79
|
+
const after = new Map();
|
|
80
|
+
const observer = {
|
|
81
|
+
beforeStep: async ({ actor, index }) => {
|
|
82
|
+
before.set(index, await capture(actor, secrets));
|
|
83
|
+
},
|
|
84
|
+
afterStep: async ({ actor, index, outcome }) => {
|
|
85
|
+
after.set(index, outcome === "done" ? await capture(actor, secrets) : null);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
const { gen, now, ...runOpts } = opts;
|
|
89
|
+
const run = await runJourneyProgrammatically({ ...runOpts, observer });
|
|
90
|
+
const reachedSteps = before.size;
|
|
91
|
+
const replay = run.outcome === "quarantined"
|
|
92
|
+
? { outcome: "stopped", reachedSteps, totalSteps: flat.length, reason: redactText(run.reason, secrets).slice(0, 2000) }
|
|
93
|
+
: { outcome: "completed", reachedSteps, totalSteps: flat.length };
|
|
94
|
+
const m = journey.metadata;
|
|
95
|
+
const context = redactText(m.goal ?? [m.name, m.description, journey.recording.intent].filter((s) => s !== undefined && s !== "").join(" — "), secrets);
|
|
96
|
+
const clean = (s) => {
|
|
97
|
+
const t = s === null || s === undefined ? "" : redactText(s, secrets).trim();
|
|
98
|
+
return t === "" ? undefined : t;
|
|
99
|
+
};
|
|
100
|
+
let provenance;
|
|
101
|
+
const steps = [];
|
|
102
|
+
const stepLines = [];
|
|
103
|
+
for (const s of flat) {
|
|
104
|
+
const described = redactText(describeStep(s.recorded.step), secrets);
|
|
105
|
+
const b = before.get(s.index);
|
|
106
|
+
const needObjective = (s.recorded.objective ?? "").trim() === "";
|
|
107
|
+
const needExpected = (s.recorded.expectedResult ?? "").trim() === "";
|
|
108
|
+
let objective = s.recorded.objective;
|
|
109
|
+
// #303 (`--action-deltas`): the expected result is drafted by code from what the step changed.
|
|
110
|
+
const observed = run.actionDeltas?.steps.find((x) => x.step === s.index + 1);
|
|
111
|
+
const fromDelta = needExpected && observed !== undefined ? clean(expectedResultFromDelta(observed.delta)) : undefined;
|
|
112
|
+
if (b !== undefined && fromDelta !== undefined && !needObjective) {
|
|
113
|
+
const a = after.get(s.index) ?? null;
|
|
114
|
+
steps.push({
|
|
115
|
+
index: s.index,
|
|
116
|
+
step: described.slice(0, 1000),
|
|
117
|
+
expectedResult: fromDelta,
|
|
118
|
+
evidence: { before: { url: b.url, heading: b.heading }, after: a === null ? null : { url: a.url, heading: a.heading } },
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else if (b !== undefined && (needObjective || needExpected)) {
|
|
122
|
+
const a = after.get(s.index) ?? null;
|
|
123
|
+
const input = { journey: context, stepNumber: s.index + 1, totalSteps: flat.length, step: described, before: b, after: a };
|
|
124
|
+
assertNoSecretInPayload(input, secrets); // fail closed: nothing secret reaches a model
|
|
125
|
+
const { output, provenance: p } = await gen.generate("journey.step", input);
|
|
126
|
+
provenance = p;
|
|
127
|
+
const draftObjective = needObjective ? clean(output.objective) : undefined;
|
|
128
|
+
const draftExpected = needExpected ? (fromDelta ?? clean(output.expectedResult)) : undefined;
|
|
129
|
+
objective = draftObjective ?? objective;
|
|
130
|
+
if (draftObjective !== undefined || draftExpected !== undefined) {
|
|
131
|
+
steps.push({
|
|
132
|
+
index: s.index,
|
|
133
|
+
step: described.slice(0, 1000),
|
|
134
|
+
...(draftObjective === undefined ? {} : { objective: draftObjective }),
|
|
135
|
+
...(draftExpected === undefined ? {} : { expectedResult: draftExpected }),
|
|
136
|
+
evidence: {
|
|
137
|
+
before: { url: b.url, heading: b.heading },
|
|
138
|
+
after: a === null ? null : { url: a.url, heading: a.heading },
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
stepLines.push(`${s.index + 1}. ${described}${objective === undefined ? "" : ` — ${redactText(objective, secrets)}`}`.slice(0, 1200));
|
|
144
|
+
}
|
|
145
|
+
let goal;
|
|
146
|
+
let successCriteria;
|
|
147
|
+
const needGoal = (m.goal ?? "").trim() === "";
|
|
148
|
+
const needCriteria = (m.successCriteria ?? []).length === 0;
|
|
149
|
+
if (needGoal || needCriteria) {
|
|
150
|
+
const lastReached = [...before.keys()].sort((x, y) => y - x)[0];
|
|
151
|
+
const finalPage = lastReached === undefined ? null : (after.get(lastReached) ?? before.get(lastReached) ?? null);
|
|
152
|
+
const input = {
|
|
153
|
+
name: redactText(m.name, secrets).slice(0, 500),
|
|
154
|
+
...(m.description === undefined ? {} : { description: redactText(m.description, secrets).slice(0, 2000) }),
|
|
155
|
+
...(journey.recording.intent === undefined ? {} : { intent: redactText(journey.recording.intent, secrets).slice(0, 2000) }),
|
|
156
|
+
steps: stepLines.slice(0, 200),
|
|
157
|
+
finalPage,
|
|
158
|
+
};
|
|
159
|
+
assertNoSecretInPayload(input, secrets);
|
|
160
|
+
const { output, provenance: p } = await gen.generate("journey.goal", input);
|
|
161
|
+
provenance = p;
|
|
162
|
+
if (needGoal)
|
|
163
|
+
goal = clean(output.goal);
|
|
164
|
+
if (needCriteria) {
|
|
165
|
+
const criteria = output.successCriteria.map((c) => clean(c)).filter((c) => c !== undefined);
|
|
166
|
+
if (criteria.length > 0)
|
|
167
|
+
successCriteria = criteria;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const draft = AnnotationDraftSchema.parse({
|
|
171
|
+
kind: "jevitate.journey-annotations.draft",
|
|
172
|
+
version: 1,
|
|
173
|
+
journeyId: opts.id,
|
|
174
|
+
journeyHash,
|
|
175
|
+
createdAtIso: (now ?? (() => clock.nowIso()))(),
|
|
176
|
+
provenance: provenance === undefined
|
|
177
|
+
? { adapter: "none", model: "none", promptVersion: "none" }
|
|
178
|
+
: { adapter: provenance.adapter, model: provenance.model, promptVersion: provenance.promptVersion },
|
|
179
|
+
replay,
|
|
180
|
+
...(goal === undefined ? {} : { goal }),
|
|
181
|
+
...(successCriteria === undefined ? {} : { successCriteria }),
|
|
182
|
+
steps,
|
|
183
|
+
});
|
|
184
|
+
assertNoSecretInPayload(draft, secrets, "journey annotation draft"); // the last line: never at rest
|
|
185
|
+
const draftPath = annotationDraftPath(opts.dir, opts.id);
|
|
186
|
+
await mkdir(dirname(draftPath), { recursive: true, mode: 0o700 });
|
|
187
|
+
await writeFile(draftPath, `${JSON.stringify(draft, null, 2)}\n`, { mode: 0o600 });
|
|
188
|
+
return {
|
|
189
|
+
id: opts.id,
|
|
190
|
+
draftPath,
|
|
191
|
+
replay,
|
|
192
|
+
drafted: {
|
|
193
|
+
objectives: steps.filter((s) => s.objective !== undefined).length,
|
|
194
|
+
expectedResults: steps.filter((s) => s.expectedResult !== undefined).length,
|
|
195
|
+
goal: goal !== undefined,
|
|
196
|
+
successCriteria: successCriteria?.length ?? 0,
|
|
197
|
+
},
|
|
198
|
+
proposed: applyAnnotationDraft(journey, draft).changes,
|
|
199
|
+
coverage: intentCoverage(journey),
|
|
200
|
+
...(run.screenshotPaths === undefined ? {} : { screenshotPaths: run.screenshotPaths }),
|
|
201
|
+
...(run.screenshotIndex === undefined ? {} : { screenshotIndex: run.screenshotIndex }),
|
|
202
|
+
...(run.screenshotsSkipped === undefined ? {} : { screenshotsSkipped: run.screenshotsSkipped }),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/** Reads and validates a Journey's draft (not found / invalid are typed refusals). */
|
|
206
|
+
export async function readAnnotationDraft(dir, id) {
|
|
207
|
+
const draftPath = annotationDraftPath(dir, id);
|
|
208
|
+
let raw;
|
|
209
|
+
try {
|
|
210
|
+
raw = await readFile(draftPath, "utf8");
|
|
211
|
+
}
|
|
212
|
+
catch (err) {
|
|
213
|
+
if (err.code === "ENOENT") {
|
|
214
|
+
throw new AnnotationDraftNotFoundError(`no annotation draft for journey '${id}' (${draftPath}) — run \`jevitate journey annotate ${id}\` first`);
|
|
215
|
+
}
|
|
216
|
+
throw err;
|
|
217
|
+
}
|
|
218
|
+
let parsed;
|
|
219
|
+
try {
|
|
220
|
+
parsed = JSON.parse(raw);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
throw new InvalidAnnotationDraftError(`${draftPath} is not JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
224
|
+
}
|
|
225
|
+
const result = AnnotationDraftSchema.safeParse(parsed);
|
|
226
|
+
if (!result.success) {
|
|
227
|
+
throw new InvalidAnnotationDraftError(`${draftPath} is not a valid annotation draft: ${result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`);
|
|
228
|
+
}
|
|
229
|
+
if (result.data.journeyId !== id) {
|
|
230
|
+
throw new InvalidAnnotationDraftError(`${draftPath} is a draft for journey '${result.data.journeyId}', not '${id}'`);
|
|
231
|
+
}
|
|
232
|
+
return { draft: result.data, draftPath };
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The human approval gate (like `journey promote`): applies the reviewed draft to the Journey and
|
|
236
|
+
* removes the draft. Refuses — writing nothing — when the Journey changed since the draft was made
|
|
237
|
+
* (its content hash differs) or the draft names steps the Journey does not have.
|
|
238
|
+
*/
|
|
239
|
+
export async function approveJourneyAnnotations(dir, id) {
|
|
240
|
+
const journey = await loadJourney(dir, id);
|
|
241
|
+
const { draft, draftPath } = await readAnnotationDraft(dir, id);
|
|
242
|
+
if (journeyContentHash(journey) !== draft.journeyHash) {
|
|
243
|
+
throw new StaleAnnotationDraftError(`journey '${id}' changed after this draft was made (${draftPath}) — re-run \`jevitate journey annotate ${id}\` to draft against the current Journey`);
|
|
244
|
+
}
|
|
245
|
+
let applied;
|
|
246
|
+
try {
|
|
247
|
+
applied = applyAnnotationDraft(journey, draft);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
if (err instanceof AnnotationDraftMismatchError)
|
|
251
|
+
throw new InvalidAnnotationDraftError(err.message);
|
|
252
|
+
throw err;
|
|
253
|
+
}
|
|
254
|
+
if (applied.changes.length > 0)
|
|
255
|
+
await new FsJourneyStore(dir).put(applied.journey);
|
|
256
|
+
await rm(draftPath, { force: true });
|
|
257
|
+
return { id, draftPath, changes: applied.changes, coverage: intentCoverage(applied.journey) };
|
|
258
|
+
}
|
|
259
|
+
/** `journey run`'s informational intent line (#246): how many steps say why. Never fails a run. */
|
|
260
|
+
export async function journeyIntentCoverage(dir, id) {
|
|
261
|
+
try {
|
|
262
|
+
const journey = await new FsJourneyStore(dir).get(id);
|
|
263
|
+
return journey === null ? undefined : intentCoverage(journey);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
//# sourceMappingURL=journey-annotate-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-annotate-api.js","sourceRoot":"","sources":["../src/journey-annotate-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type CliDeps } from "./cli-shared.js";
|
|
3
|
+
/**
|
|
4
|
+
* #246 — `jevitate journey annotate <id>`: replay the Journey and DRAFT its intent (each step's
|
|
5
|
+
* objective / expected result, the goal and success criteria when missing) into a sidecar file;
|
|
6
|
+
* `--approve` is the human gate that writes a reviewed draft into the Journey (refused when the
|
|
7
|
+
* Journey changed since the draft). The model never edits a Journey on its own.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerJourneyAnnotateCommand(journey: Command, program: Command, deps: CliDeps): void;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { ParamValidationError, formatAnnotationChanges } from "@jevitate/journey";
|
|
3
|
+
import { MissingCredentialError, SecretLeakError } from "@jevitate/ai-core";
|
|
4
|
+
import { SiteGateRefusedError } from "@jevitate/runtime";
|
|
5
|
+
import { ok, fail } from "./envelope.js";
|
|
6
|
+
import { UnknownJourneyError, JourneyRequiresAuthError } from "./journey-api.js";
|
|
7
|
+
import { formatScreenshotsLine, parseScreenshotsArg } from "./run-screenshots.js";
|
|
8
|
+
import { annotateJourney, approveJourneyAnnotations, AnnotationDraftNotFoundError, InvalidAnnotationDraftError, StaleAnnotationDraftError, } from "./journey-annotate-api.js";
|
|
9
|
+
import { withSiteGate } from "./site-gate-cli.js";
|
|
10
|
+
import { buildMissionFixtures, checkSetupRefs, withFixtureFlags } from "./fixture-cli.js";
|
|
11
|
+
import { FixtureSetupError, FixtureSpecError, UnboundSetupRefError } from "./mission-fixtures.js";
|
|
12
|
+
import { withEngine } from "./engine.js";
|
|
13
|
+
import { EXIT_CODES } from "./exit-codes.js";
|
|
14
|
+
import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
|
|
15
|
+
import { resolveDbPath, resolveJourneysDir, withBrowserLaunchFlags, withScreenshotsFlag, browserOption, withEmulationFlags, emulationFromFlags, collectParam, emitJson, emitUsageLine, environmentSeams, GatewaySelectionError, buildGenerationGateway, } from "./cli-shared.js";
|
|
16
|
+
/**
|
|
17
|
+
* #246 — `jevitate journey annotate <id>`: replay the Journey and DRAFT its intent (each step's
|
|
18
|
+
* objective / expected result, the goal and success criteria when missing) into a sidecar file;
|
|
19
|
+
* `--approve` is the human gate that writes a reviewed draft into the Journey (refused when the
|
|
20
|
+
* Journey changed since the draft). The model never edits a Journey on its own.
|
|
21
|
+
*/
|
|
22
|
+
export function registerJourneyAnnotateCommand(journey, program, deps) {
|
|
23
|
+
withScreenshotsFlag(withEnvironmentFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(journey.command("annotate <id>"))))))
|
|
24
|
+
.description("draft each step's objective/expected result (and the goal/success criteria when missing) by replaying the Journey; " +
|
|
25
|
+
"writes a reviewable draft, never the Journey — `--approve` applies a reviewed draft (human gate)")
|
|
26
|
+
.option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
|
|
27
|
+
.option("--param <kv>", "param as key=value (repeatable)", collectParam, {})
|
|
28
|
+
.option("--storage-state <file>", "Playwright storageState JSON to start the replay authenticated; must exist")
|
|
29
|
+
.option("--real", "draft with the live OpenRouter generation gateway (requires keys)", false)
|
|
30
|
+
.option("--fake-ai", "draft with the deterministic fake generator (pipeline smoke only)", false)
|
|
31
|
+
.option("--approve", "apply the reviewed draft to the Journey (shows the diff; refused if the Journey changed since the draft)", false)
|
|
32
|
+
.option("--action-deltas", "opt-in (#303): record what each replayed step changed and draft its expected result from that delta (by code, redacted) — the model is asked only for what the delta cannot say")
|
|
33
|
+
.option("--json", "emit a JSON envelope")
|
|
34
|
+
.action(async function (id) {
|
|
35
|
+
const ownFixtureFlags = this.opts();
|
|
36
|
+
const { dir, param, storageState: storageStateFlag, real, fakeAi, approve, json, env: envName, baseUrl, screenshots: screenshotsFlag, actionDeltas, ...emulationFlags } = this.opts();
|
|
37
|
+
const out = program.configureOutput().writeOut;
|
|
38
|
+
const journeysDir = resolveJourneysDir(deps, dir);
|
|
39
|
+
if (approve === true) {
|
|
40
|
+
if (real === true ||
|
|
41
|
+
fakeAi === true ||
|
|
42
|
+
Object.keys(param).length > 0 ||
|
|
43
|
+
storageStateFlag !== undefined ||
|
|
44
|
+
envName !== undefined ||
|
|
45
|
+
baseUrl !== undefined ||
|
|
46
|
+
screenshotsFlag !== undefined) {
|
|
47
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", "--approve applies an existing draft: it replays nothing, so it takes no --real/--fake-ai/--param/--storage-state/--env/--base-url/--screenshots"));
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const result = await approveJourneyAnnotations(journeysDir, id);
|
|
52
|
+
if (json) {
|
|
53
|
+
emitJson(program, ok(result));
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
out?.(formatAnnotationChanges(result.changes));
|
|
57
|
+
out?.(`applied ${result.changes.length} change(s) to journey '${id}' (${result.coverage.withObjective}/${result.coverage.steps} steps now have an objective)\n`);
|
|
58
|
+
process.exitCode = EXIT_CODES.ok;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
if (err instanceof UnknownJourneyError)
|
|
63
|
+
emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
|
|
64
|
+
else if (err instanceof AnnotationDraftNotFoundError || err instanceof InvalidAnnotationDraftError || err instanceof StaleAnnotationDraftError) {
|
|
65
|
+
emitJson(program, fail(err.code, err.message));
|
|
66
|
+
}
|
|
67
|
+
else
|
|
68
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
|
|
69
|
+
}
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// #247: --env/--base-url choose where the replay runs — the same resolver as `journey run`
|
|
73
|
+
// (unknown env / bad file / secret in environments.json → 64, nothing opened).
|
|
74
|
+
let environment;
|
|
75
|
+
try {
|
|
76
|
+
environment = environmentFromFlags({ ...(envName === undefined ? {} : { env: envName }), ...(baseUrl === undefined ? {} : { baseUrl }) }, environmentSeams(deps));
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
if (!isEnvironmentError(err))
|
|
80
|
+
throw err;
|
|
81
|
+
emitJson(program, fail(err.code, err.message));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// The environment's fixtures/hooks apply when the flags name none (hooks still need --allow-shell-hooks).
|
|
85
|
+
const fixtureFlags = {
|
|
86
|
+
...ownFixtureFlags,
|
|
87
|
+
...(ownFixtureFlags.before === undefined && environment?.hooks?.before !== undefined ? { before: environment.hooks.before } : {}),
|
|
88
|
+
...(ownFixtureFlags.after === undefined && environment?.hooks?.after !== undefined ? { after: environment.hooks.after } : {}),
|
|
89
|
+
};
|
|
90
|
+
// --storage-state wins; else the environment's own session (~/.jevitate/targets.json[<origin>]).
|
|
91
|
+
const storageState = storageStateFlag ?? environment?.storageState;
|
|
92
|
+
if (storageState !== undefined && !existsSync(storageState)) {
|
|
93
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", `storage state not found: ${storageState}`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
let emulation;
|
|
97
|
+
let screenshots;
|
|
98
|
+
try {
|
|
99
|
+
emulation = emulationFromFlags(emulationFlags);
|
|
100
|
+
screenshots = parseScreenshotsArg(screenshotsFlag);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", err instanceof Error ? err.message : String(err)));
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
let gateway;
|
|
107
|
+
try {
|
|
108
|
+
gateway = await buildGenerationGateway(deps, { real: real ?? false, fakeAi: fakeAi ?? false });
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError)
|
|
112
|
+
emitJson(program, fail("E_AI_SETUP_REQUIRED", err.message));
|
|
113
|
+
else
|
|
114
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const result = await withSiteGate(resolveDbPath(deps), (siteGate) => annotateJourney({
|
|
119
|
+
...(siteGate === undefined ? {} : { siteGate }),
|
|
120
|
+
dir: journeysDir,
|
|
121
|
+
id,
|
|
122
|
+
params: param,
|
|
123
|
+
gen: gateway.gen,
|
|
124
|
+
browserPortFactory: deps.explore?.browserPortFactory,
|
|
125
|
+
...browserOption(this.opts()),
|
|
126
|
+
...(emulation === undefined ? {} : { emulation }),
|
|
127
|
+
...(screenshots === undefined ? {} : { screenshots }),
|
|
128
|
+
...(actionDeltas === true ? { actionDeltas: true } : {}),
|
|
129
|
+
...(storageState !== undefined ? { storageState } : {}),
|
|
130
|
+
...(environment === undefined ? {} : { environment }),
|
|
131
|
+
fixtures: (site) => {
|
|
132
|
+
const fx = buildMissionFixtures(fixtureFlags, {
|
|
133
|
+
allowlist: environment === undefined ? [site] : environment.allowedOrigins,
|
|
134
|
+
baseUrl: site,
|
|
135
|
+
...(storageState !== undefined ? { storageState } : {}),
|
|
136
|
+
...(environment?.fixtures === undefined ? {} : { targetFixtures: environment.fixtures }),
|
|
137
|
+
});
|
|
138
|
+
checkSetupRefs({ "--param": Object.values(param) }, fx);
|
|
139
|
+
return fx;
|
|
140
|
+
},
|
|
141
|
+
}));
|
|
142
|
+
const data = withEngine({ ...result, usage: gateway.usage.snapshot() });
|
|
143
|
+
// A replay that stopped early drafted only the steps it reached: the command did not finish its work.
|
|
144
|
+
const exit = result.replay.outcome === "completed" ? EXIT_CODES.ok : EXIT_CODES.inconclusive;
|
|
145
|
+
if (json) {
|
|
146
|
+
emitJson(program, ok(data));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const r = result.replay;
|
|
150
|
+
out?.(`drafted annotations for journey '${id}' (${r.reachedSteps}/${r.totalSteps} steps replayed${r.outcome === "stopped" ? `; stopped: ${r.reason ?? "unknown"}` : ""}): ` +
|
|
151
|
+
`${result.drafted.objectives} objective(s), ${result.drafted.expectedResults} expected result(s)` +
|
|
152
|
+
`${result.drafted.goal ? ", a goal" : ""}${result.drafted.successCriteria > 0 ? `, ${result.drafted.successCriteria} success criterion(s)` : ""}\n`);
|
|
153
|
+
out?.(formatAnnotationChanges(result.proposed));
|
|
154
|
+
out?.(`draft: ${result.draftPath}\nreview or edit it, then apply it: jevitate journey annotate ${id} --approve\n`);
|
|
155
|
+
if (result.screenshotIndex !== undefined)
|
|
156
|
+
out?.(formatScreenshotsLine(result));
|
|
157
|
+
emitUsageLine(program, data);
|
|
158
|
+
}
|
|
159
|
+
process.exitCode = exit;
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
if (err instanceof SiteGateRefusedError || isEnvironmentError(err))
|
|
163
|
+
emitJson(program, fail(err.code, err.message));
|
|
164
|
+
else if (err instanceof UnknownJourneyError)
|
|
165
|
+
emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
|
|
166
|
+
else if (err instanceof JourneyRequiresAuthError)
|
|
167
|
+
emitJson(program, fail("E_JOURNEY_REQUIRES_AUTH", err.message));
|
|
168
|
+
else if (err instanceof ParamValidationError)
|
|
169
|
+
emitJson(program, fail("E_INVALID_PARAMS", err.message));
|
|
170
|
+
else if (err instanceof FixtureSpecError || err instanceof UnboundSetupRefError)
|
|
171
|
+
emitJson(program, fail(err.code, err.message));
|
|
172
|
+
else if (err instanceof FixtureSetupError)
|
|
173
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", err.message));
|
|
174
|
+
else if (err instanceof SecretLeakError)
|
|
175
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_SECRET", err.message));
|
|
176
|
+
else
|
|
177
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=journey-annotate-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-annotate-cli.js","sourceRoot":"","sources":["../src/journey-annotate-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/journey-api.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
import { type Journey } from "@jevitate/journey";
|
|
1
2
|
import { type RunPolicy } from "@jevitate/domain";
|
|
2
|
-
import { type
|
|
3
|
+
import { type BrowserPort, type BrowserSession, type EmulationSpec } from "@jevitate/playwright";
|
|
4
|
+
import { type BrowserRunOptions } from "./browser-run-options.js";
|
|
5
|
+
import { RecordingInterpreter, type StepObserver } from "@jevitate/interpreter";
|
|
6
|
+
import { type ReplayDeltaSummary } from "@jevitate/explore";
|
|
7
|
+
import { SecretPixelMask } from "./demo-capture.js";
|
|
8
|
+
import { type ScreenshotsResult, type ScreenshotsSpec } from "./run-screenshots.js";
|
|
9
|
+
import { type JourneyRunResult, type SelfHealer, type SiteGateDeps } from "@jevitate/runtime";
|
|
10
|
+
import { type FixtureRecord, type MissionFixtures } from "./mission-fixtures.js";
|
|
11
|
+
import { type ResolvedJourneyEnvironment } from "./environments.js";
|
|
3
12
|
/**
|
|
4
13
|
* Distinct from `@jevitate/journey`'s `ParamValidationError` so CLI/API callers
|
|
5
14
|
* can tell "no such journey" apart from "params didn't match the journey's
|
|
@@ -7,6 +16,13 @@ import { type JourneyRunResult, type SelfHealer } from "@jevitate/runtime";
|
|
|
7
16
|
*/
|
|
8
17
|
export declare class UnknownJourneyError extends Error {
|
|
9
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* A Journey declares `metadata.requiresAuth: true` (#118) but the run was given no
|
|
21
|
+
* `storageState` — refused BEFORE any browser launches, with a message that names the
|
|
22
|
+
* actual problem instead of a confusing `replay-target-not-found` deep into the steps.
|
|
23
|
+
*/
|
|
24
|
+
export declare class JourneyRequiresAuthError extends Error {
|
|
25
|
+
}
|
|
10
26
|
export interface RunJourneyProgrammaticallyOptions {
|
|
11
27
|
/** Directory a `FsJourneyStore` reads Journey JSON files from. */
|
|
12
28
|
dir: string;
|
|
@@ -24,7 +40,89 @@ export interface RunJourneyProgrammaticallyOptions {
|
|
|
24
40
|
* this port (enforced by `JourneyRunner`'s write floor).
|
|
25
41
|
*/
|
|
26
42
|
selfHealer?: SelfHealer;
|
|
43
|
+
/**
|
|
44
|
+
* Mission fixtures (#140/#144), built for the journey's own site once it is known: set up before
|
|
45
|
+
* the browser opens (a failure throws `FixtureSetupError` — the journey never runs on unknown
|
|
46
|
+
* state), `${setup.<name>}` in params bound to its outputs, and restored after the run.
|
|
47
|
+
*/
|
|
48
|
+
fixtures?: (site: string) => MissionFixtures | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Playwright storageState JSON to seed the session from (CLI/MCP `--storage-state`, #118) —
|
|
51
|
+
* the deterministic authenticated pre-step a Journey authored behind a login needs to
|
|
52
|
+
* replay. Contains live session cookies: handed only to the browser, never logged, never
|
|
53
|
+
* returned in the result, and never sent to a model.
|
|
54
|
+
*/
|
|
55
|
+
storageState?: string;
|
|
56
|
+
/** Testing seam — defaults to a real `PlaywrightBrowserPort`. */
|
|
57
|
+
browserPortFactory?: () => BrowserPort;
|
|
58
|
+
/** How Chromium is launched (executable/channel/extra args) and shown (#245 demo mode). Default: pinned Chromium, headless. */
|
|
59
|
+
browser?: BrowserRunOptions;
|
|
60
|
+
/** Per-mission viewport/device emulation (#149, CLI `--viewport <W>x<H>` / `--device "<name>"`). */
|
|
61
|
+
emulation?: EmulationSpec;
|
|
62
|
+
/**
|
|
63
|
+
* The site-policy gate's repositories (`jevitate site policy set`): pacing, throttles, budgets and
|
|
64
|
+
* quiet hours for the Journey's origin. Absent (no policy database) means no site policy applies.
|
|
65
|
+
*/
|
|
66
|
+
siteGate?: SiteGateDeps;
|
|
67
|
+
/** The site-policy account (default `primary`, as `jevitate site policy` uses). */
|
|
68
|
+
account?: string;
|
|
69
|
+
/**
|
|
70
|
+
* #246 seam: the interpreter the run replays with — `journey annotate` passes one carrying a
|
|
71
|
+
* `StepObserver` (before/after page evidence). Default: a plain `RecordingInterpreter`.
|
|
72
|
+
*/
|
|
73
|
+
interpreter?: RecordingInterpreter;
|
|
74
|
+
/**
|
|
75
|
+
* The environment to run against (#247, `--env`/`--base-url`, from `resolveJourneyEnvironment`):
|
|
76
|
+
* the Journey's recorded same-origin URLs move onto its `baseUrl` and the run's allowlist is its
|
|
77
|
+
* `allowedOrigins`; a step on any other origin is refused before any fixture or browser.
|
|
78
|
+
* Absent: the Journey's recorded site, exactly as before.
|
|
79
|
+
*/
|
|
80
|
+
environment?: ResolvedJourneyEnvironment;
|
|
81
|
+
/**
|
|
82
|
+
* #251 `--screenshots`: one masked screenshot per distinct screen (or per step) + `index.md`;
|
|
83
|
+
* the paths come back as `screenshotPaths`. Absent: none.
|
|
84
|
+
*/
|
|
85
|
+
screenshots?: ScreenshotsSpec;
|
|
86
|
+
/** #251 seam: a per-step observer composed into the default interpreter (annotate, demo). Ignored with `interpreter`. */
|
|
87
|
+
observer?: StepObserver;
|
|
88
|
+
/**
|
|
89
|
+
* #250/#251: the run's pixel mask (default: one over the Journey's secret parameters) — installed
|
|
90
|
+
* on the session before its first navigation whenever it records video or screenshots.
|
|
91
|
+
*/
|
|
92
|
+
mask?: SecretPixelMask;
|
|
93
|
+
/**
|
|
94
|
+
* #293 journey-anchored exploration: replay in THIS already-open session and leave it open (the
|
|
95
|
+
* caller's mission continues in the same page, form contents and session). No browser is opened
|
|
96
|
+
* or closed here; video/screenshots belong to the caller's session.
|
|
97
|
+
*/
|
|
98
|
+
session?: BrowserSession;
|
|
99
|
+
/**
|
|
100
|
+
* #293: replay only the first N top-level steps — the prefix up to an anchor. A `--param` the
|
|
101
|
+
* Journey does not take is still refused; one only a later step uses is not required (and unused).
|
|
102
|
+
*/
|
|
103
|
+
stopAfterStep?: number;
|
|
104
|
+
/**
|
|
105
|
+
* #303 `--action-deltas` (opt-in): record what each replayed step changed (redacted, code verdict)
|
|
106
|
+
* and compare it with the delta the Journey's Recording stored — returned as `actionDeltas`.
|
|
107
|
+
* Observation only: it never changes the replay. Off: nothing is captured.
|
|
108
|
+
*/
|
|
109
|
+
actionDeltas?: boolean;
|
|
27
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* #293: the params a Journey PREFIX runs with — a `--param` the whole Journey does not take is
|
|
113
|
+
* refused (`ParamValidationError`), one only a later step uses is dropped; the prefix's own required
|
|
114
|
+
* params are then checked by `validateParams` as usual.
|
|
115
|
+
*/
|
|
116
|
+
export declare function prefixParams(full: Journey, prefix: Journey, params: Record<string, string>): Record<string, string>;
|
|
117
|
+
/**
|
|
118
|
+
* Promotes a local Journey (#124, mirrors `promoteMissionTarget` in
|
|
119
|
+
* `mission-api.ts`) so it becomes discoverable via `journey find`/MCP
|
|
120
|
+
* `find_capabilities` and runnable via `run_journey` — a human-approval gate,
|
|
121
|
+
* same as `mission target promote`. An unknown id is refused with
|
|
122
|
+
* `UnknownJourneyError` (never silently created). Returns the persisted,
|
|
123
|
+
* now-promoted Journey.
|
|
124
|
+
*/
|
|
125
|
+
export declare function promoteJourney(dir: string, id: string): Promise<Journey>;
|
|
28
126
|
/**
|
|
29
127
|
* The one programmatic surface for "run this published Journey by id" —
|
|
30
128
|
* used by BOTH the CLI `journey run` action and external callers. Builds
|
|
@@ -34,4 +132,8 @@ export interface RunJourneyProgrammaticallyOptions {
|
|
|
34
132
|
* `ParamValidationError`, from `@jevitate/journey`) BEFORE any browser is
|
|
35
133
|
* launched, then builds the real Actor + `JourneyRunner` and runs.
|
|
36
134
|
*/
|
|
37
|
-
export declare function runJourneyProgrammatically(opts: RunJourneyProgrammaticallyOptions): Promise<JourneyRunResult
|
|
135
|
+
export declare function runJourneyProgrammatically(opts: RunJourneyProgrammaticallyOptions): Promise<JourneyRunResult & {
|
|
136
|
+
fixtures?: FixtureRecord;
|
|
137
|
+
videoPaths?: string[];
|
|
138
|
+
actionDeltas?: ReplayDeltaSummary;
|
|
139
|
+
} & Partial<ScreenshotsResult>>;
|