@jevitate/cli 0.28.0 → 0.29.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.
Files changed (180) hide show
  1. package/README.md +1 -1
  2. package/dist/approval-provenance.d.ts +9 -1
  3. package/dist/approval-provenance.js +12 -4
  4. package/dist/approval-provenance.js.map +1 -1
  5. package/dist/author-journey-cli.js +1 -1
  6. package/dist/author-journey-cli.js.map +1 -1
  7. package/dist/bin.js +12663 -8284
  8. package/dist/bin.js.map +1 -1
  9. package/dist/build-info.generated.js +3 -3
  10. package/dist/catalog-analysis.js +3 -2
  11. package/dist/catalog-analysis.js.map +1 -1
  12. package/dist/catalog-bundle.js +2 -2
  13. package/dist/catalog-bundle.js.map +1 -1
  14. package/dist/check-plan.js +12 -0
  15. package/dist/check-plan.js.map +1 -1
  16. package/dist/demo-aspect-cli.d.ts +10 -0
  17. package/dist/demo-aspect-cli.js +4 -1
  18. package/dist/demo-aspect-cli.js.map +1 -1
  19. package/dist/engine.d.ts +8 -1
  20. package/dist/engine.js +16 -2
  21. package/dist/engine.js.map +1 -1
  22. package/dist/explore-adversarial.js +4 -0
  23. package/dist/explore-adversarial.js.map +1 -1
  24. package/dist/explore-cli/feature-strategy.js +1 -0
  25. package/dist/explore-cli/feature-strategy.js.map +1 -1
  26. package/dist/explore-cli/run.js +7 -0
  27. package/dist/explore-cli/run.js.map +1 -1
  28. package/dist/explore-feature.d.ts +2 -0
  29. package/dist/explore-feature.js +15 -8
  30. package/dist/explore-feature.js.map +1 -1
  31. package/dist/explore-goal.js +12 -0
  32. package/dist/explore-goal.js.map +1 -1
  33. package/dist/explore-specs.js +2 -2
  34. package/dist/explore-specs.js.map +1 -1
  35. package/dist/heal-probe-guard.d.ts +7 -3
  36. package/dist/heal-probe-guard.js +8 -2
  37. package/dist/heal-probe-guard.js.map +1 -1
  38. package/dist/http-probe.js +2 -2
  39. package/dist/http-probe.js.map +1 -1
  40. package/dist/journey-annotate-api.d.ts +5 -0
  41. package/dist/journey-annotate-api.js +49 -24
  42. package/dist/journey-annotate-api.js.map +1 -1
  43. package/dist/journey-annotate-cli.js +4 -1
  44. package/dist/journey-annotate-cli.js.map +1 -1
  45. package/dist/journey-api.d.ts +46 -7
  46. package/dist/journey-api.js +111 -43
  47. package/dist/journey-api.js.map +1 -1
  48. package/dist/journey-chain.d.ts +0 -6
  49. package/dist/journey-chain.js +36 -5
  50. package/dist/journey-chain.js.map +1 -1
  51. package/dist/journey-cli/chain.js +6 -0
  52. package/dist/journey-cli/chain.js.map +1 -1
  53. package/dist/journey-cli/lint.js +10 -3
  54. package/dist/journey-cli/lint.js.map +1 -1
  55. package/dist/journey-cli/run.js +39 -4
  56. package/dist/journey-cli/run.js.map +1 -1
  57. package/dist/journey-cli/verify.d.ts +8 -1
  58. package/dist/journey-cli/verify.js +111 -14
  59. package/dist/journey-cli/verify.js.map +1 -1
  60. package/dist/journey-cli-readiness.js +2 -0
  61. package/dist/journey-cli-readiness.js.map +1 -1
  62. package/dist/journey-demo-cli.js +2 -0
  63. package/dist/journey-demo-cli.js.map +1 -1
  64. package/dist/journey-network-checks.d.ts +4 -0
  65. package/dist/journey-network-checks.js +6 -2
  66. package/dist/journey-network-checks.js.map +1 -1
  67. package/dist/journey-prefix.d.ts +2 -0
  68. package/dist/journey-prefix.js +20 -1
  69. package/dist/journey-prefix.js.map +1 -1
  70. package/dist/journey-proof-context.d.ts +7 -1
  71. package/dist/journey-proof-context.js +19 -1
  72. package/dist/journey-proof-context.js.map +1 -1
  73. package/dist/journey-proof-waiver-cli.js +6 -3
  74. package/dist/journey-proof-waiver-cli.js.map +1 -1
  75. package/dist/journey-readiness.js +4 -0
  76. package/dist/journey-readiness.js.map +1 -1
  77. package/dist/journey-review-api.js +23 -0
  78. package/dist/journey-review-api.js.map +1 -1
  79. package/dist/journey-review.d.ts +30 -10
  80. package/dist/journey-review.js +33 -39
  81. package/dist/journey-review.js.map +1 -1
  82. package/dist/journey-run-record.d.ts +91 -0
  83. package/dist/journey-run-record.js +239 -0
  84. package/dist/journey-run-record.js.map +1 -0
  85. package/dist/journey-stale-api.d.ts +7 -0
  86. package/dist/journey-stale-api.js +50 -6
  87. package/dist/journey-stale-api.js.map +1 -1
  88. package/dist/journey-verify-checkpoint.d.ts +656 -0
  89. package/dist/journey-verify-checkpoint.js +923 -0
  90. package/dist/journey-verify-checkpoint.js.map +1 -0
  91. package/dist/journey-verify.d.ts +84 -3
  92. package/dist/journey-verify.js +1387 -110
  93. package/dist/journey-verify.js.map +1 -1
  94. package/dist/kill-signal.d.ts +24 -2
  95. package/dist/kill-signal.js +39 -11
  96. package/dist/kill-signal.js.map +1 -1
  97. package/dist/load-api.js +31 -2
  98. package/dist/load-api.js.map +1 -1
  99. package/dist/load-cli.js +6 -0
  100. package/dist/load-cli.js.map +1 -1
  101. package/dist/logs-retention.js +28 -3
  102. package/dist/logs-retention.js.map +1 -1
  103. package/dist/mask-values.d.ts +5 -0
  104. package/dist/mask-values.js +12 -0
  105. package/dist/mask-values.js.map +1 -0
  106. package/dist/mcp-api.d.ts +2 -0
  107. package/dist/mcp-api.js +19 -3
  108. package/dist/mcp-api.js.map +1 -1
  109. package/dist/mcp-cli-runner.d.ts +7 -1
  110. package/dist/mcp-cli-runner.js +30 -3
  111. package/dist/mcp-cli-runner.js.map +1 -1
  112. package/dist/mcp-cli-tools.d.ts +9 -1
  113. package/dist/mcp-cli-tools.js +29 -4
  114. package/dist/mcp-cli-tools.js.map +1 -1
  115. package/dist/mcp-paths.js +11 -0
  116. package/dist/mcp-paths.js.map +1 -1
  117. package/dist/mcp-run-guard.d.ts +79 -0
  118. package/dist/mcp-run-guard.js +371 -0
  119. package/dist/mcp-run-guard.js.map +1 -0
  120. package/dist/mcp-tools/cli.js +1 -1
  121. package/dist/mcp-tools/cli.js.map +1 -1
  122. package/dist/mcp-tools/findings.js +12 -1
  123. package/dist/mcp-tools/findings.js.map +1 -1
  124. package/dist/mcp-tools/journey.js +25 -8
  125. package/dist/mcp-tools/journey.js.map +1 -1
  126. package/dist/mission-fixtures.d.ts +3 -1
  127. package/dist/mission-fixtures.js +23 -6
  128. package/dist/mission-fixtures.js.map +1 -1
  129. package/dist/mutation-proof-policy.d.ts +2 -0
  130. package/dist/mutation-proof-policy.js +2 -2
  131. package/dist/mutation-proof-policy.js.map +1 -1
  132. package/dist/program.d.ts +6 -0
  133. package/dist/program.js +6 -9
  134. package/dist/program.js.map +1 -1
  135. package/dist/project-dir.d.ts +5 -1
  136. package/dist/project-dir.js +54 -5
  137. package/dist/project-dir.js.map +1 -1
  138. package/dist/readiness.js +3 -1
  139. package/dist/readiness.js.map +1 -1
  140. package/dist/regression-api.d.ts +5 -0
  141. package/dist/regression-api.js +17 -10
  142. package/dist/regression-api.js.map +1 -1
  143. package/dist/regression-cli.js +14 -1
  144. package/dist/regression-cli.js.map +1 -1
  145. package/dist/report-api.js +6 -0
  146. package/dist/report-api.js.map +1 -1
  147. package/dist/resource-preflight.d.ts +2 -1
  148. package/dist/resource-preflight.js +2 -1
  149. package/dist/resource-preflight.js.map +1 -1
  150. package/dist/secret-params.d.ts +82 -0
  151. package/dist/secret-params.js +234 -0
  152. package/dist/secret-params.js.map +1 -0
  153. package/dist/self-heal-adapter.d.ts +2 -2
  154. package/dist/self-heal-adapter.js +7 -9
  155. package/dist/self-heal-adapter.js.map +1 -1
  156. package/dist/source-cli.js +3 -1
  157. package/dist/source-cli.js.map +1 -1
  158. package/dist/source-run-api.d.ts +2 -0
  159. package/dist/source-run-api.js +21 -2
  160. package/dist/source-run-api.js.map +1 -1
  161. package/dist/target-config.d.ts +39 -0
  162. package/dist/target-config.js +76 -1
  163. package/dist/target-config.js.map +1 -1
  164. package/dist/terminal-result.d.ts +181 -0
  165. package/dist/terminal-result.js +609 -0
  166. package/dist/terminal-result.js.map +1 -0
  167. package/dist/usability-capture.js +2 -2
  168. package/dist/usability-capture.js.map +1 -1
  169. package/dist/ux-usability/hang.js +2 -0
  170. package/dist/ux-usability/hang.js.map +1 -1
  171. package/dist/ux-usability.js +6 -0
  172. package/dist/ux-usability.js.map +1 -1
  173. package/dist/verify-fix-api.d.ts +43 -0
  174. package/dist/verify-fix-api.js +138 -10
  175. package/dist/verify-fix-api.js.map +1 -1
  176. package/dist/verify-fix-cli.d.ts +6 -1
  177. package/dist/verify-fix-cli.js +65 -11
  178. package/dist/verify-fix-cli.js.map +1 -1
  179. package/package.json +9 -9
  180. package/skills/jevitate-run-journey/SKILL.md +23 -3
@@ -0,0 +1,609 @@
1
+ import { mkdirSync, writeSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { Command } from "commander";
4
+ import { isWeakSecret, redactCredentialShapes, redactText, redactUrl, REDACTION_MASK, SENSITIVE_URL_PARAMS } from "@jevitate/ai-core";
5
+ import { clock, MISSION_RESULT_SCHEMA_VERSION } from "@jevitate/domain";
6
+ import { terminateOwnBrowsersSync } from "@jevitate/playwright";
7
+ import { inMcpInvocation } from "./approval-provenance.js";
8
+ import { emitCommandResult } from "./cli-shared.js";
9
+ import { currentEngineInfo } from "./engine.js";
10
+ import { fail } from "./envelope.js";
11
+ import { EXIT_CODES, exitCodeForOutcome } from "./exit-codes.js";
12
+ import { installMissionKillSwitch, PARENT_GONE_HINT, setKillTerminalReporter } from "./kill-signal.js";
13
+ import { resultPathFor, writeMissionResult } from "./mission-journal.js";
14
+ import { currentRunMetadata } from "./run-metadata.js";
15
+ /** Steps of `RETRY_SLEEP_MS`: a reader that drains nothing for this long no longer holds up the exit. */
16
+ const WRITE_RETRIES = 200;
17
+ const RETRY_SLEEP_MS = 5;
18
+ const MAX_TIMER_MS = 2_147_483_647;
19
+ const MAX_CAUSE_DEPTH = 5;
20
+ /** A progress line is one short line: a caller may keep only the tail of its stderr. */
21
+ const MAX_PROGRESS_LINE = 200;
22
+ /** Writes all of `text` to `fd`, blocking. `writeSync` can write part of it, or throw EAGAIN on a full non-blocking pipe. */
23
+ function writeAllSync(fd, text) {
24
+ const bytes = Buffer.from(text, "utf8");
25
+ let offset = 0;
26
+ let retries = 0;
27
+ while (offset < bytes.length) {
28
+ try {
29
+ offset += writeSync(fd, bytes, offset);
30
+ }
31
+ catch (err) {
32
+ if (err.code !== "EAGAIN" || retries >= WRITE_RETRIES)
33
+ throw err;
34
+ retries += 1;
35
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, RETRY_SLEEP_MS);
36
+ }
37
+ }
38
+ }
39
+ const realDeps = {
40
+ exit: (code) => process.exit(code),
41
+ terminateBrowsers: () => {
42
+ terminateOwnBrowsersSync();
43
+ },
44
+ writeStdout: (text) => writeAllSync(1, text),
45
+ writeStderr: (text) => writeAllSync(2, text),
46
+ writeResult: (artifactPath, missionOutcome, exitCode, result, meta) => {
47
+ // A run can end before anything else created the folder.
48
+ mkdirSync(dirname(artifactPath), { recursive: true });
49
+ return writeMissionResult(artifactPath, missionOutcome, exitCode, result, undefined, meta);
50
+ },
51
+ engine: currentEngineInfo,
52
+ onFatalError: (listener) => {
53
+ process.on("uncaughtException", listener);
54
+ return () => process.off("uncaughtException", listener);
55
+ },
56
+ onProcessExit: (listener) => {
57
+ process.on("exit", listener);
58
+ return () => process.off("exit", listener);
59
+ },
60
+ installKillSwitch: installMissionKillSwitch,
61
+ sharedProcess: inMcpInvocation,
62
+ };
63
+ /** Newest last. A signal reports for the newest; a nested command never prints a second envelope. */
64
+ const active = [];
65
+ /** The process is ending and its one result was written. */
66
+ let terminated = false;
67
+ /** Secrets of commands that already completed: an error after their result is still theirs to redact. */
68
+ const completedSecrets = [];
69
+ let completedAny = false;
70
+ let removeReporter;
71
+ /** The listener for an uncaught error after the last command completed. */
72
+ let removeLateReporter;
73
+ /** What the kill switch calls on a signal; it does the teardown and the exit itself. */
74
+ function reportKill({ cause, exitCode }) {
75
+ const newest = active.at(-1);
76
+ if (newest === undefined)
77
+ return;
78
+ terminate(newest, cause === "parent-gone" ? { kind: "parent-gone", exitCode } : { kind: "signal", signal: cause, exitCode });
79
+ }
80
+ function release(command) {
81
+ if (command.timer !== undefined)
82
+ clock.clearTimeout(command.timer);
83
+ command.removeListeners?.();
84
+ }
85
+ /** A secret inside a longer one must not be masked first: that leaves the rest of the longer one readable. */
86
+ function longestFirst(secrets) {
87
+ return [...new Set(secrets)].filter((s) => typeof s === "string").sort((a, b) => b.length - a.length);
88
+ }
89
+ /** The name of a value that is itself a credential. `code` and `key` are too common as plain field names to be here. */
90
+ const CREDENTIAL_KEY = /^(?:sid|session|otp|jwt)$|(?:pass(?:word|wd|phrase|code)|pwd|secret|token|apikey|authorization|cookies?|sessionid|csrf|xsrf)$/;
91
+ /** Whether a field, header or parameter of this name holds a credential, however it is cased or separated. */
92
+ function isCredentialKey(name) {
93
+ return CREDENTIAL_KEY.test(name.toLowerCase().replace(/[-_.]/g, ""));
94
+ }
95
+ /** `key: "value"`, quoted or not, including JSON inside a string (`\\"password\\":\\"x\\"`): the value runs to its own closing quote. */
96
+ const QUOTED_FIELD = /(?<![\w-])((?:(?<!\\)\\*["'])?)([A-Za-z][\w-]*)\1\s*:\s*(\\*)(["'])((?:(?!\3\4)(?:\\.|[^\n\\]))*)\3\4/g;
97
+ /** `"set-cookie":[` : the opening of an array, whose values have no one shape. */
98
+ const ARRAY_FIELD = /(?<![\w-])((?:(?<!\\)\\*["'])?)([A-Za-z][\w-]*)\1\s*:\s*\[/g;
99
+ const NUMERIC_FIELD = /(?<![\w-])((?<!\\)\\*["'])([A-Za-z][\w-]*)\1\s*:\s*\d+/g;
100
+ /** `name=value` outside a URL's own query, where `redactUrl` stops: its separators, plus a quoted value. */
101
+ /** `Authorization=Bearer abc`: the scheme and its token are one value, and a space does not end it. */
102
+ const AUTHORIZATION_ASSIGNMENT = /(?<![\w.%-])((?:proxy-)?authorization)[ \t]*=[ \t]*(?!«)[^\r\n]*/gi;
103
+ const ASSIGNMENT = /(?<![\w.%-])([A-Za-z][\w.-]*)=("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|[^&;#\s"'<>]*)/g;
104
+ /** A header holds its credential to the end of the line (`Cookie: a=1; b=2`). A quoted value is QUOTED_FIELD's. */
105
+ const CREDENTIAL_HEADER = /(?<![\w-])((?:set-)?cookie|(?:proxy-)?authorization|x-api-key|x-auth-token|x-csrf-token)\s*:\s*(?!\\*["'])[^\r\n]*/gi;
106
+ const PASSWORD_FIELD = /(?<![\w-])(pass(?:word|wd|phrase|code)|pwd|secret|api[-_ ]?key)\s*:\s*(?!\\*["'«])\S+/gi;
107
+ /** `token: abc`: any credential name, unquoted, or with a quote the text was cut before closing. */
108
+ const UNQUOTED_FIELD = /(?<![\w.-])([A-Za-z][\w.-]*)[ \t]*:[ \t]*(?!\\*["']?«)\S+/g;
109
+ /** Too common in a sentence to mask after a word: `could not open a session: refused` names no credential. */
110
+ const PROSE_WORDS = /^(?:session|auth)$/i;
111
+ const BEARER = /\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi;
112
+ /**
113
+ * To the last `@`, as a password can hold `/` or `@`, or with no password at all. `host:3000/@fs/x` is a
114
+ * port and a path, not a password, so a value of port shape before the first `/`, `?` or `#` stays readable.
115
+ */
116
+ const URL_USERINFO = /(\/\/)(?:[^\s/@:"'<>]+:(?!\d{1,5}[/?#])[^\s"'<>]{0,1024}|[^\s/?#"'<>]*)@/g;
117
+ /** A URL carried inside another URL's parameter (`?next=https%3A%2F%2Fapp%3Ftoken%3Dabc`). */
118
+ const ENCODED_PARAM = /(%3F|%26|%23|%3B)([\w.-]+)%3D((?:(?!%26|%23|%3B)[^&;#\s"'<>])*)/gi;
119
+ /** A status or exit code, or a named constant: `code=` that is not a one-time code. */
120
+ const PLAIN_CODE_VALUE = /^(?:\d{1,3}|[A-Z][A-Z0-9_]*)$/;
121
+ /** A signed URL's parts, which `SENSITIVE_URL_PARAMS` does not name. `X-Amz-Date` and the like stay readable. */
122
+ const SIGNED_URL_PARAMS = new Set(["x-amz-signature", "x-amz-credential", "x-goog-signature", "x-goog-credential"]);
123
+ /**
124
+ * The longest text the masking rules run on. Their time grows with the length, and a page can choose
125
+ * the text, on the one thread that also answers a signal. Longer text is withheld whole, since cutting
126
+ * it could leave half a value for a rule to miss.
127
+ */
128
+ const MAX_MASKED_TEXT = 16 * 1024;
129
+ function isCredentialParam(name, value) {
130
+ const lower = name.toLowerCase();
131
+ if (lower === "code" && PLAIN_CODE_VALUE.test(value))
132
+ return false;
133
+ return SENSITIVE_URL_PARAMS.has(lower) || SIGNED_URL_PARAMS.has(lower) || isCredentialKey(name);
134
+ }
135
+ /** A credential-named array, to the end of its line: its values can hold anything that would end a shorter match. */
136
+ function maskCredentialArrays(text) {
137
+ let out = "";
138
+ let from = 0;
139
+ for (const m of text.matchAll(ARRAY_FIELD)) {
140
+ if (m.index < from || !isCredentialKey(m[2] ?? ""))
141
+ continue;
142
+ const end = /[\r\n]/.exec(text.slice(m.index))?.index;
143
+ out += `${text.slice(from, m.index)}${m[1]}${m[2]}${m[1]}: [${REDACTION_MASK}]`;
144
+ from = end === undefined ? text.length : m.index + end;
145
+ }
146
+ return out + text.slice(from);
147
+ }
148
+ /** What `redactUrl` does not reach: named credentials outside a URL query, and in headers, bodies and URL userinfo. */
149
+ function redactCredentialContext(text) {
150
+ return maskCredentialArrays(text)
151
+ .replace(QUOTED_FIELD, (whole, q, name, vq, quote) => isCredentialKey(name) ? `${q}${name}${q}: ${vq}${quote}${REDACTION_MASK}${vq}${quote}` : whole)
152
+ .replace(NUMERIC_FIELD, (whole, q, name) => (isCredentialKey(name) ? `${q}${name}${q}: ${REDACTION_MASK}` : whole))
153
+ .replace(AUTHORIZATION_ASSIGNMENT, (_whole, name) => `${name}=${REDACTION_MASK}`)
154
+ .replace(ASSIGNMENT, (whole, name, value) => (value !== "" && value !== REDACTION_MASK && isCredentialParam(name, value) ? `${name}=${REDACTION_MASK}` : whole))
155
+ .replace(CREDENTIAL_HEADER, (_whole, name) => `${name}: ${REDACTION_MASK}`)
156
+ .replace(PASSWORD_FIELD, (_whole, name) => `${name}: ${REDACTION_MASK}`)
157
+ .replace(UNQUOTED_FIELD, (whole, name, at, all) => {
158
+ const inProse = PROSE_WORDS.test(name) && /[A-Za-z] $/.test(all.slice(Math.max(0, at - 2), at));
159
+ return !inProse && (isCredentialKey(name) || PROSE_WORDS.test(name)) ? `${name}: ${REDACTION_MASK}` : whole;
160
+ })
161
+ .replace(BEARER, (_whole, word) => `${word} ${REDACTION_MASK}`)
162
+ .replace(URL_USERINFO, (_whole, slashes) => `${slashes}${REDACTION_MASK}@`)
163
+ .replace(ENCODED_PARAM, (whole, sep, name, value) => (value !== "" && isCredentialParam(name, value) ? `${sep}${name}%3D${REDACTION_MASK}` : whole));
164
+ }
165
+ /**
166
+ * The one rule for text leaving a command: registered secrets first and whole, so no part of one is
167
+ * left for a later rule to half-mask, then URL parameters, named credentials and credential shapes.
168
+ * Text past `MAX_MASKED_TEXT` once the secrets' masks are in is withheld whole.
169
+ */
170
+ export function redactSensitiveText(text, secrets) {
171
+ const withoutSecrets = redactText(text, longestFirst(secrets));
172
+ if (withoutSecrets.length > MAX_MASKED_TEXT)
173
+ return `${REDACTION_MASK} (${text.length} characters, too long to check)`;
174
+ return redactCredentialShapes(redactCredentialContext(redactUrl(withoutSecrets)));
175
+ }
176
+ /**
177
+ * A path this process wrote must still open: only a real secret is masked, never a shape (a video's
178
+ * file name is 32 hex digits) and never a short value (`--param dir=logs` is not `.jevitate/logs`).
179
+ */
180
+ export function redactSensitivePath(path, secrets) {
181
+ return redactText(path, longestFirst(secrets).filter((s) => !isWeakSecret(s)));
182
+ }
183
+ /**
184
+ * Every string VALUE in `value` through `redactSensitiveText`. A field named for a credential loses
185
+ * its whole value, whatever it looks like. `rule` exempts a caller's known fields. Keys are never
186
+ * touched: they are what a reader finds `exitCode` and `verdict` by, so a value that happens to equal
187
+ * one must not rename it. A map keyed by data has to reach here as text (see `buildDiagnostic`).
188
+ */
189
+ export function redactSensitiveValue(value, secrets, rule = () => undefined) {
190
+ const walk = (v, field) => {
191
+ if (typeof v === "string") {
192
+ if (field === "verbatim")
193
+ return v;
194
+ if (field === "path")
195
+ return redactSensitivePath(v, secrets);
196
+ return field === "credential" && v !== "" ? REDACTION_MASK : redactSensitiveText(v, secrets);
197
+ }
198
+ if (Array.isArray(v))
199
+ return v.map((item) => walk(item, field));
200
+ if (v !== null && typeof v === "object") {
201
+ return Object.fromEntries(Object.entries(v).map(([k, item]) => [k, walk(item, rule(k) ?? (field === "credential" || isCredentialKey(k) ? "credential" : undefined))]));
202
+ }
203
+ return v;
204
+ };
205
+ return walk(value, undefined);
206
+ }
207
+ /** `err` with its text redacted: the same object and class, so a caller's `instanceof` still decides. */
208
+ export function redactThrown(err, secrets, depth = 0) {
209
+ if (typeof err === "string")
210
+ return redactSensitiveText(err, secrets);
211
+ if (!(err instanceof Error))
212
+ return err;
213
+ err.message = redactSensitiveText(err.message, secrets);
214
+ if (err.stack !== undefined)
215
+ err.stack = redactSensitiveText(err.stack, secrets);
216
+ if (depth < MAX_CAUSE_DEPTH && err.cause !== undefined)
217
+ err.cause = redactThrown(err.cause, secrets, depth + 1);
218
+ return err;
219
+ }
220
+ function printable(value) {
221
+ if (typeof value === "string")
222
+ return value;
223
+ try {
224
+ return JSON.stringify(value) ?? String(value);
225
+ }
226
+ catch {
227
+ return "<unprintable>";
228
+ }
229
+ }
230
+ /**
231
+ * A thrown value as text. Only its text is carried: an error's own properties can hold anything. A
232
+ * thrown error may also hold a credential nobody registered, so its text gets the whole rule.
233
+ */
234
+ function describeError(err, secrets, depth = 0) {
235
+ const text = (s) => redactSensitiveText(s, secrets);
236
+ if (!(err instanceof Error))
237
+ return { message: text(printable(err)) };
238
+ const code = err.code;
239
+ return {
240
+ name: text(err.name),
241
+ message: text(err.message),
242
+ ...(err.stack === undefined ? {} : { stack: text(err.stack) }),
243
+ ...(typeof code === "string" ? { code: text(code) } : {}),
244
+ ...(err.cause === undefined || depth >= MAX_CAUSE_DEPTH ? {} : { cause: describeError(err.cause, secrets, depth + 1) }),
245
+ };
246
+ }
247
+ /** `replay 2, mutation drop-save, step 3`, or undefined when nothing was reported. */
248
+ function progressPhrase(p) {
249
+ const parts = [
250
+ p.phase,
251
+ p.replay === undefined ? undefined : `replay ${p.replay}`,
252
+ p.mutation === undefined ? undefined : `mutation ${p.mutation}`,
253
+ p.step === undefined ? undefined : `step ${p.step}`,
254
+ ].filter((part) => part !== undefined);
255
+ return parts.length === 0 ? undefined : parts.join(", ");
256
+ }
257
+ function headline(trigger, registration) {
258
+ switch (trigger.kind) {
259
+ case "signal":
260
+ return `interrupted by ${trigger.signal}`;
261
+ case "parent-gone":
262
+ return `the parent process went away, no signal was sent (${PARENT_GONE_HINT})`;
263
+ case "watchdog":
264
+ return `no progress for the ${registration.inactivityMs}ms inactivity limit`;
265
+ case "internal-error":
266
+ return "internal error";
267
+ case "unsettled-exit":
268
+ return "the process ended before the command produced a result";
269
+ }
270
+ }
271
+ const ERROR_CODES = {
272
+ signal: "E_TERMINAL_SIGNAL",
273
+ "parent-gone": "E_TERMINAL_PARENT_GONE",
274
+ watchdog: "E_TERMINAL_WATCHDOG",
275
+ "internal-error": "E_TERMINAL_INTERNAL",
276
+ "unsettled-exit": "E_TERMINAL_UNSETTLED",
277
+ };
278
+ /** What names the ending rather than describes it: a value equal to one of these must not rewrite it. */
279
+ const DIAGNOSTIC_VERBATIM_FIELDS = new Set(["command", "trigger", "signal"]);
280
+ /** `detail` is keyed by whatever the caller had to hand, so it is redacted as text: keys and values alike. */
281
+ function progressForDiagnostic({ detail, ...progress }) {
282
+ return detail === undefined ? progress : { ...progress, detail: JSON.stringify(detail) };
283
+ }
284
+ /** The redacted diagnostic. Throws only when caller-supplied values cannot be read or serialized. */
285
+ function buildDiagnostic(command, trigger, exitCode, secrets) {
286
+ const { progress, registration, startedMs } = command;
287
+ const error = trigger.kind === "internal-error" ? describeError(trigger.error, secrets) : undefined;
288
+ const where = progressPhrase(progress);
289
+ const reason = `${registration.command}: ${headline(trigger, registration)}${where === undefined ? " before any progress was reported" : ` at ${where}`}`;
290
+ const detail = error === undefined ? reason : `${reason}: ${printable(error["message"])}`;
291
+ return {
292
+ message: redactSensitiveText(detail, secrets),
293
+ // A JSON round trip first: a cycle or a BigInt throws here, inside the caller's guard, and a
294
+ // `toJSON` runs here rather than while the artifact is being written.
295
+ diagnostic: redactSensitiveValue(JSON.parse(JSON.stringify({
296
+ command: registration.command,
297
+ trigger: trigger.kind,
298
+ ...(trigger.kind === "signal" ? { signal: trigger.signal } : {}),
299
+ ...(trigger.kind === "watchdog" ? { inactivityMs: registration.inactivityMs } : {}),
300
+ elapsedMs: Math.round(clock.monotonicMs() - startedMs),
301
+ exitCode,
302
+ progress: progressForDiagnostic(progress),
303
+ ...(error === undefined ? {} : { error }),
304
+ })), secrets, (key) => (DIAGNOSTIC_VERBATIM_FIELDS.has(key) ? "verbatim" : undefined)),
305
+ };
306
+ }
307
+ /** Everything the layer can say with no caller-supplied text: what is left when that text is unusable. */
308
+ function bareDiagnostic(command, trigger, exitCode) {
309
+ return {
310
+ message: `${headline(trigger, command.registration)} (the diagnostic could not be built, so its details are withheld)`,
311
+ diagnostic: { trigger: trigger.kind, ...(trigger.kind === "signal" ? { signal: trigger.signal } : {}), exitCode, diagnosticWithheld: true },
312
+ };
313
+ }
314
+ function missionOutcomeOf(trigger) {
315
+ return trigger.kind === "internal-error" ? "crashed" : "inconclusive";
316
+ }
317
+ /** The first trigger's report, exit excluded. Never throws: nothing here may keep the process from exiting. */
318
+ function report(command, trigger) {
319
+ const { deps, registration } = command;
320
+ const missionOutcome = missionOutcomeOf(trigger);
321
+ const exitCode = trigger.kind === "signal" || trigger.kind === "parent-gone" ? trigger.exitCode : exitCodeForOutcome(missionOutcome);
322
+ const secrets = longestFirst(command.secrets);
323
+ let built;
324
+ try {
325
+ built = buildDiagnostic(command, trigger, exitCode, secrets);
326
+ }
327
+ catch {
328
+ built = bareDiagnostic(command, trigger, exitCode);
329
+ }
330
+ let resultPath;
331
+ let artifactError;
332
+ if (registration.artifactPath !== undefined) {
333
+ try {
334
+ let engine;
335
+ try {
336
+ engine = deps.engine();
337
+ }
338
+ catch {
339
+ engine = undefined; // A missing stamp must not cost the result.
340
+ }
341
+ resultPath = deps.writeResult(registration.artifactPath, missionOutcome, exitCode, {
342
+ schemaVersion: MISSION_RESULT_SCHEMA_VERSION,
343
+ outcome: missionOutcome,
344
+ missionOutcome,
345
+ reason: built.message,
346
+ stop: trigger.kind === "signal" || trigger.kind === "parent-gone" ? "terminated" : trigger.kind,
347
+ exitCode,
348
+ defects: [],
349
+ defectOutcome: { status: "none", byKind: {} },
350
+ hangs: [],
351
+ recordingPaths: [],
352
+ resultPath: redactSensitivePath(resultPathFor(registration.artifactPath), secrets),
353
+ ...(engine === undefined ? {} : { engine }),
354
+ diagnostic: built.diagnostic,
355
+ }, command.meta);
356
+ }
357
+ catch (err) {
358
+ artifactError = redactSensitiveText(printable(err instanceof Error ? err.message : err), secrets);
359
+ }
360
+ }
361
+ const shownPath = resultPath === undefined ? undefined : redactSensitivePath(resultPath, secrets);
362
+ const envelope = {
363
+ ...fail(ERROR_CODES[trigger.kind], shownPath === undefined ? built.message : `${built.message} (result: ${shownPath})`),
364
+ data: {
365
+ ...built.diagnostic,
366
+ ...(shownPath === undefined ? {} : { resultPath: shownPath }),
367
+ ...(artifactError === undefined ? {} : { artifactError }),
368
+ },
369
+ };
370
+ try {
371
+ emitCommandResult(command.output, envelope, { json: registration.json, exitCode, command: registration.command });
372
+ }
373
+ catch {
374
+ // Best-effort: stdout may already be gone (a closed pipe). The artifact above still stands.
375
+ process.exitCode = exitCode;
376
+ }
377
+ return exitCode;
378
+ }
379
+ /** Runs `trigger` once per process. Returns the exit code, or undefined when a result already went out. */
380
+ function terminate(command, trigger) {
381
+ if (terminated)
382
+ return undefined;
383
+ terminated = true;
384
+ for (const c of active)
385
+ release(c);
386
+ active.length = 0;
387
+ return report(command, trigger);
388
+ }
389
+ /** A trigger this layer ends itself; the kill switch does the same on the signal path. */
390
+ function terminateAndExit(command, trigger) {
391
+ const exitCode = terminate(command, trigger);
392
+ if (exitCode === undefined)
393
+ return;
394
+ try {
395
+ command.deps.terminateBrowsers();
396
+ }
397
+ catch {
398
+ // Best-effort, like the kill switch's teardown: it must never keep the process from exiting.
399
+ }
400
+ command.deps.exit(exitCode);
401
+ }
402
+ /** (Re)starts the command's inactivity limit. */
403
+ function armInactivity(command) {
404
+ if (command.timer !== undefined)
405
+ clock.clearTimeout(command.timer);
406
+ // Unref'd: this timer alone must not hold a finished process open. If the event loop drains, the
407
+ // exit listener reports it at once.
408
+ command.timer = clock.setTimeout(() => terminateAndExit(command, { kind: "watchdog" }), command.registration.inactivityMs);
409
+ command.timer.unref();
410
+ }
411
+ /** All redaction first: cutting or rewriting the text before it could leave part of a secret readable. */
412
+ function progressLine(command) {
413
+ const { progress, registration, secrets, startedMs } = command;
414
+ const elapsedS = Math.round((clock.monotonicMs() - startedMs) / 1_000);
415
+ const raw = `progress ${registration.command}: ${progressPhrase(progress) ?? "running"} (${elapsedS}s)`;
416
+ const redacted = redactSensitiveText(raw, secrets);
417
+ return `${redacted.replace(/[\u0000-\u001f\u007f]+/g, " ").slice(0, MAX_PROGRESS_LINE)}\n`;
418
+ }
419
+ /** Nothing here may reach the run: a stderr that refuses a line ends the printing, and only that. */
420
+ function printProgress(command) {
421
+ if (command.progressSilenced)
422
+ return;
423
+ try {
424
+ command.deps.writeStderr(progressLine(command));
425
+ }
426
+ catch {
427
+ command.progressSilenced = true;
428
+ }
429
+ }
430
+ /** The handle inside a shared process: see this module's doc. */
431
+ function sharedProcessHandle(registration) {
432
+ const secrets = [...registration.secrets];
433
+ return {
434
+ progress: () => { },
435
+ addSecrets: (values) => {
436
+ secrets.push(...values);
437
+ },
438
+ fail: (err) => {
439
+ throw new Error(printable(describeError(err, secrets)["message"]));
440
+ },
441
+ complete: () => { },
442
+ };
443
+ }
444
+ /**
445
+ * An uncaught error once every command has completed (a late teardown failure, say). Node's own
446
+ * printer would show the raw stack and replace the code with 1, so this reports it redacted and ends
447
+ * the process as the command said it should. Listening means Node no longer ends it, so this must.
448
+ */
449
+ function reportLateError(err, deps) {
450
+ try {
451
+ const raw = err instanceof Error ? (err.stack ?? String(err)) : printable(err);
452
+ deps.writeStderr(`${redactSensitiveText(raw, completedSecrets)}\n`);
453
+ }
454
+ catch {
455
+ // Best-effort: stderr may already be gone. The exit below still stands.
456
+ }
457
+ try {
458
+ deps.terminateBrowsers();
459
+ }
460
+ catch {
461
+ // Best-effort, as in terminateAndExit.
462
+ }
463
+ deps.exit(Number(process.exitCode ?? EXIT_CODES.inconclusive));
464
+ }
465
+ /**
466
+ * Registers how a long-running command produces its terminal result. Call it before the command's
467
+ * first browser launch, and keep the returned handle for the run. See this module's doc for what ends
468
+ * a command, and for the synchronous contract everything reachable from a trigger keeps.
469
+ *
470
+ * Throws a `RangeError` on an unusable `inactivityMs`: a command never runs without its bound.
471
+ */
472
+ export function registerTerminalResult(registration, deps = realDeps) {
473
+ if (!Number.isInteger(registration.inactivityMs) || registration.inactivityMs <= 0 || registration.inactivityMs > MAX_TIMER_MS) {
474
+ throw new RangeError(`inactivityMs must be a positive integer of at most ${MAX_TIMER_MS}, got ${registration.inactivityMs}`);
475
+ }
476
+ if (deps.sharedProcess())
477
+ return sharedProcessHandle(registration);
478
+ removeLateReporter?.();
479
+ removeLateReporter = undefined;
480
+ // Only a fake `exit` can get here with a finished process behind it (a later test in one worker).
481
+ if (active.length === 0)
482
+ terminated = false;
483
+ deps.installKillSwitch();
484
+ const command = {
485
+ registration,
486
+ deps,
487
+ output: new Command().configureOutput({ writeOut: deps.writeStdout, writeErr: deps.writeStderr }),
488
+ meta: currentRunMetadata(),
489
+ startedMs: clock.monotonicMs(),
490
+ secrets: [...registration.secrets],
491
+ progress: registration.progress ?? {},
492
+ progressSilenced: false,
493
+ };
494
+ active.push(command);
495
+ removeReporter = setKillTerminalReporter(reportKill);
496
+ const removeFatal = deps.onFatalError((err) => terminateAndExit(command, { kind: "internal-error", error: err }));
497
+ const removeExit = deps.onProcessExit(() => {
498
+ // The process is already ending: only the report and the teardown are left to do.
499
+ const exitCode = terminate(command, { kind: "unsettled-exit" });
500
+ if (exitCode === undefined)
501
+ return;
502
+ try {
503
+ deps.terminateBrowsers();
504
+ }
505
+ catch {
506
+ // Best-effort, as in terminateAndExit.
507
+ }
508
+ });
509
+ command.removeListeners = () => {
510
+ removeFatal();
511
+ removeExit();
512
+ };
513
+ armInactivity(command);
514
+ const settled = () => !active.includes(command);
515
+ return {
516
+ progress: (update) => {
517
+ if (settled())
518
+ return;
519
+ command.progress = { ...command.progress, ...update };
520
+ // Any command's progress shows the process is working, and an outer command waits on the inner.
521
+ for (const c of active)
522
+ armInactivity(c);
523
+ printProgress(command);
524
+ },
525
+ addSecrets: (values) => {
526
+ command.secrets.push(...values);
527
+ },
528
+ fail: (err) => {
529
+ if (!settled())
530
+ terminateAndExit(command, { kind: "internal-error", error: err });
531
+ },
532
+ complete: () => {
533
+ if (settled())
534
+ return;
535
+ active.splice(active.indexOf(command), 1);
536
+ release(command);
537
+ completedAny = true;
538
+ completedSecrets.push(...command.secrets);
539
+ if (active.length === 0) {
540
+ removeReporter?.();
541
+ removeReporter = undefined;
542
+ removeLateReporter = deps.onFatalError((err) => reportLateError(err, deps));
543
+ }
544
+ },
545
+ };
546
+ }
547
+ /**
548
+ * What an EPIPE on an output stream means. A closed reader is not a verdict, and exit 0 here once
549
+ * reported `still-reproduces` as a pass, so:
550
+ *
551
+ * - stderr: nothing. It carries progress and diagnostics, and `2>&1 | head` must not end a proof.
552
+ * - stdout, a registered command still running: nothing. It goes on to its real result and exit code.
553
+ * - stdout otherwise: the process exits quietly (#213) with whatever `process.exitCode` the command
554
+ * set, 0 when it set none. `emitEnvelope` writes before it sets the code, but a stream reports
555
+ * the error on a later tick than the write, so the code is set by the time this runs. And a
556
+ * registered command calls `complete()` in that same turn, so if the error ever came first, the
557
+ * "still running" rule above would keep its code.
558
+ *
559
+ * `process.exit()` takes no code on purpose: it keeps the one the command set.
560
+ */
561
+ export function installBrokenPipePolicy(streams = process, exit = () => process.exit()) {
562
+ const rethrowUnlessEpipe = (err) => {
563
+ if (err.code !== "EPIPE")
564
+ throw err;
565
+ };
566
+ streams.stderr.on("error", rethrowUnlessEpipe);
567
+ streams.stdout.on("error", (err) => {
568
+ rethrowUnlessEpipe(err);
569
+ if (active.length === 0)
570
+ exit();
571
+ });
572
+ }
573
+ /**
574
+ * A command's promise rejected up to the entry point. With a command registered in this process the
575
+ * layer handles it, so its secrets are redacted: a running one gets the usual E_TERMINAL_INTERNAL
576
+ * ending, and a completed one (its result already out, so no second envelope) a redacted stderr line
577
+ * and exit 2. Returns false when nothing was registered: the caller reports it itself.
578
+ */
579
+ export function reportCommandRejection(err, writeStderr = realDeps.writeStderr) {
580
+ const newest = active.at(-1);
581
+ if (newest !== undefined) {
582
+ terminateAndExit(newest, { kind: "internal-error", error: err });
583
+ return true;
584
+ }
585
+ if (!completedAny)
586
+ return false;
587
+ process.exitCode = EXIT_CODES.inconclusive;
588
+ try {
589
+ writeStderr(`${redactSensitiveText(String(err), completedSecrets)}\n`);
590
+ }
591
+ catch {
592
+ // Best-effort: stderr may already be gone. The exit code above still stands.
593
+ }
594
+ return true;
595
+ }
596
+ /** Test seam: resets all module state (a real run never needs this: one process, one exit). */
597
+ export function __resetTerminalResultForTests() {
598
+ for (const c of active)
599
+ release(c);
600
+ active.length = 0;
601
+ terminated = false;
602
+ completedAny = false;
603
+ completedSecrets.length = 0;
604
+ removeReporter?.();
605
+ removeReporter = undefined;
606
+ removeLateReporter?.();
607
+ removeLateReporter = undefined;
608
+ }
609
+ //# sourceMappingURL=terminal-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-result.js","sourceRoot":"","sources":["../src/terminal-result.ts"],"names":[],"mappings":"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"}