@molecule/api-ai-tools 1.9.14 → 1.9.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,7 +3,7 @@ AUTO-GENERATED — DO NOT EDIT THIS FILE.
3
3
  Generated by `mlcl sync-docs` from the package's src/index.ts JSDoc + mlcl/registry.json.
4
4
  Edits here are overwritten on the next commit (molecule's pre-commit hook regenerates).
5
5
  To change this document, edit the module-level JSDoc in src/index.ts.
6
- Generated: 2026-10-18T09:17:15.122Z
6
+ Generated: 2026-10-18T12:49:51.606Z
7
7
  -->
8
8
 
9
9
  # @molecule/api-ai-tools
@@ -426,6 +426,14 @@ interface TraceRequest {
426
426
  * credential-less request from one whose credential is a cookie.
427
427
  */
428
428
  sentCookie?: boolean
429
+ /**
430
+ * The trace member this request came from — the browser context Playwright numbered (`1`, `3`).
431
+ * A test that opens a second browser context writes one trace member per context, and a test's
432
+ * request is only evidence about the page it was made on (xr-molecule-flash-m160).
433
+ */
434
+ context?: string
435
+ /** The page the request was made on, as the HAR entry's `pageref` records it. */
436
+ pageId?: string
429
437
  }
430
438
  ```
431
439
 
@@ -472,6 +480,35 @@ interface TraceAction {
472
480
  start: number
473
481
  /** When it finished, or null when the run ended before it did. */
474
482
  end: number | null
483
+ /** The browser context the action was recorded in (`1`, `3`), when the trace names one. */
484
+ context?: string
485
+ /** The page the action ran on, from the frame snapshot the trace paired with it. */
486
+ pageId?: string
487
+ /** The frame the action ran in, from the same snapshot. */
488
+ frameId?: string
489
+ }
490
+ ```
491
+
492
+ #### `TraceContextEvidence`
493
+
494
+ What a browser context OTHER than the failing page's recorded — the second context a
495
+ two-context test opens for its own setup.
496
+
497
+ Its actions and requests belong to a different page: a request it sent is not the failing
498
+ action's effect, and the URL it left the page on is not where the assertion's page went
499
+ (xr-molecule-flash-m160: the helper context created an article in an editor page while the
500
+ primary page moved to the profile the assertion then failed on, and the note called the
501
+ editor page the failing page).
502
+
503
+ ```typescript
504
+ interface TraceContextEvidence {
505
+ /** The trace member's context id (`3`). */
506
+ context: string
507
+ /**
508
+ * The app requests that context made, bounded — failures first, then the answered ones — each
509
+ * labelled by the note as set-up work rather than the failing page's.
510
+ */
511
+ requests: TraceRequest[]
475
512
  }
476
513
  ```
477
514
 
@@ -506,19 +543,44 @@ interface TraceArtifact {
506
543
  */
507
544
  console: string[]
508
545
  /**
509
- * The test's LAST user action before the failing assertion and the requests it caused — what the
510
- * row leads with, when the trace carries the action times ({@link TraceLastAction}).
546
+ * The test's LAST user action before the failing assertion ON THE PAGE THE ASSERTION RAN ON, and
547
+ * the requests it caused — what the row leads with, when the trace carries the action times
548
+ * ({@link TraceLastAction}).
511
549
  *
512
- * Absent on traces read before this field existed, and on traces whose network entries recorded
513
- * no clock; the row then falls back to {@link lead}.
550
+ * A test that opens a second browser context writes one trace member per context, and the
551
+ * archive does not order them by time: the last action of the concatenation may belong to the
552
+ * helper's page while the assertion failed on another (xr-molecule-flash-m160). The action is
553
+ * therefore the failing page's own, and its `pageAfter` is that page's last frame snapshot.
554
+ *
555
+ * Absent on traces read before this field existed, on traces whose network entries recorded no
556
+ * clock, and on a trace with more than one used context whose failing page cannot be identified
557
+ * ({@link TraceArtifact.unattributed}) — the row then falls back to {@link lead}, or to no
558
+ * causal claim at all.
514
559
  */
515
560
  lastAction?: TraceLastAction
516
561
  /**
517
562
  * The page's own actions in the order the trace recorded them, bounded — what a test that ran
518
563
  * out of a per-test budget spends its time on. A test that repeats one action prints it once per
519
- * repeat, so the gap between two starts is one repeat's measured cost.
564
+ * repeat, so the gap between two starts is one repeat's measured cost. Scoped to the page the
565
+ * failing assertion ran on; a second browser context's actions are not this test's page.
520
566
  */
521
567
  actions: TraceAction[]
568
+ /**
569
+ * True when the trace held more than one browser context and none of them could be tied to the
570
+ * failing assertion's page. The note then makes no causal claim — no "the test's last action",
571
+ * no "the page stayed at …" — rather than attributing one context's click and URL to another
572
+ * context's assertion (xr-molecule-flash-m160).
573
+ */
574
+ unattributed?: true
575
+ /**
576
+ * The browser contexts the test opened BESIDES the failing assertion's page, with the app
577
+ * requests each made. Kept apart so the note can name them as set-up work instead of printing
578
+ * their requests as the failing action's effects (xr-molecule-flash-m160).
579
+ *
580
+ * Absent when the trace recorded one context only, when every other context made no request,
581
+ * and on traces read before this field existed.
582
+ */
583
+ otherContexts?: TraceContextEvidence[]
522
584
  }
523
585
  ```
524
586
 
@@ -1905,9 +1967,9 @@ over anything else when it is the page talking to the app (`fetch`/`xhr`/`docume
1905
1967
  test's trace holds the whole page load. A request with no response and NO error text was aborted
1906
1968
  or still in flight when the test ended; it is kept too, but as what it is, not as a failure.
1907
1969
 
1908
- A request answered 4xx by the app's OWN API also keeps what the page SENT and the first of what
1909
- came back: Playwright stores either inline (`text`) or in a resource entry (`_file`), and both
1910
- are read. That is where a wrapped body shows: xr-molecule-flash-m111's helper passed
1970
+ A trace.zip holds ONE trace member per browser context the test used (beside the runner's own
1971
+ `test.trace`), and the archive's member order is not the test's chronology. Each member is read
1972
+ as its own context: actions and requests keep their context id, requests and frame snapshots
1911
1973
 
1912
1974
  _(description truncated — read the full text in `node_modules/@molecule/api-ai-tools/dist/trace-artifacts.d.ts`.)_
1913
1975
 
@@ -2274,22 +2336,43 @@ into the log twice, which on X1 flash-m83 (2026-10-16) made a `--reporter=list,l
2274
2336
  _(description truncated — read the full text in `node_modules/@molecule/api-ai-tools/dist/utilities.d.ts`.)_
2275
2337
 
2276
2338
  ```typescript
2277
- function streamingBackgroundCommand(command: string): { command: string; changes: string[] }
2339
+ function streamingBackgroundCommand(command: string): {
2340
+ command: string
2341
+ changes: string[]
2342
+ error?: string
2343
+ }
2278
2344
  ```
2279
2345
 
2280
2346
  - `command` — The command as the executor sent it.
2281
2347
 
2282
- **Returns:** The command to run and one sentence per change made (empty when none).
2348
+ **Returns:** The command to run and one sentence per change made (empty when none), or `error` when the command starts the suite more than once.
2283
2349
 
2284
- #### `isSuiteRunCommand(command)`
2350
+ #### `suiteRunStatements(command)`
2285
2351
 
2286
- Whether a command runs a whole test suite — a Playwright, Vitest or Hurl run
2287
- — rather than a build, an install or a one-off script.
2352
+ Every statement of a command that starts a whole test suite, in command order.
2288
2353
 
2289
- A command that invokes a runner only to print is not one of these
2354
+ This is the ONE count of suite runs in a command: {@link isSuiteRunCommand} asks it,
2355
+ {@link streamingBackgroundCommand} refuses a command carrying more than one — each statement
2356
+ starts a whole walk of the same suite, and only the last of them is rewritten — and a re-run
2357
+ composed from a command ({@link ./suite-overlap.js} `scopedRerunCommand`) keeps only the first.
2358
+
2359
+ A statement that invokes a runner only to print is not one of these
2290
2360
  ({@link commandRunsNoTests}): `npx playwright test --list` prints the tests it would run and
2291
2361
  exits, and `npx playwright install`, `vitest list` and `hurl --help` start no test either.
2292
2362
 
2363
+ ```typescript
2364
+ function suiteRunStatements(command: string): string[]
2365
+ ```
2366
+
2367
+ - `command` — The shell command.
2368
+
2369
+ **Returns:** One entry per suite-running statement, as the parser read it (empty when none).
2370
+
2371
+ #### `isSuiteRunCommand(command)`
2372
+
2373
+ Whether a command runs a whole test suite — a Playwright, Vitest or Hurl run
2374
+ — rather than a build, an install or a one-off script.
2375
+
2293
2376
  ```typescript
2294
2377
  function isSuiteRunCommand(command: string): boolean
2295
2378
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"suite-overlap.d.ts","sourceRoot":"","sources":["../src/suite-overlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAQH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAc1F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAClB,MAAM,CAqCR;AAgHD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,SAAS,EAAE,OAAO,CAAA;IAClB,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EACzD,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ,EAAE,SAAS,CAAC,EAAE,GACrB,CAAC,GAAG,IAAI,CAMV;AAqDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQvD"}
1
+ {"version":3,"file":"suite-overlap.d.ts","sourceRoot":"","sources":["../src/suite-overlap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAQH;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAKD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAc1F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,GAAE,SAAS,MAAM,EAAO,EAChC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAClB,MAAM,CA0CR;AAgHD;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,SAAS,EAAE,OAAO,CAAA;IAClB,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAA;IACd;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,EACzD,SAAS,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EAC7B,QAAQ,EAAE,SAAS,CAAC,EAAE,GACrB,CAAC,GAAG,IAAI,CAMV;AAqDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQvD"}
@@ -31,7 +31,7 @@
31
31
  import { posix } from 'node:path';
32
32
  import { commandSegments, locatedCommandSegments } from './command-position.js';
33
33
  import { commandRunsNoTests } from './no-test-run.js';
34
- import { shellQuote } from './utilities.js';
34
+ import { shellQuote, suiteRunStatements } from './utilities.js';
35
35
  /**
36
36
  * A command with its heredoc bodies removed: the runs, kills and hosts it names in a file it
37
37
  * WRITES are not what the command itself does.
@@ -180,7 +180,12 @@ export function scopedRerunCommand(command, locations, excluded = [], config, cw
180
180
  .replace(/\s*--last-failed\b/g, '')
181
181
  .replace(/\s*--retries(?:[= ]\d+)?/g, '')
182
182
  .replace(/^(playwright\s+test)\b/, `$1 ${narrowed.join(' ')} --retries=0${carry}${invert}`);
183
- return `${head}${scoped}${tail}`;
183
+ // A command that starts the suite AGAIN after this statement is a chain of walks, not a re-run:
184
+ // everything from the next suite runner on is dropped, so the composed command carries ONE walk.
185
+ // X1 xr-molecule-flash-m157 (+14:02) was handed a re-run that still carried the chain's second
186
+ // whole walk — 4.5 minutes measuring code it had not changed.
187
+ const rerunTail = suiteRunStatements(tail).length > 0 ? '' : tail;
188
+ return `${head}${scoped}${rerunTail}`;
184
189
  }
185
190
  /** A directory a `cd` can name literally: no `~`, no variable, no glob. */
186
191
  const LITERAL_DIR = /^[A-Za-z0-9_./+-]+$/;
@@ -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;AAkJ9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAahG;AAkOD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAsEnE;;;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,CAokFxF"}
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;AAkJ9C;;;;;;;;;;;;;;;;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;AAsEnE;;;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,CAqlFxF"}
package/dist/tools.js CHANGED
@@ -192,6 +192,58 @@ function logProgress(log) {
192
192
  const total = Number(last?.[2]);
193
193
  return last && total > 0 && done >= 0 && done <= total ? { done, total } : null;
194
194
  }
195
+ /**
196
+ * Playwright's start-of-walk line, `Running 138 tests using 1 worker` — the first thing a walk
197
+ * prints, so a second one in one log is a second walk.
198
+ */
199
+ const WALK_START = /^[ \t]*Running \d+ tests?\b/gm;
200
+ /**
201
+ * One status line of a runner's closing tally — ` 4 failed`, ` 70 passed (4.5m)`,
202
+ * ` 65 skipped`.
203
+ */
204
+ const TALLY_STATUS = /^[ \t]*(\d+)[ \t]+(passed|failed|flaky|skipped|interrupted|timed out|did not run)\b[^\n]*/gm;
205
+ /**
206
+ * A runner's CLOSING tally, the line that only prints once a walk has finished: Playwright's
207
+ * duration-bearing `70 passed (4.5m)`, a `1 flaky` summary, or Hurl's `Executed files:` count.
208
+ *
209
+ * The same reading as molecule-dev's `suite-proof.ts` `FINAL_TALLY_RE` (the platform's finished-run
210
+ * detector); this package cannot import it, so the shape is mirrored here and nowhere else.
211
+ */
212
+ const FINISHED_TALLY = /\b\d+[ \t]+(?:passed|failed)[ \t]+\(\d+(?:\.\d+)?(?:ms|s|m|h)\)|^[ \t]*\d+[ \t]+flaky\b|^[ \t]*Executed files:/m;
213
+ /**
214
+ * Whether a task's log holds a SECOND walk of the same suite — a finished tally followed by a
215
+ * fresh `Running N tests` header — and what the finished walk's tally said.
216
+ *
217
+ * A command that chained two suite runs starts the second walk the moment the first ends, and the
218
+ * wait used to read that log as one slow run ("slow, not stuck") for the whole second walk. X1
219
+ * xr-molecule-flash-m157 (+14:02) waited out 4.5 minutes of a duplicate walk that measured nothing:
220
+ * the first walk had already printed `4 failed / 65 skipped / 70 passed (4.5m)`.
221
+ *
222
+ * @param slice - The log slice this wait read.
223
+ * @returns The finished walk's tally lines, or null when the log shows one walk (or none).
224
+ */
225
+ function secondSuiteWalk(slice) {
226
+ const header = [...slice.matchAll(WALK_START)].at(-1);
227
+ if (!header || header.index === undefined)
228
+ return null;
229
+ const finished = FINISHED_TALLY.exec(slice);
230
+ // One walk prints its header FIRST and its tally last, so a tally before the last header is
231
+ // another walk's. The slice repeats what it greps and then the log's own tail, so the same
232
+ // tally can appear twice; one line per status, taken at its last position, keeps it once.
233
+ if (!finished || finished.index === undefined || finished.index > header.index)
234
+ return null;
235
+ const seen = new Map();
236
+ for (const match of slice.matchAll(TALLY_STATUS)) {
237
+ if (match.index === undefined || match.index >= header.index)
238
+ continue;
239
+ seen.set(match[2] ?? '', { at: match.index, text: match[0].trim().replace(/\s+/g, ' ') });
240
+ }
241
+ const tally = [...seen.values()]
242
+ .sort((a, b) => a.at - b.at)
243
+ .map((v) => v.text)
244
+ .join(' / ');
245
+ return { tally: tally || 'its closing tally' };
246
+ }
195
247
  /**
196
248
  * What a wait knows about the command BESIDES "it has not exited": how long it
197
249
  * has been running, whether its output is still growing, how far its own log
@@ -232,11 +284,17 @@ function waitProgressClauses(o) {
232
284
  ? `it has been running at least ${durationText(o.waitedMs)}`
233
285
  : `it has been running ${durationText(sinceStart)}`,
234
286
  ];
235
- if (o.stillWriting)
287
+ // A log that already finished one walk and started another says so instead of "slow, not
288
+ // stuck": the growth is the SECOND walk printing, and its counter is not this run's progress.
289
+ const secondWalk = secondSuiteWalk(o.slice);
290
+ if (o.stillWriting && !secondWalk)
236
291
  clauses.push(`its output is still growing (${o.bytes} bytes) — slow, not stuck`);
237
- else if (o.bytes !== null)
292
+ else if (o.bytes !== null && !secondWalk)
238
293
  clauses.push(`its log has not grown during this wait (${o.bytes} bytes)`);
239
- const counter = logProgress(o.slice);
294
+ if (secondWalk)
295
+ clauses.push(`the first walk in this command has finished (${secondWalk.tally}); the command started a ` +
296
+ 'SECOND walk of the same suite — stop it (it measures nothing new) and read the first tally');
297
+ const counter = secondWalk ? null : logProgress(o.slice);
240
298
  if (counter) {
241
299
  clauses.push(`its log is at ${counter.done} of ${counter.total}`);
242
300
  // The rate is the task's own elapsed time, never this call's wait: with no
@@ -2289,6 +2347,11 @@ export function buildTools(backend, config) {
2289
2347
  // Keep the log growing while it runs (see streamingBackgroundCommand):
2290
2348
  // an empty log is what wait_for_task reads as stuck.
2291
2349
  const streaming = streamingBackgroundCommand(command);
2350
+ // A command that starts the suite more than once is refused here, before anything is
2351
+ // written or launched: each walk measures the same code, and only the last is rewritten
2352
+ // (X1 xr-molecule-flash-m157 +14:02 — two whole walks chained with `;`).
2353
+ if (streaming.error)
2354
+ return { error: streaming.error };
2292
2355
  // …and the trace flag this tool added (above), which the streaming rewrite never saw:
2293
2356
  // its changes are what this branch reports the run's own settings in.
2294
2357
  if (traced.change)
@@ -2859,6 +2922,14 @@ export function buildTools(backend, config) {
2859
2922
  // instruction — and not on a finished run's result, where `failureCausesNote` reads the
2860
2923
  // whole log instead of the 40 KB tail a mid-run look is given.
2861
2924
  const midRun = midRunNote ? ` ${midRunNote}` : '';
2925
+ // A log that already finished one walk and started a second is not a run to keep waiting
2926
+ // on: the first walk's tally is the measurement and the second only repeats it, so the
2927
+ // advice below hands over the stop instead of "keep waiting" (m157 +14:02).
2928
+ const secondWalk = secondSuiteWalk(soFar) !== null;
2929
+ const stopInstead = secondWalk
2930
+ ? ` Stop it (\`exec_command: ${await taskStopCommand(backend, taskId)}\`) and read the ` +
2931
+ `first walk's tally in ${log} — the second walk measures nothing new.`
2932
+ : null;
2862
2933
  if (stillWriting && waitedBefore + waitedMs >= stuckAfterMs()) {
2863
2934
  waitedByTask.set(taskId, 0);
2864
2935
  return {
@@ -2866,8 +2937,11 @@ export function buildTools(backend, config) {
2866
2937
  status: 'running',
2867
2938
  waitedMs,
2868
2939
  ...sliceField,
2869
- note: `${progress} Call wait_for_task again to keep waiting — it returns the moment the ` +
2870
- `command ends and reports the failures as they appear.${midRun}`,
2940
+ note: `${progress}` +
2941
+ (stopInstead ??
2942
+ ` Call wait_for_task again to keep waiting — it returns the moment the ` +
2943
+ `command ends and reports the failures as they appear.`) +
2944
+ `${midRun}`,
2871
2945
  };
2872
2946
  }
2873
2947
  if (waitedBefore + waitedMs >= stuckAfterMs()) {
@@ -2889,24 +2963,26 @@ export function buildTools(backend, config) {
2889
2963
  // No "Still running after Ns" lead here either: the clauses already say
2890
2964
  // how long it has been running, and the lead said it a second time in
2891
2965
  // the other format (X1 flash-m87 §+47:20).
2892
- note: `${progress} Call wait_for_task again to ` +
2893
- `keep waiting — its result carries the log output. ` +
2894
- (soFar.trim()
2895
- ? `outputSoFar is the failure lines so far (up to ${RUNNING_FAILURE_LINES}) and then the end of ` +
2896
- `the log, not the whole run — \`grep -n '✘' ${log} | head -40\` lists every failure, ` +
2897
- `\`grep -n -A 20 '<test name>' ${log}\` reads one failure's error: this run writes ` +
2898
- `each failure's own report into the log as that test fails, right under its ✘ line, ` +
2899
- `not only in the summary at the end. `
2900
- : `Nothing has been printed yet — \`grep -n '✘' ${log} | head -40\` lists failures as they appear. `) +
2901
- // What an edit does to this run depends on what the run MEASURES: the sandbox's own
2902
- // app is re-served from app/src as it is edited, so the run's result stops counting; a
2903
- // run against the deployed build is untouched by a local edit, and the executor can
2904
- // spend the rest of the run fixing (xr-molecule-flash-m122 +19:00: a deployed run was
2905
- // told editing changes what it tests, then handed "Start fixing it now" in the same
2906
- // result — it waited out 1 min 11 s of free fixing time).
2907
- (started !== undefined && suiteCommandTarget(started.command) !== 'local'
2908
- ? `Meanwhile fix what it has already named: this run tests the deployed build, so editing app/src or api/src now does not change what it tests — fix the causes it has already named while it walks, run nothing against the app until it ends, then deploy once.`
2909
- : `Meanwhile do work that leaves the code under test alone (read the failures so far, plan the fixes): editing app/src or api/src now changes the code the run is testing, and its result no longer counts.`) +
2966
+ note: `${progress}` +
2967
+ (stopInstead ??
2968
+ ` Call wait_for_task again to ` +
2969
+ `keep waiting — its result carries the log output. ` +
2970
+ (soFar.trim()
2971
+ ? `outputSoFar is the failure lines so far (up to ${RUNNING_FAILURE_LINES}) and then the end of ` +
2972
+ `the log, not the whole run — \`grep -n '✘' ${log} | head -40\` lists every failure, ` +
2973
+ `\`grep -n -A 20 '<test name>' ${log}\` reads one failure's error: this run writes ` +
2974
+ `each failure's own report into the log as that test fails, right under its ✘ line, ` +
2975
+ `not only in the summary at the end. `
2976
+ : `Nothing has been printed yet — \`grep -n '✘' ${log} | head -40\` lists failures as they appear. `) +
2977
+ // What an edit does to this run depends on what the run MEASURES: the sandbox's own
2978
+ // app is re-served from app/src as it is edited, so the run's result stops counting; a
2979
+ // run against the deployed build is untouched by a local edit, and the executor can
2980
+ // spend the rest of the run fixing (xr-molecule-flash-m122 +19:00: a deployed run was
2981
+ // told editing changes what it tests, then handed "Start fixing it now" in the same
2982
+ // result — it waited out 1 min 11 s of free fixing time).
2983
+ (started !== undefined && suiteCommandTarget(started.command) !== 'local'
2984
+ ? `Meanwhile fix what it has already named: this run tests the deployed build, so editing app/src or api/src now does not change what it tests — fix the causes it has already named while it walks, run nothing against the app until it ends, then deploy once.`
2985
+ : `Meanwhile do work that leaves the code under test alone (read the failures so far, plan the fixes): editing app/src or api/src now changes the code the run is testing, and its result no longer counts.`)) +
2910
2986
  `${midRun}`,
2911
2987
  };
2912
2988
  }
@@ -89,6 +89,14 @@ export interface TraceRequest {
89
89
  * credential-less request from one whose credential is a cookie.
90
90
  */
91
91
  sentCookie?: boolean;
92
+ /**
93
+ * The trace member this request came from — the browser context Playwright numbered (`1`, `3`).
94
+ * A test that opens a second browser context writes one trace member per context, and a test's
95
+ * request is only evidence about the page it was made on (xr-molecule-flash-m160).
96
+ */
97
+ context?: string;
98
+ /** The page the request was made on, as the HAR entry's `pageref` records it. */
99
+ pageId?: string;
92
100
  }
93
101
  /**
94
102
  * The test's LAST user action before the failing assertion, and the requests it caused.
@@ -125,6 +133,31 @@ export interface TraceAction {
125
133
  start: number;
126
134
  /** When it finished, or null when the run ended before it did. */
127
135
  end: number | null;
136
+ /** The browser context the action was recorded in (`1`, `3`), when the trace names one. */
137
+ context?: string;
138
+ /** The page the action ran on, from the frame snapshot the trace paired with it. */
139
+ pageId?: string;
140
+ /** The frame the action ran in, from the same snapshot. */
141
+ frameId?: string;
142
+ }
143
+ /**
144
+ * What a browser context OTHER than the failing page's recorded — the second context a
145
+ * two-context test opens for its own setup.
146
+ *
147
+ * Its actions and requests belong to a different page: a request it sent is not the failing
148
+ * action's effect, and the URL it left the page on is not where the assertion's page went
149
+ * (xr-molecule-flash-m160: the helper context created an article in an editor page while the
150
+ * primary page moved to the profile the assertion then failed on, and the note called the
151
+ * editor page the failing page).
152
+ */
153
+ export interface TraceContextEvidence {
154
+ /** The trace member's context id (`3`). */
155
+ context: string;
156
+ /**
157
+ * The app requests that context made, bounded — failures first, then the answered ones — each
158
+ * labelled by the note as set-up work rather than the failing page's.
159
+ */
160
+ requests: TraceRequest[];
128
161
  }
129
162
  /** What one trace says: the test it belongs to, the requests it made, and its console lines. */
130
163
  export interface TraceArtifact {
@@ -153,19 +186,44 @@ export interface TraceArtifact {
153
186
  */
154
187
  console: string[];
155
188
  /**
156
- * The test's LAST user action before the failing assertion and the requests it caused — what the
157
- * row leads with, when the trace carries the action times ({@link TraceLastAction}).
189
+ * The test's LAST user action before the failing assertion ON THE PAGE THE ASSERTION RAN ON, and
190
+ * the requests it caused — what the row leads with, when the trace carries the action times
191
+ * ({@link TraceLastAction}).
158
192
  *
159
- * Absent on traces read before this field existed, and on traces whose network entries recorded
160
- * no clock; the row then falls back to {@link lead}.
193
+ * A test that opens a second browser context writes one trace member per context, and the
194
+ * archive does not order them by time: the last action of the concatenation may belong to the
195
+ * helper's page while the assertion failed on another (xr-molecule-flash-m160). The action is
196
+ * therefore the failing page's own, and its `pageAfter` is that page's last frame snapshot.
197
+ *
198
+ * Absent on traces read before this field existed, on traces whose network entries recorded no
199
+ * clock, and on a trace with more than one used context whose failing page cannot be identified
200
+ * ({@link TraceArtifact.unattributed}) — the row then falls back to {@link lead}, or to no
201
+ * causal claim at all.
161
202
  */
162
203
  lastAction?: TraceLastAction;
163
204
  /**
164
205
  * The page's own actions in the order the trace recorded them, bounded — what a test that ran
165
206
  * out of a per-test budget spends its time on. A test that repeats one action prints it once per
166
- * repeat, so the gap between two starts is one repeat's measured cost.
207
+ * repeat, so the gap between two starts is one repeat's measured cost. Scoped to the page the
208
+ * failing assertion ran on; a second browser context's actions are not this test's page.
167
209
  */
168
210
  actions: TraceAction[];
211
+ /**
212
+ * True when the trace held more than one browser context and none of them could be tied to the
213
+ * failing assertion's page. The note then makes no causal claim — no "the test's last action",
214
+ * no "the page stayed at …" — rather than attributing one context's click and URL to another
215
+ * context's assertion (xr-molecule-flash-m160).
216
+ */
217
+ unattributed?: true;
218
+ /**
219
+ * The browser contexts the test opened BESIDES the failing assertion's page, with the app
220
+ * requests each made. Kept apart so the note can name them as set-up work instead of printing
221
+ * their requests as the failing action's effects (xr-molecule-flash-m160).
222
+ *
223
+ * Absent when the trace recorded one context only, when every other context made no request,
224
+ * and on traces read before this field existed.
225
+ */
226
+ otherContexts?: TraceContextEvidence[];
169
227
  }
170
228
  /** How many traces one read reports, newest first. */
171
229
  export declare const MAX_TRACE_ARTIFACTS = 12;
@@ -213,6 +271,13 @@ export declare const TRACE_NOTE_LEAD_GOT_CHARS = 200;
213
271
  * test's trace holds the whole page load. A request with no response and NO error text was aborted
214
272
  * or still in flight when the test ended; it is kept too, but as what it is, not as a failure.
215
273
  *
274
+ * A trace.zip holds ONE trace member per browser context the test used (beside the runner's own
275
+ * `test.trace`), and the archive's member order is not the test's chronology. Each member is read
276
+ * as its own context: actions and requests keep their context id, requests and frame snapshots
277
+ * keep the pageId Playwright records, and the failing assertion's page — the page its own step id
278
+ * ran on — decides which actions, snapshots and requests become the test's row. What the test's
279
+ * other browser contexts recorded is reported apart, as `otherContexts` (xr-molecule-flash-m160).
280
+ *
216
281
  * A request answered 4xx by the app's OWN API also keeps what the page SENT and the first of what
217
282
  * came back: Playwright stores either inline (`text`) or in a resource entry (`_file`), and both
218
283
  * are read. That is where a wrapped body shows: xr-molecule-flash-m111's helper passed
@@ -346,6 +411,14 @@ export interface TraceRunReport {
346
411
  * (answered 201, the page still rendering signed-out) never appeared. With no action clock, the
347
412
  * row falls back to {@link TraceArtifact.lead}: the page's last answered fetch/xhr.
348
413
  *
414
+ * The action, the URL and the requests are the FAILING ASSERTION'S PAGE's ({@link
415
+ * TraceArtifact.lastAction}), never the archive's last context: a test that creates its data in a
416
+ * second browser context writes that context's click and `/editor` snapshot into the same zip, and
417
+ * reading the concatenation made them the failing page (xr-molecule-flash-m160). The other
418
+ * contexts' requests are named separately as set-up work. When the trace holds more than one used
419
+ * context and the assertion's page cannot be identified, the note lists the requests and makes NO
420
+ * causal claim — no "the test's last action", no "the page stayed at …" — instead of merging them.
421
+ *
349
422
  * WHICH rows it spends is evidence, not artifact order (xr-molecule-flash-m112 +53:46): a row
350
423
  * needs a recorded response, a real failure or a console line ({@link traceRowEvidence}), rows are
351
424
  * 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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"}