@molecule/api-ai-tools 1.9.18 → 1.9.19

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.
@@ -108,17 +108,48 @@ export function namesSuiteConfig(command) {
108
108
  export function withSuiteConfig(command, config) {
109
109
  if (!config)
110
110
  return command;
111
- const at = command.search(/\bplaywright\s+test\b/);
112
- if (at === -1)
111
+ const run = playwrightStatement(command);
112
+ if (run === null)
113
113
  return command;
114
- const head = command.slice(0, at);
115
- const rest = command.slice(at);
116
- const end = rest.search(/&&|\|\||;|\|/);
117
- const statement = end === -1 ? rest : rest.slice(0, end);
118
- const tail = end === -1 ? '' : rest.slice(end);
119
- if (namesSuiteConfig(statement))
114
+ if (namesSuiteConfig(command.slice(run.start, run.end)))
120
115
  return command;
121
- return `${head}${statement.replace(/^(playwright\s+test)\b/, `$1 --config ${shellQuote(config)}`)}${tail}`;
116
+ // Right after the runner's own words (`playwright test <here>`), so a launcher in front of
117
+ // them — `npx --no-install`, `node <path>/playwright` — is untouched and the flag is the
118
+ // runner's own argument wherever it sits.
119
+ return `${command.slice(0, run.afterRunner)} --config ${shellQuote(config)}${command.slice(run.afterRunner)}`;
120
+ }
121
+ /**
122
+ * A redirect that names a FILE for a stream whose target a re-run would destroy: `> f`, `>> f`,
123
+ * `1> f`, `&> f`. `2>` is stderr and deliberately not matched; a descriptor duplication
124
+ * (`2>&1`, `>&2`) has no file target and does not match either, because `&` cannot start one.
125
+ */
126
+ const FILE_REDIRECT = /(^|\s)(&>>?|1?>>?)(\s*)(?:'([^']+)'|"([^"]+)"|([^\s;&|]+))/g;
127
+ /** A target that is not a log anyone could lose: rewriting it would CREATE a file. */
128
+ const DEVICE_TARGET = /^\/dev\//;
129
+ /**
130
+ * The command with every file redirect pointed at a fresh file beside its original target
131
+ * (`/tmp/pw-full.log` → `/tmp/pw-full.rerun.log`), and nothing else changed.
132
+ *
133
+ * A re-run composed from a run's own command keeps the run's redirect by construction, and the
134
+ * run wrote the walk's only report to that file: xr-molecule-flash-m173 handed over *"Send this
135
+ * once the run ends: … npx playwright test …/articles.spec.ts:32 --retries=0 … > /tmp/pw-full.log
136
+ * 2>&1"* — the ONE narrowed re-run that was about to check the fixes would have overwritten the
137
+ * full walk's log, destroying the other 11 failures' error reports. Following the platform's own
138
+ * advice must never destroy the evidence it was based on.
139
+ *
140
+ * @param command - A shell command.
141
+ * @returns The command whose file redirects write to a fresh target.
142
+ */
143
+ function redirectToFreshFile(command) {
144
+ return command.replace(FILE_REDIRECT, (whole, before, op, space, single, double, bare) => {
145
+ const target = single ?? double ?? bare ?? '';
146
+ // `/dev/null` and friends are not a report to preserve; leaving them keeps the re-run silent
147
+ // the way the run was, where rewriting them would create a file nobody asked for.
148
+ if (!target || DEVICE_TARGET.test(target))
149
+ return whole;
150
+ const quote = single !== undefined ? "'" : double !== undefined ? '"' : '';
151
+ return `${before}${op}${space}${quote}${target}.rerun.log${quote}`;
152
+ });
122
153
  }
123
154
  /**
124
155
  * The whole-suite command made scoped to the tests it should re-run instead: the same
@@ -126,6 +157,10 @@ export function withSuiteConfig(command, config) {
126
157
  * suite, `--last-failed` dropped (it re-runs the tests that never ran too, X1 flash-m60) and
127
158
  * `--retries=0` set (a re-run of a known failure does not need to pay for retries).
128
159
  *
160
+ * The re-run keeps the run's `> <file>` redirect only in the sense of keeping its OUTPUT there:
161
+ * the target is rewritten to a fresh sibling ({@link redirectToFreshFile}), so a re-run never
162
+ * overwrites the log the run itself is the evidence for (xr-molecule-flash-m173).
163
+ *
129
164
  * `config` is the config the run was measured under ({@link withSuiteConfig}): the narrowed re-run
130
165
  * carries it whenever the command itself does not, so a run that dropped `--config` cannot be
131
166
  * handed back a command with the same defect (xr-molecule-flash-m113: every failing test was
@@ -147,16 +182,17 @@ export function withSuiteConfig(command, config) {
147
182
  * @returns The scoped command, or the command unchanged when it runs no Playwright suite.
148
183
  */
149
184
  export function scopedRerunCommand(command, locations, excluded = [], config, cwd) {
150
- const at = command.search(/\bplaywright\s+test\b/);
151
- if (at === -1)
185
+ const run = playwrightStatement(command);
186
+ if (run === null)
152
187
  return command;
153
- const head = command.slice(0, at);
154
- const rest = command.slice(at);
155
188
  // Only the first statement runs the suite; the rest (`| tail -50`, `&& echo done`)
156
189
  // is left exactly as it was.
157
- const end = rest.search(/&&|\|\||;|\|/);
158
- const statement = end === -1 ? rest : rest.slice(0, end);
159
- const tail = end === -1 ? '' : rest.slice(end);
190
+ const statement = command.slice(run.start, run.end);
191
+ const tail = command.slice(run.end);
192
+ // The arguments after the runner's own words (`playwright test`), where the narrowed re-run
193
+ // writes its locations — the launcher in front of them (`npx --no-install`, `node
194
+ // <path>/playwright`) is not part of the arguments.
195
+ const args = command.slice(run.afterRunner, run.end);
160
196
  // One literal alternation, regex-escaped and shell-quoted: a title carries parentheses and
161
197
  // quotes (`should only allow comment author to delete`) that are regex and shell syntax alike.
162
198
  const invert = excluded.length > 0 && !/--grep-invert\b/.test(command)
@@ -176,16 +212,18 @@ export function scopedRerunCommand(command, locations, excluded = [], config, cw
176
212
  // nothing — "No tests found" — so every location is rendered in a form Playwright can match
177
213
  // ({@link playwrightLocations}).
178
214
  const narrowed = playwrightLocations(locations, command, cwd);
179
- const scoped = dropSupersededSpecFiles(statement, narrowed)
215
+ const dropped = dropSupersededSpecFiles(args, narrowed)
180
216
  .replace(/\s*--last-failed\b/g, '')
181
- .replace(/\s*--retries(?:[= ]\d+)?/g, '')
182
- .replace(/^(playwright\s+test)\b/, `$1 ${narrowed.join(' ')} --retries=0${carry}${invert}`);
217
+ .replace(/\s*--retries(?:[= ]\d+)?/g, '');
218
+ const scoped = command.slice(0, run.afterRunner) +
219
+ ` ${narrowed.join(' ')} --retries=0${carry}${invert}` +
220
+ dropped;
183
221
  // A command that starts the suite AGAIN after this statement is a chain of walks, not a re-run:
184
222
  // everything from the next suite runner on is dropped, so the composed command carries ONE walk.
185
223
  // X1 xr-molecule-flash-m157 (+14:02) was handed a re-run that still carried the chain's second
186
224
  // whole walk — 4.5 minutes measuring code it had not changed.
187
225
  const rerunTail = suiteRunStatements(tail).length > 0 ? '' : tail;
188
- return `${head}${scoped}${rerunTail}`;
226
+ return `${redirectToFreshFile(scoped)}${redirectToFreshFile(rerunTail)}`;
189
227
  }
190
228
  /** A directory a `cd` can name literally: no `~`, no variable, no glob. */
191
229
  const LITERAL_DIR = /^[A-Za-z0-9_./+-]+$/;
@@ -267,7 +305,8 @@ function playwrightLocations(locations, command, cwd) {
267
305
  /** A spec-file argument Playwright accepts as its positional filter — never a flag. */
268
306
  const SPEC_FILE_ARGUMENT = /^(?!-)[^\s]*\.(?:spec|test)\.[cm]?[jt]sx?(?::\d+(?::\d+)?)?$/;
269
307
  /**
270
- * The statement with every bare spec-file argument taken out once the re-run names failure locations.
308
+ * The runner's own arguments with every bare spec-file argument taken out once the re-run names
309
+ * failure locations.
271
310
  *
272
311
  * The re-run is "just these": Playwright matches each positional argument against every collected
273
312
  * file's path, so a bare file left beside the `file:line`s re-admits ALL of that file's tests.
@@ -276,23 +315,20 @@ const SPEC_FILE_ARGUMENT = /^(?!-)[^\s]*\.(?:spec|test)\.[cm]?[jt]sx?(?::\d+(?::
276
315
  * failures sat in two of them — 32 tests, ~3 min, instead of the 8 failures' ~30 s. A file with no
277
316
  * failure in it has nothing to re-run, so it goes too.
278
317
  *
279
- * @param statement - The Playwright statement, starting at its own `playwright test`.
318
+ * The launcher's words are not arguments and are not here: the caller passes what follows
319
+ * `playwright test` ({@link playwrightStatement}'s `afterRunner`), so `node <path>/playwright
320
+ * test` and `npx playwright test` lose the same spec files.
321
+ *
322
+ * @param args - The run's own arguments, after `playwright test`.
280
323
  * @param locations - The failing `file:line`s the re-run names.
281
- * @returns The statement without its bare spec-file arguments.
324
+ * @returns The arguments without their bare spec-file arguments.
282
325
  */
283
- function dropSupersededSpecFiles(statement, locations) {
326
+ function dropSupersededSpecFiles(args, locations) {
284
327
  if (locations.length === 0)
285
- return statement;
286
- const runner = /^(playwright\s+test)\b/.exec(statement);
287
- if (runner === null)
288
- return statement;
289
- const head = runner[1];
290
- const kept = statement
291
- .slice(head.length)
292
- .replace(/(^|\s+)([^\s]+)(?=\s|$)/g, (whole, _space, token) => {
328
+ return args;
329
+ return args.replace(/(^|\s+)([^\s]+)(?=\s|$)/g, (whole, _space, token) => {
293
330
  return SPEC_FILE_ARGUMENT.test(token) ? '' : whole;
294
331
  });
295
- return `${head}${kept}`;
296
332
  }
297
333
  /**
298
334
  * The run in flight that makes a second run a hazard, or null when nothing is in the way.
@@ -320,6 +356,43 @@ export function suiteRunInTheWay(candidate, inFlight) {
320
356
  * closing quote is that echo. A version-pinned `playwright@1.44.0 test` is the same run.
321
357
  */
322
358
  const PLAYWRIGHT_RUN = /^(?:@playwright\/test|playwright)(?:@\S+)?\s+test(?=\s|$)/;
359
+ /**
360
+ * The statement of a command that runs `playwright test`, and where its own arguments begin.
361
+ *
362
+ * Both rewrites that compose a command ({@link withSuiteConfig}, {@link scopedRerunCommand}) read
363
+ * the run through the shared shell parse — the same answer every classifier gets — instead of
364
+ * searching the text for `playwright test`. The search missed the runner reached by file (`node
365
+ * <path>/@playwright/test/cli.js test`, xr-molecule-flash-m179), so a narrowed re-run of that run
366
+ * silently stayed the whole suite.
367
+ *
368
+ * `afterRunner` is the offset just past the runner's own words (`playwright test`): the
369
+ * sub-command is the word after the program word, wherever the program word is (the script path
370
+ * behind `node`, the name itself otherwise), so an option written there is the run's own.
371
+ *
372
+ * @param command - The shell command.
373
+ * @returns The statement's span and its argument offset, or null when no statement runs the suite.
374
+ */
375
+ function playwrightStatement(command) {
376
+ for (const located of locatedCommandSegments(command)) {
377
+ const segment = located.segment;
378
+ if (!segment || !PLAYWRIGHT_RUN.test(segment.text))
379
+ continue;
380
+ // A statement inside a nested `sh -c '<command>'` has no offsets here: its positions are
381
+ // positions in that string, so nothing may be spliced at them.
382
+ if (located.start === null || located.end === null || located.programOffset === null)
383
+ return null;
384
+ const words = [...command.slice(located.programOffset).matchAll(/\S+/g)];
385
+ const subcommand = words[1];
386
+ if (subcommand === undefined)
387
+ return null;
388
+ return {
389
+ start: located.start,
390
+ end: located.end,
391
+ afterRunner: located.programOffset + (subcommand.index ?? 0) + subcommand[0].length,
392
+ };
393
+ }
394
+ return null;
395
+ }
323
396
  /**
324
397
  * What narrows a Playwright run to a part of the suite: a named file or line, a title filter, or
325
398
  * the tests the run before it printed (`--last-failed`, `--only-changed`).
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAwJ9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAahG;AAiSD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAoFnE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAEA,CAAA;AAE9B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB,QAI6C,CAAA;AAmBlF;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUhE;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAoBpF;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,CAAC,GACxE,qBAAqB,CAkBvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,qBAAqB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiCxB;AA2GD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CA8pFxF"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAsK9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAahG;AAiSD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAqFnE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAEA,CAAA;AAE9B;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB,QAI6C,CAAA;AAmBlF;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUhE;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAA;AAoBpF;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,GAAG,SAAS,CAAC,GACxE,qBAAqB,CAkBvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,qBAAqB,GAC5B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiCxB;AA2GD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CAurFxF"}
package/dist/tools.js CHANGED
@@ -31,6 +31,19 @@ const waitedByTask = new Map();
31
31
  const logBytesByTask = new Map();
32
32
  /** The file a background command writes its own output to, when it redirects it. */
33
33
  const outputFileByTask = new Map();
34
+ /**
35
+ * Task ids whose launch put the suite on {@link PLAYWRIGHT_FAILURES_INLINE_ENV} — the inline
36
+ * failure switch, announced by the launch's own change list and written as an `export` at the
37
+ * head of the command.
38
+ *
39
+ * The wait note may promise that each failure's own error sits under its ✘ line only when the run
40
+ * was actually given the switch: a run whose shape withheld the rewrite prints its failures only
41
+ * in the end-of-run summary, and the note that promised inline reports sent the model grepping a
42
+ * file they were not in (the m99 class, recurring at xr-molecule-flash-m173 +17:07, +39:14).
43
+ * Process memory, like {@link outputFileByTask}: a task this process did not launch recovers it
44
+ * from the script on disk, which carries the rewritten command.
45
+ */
46
+ const inlineFailuresByTask = new Set();
34
47
  /**
35
48
  * How each background task was started: the command as it was actually run (after
36
49
  * {@link streamingBackgroundCommand} rewrote it) and the directory it ran in.
@@ -422,7 +435,7 @@ async function backgroundTaskState(backend, command, seconds, ceilingMs) {
422
435
  }
423
436
  import { suiteCommandTarget } from './suite-overlap.js';
424
437
  import { diagnosisTraceCommand } from './trace-artifacts.js';
425
- import { checkBlockedCommand, declaredBudgetSeconds, DEFAULT_SEARCH_EXCLUDED_DIRS, directoryReadHint, earlyReturnCause, emptyCallError, failureCausesNote, findPathArgs, findPatternArgs, fusedLine, htmlOutline, isCommandTimeout, isEnvFilePath, isOutsideRoot, isPlaywrightRunCommand, isSuiteRunCommand, isValidGlob, linesWithinSerialized, literalDirPrefix, MAX_BATCH_READ_FILES, MAX_FIND_RESULTS, MAX_HTML_INLINE_CHARS, MAX_OUTPUT_SIZE, MAX_READ_CALL_CHARS, MAX_READ_RETURN_CHARS, MAX_READ_SIZE, MAX_SEARCH_CONTEXT_LINES, MAX_SEARCH_RESULTS, MAX_WRITE_SIZE, outputIsWithheldUntilExit, outputRedirectTarget, parseCheckCommand, parseCheckProblem, pathArgError, printsOnlySource, READ_RESULT_ENVELOPE_CHARS, redactSecrets, redactSecretsInCode, repeatedSuiteRunError, repeatingFailure, repeatingFailureNote, resolvePath, RUNNING_FAILURE_LINES, runningCauseCommand, runningOutputSliceCommand, searchTimeoutError, serializedChars, shellQuote, sliceLines, SMALL_FILE_WHOLE_CHARS, streamingBackgroundCommand, stripControlChars, suiteRunBudgetCommand, suiteRunPipelinePlacement, suiteRunPriorityLaunch, TOOL_RESULT_CHARS, truncateMiddle, universalCause, whitespaceTolerantReplace, withoutSuiteTimeout, } from './utilities.js';
438
+ import { checkBlockedCommand, declaredBudgetSeconds, DEFAULT_SEARCH_EXCLUDED_DIRS, directoryReadHint, earlyReturnCause, emptyCallError, failureCausesNote, findPathArgs, findPatternArgs, fusedLine, htmlOutline, isCommandTimeout, isEnvFilePath, isOutsideRoot, isPlaywrightRunCommand, isSuiteRunCommand, isValidGlob, linesWithinSerialized, literalDirPrefix, MAX_BATCH_READ_FILES, MAX_FIND_RESULTS, MAX_HTML_INLINE_CHARS, MAX_OUTPUT_SIZE, MAX_READ_CALL_CHARS, MAX_READ_RETURN_CHARS, MAX_READ_SIZE, MAX_SEARCH_CONTEXT_LINES, MAX_SEARCH_RESULTS, MAX_WRITE_SIZE, outputIsWithheldUntilExit, outputRedirectTarget, parseCheckCommand, parseCheckProblem, pathArgError, PLAYWRIGHT_FAILURES_INLINE_ENV, printsOnlySource, READ_RESULT_ENVELOPE_CHARS, redactSecrets, redactSecretsInCode, repeatedSuiteRunError, repeatingFailure, repeatingFailureNote, resolvePath, RUNNING_FAILURE_LINES, runningCauseCommand, runningOutputSliceCommand, searchTimeoutError, serializedChars, shellQuote, sliceLines, SMALL_FILE_WHOLE_CHARS, streamingBackgroundCommand, stripControlChars, suiteRunBudgetCommand, suiteRunPipelinePlacement, suiteRunPriorityLaunch, TOOL_RESULT_CHARS, truncateMiddle, universalCause, whitespaceTolerantReplace, withoutSuiteTimeout, } from './utilities.js';
426
439
  /**
427
440
  * How long exec_command waits for a command it backgrounded only because the
428
441
  * command asked for more than the tool's ceiling, before handing back a task id.
@@ -2445,6 +2458,10 @@ export function buildTools(backend, config) {
2445
2458
  const ownFile = ownTarget === null ? null : posix.resolve(cwd, ownTarget);
2446
2459
  if (ownFile)
2447
2460
  outputFileByTask.set(id, ownFile);
2461
+ // Whether the run's failures print as they fail, so a wait can promise that only when
2462
+ // it is true (see inlineFailuresByTask).
2463
+ if (streaming.command.startsWith(`export ${PLAYWRIGHT_FAILURES_INLINE_ENV}=1; `))
2464
+ inlineFailuresByTask.add(id);
2448
2465
  runByTask.set(id, { command: streaming.command, cwd });
2449
2466
  await backend.writeFile(script, `${streaming.command}\n`);
2450
2467
  // The clock the grace return below reports a stopped run against: the command is
@@ -2760,13 +2777,19 @@ export function buildTools(backend, config) {
2760
2777
  /^mol-bg-[a-z0-9]+-[a-z0-9]+$/.test(taskId)) {
2761
2778
  outputFileProbed.add(taskId);
2762
2779
  try {
2763
- const target = outputRedirectTarget(await backend.readFile(`/tmp/${taskId}.sh`));
2780
+ const script = await backend.readFile(`/tmp/${taskId}.sh`);
2781
+ const target = outputRedirectTarget(script);
2764
2782
  // A relative target was written against the command's own cwd, which
2765
2783
  // the handle does not carry; the project root is where a background
2766
2784
  // command runs unless the caller passed one. An absolute target is
2767
2785
  // already resolved and stays as written.
2768
2786
  if (target)
2769
2787
  outputFileByTask.set(taskId, posix.resolve(root, target));
2788
+ // The rewritten command is on disk with the `export` head it was given: a task this
2789
+ // process did not launch still says whether its failures print as they fail
2790
+ // (see inlineFailuresByTask).
2791
+ if (script.startsWith(`export ${PLAYWRIGHT_FAILURES_INLINE_ENV}=1; `))
2792
+ inlineFailuresByTask.add(taskId);
2770
2793
  }
2771
2794
  catch (_error) {
2772
2795
  // No script under that id: this process did not start the task, so
@@ -2824,6 +2847,13 @@ export function buildTools(backend, config) {
2824
2847
  };
2825
2848
  }
2826
2849
  const log = `/tmp/${taskId}.log`;
2850
+ // The file every note below must point the executor at: the one its own reads and
2851
+ // `outputSoFar` come from. A command that redirects its output (`> /tmp/pw-full.log`) leaves
2852
+ // the task log holding a word, so a grep composed against THAT prints nothing — xr-molecule-
2853
+ // flash-m173 (+17:07) obeyed the +12:18 note's `grep … /tmp/mol-bg-….log`, every grep
2854
+ // printed empty, and the whole mid-run diagnosis window was lost. The task's own wrapper log
2855
+ // stays `log` wherever something is read from both (the size probe and the slice do).
2856
+ const readLog = outputFileByTask.get(taskId) ?? log;
2827
2857
  const exitFile = `/tmp/${taskId}.exit`;
2828
2858
  // Leave the outer tool ceiling a margin so this returns a result rather
2829
2859
  // than being killed by it.
@@ -2923,7 +2953,7 @@ export function buildTools(backend, config) {
2923
2953
  waitedMs: earlyMs,
2924
2954
  note: repeatingFailureNote(noted, {
2925
2955
  taskId,
2926
- log,
2956
+ log: readLog,
2927
2957
  stop: await taskStopCommand(backend, taskId),
2928
2958
  universal: stopCause,
2929
2959
  ...(started ? { run: started } : {}),
@@ -2947,7 +2977,7 @@ export function buildTools(backend, config) {
2947
2977
  const editsInvalidateRun = started === undefined || suiteCommandTarget(started.command) === 'local';
2948
2978
  midRunNote = repeatingFailureNote(found, {
2949
2979
  taskId,
2950
- log,
2980
+ log: readLog,
2951
2981
  stop: '',
2952
2982
  universal: null,
2953
2983
  ...(started ? { run: started } : {}),
@@ -3009,7 +3039,7 @@ export function buildTools(backend, config) {
3009
3039
  const secondWalk = secondSuiteWalk(soFar) !== null;
3010
3040
  const stopInstead = secondWalk
3011
3041
  ? ` Stop it (\`exec_command: ${await taskStopCommand(backend, taskId)}\`) and read the ` +
3012
- `first walk's tally in ${log} — the second walk measures nothing new.`
3042
+ `first walk's tally in ${readLog} — the second walk measures nothing new.`
3013
3043
  : null;
3014
3044
  if (stillWriting && waitedBefore + waitedMs >= stuckAfterMs()) {
3015
3045
  waitedByTask.set(taskId, 0);
@@ -3031,7 +3061,7 @@ export function buildTools(backend, config) {
3031
3061
  status: 'stuck',
3032
3062
  waitedMs: waitedBefore + waitedMs,
3033
3063
  note: `${Math.round((waitedBefore + waitedMs) / 1000)}s of waiting and it has not exited — it is ` +
3034
- `stuck, not slow. See what it printed with exec_command (tail /tmp/${taskId}.log — ` +
3064
+ `stuck, not slow. See what it printed with exec_command (tail ${readLog} — ` +
3035
3065
  `read_file cannot reach /tmp), kill it (\`exec_command: ` +
3036
3066
  `${await taskStopCommand(backend, taskId)}\`) and move on; do not wait on it again.`,
3037
3067
  };
@@ -3050,11 +3080,19 @@ export function buildTools(backend, config) {
3050
3080
  `keep waiting — its result carries the log output. ` +
3051
3081
  (soFar.trim()
3052
3082
  ? `outputSoFar is the failure lines so far (up to ${RUNNING_FAILURE_LINES}) and then the end of ` +
3053
- `the log, not the whole run — \`grep -n '✘' ${log} | head -40\` lists every failure, ` +
3054
- `\`grep -n -A 20 '<test name>' ${log}\` reads one failure's error: this run writes ` +
3055
- `each failure's own report into the log as that test fails, right under its ✘ line, ` +
3056
- `not only in the summary at the end. `
3057
- : `Nothing has been printed yet — \`grep -n '✘' ${log} | head -40\` lists failures as they appear. `) +
3083
+ `the log, not the whole run — \`grep -n '✘' ${readLog} | head -40\` lists every failure, ` +
3084
+ `\`grep -n -A 20 '<test name>' ${readLog}\` reads one failure's error: ` +
3085
+ // The promise is made only when the launch actually set the inline switch
3086
+ // (inlineFailuresByTask). A run whose shape withheld it prints each failure's
3087
+ // error in the end-of-run summary alone, and telling the model to grep under
3088
+ // the ✘ row sent it through greps that could not match (xr-molecule-flash-m173
3089
+ // +17:07, +39:14 — the m99 class, recurring).
3090
+ (inlineFailuresByTask.has(taskId)
3091
+ ? `this run writes each failure's own report into the log as that test fails, ` +
3092
+ `right under its ✘ line, not only in the summary at the end. `
3093
+ : `this run prints each failure's error only in the summary at the end; until ` +
3094
+ `then the ✘ rows are all there is. `)
3095
+ : `Nothing has been printed yet — \`grep -n '✘' ${readLog} | head -40\` lists failures as they appear. `) +
3058
3096
  // What an edit does to this run depends on what the run MEASURES: the sandbox's own
3059
3097
  // app is re-served from app/src as it is edited, so the run's result stops counting; a
3060
3098
  // run against the deployed build is untouched by a local edit, and the executor can
@@ -139,6 +139,17 @@ export interface TraceAction {
139
139
  pageId?: string;
140
140
  /** The frame the action ran in, from the same snapshot. */
141
141
  frameId?: string;
142
+ /**
143
+ * The selector a `fill`/`type`/`selectOption` acted on (`textarea[name="bio"]`), from the
144
+ * trace's own params. Kept so the note can compare what the test typed with what the page
145
+ * submitted (m173: the field it typed into was sent empty).
146
+ */
147
+ selector?: string;
148
+ /**
149
+ * The value a `fill`/`type`/`selectOption` typed or chose, from the trace's own params —
150
+ * absent when the action carried none (a `selectOption` by label only).
151
+ */
152
+ value?: string;
142
153
  }
143
154
  /**
144
155
  * What a browser context OTHER than the failing page's recorded — the second context a
@@ -419,6 +430,20 @@ export interface TraceRunReport {
419
430
  */
420
431
  authEndpoints?: readonly string[];
421
432
  }
433
+ /**
434
+ * Whether a request PATH asks the app to mint a credential — a login, a registration, a token
435
+ * endpoint — as opposed to a protected resource that presents one.
436
+ *
437
+ * This is the path half of {@link isCredentialExchange}, exported so a caller holding only a
438
+ * `METHOD path` reads the same classification: a Hurl failing entry says
439
+ * `POST /api/users/login` and nothing about the body, and the whole-suite note must not explain
440
+ * a wrong-password login that answered 200 as a cookie-jar effect (xr-molecule-flash-m176).
441
+ *
442
+ * @param path - The request path (`/api/users/login`); a query or fragment is ignored.
443
+ * @param authEndpoints - The endpoints the app's auth config names (`/users/login`).
444
+ * @returns True when the path names a credential exchange.
445
+ */
446
+ export declare function isCredentialExchangePath(path: string, authEndpoints?: readonly string[]): boolean;
422
447
  /**
423
448
  * The note a failed suite run's result carries: what each failing test's page actually sent, and
424
449
  * what came back.
@@ -458,6 +483,14 @@ export interface TraceRunReport {
458
483
  * context and the assertion's page cannot be identified, the note lists the requests and makes NO
459
484
  * causal claim — no "the test's last action", no "the page stayed at …" — instead of merging them.
460
485
  *
486
+ * A field the test filled and the page submitted EMPTY ({@link formResetOf}) leads the note: the
487
+ * trace holds both facts — the value typed into `textarea[name="bio"]` and the `PUT /api/user`
488
+ * whose body carried `"bio": ""` — so the form's state was reset between the typing and the
489
+ * submit. The note names the effect that re-seeds a form from data whose identity changed and the
490
+ * fix at the source (seed the form once). xr-molecule-flash-m173 lost a deploy-and-walk cycle to
491
+ * this on the deployed URL only, where the background session verification lands later than it
492
+ * does locally.
493
+ *
461
494
  * WHICH rows it spends is evidence, not artifact order (xr-molecule-flash-m112 +53:46): a row
462
495
  * needs a recorded response, a real failure or a console line ({@link traceRowEvidence}), rows are
463
496
  * deduplicated by the test's location, and they are ordered real failure → repeated from an
@@ -1 +1 @@
1
- {"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"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"}