@testrelic/core 2.9.0-next.73 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * All interfaces for the JSON output schema, reporter configuration,
5
5
  * and internal fixture-to-reporter communication.
6
6
  *
7
- * Schema Version: 1.0.0
7
+ * Schema Version: 1.6.0
8
8
  */
9
9
  type NavigationType = 'goto' | 'navigation' | 'back' | 'forward' | 'refresh' | 'spa_route' | 'spa_replace' | 'hash_change' | 'link_click' | 'form_submit' | 'redirect' | 'popstate' | 'page_load' | 'manual_record' | 'fallback' | 'dummy';
10
10
  interface TestRunReport {
@@ -56,6 +56,30 @@ interface Summary {
56
56
  readonly totalTimelineSteps: number;
57
57
  readonly totalActionSteps: number;
58
58
  readonly actionStepsByCategory: Record<string, number>;
59
+ /** Visual baseline comparisons across the run. */
60
+ readonly visualChecks?: number;
61
+ /** Of those, how many differed from their baseline. */
62
+ readonly visualFailures?: number;
63
+ /** Of those, how many had no baseline and wrote one. */
64
+ readonly visualNew?: number;
65
+ /** DOM elements that differed across the run's visual comparisons. */
66
+ readonly visualDomChanges?: number;
67
+ /** Action steps across the run, bucketed by the driver's own category. */
68
+ readonly actionStepsByKind?: Record<string, number>;
69
+ /** Device-log lines captured across the run (mobile). */
70
+ readonly deviceLogLines?: number;
71
+ /** Of those, how many were error or fatal. */
72
+ readonly deviceLogErrors?: number;
73
+ /** Of those, how many came from a crash log. */
74
+ readonly deviceLogCrashes?: number;
75
+ /** Screenshots captured across the run. */
76
+ readonly screenshotCount?: number;
77
+ /** Screen recordings captured across the run. */
78
+ readonly videoCount?: number;
79
+ /** AI-detected defects across the run, by severity. */
80
+ readonly aiDefectsBySeverity?: Record<string, number>;
81
+ /** Distinct devices the run touched. */
82
+ readonly devices?: readonly DeviceInfo[];
59
83
  }
60
84
  interface CIMetadata {
61
85
  readonly provider: CIProvider;
@@ -99,6 +123,12 @@ interface TestResult {
99
123
  readonly apiAssertions: readonly ApiAssertion[] | null;
100
124
  readonly actions: readonly ActionStep[] | null;
101
125
  readonly consoleLogs: readonly ConsoleLogEntry[] | null;
126
+ /** Visual baseline comparisons recorded during this test, if any. */
127
+ readonly visual?: readonly VisualComparison[] | null;
128
+ /** The device this test drove (mobile runs only). */
129
+ readonly device?: DeviceInfo | null;
130
+ /** AI-detected defects attributed to this test. */
131
+ readonly aiDefects?: readonly AiDefect[] | null;
102
132
  }
103
133
  type ResourceType = 'xhr' | 'document' | 'script' | 'stylesheet' | 'image' | 'font' | 'other';
104
134
  interface CapturedNetworkRequest {
@@ -121,12 +151,209 @@ interface CapturedNetworkRequest {
121
151
  }
122
152
  interface TestArtifacts {
123
153
  readonly screenshot?: string;
154
+ /**
155
+ * Every screenshot captured for this test, report-relative.
156
+ *
157
+ * `screenshot` is the first one and stays for compatibility. Mobile
158
+ * collectors have always gathered an array — one per step, or one per
159
+ * failure — and only index 0 survived: the artifact copier wrote a single
160
+ * `screenshot.png` and dropped the rest before the report could ask.
161
+ */
162
+ readonly screenshots?: readonly string[];
124
163
  readonly video?: string;
164
+ /**
165
+ * Playwright's trace archive — the DOM snapshots, network log and screencast
166
+ * frames a failure is actually debugged from.
167
+ *
168
+ * Its absence here went all the way down the stack: with no field to fill,
169
+ * the collector had nothing to look for, so a project configured with
170
+ * `trace: 'on'` wrote `trace.zip` to disk and shipped only the picture and
171
+ * the video. The gap bit hardest exactly where it mattered most — a failure
172
+ * caught in a hook leaves no screenshot worth having, so those runs reached
173
+ * the cloud with a video and nothing anyone could step through.
174
+ */
175
+ readonly trace?: string;
125
176
  readonly screenshotKey?: string;
126
177
  readonly videoKey?: string;
178
+ readonly traceKey?: string;
179
+ }
180
+ /**
181
+ * Outcome of a single visual baseline comparison.
182
+ *
183
+ * `new` is a snapshot Playwright had no baseline for and therefore wrote one
184
+ * for — it is not a pass, because nothing was actually compared. `updated`
185
+ * means the run was invoked with `--update-snapshots` and the baseline was
186
+ * rewritten, which likewise compares nothing.
187
+ */
188
+ type VisualStatus = 'passed' | 'failed' | 'new' | 'updated';
189
+ /** Which assertion produced a comparison. */
190
+ type VisualSource = 'toHaveScreenshot' | 'toMatchSnapshot' | 'toMatchVisualBaseline';
191
+ /**
192
+ * One visual baseline comparison within a test.
193
+ *
194
+ * A test may hold many of these — `TestArtifacts` deliberately is not the home
195
+ * for them, because it is single-slot per type (one screenshot, one video, one
196
+ * trace) while a single test can assert against any number of named snapshots.
197
+ *
198
+ * Every image field is a report-relative POSIX path, matching `TestArtifacts`.
199
+ * A passing comparison carries no `actual` or `diff`: Playwright attaches
200
+ * nothing when the images match, so there is nothing to copy.
201
+ */
202
+ interface VisualComparison {
203
+ /** Snapshot identity within the test, e.g. `home` or `checkout/cart`. */
204
+ readonly name: string;
205
+ readonly status: VisualStatus;
206
+ readonly source: VisualSource;
207
+ /** The committed baseline image. */
208
+ readonly baseline?: string;
209
+ /** What this run rendered. Absent when the comparison passed. */
210
+ readonly actual?: string;
211
+ /** Playwright's rendered diff. Present only on failure. */
212
+ readonly diff?: string;
213
+ /** The previous attempt's render, on a retried failure. */
214
+ readonly previous?: string;
215
+ /** Baseline dimensions, read from the PNG header. */
216
+ readonly width?: number;
217
+ readonly height?: number;
218
+ /** Actual dimensions — set only when they differ from the baseline. */
219
+ readonly actualWidth?: number;
220
+ readonly actualHeight?: number;
221
+ /** Differing pixel count, as reported by Playwright's comparator. */
222
+ readonly diffPixels?: number;
223
+ /** `diffPixels / (width * height)`, computed at full precision. */
224
+ readonly diffPixelRatio?: number;
225
+ /** Cloud storage keys, populated after artifact upload. */
226
+ readonly baselineKey?: string;
227
+ readonly actualKey?: string;
228
+ readonly diffKey?: string;
229
+ /**
230
+ * Which elements changed, ranked by the area they affect.
231
+ *
232
+ * Present only when a DOM baseline existed to compare against. Capped — see
233
+ * `domChangeCount` for the number found before the cap.
234
+ */
235
+ readonly domChanges?: readonly DomChange[];
236
+ /** Total changes found, which may exceed `domChanges.length`. */
237
+ readonly domChangeCount?: number;
238
+ /**
239
+ * Of those, how many actually changed rather than merely shifting position.
240
+ *
241
+ * The gap between this and `domChangeCount` is the layout knock-on: one card
242
+ * gaining a margin moves everything below it, and a report that presents all
243
+ * of those as equals hides the single edit that caused them.
244
+ */
245
+ readonly domRootCauses?: number;
246
+ /** True when the DOM capture itself hit a node or byte cap. */
247
+ readonly domTruncated?: boolean;
248
+ /** Report-relative paths to the two captured DOM snapshots. */
249
+ readonly baselineDom?: string;
250
+ readonly actualDom?: string;
251
+ /**
252
+ * The document-space region the screenshot covered: `[x, y, width, height]`.
253
+ *
254
+ * Element rectangles are in document coordinates, so the report needs this to
255
+ * place a box over the image — for a locator screenshot the image covers only
256
+ * that element's box, not the viewport.
257
+ */
258
+ readonly domCaptureBox?: readonly [number, number, number, number];
259
+ /** Cloud storage keys for the DOM snapshots. */
260
+ readonly baselineDomKey?: string;
261
+ readonly actualDomKey?: string;
262
+ }
263
+ /** How an element differs between the baseline render and this one. */
264
+ type DomChangeKind = 'added' | 'removed' | 'moved' | 'resized' | 'restyled' | 'text'
265
+ /** Its id or class list changed — often the real story behind a restyle. */
266
+ | 'attrs';
267
+ /** One computed style property that differs. */
268
+ interface DomStyleChange {
269
+ readonly prop: string;
270
+ readonly from: string;
271
+ readonly to: string;
272
+ }
273
+ /**
274
+ * One element that differs between two renders.
275
+ *
276
+ * Deliberately shaped like the platform's existing `RegionEvidence` — rank,
277
+ * bbox, area share, a kind and a human label — so that a DOM overlay becomes
278
+ * another caller of the dashboard's existing box-overlay component rather than
279
+ * a second renderer built alongside it.
280
+ */
281
+ interface DomChange {
282
+ /** 1-based, ordered by affected area descending. Drives the overlay colour. */
283
+ readonly rank: number;
284
+ /** Structural path used to match the element across the two snapshots. */
285
+ readonly path: string;
286
+ /** What a human reads, e.g. `div.card.accent`. */
287
+ readonly label: string;
288
+ readonly kinds: readonly DomChangeKind[];
289
+ /** Document-space `[x, y, width, height]` in this render. */
290
+ readonly rect?: readonly [number, number, number, number];
291
+ /** The same, in the baseline. Absent for an added element. */
292
+ readonly baselineRect?: readonly [number, number, number, number];
293
+ /** Share of the capture box this element occupies, 0–1. */
294
+ readonly areaPct: number;
295
+ readonly styles?: readonly DomStyleChange[];
296
+ readonly text?: {
297
+ readonly from: string;
298
+ readonly to: string;
299
+ };
300
+ /** Identity attributes that changed, e.g. `class: "card" → "banner"`. */
301
+ readonly attrs?: readonly DomStyleChange[];
302
+ /**
303
+ * True when this element only moved or resized, in a comparison where
304
+ * something else actually changed.
305
+ *
306
+ * Shifting one card down by 24px shifts everything below it too, so a naive
307
+ * list reports eleven changes for one edit. This flags the ten that merely
308
+ * got pushed around, so a report can lead with the one that did something.
309
+ *
310
+ * It is a statement about this element — that nothing about it changed except
311
+ * its position — and deliberately not a claim to have proven what moved it.
312
+ */
313
+ readonly consequence?: boolean;
127
314
  }
128
315
  type TestStatus = 'passed' | 'failed' | 'skipped' | 'flaky' | 'timedout';
129
316
  type TestType = 'e2e' | 'api' | 'unit' | 'mobile' | 'unknown';
317
+ /** Platform a mobile test drove. */
318
+ type MobilePlatform = 'android' | 'ios' | 'web' | 'unknown';
319
+ /** How the app under test was driven. */
320
+ type AppTestMode = 'native' | 'hybrid' | 'mobile-web';
321
+ /**
322
+ * The device a mobile test ran on.
323
+ *
324
+ * Appium detects all of this from the W3C capabilities and Maestro reads it
325
+ * from the CLI flags and driver log. Both used to collapse it to two words in
326
+ * `tags` before the report saw it; this carries it through intact.
327
+ */
328
+ interface DeviceInfo {
329
+ readonly platform: MobilePlatform;
330
+ /** OS version, e.g. "14" or "17.5". */
331
+ readonly platformVersion: string | null;
332
+ /** Human-facing device name, e.g. "Pixel 4a" or "iPhone 15". */
333
+ readonly deviceName: string | null;
334
+ /** Driver, e.g. "UiAutomator2", "XCUITest", "maestro". */
335
+ readonly automationName: string | null;
336
+ /** App package / bundle id / apk path under test. */
337
+ readonly appId: string | null;
338
+ /** Native, hybrid or mobile-web. Null when the runner cannot tell. */
339
+ readonly appTestMode: AppTestMode | null;
340
+ /** Device serial or UDID, e.g. "emulator-5554". */
341
+ readonly udid: string | null;
342
+ }
343
+ /** Severity of an AI-detected defect. */
344
+ type AiDefectSeverity = 'critical' | 'warning' | 'info';
345
+ /** Category of an AI-detected defect. */
346
+ type AiDefectType = 'ui' | 'spelling' | 'i18n' | 'layout' | 'accessibility';
347
+ /** A defect reported by an AI analysis pass over a captured screen. */
348
+ interface AiDefect {
349
+ readonly type: AiDefectType;
350
+ readonly severity: AiDefectSeverity;
351
+ readonly description: string;
352
+ /** Where in the app it was seen, when the analyser says. */
353
+ readonly location: string | null;
354
+ /** Report-relative path to the screenshot it was found on. */
355
+ readonly screenshot: string | null;
356
+ }
130
357
  interface FailureDiagnostic {
131
358
  readonly message: string;
132
359
  readonly line: number | null;
@@ -205,6 +432,13 @@ interface AssertionLocation {
205
432
  /** Column number (1-based), if available */
206
433
  readonly column?: number;
207
434
  }
435
+ /** A failed assertion reduced to what a summary row needs. */
436
+ interface FailedAssertionSummary {
437
+ readonly type: AssertionType;
438
+ readonly expected: string;
439
+ readonly actual: string;
440
+ readonly expression?: string;
441
+ }
208
442
  /** A single captured assertion on API response data. */
209
443
  interface ApiAssertion {
210
444
  /** Links to ApiCallRecord.id from the API proxy */
@@ -296,10 +530,24 @@ type TimelineStep = NavigationStep | ApiCallStep;
296
530
  * distinct bucket from generic `custom_step`.
297
531
  */
298
532
  type ActionCategory = 'ui_action' | 'assertion' | 'navigation' | 'custom_step';
533
+ /**
534
+ * The driver's own step category, preserved alongside `ActionCategory`.
535
+ *
536
+ * `ActionCategory` is the four-bucket vocabulary the platform's timeline and
537
+ * Ask AI tools filter on, and it stays closed. Mobile drivers distinguish far
538
+ * more than four kinds — Appium reports eleven, Maestro ten — and flattening
539
+ * them made a swipe, an app launch and a screenshot render identically. This
540
+ * keeps the finer label for the report to badge.
541
+ */
542
+ type StepKind = 'find' | 'interaction' | 'gesture' | 'navigation' | 'lifecycle' | 'context' | 'device' | 'keyboard' | 'alert' | 'screenshot' | 'assertion' | 'media' | 'script' | 'flow_control' | 'ai' | 'other';
299
543
  /** A single captured test action step. */
300
544
  interface ActionStep {
301
545
  readonly title: string;
302
546
  readonly category: ActionCategory;
547
+ /** The driver's own finer-grained category, when it reported one. */
548
+ readonly kind?: StepKind | null;
549
+ /** Element selector this step acted on, when the driver reported one. */
550
+ readonly selector?: string | null;
303
551
  readonly timestamp: string;
304
552
  readonly duration: number;
305
553
  readonly videoOffset: number | null;
@@ -310,6 +558,14 @@ interface ActionStep {
310
558
  /** Level of a captured console/terminal log message. */
311
559
  type ConsoleLogLevel = 'log' | 'warn' | 'error' | 'info' | 'debug' | 'stdout' | 'stderr';
312
560
  /** A single captured console or terminal log entry. */
561
+ /**
562
+ * Where a captured log line came from.
563
+ *
564
+ * Browser consoles only ever produce `console`. Mobile runs mix several
565
+ * streams, and telling a crash log from ordinary logcat chatter is the whole
566
+ * point of showing them — so the stream survives to the row.
567
+ */
568
+ type LogSource = 'console' | 'logcat' | 'syslog' | 'crashlog' | 'browser' | 'safariConsole' | 'performance' | 'server' | 'bidi' | 'driver';
313
569
  interface ConsoleLogEntry {
314
570
  /** Log level or stream type */
315
571
  readonly level: ConsoleLogLevel;
@@ -319,6 +575,14 @@ interface ConsoleLogEntry {
319
575
  readonly timestamp: string;
320
576
  /** Source file location (browser console only, best-effort) */
321
577
  readonly location: string | null;
578
+ /** Which stream produced the line. Defaults to `console` when absent. */
579
+ readonly source?: LogSource | null;
580
+ /** Emitting tag, e.g. an Android logcat tag like "ActivityManager". */
581
+ readonly tag?: string | null;
582
+ /** Emitting process id, when the stream reports one. */
583
+ readonly pid?: number | null;
584
+ /** Stack trace attached to the line (crash logs). */
585
+ readonly stackTrace?: string | null;
322
586
  }
323
587
  /** Report generation mode. */
324
588
  type ReportMode = 'streaming' | 'embedded' | 'auto';
@@ -453,6 +717,14 @@ interface TestRelicFilePayload {
453
717
  readonly apiCallsFile: string | null;
454
718
  /** Number of API call items in the file. */
455
719
  readonly apiCallsCount: number;
720
+ /**
721
+ * Response-status mix of the calls in the file.
722
+ *
723
+ * Tallied as each record is appended. The file itself is never read back
724
+ * into memory in streaming mode, so an aggregate computed at write time is
725
+ * the only way the grid can show a row's status chips.
726
+ */
727
+ readonly apiStatusMix?: ApiCallsByStatusRange | null;
456
728
  }
457
729
  /** Type guard: validates that a parsed object is a v2 file-based payload. */
458
730
  declare function isTestRelicFilePayload(obj: unknown): obj is TestRelicFilePayload;
@@ -467,7 +739,21 @@ interface CloudConfig {
467
739
  readonly apiKey: string | null;
468
740
  readonly endpoint: string;
469
741
  readonly uploadStrategy: UploadStrategy;
742
+ /** Per-request ceiling. ⚠ It governed only the auth handshake until 2.14.0 —
743
+ * the upload calls used bare `fetch` and inherited undici's 5-minute
744
+ * defaults, so a tester who set this had bounded the token exchange and
745
+ * nothing else. It now bounds the upload requests too. */
470
746
  readonly timeout: number;
747
+ /** Total time the whole upload phase may take before it gives up, writes the
748
+ * queue and lets the process exit. The phase runs inside Playwright's
749
+ * `onEnd`, so this is the difference between a late run and a run that never
750
+ * finishes. Default 120s.
751
+ *
752
+ * ⛔ OPTIONAL on purpose. `CloudConfig` is built by every analytics package
753
+ * (appium, maestro, playwright), and making a new field required breaks all
754
+ * of them at once for a knob only one upload path reads — CI caught exactly
755
+ * that. Callers resolve it as `?? DEFAULT_UPLOAD_BUDGET_MS`. */
756
+ readonly uploadBudgetMs?: number;
471
757
  readonly projectName: string | null;
472
758
  readonly queueMaxAge: number;
473
759
  readonly queueDirectory: string;
@@ -518,6 +804,8 @@ interface CloudReporterOptions {
518
804
  readonly endpoint?: string;
519
805
  readonly upload?: UploadStrategy;
520
806
  readonly timeout?: number;
807
+ /** Total budget for the upload phase (ms). See CloudConfig.uploadBudgetMs. */
808
+ readonly uploadBudgetMs?: number;
521
809
  readonly projectName?: string;
522
810
  readonly queueMaxAge?: string;
523
811
  readonly queueDirectory?: string;
@@ -530,10 +818,10 @@ interface MergeOptions {
530
818
  }
531
819
  /** A single artifact file within a test's artifact folder. */
532
820
  interface ArtifactFile {
533
- /** File name (e.g., `screenshot.png`, `video.webm`) */
821
+ /** File name (e.g., `screenshot.png`, `video.webm`, `trace.zip`) */
534
822
  readonly name: string;
535
823
  /** Artifact type for rendering */
536
- readonly type: 'screenshot' | 'video' | 'other';
824
+ readonly type: 'screenshot' | 'video' | 'trace' | 'baseline' | 'diff' | 'dom' | 'other';
537
825
  /** Path relative to the report output directory */
538
826
  readonly relativePath: string;
539
827
  /** File size in bytes */
@@ -596,6 +884,8 @@ interface TestIndexEntry {
596
884
  readonly retryIndex: number;
597
885
  /** Test tags */
598
886
  readonly tags: readonly string[];
887
+ /** What kind of test this is — badges the row, and picks the row's evidence. */
888
+ readonly testType?: TestType;
599
889
  /** Whether this test has network request data */
600
890
  readonly hasNetworkData: boolean;
601
891
  /** Whether this test has console log data */
@@ -604,6 +894,20 @@ interface TestIndexEntry {
604
894
  readonly hasArtifacts: boolean;
605
895
  /** Whether this test has action step data */
606
896
  readonly hasActionSteps: boolean;
897
+ /** Number of visual baseline comparisons recorded */
898
+ readonly visualCount?: number;
899
+ /** Of those, how many differed from their baseline */
900
+ readonly visualFailedCount?: number;
901
+ /** DOM elements that differed across this test's comparisons */
902
+ readonly domChangeCount?: number;
903
+ /**
904
+ * Report-relative path to a diff image for this test, when one exists.
905
+ *
906
+ * Carried on the index so the run overview can show the failure itself
907
+ * rather than only describing it — the grid must never fetch per-test
908
+ * detail files to render.
909
+ */
910
+ readonly visualDiffPath?: string;
607
911
  /** First line of error message (failed/flaky tests only) */
608
912
  readonly errorMessage: string | null;
609
913
  /** Number of network requests captured */
@@ -612,8 +916,38 @@ interface TestIndexEntry {
612
916
  readonly consoleCount: number;
613
917
  /** Number of action steps captured */
614
918
  readonly actionCount: number;
919
+ /** API calls captured for this test. */
920
+ readonly apiCallCount?: number;
921
+ /** Response-status mix of those calls, for the row's status chips. */
922
+ readonly apiStatusMix?: ApiCallsByStatusRange;
923
+ /** API assertions that passed during this test. */
924
+ readonly assertionsPassed?: number;
925
+ /** API assertions that failed during this test. */
926
+ readonly assertionsFailed?: number;
927
+ /**
928
+ * The first failed assertion, flattened to strings.
929
+ *
930
+ * The run overview leads with "expected 101, received undefined" and must
931
+ * do so without opening the test's detail file. The first line of an API
932
+ * failure message is the matcher wrapper, which says nothing.
933
+ */
934
+ readonly firstFailedAssertion?: FailedAssertionSummary;
935
+ /** The device this test drove (mobile runs only). */
936
+ readonly device?: DeviceInfo | null;
937
+ /** Action steps for this test, bucketed by the driver's own category. */
938
+ readonly stepKinds?: Record<string, number>;
939
+ /** Device-log errors and fatals recorded during this test. */
940
+ readonly deviceLogErrors?: number;
941
+ /** Whether a crash-log line was recorded during this test. */
942
+ readonly hasCrashLog?: boolean;
943
+ /** Whether a screen recording exists for this test. */
944
+ readonly hasVideo?: boolean;
945
+ /** AI-detected defects attributed to this test. */
946
+ readonly aiDefectCount?: number;
615
947
  /** Whether this is a retry attempt (not the final attempt) */
616
948
  readonly isRetry: boolean;
949
+ /** Stable key shared by every attempt of the same test (same across retries, unlike `id`) */
950
+ readonly retryGroupKey: string;
617
951
  }
618
952
  /**
619
953
  * Full detail data for a single test, stored on disk.
@@ -633,6 +967,8 @@ interface TestDetailData {
633
967
  readonly actions: readonly ActionStep[];
634
968
  /** References to screenshot/video files */
635
969
  readonly artifacts: TestArtifacts | null;
970
+ /** Visual baseline comparisons (inline — a handful per test at most) */
971
+ readonly visual?: readonly VisualComparison[] | null;
636
972
  /** Error details for failed/flaky tests */
637
973
  readonly failureDiagnostic: FailureDiagnostic | null;
638
974
  /** Whether network.jsonl exists for this test */
@@ -649,6 +985,10 @@ interface TestDetailData {
649
985
  readonly apiCallsCount: number;
650
986
  /** Test start time (ISO 8601) — used for video sync */
651
987
  readonly startedAt?: string;
988
+ /** The device this test drove (mobile runs only). */
989
+ readonly device?: DeviceInfo | null;
990
+ /** AI-detected defects attributed to this test. */
991
+ readonly aiDefects?: readonly AiDefect[] | null;
652
992
  }
653
993
  /** Streaming report summary — running counters written to summary.json. */
654
994
  interface StreamingReportSummary {
@@ -802,4 +1142,4 @@ declare function isValidCloudConfig(input: unknown): input is CloudConfig;
802
1142
  declare function isValidQueueEntry(input: unknown): input is QueueEntry;
803
1143
  declare function isValidTestRunReport(value: unknown): value is TestRunReport;
804
1144
 
805
- export { ATTACHMENT_CONTENT_TYPE, ATTACHMENT_NAME, type ActionCategory, type ActionStep, type ApiAssertion, type ApiCallRecord, type ApiCallStep, type ApiCallStepRequest, type ApiCallStepResponse, type ArtifactFile, type ArtifactRunEntry, type ArtifactRunManifest, type ArtifactTestEntry, type AssertionLocation, type AssertionType, type AuthMode, type AuthState, type CIMetadata, type CIProvider, type CapturedNetworkRequest, type CloudConfig, type CloudReporterOptions, type ConsoleLogEntry, type ConsoleLogLevel, ErrorCode, type FailureDiagnostic, type GitMetadata, type LogLevel, type Logger, type LoggerOptions, type MergeOptions, type NavigationAnnotation, type NavigationStep, type NavigationType, type NetworkStats, PAYLOAD_VERSION, PAYLOAD_VERSION_LEGACY, type QueueEntry, type RepoResolution, type ReportMode, type ReporterConfig, type ResourceBreakdown, type ResourceType, type StepAssertion, type StepTestIdentity, type StreamingFileStats, type StreamingReportManifest, type StreamingReportSummary, type StreamingValidation, type StreamingWriteError, type Summary, type TestArtifacts, type TestDetailData, type TestIndexEntry, type TestRelicDataPayload, TestRelicError, type TestRelicFilePayload, type TestResult, type TestRunReport, type TestStatus, type TestType, type TimelineEntry, type TimelineStep, type UploadStrategy, createError, createLogger, isTestRelicDataPayload, isTestRelicFilePayload, isValidApiKeyFormat, isValidCloudConfig, isValidConfig, isValidEndpointUrl, isValidNavigationType, isValidQueueEntry, isValidTestRunReport, isValidUploadStrategy };
1145
+ export { ATTACHMENT_CONTENT_TYPE, ATTACHMENT_NAME, type ActionCategory, type ActionStep, type AiDefect, type AiDefectSeverity, type AiDefectType, type ApiAssertion, type ApiCallRecord, type ApiCallStep, type ApiCallStepRequest, type ApiCallStepResponse, type ApiCallsByStatusRange, type ApiResponseTimeStats, type AppTestMode, type ArtifactFile, type ArtifactRunEntry, type ArtifactRunManifest, type ArtifactTestEntry, type AssertionLocation, type AssertionType, type AuthMode, type AuthState, type CIMetadata, type CIProvider, type CapturedCookie, type CapturedNetworkRequest, type CloudConfig, type CloudReporterOptions, type ConsoleLogEntry, type ConsoleLogLevel, type DeviceInfo, type DomChange, type DomChangeKind, type DomStyleChange, ErrorCode, type FailedAssertionSummary, type FailureDiagnostic, type GitMetadata, type LogLevel, type LogSource, type Logger, type LoggerOptions, type MergeOptions, type MobilePlatform, type NavigationAnnotation, type NavigationStep, type NavigationType, type NetworkStats, PAYLOAD_VERSION, PAYLOAD_VERSION_LEGACY, type QueueEntry, type RepoResolution, type ReportMode, type ReporterConfig, type ResourceBreakdown, type ResourceType, type StepAssertion, type StepKind, type StepTestIdentity, type StreamingFileStats, type StreamingReportManifest, type StreamingReportSummary, type StreamingValidation, type StreamingWriteError, type Summary, type TestArtifacts, type TestDetailData, type TestIndexEntry, type TestRelicDataPayload, TestRelicError, type TestRelicFilePayload, type TestResult, type TestRunReport, type TestStatus, type TestType, type TimelineEntry, type TimelineStep, type UploadStrategy, type VisualComparison, type VisualSource, type VisualStatus, createError, createLogger, isTestRelicDataPayload, isTestRelicFilePayload, isValidApiKeyFormat, isValidCloudConfig, isValidConfig, isValidEndpointUrl, isValidNavigationType, isValidQueueEntry, isValidTestRunReport, isValidUploadStrategy };