@jevitate/cli 0.5.0 → 0.7.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/dist/author-journey-cli.d.ts +2 -0
- package/dist/author-journey-cli.js +93 -15
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +4249 -1396
- package/dist/build-info.generated.js +2 -2
- package/dist/cli-output.js +4 -0
- package/dist/cli-output.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +6 -5
- package/dist/demo-aspect-api.js +7 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/environments.js +6 -1
- package/dist/environments.js.map +1 -1
- package/dist/explore-adversarial.js +1 -1
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-author.d.ts +21 -3
- package/dist/explore-author.js +64 -32
- package/dist/explore-author.js.map +1 -1
- package/dist/explore-cli.js +73 -92
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.js +1 -1
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-goal.js +9 -4
- package/dist/explore-goal.js.map +1 -1
- package/dist/goal-run-flags.d.ts +120 -0
- package/dist/goal-run-flags.js +220 -0
- package/dist/goal-run-flags.js.map +1 -0
- package/dist/journey-api.d.ts +72 -5
- package/dist/journey-api.js +125 -14
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +168 -5
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +7 -1
- package/dist/journey-demo-api.js +8 -3
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-demo-cli.js +3 -0
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-lint-sarif.d.ts +19 -0
- package/dist/journey-lint-sarif.js +48 -0
- package/dist/journey-lint-sarif.js.map +1 -0
- package/dist/journey-network-checks.d.ts +45 -9
- package/dist/journey-network-checks.js +117 -30
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.d.ts +24 -15
- package/dist/journey-prefix.js +53 -7
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-verify.d.ts +61 -0
- package/dist/journey-verify.js +131 -0
- package/dist/journey-verify.js.map +1 -0
- package/dist/load-api.js +9 -3
- package/dist/load-api.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +1 -0
- package/dist/mcp-cli-tools.js +61 -3
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/promotions.d.ts +15 -0
- package/dist/promotions.js +52 -0
- package/dist/promotions.js.map +1 -0
- package/dist/self-heal-adapter.js +3 -1
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/signal-triage.js +5 -1
- package/dist/signal-triage.js.map +1 -1
- package/dist/source-run-api.js +17 -7
- package/dist/source-run-api.js.map +1 -1
- package/dist/usability-capture.js +11 -1
- package/dist/usability-capture.js.map +1 -1
- package/dist/ux-usability.js +1 -1
- package/dist/ux-usability.js.map +1 -1
- package/package.json +10 -10
- package/skills/jevitate-explore/SKILL.md +11 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { JourneyLintFinding } from "@jevitate/journey";
|
|
2
|
+
/**
|
|
3
|
+
* #401: SARIF 2.1.0 for `journey lint`, so CI can gate on assertion strength the same way it does
|
|
4
|
+
* on `jevitate check` findings. One tool driver (`jevitate-journey-lint`) lists every rule; one
|
|
5
|
+
* result per finding carries its level and message, located at the journey id and (when present)
|
|
6
|
+
* `step N` as logical locations.
|
|
7
|
+
*/
|
|
8
|
+
export declare const JOURNEY_LINT_SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json";
|
|
9
|
+
export interface JourneyLintSarifLog {
|
|
10
|
+
readonly $schema: string;
|
|
11
|
+
readonly version: "2.1.0";
|
|
12
|
+
readonly runs: readonly unknown[];
|
|
13
|
+
}
|
|
14
|
+
export interface JourneyLintSarifInput {
|
|
15
|
+
readonly id: string;
|
|
16
|
+
readonly findings: readonly JourneyLintFinding[];
|
|
17
|
+
readonly version: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function renderJourneyLintSarif(input: JourneyLintSarifInput): JourneyLintSarifLog;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #401: SARIF 2.1.0 for `journey lint`, so CI can gate on assertion strength the same way it does
|
|
3
|
+
* on `jevitate check` findings. One tool driver (`jevitate-journey-lint`) lists every rule; one
|
|
4
|
+
* result per finding carries its level and message, located at the journey id and (when present)
|
|
5
|
+
* `step N` as logical locations.
|
|
6
|
+
*/
|
|
7
|
+
export const JOURNEY_LINT_SARIF_SCHEMA = "https://json.schemastore.org/sarif-2.1.0.json";
|
|
8
|
+
/** #401: every rule the lint can report, with the severity it reports it at. */
|
|
9
|
+
const RULES = [
|
|
10
|
+
{ id: "own-target-visible", level: "error" },
|
|
11
|
+
{ id: "write-without-effect", level: "error" },
|
|
12
|
+
{ id: "visibility-only", level: "error" },
|
|
13
|
+
{ id: "nothing-after-last-write", level: "error" },
|
|
14
|
+
{ id: "no-persistence-check", level: "warning" },
|
|
15
|
+
{ id: "intent-uncovered", level: "warning" },
|
|
16
|
+
];
|
|
17
|
+
export function renderJourneyLintSarif(input) {
|
|
18
|
+
const rules = RULES.map((rule) => ({
|
|
19
|
+
id: rule.id,
|
|
20
|
+
name: rule.id,
|
|
21
|
+
shortDescription: { text: rule.id },
|
|
22
|
+
defaultConfiguration: { level: rule.level },
|
|
23
|
+
}));
|
|
24
|
+
const results = input.findings.map((finding) => ({
|
|
25
|
+
ruleId: finding.rule,
|
|
26
|
+
level: finding.level,
|
|
27
|
+
message: { text: finding.message },
|
|
28
|
+
locations: [
|
|
29
|
+
{
|
|
30
|
+
logicalLocations: [
|
|
31
|
+
{ name: input.id, kind: "module" },
|
|
32
|
+
...(finding.step === undefined ? [] : [{ name: `step ${finding.step}`, kind: "function" }]),
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
}));
|
|
37
|
+
return {
|
|
38
|
+
$schema: JOURNEY_LINT_SARIF_SCHEMA,
|
|
39
|
+
version: "2.1.0",
|
|
40
|
+
runs: [
|
|
41
|
+
{
|
|
42
|
+
tool: { driver: { name: "jevitate-journey-lint", version: input.version, rules } },
|
|
43
|
+
results,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=journey-lint-sarif.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-lint-sarif.js","sourceRoot":"","sources":["../src/journey-lint-sarif.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG,+CAA+C,CAAC;AAEzF,gFAAgF;AAChF,MAAM,KAAK,GAAuE;IAChF,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC5C,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC9C,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;IACzC,EAAE,EAAE,EAAE,0BAA0B,EAAE,KAAK,EAAE,OAAO,EAAE;IAClD,EAAE,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,SAAS,EAAE;IAChD,EAAE,EAAE,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE;CAC7C,CAAC;AAcF,MAAM,UAAU,sBAAsB,CAAC,KAA4B;IACjE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjC,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,IAAI,EAAE,IAAI,CAAC,EAAE;QACb,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QACnC,oBAAoB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;KAC5C,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE;QAClC,SAAS,EAAE;YACT;gBACE,gBAAgB,EAAE;oBAChB,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAClC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;iBAC5F;aACF;SACF;KACF,CAAC,CAAC,CAAC;IACJ,OAAO;QACL,OAAO,EAAE,yBAAyB;QAClC,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;gBAClF,OAAO;aACR;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,15 +1,51 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* A Journey's outcome checks, judged over its replay (#322, #400): the end state
|
|
3
|
+
* (`metadata.endState`, plus an older Journey's `metadata.networkChecks`) after the last step, and
|
|
4
|
+
* each step's `expectRequests` over the requests sent from the moment that step began. The SAME
|
|
5
|
+
* evaluator a live goal mission's verdict uses (`evaluateOutcomeChecks`: page checks on the final
|
|
6
|
+
* page, one reload for the `reloadThen` checks, network checks over the page-monitor capture). A
|
|
7
|
+
* replay whose steps all passed but whose outcome is absent is a failed run, never `ok`.
|
|
7
8
|
*/
|
|
8
9
|
import type { Page } from "playwright";
|
|
9
|
-
import type
|
|
10
|
+
import { type Journey } from "@jevitate/journey";
|
|
10
11
|
import type { JourneyRunResult } from "@jevitate/runtime";
|
|
12
|
+
import type { Actor } from "@jevitate/screenplay";
|
|
13
|
+
import { type StepObserver } from "@jevitate/interpreter";
|
|
11
14
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
15
|
+
* #402: one failed assertion site from the last `run`, as structured data. The same sites the joined
|
|
16
|
+
* `reason` string names, so a mutation proof can see WHICH expectation a mutation broke.
|
|
17
|
+
*
|
|
18
|
+
* `step` is 1-based (`s.index + 1`); `checkIndex` is the check's position in that step's
|
|
19
|
+
* `expectRequests`. `index` is the position in the end-state list the class was constructed with —
|
|
20
|
+
* `journeyEndState(journey)` order: `metadata.endState` first, then a legacy `metadata.networkChecks`.
|
|
14
21
|
*/
|
|
15
|
-
export
|
|
22
|
+
export type OutcomeCheckFailure = {
|
|
23
|
+
readonly where: "step-request";
|
|
24
|
+
readonly step: number;
|
|
25
|
+
readonly checkIndex: number;
|
|
26
|
+
readonly detail: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly where: "end-state";
|
|
29
|
+
readonly index: number;
|
|
30
|
+
readonly detail: string;
|
|
31
|
+
} | {
|
|
32
|
+
readonly where: "unevaluable";
|
|
33
|
+
readonly detail: string;
|
|
34
|
+
};
|
|
35
|
+
export declare class JourneyOutcomeChecks {
|
|
36
|
+
#private;
|
|
37
|
+
/** `journey` undefined (an anchored prefix run): nothing is judged. */
|
|
38
|
+
constructor(page: Page, journey: Journey | undefined, opts?: {
|
|
39
|
+
readonly secrets?: readonly string[];
|
|
40
|
+
});
|
|
41
|
+
get active(): boolean;
|
|
42
|
+
/** #402: the failed assertion sites of the last `run` (empty when every check held, or none ran). */
|
|
43
|
+
get lastFailures(): readonly OutcomeCheckFailure[];
|
|
44
|
+
/** Starts a step's request window as it begins (never changes the replay). */
|
|
45
|
+
observer(): StepObserver | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Runs `replay` with the page's requests captured, then judges the checks. A replay that already
|
|
48
|
+
* failed keeps its own reason. Without checks it just runs `replay`.
|
|
49
|
+
*/
|
|
50
|
+
run(actor: Actor, replay: () => Promise<JourneyRunResult>): Promise<JourneyRunResult>;
|
|
51
|
+
}
|
|
@@ -1,36 +1,123 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { journeyEndState } from "@jevitate/journey";
|
|
2
|
+
import { installFlashRecorder } from "@jevitate/interpreter";
|
|
3
|
+
import { describeStep } from "@jevitate/journey";
|
|
4
|
+
import { clock } from "@jevitate/domain";
|
|
5
|
+
import { evaluateNetworkCheck, evaluateOutcomeChecks, monitorFor } from "@jevitate/explore";
|
|
2
6
|
/** How long the network may take to go idle after the last step before the checks read it. */
|
|
3
7
|
const SETTLE_CEILING_MS = 5_000;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
8
|
+
export class JourneyOutcomeChecks {
|
|
9
|
+
#page;
|
|
10
|
+
#end;
|
|
11
|
+
#steps;
|
|
12
|
+
#secrets;
|
|
13
|
+
#lastFailures = [];
|
|
14
|
+
/** `journey` undefined (an anchored prefix run): nothing is judged. */
|
|
15
|
+
constructor(page, journey, opts = {}) {
|
|
16
|
+
this.#page = page;
|
|
17
|
+
this.#secrets = opts.secrets ?? [];
|
|
18
|
+
this.#end = journey === undefined ? [] : journeyEndState(journey);
|
|
19
|
+
this.#steps = [];
|
|
20
|
+
let i = 0;
|
|
21
|
+
for (const p of journey?.recording.pages ?? []) {
|
|
22
|
+
for (const r of p.steps) {
|
|
23
|
+
if ((r.expectRequests ?? []).length > 0)
|
|
24
|
+
this.#steps.push({ index: i, label: describeStep(r.step), checks: r.expectRequests ?? [] });
|
|
25
|
+
i += 1;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
get active() {
|
|
30
|
+
return this.#end.length > 0 || this.#steps.length > 0;
|
|
31
|
+
}
|
|
32
|
+
/** #402: the failed assertion sites of the last `run` (empty when every check held, or none ran). */
|
|
33
|
+
get lastFailures() {
|
|
34
|
+
return this.#lastFailures;
|
|
22
35
|
}
|
|
23
|
-
|
|
24
|
-
|
|
36
|
+
/** Starts a step's request window as it begins (never changes the replay). */
|
|
37
|
+
observer() {
|
|
38
|
+
if (this.#steps.length === 0)
|
|
39
|
+
return undefined;
|
|
40
|
+
return {
|
|
41
|
+
beforeStep: async ({ index }) => {
|
|
42
|
+
const w = this.#steps.find((s) => s.index === index);
|
|
43
|
+
if (w === undefined || w.capture !== undefined)
|
|
44
|
+
return;
|
|
45
|
+
w.startedAt = clock.now();
|
|
46
|
+
w.capture = monitorFor(this.#page).startCapture();
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Runs `replay` with the page's requests captured, then judges the checks. A replay that already
|
|
52
|
+
* failed keeps its own reason. Without checks it just runs `replay`.
|
|
53
|
+
*/
|
|
54
|
+
async run(actor, replay) {
|
|
55
|
+
this.#lastFailures = [];
|
|
56
|
+
if (!this.active)
|
|
57
|
+
return replay();
|
|
58
|
+
const monitor = monitorFor(this.#page);
|
|
59
|
+
await monitor.instrument();
|
|
60
|
+
if (this.#end.some((c) => (c.kind === "page" || c.kind === "reloadThen") && c.assertion.kind === "flashed")) {
|
|
61
|
+
await installFlashRecorder(this.#page);
|
|
62
|
+
}
|
|
63
|
+
const capture = monitor.startCapture();
|
|
64
|
+
let result;
|
|
65
|
+
try {
|
|
66
|
+
result = await replay();
|
|
67
|
+
if (result.outcome === "quarantined")
|
|
68
|
+
return result;
|
|
69
|
+
// A step's postcondition can hold before the write it triggered finished: wait for the network
|
|
70
|
+
// to go idle (bounded) before reading what was sent.
|
|
71
|
+
await monitor.waitSettled({ ceilingMs: SETTLE_CEILING_MS }).catch(() => undefined);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
monitor.stopCapture(capture);
|
|
75
|
+
for (const s of this.#steps)
|
|
76
|
+
if (s.capture !== undefined)
|
|
77
|
+
monitor.stopCapture(s.capture);
|
|
78
|
+
}
|
|
79
|
+
// Step windows first (the end state's reload must not count as a step's request).
|
|
80
|
+
const stepFailureSites = [];
|
|
81
|
+
const stepFailureReasons = [];
|
|
82
|
+
for (const s of this.#steps) {
|
|
83
|
+
// No window (an interpreter that reported no step boundaries): judged over the whole replay.
|
|
84
|
+
const window = s.capture ?? capture;
|
|
85
|
+
// A request still in flight when the step began (the previous step's write) finishes inside
|
|
86
|
+
// this window: only requests SENT from the step's start count.
|
|
87
|
+
const since = s.startedAt;
|
|
88
|
+
const sent = window.sent().filter((r) => since === undefined || (r.startedAt !== undefined && r.startedAt >= since));
|
|
89
|
+
s.checks.forEach((c, checkIndex) => {
|
|
90
|
+
const r = evaluateNetworkCheck(c, sent, window.truncated);
|
|
91
|
+
if (r.passed)
|
|
92
|
+
return;
|
|
93
|
+
stepFailureSites.push({ where: "step-request", step: s.index + 1, checkIndex, detail: `${r.check} — ${r.detail}` });
|
|
94
|
+
stepFailureReasons.push(`step ${s.index + 1} (${s.label}): ${r.check} — ${r.detail}`);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
let end = [];
|
|
98
|
+
if (this.#end.length > 0) {
|
|
99
|
+
try {
|
|
100
|
+
end = await evaluateOutcomeChecks(this.#end, { actor, page: this.#page, capture, secrets: this.#secrets, settleMs: SETTLE_CEILING_MS });
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
// A check that cannot be evaluated (an unusable target) is never a pass.
|
|
104
|
+
const detail = `success checks could not be evaluated after the last step: ${e instanceof Error ? e.message : String(e)}`;
|
|
105
|
+
this.#lastFailures = [{ where: "unevaluable", detail }];
|
|
106
|
+
return { outcome: "quarantined", reason: detail };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// `evaluateOutcomeChecks` keeps the checks' order, which is `journeyEndState`: `endState` then
|
|
110
|
+
// legacy `networkChecks` — so an index here is that list's own position.
|
|
111
|
+
const endFailureSites = end.flatMap((r, index) => r.passed ? [] : [{ where: "end-state", index, detail: `${r.check} — ${r.detail}` }]);
|
|
112
|
+
this.#lastFailures = [...stepFailureSites, ...endFailureSites];
|
|
113
|
+
const endFailures = endFailureSites.map((f) => f.detail);
|
|
114
|
+
const reasons = [
|
|
115
|
+
...(stepFailureReasons.length === 0 ? [] : [`step request check${stepFailureReasons.length === 1 ? "" : "s"} not met: ${stepFailureReasons.join("; ")}`]),
|
|
116
|
+
...(endFailures.length === 0 ? [] : [`success check${endFailures.length === 1 ? "" : "s"} not met after the last step: ${endFailures.join("; ")}`]),
|
|
117
|
+
];
|
|
118
|
+
if (reasons.length === 0)
|
|
119
|
+
return result;
|
|
120
|
+
return { outcome: "quarantined", reason: reasons.join("; ") };
|
|
25
121
|
}
|
|
26
|
-
const failed = checks
|
|
27
|
-
.map((c) => evaluateNetworkCheck(c.kind === "requestMade" ? c : { ...c, status: { ...c.status } }, capture.sent(), capture.truncated))
|
|
28
|
-
.filter((r) => !r.passed);
|
|
29
|
-
if (failed.length === 0)
|
|
30
|
-
return result;
|
|
31
|
-
return {
|
|
32
|
-
outcome: "quarantined",
|
|
33
|
-
reason: `success check${failed.length === 1 ? "" : "s"} not met after the last step: ${failed.map((r) => `${r.check} — ${r.detail}`).join("; ")}`,
|
|
34
|
-
};
|
|
35
122
|
}
|
|
36
123
|
//# sourceMappingURL=journey-network-checks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey-network-checks.js","sourceRoot":"","sources":["../src/journey-network-checks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"journey-network-checks.js","sourceRoot":"","sources":["../src/journey-network-checks.ts"],"names":[],"mappings":"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"}
|
package/dist/journey-prefix.d.ts
CHANGED
|
@@ -4,20 +4,6 @@ import type { Recording } from "@jevitate/recording";
|
|
|
4
4
|
import type { BrowserSession } from "@jevitate/playwright";
|
|
5
5
|
import { type ResolvedJourneyEnvironment } from "./environments.js";
|
|
6
6
|
import type { BrowserRunOptions } from "./browser-run-options.js";
|
|
7
|
-
/**
|
|
8
|
-
* #293 — journey-anchored exploration: `jevitate explore --from-journey <id> --at-step <n|name>`.
|
|
9
|
-
*
|
|
10
|
-
* The mission's browser session opens as usual (its storage state, emulation, demo mode); then the
|
|
11
|
-
* promoted Journey's PREFIX — its first `step` top-level steps — is replayed INTO that session by the
|
|
12
|
-
* one Journey replay there is (`runJourneyProgrammatically`: fail-closed, never self-healing, the
|
|
13
|
-
* site policy and `--env` environment applied), and the mission starts on the live page it left:
|
|
14
|
-
* same page, form contents and session, no fresh navigation. A prefix that no longer replays ends
|
|
15
|
-
* the run with a typed `journey-stale` outcome (exit 2) — never a silent restart from a URL.
|
|
16
|
-
*
|
|
17
|
-
* Everything that can be refused is refused before any browser opens (`resolveJourneyPrefix`): an
|
|
18
|
-
* unknown or unpromoted Journey, a step or anchor it does not have, params that do not fit, a
|
|
19
|
-
* Journey that needs a session the run was not given.
|
|
20
|
-
*/
|
|
21
7
|
/** The strategies a mission can branch off a Journey with (`--feature` and multi-runs are refused). */
|
|
22
8
|
export { ANCHORED_STRATEGIES, type AnchoredStrategy } from "@jevitate/journey";
|
|
23
9
|
/** `--from-journey`/`--at-step` cannot be used as given (exit 64, nothing ran). */
|
|
@@ -33,10 +19,22 @@ export declare class JourneyPrefixStaleError extends Error {
|
|
|
33
19
|
readonly branch: JourneyBranchPoint;
|
|
34
20
|
/** The 1-based Journey step that failed, when the replay names it. */
|
|
35
21
|
readonly failedStep?: number | undefined;
|
|
22
|
+
/** #398: what the page showed when the prefix went stale (redacted); absent when it could not be read. */
|
|
23
|
+
readonly page?: {
|
|
24
|
+
readonly url: string;
|
|
25
|
+
readonly title: string;
|
|
26
|
+
readonly text: string;
|
|
27
|
+
} | undefined;
|
|
36
28
|
readonly code: "E_JOURNEY_STALE";
|
|
37
29
|
constructor(message: string, branch: JourneyBranchPoint,
|
|
38
30
|
/** The 1-based Journey step that failed, when the replay names it. */
|
|
39
|
-
failedStep?: number | undefined
|
|
31
|
+
failedStep?: number | undefined,
|
|
32
|
+
/** #398: what the page showed when the prefix went stale (redacted); absent when it could not be read. */
|
|
33
|
+
page?: {
|
|
34
|
+
readonly url: string;
|
|
35
|
+
readonly title: string;
|
|
36
|
+
readonly text: string;
|
|
37
|
+
} | undefined);
|
|
40
38
|
}
|
|
41
39
|
export interface JourneyPrefix {
|
|
42
40
|
readonly branch: JourneyBranchPoint;
|
|
@@ -110,7 +108,13 @@ export type RecordedBranch = JourneyBranchPoint & {
|
|
|
110
108
|
export declare function resolveJourneyPrefix(opts: ResolveJourneyPrefixOptions): Promise<JourneyPrefix>;
|
|
111
109
|
/** What an anchored run starts from: the live URL after the prefix, its branch point, and how it resets. */
|
|
112
110
|
export interface AnchoredStart {
|
|
111
|
+
/** The live URL to start from — for navigation and the mission engine (which redacts it) only. */
|
|
113
112
|
readonly url: string;
|
|
113
|
+
/**
|
|
114
|
+
* #399: `url` as it may be shown or persisted (`target.seedUrl`): credential-named query values and
|
|
115
|
+
* the prefix's secret params (e.g. a token its navigate URL carried) redacted. Never navigated to.
|
|
116
|
+
*/
|
|
117
|
+
readonly persistUrl: string;
|
|
114
118
|
readonly branch?: RecordedBranch;
|
|
115
119
|
/**
|
|
116
120
|
* #293: what a reset inside the mission uses instead of re-navigating to the anchor URL — the
|
|
@@ -145,6 +149,11 @@ export interface JourneyStaleResult {
|
|
|
145
149
|
readonly failure: {
|
|
146
150
|
readonly kind: "journey-stale";
|
|
147
151
|
readonly message: string;
|
|
152
|
+
readonly page?: {
|
|
153
|
+
readonly url: string;
|
|
154
|
+
readonly title: string;
|
|
155
|
+
readonly text: string;
|
|
156
|
+
};
|
|
148
157
|
};
|
|
149
158
|
readonly branch: JourneyBranchPoint;
|
|
150
159
|
/** The 1-based Journey step whose replay failed, when known. */
|
package/dist/journey-prefix.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { redactCredentialShapes, redactText, redactUrl } from "@jevitate/ai-core";
|
|
2
|
+
import { clock } from "@jevitate/domain";
|
|
1
3
|
import { FsJourneyStore, JourneyRegistry, JourneyStepError, deriveParamSchema, journeyBranchPoint, journeyPrefix, prefixLandingPath, resolveJourneyStep, secretParamNames, secretParamValues, validateParams, } from "@jevitate/journey";
|
|
2
4
|
import { resolve as resolvePath } from "node:path";
|
|
3
5
|
import { UnauthorizedExploreTargetError, assertAuthorizedExploreTarget } from "@jevitate/explore";
|
|
@@ -20,6 +22,44 @@ import { withSiteGate } from "./site-gate-cli.js";
|
|
|
20
22
|
* unknown or unpromoted Journey, a step or anchor it does not have, params that do not fit, a
|
|
21
23
|
* Journey that needs a session the run was not given.
|
|
22
24
|
*/
|
|
25
|
+
/** #398: how long reading a page's stale evidence may take before it is skipped (the page may be hung). */
|
|
26
|
+
const PAGE_EVIDENCE_TIMEOUT_MS = 2_000;
|
|
27
|
+
/** #398: visible text kept in the stale evidence (redacted first, then cut, so a cut never splits a secret). */
|
|
28
|
+
const PAGE_EVIDENCE_TEXT_MAX = 600;
|
|
29
|
+
/** A promise's value, or `undefined` when `ms` (on the clock) passes first — never throws, never uses a global timer. */
|
|
30
|
+
async function bounded(p, ms) {
|
|
31
|
+
let timer;
|
|
32
|
+
try {
|
|
33
|
+
return await Promise.race([p, new Promise((r) => (timer = clock.setTimeout(() => r(undefined), Math.max(1, ms))))]);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
if (timer !== undefined)
|
|
40
|
+
clock.clearTimeout(timer);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* #398: what the page showed when the prefix went stale — URL, title and a short visible-text
|
|
45
|
+
* excerpt, all redacted. Best effort by contract: any failure (a closed page, a navigation, a hung
|
|
46
|
+
* evaluate) yields no evidence, so it can never mask the stale error with a different one.
|
|
47
|
+
*/
|
|
48
|
+
async function stalePageEvidence(page, secrets) {
|
|
49
|
+
try {
|
|
50
|
+
const url = page.url();
|
|
51
|
+
const title = await bounded(page.title(), PAGE_EVIDENCE_TIMEOUT_MS);
|
|
52
|
+
const raw = await bounded(page.evaluate(() => document.body?.innerText ?? ""), PAGE_EVIDENCE_TIMEOUT_MS);
|
|
53
|
+
if (title === undefined || raw === undefined)
|
|
54
|
+
return undefined;
|
|
55
|
+
// Persisted in the result: the run's secrets AND any credential-shaped string the page shows (#298).
|
|
56
|
+
const text = redactCredentialShapes(redactText(raw.replace(/\s+/g, " ").trim(), secrets)).slice(0, PAGE_EVIDENCE_TEXT_MAX);
|
|
57
|
+
return { url: redactText(redactUrl(url), secrets), title: redactText(title, secrets), text };
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
23
63
|
/** The strategies a mission can branch off a Journey with (`--feature` and multi-runs are refused). */
|
|
24
64
|
export { ANCHORED_STRATEGIES } from "@jevitate/journey";
|
|
25
65
|
/** `--from-journey`/`--at-step` cannot be used as given (exit 64, nothing ran). */
|
|
@@ -37,13 +77,17 @@ export class JourneyPrefixArgsError extends Error {
|
|
|
37
77
|
export class JourneyPrefixStaleError extends Error {
|
|
38
78
|
branch;
|
|
39
79
|
failedStep;
|
|
80
|
+
page;
|
|
40
81
|
code = "E_JOURNEY_STALE";
|
|
41
82
|
constructor(message, branch,
|
|
42
83
|
/** The 1-based Journey step that failed, when the replay names it. */
|
|
43
|
-
failedStep
|
|
84
|
+
failedStep,
|
|
85
|
+
/** #398: what the page showed when the prefix went stale (redacted); absent when it could not be read. */
|
|
86
|
+
page) {
|
|
44
87
|
super(message);
|
|
45
88
|
this.branch = branch;
|
|
46
89
|
this.failedStep = failedStep;
|
|
90
|
+
this.page = page;
|
|
47
91
|
this.name = "JourneyPrefixStaleError";
|
|
48
92
|
}
|
|
49
93
|
}
|
|
@@ -88,11 +132,12 @@ export async function resolveJourneyPrefix(opts) {
|
|
|
88
132
|
const allowedOrigins = opts.environment === undefined ? [new URL(site).origin] : [...opts.environment.allowedOrigins];
|
|
89
133
|
const where = `step ${branch.step}${branch.anchor === undefined ? "" : ` (anchor ${branch.anchor})`}`;
|
|
90
134
|
const secretNames = secretParamNames(full, used).filter((n) => n in used);
|
|
135
|
+
const secretValues = secretParamValues(full, used);
|
|
91
136
|
return {
|
|
92
137
|
branch,
|
|
93
138
|
startUrl,
|
|
94
139
|
allowedOrigins,
|
|
95
|
-
secrets:
|
|
140
|
+
secrets: secretValues,
|
|
96
141
|
steps: resolved.step,
|
|
97
142
|
replayInfo: {
|
|
98
143
|
journeysDir: resolvePath(opts.dir),
|
|
@@ -122,12 +167,13 @@ export async function resolveJourneyPrefix(opts) {
|
|
|
122
167
|
if (err instanceof SiteGateRefusedError)
|
|
123
168
|
throw err;
|
|
124
169
|
const message = err instanceof Error ? (err.message.split("\n")[0] ?? err.message) : String(err);
|
|
125
|
-
throw new JourneyPrefixStaleError(`journey '${opts.id}' did not replay to ${where}: ${message}`, branch);
|
|
170
|
+
throw new JourneyPrefixStaleError(`journey '${opts.id}' did not replay to ${where}: ${message}`, branch, undefined, await stalePageEvidence(session.page, secretValues));
|
|
126
171
|
}
|
|
127
172
|
if (run.outcome !== "ok") {
|
|
128
173
|
const failed = run.outcome === "quarantined" && run.at !== undefined ? run.at + 1 : undefined;
|
|
174
|
+
// #398: the runner's reason names the failed step 1-based, like `--at-step` and `failedStep`.
|
|
129
175
|
const reason = run.outcome === "quarantined" ? run.reason : "the replay healed a step (a self-healed prefix is never a branch point)";
|
|
130
|
-
throw new JourneyPrefixStaleError(`journey '${opts.id}' is stale: it no longer reaches ${where} — ${reason}`, branch, failed);
|
|
176
|
+
throw new JourneyPrefixStaleError(`journey '${opts.id}' is stale: it no longer reaches ${where} — ${reason}`, branch, failed, await stalePageEvidence(session.page, secretValues));
|
|
131
177
|
}
|
|
132
178
|
return session.page.url();
|
|
133
179
|
},
|
|
@@ -158,11 +204,11 @@ export function prefixRestart(prefix, allowlist, browser) {
|
|
|
158
204
|
*/
|
|
159
205
|
export async function startFromJourney(prefix, session, url, allowlist, browser) {
|
|
160
206
|
if (prefix === undefined)
|
|
161
|
-
return { url };
|
|
207
|
+
return { url, persistUrl: url };
|
|
162
208
|
const live = await prefix.replay(session, browser);
|
|
163
209
|
assertAuthorizedExploreTarget(live, allowlist);
|
|
164
210
|
const restart = { restartAtStart: prefixRestart(prefix, allowlist, browser), restartCost: prefix.steps };
|
|
165
|
-
return { url: live, branch: { ...prefix.branch, replay: prefix.replayInfo }, restart };
|
|
211
|
+
return { url: live, persistUrl: redactText(redactUrl(live), prefix.secrets), branch: { ...prefix.branch, replay: prefix.replayInfo }, restart };
|
|
166
212
|
}
|
|
167
213
|
/** The result fields an anchored run adds (#293, additive): its branch point (and how to replay it). */
|
|
168
214
|
export function branchFields(start) {
|
|
@@ -174,7 +220,7 @@ export function journeyStaleResult(err, strategy) {
|
|
|
174
220
|
outcome: "inconclusive",
|
|
175
221
|
missionOutcome: "inconclusive",
|
|
176
222
|
reason: err.message,
|
|
177
|
-
failure: { kind: "journey-stale", message: err.message },
|
|
223
|
+
failure: { kind: "journey-stale", message: err.message, ...(err.page === undefined ? {} : { page: err.page }) },
|
|
178
224
|
branch: err.branch,
|
|
179
225
|
...(err.failedStep === undefined ? {} : { failedStep: err.failedStep }),
|
|
180
226
|
exitCode: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey-prefix.js","sourceRoot":"","sources":["../src/journey-prefix.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"journey-prefix.js","sourceRoot":"","sources":["../src/journey-prefix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #402 — `journey verify --mutate`: a built-in negative proof that each of a Journey's assertions
|
|
3
|
+
* FAILS when its outcome is absent. The Journey is replayed once as recorded (it must pass), then
|
|
4
|
+
* once per mutation (`planJourneyMutations`: skip a write step, abort its writes, or type an empty
|
|
5
|
+
* value into a checked fill); each assertion is sensitive only when its paired mutation broke it, at
|
|
6
|
+
* that assertion, with nothing failing before the mutated step.
|
|
7
|
+
*
|
|
8
|
+
* Every replay goes through `runJourneyProgrammatically` — the same path, gate, fixtures and
|
|
9
|
+
* environment as `journey run`. Mutations never send, fabricate or answer a request: they leave a
|
|
10
|
+
* step's action out, ABORT the app's own writes in one step's window, or type `""`.
|
|
11
|
+
*/
|
|
12
|
+
import { type AssertionVerdict, type JourneyMutation, type MutationFailedSite, type MutationProofVerdict, type MutationRunResult } from "@jevitate/journey";
|
|
13
|
+
import { runJourneyProgrammatically, type RunJourneyProgrammaticallyOptions } from "./journey-api.js";
|
|
14
|
+
/** `journey run`'s options a proof passes through to every replay (params, environment, auth, fixtures, browser, gate). */
|
|
15
|
+
export type VerifyJourneyOptions = Omit<RunJourneyProgrammaticallyOptions, "stopAfterStep" | "interpreter" | "observer" | "session" | "screenshots" | "actionDeltas" | "selfHealer" | "policy"> & {
|
|
16
|
+
/** Read patterns for the write classifier (as `journey lint`). */
|
|
17
|
+
readonly readRequests?: readonly string[];
|
|
18
|
+
};
|
|
19
|
+
export interface JourneyVerifyMutation {
|
|
20
|
+
readonly kind: JourneyMutation["kind"];
|
|
21
|
+
readonly step: number;
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly outcome: MutationRunResult["outcome"];
|
|
24
|
+
readonly failedSites: readonly MutationFailedSite[];
|
|
25
|
+
/** block-write: what was aborted (`METHOD path`). */
|
|
26
|
+
readonly blockedWrites?: readonly string[];
|
|
27
|
+
/** Why the replay failed, was not applied, or errored. */
|
|
28
|
+
readonly reason?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface JourneyVerifyAssertion {
|
|
31
|
+
readonly site: string;
|
|
32
|
+
/** The assertion, in the `--success` spec syntax. */
|
|
33
|
+
readonly check: string;
|
|
34
|
+
readonly verdict: AssertionVerdict;
|
|
35
|
+
readonly provedBy?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface JourneyVerifyReport {
|
|
38
|
+
readonly journeyId: string;
|
|
39
|
+
/** `journeyContentHash` of the stored Journey: the proof is bound to exactly this content. */
|
|
40
|
+
readonly journeyHash: string;
|
|
41
|
+
readonly base: {
|
|
42
|
+
readonly outcome: string;
|
|
43
|
+
readonly reason?: string;
|
|
44
|
+
};
|
|
45
|
+
readonly verdict: MutationProofVerdict;
|
|
46
|
+
readonly reason?: string;
|
|
47
|
+
readonly mutations: readonly JourneyVerifyMutation[];
|
|
48
|
+
readonly assertions: readonly JourneyVerifyAssertion[];
|
|
49
|
+
readonly summary: Readonly<Record<"sensitive" | "insensitive" | "cascade" | "notApplied" | "error" | "unpaired", number>>;
|
|
50
|
+
}
|
|
51
|
+
/** The exit code for a proof's verdict (docs/ci.md): 0 proven · 1 insensitive · 2 inconclusive. */
|
|
52
|
+
export declare function verifyExitCode(verdict: MutationProofVerdict): number;
|
|
53
|
+
type Run = typeof runJourneyProgrammatically;
|
|
54
|
+
/**
|
|
55
|
+
* Runs the proof for one Journey by id. Usage errors (unknown id, bad params, an environment that
|
|
56
|
+
* refuses a step, a site-gate refusal) throw exactly as `journey run`'s do, before any mutation.
|
|
57
|
+
*/
|
|
58
|
+
export declare function verifyJourneyMutations(opts: VerifyJourneyOptions, run?: Run): Promise<JourneyVerifyReport>;
|
|
59
|
+
/** One human line per assertion — verdict, site, check, and the mutation that proved it. */
|
|
60
|
+
export declare function verifyAssertionLine(a: JourneyVerifyAssertion): string;
|
|
61
|
+
export {};
|