@uptimizr/metrics 0.0.0 → 0.2.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.
@@ -49,7 +49,7 @@ import type { EventType } from "@uptimizr/schema";
49
49
  * so adding, renaming or deleting an aggregation without updating this list
50
50
  * fails the build and names the offender.
51
51
  */
52
- export declare const AGGREGATION_BUILDER_NAMES: readonly ["buildAggregateTrajectories", "buildArPlacementAttempts", "buildArPlacementSurfaces", "buildArPlacementTimeToPlace", "buildBacktrackRatio", "buildBoundaryContacts", "buildBoundaryHeatmap", "buildBoundaryHeatmapStats", "buildCameraDirectionHeatmap", "buildCameraDistance", "buildCameraGestures", "buildCameraPositionHeatmap", "buildCapabilityChanges", "buildClickGazeRay", "buildCompileStalls", "buildDeadClicks", "buildDistinctScenes", "buildErrorHeatmap", "buildEventTypeCounts", "buildEventsDaily", "buildFlowHeatmap", "buildFpsHistogram", "buildFrameTimePercentiles", "buildFunnel", "buildGazeHeatmap", "buildGazeHeatmapStats", "buildGraphicsDiagnosticCounts", "buildHoverDwell", "buildInteractionsBySource", "buildJankRate", "buildListSessions", "buildLoadBounceFunnel", "buildMeshBlindSpots", "buildMeshDwell", "buildMeshInteractionKinds", "buildMeshUvHeatmap", "buildNavigationStats", "buildPerfByDevice", "buildPerfByScene", "buildPerfChurn", "buildPerfDaily", "buildPerfDistribution", "buildPerfHeatmap", "buildPerfSummary", "buildPointerHeatmap", "buildRageClicks", "buildReachability", "buildRenderScaleTruth", "buildRenderingTechnology", "buildResourcePercentiles", "buildResourceSummary", "buildSceneCoverage", "buildSceneRetention", "buildSessionTrajectory", "buildStabilityCounts", "buildTimeseries", "buildTopInputActions", "buildTopMeshes", "buildTopMeshesBySource", "buildTopMeshesTrend", "buildTrackingQuality", "buildVariantLeaderboard", "buildViewCoverageHistogram", "buildWorldHeatmap", "buildWorldHeatmapStats", "buildXrAbandonment", "buildXrLocomotionComfort", "buildXrRotationRate", "buildXrSourceUsage"];
52
+ export declare const AGGREGATION_BUILDER_NAMES: readonly ["buildAggregateTrajectories", "buildArPlacementAttempts", "buildArPlacementSurfaces", "buildArPlacementTimeToPlace", "buildBacktrackRatio", "buildBoundaryContacts", "buildBoundaryHeatmap", "buildBoundaryHeatmapStats", "buildCameraDirectionHeatmap", "buildCameraDistance", "buildCameraGestures", "buildCameraPositionHeatmap", "buildCapabilityChanges", "buildClickGazeRay", "buildCompileStalls", "buildCustomEventVocabulary", "buildDeadClicks", "buildDistinctScenes", "buildErrorHeatmap", "buildEventTypeCounts", "buildEventsDaily", "buildFlowHeatmap", "buildFpsHistogram", "buildFrameTimePercentiles", "buildFunnel", "buildGazeHeatmap", "buildGazeHeatmapStats", "buildGraphicsDiagnosticCounts", "buildHoverDwell", "buildInteractionsBySource", "buildJankRate", "buildListSessions", "buildLoadBounceFunnel", "buildMeshBlindSpots", "buildMeshDwell", "buildMeshInteractionKinds", "buildMeshUvHeatmap", "buildNavigationStats", "buildPerfByDevice", "buildPerfByScene", "buildPerfChurn", "buildPerfDaily", "buildPerfDistribution", "buildPerfHeatmap", "buildPerfSummary", "buildPointerHeatmap", "buildRageClicks", "buildReachability", "buildRenderScaleTruth", "buildRenderingTechnology", "buildResourcePercentiles", "buildResourceSummary", "buildSceneCoverage", "buildSceneRetention", "buildSessionTrajectory", "buildStabilityCounts", "buildTimeseries", "buildTopInputActions", "buildTopMeshes", "buildTopMeshesBySource", "buildTopMeshesTrend", "buildTrackingQuality", "buildVariantLeaderboard", "buildViewCoverageHistogram", "buildWorldHeatmap", "buildWorldHeatmapStats", "buildXrAbandonment", "buildXrLocomotionComfort", "buildXrRotationRate", "buildXrSourceUsage"];
53
53
  /** Every exported `build*` aggregation name. The registry must cover them all. */
54
54
  export type AggregationBuilderName = (typeof AGGREGATION_BUILDER_NAMES)[number];
55
55
  /**
@@ -61,18 +61,66 @@ export type AggregationBuilderName = (typeof AGGREGATION_BUILDER_NAMES)[number];
61
61
  export type DimensionId = "scene" | "session" | "mesh" | "name" | "source" | "event_type" | "cameraMode" | "device.engine" | "device.renderer" | "device.isMobile" | "device.browser" | "device.os";
62
62
  /** Where each {@link DimensionId} reads from in the event model. */
63
63
  export declare const DIMENSION_COLUMNS: Readonly<Record<DimensionId, string>>;
64
+ /**
65
+ * The column a {@link DimensionId} appears as in a metric's `row` when that
66
+ * metric is keyed by it.
67
+ *
68
+ * Several dimensions are *filterable* on a metric without being part of its
69
+ * grain (`top_meshes` can be scoped to a `session` but returns one row per
70
+ * mesh), which is what {@link MetricDefinition.grainDimensions} exists to
71
+ * express — this map is how that declaration is **checked**: every grain
72
+ * dimension must project one of the names listed here, and
73
+ * `src/__tests__/registry.test.ts` fails the build when one does not.
74
+ *
75
+ * Alternatives are listed where the projection name has varied: a scene rollup
76
+ * spells `scene` as `scene_id` and a transition as `from_scene`, and the `name`
77
+ * column surfaces as `kind` (an interaction or gesture kind), `action` (an input
78
+ * action) or `phase` (a compile stall). The **first** entry is the canonical
79
+ * spelling the generic group-by tier projects when the metric's own row does not
80
+ * already name one. `cameraMode` has none: no aggregation projects the camera
81
+ * type as a column, so it is a filter on the delegated tier and a generic-only
82
+ * group-by column (`camera_mode`) on the other.
83
+ */
84
+ export declare const DIMENSION_ROW_COLUMNS: Readonly<Record<DimensionId, readonly string[]>>;
85
+ /**
86
+ * The dimensions the **generic group-by tier** can render (design sketch §C.2).
87
+ *
88
+ * Restricted to what the store promotes to a column (`scene_id`, `session_id`,
89
+ * `mesh`, `name`, `source`, `event_type`) plus the session attributes every
90
+ * engine can read out of one `session_start` sub-select with the same SQL
91
+ * (`cameraMode`, the four `device.*` strings). `device.isMobile` is deliberately
92
+ * absent: it is the one session attribute that is a boolean rather than a label,
93
+ * so grouping by it would produce `"true"` / `"false"` text on some engines and
94
+ * `1` / `0` on others — the exact cross-engine disagreement this tier exists to
95
+ * avoid. Filter by it instead, or group by `device.os`.
96
+ */
97
+ export declare const GENERIC_DIMENSIONS: readonly DimensionId[];
64
98
  /**
65
99
  * Every request parameter the query surface accepts. Closed union, declared
66
100
  * once: a metric's `filters` are exactly the keys of the Zod querystring that
67
101
  * serves its endpoint (asserted by the collector's registry route test), and the
68
102
  * DSL will accept the same names.
69
103
  */
70
- export type FilterId = "since" | "until" | "scene" | "session" | "source" | "mesh" | "region" | "cameraMode" | "bins" | "limit" | "cellSize" | "interval" | "type" | "bucket" | "bucketMs" | "bucketSize" | "minRepeats" | "windowMs" | "fpsThreshold" | "stallMs" | "moveThreshold" | "rapidTurn" | "centerX" | "centerY" | "centerZ" | "severity" | "category" | "errorKind" | "groupByOrigin" | "originVoxel" | "steps" | "bands" | "variant" | "conversion" | "format";
104
+ export type FilterId = "since" | "until" | "scene" | "session" | "source" | "mesh" | "region" | "cameraMode" | "bins" | "limit" | "cellSize" | "interval" | "type" | "bucket" | "bucketMs" | "bucketSize" | "minRepeats" | "windowMs" | "fpsThreshold" | "stallMs" | "moveThreshold" | "rapidTurn" | "centerX" | "centerY" | "centerZ" | "severity" | "category" | "errorKind" | "groupByOrigin" | "originVoxel" | "steps" | "bands" | "variant" | "conversion" | "minDwellMs" | "maxEntries" | "metric" | "metrics" | "window" | "refSince" | "refUntil" | "sensitivity" | "weights" | "format";
71
105
  /**
72
106
  * The option interface (in `types.ts`) a {@link FilterId} feeds. `BuilderOptions`
73
107
  * means the builder's own inline option bag rather than a shared interface.
74
108
  */
75
109
  export type FilterOptionInterface = "RangeOptions" | "SceneOptions" | "SourceOptions" | "SessionOptions" | "MeshOptions" | "RegionOptions" | "CameraModeOptions" | "TimeseriesOptions" | "ErrorHeatmapOptions" | "PerfChurnOptions" | "FunnelOptions" | "LoadBounceFunnelOptions" | "VariantLeaderboardOptions" | "BuilderOptions"
110
+ /**
111
+ * Not an aggregation option either: the parameter is consumed by
112
+ * `buildSessionNarrative` — the pure compaction behind
113
+ * `GET /api/v1/sessions/:id/narrative` (ADR 0051 §7) — and never reaches a
114
+ * SQL builder.
115
+ */
116
+ | "SessionNarrativeOptions"
117
+ /**
118
+ * The option bag of an insight primitive (ADR 0051 §4). Not an aggregation
119
+ * option: it is consumed by `@uptimizr/db`'s pure `src/insights/` layer, which
120
+ * runs *over* another metric's bucket series rather than producing SQL of its
121
+ * own.
122
+ */
123
+ | "InsightOptions"
76
124
  /**
77
125
  * Not an aggregation option at all: the parameter is consumed by the
78
126
  * collector's response layer and never reaches a builder. Only `format`
@@ -121,7 +169,23 @@ export interface ColumnSemantics {
121
169
  /** What one row of a metric represents. */
122
170
  export type MetricGrain = "project" | "scene" | "session" | "mesh" | "bin" | "voxel" | "bucket" | "row";
123
171
  /** Grouping used by the docs, the capabilities resource and the health score. */
124
- export type MetricCategory = "attention" | "interaction" | "navigation" | "performance" | "errors" | "xr" | "ar" | "sessions" | "conversion";
172
+ export type MetricCategory = "attention" | "interaction" | "navigation" | "performance" | "errors" | "xr" | "ar" | "sessions" | "conversion"
173
+ /** Derived readings *about* other metrics — baselines, movers (ADR 0051 §4). */
174
+ | "insights";
175
+ /**
176
+ * The API-key capability an endpoint requires (ADR 0051 §7).
177
+ *
178
+ * `query` is the whole aggregate read surface and is the default. `query:raw`
179
+ * is the narrow, opt-in door to per-session data: the collector honours it only
180
+ * when `ENABLE_RAW_SESSION_RETENTION` is on (ADR 0003), and a generated tool for
181
+ * such a metric must be registered **only** for a key that holds it.
182
+ *
183
+ * Declared as a literal union rather than imported from `@uptimizr/db`'s
184
+ * `ApiKeyCapability`: that package depends on *this* one, and the registry may
185
+ * never depend on a database driver. `@uptimizr/db` re-checks the two in its own
186
+ * test suite.
187
+ */
188
+ export type MetricCapability = "query" | "query:raw";
125
189
  /** The collector route a metric is served on. */
126
190
  export interface MetricEndpoint {
127
191
  method: "GET";
@@ -132,6 +196,74 @@ export interface MetricEndpoint {
132
196
  * of a trajectory). One entry per `:param` segment, in order.
133
197
  */
134
198
  pathParams?: readonly FilterId[];
199
+ /**
200
+ * The capability a key must hold to call it. Omitted means `query` — the
201
+ * ordinary aggregate read surface. See {@link MetricCapability}.
202
+ */
203
+ capability?: MetricCapability;
204
+ }
205
+ /**
206
+ * The capability `metric`'s endpoint requires, with the `query` default applied.
207
+ * Consumers partition the catalog with this rather than reading the optional
208
+ * field directly, so "no capability declared" cannot be mistaken for "no
209
+ * capability required".
210
+ */
211
+ export declare function metricCapability(metric: MetricDefinition): MetricCapability;
212
+ /**
213
+ * How one column of a generic group-by result is computed. Four aggregate
214
+ * shapes, all of which SQL:2003 spells identically and every supported engine
215
+ * implements the same way — that is the whole test for admission.
216
+ */
217
+ export type GenericMeasureKind =
218
+ /** `count(*)` — rows in the group. */
219
+ "count"
220
+ /** `count(DISTINCT session_id)` — sessions represented in the group. */
221
+ | "sessions"
222
+ /** `sum(<column>)` over a promoted numeric column. */
223
+ | "sum"
224
+ /** `avg(<column>)` over a promoted numeric column. */
225
+ | "avg"
226
+ /** `max(<column>)` over a promoted numeric column. */
227
+ | "max";
228
+ /** One measure column a generic group-by result carries. */
229
+ export interface GenericMeasure {
230
+ /** The output column name. Must also be a column of the metric's `row`. */
231
+ column: string;
232
+ kind: GenericMeasureKind;
233
+ /**
234
+ * The promoted event column the aggregate reads. Required for `sum` / `avg` /
235
+ * `max`, meaningless for `count` / `sessions`.
236
+ */
237
+ of?: string;
238
+ }
239
+ /**
240
+ * Extra scope the generic builder applies beyond `event_type`, so a regrouped
241
+ * result counts the same events the metric's own builder counts.
242
+ *
243
+ * `top_meshes` is `count(*) … WHERE mesh != ''`; dropping that predicate when
244
+ * grouping by `source` would silently fold every mesh-less event into an empty
245
+ * mesh bucket. Each value is one non-empty-string predicate on a promoted
246
+ * column — closed, so the generic SQL stays free of anything caller-supplied.
247
+ */
248
+ export type GenericScope = "hasMesh" | "hasName";
249
+ /**
250
+ * The generic group-by declaration (design sketch §C.2, tier 2).
251
+ *
252
+ * Together these say: "over *these* events, narrowed by *this* scope, *these*
253
+ * measures can be recomputed at any grain the metric declares". The builder that
254
+ * reads it lives in `@uptimizr/db`'s `query/dsl/generic.ts`; nothing here knows
255
+ * what SQL is.
256
+ */
257
+ export interface GenericGroupBy {
258
+ /**
259
+ * Event types in scope. Empty means **every** event type — only
260
+ * `event_counts`, whose subject really is the whole stream, leaves it empty.
261
+ */
262
+ eventTypes: readonly EventType[];
263
+ /** Additional closed predicates on promoted columns. */
264
+ scope?: readonly GenericScope[];
265
+ /** The measure columns the result carries, in order. The first is `measure`. */
266
+ measures: readonly GenericMeasure[];
135
267
  }
136
268
  /** Comparison semantics for `compare`, `movers` and `anomalies` (ADR 0051 §4). */
137
269
  export interface MetricComparison {
@@ -142,6 +274,13 @@ export interface MetricComparison {
142
274
  /** Minimum denominator before a delta is worth reporting. */
143
275
  minSample: number;
144
276
  }
277
+ /**
278
+ * How a **derived** metric is computed, when it has no `build*` aggregation of
279
+ * its own. One value per module in `@uptimizr/db`'s `src/insights/`
280
+ * (ADR 0051 §4) — statistics over another metric's portable bucket series,
281
+ * evaluated in TypeScript so no two SQL engines can disagree about them.
282
+ */
283
+ export type MetricDerivation = "insight";
145
284
  /**
146
285
  * Everything a consumer needs to call a metric, read its result and judge how
147
286
  * far to trust it.
@@ -158,12 +297,57 @@ export interface MetricDefinition {
158
297
  * aggregations, but are part of the agent surface.
159
298
  */
160
299
  builder?: AggregationBuilderName;
300
+ /**
301
+ * Marks a **derived** entry: a metric computed in pure TypeScript *over other
302
+ * metrics' data* rather than by a `build*` aggregation of its own — the insight
303
+ * primitives (ADR 0051 §4). Like a resource it has no builder; unlike a
304
+ * resource it is a real aggregate, served on an endpoint with a querystring,
305
+ * a time range and the `format` envelope. The two are distinguished by this
306
+ * flag rather than by `builder === undefined`, so the registry guards that
307
+ * pin the resource set and the envelope surface stay exact.
308
+ *
309
+ * The value names where the computation lives, for a reader following the
310
+ * trail from a tool description to the code.
311
+ */
312
+ derived?: MetricDerivation;
161
313
  /** The canned collector route, when one exists. */
162
314
  endpoint?: MetricEndpoint;
163
315
  /** What one row represents. */
164
316
  grain: MetricGrain;
165
- /** The dimension columns this metric's rows are keyed by. */
317
+ /**
318
+ * Every dimension this metric can be **keyed or filtered by** — the
319
+ * vocabulary, not the grain. `top_meshes` lists `session` because it can be
320
+ * scoped to one, while its rows are one per mesh. {@link grainDimensions} is
321
+ * the grain; for a {@link genericGroupBy} metric this list is also the set a
322
+ * caller may group by.
323
+ */
166
324
  dimensions: readonly DimensionId[];
325
+ /**
326
+ * The dimensions one row is **actually keyed by** — the metric's native grain,
327
+ * and what a `dimensions`-less DSL query returns.
328
+ *
329
+ * Declared rather than derived (ADR 0051 §3, #304). v1 read the grain back out
330
+ * of `row.shape`, which was correct but left the registry unable to *say* what
331
+ * it knew; the generic group-by tier has to distinguish "this metric cannot be
332
+ * grouped by that" from "it can, through the generic builder", and that is a
333
+ * statement about the metric rather than about the spelling of its columns.
334
+ * The old derivation survives as a gate: `src/__tests__/registry.test.ts`
335
+ * asserts every entry here is a subset of {@link dimensions} and really
336
+ * projects a column of `row`.
337
+ */
338
+ grainDimensions: readonly DimensionId[];
339
+ /**
340
+ * How the **generic group-by tier** (design sketch §C.2, tier 2) recomputes
341
+ * this metric at an arbitrary grain — omitted when it cannot.
342
+ *
343
+ * Present only where the measure is portable: a `count(*)`, a
344
+ * `count(DISTINCT session_id)`, or a `sum`/`avg`/`max` over a **promoted**
345
+ * column. Those render identically on all four engines whatever the group-by
346
+ * is. A spatial metric's measure *is* a binning of coordinates and a
347
+ * percentile does not decompose across an arbitrary grain, so neither declares
348
+ * one and both stay delegated.
349
+ */
350
+ genericGroupBy?: GenericGroupBy;
167
351
  /** Accepted querystring parameters — exactly the endpoint's Zod keys. */
168
352
  filters: readonly FilterId[];
169
353
  /** Output row schema: the source for OpenAPI, tool output schemas and coercion. */
@@ -197,7 +381,7 @@ export interface MetricDefinition {
197
381
  * calls `top_meshes` today must keep working when the catalog is generated from
198
382
  * this registry (design sketch §A.4).
199
383
  */
200
- export type MetricId = "list_sessions" | "pointer_heatmap" | "world_heatmap" | "camera_heatmap" | "click_rays" | "flow_links" | "top_meshes" | "perf_summary" | "list_scenes" | "timeseries" | "event_counts" | "session_meta" | "scene_representation" | "funnel" | "aggregate_paths" | "rendering_technology" | "xr_rotation" | "xr_sources" | "xr_abandonment" | "xr_locomotion" | "mesh_uv_heatmap" | "world_heatmap_stats" | "gaze_heatmap" | "gaze_heatmap_stats" | "view_coverage_histogram" | "position_heatmap" | "session_trajectory" | "scene_coverage" | "camera_distance" | "mesh_sources" | "mesh_trend" | "mesh_dwell" | "mesh_blind_spots" | "mesh_interaction_kinds" | "mesh_reachability" | "dead_clicks" | "rage_clicks" | "hover_dwell" | "interaction_sources" | "top_input_actions" | "camera_gestures" | "navigation_stats" | "backtrack_ratio" | "render_scale_truth" | "perf_distribution" | "fps_histogram" | "frame_time_percentiles" | "jank_rate" | "perf_churn" | "perf_by_device" | "perf_by_scene" | "perf_heatmap" | "perf_daily" | "events_daily" | "compile_stalls" | "resource_summary" | "resource_percentiles" | "stability_counts" | "graphics_diagnostics" | "error_heatmap" | "capability_changes" | "boundary_heatmap" | "boundary_heatmap_stats" | "xr_boundary_contacts" | "xr_tracking_quality" | "ar_placement_time_to_place" | "ar_placement_attempts" | "ar_placement_surfaces" | "scene_retention" | "load_bounce_funnel" | "variant_leaderboard";
384
+ export type MetricId = "list_sessions" | "pointer_heatmap" | "world_heatmap" | "camera_heatmap" | "click_rays" | "flow_links" | "top_meshes" | "perf_summary" | "list_scenes" | "timeseries" | "event_counts" | "session_meta" | "scene_representation" | "funnel" | "aggregate_paths" | "rendering_technology" | "xr_rotation" | "xr_sources" | "xr_abandonment" | "xr_locomotion" | "mesh_uv_heatmap" | "world_heatmap_stats" | "gaze_heatmap" | "gaze_heatmap_stats" | "view_coverage_histogram" | "position_heatmap" | "session_trajectory" | "scene_coverage" | "camera_distance" | "mesh_sources" | "mesh_trend" | "mesh_dwell" | "mesh_blind_spots" | "mesh_interaction_kinds" | "mesh_reachability" | "dead_clicks" | "rage_clicks" | "hover_dwell" | "interaction_sources" | "top_input_actions" | "camera_gestures" | "custom_event_vocabulary" | "navigation_stats" | "backtrack_ratio" | "render_scale_truth" | "perf_distribution" | "fps_histogram" | "frame_time_percentiles" | "jank_rate" | "perf_churn" | "perf_by_device" | "perf_by_scene" | "perf_heatmap" | "perf_daily" | "events_daily" | "compile_stalls" | "resource_summary" | "resource_percentiles" | "stability_counts" | "graphics_diagnostics" | "error_heatmap" | "capability_changes" | "boundary_heatmap" | "boundary_heatmap_stats" | "xr_boundary_contacts" | "xr_tracking_quality" | "ar_placement_time_to_place" | "ar_placement_attempts" | "ar_placement_surfaces" | "scene_retention" | "load_bounce_funnel" | "variant_leaderboard" | "session_narrative" | "insight_baseline" | "insight_movers" | "insight_anomalies" | "insight_significance" | "insight_scene_health";
201
385
  /**
202
386
  * The metric registry: one entry per `build*` aggregation, plus the two
203
387
  * builder-less resource reads that are part of the agent surface.
@@ -219,7 +403,8 @@ export declare const METRIC_REGISTRY: {
219
403
  };
220
404
  grain: "session";
221
405
  dimensions: "session"[];
222
- filters: ("cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
406
+ grainDimensions: "session"[];
407
+ filters: ("format" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
223
408
  row: z.ZodObject<{
224
409
  session_id: z.ZodString;
225
410
  visitor_id: z.ZodString;
@@ -277,6 +462,7 @@ export declare const METRIC_REGISTRY: {
277
462
  };
278
463
  grain: "session";
279
464
  dimensions: "session"[];
465
+ grainDimensions: never[];
280
466
  filters: never[];
281
467
  row: z.ZodObject<{
282
468
  sessionId: z.ZodString;
@@ -315,6 +501,94 @@ export declare const METRIC_REGISTRY: {
315
501
  related: ("list_sessions" | "perf_by_device")[];
316
502
  category: "sessions";
317
503
  };
504
+ session_narrative: {
505
+ id: "session_narrative";
506
+ title: string;
507
+ description: string;
508
+ endpoint: {
509
+ method: "GET";
510
+ path: string;
511
+ pathParams: "session"[];
512
+ capability: "query:raw";
513
+ };
514
+ grain: "row";
515
+ dimensions: "session"[];
516
+ grainDimensions: never[];
517
+ filters: ("format" | "fpsThreshold" | "minDwellMs" | "maxEntries")[];
518
+ row: z.ZodObject<{
519
+ tMs: z.ZodNumber;
520
+ kind: z.ZodEnum<{
521
+ scene: "scene";
522
+ dwell: "dwell";
523
+ interaction: "interaction";
524
+ perf_dip: "perf_dip";
525
+ error: "error";
526
+ diagnostic: "diagnostic";
527
+ capability: "capability";
528
+ xr: "xr";
529
+ end: "end";
530
+ summary: "summary";
531
+ }>;
532
+ summary: z.ZodString;
533
+ refs: z.ZodObject<{
534
+ mesh: z.ZodOptional<z.ZodString>;
535
+ scene: z.ZodOptional<z.ZodString>;
536
+ name: z.ZodOptional<z.ZodString>;
537
+ }, z.core.$strip>;
538
+ durationMs: z.ZodOptional<z.ZodNumber>;
539
+ count: z.ZodOptional<z.ZodNumber>;
540
+ totals: z.ZodOptional<z.ZodObject<{
541
+ events: z.ZodNumber;
542
+ durationMs: z.ZodNumber;
543
+ scenes: z.ZodNumber;
544
+ meshes: z.ZodNumber;
545
+ interactions: z.ZodNumber;
546
+ dips: z.ZodNumber;
547
+ errors: z.ZodNumber;
548
+ }, z.core.$strip>>;
549
+ truncated: z.ZodOptional<z.ZodBoolean>;
550
+ }, z.core.$strip>;
551
+ columns: {
552
+ tMs: {
553
+ description: string;
554
+ unit: "ms";
555
+ };
556
+ kind: {
557
+ description: string;
558
+ unit: "label";
559
+ label: true;
560
+ };
561
+ summary: {
562
+ description: string;
563
+ };
564
+ refs: {
565
+ description: string;
566
+ };
567
+ durationMs: {
568
+ description: string;
569
+ unit: "ms";
570
+ };
571
+ count: {
572
+ description: string;
573
+ unit: "count";
574
+ };
575
+ totals: {
576
+ description: string;
577
+ };
578
+ truncated: {
579
+ description: string;
580
+ };
581
+ };
582
+ limits: {
583
+ maxRows: 1000;
584
+ maxSummaryRows: 200;
585
+ };
586
+ interpretation: string;
587
+ caveats: string[];
588
+ sourceChannels: ("session_start" | "session_end" | "frame_perf" | "pointer_click" | "mesh_interaction" | "mesh_visibility" | "hover_dwell" | "capability_change" | "scene_change" | "graphics_diagnostic" | "runtime_error" | "input_action" | "xr_boundary_proximity" | "custom")[];
589
+ related: ("list_sessions" | "session_meta" | "session_trajectory")[];
590
+ category: "sessions";
591
+ };
318
592
  scene_representation: {
319
593
  id: "scene_representation";
320
594
  title: string;
@@ -326,6 +600,7 @@ export declare const METRIC_REGISTRY: {
326
600
  };
327
601
  grain: "scene";
328
602
  dimensions: "scene"[];
603
+ grainDimensions: never[];
329
604
  filters: never[];
330
605
  row: z.ZodObject<{
331
606
  projectId: z.ZodString;
@@ -416,7 +691,8 @@ export declare const METRIC_REGISTRY: {
416
691
  };
417
692
  grain: "scene";
418
693
  dimensions: "scene"[];
419
- filters: ("since" | "until" | "limit" | "format")[];
694
+ grainDimensions: "scene"[];
695
+ filters: ("format" | "since" | "until" | "limit")[];
420
696
  row: z.ZodObject<{
421
697
  scene_id: z.ZodString;
422
698
  events: z.ZodNumber;
@@ -464,11 +740,12 @@ export declare const METRIC_REGISTRY: {
464
740
  };
465
741
  grain: "bucket";
466
742
  dimensions: ("scene" | "event_type")[];
467
- filters: ("scene" | "since" | "until" | "interval" | "type" | "format")[];
743
+ grainDimensions: never[];
744
+ filters: ("scene" | "type" | "format" | "since" | "until" | "interval")[];
468
745
  row: z.ZodObject<{
469
746
  bucket: z.ZodNumber;
470
747
  events: z.ZodNumber;
471
- avg_fps: z.ZodNumber;
748
+ avg_fps: z.ZodNullable<z.ZodNumber>;
472
749
  }, z.core.$strip>;
473
750
  columns: {
474
751
  bucket: {
@@ -512,8 +789,16 @@ export declare const METRIC_REGISTRY: {
512
789
  path: string;
513
790
  };
514
791
  grain: "row";
515
- dimensions: ("scene" | "event_type")[];
516
- filters: ("scene" | "since" | "until" | "format")[];
792
+ dimensions: ("scene" | "mesh" | "name" | "session" | "source" | "event_type" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
793
+ grainDimensions: "event_type"[];
794
+ genericGroupBy: {
795
+ eventTypes: never[];
796
+ measures: {
797
+ column: string;
798
+ kind: "count";
799
+ }[];
800
+ };
801
+ filters: ("scene" | "format" | "since" | "until")[];
517
802
  row: z.ZodObject<{
518
803
  event_type: z.ZodString;
519
804
  count: z.ZodNumber;
@@ -552,6 +837,7 @@ export declare const METRIC_REGISTRY: {
552
837
  builder: "buildEventsDaily";
553
838
  grain: "bucket";
554
839
  dimensions: "event_type"[];
840
+ grainDimensions: "event_type"[];
555
841
  filters: never[];
556
842
  row: z.ZodObject<{
557
843
  day: z.ZodString;
@@ -601,7 +887,8 @@ export declare const METRIC_REGISTRY: {
601
887
  };
602
888
  grain: "bin";
603
889
  dimensions: ("scene" | "session" | "source" | "cameraMode")[];
604
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
890
+ grainDimensions: never[];
891
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
605
892
  row: z.ZodObject<{
606
893
  gx: z.ZodNumber;
607
894
  gy: z.ZodNumber;
@@ -648,8 +935,9 @@ export declare const METRIC_REGISTRY: {
648
935
  path: string;
649
936
  };
650
937
  grain: "bin";
651
- dimensions: ("scene" | "session" | "mesh" | "source")[];
652
- filters: ("scene" | "session" | "mesh" | "source" | "since" | "until" | "bins" | "limit" | "format")[];
938
+ dimensions: ("scene" | "mesh" | "session" | "source")[];
939
+ grainDimensions: never[];
940
+ filters: ("scene" | "mesh" | "format" | "session" | "source" | "since" | "until" | "bins" | "limit")[];
653
941
  row: z.ZodObject<{
654
942
  gx: z.ZodNumber;
655
943
  gy: z.ZodNumber;
@@ -677,7 +965,7 @@ export declare const METRIC_REGISTRY: {
677
965
  };
678
966
  interpretation: string;
679
967
  caveats: string[];
680
- sourceChannels: ("hover_dwell" | "pointer_click" | "mesh_interaction")[];
968
+ sourceChannels: ("pointer_click" | "mesh_interaction" | "hover_dwell")[];
681
969
  related: ("pointer_heatmap" | "top_meshes" | "mesh_interaction_kinds")[];
682
970
  comparable: {
683
971
  primary: string;
@@ -697,7 +985,8 @@ export declare const METRIC_REGISTRY: {
697
985
  };
698
986
  grain: "voxel";
699
987
  dimensions: ("scene" | "source" | "cameraMode")[];
700
- filters: ("scene" | "source" | "cameraMode" | "since" | "until" | "region" | "limit" | "cellSize" | "format")[];
988
+ grainDimensions: never[];
989
+ filters: ("scene" | "format" | "source" | "cameraMode" | "since" | "until" | "region" | "limit" | "cellSize")[];
701
990
  row: z.ZodObject<{
702
991
  vx: z.ZodNumber;
703
992
  vy: z.ZodNumber;
@@ -750,7 +1039,8 @@ export declare const METRIC_REGISTRY: {
750
1039
  };
751
1040
  grain: "project";
752
1041
  dimensions: ("scene" | "source" | "cameraMode")[];
753
- filters: ("scene" | "source" | "cameraMode" | "since" | "until" | "region" | "cellSize" | "format")[];
1042
+ grainDimensions: never[];
1043
+ filters: ("scene" | "format" | "source" | "cameraMode" | "since" | "until" | "region" | "cellSize")[];
754
1044
  row: z.ZodObject<{
755
1045
  cells: z.ZodNumber;
756
1046
  hits: z.ZodNumber;
@@ -787,7 +1077,8 @@ export declare const METRIC_REGISTRY: {
787
1077
  };
788
1078
  grain: "voxel";
789
1079
  dimensions: ("scene" | "session" | "cameraMode")[];
790
- filters: ("scene" | "session" | "cameraMode" | "since" | "until" | "region" | "limit" | "cellSize" | "format")[];
1080
+ grainDimensions: never[];
1081
+ filters: ("scene" | "format" | "session" | "cameraMode" | "since" | "until" | "region" | "limit" | "cellSize")[];
791
1082
  row: z.ZodObject<{
792
1083
  vx: z.ZodNumber;
793
1084
  vy: z.ZodNumber;
@@ -840,7 +1131,8 @@ export declare const METRIC_REGISTRY: {
840
1131
  };
841
1132
  grain: "project";
842
1133
  dimensions: ("scene" | "session" | "cameraMode")[];
843
- filters: ("scene" | "session" | "cameraMode" | "since" | "until" | "region" | "cellSize" | "format")[];
1134
+ grainDimensions: never[];
1135
+ filters: ("scene" | "format" | "session" | "cameraMode" | "since" | "until" | "region" | "cellSize")[];
844
1136
  row: z.ZodObject<{
845
1137
  cells: z.ZodNumber;
846
1138
  hits: z.ZodNumber;
@@ -877,7 +1169,8 @@ export declare const METRIC_REGISTRY: {
877
1169
  };
878
1170
  grain: "bin";
879
1171
  dimensions: ("scene" | "session" | "cameraMode")[];
880
- filters: ("scene" | "session" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
1172
+ grainDimensions: never[];
1173
+ filters: ("scene" | "format" | "session" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
881
1174
  row: z.ZodObject<{
882
1175
  azimuth_bin: z.ZodNumber;
883
1176
  elevation_bin: z.ZodNumber;
@@ -925,7 +1218,8 @@ export declare const METRIC_REGISTRY: {
925
1218
  };
926
1219
  grain: "bucket";
927
1220
  dimensions: ("scene" | "session" | "cameraMode")[];
928
- filters: ("scene" | "session" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
1221
+ grainDimensions: never[];
1222
+ filters: ("scene" | "format" | "session" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
929
1223
  row: z.ZodObject<{
930
1224
  bucket: z.ZodNumber;
931
1225
  sessions: z.ZodNumber;
@@ -969,7 +1263,8 @@ export declare const METRIC_REGISTRY: {
969
1263
  };
970
1264
  grain: "bin";
971
1265
  dimensions: ("scene" | "session" | "cameraMode")[];
972
- filters: ("scene" | "session" | "cameraMode" | "since" | "until" | "region" | "limit" | "cellSize" | "format")[];
1266
+ grainDimensions: never[];
1267
+ filters: ("scene" | "format" | "session" | "cameraMode" | "since" | "until" | "region" | "limit" | "cellSize")[];
973
1268
  row: z.ZodObject<{
974
1269
  gx: z.ZodNumber;
975
1270
  gz: z.ZodNumber;
@@ -1023,7 +1318,8 @@ export declare const METRIC_REGISTRY: {
1023
1318
  };
1024
1319
  grain: "row";
1025
1320
  dimensions: ("scene" | "session")[];
1026
- filters: ("scene" | "since" | "until" | "limit" | "format")[];
1321
+ grainDimensions: never[];
1322
+ filters: ("scene" | "format" | "since" | "until" | "limit")[];
1027
1323
  row: z.ZodObject<{
1028
1324
  ts: z.ZodNumber;
1029
1325
  x: z.ZodNumber;
@@ -1070,7 +1366,8 @@ export declare const METRIC_REGISTRY: {
1070
1366
  };
1071
1367
  grain: "row";
1072
1368
  dimensions: ("scene" | "session" | "cameraMode")[];
1073
- filters: ("scene" | "cameraMode" | "since" | "until" | "limit" | "cellSize" | "format")[];
1369
+ grainDimensions: "session"[];
1370
+ filters: ("scene" | "format" | "cameraMode" | "since" | "until" | "limit" | "cellSize")[];
1074
1371
  row: z.ZodObject<{
1075
1372
  session_id: z.ZodString;
1076
1373
  ts: z.ZodNumber;
@@ -1117,7 +1414,8 @@ export declare const METRIC_REGISTRY: {
1117
1414
  };
1118
1415
  grain: "voxel";
1119
1416
  dimensions: ("scene" | "session")[];
1120
- filters: ("scene" | "session" | "since" | "until" | "limit" | "cellSize" | "format")[];
1417
+ grainDimensions: never[];
1418
+ filters: ("scene" | "format" | "session" | "since" | "until" | "limit" | "cellSize")[];
1121
1419
  row: z.ZodObject<{
1122
1420
  vx: z.ZodNumber;
1123
1421
  vy: z.ZodNumber;
@@ -1170,7 +1468,8 @@ export declare const METRIC_REGISTRY: {
1170
1468
  };
1171
1469
  grain: "bucket";
1172
1470
  dimensions: ("scene" | "session")[];
1173
- filters: ("scene" | "session" | "since" | "until" | "limit" | "bucketSize" | "centerX" | "centerY" | "centerZ" | "format")[];
1471
+ grainDimensions: never[];
1472
+ filters: ("scene" | "format" | "session" | "since" | "until" | "limit" | "bucketSize" | "centerX" | "centerY" | "centerZ")[];
1174
1473
  row: z.ZodObject<{
1175
1474
  bucket: z.ZodNumber;
1176
1475
  count: z.ZodNumber;
@@ -1208,8 +1507,9 @@ export declare const METRIC_REGISTRY: {
1208
1507
  path: string;
1209
1508
  };
1210
1509
  grain: "voxel";
1211
- dimensions: ("scene" | "session" | "mesh" | "source")[];
1212
- filters: ("scene" | "session" | "source" | "since" | "until" | "limit" | "cellSize" | "format")[];
1510
+ dimensions: ("scene" | "mesh" | "session" | "source")[];
1511
+ grainDimensions: "mesh"[];
1512
+ filters: ("scene" | "format" | "session" | "source" | "since" | "until" | "limit" | "cellSize")[];
1213
1513
  row: z.ZodObject<{
1214
1514
  cam_vx: z.ZodNumber;
1215
1515
  cam_vy: z.ZodNumber;
@@ -1311,8 +1611,9 @@ export declare const METRIC_REGISTRY: {
1311
1611
  path: string;
1312
1612
  };
1313
1613
  grain: "bin";
1314
- dimensions: ("scene" | "session" | "mesh" | "cameraMode")[];
1315
- filters: ("scene" | "session" | "cameraMode" | "since" | "until" | "bins" | "limit" | "cellSize" | "groupByOrigin" | "originVoxel" | "format")[];
1614
+ dimensions: ("scene" | "mesh" | "session" | "cameraMode")[];
1615
+ grainDimensions: "mesh"[];
1616
+ filters: ("scene" | "format" | "session" | "cameraMode" | "since" | "until" | "bins" | "limit" | "cellSize" | "groupByOrigin" | "originVoxel")[];
1316
1617
  row: z.ZodObject<{
1317
1618
  azimuth_bin: z.ZodNumber;
1318
1619
  elevation_bin: z.ZodNumber;
@@ -1394,8 +1695,17 @@ export declare const METRIC_REGISTRY: {
1394
1695
  path: string;
1395
1696
  };
1396
1697
  grain: "mesh";
1397
- dimensions: ("session" | "mesh")[];
1398
- filters: ("session" | "since" | "until" | "bins" | "limit" | "format")[];
1698
+ dimensions: ("scene" | "mesh" | "session" | "source" | "event_type" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
1699
+ grainDimensions: "mesh"[];
1700
+ genericGroupBy: {
1701
+ eventTypes: never[];
1702
+ scope: "hasMesh"[];
1703
+ measures: {
1704
+ column: string;
1705
+ kind: "count";
1706
+ }[];
1707
+ };
1708
+ filters: ("format" | "session" | "since" | "until" | "bins" | "limit")[];
1399
1709
  row: z.ZodObject<{
1400
1710
  mesh: z.ZodString;
1401
1711
  count: z.ZodNumber;
@@ -1437,8 +1747,17 @@ export declare const METRIC_REGISTRY: {
1437
1747
  path: string;
1438
1748
  };
1439
1749
  grain: "mesh";
1440
- dimensions: ("scene" | "session" | "mesh" | "source" | "cameraMode")[];
1441
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
1750
+ dimensions: ("scene" | "mesh" | "name" | "session" | "source" | "event_type" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
1751
+ grainDimensions: ("mesh" | "source")[];
1752
+ genericGroupBy: {
1753
+ eventTypes: ("pointer_click" | "mesh_interaction")[];
1754
+ scope: "hasMesh"[];
1755
+ measures: {
1756
+ column: string;
1757
+ kind: "count";
1758
+ }[];
1759
+ };
1760
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
1442
1761
  row: z.ZodObject<{
1443
1762
  mesh: z.ZodString;
1444
1763
  source: z.ZodString;
@@ -1485,8 +1804,9 @@ export declare const METRIC_REGISTRY: {
1485
1804
  path: string;
1486
1805
  };
1487
1806
  grain: "bucket";
1488
- dimensions: ("scene" | "session" | "mesh" | "source" | "cameraMode")[];
1489
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "interval" | "format")[];
1807
+ dimensions: ("scene" | "mesh" | "session" | "source" | "cameraMode")[];
1808
+ grainDimensions: "mesh"[];
1809
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "interval")[];
1490
1810
  row: z.ZodObject<{
1491
1811
  mesh: z.ZodString;
1492
1812
  bucket: z.ZodNumber;
@@ -1534,8 +1854,9 @@ export declare const METRIC_REGISTRY: {
1534
1854
  path: string;
1535
1855
  };
1536
1856
  grain: "mesh";
1537
- dimensions: ("scene" | "session" | "mesh")[];
1538
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
1857
+ dimensions: ("scene" | "mesh" | "session")[];
1858
+ grainDimensions: "mesh"[];
1859
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
1539
1860
  row: z.ZodObject<{
1540
1861
  mesh: z.ZodString;
1541
1862
  visible_ms: z.ZodNumber;
@@ -1574,7 +1895,7 @@ export declare const METRIC_REGISTRY: {
1574
1895
  interpretation: string;
1575
1896
  caveats: string[];
1576
1897
  sourceChannels: "mesh_visibility"[];
1577
- related: ("top_meshes" | "gaze_heatmap" | "mesh_blind_spots" | "hover_dwell")[];
1898
+ related: ("hover_dwell" | "top_meshes" | "gaze_heatmap" | "mesh_blind_spots")[];
1578
1899
  comparable: {
1579
1900
  primary: string;
1580
1901
  direction: "neutral";
@@ -1592,8 +1913,9 @@ export declare const METRIC_REGISTRY: {
1592
1913
  path: string;
1593
1914
  };
1594
1915
  grain: "mesh";
1595
- dimensions: ("scene" | "session" | "mesh")[];
1596
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
1916
+ dimensions: ("scene" | "mesh" | "session")[];
1917
+ grainDimensions: "mesh"[];
1918
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
1597
1919
  row: z.ZodObject<{
1598
1920
  mesh: z.ZodString;
1599
1921
  visible_ms: z.ZodNumber;
@@ -1636,8 +1958,8 @@ export declare const METRIC_REGISTRY: {
1636
1958
  };
1637
1959
  interpretation: string;
1638
1960
  caveats: string[];
1639
- sourceChannels: ("hover_dwell" | "mesh_interaction" | "mesh_visibility")[];
1640
- related: ("top_meshes" | "gaze_heatmap" | "mesh_dwell" | "hover_dwell")[];
1961
+ sourceChannels: ("mesh_interaction" | "mesh_visibility" | "hover_dwell")[];
1962
+ related: ("hover_dwell" | "top_meshes" | "gaze_heatmap" | "mesh_dwell")[];
1641
1963
  comparable: {
1642
1964
  primary: string;
1643
1965
  direction: "up";
@@ -1655,8 +1977,17 @@ export declare const METRIC_REGISTRY: {
1655
1977
  path: string;
1656
1978
  };
1657
1979
  grain: "mesh";
1658
- dimensions: ("scene" | "session" | "mesh" | "name" | "source" | "cameraMode")[];
1659
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
1980
+ dimensions: ("scene" | "mesh" | "name" | "session" | "source" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
1981
+ grainDimensions: ("mesh" | "name")[];
1982
+ genericGroupBy: {
1983
+ eventTypes: "mesh_interaction"[];
1984
+ scope: "hasMesh"[];
1985
+ measures: {
1986
+ column: string;
1987
+ kind: "count";
1988
+ }[];
1989
+ };
1990
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
1660
1991
  row: z.ZodObject<{
1661
1992
  mesh: z.ZodString;
1662
1993
  kind: z.ZodString;
@@ -1685,7 +2016,7 @@ export declare const METRIC_REGISTRY: {
1685
2016
  interpretation: string;
1686
2017
  caveats: string[];
1687
2018
  sourceChannels: "mesh_interaction"[];
1688
- related: ("top_meshes" | "mesh_sources" | "hover_dwell")[];
2019
+ related: ("hover_dwell" | "top_meshes" | "mesh_sources")[];
1689
2020
  comparable: {
1690
2021
  primary: string;
1691
2022
  direction: "neutral";
@@ -1703,8 +2034,9 @@ export declare const METRIC_REGISTRY: {
1703
2034
  path: string;
1704
2035
  };
1705
2036
  grain: "mesh";
1706
- dimensions: ("scene" | "session" | "mesh" | "source" | "cameraMode")[];
1707
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "bucketSize" | "format")[];
2037
+ dimensions: ("scene" | "mesh" | "session" | "source" | "cameraMode")[];
2038
+ grainDimensions: "mesh"[];
2039
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "bucketSize")[];
1708
2040
  row: z.ZodObject<{
1709
2041
  mesh: z.ZodString;
1710
2042
  bucket: z.ZodNumber;
@@ -1757,7 +2089,8 @@ export declare const METRIC_REGISTRY: {
1757
2089
  };
1758
2090
  grain: "project";
1759
2091
  dimensions: ("scene" | "session" | "source" | "cameraMode")[];
1760
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
2092
+ grainDimensions: never[];
2093
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
1761
2094
  row: z.ZodObject<{
1762
2095
  total_clicks: z.ZodNumber;
1763
2096
  dead_clicks: z.ZodNullable<z.ZodNumber>;
@@ -1781,7 +2114,7 @@ export declare const METRIC_REGISTRY: {
1781
2114
  interpretation: string;
1782
2115
  caveats: string[];
1783
2116
  sourceChannels: "pointer_click"[];
1784
- related: ("pointer_heatmap" | "top_meshes" | "rage_clicks" | "hover_dwell")[];
2117
+ related: ("hover_dwell" | "pointer_heatmap" | "top_meshes" | "rage_clicks")[];
1785
2118
  comparable: {
1786
2119
  primary: string;
1787
2120
  direction: "down";
@@ -1799,8 +2132,9 @@ export declare const METRIC_REGISTRY: {
1799
2132
  path: string;
1800
2133
  };
1801
2134
  grain: "row";
1802
- dimensions: ("scene" | "session" | "mesh" | "source" | "cameraMode")[];
1803
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "interval" | "minRepeats" | "format")[];
2135
+ dimensions: ("scene" | "mesh" | "session" | "source" | "cameraMode")[];
2136
+ grainDimensions: ("mesh" | "session")[];
2137
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "interval" | "minRepeats")[];
1804
2138
  row: z.ZodObject<{
1805
2139
  session_id: z.ZodString;
1806
2140
  mesh: z.ZodString;
@@ -1834,7 +2168,7 @@ export declare const METRIC_REGISTRY: {
1834
2168
  interpretation: string;
1835
2169
  caveats: string[];
1836
2170
  sourceChannels: "pointer_click"[];
1837
- related: ("mesh_interaction_kinds" | "dead_clicks" | "hover_dwell")[];
2171
+ related: ("hover_dwell" | "mesh_interaction_kinds" | "dead_clicks")[];
1838
2172
  comparable: {
1839
2173
  primary: string;
1840
2174
  direction: "down";
@@ -1852,8 +2186,9 @@ export declare const METRIC_REGISTRY: {
1852
2186
  path: string;
1853
2187
  };
1854
2188
  grain: "mesh";
1855
- dimensions: ("scene" | "session" | "mesh" | "source" | "cameraMode")[];
1856
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
2189
+ dimensions: ("scene" | "mesh" | "session" | "source" | "cameraMode")[];
2190
+ grainDimensions: "mesh"[];
2191
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
1857
2192
  row: z.ZodObject<{
1858
2193
  mesh: z.ZodString;
1859
2194
  dwell_ms: z.ZodNumber;
@@ -1905,8 +2240,19 @@ export declare const METRIC_REGISTRY: {
1905
2240
  path: string;
1906
2241
  };
1907
2242
  grain: "row";
1908
- dimensions: ("scene" | "session" | "source" | "event_type" | "cameraMode")[];
1909
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
2243
+ dimensions: ("scene" | "mesh" | "name" | "session" | "source" | "event_type" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
2244
+ grainDimensions: ("source" | "event_type")[];
2245
+ genericGroupBy: {
2246
+ eventTypes: ("pointer_move" | "pointer_click" | "pointer_down" | "pointer_up" | "camera_gesture" | "mesh_interaction" | "hover_dwell" | "input_action")[];
2247
+ measures: ({
2248
+ column: string;
2249
+ kind: "count";
2250
+ } | {
2251
+ column: string;
2252
+ kind: "sessions";
2253
+ })[];
2254
+ };
2255
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
1910
2256
  row: z.ZodObject<{
1911
2257
  event_type: z.ZodString;
1912
2258
  source: z.ZodString;
@@ -1958,8 +2304,17 @@ export declare const METRIC_REGISTRY: {
1958
2304
  path: string;
1959
2305
  };
1960
2306
  grain: "row";
1961
- dimensions: ("scene" | "session" | "name" | "source" | "cameraMode")[];
1962
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
2307
+ dimensions: ("scene" | "name" | "session" | "source" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
2308
+ grainDimensions: ("name" | "source")[];
2309
+ genericGroupBy: {
2310
+ eventTypes: "input_action"[];
2311
+ scope: "hasName"[];
2312
+ measures: {
2313
+ column: string;
2314
+ kind: "count";
2315
+ }[];
2316
+ };
2317
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
1963
2318
  row: z.ZodObject<{
1964
2319
  action: z.ZodString;
1965
2320
  source: z.ZodString;
@@ -1996,6 +2351,61 @@ export declare const METRIC_REGISTRY: {
1996
2351
  };
1997
2352
  category: "interaction";
1998
2353
  };
2354
+ custom_event_vocabulary: {
2355
+ id: "custom_event_vocabulary";
2356
+ title: string;
2357
+ description: string;
2358
+ builder: "buildCustomEventVocabulary";
2359
+ endpoint: {
2360
+ method: "GET";
2361
+ path: string;
2362
+ };
2363
+ grain: "row";
2364
+ dimensions: ("scene" | "name")[];
2365
+ grainDimensions: "name"[];
2366
+ filters: ("scene" | "format" | "since" | "until" | "limit")[];
2367
+ row: z.ZodObject<{
2368
+ name: z.ZodString;
2369
+ count: z.ZodNumber;
2370
+ sessions: z.ZodNumber;
2371
+ props: z.ZodRecord<z.ZodString, z.ZodEnum<{
2372
+ string: "string";
2373
+ number: "number";
2374
+ boolean: "boolean";
2375
+ null: "null";
2376
+ mixed: "mixed";
2377
+ }>>;
2378
+ }, z.core.$strip>;
2379
+ columns: {
2380
+ name: {
2381
+ description: string;
2382
+ unit: "label";
2383
+ label: true;
2384
+ };
2385
+ count: {
2386
+ description: string;
2387
+ unit: "count";
2388
+ measure: true;
2389
+ };
2390
+ sessions: {
2391
+ description: string;
2392
+ unit: "sessions";
2393
+ };
2394
+ props: {
2395
+ description: string;
2396
+ unit: "label";
2397
+ };
2398
+ };
2399
+ limits: {
2400
+ maxRows: number;
2401
+ maxSummaryRows: number;
2402
+ };
2403
+ interpretation: string;
2404
+ caveats: string[];
2405
+ sourceChannels: "custom"[];
2406
+ related: ("event_counts" | "funnel" | "variant_leaderboard")[];
2407
+ category: "interaction";
2408
+ };
1999
2409
  camera_gestures: {
2000
2410
  id: "camera_gestures";
2001
2411
  title: string;
@@ -2006,8 +2416,29 @@ export declare const METRIC_REGISTRY: {
2006
2416
  path: string;
2007
2417
  };
2008
2418
  grain: "row";
2009
- dimensions: ("scene" | "session" | "name" | "source" | "cameraMode")[];
2010
- filters: ("scene" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit" | "format")[];
2419
+ dimensions: ("scene" | "name" | "session" | "source" | "cameraMode" | "device.engine" | "device.renderer" | "device.browser" | "device.os")[];
2420
+ grainDimensions: "name"[];
2421
+ genericGroupBy: {
2422
+ eventTypes: "camera_gesture"[];
2423
+ measures: ({
2424
+ column: string;
2425
+ kind: "count";
2426
+ of?: undefined;
2427
+ } | {
2428
+ column: string;
2429
+ kind: "sum";
2430
+ of: string;
2431
+ } | {
2432
+ column: string;
2433
+ kind: "avg";
2434
+ of: string;
2435
+ } | {
2436
+ column: string;
2437
+ kind: "max";
2438
+ of: string;
2439
+ })[];
2440
+ };
2441
+ filters: ("scene" | "format" | "session" | "source" | "cameraMode" | "since" | "until" | "bins" | "limit")[];
2011
2442
  row: z.ZodObject<{
2012
2443
  kind: z.ZodString;
2013
2444
  gestures: z.ZodNumber;
@@ -2065,7 +2496,8 @@ export declare const METRIC_REGISTRY: {
2065
2496
  };
2066
2497
  grain: "session";
2067
2498
  dimensions: ("scene" | "session")[];
2068
- filters: ("scene" | "session" | "since" | "until" | "limit" | "moveThreshold" | "format")[];
2499
+ grainDimensions: "session"[];
2500
+ filters: ("scene" | "format" | "session" | "since" | "until" | "limit" | "moveThreshold")[];
2069
2501
  row: z.ZodObject<{
2070
2502
  session_id: z.ZodString;
2071
2503
  segments: z.ZodNumber;
@@ -2124,7 +2556,8 @@ export declare const METRIC_REGISTRY: {
2124
2556
  };
2125
2557
  grain: "scene";
2126
2558
  dimensions: ("scene" | "session")[];
2127
- filters: ("scene" | "session" | "since" | "until" | "limit" | "cellSize" | "format")[];
2559
+ grainDimensions: "scene"[];
2560
+ filters: ("scene" | "format" | "session" | "since" | "until" | "limit" | "cellSize")[];
2128
2561
  row: z.ZodObject<{
2129
2562
  scene: z.ZodString;
2130
2563
  sessions: z.ZodNumber;
@@ -2183,7 +2616,8 @@ export declare const METRIC_REGISTRY: {
2183
2616
  };
2184
2617
  grain: "project";
2185
2618
  dimensions: "session"[];
2186
- filters: ("session" | "since" | "until" | "bins" | "limit" | "format")[];
2619
+ grainDimensions: never[];
2620
+ filters: ("format" | "session" | "since" | "until" | "bins" | "limit")[];
2187
2621
  row: z.ZodObject<{
2188
2622
  samples: z.ZodNumber;
2189
2623
  avg_fps: z.ZodNullable<z.ZodNumber>;
@@ -2235,7 +2669,8 @@ export declare const METRIC_REGISTRY: {
2235
2669
  };
2236
2670
  grain: "project";
2237
2671
  dimensions: "session"[];
2238
- filters: ("session" | "since" | "until" | "bins" | "limit" | "format")[];
2672
+ grainDimensions: never[];
2673
+ filters: ("format" | "session" | "since" | "until" | "bins" | "limit")[];
2239
2674
  row: z.ZodObject<{
2240
2675
  samples: z.ZodNumber;
2241
2676
  avg_fps: z.ZodNullable<z.ZodNumber>;
@@ -2303,7 +2738,8 @@ export declare const METRIC_REGISTRY: {
2303
2738
  };
2304
2739
  grain: "project";
2305
2740
  dimensions: ("scene" | "session")[];
2306
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
2741
+ grainDimensions: never[];
2742
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2307
2743
  row: z.ZodObject<{
2308
2744
  sessions: z.ZodNumber;
2309
2745
  samples: z.ZodNullable<z.ZodNumber>;
@@ -2360,7 +2796,8 @@ export declare const METRIC_REGISTRY: {
2360
2796
  };
2361
2797
  grain: "bucket";
2362
2798
  dimensions: ("scene" | "session")[];
2363
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "bucket" | "format")[];
2799
+ grainDimensions: never[];
2800
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit" | "bucket")[];
2364
2801
  row: z.ZodObject<{
2365
2802
  bucket: z.ZodNumber;
2366
2803
  sessions: z.ZodNumber;
@@ -2404,7 +2841,8 @@ export declare const METRIC_REGISTRY: {
2404
2841
  };
2405
2842
  grain: "project";
2406
2843
  dimensions: ("scene" | "session")[];
2407
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
2844
+ grainDimensions: never[];
2845
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2408
2846
  row: z.ZodObject<{
2409
2847
  sessions: z.ZodNumber;
2410
2848
  samples: z.ZodNullable<z.ZodNumber>;
@@ -2456,7 +2894,8 @@ export declare const METRIC_REGISTRY: {
2456
2894
  };
2457
2895
  grain: "project";
2458
2896
  dimensions: ("scene" | "session")[];
2459
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
2897
+ grainDimensions: never[];
2898
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2460
2899
  row: z.ZodObject<{
2461
2900
  sessions: z.ZodNumber;
2462
2901
  total_long_frames: z.ZodNullable<z.ZodNumber>;
@@ -2508,7 +2947,8 @@ export declare const METRIC_REGISTRY: {
2508
2947
  };
2509
2948
  grain: "project";
2510
2949
  dimensions: ("scene" | "session")[];
2511
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "windowMs" | "fpsThreshold" | "stallMs" | "format")[];
2950
+ grainDimensions: never[];
2951
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit" | "windowMs" | "fpsThreshold" | "stallMs")[];
2512
2952
  row: z.ZodObject<{
2513
2953
  sessions: z.ZodNumber;
2514
2954
  churn_sessions: z.ZodNumber;
@@ -2561,7 +3001,8 @@ export declare const METRIC_REGISTRY: {
2561
3001
  };
2562
3002
  grain: "row";
2563
3003
  dimensions: ("scene" | "session" | "device.engine" | "device.renderer" | "device.isMobile" | "device.browser" | "device.os")[];
2564
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3004
+ grainDimensions: ("device.engine" | "device.renderer" | "device.isMobile" | "device.browser" | "device.os")[];
3005
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2565
3006
  row: z.ZodObject<{
2566
3007
  engine: z.ZodString;
2567
3008
  is_mobile: z.ZodString;
@@ -2634,7 +3075,8 @@ export declare const METRIC_REGISTRY: {
2634
3075
  };
2635
3076
  grain: "scene";
2636
3077
  dimensions: ("scene" | "session")[];
2637
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3078
+ grainDimensions: "scene"[];
3079
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2638
3080
  row: z.ZodObject<{
2639
3081
  scene_id: z.ZodString;
2640
3082
  sessions: z.ZodNumber;
@@ -2687,7 +3129,8 @@ export declare const METRIC_REGISTRY: {
2687
3129
  };
2688
3130
  grain: "voxel";
2689
3131
  dimensions: ("scene" | "session")[];
2690
- filters: ("scene" | "session" | "since" | "until" | "limit" | "cellSize" | "format")[];
3132
+ grainDimensions: never[];
3133
+ filters: ("scene" | "format" | "session" | "since" | "until" | "limit" | "cellSize")[];
2691
3134
  row: z.ZodObject<{
2692
3135
  vx: z.ZodNumber;
2693
3136
  vy: z.ZodNumber;
@@ -2746,6 +3189,7 @@ export declare const METRIC_REGISTRY: {
2746
3189
  builder: "buildPerfDaily";
2747
3190
  grain: "bucket";
2748
3191
  dimensions: never[];
3192
+ grainDimensions: never[];
2749
3193
  filters: never[];
2750
3194
  row: z.ZodObject<{
2751
3195
  day: z.ZodString;
@@ -2804,8 +3248,9 @@ export declare const METRIC_REGISTRY: {
2804
3248
  path: string;
2805
3249
  };
2806
3250
  grain: "row";
2807
- dimensions: ("scene" | "session" | "name")[];
2808
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3251
+ dimensions: ("scene" | "name" | "session")[];
3252
+ grainDimensions: "name"[];
3253
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2809
3254
  row: z.ZodObject<{
2810
3255
  phase: z.ZodString;
2811
3256
  stalls: z.ZodNumber;
@@ -2863,7 +3308,8 @@ export declare const METRIC_REGISTRY: {
2863
3308
  };
2864
3309
  grain: "project";
2865
3310
  dimensions: "session"[];
2866
- filters: ("session" | "since" | "until" | "bins" | "limit" | "format")[];
3311
+ grainDimensions: never[];
3312
+ filters: ("format" | "session" | "since" | "until" | "bins" | "limit")[];
2867
3313
  row: z.ZodObject<{
2868
3314
  samples: z.ZodNumber;
2869
3315
  avg_js_heap_bytes: z.ZodNullable<z.ZodNumber>;
@@ -2950,7 +3396,8 @@ export declare const METRIC_REGISTRY: {
2950
3396
  };
2951
3397
  grain: "project";
2952
3398
  dimensions: ("scene" | "session")[];
2953
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3399
+ grainDimensions: never[];
3400
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
2954
3401
  row: z.ZodObject<{
2955
3402
  sessions: z.ZodNumber;
2956
3403
  samples: z.ZodNullable<z.ZodNumber>;
@@ -3022,7 +3469,8 @@ export declare const METRIC_REGISTRY: {
3022
3469
  };
3023
3470
  grain: "project";
3024
3471
  dimensions: ("scene" | "session")[];
3025
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3472
+ grainDimensions: never[];
3473
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3026
3474
  row: z.ZodObject<{
3027
3475
  context_losses: z.ZodNumber;
3028
3476
  compile_stalls: z.ZodNumber;
@@ -3069,7 +3517,8 @@ export declare const METRIC_REGISTRY: {
3069
3517
  };
3070
3518
  grain: "row";
3071
3519
  dimensions: ("scene" | "session")[];
3072
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3520
+ grainDimensions: never[];
3521
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3073
3522
  row: z.ZodObject<{
3074
3523
  severity: z.ZodString;
3075
3524
  category: z.ZodString;
@@ -3122,7 +3571,8 @@ export declare const METRIC_REGISTRY: {
3122
3571
  };
3123
3572
  grain: "voxel";
3124
3573
  dimensions: ("scene" | "session")[];
3125
- filters: ("scene" | "session" | "since" | "until" | "region" | "limit" | "cellSize" | "severity" | "category" | "errorKind" | "format")[];
3574
+ grainDimensions: never[];
3575
+ filters: ("scene" | "format" | "session" | "since" | "until" | "region" | "limit" | "cellSize" | "severity" | "category" | "errorKind")[];
3126
3576
  row: z.ZodObject<{
3127
3577
  vx: z.ZodNumber;
3128
3578
  vy: z.ZodNumber;
@@ -3175,7 +3625,8 @@ export declare const METRIC_REGISTRY: {
3175
3625
  };
3176
3626
  grain: "row";
3177
3627
  dimensions: ("scene" | "session")[];
3178
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3628
+ grainDimensions: never[];
3629
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3179
3630
  row: z.ZodObject<{
3180
3631
  api: z.ZodString;
3181
3632
  backend: z.ZodString;
@@ -3232,8 +3683,9 @@ export declare const METRIC_REGISTRY: {
3232
3683
  path: string;
3233
3684
  };
3234
3685
  grain: "row";
3235
- dimensions: ("scene" | "session" | "name")[];
3236
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3686
+ dimensions: ("scene" | "name" | "session")[];
3687
+ grainDimensions: "name"[];
3688
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3237
3689
  row: z.ZodObject<{
3238
3690
  kind: z.ZodString;
3239
3691
  from: z.ZodString;
@@ -3286,7 +3738,8 @@ export declare const METRIC_REGISTRY: {
3286
3738
  };
3287
3739
  grain: "session";
3288
3740
  dimensions: ("scene" | "session")[];
3289
- filters: ("scene" | "session" | "since" | "until" | "limit" | "rapidTurn" | "format")[];
3741
+ grainDimensions: "session"[];
3742
+ filters: ("scene" | "format" | "session" | "since" | "until" | "limit" | "rapidTurn")[];
3290
3743
  row: z.ZodObject<{
3291
3744
  session_id: z.ZodString;
3292
3745
  samples: z.ZodNumber;
@@ -3350,7 +3803,8 @@ export declare const METRIC_REGISTRY: {
3350
3803
  };
3351
3804
  grain: "row";
3352
3805
  dimensions: ("scene" | "session" | "source")[];
3353
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3806
+ grainDimensions: "source"[];
3807
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3354
3808
  row: z.ZodObject<{
3355
3809
  source: z.ZodString;
3356
3810
  interactions: z.ZodNumber;
@@ -3398,7 +3852,8 @@ export declare const METRIC_REGISTRY: {
3398
3852
  };
3399
3853
  grain: "session";
3400
3854
  dimensions: ("scene" | "session")[];
3401
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3855
+ grainDimensions: "session"[];
3856
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3402
3857
  row: z.ZodObject<{
3403
3858
  session_id: z.ZodString;
3404
3859
  events: z.ZodNumber;
@@ -3456,7 +3911,8 @@ export declare const METRIC_REGISTRY: {
3456
3911
  };
3457
3912
  grain: "session";
3458
3913
  dimensions: ("scene" | "session")[];
3459
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3914
+ grainDimensions: "session"[];
3915
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3460
3916
  row: z.ZodObject<{
3461
3917
  session_id: z.ZodString;
3462
3918
  fly_gestures: z.ZodNumber;
@@ -3524,7 +3980,8 @@ export declare const METRIC_REGISTRY: {
3524
3980
  };
3525
3981
  grain: "session";
3526
3982
  dimensions: ("scene" | "session" | "source")[];
3527
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
3983
+ grainDimensions: "session"[];
3984
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3528
3985
  row: z.ZodObject<{
3529
3986
  session_id: z.ZodString;
3530
3987
  degraded_ms: z.ZodNumber;
@@ -3592,7 +4049,8 @@ export declare const METRIC_REGISTRY: {
3592
4049
  };
3593
4050
  grain: "voxel";
3594
4051
  dimensions: ("scene" | "session")[];
3595
- filters: ("scene" | "session" | "since" | "until" | "region" | "limit" | "cellSize" | "format")[];
4052
+ grainDimensions: never[];
4053
+ filters: ("scene" | "format" | "session" | "since" | "until" | "region" | "limit" | "cellSize")[];
3596
4054
  row: z.ZodObject<{
3597
4055
  vx: z.ZodNumber;
3598
4056
  vy: z.ZodNumber;
@@ -3645,7 +4103,8 @@ export declare const METRIC_REGISTRY: {
3645
4103
  };
3646
4104
  grain: "project";
3647
4105
  dimensions: ("scene" | "session")[];
3648
- filters: ("scene" | "session" | "since" | "until" | "region" | "cellSize" | "format")[];
4106
+ grainDimensions: never[];
4107
+ filters: ("scene" | "format" | "session" | "since" | "until" | "region" | "cellSize")[];
3649
4108
  row: z.ZodObject<{
3650
4109
  cells: z.ZodNumber;
3651
4110
  hits: z.ZodNumber;
@@ -3682,7 +4141,8 @@ export declare const METRIC_REGISTRY: {
3682
4141
  };
3683
4142
  grain: "session";
3684
4143
  dimensions: ("scene" | "session")[];
3685
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
4144
+ grainDimensions: "session"[];
4145
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3686
4146
  row: z.ZodObject<{
3687
4147
  session_id: z.ZodString;
3688
4148
  contacts: z.ZodNumber;
@@ -3730,7 +4190,8 @@ export declare const METRIC_REGISTRY: {
3730
4190
  };
3731
4191
  grain: "bucket";
3732
4192
  dimensions: ("scene" | "session")[];
3733
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "bucketMs" | "format")[];
4193
+ grainDimensions: never[];
4194
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit" | "bucketMs")[];
3734
4195
  row: z.ZodObject<{
3735
4196
  bucket: z.ZodNumber;
3736
4197
  placements: z.ZodNumber;
@@ -3774,7 +4235,8 @@ export declare const METRIC_REGISTRY: {
3774
4235
  };
3775
4236
  grain: "bucket";
3776
4237
  dimensions: ("scene" | "session")[];
3777
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
4238
+ grainDimensions: never[];
4239
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3778
4240
  row: z.ZodObject<{
3779
4241
  attempts: z.ZodNumber;
3780
4242
  placements: z.ZodNumber;
@@ -3818,7 +4280,8 @@ export declare const METRIC_REGISTRY: {
3818
4280
  };
3819
4281
  grain: "row";
3820
4282
  dimensions: ("scene" | "session")[];
3821
- filters: ("scene" | "session" | "since" | "until" | "bins" | "limit" | "format")[];
4283
+ grainDimensions: never[];
4284
+ filters: ("scene" | "format" | "session" | "since" | "until" | "bins" | "limit")[];
3822
4285
  row: z.ZodObject<{
3823
4286
  surface: z.ZodString;
3824
4287
  placements: z.ZodNumber;
@@ -3866,7 +4329,8 @@ export declare const METRIC_REGISTRY: {
3866
4329
  };
3867
4330
  grain: "bucket";
3868
4331
  dimensions: ("scene" | "cameraMode")[];
3869
- filters: ("scene" | "cameraMode" | "since" | "until" | "steps" | "format")[];
4332
+ grainDimensions: never[];
4333
+ filters: ("scene" | "format" | "cameraMode" | "since" | "until" | "steps")[];
3870
4334
  row: z.ZodObject<{
3871
4335
  step: z.ZodNumber;
3872
4336
  sessions: z.ZodNumber;
@@ -3910,7 +4374,8 @@ export declare const METRIC_REGISTRY: {
3910
4374
  };
3911
4375
  grain: "row";
3912
4376
  dimensions: "scene"[];
3913
- filters: ("since" | "until" | "limit" | "format")[];
4377
+ grainDimensions: never[];
4378
+ filters: ("format" | "since" | "until" | "limit")[];
3914
4379
  row: z.ZodObject<{
3915
4380
  from_scene: z.ZodString;
3916
4381
  to_scene: z.ZodString;
@@ -3958,7 +4423,8 @@ export declare const METRIC_REGISTRY: {
3958
4423
  };
3959
4424
  grain: "bucket";
3960
4425
  dimensions: "scene"[];
3961
- filters: ("scene" | "since" | "until" | "bands" | "format")[];
4426
+ grainDimensions: never[];
4427
+ filters: ("scene" | "format" | "since" | "until" | "bands")[];
3962
4428
  row: z.ZodObject<{
3963
4429
  band: z.ZodNumber;
3964
4430
  sessions: z.ZodNumber;
@@ -4008,7 +4474,8 @@ export declare const METRIC_REGISTRY: {
4008
4474
  };
4009
4475
  grain: "row";
4010
4476
  dimensions: ("scene" | "name" | "cameraMode")[];
4011
- filters: ("scene" | "cameraMode" | "since" | "until" | "limit" | "variant" | "conversion" | "format")[];
4477
+ grainDimensions: never[];
4478
+ filters: ("scene" | "format" | "cameraMode" | "since" | "until" | "limit" | "variant" | "conversion")[];
4012
4479
  row: z.ZodObject<{
4013
4480
  variant: z.ZodString;
4014
4481
  views: z.ZodNumber;
@@ -4056,6 +4523,378 @@ export declare const METRIC_REGISTRY: {
4056
4523
  };
4057
4524
  category: "conversion";
4058
4525
  };
4526
+ insight_baseline: {
4527
+ id: "insight_baseline";
4528
+ title: string;
4529
+ description: string;
4530
+ derived: "insight";
4531
+ endpoint: {
4532
+ method: "GET";
4533
+ path: string;
4534
+ };
4535
+ grain: "project";
4536
+ dimensions: "scene"[];
4537
+ grainDimensions: "scene"[];
4538
+ filters: ("scene" | "format" | "since" | "until" | "bucket" | "metric" | "window")[];
4539
+ row: z.ZodObject<{
4540
+ metric: z.ZodString;
4541
+ scene: z.ZodString;
4542
+ sampleSize: z.ZodNumber;
4543
+ buckets: z.ZodNumber;
4544
+ mean: z.ZodNullable<z.ZodNumber>;
4545
+ median: z.ZodNullable<z.ZodNumber>;
4546
+ mad: z.ZodNullable<z.ZodNumber>;
4547
+ p10: z.ZodNullable<z.ZodNumber>;
4548
+ p90: z.ZodNullable<z.ZodNumber>;
4549
+ slope: z.ZodNullable<z.ZodNumber>;
4550
+ }, z.core.$strip>;
4551
+ columns: {
4552
+ metric: {
4553
+ description: string;
4554
+ unit: "id";
4555
+ };
4556
+ scene: {
4557
+ description: string;
4558
+ unit: "id";
4559
+ };
4560
+ sampleSize: {
4561
+ description: string;
4562
+ unit: "count";
4563
+ };
4564
+ buckets: {
4565
+ description: string;
4566
+ unit: "count";
4567
+ };
4568
+ mean: {
4569
+ description: string;
4570
+ };
4571
+ median: {
4572
+ description: string;
4573
+ measure: true;
4574
+ };
4575
+ mad: {
4576
+ description: string;
4577
+ };
4578
+ p10: {
4579
+ description: string;
4580
+ };
4581
+ p90: {
4582
+ description: string;
4583
+ };
4584
+ slope: {
4585
+ description: string;
4586
+ };
4587
+ };
4588
+ limits: {
4589
+ maxRows: number;
4590
+ maxSummaryRows: number;
4591
+ };
4592
+ interpretation: string;
4593
+ caveats: string[];
4594
+ sourceChannels: never[];
4595
+ related: ("perf_summary" | "timeseries" | "events_daily" | "insight_movers")[];
4596
+ category: "insights";
4597
+ };
4598
+ insight_movers: {
4599
+ id: "insight_movers";
4600
+ title: string;
4601
+ description: string;
4602
+ derived: "insight";
4603
+ endpoint: {
4604
+ method: "GET";
4605
+ path: string;
4606
+ };
4607
+ grain: "row";
4608
+ dimensions: "scene"[];
4609
+ grainDimensions: never[];
4610
+ filters: ("scene" | "format" | "since" | "until" | "limit" | "bucket" | "metrics" | "refSince" | "refUntil")[];
4611
+ row: z.ZodObject<{
4612
+ metric: z.ZodString;
4613
+ dimensionValue: z.ZodNullable<z.ZodString>;
4614
+ current: z.ZodNullable<z.ZodNumber>;
4615
+ previous: z.ZodNullable<z.ZodNumber>;
4616
+ delta: z.ZodNullable<z.ZodNumber>;
4617
+ deltaPct: z.ZodNullable<z.ZodNumber>;
4618
+ z: z.ZodNullable<z.ZodNumber>;
4619
+ direction: z.ZodString;
4620
+ aboveMinSample: z.ZodBoolean;
4621
+ sampleSize: z.ZodNumber;
4622
+ }, z.core.$strip>;
4623
+ columns: {
4624
+ metric: {
4625
+ description: string;
4626
+ unit: "id";
4627
+ label: true;
4628
+ };
4629
+ dimensionValue: {
4630
+ description: string;
4631
+ unit: "id";
4632
+ };
4633
+ current: {
4634
+ description: string;
4635
+ };
4636
+ previous: {
4637
+ description: string;
4638
+ };
4639
+ delta: {
4640
+ description: string;
4641
+ };
4642
+ deltaPct: {
4643
+ description: string;
4644
+ unit: "ratio";
4645
+ };
4646
+ z: {
4647
+ description: string;
4648
+ unit: "ratio";
4649
+ measure: true;
4650
+ };
4651
+ direction: {
4652
+ description: string;
4653
+ unit: "label";
4654
+ };
4655
+ aboveMinSample: {
4656
+ description: string;
4657
+ };
4658
+ sampleSize: {
4659
+ description: string;
4660
+ };
4661
+ };
4662
+ limits: {
4663
+ maxRows: number;
4664
+ maxSummaryRows: number;
4665
+ };
4666
+ interpretation: string;
4667
+ caveats: string[];
4668
+ sourceChannels: never[];
4669
+ related: ("event_counts" | "perf_daily" | "events_daily" | "insight_baseline")[];
4670
+ category: "insights";
4671
+ };
4672
+ insight_anomalies: {
4673
+ id: "insight_anomalies";
4674
+ title: string;
4675
+ description: string;
4676
+ derived: "insight";
4677
+ endpoint: {
4678
+ method: "GET";
4679
+ path: string;
4680
+ };
4681
+ grain: "row";
4682
+ dimensions: "scene"[];
4683
+ grainDimensions: "scene"[];
4684
+ filters: ("scene" | "format" | "since" | "until" | "bucket" | "metric" | "window" | "sensitivity")[];
4685
+ row: z.ZodObject<{
4686
+ metric: z.ZodString;
4687
+ scene: z.ZodString;
4688
+ bucketStart: z.ZodNumber;
4689
+ value: z.ZodNullable<z.ZodNumber>;
4690
+ expected: z.ZodNullable<z.ZodNumber>;
4691
+ z: z.ZodNullable<z.ZodNumber>;
4692
+ kind: z.ZodString;
4693
+ contributor: z.ZodNullable<z.ZodObject<{
4694
+ dimension: z.ZodString;
4695
+ value: z.ZodString;
4696
+ share: z.ZodNullable<z.ZodNumber>;
4697
+ }, z.core.$strip>>;
4698
+ sampleSize: z.ZodNumber;
4699
+ }, z.core.$strip>;
4700
+ columns: {
4701
+ metric: {
4702
+ description: string;
4703
+ unit: "id";
4704
+ label: true;
4705
+ };
4706
+ scene: {
4707
+ description: string;
4708
+ unit: "id";
4709
+ };
4710
+ bucketStart: {
4711
+ description: string;
4712
+ unit: "timestamp";
4713
+ };
4714
+ value: {
4715
+ description: string;
4716
+ };
4717
+ expected: {
4718
+ description: string;
4719
+ };
4720
+ z: {
4721
+ description: string;
4722
+ unit: "ratio";
4723
+ measure: true;
4724
+ };
4725
+ kind: {
4726
+ description: string;
4727
+ unit: "label";
4728
+ };
4729
+ contributor: {
4730
+ description: string;
4731
+ };
4732
+ sampleSize: {
4733
+ description: string;
4734
+ unit: "count";
4735
+ };
4736
+ };
4737
+ limits: {
4738
+ maxRows: number;
4739
+ maxSummaryRows: number;
4740
+ };
4741
+ interpretation: string;
4742
+ caveats: string[];
4743
+ sourceChannels: never[];
4744
+ related: ("timeseries" | "error_heatmap" | "insight_baseline" | "insight_movers")[];
4745
+ category: "insights";
4746
+ };
4747
+ insight_significance: {
4748
+ id: "insight_significance";
4749
+ title: string;
4750
+ description: string;
4751
+ derived: "insight";
4752
+ endpoint: {
4753
+ method: "GET";
4754
+ path: string;
4755
+ };
4756
+ grain: "project";
4757
+ dimensions: "scene"[];
4758
+ grainDimensions: "scene"[];
4759
+ filters: ("scene" | "format" | "since" | "until" | "bucket" | "metric" | "refSince" | "refUntil")[];
4760
+ row: z.ZodObject<{
4761
+ metric: z.ZodString;
4762
+ scene: z.ZodString;
4763
+ a: z.ZodObject<{
4764
+ value: z.ZodNullable<z.ZodNumber>;
4765
+ n: z.ZodNumber;
4766
+ }, z.core.$strip>;
4767
+ b: z.ZodObject<{
4768
+ value: z.ZodNullable<z.ZodNumber>;
4769
+ n: z.ZodNumber;
4770
+ }, z.core.$strip>;
4771
+ effect: z.ZodNullable<z.ZodNumber>;
4772
+ ci95: z.ZodTuple<[z.ZodNullable<z.ZodNumber>, z.ZodNullable<z.ZodNumber>], null>;
4773
+ p: z.ZodNullable<z.ZodNumber>;
4774
+ test: z.ZodString;
4775
+ effectUnit: z.ZodString;
4776
+ significant: z.ZodBoolean;
4777
+ powerNote: z.ZodString;
4778
+ }, z.core.$strip>;
4779
+ columns: {
4780
+ metric: {
4781
+ description: string;
4782
+ unit: "id";
4783
+ label: true;
4784
+ };
4785
+ scene: {
4786
+ description: string;
4787
+ unit: "id";
4788
+ };
4789
+ a: {
4790
+ description: string;
4791
+ };
4792
+ b: {
4793
+ description: string;
4794
+ };
4795
+ effect: {
4796
+ description: string;
4797
+ measure: true;
4798
+ };
4799
+ ci95: {
4800
+ description: string;
4801
+ };
4802
+ p: {
4803
+ description: string;
4804
+ unit: "ratio";
4805
+ };
4806
+ test: {
4807
+ description: string;
4808
+ unit: "label";
4809
+ };
4810
+ effectUnit: {
4811
+ description: string;
4812
+ unit: "label";
4813
+ };
4814
+ significant: {
4815
+ description: string;
4816
+ };
4817
+ powerNote: {
4818
+ description: string;
4819
+ unit: "label";
4820
+ };
4821
+ };
4822
+ limits: {
4823
+ maxRows: number;
4824
+ maxSummaryRows: number;
4825
+ };
4826
+ interpretation: string;
4827
+ caveats: string[];
4828
+ sourceChannels: never[];
4829
+ related: ("insight_baseline" | "insight_movers" | "insight_scene_health")[];
4830
+ category: "insights";
4831
+ };
4832
+ insight_scene_health: {
4833
+ id: "insight_scene_health";
4834
+ title: string;
4835
+ description: string;
4836
+ derived: "insight";
4837
+ endpoint: {
4838
+ method: "GET";
4839
+ path: string;
4840
+ };
4841
+ grain: "scene";
4842
+ dimensions: "scene"[];
4843
+ grainDimensions: "scene"[];
4844
+ filters: ("scene" | "format" | "since" | "until" | "limit" | "bucket" | "window" | "weights")[];
4845
+ row: z.ZodObject<{
4846
+ scene: z.ZodString;
4847
+ score: z.ZodNullable<z.ZodNumber>;
4848
+ factors: z.ZodArray<z.ZodObject<{
4849
+ id: z.ZodString;
4850
+ metric: z.ZodString;
4851
+ raw: z.ZodNullable<z.ZodNumber>;
4852
+ baseline: z.ZodNullable<z.ZodNumber>;
4853
+ score: z.ZodNullable<z.ZodNumber>;
4854
+ weight: z.ZodNumber;
4855
+ unit: z.ZodString;
4856
+ note: z.ZodString;
4857
+ }, z.core.$strip>>;
4858
+ sampleSize: z.ZodNumber;
4859
+ since: z.ZodNumber;
4860
+ until: z.ZodNumber;
4861
+ }, z.core.$strip>;
4862
+ columns: {
4863
+ scene: {
4864
+ description: string;
4865
+ unit: "id";
4866
+ label: true;
4867
+ };
4868
+ score: {
4869
+ description: string;
4870
+ measure: true;
4871
+ };
4872
+ factors: {
4873
+ description: string;
4874
+ };
4875
+ sampleSize: {
4876
+ description: string;
4877
+ unit: "sessions";
4878
+ };
4879
+ since: {
4880
+ description: string;
4881
+ unit: "epoch-ms";
4882
+ };
4883
+ until: {
4884
+ description: string;
4885
+ unit: "epoch-ms";
4886
+ };
4887
+ };
4888
+ limits: {
4889
+ maxRows: number;
4890
+ maxSummaryRows: number;
4891
+ };
4892
+ interpretation: string;
4893
+ caveats: string[];
4894
+ sourceChannels: never[];
4895
+ related: ("insight_baseline" | "insight_movers" | "insight_significance")[];
4896
+ category: "insights";
4897
+ };
4059
4898
  };
4060
4899
  /** The registry's own type, with each entry's literal `builder` preserved. */
4061
4900
  export type MetricRegistry = typeof METRIC_REGISTRY;
@@ -4115,5 +4954,16 @@ export declare function metricForBuilder(builder: AggregationBuilderName): Metri
4115
4954
  * catalog stays a superset of the hand-written one (design sketch §A.4).
4116
4955
  */
4117
4956
  export declare function isResourceMetric(metric: MetricDefinition): boolean;
4957
+ /**
4958
+ * A **derived** entry is computed in TypeScript over another metric's data
4959
+ * rather than by a `build*` aggregation (ADR 0051 §4): the insight primitives.
4960
+ * It has no builder, but — unlike a {@link isResourceMetric resource} — it is a
4961
+ * real aggregate with a querystring, a time range and the `format` envelope, so
4962
+ * every consumer that treats `builder != null` as "is an aggregate" should ask
4963
+ * this instead.
4964
+ */
4965
+ export declare function isDerivedMetric(metric: MetricDefinition): boolean;
4966
+ /** Whether a metric is served as an aggregate over a querystring (not a resource read). */
4967
+ export declare function isAggregateMetric(metric: MetricDefinition): boolean;
4118
4968
  export {};
4119
4969
  //# sourceMappingURL=registry.d.ts.map