@jevitate/cli 0.6.0 → 0.8.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/ai-cli.d.ts +3 -1
- package/dist/ai-cli.js +60 -16
- package/dist/ai-cli.js.map +1 -1
- package/dist/approval-provenance.d.ts +120 -0
- package/dist/approval-provenance.js +300 -0
- package/dist/approval-provenance.js.map +1 -0
- package/dist/author-journey-cli.js +11 -18
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +29012 -20685
- package/dist/build-info.generated.js +2 -2
- package/dist/builtin-analyzers.d.ts +7 -0
- package/dist/builtin-analyzers.js +19 -0
- package/dist/builtin-analyzers.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +9 -4
- package/dist/campaign-cli.js.map +1 -1
- package/dist/catalog-analysis.d.ts +70 -0
- package/dist/catalog-analysis.js +507 -0
- package/dist/catalog-analysis.js.map +1 -0
- package/dist/catalog-api.d.ts +73 -0
- package/dist/catalog-api.js +97 -0
- package/dist/catalog-api.js.map +1 -0
- package/dist/catalog-cli.d.ts +12 -0
- package/dist/catalog-cli.js +224 -0
- package/dist/catalog-cli.js.map +1 -0
- package/dist/catalog-review.d.ts +29 -0
- package/dist/catalog-review.js +290 -0
- package/dist/catalog-review.js.map +1 -0
- package/dist/catalog.d.ts +133 -0
- package/dist/catalog.js +352 -0
- package/dist/catalog.js.map +1 -0
- package/dist/check-api.js +24 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +3 -0
- package/dist/check-cli.js +18 -4
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.js +25 -9
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.js +4 -1
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.js +6 -3
- package/dist/check-suite.js.map +1 -1
- package/dist/check-types.d.ts +12 -1
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +86 -4
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +22 -2
- package/dist/cli-shared.js +34 -5
- package/dist/cli-shared.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +21 -5
- package/dist/demo-aspect-api.js +30 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +64 -5
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/environments.js +6 -1
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.js +4 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +3 -1
- package/dist/explore-adversarial.js +3 -3
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-author.js +5 -2
- package/dist/explore-author.js.map +1 -1
- package/dist/explore-cli.js +162 -13
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +6 -2
- package/dist/explore-coverage.js +5 -4
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +3 -1
- package/dist/explore-feature.js +2 -2
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +37 -6
- package/dist/explore-goal.js +70 -52
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +12 -7
- package/dist/explore-shared.js +9 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/goal-run-flags.d.ts +2 -0
- package/dist/goal-run-flags.js +8 -1
- package/dist/goal-run-flags.js.map +1 -1
- package/dist/http-5xx-outcome.d.ts +8 -3
- package/dist/http-5xx-outcome.js +5 -15
- package/dist/http-5xx-outcome.js.map +1 -1
- package/dist/init-cli.d.ts +7 -0
- package/dist/init-cli.js +79 -9
- package/dist/init-cli.js.map +1 -1
- package/dist/init-codeowners.d.ts +39 -0
- package/dist/init-codeowners.js +91 -0
- package/dist/init-codeowners.js.map +1 -0
- package/dist/init-keys.d.ts +3 -1
- package/dist/init-keys.js +20 -8
- package/dist/init-keys.js.map +1 -1
- package/dist/init-skills.d.ts +85 -7
- package/dist/init-skills.js +303 -36
- package/dist/init-skills.js.map +1 -1
- package/dist/jev-advisor.d.ts +72 -0
- package/dist/jev-advisor.js +172 -0
- package/dist/jev-advisor.js.map +1 -0
- package/dist/journey-api.d.ts +104 -5
- package/dist/journey-api.js +165 -23
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +320 -13
- 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-review-api.d.ts +19 -0
- package/dist/journey-review-api.js +46 -0
- package/dist/journey-review-api.js.map +1 -0
- package/dist/journey-review-store.d.ts +16 -0
- package/dist/journey-review-store.js +95 -0
- package/dist/journey-review-store.js.map +1 -0
- package/dist/journey-review.d.ts +47 -0
- package/dist/journey-review.js +499 -0
- package/dist/journey-review.js.map +1 -0
- package/dist/journey-verify.d.ts +61 -0
- package/dist/journey-verify.js +144 -0
- package/dist/journey-verify.js.map +1 -0
- package/dist/key-report.d.ts +20 -5
- package/dist/key-report.js +32 -9
- package/dist/key-report.js.map +1 -1
- package/dist/kill-signal.js +10 -2
- package/dist/kill-signal.js.map +1 -1
- package/dist/load-api.js +9 -3
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.js +4 -2
- package/dist/load-cli.js.map +1 -1
- package/dist/log-classes.d.ts +73 -0
- package/dist/log-classes.js +167 -0
- package/dist/log-classes.js.map +1 -0
- package/dist/log-correlation.d.ts +29 -10
- package/dist/log-correlation.js +44 -21
- package/dist/log-correlation.js.map +1 -1
- package/dist/login-cli.d.ts +15 -0
- package/dist/login-cli.js +116 -0
- package/dist/login-cli.js.map +1 -0
- package/dist/logs-cli.js +3 -1
- package/dist/logs-cli.js.map +1 -1
- package/dist/mcp-api.d.ts +1 -0
- package/dist/mcp-api.js +61 -12
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-runner.d.ts +2 -0
- package/dist/mcp-cli-runner.js +3 -1
- package/dist/mcp-cli-runner.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +6 -0
- package/dist/mcp-cli-tools.js +182 -23
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-cli.js +8 -4
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-journal.d.ts +4 -1
- package/dist/mission-journal.js +9 -3
- package/dist/mission-journal.js.map +1 -1
- package/dist/mission-queue-cli.js +21 -2
- package/dist/mission-queue-cli.js.map +1 -1
- package/dist/mission-queue-runner.d.ts +6 -0
- package/dist/mission-queue-runner.js +33 -3
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.d.ts +7 -1
- package/dist/multi-run-cli.js +10 -3
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/multi-run.d.ts +38 -3
- package/dist/multi-run.js +115 -23
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +199 -0
- package/dist/persona-login.js +574 -0
- package/dist/persona-login.js.map +1 -0
- package/dist/pre-approval.d.ts +98 -0
- package/dist/pre-approval.js +175 -0
- package/dist/pre-approval.js.map +1 -0
- package/dist/program.js +10 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +2 -1
- package/dist/project-dir.js +3 -1
- package/dist/project-dir.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/readiness.d.ts +29 -0
- package/dist/readiness.js +291 -0
- package/dist/readiness.js.map +1 -0
- package/dist/regression-cli.js +4 -2
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.d.ts +24 -2
- package/dist/report-api.js +33 -5
- package/dist/report-api.js.map +1 -1
- package/dist/report-cli.js +8 -1
- package/dist/report-cli.js.map +1 -1
- package/dist/result-schema.d.ts +12 -0
- package/dist/result-schema.js +8 -0
- package/dist/result-schema.js.map +1 -1
- package/dist/run-index.d.ts +4 -2
- package/dist/run-index.js +3 -1
- package/dist/run-index.js.map +1 -1
- package/dist/run-key-preflight.d.ts +2 -1
- package/dist/run-key-preflight.js +3 -2
- package/dist/run-key-preflight.js.map +1 -1
- package/dist/run-metadata.d.ts +26 -0
- package/dist/run-metadata.js +41 -0
- package/dist/run-metadata.js.map +1 -0
- package/dist/run-tags-cli.d.ts +12 -0
- package/dist/run-tags-cli.js +35 -0
- package/dist/run-tags-cli.js.map +1 -0
- package/dist/self-heal-adapter.js +3 -1
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/site-cli.d.ts +1 -1
- package/dist/site-cli.js +24 -1
- package/dist/site-cli.js.map +1 -1
- package/dist/source-cli.js +4 -2
- package/dist/source-cli.js.map +1 -1
- package/dist/source-run-api.js +17 -7
- package/dist/source-run-api.js.map +1 -1
- package/dist/suite-explore-options.d.ts +14 -0
- package/dist/suite-explore-options.js +7 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +266 -0
- package/dist/sweep-api.js +828 -0
- package/dist/sweep-api.js.map +1 -0
- package/dist/sweep-cli.d.ts +9 -0
- package/dist/sweep-cli.js +115 -0
- package/dist/sweep-cli.js.map +1 -0
- package/dist/target-config.d.ts +5 -2
- package/dist/target-config.js +15 -0
- package/dist/target-config.js.map +1 -1
- package/dist/usability-capture.js +6 -0
- package/dist/usability-capture.js.map +1 -1
- package/dist/ux-cli.js +3 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-usability.d.ts +9 -3
- package/dist/ux-usability.js +6 -4
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +13 -13
- package/skills/jevitate-demo/SKILL.md +5 -2
- package/skills/jevitate-explore/SKILL.md +6 -2
- package/skills/jevitate-getting-started/SKILL.md +12 -0
- package/skills/jevitate-run-journey/SKILL.md +17 -4
- package/skills/jevitate-test-campaign/SKILL.md +26 -5
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { redactText, redactUrl } from "@jevitate/ai-core";
|
|
6
|
+
import { assertAuthorizedExploreTarget, isLoginLikeUrl, UnauthorizedExploreTargetError } from "@jevitate/explore";
|
|
7
|
+
import { sessionLaunchOptions } from "./browser-run-options.js";
|
|
8
|
+
import { findGitRoot, sessionFileInProjectRefusal } from "./project-dir.js";
|
|
9
|
+
export class LoginArgsError extends Error {
|
|
10
|
+
code = "E_LOGIN_ARGS";
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "LoginArgsError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** The login did not succeed (credentials rejected, a field not found, the success check never held). */
|
|
17
|
+
export class LoginFailedError extends Error {
|
|
18
|
+
code = "E_LOGIN_FAILED";
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = "LoginFailedError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const VAR_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
25
|
+
/** jevitate's own credentials are never typed into a page (a login config cannot name them). */
|
|
26
|
+
const RESERVED_VARS = new Set(["OPENROUTER_API_KEY", "TYPESAFE_API_KEY", "GITHUB_TOKEN"]);
|
|
27
|
+
/** Checks an environment variable NAME (a value pasted in its place is never echoed). */
|
|
28
|
+
export function assertEnvVarName(name, what) {
|
|
29
|
+
if (!VAR_NAME.test(name)) {
|
|
30
|
+
throw new LoginArgsError(`${what} expects an environment variable NAME (letters, digits, _; not starting with a digit) — the credential itself is read from the environment, never passed as a value`);
|
|
31
|
+
}
|
|
32
|
+
if (RESERVED_VARS.has(name) || name.startsWith("JEVITATE_")) {
|
|
33
|
+
throw new LoginArgsError(`${what} ${name}: jevitate's own credentials and settings are never typed into a page`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function httpUrl(v, what) {
|
|
37
|
+
let u;
|
|
38
|
+
try {
|
|
39
|
+
u = new URL(v);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new LoginArgsError(`${what} must be an absolute http(s) URL`);
|
|
43
|
+
}
|
|
44
|
+
if (u.protocol !== "http:" && u.protocol !== "https:")
|
|
45
|
+
throw new LoginArgsError(`${what} must be an absolute http(s) URL`);
|
|
46
|
+
if (u.username !== "" || u.password !== "")
|
|
47
|
+
throw new LoginArgsError(`${what} must not carry credentials in the URL`);
|
|
48
|
+
return u.href;
|
|
49
|
+
}
|
|
50
|
+
const LOGIN_KEYS = ["url", "userEnv", "passwordEnv", "userField", "passwordField", "submit", "success"];
|
|
51
|
+
/** Validates a personas file entry's `login` object (`where` names it in errors). */
|
|
52
|
+
export function parsePersonaLogin(v, where) {
|
|
53
|
+
if (v === null || typeof v !== "object" || Array.isArray(v))
|
|
54
|
+
throw new LoginArgsError(`${where} must be an object {url, userEnv, passwordEnv, …}`);
|
|
55
|
+
const o = v;
|
|
56
|
+
for (const k of Object.keys(o)) {
|
|
57
|
+
if (!LOGIN_KEYS.includes(k)) {
|
|
58
|
+
throw new LoginArgsError(`${where}.${k}: unknown key (allowed: ${LOGIN_KEYS.join(", ")}; credentials are read from the environment variables userEnv/passwordEnv name)`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const str = (k, required) => {
|
|
62
|
+
const x = o[k];
|
|
63
|
+
if (x === undefined && !required)
|
|
64
|
+
return undefined;
|
|
65
|
+
if (typeof x !== "string" || x.trim() === "")
|
|
66
|
+
throw new LoginArgsError(`${where}.${k} must be a non-empty string`);
|
|
67
|
+
return x;
|
|
68
|
+
};
|
|
69
|
+
const login = {
|
|
70
|
+
url: httpUrl(str("url", true), `${where}.url`),
|
|
71
|
+
userEnv: str("userEnv", true),
|
|
72
|
+
passwordEnv: str("passwordEnv", true),
|
|
73
|
+
...optional("userField", str("userField", false)),
|
|
74
|
+
...optional("passwordField", str("passwordField", false)),
|
|
75
|
+
...optional("submit", str("submit", false)),
|
|
76
|
+
...optional("success", str("success", false)),
|
|
77
|
+
};
|
|
78
|
+
assertEnvVarName(login.userEnv, `${where}.userEnv`);
|
|
79
|
+
assertEnvVarName(login.passwordEnv, `${where}.passwordEnv`);
|
|
80
|
+
if (login.success !== undefined)
|
|
81
|
+
parseLoginSuccess(login.success);
|
|
82
|
+
return login;
|
|
83
|
+
}
|
|
84
|
+
function optional(k, v) {
|
|
85
|
+
return (v === undefined ? {} : { [k]: v });
|
|
86
|
+
}
|
|
87
|
+
/** `jevitate login`'s flags → a validated `PersonaLogin` (fail closed before any browser opens). */
|
|
88
|
+
export function loginFromFlags(f) {
|
|
89
|
+
const login = {
|
|
90
|
+
url: httpUrl(f.url, "--url"),
|
|
91
|
+
userEnv: f.userEnv,
|
|
92
|
+
passwordEnv: f.passwordEnv,
|
|
93
|
+
...optional("userField", f.userField),
|
|
94
|
+
...optional("passwordField", f.passwordField),
|
|
95
|
+
...optional("submit", f.submit),
|
|
96
|
+
...optional("success", f.success),
|
|
97
|
+
};
|
|
98
|
+
assertEnvVarName(login.userEnv, "--user-env");
|
|
99
|
+
assertEnvVarName(login.passwordEnv, "--password-env");
|
|
100
|
+
if (login.success !== undefined)
|
|
101
|
+
parseLoginSuccess(login.success);
|
|
102
|
+
return login;
|
|
103
|
+
}
|
|
104
|
+
/** `urlIncludes:<text>` | `selector:<css>` | `text:<text>`. */
|
|
105
|
+
export function parseLoginSuccess(spec) {
|
|
106
|
+
const ci = spec.indexOf(":");
|
|
107
|
+
const kind = ci === -1 ? "" : spec.slice(0, ci);
|
|
108
|
+
const rest = ci === -1 ? "" : spec.slice(ci + 1);
|
|
109
|
+
if ((kind === "urlIncludes" || kind === "selector" || kind === "text") && rest.trim() !== "") {
|
|
110
|
+
return kind === "selector" ? { kind, selector: rest } : { kind, text: rest };
|
|
111
|
+
}
|
|
112
|
+
throw new LoginArgsError(`--success must be urlIncludes:<text>, selector:<css> or text:<text>, got ${JSON.stringify(spec)}`);
|
|
113
|
+
}
|
|
114
|
+
/** `--auth-check <off|auto|urlExcludes:<text>|selector:<css>>` (default `auto`). */
|
|
115
|
+
export function parseAuthCheck(spec) {
|
|
116
|
+
if (spec === undefined || spec === "auto")
|
|
117
|
+
return { mode: "auto" };
|
|
118
|
+
if (spec === "off")
|
|
119
|
+
return { mode: "off" };
|
|
120
|
+
const ci = spec.indexOf(":");
|
|
121
|
+
const kind = ci === -1 ? "" : spec.slice(0, ci);
|
|
122
|
+
const rest = ci === -1 ? "" : spec.slice(ci + 1);
|
|
123
|
+
if (kind === "urlExcludes" && rest !== "")
|
|
124
|
+
return { mode: "urlExcludes", text: rest };
|
|
125
|
+
if (kind === "selector" && rest !== "")
|
|
126
|
+
return { mode: "selector", selector: rest };
|
|
127
|
+
throw new LoginArgsError(`--auth-check must be off, auto, urlExcludes:<text> or selector:<css>, got ${JSON.stringify(spec)}`);
|
|
128
|
+
}
|
|
129
|
+
/** Reads the two credentials from the environment (fail closed: unset/empty refuses, naming the variable only). */
|
|
130
|
+
export function resolveLoginSecrets(login, env) {
|
|
131
|
+
const read = (name, what) => {
|
|
132
|
+
const v = env[name];
|
|
133
|
+
if (v === undefined || v === "")
|
|
134
|
+
throw new LoginArgsError(`${what}: environment variable ${name} is not set`);
|
|
135
|
+
return v;
|
|
136
|
+
};
|
|
137
|
+
return { username: read(login.userEnv, "--user-env"), password: read(login.passwordEnv, "--password-env") };
|
|
138
|
+
}
|
|
139
|
+
/** Removes both credentials (and URL credentials/tokens) from a text before it leaves this module. */
|
|
140
|
+
function scrub(text, secrets) {
|
|
141
|
+
return redactText(text, [secrets.password, secrets.username]);
|
|
142
|
+
}
|
|
143
|
+
// ── the login ─────────────────────────────────────────────────────────────────────────────────
|
|
144
|
+
const VISIBLE_PASSWORD = 'input[type="password"]';
|
|
145
|
+
const TEXT_INPUT = 'input:not([type="password"]):not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="image"]):not([type="file"])';
|
|
146
|
+
/** The first VISIBLE element over the candidates, in order (an invalid selector is skipped, never thrown). */
|
|
147
|
+
async function firstVisible(candidates) {
|
|
148
|
+
for (const c of candidates) {
|
|
149
|
+
try {
|
|
150
|
+
const v = c.filter({ visible: true });
|
|
151
|
+
if ((await v.count()) > 0)
|
|
152
|
+
return v.first();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// an unparseable selector (a label given where CSS was tried) matches nothing
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
/** A field named by the operator: a label first (exact, then loose), else CSS. */
|
|
161
|
+
function fieldBySpec(page, spec) {
|
|
162
|
+
return [page.getByLabel(spec, { exact: true }), page.getByLabel(spec), page.locator(spec)];
|
|
163
|
+
}
|
|
164
|
+
function userCandidates(page) {
|
|
165
|
+
return [
|
|
166
|
+
page.locator(`${TEXT_INPUT}[autocomplete~="username"]`),
|
|
167
|
+
page.locator('input[type="email"]'),
|
|
168
|
+
page.locator(`${TEXT_INPUT}[autocomplete~="email"]`),
|
|
169
|
+
page.locator(`${TEXT_INPUT}[name*="user" i], ${TEXT_INPUT}[id*="user" i]`),
|
|
170
|
+
page.locator(`${TEXT_INPUT}[name*="email" i], ${TEXT_INPUT}[id*="email" i]`),
|
|
171
|
+
page.locator(`${TEXT_INPUT}[name*="login" i], ${TEXT_INPUT}[id*="login" i]`),
|
|
172
|
+
page.getByLabel(/e-?mail|user\s*name|user\s*id|login|account/i),
|
|
173
|
+
page.locator(`form:has(${VISIBLE_PASSWORD}) ${TEXT_INPUT}`),
|
|
174
|
+
];
|
|
175
|
+
}
|
|
176
|
+
function passwordCandidates(page) {
|
|
177
|
+
return [page.locator('input[type="password"][autocomplete~="current-password"]'), page.locator(VISIBLE_PASSWORD)];
|
|
178
|
+
}
|
|
179
|
+
async function submitLocator(page, spec) {
|
|
180
|
+
if (spec !== undefined) {
|
|
181
|
+
const named = await firstVisible([page.getByRole("button", { name: spec, exact: true }), page.getByRole("button", { name: spec })]);
|
|
182
|
+
if (named === undefined)
|
|
183
|
+
throw new LoginFailedError(`no visible button named ${JSON.stringify(spec)} on the sign-in page`);
|
|
184
|
+
return named;
|
|
185
|
+
}
|
|
186
|
+
return firstVisible([
|
|
187
|
+
page.locator(`form:has(${VISIBLE_PASSWORD}) [type="submit"]`),
|
|
188
|
+
page.locator(`form:has(${TEXT_INPUT}) [type="submit"]`),
|
|
189
|
+
page.getByRole("button", { name: /^\s*(log\s*-?\s*in|sign\s*-?\s*in|continue|next|submit)\b/i }),
|
|
190
|
+
]);
|
|
191
|
+
}
|
|
192
|
+
/** Refuses to type anything into a page whose origin the run does not authorize. */
|
|
193
|
+
function assertPageAuthorized(page, allowlist) {
|
|
194
|
+
try {
|
|
195
|
+
assertAuthorizedExploreTarget(page.url(), allowlist);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
if (!(err instanceof UnauthorizedExploreTargetError))
|
|
199
|
+
throw err;
|
|
200
|
+
throw new LoginFailedError(`the sign-in page is on ${originOf(page.url())}, which is not an authorized origin (allowed: ${allowlist.join(", ") || "<none>"}) — credentials are never typed there; pass --allow <origin> to authorize it`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function originOf(url) {
|
|
204
|
+
try {
|
|
205
|
+
return new URL(url).origin;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return "?";
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
function pathOf(url) {
|
|
212
|
+
try {
|
|
213
|
+
return new URL(url).pathname;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return "?";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async function waitForSuccess(page, success, timeoutMs) {
|
|
220
|
+
if (success === undefined) {
|
|
221
|
+
// Default: the app moved off its sign-in page — no login-like URL and no visible password field.
|
|
222
|
+
await page.waitForURL((u) => !isLoginLikeUrl(u.href), { timeout: timeoutMs, waitUntil: "load" });
|
|
223
|
+
await page.locator(VISIBLE_PASSWORD).filter({ visible: true }).first().waitFor({ state: "detached", timeout: timeoutMs });
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
if (success.kind === "urlIncludes") {
|
|
227
|
+
await page.waitForURL((u) => u.href.includes(success.text), { timeout: timeoutMs, waitUntil: "load" });
|
|
228
|
+
}
|
|
229
|
+
else if (success.kind === "selector") {
|
|
230
|
+
await page.locator(success.selector).first().waitFor({ state: "visible", timeout: timeoutMs });
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
await page.getByText(success.text).first().waitFor({ state: "visible", timeout: timeoutMs });
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/** A sign-in form's error message (an alert, or a field the page marked invalid). */
|
|
237
|
+
const FORM_ERROR = '[role="alert"], [aria-invalid="true"]';
|
|
238
|
+
/**
|
|
239
|
+
* Resolves "rejected" when, after the submit, the page shows a form error while a password field is
|
|
240
|
+
* still visible (the credentials were refused) — so a wrong password fails at once, not at the
|
|
241
|
+
* timeout. Never resolves otherwise (the success wait decides).
|
|
242
|
+
*/
|
|
243
|
+
function formRejected(page, timeoutMs) {
|
|
244
|
+
const never = new Promise(() => undefined);
|
|
245
|
+
return page
|
|
246
|
+
.locator(FORM_ERROR)
|
|
247
|
+
.filter({ visible: true })
|
|
248
|
+
.first()
|
|
249
|
+
.waitFor({ state: "visible", timeout: timeoutMs })
|
|
250
|
+
.then(async () => ((await page.locator(VISIBLE_PASSWORD).filter({ visible: true }).count().catch(() => 0)) > 0 ? "rejected" : never), () => never);
|
|
251
|
+
}
|
|
252
|
+
function describeSuccess(success) {
|
|
253
|
+
if (success === undefined)
|
|
254
|
+
return "the page to leave the sign-in form (no login-like URL, no password field)";
|
|
255
|
+
if (success.kind === "urlIncludes")
|
|
256
|
+
return `the URL to include ${JSON.stringify(success.text)}`;
|
|
257
|
+
if (success.kind === "selector")
|
|
258
|
+
return `${JSON.stringify(success.selector)} to be visible`;
|
|
259
|
+
return `the text ${JSON.stringify(success.text)} to be visible`;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Drives the sign-in form on `page` (already open, no storage state): navigates to `login.url`, fills
|
|
263
|
+
* the fields, submits, and waits for the success check. Throws `LoginFailedError` (scrubbed).
|
|
264
|
+
* Supports a two-step form (username, then a password page): when no password field is visible yet,
|
|
265
|
+
* the username is submitted first.
|
|
266
|
+
*/
|
|
267
|
+
export async function performLogin(page, login, secrets, opts) {
|
|
268
|
+
const success = login.success === undefined ? undefined : parseLoginSuccess(login.success);
|
|
269
|
+
const t = opts.timeoutMs;
|
|
270
|
+
try {
|
|
271
|
+
await page.goto(login.url, { waitUntil: "load", timeout: t });
|
|
272
|
+
assertPageAuthorized(page, opts.allowlist);
|
|
273
|
+
const findUser = async () => firstVisible(login.userField === undefined ? userCandidates(page) : fieldBySpec(page, login.userField));
|
|
274
|
+
const findPassword = async () => firstVisible(login.passwordField === undefined ? passwordCandidates(page) : fieldBySpec(page, login.passwordField));
|
|
275
|
+
let password = await findPassword();
|
|
276
|
+
const user = await findUser();
|
|
277
|
+
if (user === undefined) {
|
|
278
|
+
throw new LoginFailedError(`no username field found on ${pathOf(page.url())}${login.userField === undefined ? " — name it with --user-field <label or CSS selector>" : ` matching ${JSON.stringify(login.userField)}`}`);
|
|
279
|
+
}
|
|
280
|
+
await user.fill(secrets.username, { timeout: t });
|
|
281
|
+
if (password === undefined) {
|
|
282
|
+
// Two-step sign-in: submit the username, then the password page.
|
|
283
|
+
const next = await submitLocator(page, login.submit);
|
|
284
|
+
if (next === undefined)
|
|
285
|
+
await user.press("Enter", { timeout: t });
|
|
286
|
+
else
|
|
287
|
+
await next.click({ timeout: t });
|
|
288
|
+
if (login.passwordField === undefined)
|
|
289
|
+
await page.locator(VISIBLE_PASSWORD).filter({ visible: true }).first().waitFor({ state: "visible", timeout: t });
|
|
290
|
+
else
|
|
291
|
+
await page.waitForLoadState("load", { timeout: t });
|
|
292
|
+
assertPageAuthorized(page, opts.allowlist);
|
|
293
|
+
password = await findPassword();
|
|
294
|
+
}
|
|
295
|
+
if (password === undefined) {
|
|
296
|
+
throw new LoginFailedError(`no password field found on ${pathOf(page.url())}${login.passwordField === undefined ? " — name it with --password-field <label or CSS selector>" : ` matching ${JSON.stringify(login.passwordField)}`}`);
|
|
297
|
+
}
|
|
298
|
+
assertPageAuthorized(page, opts.allowlist);
|
|
299
|
+
await password.fill(secrets.password, { timeout: t });
|
|
300
|
+
const submit = await submitLocator(page, login.submit);
|
|
301
|
+
// An error message already on the form is not this attempt's: early failure detection is then off.
|
|
302
|
+
const alertsBefore = await page.locator(FORM_ERROR).filter({ visible: true }).count().catch(() => 0);
|
|
303
|
+
if (submit === undefined)
|
|
304
|
+
await password.press("Enter", { timeout: t });
|
|
305
|
+
else
|
|
306
|
+
await submit.click({ timeout: t });
|
|
307
|
+
try {
|
|
308
|
+
const succeeded = waitForSuccess(page, success, t).then(() => "succeeded");
|
|
309
|
+
succeeded.catch(() => undefined); // awaited below, or abandoned once the form reports an error
|
|
310
|
+
const outcome = alertsBefore > 0 ? await succeeded : await Promise.race([succeeded, formRejected(page, t)]);
|
|
311
|
+
if (outcome === "rejected") {
|
|
312
|
+
throw new LoginFailedError(`the sign-in form reported an error on ${pathOf(page.url())} — the credentials in ${login.userEnv}/${login.passwordEnv} were not accepted`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
if (err instanceof Error && err.name === "TimeoutError") {
|
|
317
|
+
throw new LoginFailedError(`the sign-in did not succeed within ${Math.round(t / 1000)}s: waited for ${describeSuccess(success)}; the page is ${pathOf(page.url())} (check the credentials in ${login.userEnv}/${login.passwordEnv}, or set --success)`);
|
|
318
|
+
}
|
|
319
|
+
throw err;
|
|
320
|
+
}
|
|
321
|
+
const landed = page.url();
|
|
322
|
+
assertPageAuthorized(page, opts.allowlist);
|
|
323
|
+
return landed;
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
if (err instanceof LoginFailedError)
|
|
327
|
+
throw new LoginFailedError(scrub(err.message, secrets));
|
|
328
|
+
// A Playwright error never carries a typed value, but every message is scrubbed regardless.
|
|
329
|
+
const message = err instanceof Error ? err.message.split("\n")[0] : String(err);
|
|
330
|
+
throw new LoginFailedError(scrub(`the sign-in failed: ${message}`, secrets));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
// ── saving the state ──────────────────────────────────────────────────────────────────────────
|
|
334
|
+
/** Where a storage state goes: refused inside a repo's `.jevitate/`; a warning when it is in a repo and not ignored by git. */
|
|
335
|
+
export function checkSaveTarget(file, what) {
|
|
336
|
+
const path = resolve(file);
|
|
337
|
+
const refusal = sessionFileInProjectRefusal(path, what);
|
|
338
|
+
if (refusal !== undefined)
|
|
339
|
+
throw new LoginArgsError(refusal);
|
|
340
|
+
const warnings = [];
|
|
341
|
+
const root = findGitRoot(dirname(path));
|
|
342
|
+
if (root !== null) {
|
|
343
|
+
const rel = relative(root, path);
|
|
344
|
+
if (rel !== "" && !rel.startsWith("..") && !isAbsolute(rel)) {
|
|
345
|
+
let ignored;
|
|
346
|
+
try {
|
|
347
|
+
execFileSync("git", ["check-ignore", "-q", "--no-index", "--", rel], { cwd: root, stdio: "ignore" });
|
|
348
|
+
ignored = true;
|
|
349
|
+
}
|
|
350
|
+
catch (err) {
|
|
351
|
+
const status = err.status;
|
|
352
|
+
ignored = status === 1 ? false : undefined;
|
|
353
|
+
}
|
|
354
|
+
if (ignored !== true) {
|
|
355
|
+
warnings.push(`${what} ${path} is inside the git repository ${root} and ${ignored === false ? "is not gitignored" : "could not be checked against .gitignore"}: it holds live session tokens — add it to .gitignore or save it outside the repo`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
return { path, warnings };
|
|
360
|
+
}
|
|
361
|
+
/** Writes the storage state JSON atomically with mode 0600 (a temp file in the same directory, then rename). */
|
|
362
|
+
export function writeStorageStateFile(path, json) {
|
|
363
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
364
|
+
const tmp = join(dirname(path), `.${basename(path)}.${randomUUID()}.tmp`);
|
|
365
|
+
try {
|
|
366
|
+
writeFileSync(tmp, json, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
367
|
+
chmodSync(tmp, 0o600);
|
|
368
|
+
renameSync(tmp, path);
|
|
369
|
+
}
|
|
370
|
+
catch (err) {
|
|
371
|
+
rmSync(tmp, { force: true });
|
|
372
|
+
throw err;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
/** Signs in on a fresh, unrecorded session and saves its storage state (mode 0600). */
|
|
376
|
+
export async function mintStorageState(o) {
|
|
377
|
+
const secrets = resolveLoginSecrets(o.login, o.env);
|
|
378
|
+
const save = resolve(o.save);
|
|
379
|
+
const refusal = sessionFileInProjectRefusal(save, "the storage state");
|
|
380
|
+
if (refusal !== undefined)
|
|
381
|
+
throw new LoginArgsError(refusal);
|
|
382
|
+
try {
|
|
383
|
+
assertAuthorizedExploreTarget(o.login.url, o.allowlist);
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
if (err instanceof UnauthorizedExploreTargetError)
|
|
387
|
+
throw new LoginArgsError(`login URL ${JSON.stringify(o.login.url)} is not an authorized origin (allowed: ${o.allowlist.join(", ") || "<none>"}) — refused`);
|
|
388
|
+
throw err;
|
|
389
|
+
}
|
|
390
|
+
// Never recorded: no video directory, no tracing, no screenshots — whatever the run's own flags say.
|
|
391
|
+
const { recordVideo: _video, ...launch } = o.browser ?? {};
|
|
392
|
+
let session;
|
|
393
|
+
try {
|
|
394
|
+
session = await o.port.open({ ...sessionLaunchOptions(launch), allowedOrigins: [...o.allowlist], baseUrl: o.login.url });
|
|
395
|
+
const landed = await performLogin(session.page, o.login, secrets, { allowlist: o.allowlist, timeoutMs: o.timeoutMs });
|
|
396
|
+
const state = session.captureStorageState !== undefined ? await session.captureStorageState() : JSON.stringify(await session.page.context().storageState());
|
|
397
|
+
writeStorageStateFile(save, state);
|
|
398
|
+
return { saved: save, landedUrl: scrub(redactUrl(landed), secrets) };
|
|
399
|
+
}
|
|
400
|
+
catch (err) {
|
|
401
|
+
if (err instanceof LoginFailedError || err instanceof LoginArgsError)
|
|
402
|
+
throw err;
|
|
403
|
+
throw new LoginFailedError(scrub(`the sign-in failed: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}`, secrets));
|
|
404
|
+
}
|
|
405
|
+
finally {
|
|
406
|
+
await session?.close().catch(() => undefined);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
/** How long the check waits for a client-side redirect (an SPA that asks its API, then routes to /login). */
|
|
410
|
+
const SETTLE_MS = 3_000;
|
|
411
|
+
/**
|
|
412
|
+
* Opens `url` with the storage state and decides by code whether the session is alive. A start URL
|
|
413
|
+
* that is itself a sign-in route is never judged (`auto`). An unreachable app is NOT an expired
|
|
414
|
+
* session: the check passes it on and the mission reports the app as unreachable, as before.
|
|
415
|
+
*/
|
|
416
|
+
export async function checkSession(o) {
|
|
417
|
+
if (o.check.mode === "off")
|
|
418
|
+
return { ok: true };
|
|
419
|
+
if (o.check.mode === "auto" && isLoginLikeUrl(o.url))
|
|
420
|
+
return { ok: true };
|
|
421
|
+
assertAuthorizedExploreTarget(o.url, o.allowlist);
|
|
422
|
+
const { recordVideo: _video, ...launch } = o.browser ?? {};
|
|
423
|
+
const session = await o.port.open({ ...sessionLaunchOptions(launch), storageState: o.storageState, allowedOrigins: [...o.allowlist], baseUrl: o.url });
|
|
424
|
+
try {
|
|
425
|
+
if ((await session.probeReachable?.(o.url)) != null)
|
|
426
|
+
return { ok: true };
|
|
427
|
+
const page = session.page;
|
|
428
|
+
try {
|
|
429
|
+
await page.goto(o.url, { waitUntil: "load", timeout: o.timeoutMs });
|
|
430
|
+
}
|
|
431
|
+
catch {
|
|
432
|
+
return { ok: true }; // a navigation failure is the mission's to report, not an auth verdict
|
|
433
|
+
}
|
|
434
|
+
await page.waitForLoadState("networkidle", { timeout: SETTLE_MS }).catch(() => undefined);
|
|
435
|
+
const verdict = await judgeLanding(page, o);
|
|
436
|
+
// A rotating session (a refresh cookie replaced on every use) was just used by the check: the
|
|
437
|
+
// live one is written back, so the mission starts from it rather than from a consumed token.
|
|
438
|
+
if (verdict.ok)
|
|
439
|
+
await keepRotatedSession(session, o.storageState);
|
|
440
|
+
return verdict;
|
|
441
|
+
}
|
|
442
|
+
finally {
|
|
443
|
+
await session.close().catch(() => undefined);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/** The check's verdict on the page the start URL landed on. */
|
|
447
|
+
async function judgeLanding(page, o) {
|
|
448
|
+
const landed = page.url();
|
|
449
|
+
const where = redactUrl(landed);
|
|
450
|
+
const state = basename(o.storageState);
|
|
451
|
+
switch (o.check.mode) {
|
|
452
|
+
case "auto": {
|
|
453
|
+
if (isLoginLikeUrl(landed)) {
|
|
454
|
+
return { ok: false, landedUrl: where, reason: `the session in ${state} is not signed in: ${pathOf(o.url)} redirected to the sign-in page ${pathOf(landed)}` };
|
|
455
|
+
}
|
|
456
|
+
const pw = await page.locator(VISIBLE_PASSWORD).filter({ visible: true }).count().catch(() => 0);
|
|
457
|
+
if (pw > 0)
|
|
458
|
+
return { ok: false, landedUrl: where, reason: `the session in ${state} is not signed in: ${pathOf(landed)} shows a sign-in form (a password field)` };
|
|
459
|
+
return { ok: true, landedUrl: where };
|
|
460
|
+
}
|
|
461
|
+
case "urlExcludes":
|
|
462
|
+
return landed.includes(o.check.text)
|
|
463
|
+
? { ok: false, landedUrl: where, reason: `the session in ${state} is not signed in: the start page landed on ${pathOf(landed)}, which includes ${JSON.stringify(o.check.text)} (--auth-check)` }
|
|
464
|
+
: { ok: true, landedUrl: where };
|
|
465
|
+
case "selector": {
|
|
466
|
+
const visible = await page
|
|
467
|
+
.locator(o.check.selector)
|
|
468
|
+
.first()
|
|
469
|
+
.waitFor({ state: "visible", timeout: Math.min(o.timeoutMs, 5_000) })
|
|
470
|
+
.then(() => true)
|
|
471
|
+
.catch(() => false);
|
|
472
|
+
return visible
|
|
473
|
+
? { ok: true, landedUrl: where }
|
|
474
|
+
: { ok: false, landedUrl: where, reason: `the session in ${state} is not signed in: the signed-in marker ${JSON.stringify(o.check.selector)} is not visible on ${pathOf(landed)} (--auth-check)` };
|
|
475
|
+
}
|
|
476
|
+
case "off":
|
|
477
|
+
return { ok: true, landedUrl: where };
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
/** `name@domain/path` → value for a storage state's cookies, and `origin key` → value for its localStorage. */
|
|
481
|
+
function sessionValues(json) {
|
|
482
|
+
let raw;
|
|
483
|
+
try {
|
|
484
|
+
raw = JSON.parse(json);
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
return undefined;
|
|
488
|
+
}
|
|
489
|
+
const o = (raw ?? {});
|
|
490
|
+
const out = new Map();
|
|
491
|
+
for (const c of Array.isArray(o.cookies) ? o.cookies : []) {
|
|
492
|
+
const k = c;
|
|
493
|
+
if (typeof k.name === "string" && typeof k.value === "string")
|
|
494
|
+
out.set(`cookie ${k.name}@${String(k.domain)}${String(k.path ?? "/")}`, k.value);
|
|
495
|
+
}
|
|
496
|
+
for (const x of Array.isArray(o.origins) ? o.origins : []) {
|
|
497
|
+
const origin = x;
|
|
498
|
+
for (const e of Array.isArray(origin.localStorage) ? origin.localStorage : []) {
|
|
499
|
+
const kv = e;
|
|
500
|
+
if (typeof kv.name === "string" && typeof kv.value === "string")
|
|
501
|
+
out.set(`local ${String(origin.origin)} ${kv.name}`, kv.value);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return out;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Writes the check's live session back over `file` when a value the file held changed or was
|
|
508
|
+
* removed during the check (a rotated refresh token). Untouched otherwise; never inside a repo's
|
|
509
|
+
* `.jevitate/`; best effort (the mission's own `sessionLost` warning still catches a lost session).
|
|
510
|
+
*/
|
|
511
|
+
async function keepRotatedSession(session, file) {
|
|
512
|
+
if (session.captureStorageState === undefined || sessionFileInProjectRefusal(file, "the storage state") !== undefined)
|
|
513
|
+
return;
|
|
514
|
+
try {
|
|
515
|
+
const before = sessionValues(readFileSync(file, "utf8"));
|
|
516
|
+
const live = await session.captureStorageState();
|
|
517
|
+
const after = sessionValues(live);
|
|
518
|
+
if (before === undefined || after === undefined)
|
|
519
|
+
return;
|
|
520
|
+
const rotated = [...before].some(([k, v]) => after.get(k) !== v);
|
|
521
|
+
if (rotated)
|
|
522
|
+
writeStorageStateFile(file, live);
|
|
523
|
+
}
|
|
524
|
+
catch {
|
|
525
|
+
// best effort: the state file is left as it was
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
/** The pre-flight: check the session; when it is expired and login parameters exist, re-mint once and re-check. */
|
|
529
|
+
export async function ensurePersonaSession(o) {
|
|
530
|
+
if (o.check.mode === "off")
|
|
531
|
+
return { ok: true, refreshed: false };
|
|
532
|
+
const who = o.persona === undefined ? "the session" : `persona ${o.persona}`;
|
|
533
|
+
let first;
|
|
534
|
+
if (existsSync(o.storageState)) {
|
|
535
|
+
first = await checkSession(o);
|
|
536
|
+
if (first.ok)
|
|
537
|
+
return { ok: true, refreshed: false };
|
|
538
|
+
}
|
|
539
|
+
const expired = first === undefined || first.ok ? `the storage state ${basename(o.storageState)} does not exist yet` : first.reason;
|
|
540
|
+
const landedUrl = first !== undefined && !first.ok ? first.landedUrl : undefined;
|
|
541
|
+
if (o.login === undefined)
|
|
542
|
+
return { ok: false, reason: expired, ...(landedUrl === undefined ? {} : { landedUrl }) };
|
|
543
|
+
try {
|
|
544
|
+
await mintStorageState({ login: o.login, save: o.storageState, allowlist: o.allowlist, env: o.env, port: o.port, ...(o.browser === undefined ? {} : { browser: o.browser }), timeoutMs: o.timeoutMs });
|
|
545
|
+
}
|
|
546
|
+
catch (err) {
|
|
547
|
+
if (!(err instanceof LoginFailedError) && !(err instanceof LoginArgsError))
|
|
548
|
+
throw err;
|
|
549
|
+
return { ok: false, reason: `${expired}; re-signing in ${who} failed: ${err.message}`, ...(landedUrl === undefined ? {} : { landedUrl }) };
|
|
550
|
+
}
|
|
551
|
+
o.note?.(`jevitate: ${who}: ${expired} — signed in again from its login parameters and saved ${basename(o.storageState)}\n`);
|
|
552
|
+
const second = await checkSession(o);
|
|
553
|
+
if (second.ok)
|
|
554
|
+
return { ok: true, refreshed: true };
|
|
555
|
+
return { ok: false, reason: `${second.reason} (even right after signing in again)`, landedUrl: second.landedUrl };
|
|
556
|
+
}
|
|
557
|
+
export function authExpiredResult(strategy, startUrl, failed, persona) {
|
|
558
|
+
const reason = `${persona === undefined ? "" : `persona ${persona}: `}${failed.reason} — the mission did not start (re-save the storage state with \`jevitate login\`, or give the persona login parameters to refresh it automatically)`;
|
|
559
|
+
return {
|
|
560
|
+
strategy,
|
|
561
|
+
outcome: "inconclusive",
|
|
562
|
+
missionOutcome: "inconclusive",
|
|
563
|
+
reason,
|
|
564
|
+
failure: { kind: "auth-expired", message: reason, ...(persona === undefined ? {} : { persona }) },
|
|
565
|
+
...(persona === undefined ? {} : { persona }),
|
|
566
|
+
startUrl: redactUrl(startUrl),
|
|
567
|
+
...(failed.landedUrl === undefined ? {} : { landedUrl: failed.landedUrl }),
|
|
568
|
+
exitCode: 2,
|
|
569
|
+
...(strategy === "goal" ? { goalOutcome: "inconclusive", goalReason: "broken-run" } : {}),
|
|
570
|
+
defects: [],
|
|
571
|
+
defectOutcome: { status: "none", byKind: {} },
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=persona-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona-login.js","sourceRoot":"","sources":["../src/persona-login.ts"],"names":[],"mappings":"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"}
|