@jevitate/cli 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/dist/ai-cli.js +40 -30
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.d.ts +4 -0
- package/dist/author-journey-cli.js +109 -0
- package/dist/author-journey-cli.js.map +1 -0
- package/dist/bin.js +58077 -22454
- package/dist/bin.js.map +1 -1
- package/dist/browser-run-options.d.ts +58 -0
- package/dist/browser-run-options.js +106 -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/check-api.d.ts +5 -0
- package/dist/check-api.js +233 -0
- package/dist/check-api.js.map +1 -0
- package/dist/check-budget.d.ts +26 -0
- package/dist/check-budget.js +89 -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 +25 -0
- package/dist/check-execute.js +385 -0
- package/dist/check-execute.js.map +1 -0
- package/dist/check-plan.d.ts +113 -0
- package/dist/check-plan.js +448 -0
- package/dist/check-plan.js.map +1 -0
- package/dist/check-suite.d.ts +171 -0
- package/dist/check-suite.js +515 -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 +102 -0
- package/dist/cli-output.js +516 -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 +330 -0
- package/dist/cli-shared.js +492 -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 +502 -0
- package/dist/defect-evidence.js.map +1 -0
- package/dist/demo-aspect-api.d.ts +209 -0
- package/dist/demo-aspect-api.js +397 -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 +241 -0
- package/dist/demo-aspect-cli.js.map +1 -0
- package/dist/demo-capture.d.ts +108 -0
- package/dist/demo-capture.js +438 -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 +137 -0
- package/dist/explore-adversarial.js +218 -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 +963 -0
- package/dist/explore-cli.js.map +1 -0
- package/dist/explore-coverage.d.ts +158 -0
- package/dist/explore-coverage.js +240 -0
- package/dist/explore-coverage.js.map +1 -0
- package/dist/explore-feature.d.ts +127 -0
- package/dist/explore-feature.js +220 -0
- package/dist/explore-feature.js.map +1 -0
- package/dist/explore-goal.d.ts +253 -0
- package/dist/explore-goal.js +374 -0
- package/dist/explore-goal.js.map +1 -0
- package/dist/explore-shared.d.ts +152 -0
- package/dist/explore-shared.js +129 -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 +52 -0
- package/dist/fixture-auth.js +82 -0
- package/dist/fixture-auth.js.map +1 -0
- package/dist/fixture-cli.d.ts +70 -0
- package/dist/fixture-cli.js +178 -0
- package/dist/fixture-cli.js.map +1 -0
- package/dist/github-issue-filer.d.ts +62 -0
- package/dist/github-issue-filer.js +188 -0
- package/dist/github-issue-filer.js.map +1 -0
- package/dist/host-health-run.d.ts +24 -0
- package/dist/host-health-run.js +27 -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 +127 -0
- package/dist/init-cli.js.map +1 -0
- package/dist/init-keys.d.ts +19 -2
- package/dist/init-keys.js +15 -4
- 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 +256 -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 +179 -0
- package/dist/journey-annotate-cli.js.map +1 -0
- package/dist/journey-api.d.ts +79 -2
- package/dist/journey-api.js +136 -19
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +4 -0
- package/dist/journey-cli.js +370 -0
- package/dist/journey-cli.js.map +1 -0
- package/dist/journey-demo-api.d.ts +112 -0
- package/dist/journey-demo-api.js +392 -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 +155 -0
- package/dist/journey-demo-cli.js.map +1 -0
- package/dist/kill-signal.d.ts +193 -0
- package/dist/kill-signal.js +284 -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 +237 -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 +147 -0
- package/dist/log-correlation.js +325 -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 +235 -0
- package/dist/log-sources.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 +84 -0
- package/dist/logs-retention.js.map +1 -0
- package/dist/mcp-api.d.ts +89 -1
- package/dist/mcp-api.js +472 -18
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +38 -0
- package/dist/mcp-args.js +131 -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 +125 -0
- package/dist/mcp-cli-tools.js +680 -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 +58 -2
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.d.ts +4 -0
- package/dist/mission-cli.js +247 -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 +225 -0
- package/dist/mission-fixtures.js +828 -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 +397 -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 +110 -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 +63 -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 +119 -1921
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +96 -0
- package/dist/project-dir.js +220 -0
- package/dist/project-dir.js.map +1 -0
- package/dist/record-api.d.ts +10 -6
- package/dist/record-api.js +39 -28
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.d.ts +4 -0
- package/dist/record-cli.js +64 -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 +101 -0
- package/dist/regression-api.js +384 -5
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.d.ts +4 -0
- package/dist/regression-cli.js +232 -0
- package/dist/regression-cli.js.map +1 -0
- package/dist/report-api.d.ts +146 -0
- package/dist/report-api.js +430 -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/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-screenshots.d.ts +123 -0
- package/dist/run-screenshots.js +229 -0
- package/dist/run-screenshots.js.map +1 -0
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.js +22 -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 +34 -0
- package/dist/server-log-verify.js +115 -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 +58 -0
- package/dist/site-gate-cli.js.map +1 -0
- package/dist/source-api.js +18 -3
- 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 +289 -0
- package/dist/suite-explore-options.js +140 -0
- package/dist/suite-explore-options.js.map +1 -0
- package/dist/target-config.d.ts +109 -0
- package/dist/target-config.js +216 -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/ui-api.d.ts +3 -0
- package/dist/ui-api.js +7 -1
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.d.ts +43 -0
- package/dist/usability-capture.js +326 -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-cli.d.ts +4 -0
- package/dist/ux-cli.js +102 -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-review.d.ts +112 -0
- package/dist/ux-review.js +151 -0
- package/dist/ux-review.js.map +1 -0
- package/dist/ux-usability.d.ts +238 -0
- package/dist/ux-usability.js +494 -0
- package/dist/ux-usability.js.map +1 -0
- package/dist/verify-fix-api.d.ts +173 -0
- package/dist/verify-fix-api.js +454 -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 +110 -0
- package/dist/verify-fix-cli.js.map +1 -0
- package/package.json +19 -14
- package/skills/jevitate-ci-check/SKILL.md +77 -0
- package/skills/jevitate-demo/SKILL.md +61 -0
- package/skills/jevitate-explore/SKILL.md +88 -87
- package/skills/jevitate-getting-started/SKILL.md +88 -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-ux-review/SKILL.md +106 -16
- package/skills/jevitate-verify-fix/SKILL.md +76 -0
package/dist/journey-api.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
import { type Journey } from "@jevitate/journey";
|
|
1
2
|
import { type RunPolicy } from "@jevitate/domain";
|
|
2
|
-
import { type
|
|
3
|
+
import { type BrowserPort, type EmulationSpec } from "@jevitate/playwright";
|
|
4
|
+
import { type BrowserRunOptions } from "./browser-run-options.js";
|
|
5
|
+
import { RecordingInterpreter, type StepObserver } from "@jevitate/interpreter";
|
|
6
|
+
import { SecretPixelMask } from "./demo-capture.js";
|
|
7
|
+
import { type ScreenshotsResult, type ScreenshotsSpec } from "./run-screenshots.js";
|
|
8
|
+
import { type JourneyRunResult, type SelfHealer, type SiteGateDeps } from "@jevitate/runtime";
|
|
9
|
+
import { type FixtureRecord, type MissionFixtures } from "./mission-fixtures.js";
|
|
10
|
+
import { type ResolvedJourneyEnvironment } from "./environments.js";
|
|
3
11
|
/**
|
|
4
12
|
* Distinct from `@jevitate/journey`'s `ParamValidationError` so CLI/API callers
|
|
5
13
|
* can tell "no such journey" apart from "params didn't match the journey's
|
|
@@ -7,6 +15,13 @@ import { type JourneyRunResult, type SelfHealer } from "@jevitate/runtime";
|
|
|
7
15
|
*/
|
|
8
16
|
export declare class UnknownJourneyError extends Error {
|
|
9
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A Journey declares `metadata.requiresAuth: true` (#118) but the run was given no
|
|
20
|
+
* `storageState` — refused BEFORE any browser launches, with a message that names the
|
|
21
|
+
* actual problem instead of a confusing `replay-target-not-found` deep into the steps.
|
|
22
|
+
*/
|
|
23
|
+
export declare class JourneyRequiresAuthError extends Error {
|
|
24
|
+
}
|
|
10
25
|
export interface RunJourneyProgrammaticallyOptions {
|
|
11
26
|
/** Directory a `FsJourneyStore` reads Journey JSON files from. */
|
|
12
27
|
dir: string;
|
|
@@ -24,7 +39,66 @@ export interface RunJourneyProgrammaticallyOptions {
|
|
|
24
39
|
* this port (enforced by `JourneyRunner`'s write floor).
|
|
25
40
|
*/
|
|
26
41
|
selfHealer?: SelfHealer;
|
|
42
|
+
/**
|
|
43
|
+
* Mission fixtures (#140/#144), built for the journey's own site once it is known: set up before
|
|
44
|
+
* the browser opens (a failure throws `FixtureSetupError` — the journey never runs on unknown
|
|
45
|
+
* state), `${setup.<name>}` in params bound to its outputs, and restored after the run.
|
|
46
|
+
*/
|
|
47
|
+
fixtures?: (site: string) => MissionFixtures | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* Playwright storageState JSON to seed the session from (CLI/MCP `--storage-state`, #118) —
|
|
50
|
+
* the deterministic authenticated pre-step a Journey authored behind a login needs to
|
|
51
|
+
* replay. Contains live session cookies: handed only to the browser, never logged, never
|
|
52
|
+
* returned in the result, and never sent to a model.
|
|
53
|
+
*/
|
|
54
|
+
storageState?: string;
|
|
55
|
+
/** Testing seam — defaults to a real `PlaywrightBrowserPort`. */
|
|
56
|
+
browserPortFactory?: () => BrowserPort;
|
|
57
|
+
/** How Chromium is launched (executable/channel/extra args) and shown (#245 demo mode). Default: pinned Chromium, headless. */
|
|
58
|
+
browser?: BrowserRunOptions;
|
|
59
|
+
/** Per-mission viewport/device emulation (#149, CLI `--viewport <W>x<H>` / `--device "<name>"`). */
|
|
60
|
+
emulation?: EmulationSpec;
|
|
61
|
+
/**
|
|
62
|
+
* The site-policy gate's repositories (`jevitate site policy set`): pacing, throttles, budgets and
|
|
63
|
+
* quiet hours for the Journey's origin. Absent (no policy database) means no site policy applies.
|
|
64
|
+
*/
|
|
65
|
+
siteGate?: SiteGateDeps;
|
|
66
|
+
/** The site-policy account (default `primary`, as `jevitate site policy` uses). */
|
|
67
|
+
account?: string;
|
|
68
|
+
/**
|
|
69
|
+
* #246 seam: the interpreter the run replays with — `journey annotate` passes one carrying a
|
|
70
|
+
* `StepObserver` (before/after page evidence). Default: a plain `RecordingInterpreter`.
|
|
71
|
+
*/
|
|
72
|
+
interpreter?: RecordingInterpreter;
|
|
73
|
+
/**
|
|
74
|
+
* The environment to run against (#247, `--env`/`--base-url`, from `resolveJourneyEnvironment`):
|
|
75
|
+
* the Journey's recorded same-origin URLs move onto its `baseUrl` and the run's allowlist is its
|
|
76
|
+
* `allowedOrigins`; a step on any other origin is refused before any fixture or browser.
|
|
77
|
+
* Absent: the Journey's recorded site, exactly as before.
|
|
78
|
+
*/
|
|
79
|
+
environment?: ResolvedJourneyEnvironment;
|
|
80
|
+
/**
|
|
81
|
+
* #251 `--screenshots`: one masked screenshot per distinct screen (or per step) + `index.md`;
|
|
82
|
+
* the paths come back as `screenshotPaths`. Absent: none.
|
|
83
|
+
*/
|
|
84
|
+
screenshots?: ScreenshotsSpec;
|
|
85
|
+
/** #251 seam: a per-step observer composed into the default interpreter (annotate, demo). Ignored with `interpreter`. */
|
|
86
|
+
observer?: StepObserver;
|
|
87
|
+
/**
|
|
88
|
+
* #250/#251: the run's pixel mask (default: one over the Journey's secret parameters) — installed
|
|
89
|
+
* on the session before its first navigation whenever it records video or screenshots.
|
|
90
|
+
*/
|
|
91
|
+
mask?: SecretPixelMask;
|
|
27
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Promotes a local Journey (#124, mirrors `promoteMissionTarget` in
|
|
95
|
+
* `mission-api.ts`) so it becomes discoverable via `journey find`/MCP
|
|
96
|
+
* `find_capabilities` and runnable via `run_journey` — a human-approval gate,
|
|
97
|
+
* same as `mission target promote`. An unknown id is refused with
|
|
98
|
+
* `UnknownJourneyError` (never silently created). Returns the persisted,
|
|
99
|
+
* now-promoted Journey.
|
|
100
|
+
*/
|
|
101
|
+
export declare function promoteJourney(dir: string, id: string): Promise<Journey>;
|
|
28
102
|
/**
|
|
29
103
|
* The one programmatic surface for "run this published Journey by id" —
|
|
30
104
|
* used by BOTH the CLI `journey run` action and external callers. Builds
|
|
@@ -34,4 +108,7 @@ export interface RunJourneyProgrammaticallyOptions {
|
|
|
34
108
|
* `ParamValidationError`, from `@jevitate/journey`) BEFORE any browser is
|
|
35
109
|
* launched, then builds the real Actor + `JourneyRunner` and runs.
|
|
36
110
|
*/
|
|
37
|
-
export declare function runJourneyProgrammatically(opts: RunJourneyProgrammaticallyOptions): Promise<JourneyRunResult
|
|
111
|
+
export declare function runJourneyProgrammatically(opts: RunJourneyProgrammaticallyOptions): Promise<JourneyRunResult & {
|
|
112
|
+
fixtures?: FixtureRecord;
|
|
113
|
+
videoPaths?: string[];
|
|
114
|
+
} & Partial<ScreenshotsResult>>;
|
package/dist/journey-api.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { join } from "node:path";
|
|
4
|
-
import { FsJourneyStore, JourneyRegistry, deriveParamSchema, validateParams } from "@jevitate/journey";
|
|
1
|
+
import { FsJourneyStore, JourneyRegistry, deriveParamSchema, describeStep, flatJourneySteps, secretParamValues, validateParams } from "@jevitate/journey";
|
|
2
|
+
import { redactText } from "@jevitate/ai-core";
|
|
5
3
|
import { safeRunPolicy } from "@jevitate/domain";
|
|
4
|
+
import { join } from "node:path";
|
|
6
5
|
import { PlaywrightBrowserPort } from "@jevitate/playwright";
|
|
6
|
+
import { closeOnce, finalizeVideos, runVideoDir, sessionLaunchOptions } from "./browser-run-options.js";
|
|
7
|
+
import { artifactStamp } from "./mission-journal.js";
|
|
8
|
+
import { logsDirFor } from "./project-dir.js";
|
|
7
9
|
import { CastActor, BrowseTheWeb } from "@jevitate/screenplay";
|
|
8
10
|
import { RecordingInterpreter } from "@jevitate/interpreter";
|
|
11
|
+
import { BrowseTheWebToken } from "@jevitate/screenplay";
|
|
12
|
+
import { SecretPixelMask, maskingPort } from "./demo-capture.js";
|
|
13
|
+
import { RunScreenshots, composeObservers, screenshotObserver, screenshotsDirFor } from "./run-screenshots.js";
|
|
9
14
|
import { JourneyRunner } from "@jevitate/runtime";
|
|
15
|
+
import { gateJourney } from "./site-gate-cli.js";
|
|
16
|
+
import { substituteSetupRefs } from "./mission-fixtures.js";
|
|
17
|
+
import { applyJourneyEnvironment } from "./environments.js";
|
|
10
18
|
/**
|
|
11
19
|
* Distinct from `@jevitate/journey`'s `ParamValidationError` so CLI/API callers
|
|
12
20
|
* can tell "no such journey" apart from "params didn't match the journey's
|
|
@@ -14,6 +22,49 @@ import { JourneyRunner } from "@jevitate/runtime";
|
|
|
14
22
|
*/
|
|
15
23
|
export class UnknownJourneyError extends Error {
|
|
16
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* A Journey declares `metadata.requiresAuth: true` (#118) but the run was given no
|
|
27
|
+
* `storageState` — refused BEFORE any browser launches, with a message that names the
|
|
28
|
+
* actual problem instead of a confusing `replay-target-not-found` deep into the steps.
|
|
29
|
+
*/
|
|
30
|
+
export class JourneyRequiresAuthError extends Error {
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* #246: a secret parameter's value (declared `secret: true`, or a credential-like name) never comes
|
|
34
|
+
* back in a run's output — the interpreter's vars start as the params, so the value is masked there.
|
|
35
|
+
*/
|
|
36
|
+
function redactSecretParams(result, journey, params) {
|
|
37
|
+
const secrets = secretParamValues(journey, params);
|
|
38
|
+
if (secrets.length === 0)
|
|
39
|
+
return result;
|
|
40
|
+
const scrub = (v) => typeof v === "string"
|
|
41
|
+
? redactText(v, secrets)
|
|
42
|
+
: Array.isArray(v)
|
|
43
|
+
? v.map(scrub)
|
|
44
|
+
: v !== null && typeof v === "object"
|
|
45
|
+
? Object.fromEntries(Object.entries(v).map(([k, x]) => [k, scrub(x)]))
|
|
46
|
+
: v;
|
|
47
|
+
return scrub(result);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Promotes a local Journey (#124, mirrors `promoteMissionTarget` in
|
|
51
|
+
* `mission-api.ts`) so it becomes discoverable via `journey find`/MCP
|
|
52
|
+
* `find_capabilities` and runnable via `run_journey` — a human-approval gate,
|
|
53
|
+
* same as `mission target promote`. An unknown id is refused with
|
|
54
|
+
* `UnknownJourneyError` (never silently created). Returns the persisted,
|
|
55
|
+
* now-promoted Journey.
|
|
56
|
+
*/
|
|
57
|
+
export async function promoteJourney(dir, id) {
|
|
58
|
+
const store = new FsJourneyStore(dir);
|
|
59
|
+
const registry = new JourneyRegistry(store);
|
|
60
|
+
const existing = await registry.get(id);
|
|
61
|
+
if (!existing) {
|
|
62
|
+
throw new UnknownJourneyError(`unknown journey '${id}'`);
|
|
63
|
+
}
|
|
64
|
+
await registry.promote(id);
|
|
65
|
+
const promoted = await registry.get(id);
|
|
66
|
+
return promoted ?? { ...existing, metadata: { ...existing.metadata, promoted: true } };
|
|
67
|
+
}
|
|
17
68
|
/**
|
|
18
69
|
* The one programmatic surface for "run this published Journey by id" —
|
|
19
70
|
* used by BOTH the CLI `journey run` action and external callers. Builds
|
|
@@ -26,30 +77,96 @@ export class UnknownJourneyError extends Error {
|
|
|
26
77
|
export async function runJourneyProgrammatically(opts) {
|
|
27
78
|
const store = new FsJourneyStore(opts.dir);
|
|
28
79
|
const registry = new JourneyRegistry(store);
|
|
29
|
-
const
|
|
30
|
-
if (!
|
|
80
|
+
const stored = await registry.get(opts.id);
|
|
81
|
+
if (!stored) {
|
|
31
82
|
throw new UnknownJourneyError(`unknown journey '${opts.id}'`);
|
|
32
83
|
}
|
|
84
|
+
// #247: onto the chosen environment (a step on an origin it does not allow is refused here).
|
|
85
|
+
const journey = applyJourneyEnvironment(stored, opts.environment);
|
|
86
|
+
const allowedOrigins = opts.environment === undefined ? [journey.recording.site] : [...opts.environment.allowedOrigins];
|
|
87
|
+
// #118: a Journey that declares it needs auth refuses BEFORE any browser launch when no
|
|
88
|
+
// storageState was given — a clear, typed failure instead of a deep `replay-target-not-found`.
|
|
89
|
+
if (journey.metadata.requiresAuth === true && opts.storageState === undefined) {
|
|
90
|
+
throw new JourneyRequiresAuthError(`journey '${opts.id}' requires auth (metadata.requiresAuth) — run with --storage-state <file>`);
|
|
91
|
+
}
|
|
33
92
|
// Fail fast: validate BEFORE any browser launch, so bad params never pay
|
|
34
93
|
// the cost (or risk) of opening a browser.
|
|
35
94
|
validateParams(deriveParamSchema(journey.recording), opts.params);
|
|
36
95
|
const policy = opts.policy ?? safeRunPolicy();
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
allowedOrigins: [journey.recording.site],
|
|
43
|
-
baseUrl: journey.recording.site,
|
|
44
|
-
});
|
|
96
|
+
// The site policy (`jevitate site policy set <origin>`): pacing, throttles, budgets, quiet hours —
|
|
97
|
+
// decided before any fixture or browser; a refusal says why and when to retry.
|
|
98
|
+
const gate = await gateJourney(opts.siteGate, journey.recording, { ...(opts.account === undefined ? {} : { account: opts.account }), enforceLimits: true });
|
|
99
|
+
const fx = opts.fixtures?.(journey.recording.site);
|
|
100
|
+
let params = opts.params;
|
|
45
101
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
102
|
+
if (fx !== undefined) {
|
|
103
|
+
await fx.setup();
|
|
104
|
+
const b = fx.bindings();
|
|
105
|
+
params = Object.fromEntries(Object.entries(opts.params).map(([k, v]) => [k, substituteSetupRefs(v, b, { where: `--param ${k}` })]));
|
|
106
|
+
}
|
|
107
|
+
// #140 order: fixture setup (above) → open the browser (#137 launch options, #118 storageState) → run → restore.
|
|
108
|
+
// #250/#251: a recorded or screenshotted run carries the live pixel mask from its first paint.
|
|
109
|
+
const secrets = secretParamValues(journey, params);
|
|
110
|
+
const mask = opts.mask ?? new SecretPixelMask(secrets);
|
|
111
|
+
const capturing = opts.browser?.recordVideo !== undefined || opts.screenshots !== undefined;
|
|
112
|
+
const rawPort = (opts.browserPortFactory ?? (() => new PlaywrightBrowserPort()))();
|
|
113
|
+
const port = capturing ? maskingPort(rawPort, mask) : rawPort;
|
|
114
|
+
const artifactName = `journey-${opts.id.replace(/[^A-Za-z0-9._-]/g, "_")}-${artifactStamp(new Date().toISOString())}.json`;
|
|
115
|
+
// #245: `--record-video` → `journey-<id>-<stamp>.videos/` under the given dir, else the logs dir.
|
|
116
|
+
const videoDir = opts.browser?.recordVideo === undefined
|
|
117
|
+
? undefined
|
|
118
|
+
: runVideoDir(opts.browser, join(opts.browser.recordVideo.dir ?? logsDirFor(), artifactName));
|
|
119
|
+
const flat = flatJourneySteps(journey);
|
|
120
|
+
const shots = opts.screenshots === undefined
|
|
121
|
+
? undefined
|
|
122
|
+
: new RunScreenshots({
|
|
123
|
+
spec: opts.screenshots,
|
|
124
|
+
dir: screenshotsDirFor(opts.screenshots, join(logsDirFor(), artifactName)),
|
|
125
|
+
secrets,
|
|
126
|
+
title: `journey ${journey.metadata.name}`,
|
|
127
|
+
mask,
|
|
128
|
+
});
|
|
129
|
+
const whatOf = (i) => {
|
|
130
|
+
const s = flat[i];
|
|
131
|
+
if (s === undefined)
|
|
132
|
+
return `step ${i + 1}`;
|
|
133
|
+
const pick = [s.recorded.objective, s.recorded.step.label].map((t) => (t ?? "").trim()).find((t) => t !== "");
|
|
134
|
+
return pick ?? describeStep(s.recorded.step);
|
|
135
|
+
};
|
|
136
|
+
const session = await port.open({
|
|
137
|
+
...sessionLaunchOptions(opts.browser, videoDir),
|
|
138
|
+
allowedOrigins,
|
|
139
|
+
baseUrl: journey.recording.site,
|
|
140
|
+
...opts.emulation,
|
|
141
|
+
...(opts.storageState !== undefined ? { storageState: opts.storageState } : {}),
|
|
142
|
+
});
|
|
143
|
+
const closeSession = closeOnce(() => session.close());
|
|
144
|
+
try {
|
|
145
|
+
const actor = CastActor.named("cli-runner").whoCan(new BrowseTheWeb(session, allowedOrigins), ...gate.abilities);
|
|
146
|
+
const observer = composeObservers(opts.observer, shots === undefined ? undefined : screenshotObserver(shots, (a) => a.ability(BrowseTheWebToken).session.page, whatOf));
|
|
147
|
+
const interpreter = opts.interpreter ?? (opts.observer === undefined && shots === undefined ? new RecordingInterpreter() : new RecordingInterpreter({ observer }));
|
|
148
|
+
const runner = new JourneyRunner(actor, interpreter, undefined, undefined, opts.selfHealer);
|
|
149
|
+
let result;
|
|
150
|
+
try {
|
|
151
|
+
result = redactSecretParams(await runner.run({ journey, params, policy }), journey, params);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
await gate.done();
|
|
155
|
+
}
|
|
156
|
+
const shotFields = shots === undefined ? {} : await shots.finish();
|
|
157
|
+
// #245: the context closed (its video finalized) before the result naming it is returned.
|
|
158
|
+
const videos = await finalizeVideos(videoDir, closeSession);
|
|
159
|
+
if (fx === undefined)
|
|
160
|
+
return { ...result, ...videos, ...shotFields };
|
|
161
|
+
await fx.restore();
|
|
162
|
+
return { ...result, ...videos, ...shotFields, fixtures: fx.record() };
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
await closeSession();
|
|
166
|
+
}
|
|
49
167
|
}
|
|
50
168
|
finally {
|
|
51
|
-
await
|
|
52
|
-
await rm(profileDir, { recursive: true, force: true });
|
|
169
|
+
await fx?.restore();
|
|
53
170
|
}
|
|
54
171
|
}
|
|
55
172
|
//# sourceMappingURL=journey-api.js.map
|
package/dist/journey-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey-api.js","sourceRoot":"","sources":["../src/journey-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"journey-api.js","sourceRoot":"","sources":["../src/journey-api.ts"],"names":[],"mappings":"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"}
|