@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 +98 -15
- package/dist/suite-overlap.d.ts.map +1 -1
- package/dist/suite-overlap.js +7 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +99 -23
- package/dist/trace-artifacts.d.ts +78 -5
- package/dist/trace-artifacts.d.ts.map +1 -1
- package/dist/trace-artifacts.js +517 -102
- package/dist/utilities.d.ts +27 -4
- package/dist/utilities.d.ts.map +1 -1
- package/dist/utilities.js +60 -7
- package/package.json +1 -1
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-
|
|
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
|
|
510
|
-
* row leads with, when the trace carries the action times
|
|
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
|
-
*
|
|
513
|
-
*
|
|
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
|
|
1909
|
-
|
|
1910
|
-
|
|
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): {
|
|
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
|
-
#### `
|
|
2350
|
+
#### `suiteRunStatements(command)`
|
|
2285
2351
|
|
|
2286
|
-
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/dist/suite-overlap.js
CHANGED
|
@@ -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
|
-
|
|
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_./+-]+$/;
|
package/dist/tools.d.ts.map
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;AAkJ9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAahG;
|
|
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
|
-
|
|
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
|
-
|
|
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}
|
|
2870
|
-
|
|
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}
|
|
2893
|
-
|
|
2894
|
-
|
|
2895
|
-
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
|
|
2900
|
-
|
|
2901
|
-
|
|
2902
|
-
|
|
2903
|
-
|
|
2904
|
-
|
|
2905
|
-
|
|
2906
|
-
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
|
|
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
|
|
157
|
-
* row leads with, when the trace carries the action times
|
|
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
|
-
*
|
|
160
|
-
*
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,iGAAiG;IACjG,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"trace-artifacts.d.ts","sourceRoot":"","sources":["../src/trace-artifacts.ts"],"names":[],"mappings":"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"}
|