@qontinui/shared-types 2.4.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/scheduler.d.cts +81 -0
  2. package/dist/scheduler.d.ts +81 -0
  3. package/package.json +1 -1
  4. package/src/generated/ChangeTimeline.d.ts +484 -0
  5. package/src/generated/CriterionVerification.d.ts +11 -0
  6. package/src/generated/DetectedAnimation.d.ts +32 -0
  7. package/src/generated/EarsPattern.d.ts +20 -0
  8. package/src/generated/EdgeTiming.d.ts +156 -0
  9. package/src/generated/ExecutePlaybookStep.d.ts +5 -4
  10. package/src/generated/ExternalRef.d.ts +22 -0
  11. package/src/generated/InterfaceMappingFrontmatter.d.ts +21 -0
  12. package/src/generated/JourneyArrivalDoubt.d.ts +26 -0
  13. package/src/generated/JourneyCoverage.d.ts +91 -0
  14. package/src/generated/JourneyDeadEnds.d.ts +109 -0
  15. package/src/generated/JourneyEdgeObservation.d.ts +3 -2
  16. package/src/generated/JourneyEdgeTimingAnswer.d.ts +88 -0
  17. package/src/generated/JourneyFilter.d.ts +35 -0
  18. package/src/generated/JourneyFrontier.d.ts +51 -0
  19. package/src/generated/JourneyGraph.d.ts +165 -0
  20. package/src/generated/JourneyGraphEdge.d.ts +45 -0
  21. package/src/generated/JourneyPriorKnowledge.d.ts +112 -0
  22. package/src/generated/JourneyReachable.d.ts +64 -0
  23. package/src/generated/JourneySearchFrontier.d.ts +59 -0
  24. package/src/generated/JourneySearchFrontierNode.d.ts +37 -0
  25. package/src/generated/JourneySteps.d.ts +65 -0
  26. package/src/generated/JourneyUnmeasuredDepartures.d.ts +84 -0
  27. package/src/generated/ManagedBy.d.ts +45 -0
  28. package/src/generated/MappingRow.d.ts +23 -0
  29. package/src/generated/MetricDistribution.d.ts +54 -0
  30. package/src/generated/RecurringAgentDispatchRole.d.ts +11 -0
  31. package/src/generated/RecurringAgentExcludedValue.d.ts +20 -0
  32. package/src/generated/RecurringAgentOs.d.ts +11 -0
  33. package/src/generated/RecurringAgentOverride.d.ts +48 -0
  34. package/src/generated/RecurringAgentParamDef.d.ts +100 -0
  35. package/src/generated/RecurringAgentParamKind.d.ts +89 -0
  36. package/src/generated/RecurringAgentParamSchema.d.ts +16 -0
  37. package/src/generated/RecurringAgentSpec.d.ts +91 -0
  38. package/src/generated/RecurringAgentState.d.ts +13 -0
  39. package/src/generated/RecurringAgentStatus.d.ts +79 -0
  40. package/src/generated/RecurringAgentStatusReport.d.ts +48 -0
  41. package/src/generated/RecurringAgentTarget.d.ts +78 -0
  42. package/src/generated/RequestFrontmatter.d.ts +30 -0
  43. package/src/generated/RequirementFrontmatter.d.ts +31 -0
  44. package/src/generated/ScheduledTask.d.ts +15 -0
  45. package/src/generated/ScheduledTaskType.d.ts +21 -0
  46. package/src/generated/SourceCitation.d.ts +25 -0
  47. package/src/generated/SourceCitationKind.d.ts +12 -0
  48. package/src/generated/SpecAcceptanceCriterion.d.ts +28 -0
  49. package/src/generated/SpecFrontmatter.d.ts +36 -0
  50. package/src/generated/SpecLanguage.d.ts +11 -0
  51. package/src/generated/StoryFrontmatter.d.ts +26 -0
  52. package/src/generated/TemplateRef.d.ts +17 -0
  53. package/src/generated/UnknownCode.d.ts +8 -1
  54. package/src/generated/index.ts +45 -3
  55. package/src/generated/CapabilityState.d.ts +0 -25
  56. package/src/generated/CliProfile.d.ts +0 -492
  57. package/src/generated/SessionFailure.d.ts +0 -129
@@ -0,0 +1,484 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ import type { CacheProvenance } from "./CacheProvenance";
9
+ import type { DetectedAnimation } from "./DetectedAnimation";
10
+ import type { Observation } from "./Observation";
11
+ import type { ObservationCoverage } from "./ObservationCoverage";
12
+ import type { Producer } from "./Producer";
13
+ import type { Provenance } from "./Provenance";
14
+ import type { UnknownCode } from "./UnknownCode";
15
+ import type { UnknownInfo } from "./UnknownInfo";
16
+ import type { UnmeasuredDimension } from "./UnmeasuredDimension";
17
+
18
+ /**
19
+ * A single event in the interaction timeline, discriminated on `type`.
20
+ */
21
+ export type TimelineEvent =
22
+ | {
23
+ /**
24
+ * Time offset from action start (ms).
25
+ */
26
+ offsetMs: number;
27
+ /**
28
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
29
+ */
30
+ summary: string;
31
+ type: "action";
32
+ [k: string]: unknown;
33
+ }
34
+ | {
35
+ /**
36
+ * Number of elements affected.
37
+ */
38
+ count: number;
39
+ /**
40
+ * Element IDs involved.
41
+ */
42
+ elementIds: string[];
43
+ /**
44
+ * Time offset from action start (ms).
45
+ */
46
+ offsetMs: number;
47
+ /**
48
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
49
+ */
50
+ summary: string;
51
+ type: "elements-appeared";
52
+ [k: string]: unknown;
53
+ }
54
+ | {
55
+ /**
56
+ * Number of elements affected.
57
+ */
58
+ count: number;
59
+ /**
60
+ * Element IDs involved.
61
+ */
62
+ elementIds: string[];
63
+ /**
64
+ * Time offset from action start (ms).
65
+ */
66
+ offsetMs: number;
67
+ /**
68
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
69
+ */
70
+ summary: string;
71
+ type: "elements-disappeared";
72
+ [k: string]: unknown;
73
+ }
74
+ | {
75
+ /**
76
+ * Number of elements affected.
77
+ */
78
+ count: number;
79
+ /**
80
+ * Element IDs involved.
81
+ */
82
+ elementIds: string[];
83
+ /**
84
+ * Time offset from action start (ms).
85
+ */
86
+ offsetMs: number;
87
+ /**
88
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
89
+ */
90
+ summary: string;
91
+ type: "elements-modified";
92
+ [k: string]: unknown;
93
+ }
94
+ | {
95
+ /**
96
+ * Time offset from action start (ms).
97
+ */
98
+ offsetMs: number;
99
+ /**
100
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
101
+ */
102
+ summary: string;
103
+ type: "page-changed";
104
+ /**
105
+ * The new URL, or `null` when the diff did not carry one.
106
+ */
107
+ url?: string | null;
108
+ [k: string]: unknown;
109
+ }
110
+ | {
111
+ /**
112
+ * Time offset from action start (ms).
113
+ */
114
+ offsetMs: number;
115
+ /**
116
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
117
+ */
118
+ summary: string;
119
+ type: "settled";
120
+ [k: string]: unknown;
121
+ }
122
+ | {
123
+ /**
124
+ * The browser's `hadRecentInput` flag for this shift.
125
+ */
126
+ hadRecentInput: boolean;
127
+ /**
128
+ * Time offset from action start (ms).
129
+ */
130
+ offsetMs: number;
131
+ /**
132
+ * How many shifted elements `shiftedFingerprints` named. NOT sent by
133
+ * the SDK: [`ChangeTimeline::for_ledger`] sets it when it empties
134
+ * `shiftedFingerprints`, so a stored timeline keeps the count and
135
+ * not the hashes. Absent on the wire from the SDK.
136
+ */
137
+ shiftedElementCount?: number | null;
138
+ /**
139
+ * `ElementFingerprintData.hash` of each shifted element still in the
140
+ * document.
141
+ */
142
+ shiftedFingerprints: string[];
143
+ /**
144
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
145
+ */
146
+ summary: string;
147
+ type: "layout-shift";
148
+ /**
149
+ * Shift sources whose node was gone (or not an element) when the
150
+ * entry was read.
151
+ */
152
+ unattributedSourceCount: number;
153
+ /**
154
+ * The shift score (Layout Instability API `value`).
155
+ */
156
+ value: number;
157
+ [k: string]: unknown;
158
+ }
159
+ | {
160
+ /**
161
+ * The animation.
162
+ */
163
+ animation: DetectedAnimation;
164
+ /**
165
+ * Time offset from action start (ms).
166
+ */
167
+ offsetMs: number;
168
+ /**
169
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
170
+ */
171
+ summary: string;
172
+ type: "animation-started";
173
+ [k: string]: unknown;
174
+ }
175
+ | {
176
+ /**
177
+ * The animation.
178
+ */
179
+ animation: DetectedAnimation;
180
+ /**
181
+ * Finished or cancelled.
182
+ */
183
+ endReason: "finished" | "cancelled";
184
+ /**
185
+ * Time offset from action start (ms).
186
+ */
187
+ offsetMs: number;
188
+ /**
189
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
190
+ */
191
+ summary: string;
192
+ type: "animation-ended";
193
+ [k: string]: unknown;
194
+ }
195
+ | {
196
+ /**
197
+ * Task duration (ms).
198
+ */
199
+ durationMs: number;
200
+ /**
201
+ * Time offset from action start (ms).
202
+ */
203
+ offsetMs: number;
204
+ /**
205
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
206
+ */
207
+ summary: string;
208
+ type: "long-task";
209
+ [k: string]: unknown;
210
+ }
211
+ | {
212
+ /**
213
+ * The request URL carried a query string (not reported).
214
+ */
215
+ hasQuery: boolean;
216
+ /**
217
+ * HTTP method.
218
+ */
219
+ method: string;
220
+ /**
221
+ * Time offset from action start (ms).
222
+ */
223
+ offsetMs: number;
224
+ /**
225
+ * The tracker's request id, or `null` when the source supplies none.
226
+ */
227
+ requestId?: string | null;
228
+ /**
229
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
230
+ */
231
+ summary: string;
232
+ type: "network-request-started";
233
+ /**
234
+ * Origin + pathname — never the query or fragment. Always a string
235
+ * from the SDK; `null` only in [`ChangeTimeline::for_ledger`]'s
236
+ * projection, when the URL had no valid `scheme://host` origin.
237
+ */
238
+ url?: string | null;
239
+ [k: string]: unknown;
240
+ }
241
+ | {
242
+ /**
243
+ * Request duration as the tracker measured it, or `null` without a
244
+ * response.
245
+ */
246
+ durationMs?: number | null;
247
+ /**
248
+ * The request threw (no HTTP response). An HTTP error status is NOT
249
+ * `errored` — read `statusCode`.
250
+ */
251
+ errored: boolean;
252
+ /**
253
+ * The request URL carried a query string (not reported).
254
+ */
255
+ hasQuery: boolean;
256
+ /**
257
+ * HTTP method.
258
+ */
259
+ method: string;
260
+ /**
261
+ * Time offset from action start (ms).
262
+ */
263
+ offsetMs: number;
264
+ /**
265
+ * The tracker's request id, or `null` when the source supplies none.
266
+ */
267
+ requestId?: string | null;
268
+ /**
269
+ * HTTP status, or `null` when no response arrived.
270
+ */
271
+ statusCode?: number | null;
272
+ /**
273
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
274
+ */
275
+ summary: string;
276
+ type: "network-request-finished";
277
+ /**
278
+ * Origin + pathname — never the query or fragment. Always a string
279
+ * from the SDK; `null` only in [`ChangeTimeline::for_ledger`]'s
280
+ * projection, when the URL had no valid `scheme://host` origin.
281
+ */
282
+ url?: string | null;
283
+ [k: string]: unknown;
284
+ }
285
+ | {
286
+ /**
287
+ * Time offset from action start (ms).
288
+ */
289
+ offsetMs: number;
290
+ /**
291
+ * The declared state id.
292
+ */
293
+ stateId: string;
294
+ /**
295
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
296
+ */
297
+ summary: string;
298
+ type: "state-entered";
299
+ [k: string]: unknown;
300
+ }
301
+ | {
302
+ /**
303
+ * Time offset from action start (ms).
304
+ */
305
+ offsetMs: number;
306
+ /**
307
+ * The declared state id.
308
+ */
309
+ stateId: string;
310
+ /**
311
+ * Human-readable summary (SDK prose — see the module's PRIVACY note).
312
+ */
313
+ summary: string;
314
+ type: "state-exited";
315
+ [k: string]: unknown;
316
+ };
317
+ /**
318
+ * A source of timeline events. A source NOT listed in
319
+ * [`ChangeTimeline::observed_sources`] was not looked at, so the absence of
320
+ * its events means "unknown", never "none".
321
+ */
322
+ export type TimelineSource =
323
+ | "snapshot-poll"
324
+ | "idle-detector"
325
+ | "layout-shift"
326
+ | "long-task"
327
+ | "animation-events"
328
+ | "get-animations"
329
+ | "network"
330
+ | "states";
331
+ /**
332
+ * How an expected state fared inside the caller's `withinMs` window. Exactly
333
+ * one key on the wire.
334
+ */
335
+ export type ExpectedStateOutcome =
336
+ | {
337
+ enteredAtMs: number;
338
+ }
339
+ | {
340
+ notEnteredWithinMs: number;
341
+ }
342
+ | {
343
+ activeThroughoutWithinMs: number;
344
+ };
345
+
346
+ /**
347
+ * The interaction timeline: action → every observed event → settled, each
348
+ * with its offset from the action, plus a derived [`TimelineSummary`].
349
+ */
350
+ export interface ChangeTimeline {
351
+ /**
352
+ * Timestamped events, ordered by `offsetMs` (ties keep arrival order).
353
+ */
354
+ events: TimelineEvent[];
355
+ /**
356
+ * The sources this recording could observe.
357
+ */
358
+ observedSources: TimelineSource[];
359
+ /**
360
+ * How long the timeline was recorded, from action start (ms): the settle
361
+ * window, extended by any `withinMs` window. Not the settle time.
362
+ */
363
+ recordedMs: number;
364
+ /**
365
+ * Whether the UI reached a stable state within `settleTimeout`.
366
+ */
367
+ settled: boolean;
368
+ summary: TimelineSummary;
369
+ [k: string]: unknown;
370
+ }
371
+ /**
372
+ * Values derived from `events`.
373
+ */
374
+ export interface TimelineSummary {
375
+ /**
376
+ * Animations/transitions running when recording ended. Degraded
377
+ * (`coverage.unmeasured`) where `document.getAnimations` is missing.
378
+ */
379
+ animationsUnsettledAtEnd:
380
+ | {
381
+ provenance: Provenance;
382
+ status: "measured";
383
+ value: DetectedAnimation[];
384
+ [k: string]: unknown;
385
+ }
386
+ | {
387
+ provenance: Provenance;
388
+ status: "absent";
389
+ [k: string]: unknown;
390
+ }
391
+ | {
392
+ provenance: Provenance;
393
+ status: "unknown";
394
+ unknown: UnknownInfo;
395
+ [k: string]: unknown;
396
+ };
397
+ /**
398
+ * One entry per requested `expectStates` id, in request order; `[]` when
399
+ * none were requested.
400
+ */
401
+ expectedStates: ExpectedStateResult[];
402
+ /**
403
+ * Offset of the first RESPONSE event (elements-*, page-changed,
404
+ * layout-shift, animation-*, state-*). `unknown{no_event_before_timeout}`
405
+ * when nothing responded in the window.
406
+ */
407
+ firstResponseMs: Observation;
408
+ /**
409
+ * Offset of the LAST layout shift minus `firstResponseMs`. `absent` when
410
+ * no shift occurred.
411
+ */
412
+ layoutShiftAfterFirstResponseMs: Observation;
413
+ /**
414
+ * Number of `layout-shift` events. Same unknown rule.
415
+ */
416
+ layoutShiftCount:
417
+ | {
418
+ provenance: Provenance;
419
+ status: "measured";
420
+ value: number;
421
+ [k: string]: unknown;
422
+ }
423
+ | {
424
+ provenance: Provenance;
425
+ status: "absent";
426
+ [k: string]: unknown;
427
+ }
428
+ | {
429
+ provenance: Provenance;
430
+ status: "unknown";
431
+ unknown: UnknownInfo;
432
+ [k: string]: unknown;
433
+ };
434
+ /**
435
+ * Sum of `layout-shift` values in the window.
436
+ * `unknown{performance_observer_unsupported}` where the entry type is
437
+ * missing.
438
+ */
439
+ layoutShiftTotal: Observation;
440
+ /**
441
+ * Sum of `long-task` durations (ms).
442
+ * `unknown{performance_observer_unsupported}` where `longtask` is
443
+ * missing.
444
+ */
445
+ longTaskTotalMs: Observation;
446
+ /**
447
+ * Offset of the `settled` event. `unknown{no_event_before_timeout}` when
448
+ * the UI did not settle within `settleTimeout`.
449
+ */
450
+ settleMs: Observation;
451
+ [k: string]: unknown;
452
+ }
453
+ /**
454
+ * One `expectStates` entry and its answer.
455
+ */
456
+ export interface ExpectedStateResult {
457
+ /**
458
+ * The answer — `unknown{input_missing}` for an undeclared state or no
459
+ * state registry.
460
+ */
461
+ outcome:
462
+ | {
463
+ provenance: Provenance;
464
+ status: "measured";
465
+ value: ExpectedStateOutcome;
466
+ [k: string]: unknown;
467
+ }
468
+ | {
469
+ provenance: Provenance;
470
+ status: "absent";
471
+ [k: string]: unknown;
472
+ }
473
+ | {
474
+ provenance: Provenance;
475
+ status: "unknown";
476
+ unknown: UnknownInfo;
477
+ [k: string]: unknown;
478
+ };
479
+ /**
480
+ * The declared state id the caller asked about.
481
+ */
482
+ stateId: string;
483
+ [k: string]: unknown;
484
+ }
@@ -0,0 +1,11 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ /**
9
+ * How an acceptance criterion is verified.
10
+ */
11
+ export type CriterionVerification = "command" | "ui_bridge" | "test" | "manual";
@@ -0,0 +1,32 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ /**
9
+ * One CSS animation or transition, as the SDK's idle signals and the
10
+ * timeline report it (`idle/detected-animation.ts`).
11
+ */
12
+ export interface DetectedAnimation {
13
+ /**
14
+ * Duration (ms) when known — the elapsed time at end, or the effect's
15
+ * timing.
16
+ */
17
+ durationMs?: number | null;
18
+ /**
19
+ * Whether the animation repeats forever.
20
+ */
21
+ isInfinite: boolean;
22
+ /**
23
+ * `animationName`, or `transition:<property>` for a CSS transition.
24
+ */
25
+ name: string;
26
+ /**
27
+ * `ElementFingerprintData.hash` of the animated element, when it could
28
+ * be computed.
29
+ */
30
+ targetElement?: string | null;
31
+ [k: string]: unknown;
32
+ }
@@ -0,0 +1,20 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ /**
9
+ * EARS requirement pattern (Easy Approach to Requirements Syntax).
10
+ * Categorizes criteria by their trigger/condition pattern for better
11
+ * verification step generation.
12
+ */
13
+ export type EarsPattern =
14
+ | "ubiquitous"
15
+ | "event_driven"
16
+ | "state_driven"
17
+ | "optional"
18
+ | "complex"
19
+ | "unwanted_behavior"
20
+ | "not_applicable";
@@ -0,0 +1,156 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * This file was automatically generated.
4
+ * DO NOT MODIFY IT BY HAND. Regenerate with
5
+ * `qontinui-runner/src-tauri/scripts/generate_types.sh`.
6
+ */
7
+
8
+ import type { CacheProvenance } from "./CacheProvenance";
9
+ import type { MetricDistribution } from "./MetricDistribution";
10
+ import type { Observation } from "./Observation";
11
+ import type { ObservationCoverage } from "./ObservationCoverage";
12
+ import type { Producer } from "./Producer";
13
+ import type { Provenance } from "./Provenance";
14
+ import type { UnknownCode } from "./UnknownCode";
15
+ import type { UnknownInfo } from "./UnknownInfo";
16
+ import type { UnmeasuredDimension } from "./UnmeasuredDimension";
17
+
18
+ /**
19
+ * One UI Bridge observation: `measured` (with `value`), `absent` (the
20
+ * producer considered at least one item, measured all of it, and found
21
+ * nothing), or `unknown` (the producer could not answer; `unknown.code` says
22
+ * why). `provenance` is always present and every one of its keys is always
23
+ * present.
24
+ *
25
+ * This type describes the wire SHAPE only; it is not a validator. It
26
+ * accepts envelopes the canonical parser refuses: `absent` carrying `value`
27
+ * or `unknown`, a present `"unknown": null`, and `absent` over non-empty
28
+ * `provenance.coverage.unmeasured` or over `provenance.coverage.considered`
29
+ * of 0. Parse an envelope you did not build with
30
+ * `qontinui_vision_core::Observation` (Rust) or a parser enforcing the same
31
+ * rules.
32
+ */
33
+ export type Observation2 =
34
+ | {
35
+ provenance: Provenance;
36
+ status: "measured";
37
+ value: number;
38
+ [k: string]: unknown;
39
+ }
40
+ | {
41
+ provenance: Provenance;
42
+ status: "absent";
43
+ [k: string]: unknown;
44
+ }
45
+ | {
46
+ provenance: Provenance;
47
+ status: "unknown";
48
+ unknown: UnknownInfo;
49
+ [k: string]: unknown;
50
+ };
51
+
52
+ /**
53
+ * The answer of [`edge_timing`].
54
+ */
55
+ export interface EdgeTiming {
56
+ /**
57
+ * Distinct reported app versions, sorted, `null` (= not reported) first.
58
+ */
59
+ appVersions: (string | null)[];
60
+ /**
61
+ * `summary.firstResponseMs`.
62
+ */
63
+ firstResponseMs: MetricDistribution;
64
+ /**
65
+ * `summary.layoutShiftAfterFirstResponseMs`.
66
+ */
67
+ layoutShiftAfterFirstResponseMs: MetricDistribution;
68
+ /**
69
+ * `summary.layoutShiftCount`.
70
+ */
71
+ layoutShiftCount: MetricDistribution;
72
+ /**
73
+ * `summary.layoutShiftTotal`.
74
+ */
75
+ layoutShiftTotal: MetricDistribution;
76
+ /**
77
+ * `summary.longTaskTotalMs`.
78
+ */
79
+ longTaskTotalMs: MetricDistribution;
80
+ /**
81
+ * Samples (ledger rows) the answer is over.
82
+ */
83
+ n: number;
84
+ /**
85
+ * Latest `observedAt`; `null` when `n` is 0.
86
+ */
87
+ newestObservedAt?: string | null;
88
+ /**
89
+ * Every observation's raw values, ordered by `(observedAt,
90
+ * observationId)`, ties broken by the serialized `(appVersion,
91
+ * timeline)`.
92
+ */
93
+ observations: EdgeTimingRow[];
94
+ /**
95
+ * Earliest `observedAt`; `null` when `n` is 0.
96
+ */
97
+ oldestObservedAt?: string | null;
98
+ /**
99
+ * `summary.settleMs`.
100
+ */
101
+ settleMs: MetricDistribution;
102
+ /**
103
+ * Of those, rows with no timeline.
104
+ */
105
+ withoutTimeline: number;
106
+ [k: string]: unknown;
107
+ }
108
+ /**
109
+ * One observation's values as its timeline summary stated them,
110
+ * ledger-projected (status, value, coverage and unknown code kept; unknown
111
+ * detail replaced by its code; source and cache keys redacted). `null` (for
112
+ * every metric) = the row has no timeline.
113
+ */
114
+ export interface EdgeTimingRow {
115
+ /**
116
+ * `null` = not reported.
117
+ */
118
+ appVersion?: string | null;
119
+ /**
120
+ * `summary.firstResponseMs`.
121
+ */
122
+ firstResponseMs?: Observation | null;
123
+ /**
124
+ * Whether the row carried a timeline.
125
+ */
126
+ hasTimeline: boolean;
127
+ /**
128
+ * `summary.layoutShiftAfterFirstResponseMs`.
129
+ */
130
+ layoutShiftAfterFirstResponseMs?: Observation | null;
131
+ /**
132
+ * `summary.layoutShiftCount`.
133
+ */
134
+ layoutShiftCount?: Observation2 | null;
135
+ /**
136
+ * `summary.layoutShiftTotal`.
137
+ */
138
+ layoutShiftTotal?: Observation | null;
139
+ /**
140
+ * `summary.longTaskTotalMs`.
141
+ */
142
+ longTaskTotalMs?: Observation | null;
143
+ /**
144
+ * The ledger row id — a `/vision/assert` `timeline_ref`.
145
+ */
146
+ observationId: string;
147
+ /**
148
+ * RFC 3339 UTC.
149
+ */
150
+ observedAt: string;
151
+ /**
152
+ * `summary.settleMs`.
153
+ */
154
+ settleMs?: Observation | null;
155
+ [k: string]: unknown;
156
+ }