@uptimizr/db 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +109 -0
- package/LICENSE +201 -0
- package/README.md +89 -0
- package/dist/cli/createProject.d.ts +3 -0
- package/dist/cli/createProject.d.ts.map +1 -0
- package/dist/cli/createProject.js +41 -0
- package/dist/cli/createProject.js.map +1 -0
- package/dist/cli/migrate.d.ts +3 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +21 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/seed.d.ts +2 -0
- package/dist/cli/seed.d.ts.map +1 -0
- package/dist/cli/seed.js +175 -0
- package/dist/cli/seed.js.map +1 -0
- package/dist/duckdb/client.d.ts +42 -0
- package/dist/duckdb/client.d.ts.map +1 -0
- package/dist/duckdb/client.js +93 -0
- package/dist/duckdb/client.js.map +1 -0
- package/dist/duckdb/events.d.ts +44 -0
- package/dist/duckdb/events.d.ts.map +1 -0
- package/dist/duckdb/events.js +225 -0
- package/dist/duckdb/events.js.map +1 -0
- package/dist/duckdb/migrations.d.ts +20 -0
- package/dist/duckdb/migrations.d.ts.map +1 -0
- package/dist/duckdb/migrations.js +323 -0
- package/dist/duckdb/migrations.js.map +1 -0
- package/dist/duckdb/projects.d.ts +23 -0
- package/dist/duckdb/projects.d.ts.map +1 -0
- package/dist/duckdb/projects.js +55 -0
- package/dist/duckdb/projects.js.map +1 -0
- package/dist/duckdb/queries.d.ts +10 -0
- package/dist/duckdb/queries.d.ts.map +1 -0
- package/dist/duckdb/queries.js +10 -0
- package/dist/duckdb/queries.js.map +1 -0
- package/dist/duckdb/sceneRegistry.d.ts +15 -0
- package/dist/duckdb/sceneRegistry.d.ts.map +1 -0
- package/dist/duckdb/sceneRegistry.js +98 -0
- package/dist/duckdb/sceneRegistry.js.map +1 -0
- package/dist/env.d.ts +25 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +55 -0
- package/dist/env.js.map +1 -0
- package/dist/events.d.ts +107 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +153 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/metadata.d.ts +84 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +23 -0
- package/dist/metadata.js.map +1 -0
- package/dist/parity/cases.d.ts +31 -0
- package/dist/parity/cases.d.ts.map +1 -0
- package/dist/parity/cases.js +524 -0
- package/dist/parity/cases.js.map +1 -0
- package/dist/parity/compare.d.ts +47 -0
- package/dist/parity/compare.d.ts.map +1 -0
- package/dist/parity/compare.js +90 -0
- package/dist/parity/compare.js.map +1 -0
- package/dist/parity/fixtures.d.ts +45 -0
- package/dist/parity/fixtures.d.ts.map +1 -0
- package/dist/parity/fixtures.js +157 -0
- package/dist/parity/fixtures.js.map +1 -0
- package/dist/parity/index.d.ts +12 -0
- package/dist/parity/index.d.ts.map +1 -0
- package/dist/parity/index.js +12 -0
- package/dist/parity/index.js.map +1 -0
- package/dist/query/aggregations.d.ts +393 -0
- package/dist/query/aggregations.d.ts.map +1 -0
- package/dist/query/aggregations.js +1412 -0
- package/dist/query/aggregations.js.map +1 -0
- package/dist/query/dialect.d.ts +100 -0
- package/dist/query/dialect.d.ts.map +1 -0
- package/dist/query/dialect.js +88 -0
- package/dist/query/dialect.js.map +1 -0
- package/dist/query/duckdbDialect.d.ts +27 -0
- package/dist/query/duckdbDialect.d.ts.map +1 -0
- package/dist/query/duckdbDialect.js +83 -0
- package/dist/query/duckdbDialect.js.map +1 -0
- package/dist/query/index.d.ts +22 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +30 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/types.d.ts +388 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +11 -0
- package/dist/query/types.js.map +1 -0
- package/llms.txt +21 -0
- package/package.json +71 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared, dialect-agnostic types for the analytics query layer (ADR 0020).
|
|
3
|
+
*
|
|
4
|
+
* These option and row shapes describe *what* an aggregation needs, independent
|
|
5
|
+
* of any SQL dialect. Aggregations are authored once against these types in
|
|
6
|
+
* `aggregations.ts` and rendered per engine via a {@link Dialect}; the OSS
|
|
7
|
+
* default engine is DuckDB, with a single-tenant ClickHouse dialect available to
|
|
8
|
+
* the optional scale tier.
|
|
9
|
+
*/
|
|
10
|
+
/** A parameterized query, ready to hand to a dialect-specific runner. */
|
|
11
|
+
export interface QuerySpec {
|
|
12
|
+
query: string;
|
|
13
|
+
query_params: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
export interface RangeOptions {
|
|
16
|
+
/** Inclusive lower bound (epoch ms). */
|
|
17
|
+
since?: number;
|
|
18
|
+
/** Exclusive upper bound (epoch ms). */
|
|
19
|
+
until?: number;
|
|
20
|
+
}
|
|
21
|
+
/** Optional scene/area filter (ADR 0010). */
|
|
22
|
+
export interface SceneOptions {
|
|
23
|
+
/** Restrict to a single developer-assigned scene id. Omit for all scenes. */
|
|
24
|
+
scene?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Optional input-source filter (ADR 0011). */
|
|
27
|
+
export interface SourceOptions {
|
|
28
|
+
/** Restrict to a single input source (e.g. `"mouse"`, `"hand"`). Omit for all. */
|
|
29
|
+
source?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Optional single-session filter. */
|
|
32
|
+
export interface SessionOptions {
|
|
33
|
+
/** Restrict the aggregate to one session id. Omit for all sessions. */
|
|
34
|
+
session?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Optional camera/navigation-model filter (ADR 0026). Segments aggregates by the
|
|
38
|
+
* `scene.cameraType` declared on each session's `session_start` — e.g.
|
|
39
|
+
* `"arc-rotate"` (orbit viewer) vs. `"free"` (first-person walkthrough). Omit for
|
|
40
|
+
* all camera types. Implemented as a `session_id IN (…)` sub-select over
|
|
41
|
+
* `session_start`, so it composes with every other filter.
|
|
42
|
+
*/
|
|
43
|
+
export interface CameraModeOptions {
|
|
44
|
+
/** Restrict to sessions whose `scene.cameraType` equals this value. */
|
|
45
|
+
cameraType?: string;
|
|
46
|
+
}
|
|
47
|
+
/** Time-series bucketing options. */
|
|
48
|
+
export interface TimeseriesOptions {
|
|
49
|
+
/** Bucket width in seconds (default 3600 = 1h). */
|
|
50
|
+
interval?: number;
|
|
51
|
+
/** Restrict the volume to a single event type. Omit to count all events. */
|
|
52
|
+
type?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface SessionSummaryRow {
|
|
55
|
+
session_id: string;
|
|
56
|
+
visitor_id: string;
|
|
57
|
+
events: number;
|
|
58
|
+
started_at: string;
|
|
59
|
+
ended_at: string;
|
|
60
|
+
}
|
|
61
|
+
export interface HeatmapBinRow {
|
|
62
|
+
gx: number;
|
|
63
|
+
gy: number;
|
|
64
|
+
count: number;
|
|
65
|
+
}
|
|
66
|
+
export interface WorldHeatmapBinRow {
|
|
67
|
+
vx: number;
|
|
68
|
+
vy: number;
|
|
69
|
+
vz: number;
|
|
70
|
+
count: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* One bin of the top-down "floor plan" camera-position heatmap (ADR 0026): camera
|
|
74
|
+
* positions binned on the X/Z ground plane into `cellSize`-sized cells, with the
|
|
75
|
+
* cell-average Y for reference. Reveals where visitors stand/dwell in a walkable scene.
|
|
76
|
+
*/
|
|
77
|
+
export interface PositionBinRow {
|
|
78
|
+
gx: number;
|
|
79
|
+
gz: number;
|
|
80
|
+
/** Mean Y (height) of camera samples in the cell. */
|
|
81
|
+
avg_y: number;
|
|
82
|
+
count: number;
|
|
83
|
+
}
|
|
84
|
+
/** One ordered point of a session's walked path (ADR 0026). */
|
|
85
|
+
export interface TrajectoryPointRow {
|
|
86
|
+
ts: string;
|
|
87
|
+
x: number;
|
|
88
|
+
y: number;
|
|
89
|
+
z: number;
|
|
90
|
+
}
|
|
91
|
+
export interface DirectionBinRow {
|
|
92
|
+
azimuth_bin: number;
|
|
93
|
+
elevation_bin: number;
|
|
94
|
+
count: number;
|
|
95
|
+
}
|
|
96
|
+
export interface ClickGazeRayRow {
|
|
97
|
+
cam_vx: number;
|
|
98
|
+
cam_vy: number;
|
|
99
|
+
cam_vz: number;
|
|
100
|
+
origin_x: number;
|
|
101
|
+
origin_y: number;
|
|
102
|
+
origin_z: number;
|
|
103
|
+
hit_vx: number;
|
|
104
|
+
hit_vy: number;
|
|
105
|
+
hit_vz: number;
|
|
106
|
+
hit_x: number;
|
|
107
|
+
hit_y: number;
|
|
108
|
+
hit_z: number;
|
|
109
|
+
mesh: string;
|
|
110
|
+
count: number;
|
|
111
|
+
}
|
|
112
|
+
export interface FlowLinkRow {
|
|
113
|
+
azimuth_bin: number;
|
|
114
|
+
elevation_bin: number;
|
|
115
|
+
mesh: string;
|
|
116
|
+
count: number;
|
|
117
|
+
/**
|
|
118
|
+
* Standpoint voxel indices — the click-time camera-position cell (design §7.8).
|
|
119
|
+
* Present only in the position-aware mode (`groupByOrigin`/`originVoxel`);
|
|
120
|
+
* omitted by the default direction-only §7.5 flow.
|
|
121
|
+
*/
|
|
122
|
+
origin_vx?: number;
|
|
123
|
+
origin_vy?: number;
|
|
124
|
+
origin_vz?: number;
|
|
125
|
+
/** Averaged standpoint world point for the voxel (position-aware mode, §7.8). */
|
|
126
|
+
origin_x?: number;
|
|
127
|
+
origin_y?: number;
|
|
128
|
+
origin_z?: number;
|
|
129
|
+
}
|
|
130
|
+
export interface MeshCountRow {
|
|
131
|
+
mesh: string;
|
|
132
|
+
count: number;
|
|
133
|
+
}
|
|
134
|
+
/** Per-object attention summary from `mesh_visibility` events (#37). */
|
|
135
|
+
export interface MeshDwellRow {
|
|
136
|
+
mesh: string;
|
|
137
|
+
/** Total on-screen time across the range, in ms. */
|
|
138
|
+
visible_ms: number;
|
|
139
|
+
/** Total time the object was near the view centre (gaze proxy), in ms. */
|
|
140
|
+
centered_ms: number;
|
|
141
|
+
/** Largest screen fraction the object reached (prominence proxy), 0..1. */
|
|
142
|
+
max_screen_fraction: number;
|
|
143
|
+
/** Number of bucketed summary events contributing to the totals. */
|
|
144
|
+
samples: number;
|
|
145
|
+
}
|
|
146
|
+
/** Dead-click rate summary from `pointer_click` events (#46). */
|
|
147
|
+
export interface DeadClickRow {
|
|
148
|
+
/** Total clicks in range. */
|
|
149
|
+
total_clicks: number;
|
|
150
|
+
/** Clicks that hit no mesh (empty space) — the dead clicks. */
|
|
151
|
+
dead_clicks: number;
|
|
152
|
+
}
|
|
153
|
+
/** A rage-click cluster: rapid repeats on one mesh in a time window (#47). */
|
|
154
|
+
export interface RageClickRow {
|
|
155
|
+
session_id: string;
|
|
156
|
+
mesh: string;
|
|
157
|
+
/** Window start as epoch milliseconds. */
|
|
158
|
+
bucket: number;
|
|
159
|
+
/** Number of clicks on the mesh within the window (>= minRepeats). */
|
|
160
|
+
clicks: number;
|
|
161
|
+
}
|
|
162
|
+
/** Per-object hover-hesitation summary from `hover_dwell` events (#48). */
|
|
163
|
+
export interface HoverDwellRow {
|
|
164
|
+
mesh: string;
|
|
165
|
+
/** Total time visitors hovered the object without clicking it, in ms. */
|
|
166
|
+
dwell_ms: number;
|
|
167
|
+
/** Longest single hover episode on the object, in ms. */
|
|
168
|
+
max_dwell_ms: number;
|
|
169
|
+
/** Number of hover episodes contributing to the totals. */
|
|
170
|
+
episodes: number;
|
|
171
|
+
}
|
|
172
|
+
/** Per-phase shader/pipeline compile-stall summary from `compile_stall` events (#42). */
|
|
173
|
+
export interface CompileStallRow {
|
|
174
|
+
/** Coarse compile phase (`shader` / `pipeline` / `material` / `other`); `""` if unattributed. */
|
|
175
|
+
phase: string;
|
|
176
|
+
/** Number of compile stalls in the phase. */
|
|
177
|
+
stalls: number;
|
|
178
|
+
/** Total main-thread time spent compiling, in ms. */
|
|
179
|
+
total_ms: number;
|
|
180
|
+
/** Average compile-stall duration, in ms. */
|
|
181
|
+
avg_ms: number;
|
|
182
|
+
/** Worst single compile-stall duration, in ms. */
|
|
183
|
+
max_ms: number;
|
|
184
|
+
}
|
|
185
|
+
/** GPU / memory footprint summary from `resource_sample` samples (#44). */
|
|
186
|
+
export interface ResourceSummaryRow {
|
|
187
|
+
/** Number of footprint samples in the range. */
|
|
188
|
+
samples: number;
|
|
189
|
+
/** Average used JS heap in bytes (unreported samples excluded). */
|
|
190
|
+
avg_js_heap_bytes: number;
|
|
191
|
+
/** Peak used JS heap in bytes. */
|
|
192
|
+
max_js_heap_bytes: number;
|
|
193
|
+
/** Average triangles submitted per sampled frame. */
|
|
194
|
+
avg_triangles: number;
|
|
195
|
+
/** Peak triangles submitted in a sampled frame. */
|
|
196
|
+
max_triangles: number;
|
|
197
|
+
/** Average vertices submitted per sampled frame. */
|
|
198
|
+
avg_vertices: number;
|
|
199
|
+
/** Peak vertices submitted in a sampled frame. */
|
|
200
|
+
max_vertices: number;
|
|
201
|
+
/** Average resident texture memory in bytes. */
|
|
202
|
+
avg_texture_bytes: number;
|
|
203
|
+
/** Peak resident texture memory in bytes. */
|
|
204
|
+
max_texture_bytes: number;
|
|
205
|
+
/** Average resident geometry memory in bytes. */
|
|
206
|
+
avg_geometry_bytes: number;
|
|
207
|
+
/** Peak resident geometry memory in bytes. */
|
|
208
|
+
max_geometry_bytes: number;
|
|
209
|
+
}
|
|
210
|
+
/** Per-transition capability fallback/recovery summary from `capability_change` events (#49). */
|
|
211
|
+
export interface CapabilityChangeRow {
|
|
212
|
+
/** Capability class (`graphics-backend` / `quality` / `device-recovery` / `feature` / `other`). */
|
|
213
|
+
kind: string;
|
|
214
|
+
/** Previous capability token (e.g. `webgpu`); `""` if unreported. */
|
|
215
|
+
from: string;
|
|
216
|
+
/** New capability token (e.g. `webgl2`); `""` if unreported. */
|
|
217
|
+
to: string;
|
|
218
|
+
/** Number of times this transition was reported. */
|
|
219
|
+
changes: number;
|
|
220
|
+
}
|
|
221
|
+
/** Per-kind camera-navigation gesture summary from `camera_gesture` events (ADR 0025). */
|
|
222
|
+
export interface CameraGestureRow {
|
|
223
|
+
/** Gesture class (`orbit` / `pan` / `dolly` / `zoom` / `roll` / `fly` / `navigate`). */
|
|
224
|
+
kind: string;
|
|
225
|
+
/** Number of gestures of this kind. */
|
|
226
|
+
gestures: number;
|
|
227
|
+
/** Total time spent in this gesture kind, in ms. */
|
|
228
|
+
total_ms: number;
|
|
229
|
+
/** Average gesture duration, in ms. */
|
|
230
|
+
avg_ms: number;
|
|
231
|
+
/** Longest single gesture, in ms. */
|
|
232
|
+
max_ms: number;
|
|
233
|
+
}
|
|
234
|
+
export interface PerfSummaryRow {
|
|
235
|
+
samples: number;
|
|
236
|
+
avg_fps: number;
|
|
237
|
+
min_fps: number;
|
|
238
|
+
p50_fps: number;
|
|
239
|
+
}
|
|
240
|
+
/** Per-session-then-aggregate FPS percentiles (ADR 0028 §1). */
|
|
241
|
+
export interface PerfDistributionRow {
|
|
242
|
+
sessions: number;
|
|
243
|
+
samples: number;
|
|
244
|
+
p05_fps: number;
|
|
245
|
+
p50_fps: number;
|
|
246
|
+
p95_fps: number;
|
|
247
|
+
}
|
|
248
|
+
/** One bin of the per-session-median FPS histogram (ADR 0028 §1). */
|
|
249
|
+
export interface FpsHistogramRow {
|
|
250
|
+
/** Inclusive lower bound (FPS) of the bin. */
|
|
251
|
+
bucket: number;
|
|
252
|
+
sessions: number;
|
|
253
|
+
}
|
|
254
|
+
/** Per-session-then-aggregate frame-time percentiles, in ms (ADR 0028 §1). */
|
|
255
|
+
export interface FrameTimePercentileRow {
|
|
256
|
+
sessions: number;
|
|
257
|
+
samples: number;
|
|
258
|
+
p50_ms: number;
|
|
259
|
+
p95_ms: number;
|
|
260
|
+
}
|
|
261
|
+
/** Per-session-then-aggregate jank rate (ADR 0028 §1). */
|
|
262
|
+
export interface JankRateRow {
|
|
263
|
+
sessions: number;
|
|
264
|
+
total_long_frames: number;
|
|
265
|
+
/** Median per-session long-frames-per-window rate. */
|
|
266
|
+
median_rate: number;
|
|
267
|
+
/** Worst-decile (p90) per-session rate. */
|
|
268
|
+
worst_decile_rate: number;
|
|
269
|
+
}
|
|
270
|
+
/** FPS segmented by device class from `session_start.device` (ADR 0028 §2). */
|
|
271
|
+
export interface PerfByDeviceRow {
|
|
272
|
+
engine: string;
|
|
273
|
+
is_mobile: string;
|
|
274
|
+
renderer: string;
|
|
275
|
+
sessions: number;
|
|
276
|
+
samples: number;
|
|
277
|
+
p50_fps: number;
|
|
278
|
+
}
|
|
279
|
+
/** FPS segmented by scene, per-session-then-aggregate (ADR 0028 §1). */
|
|
280
|
+
export interface PerfBySceneRow {
|
|
281
|
+
scene_id: string;
|
|
282
|
+
sessions: number;
|
|
283
|
+
samples: number;
|
|
284
|
+
p50_fps: number;
|
|
285
|
+
}
|
|
286
|
+
/** Per-session-then-aggregate GPU/memory footprint percentiles (ADR 0028 §1). */
|
|
287
|
+
export interface ResourcePercentileRow {
|
|
288
|
+
sessions: number;
|
|
289
|
+
samples: number;
|
|
290
|
+
p50_js_heap_bytes: number;
|
|
291
|
+
p95_js_heap_bytes: number;
|
|
292
|
+
p50_texture_bytes: number;
|
|
293
|
+
p95_texture_bytes: number;
|
|
294
|
+
p50_triangles: number;
|
|
295
|
+
p95_triangles: number;
|
|
296
|
+
}
|
|
297
|
+
/** Stability-incident counts (context losses, compile stalls). */
|
|
298
|
+
export interface StabilityCountRow {
|
|
299
|
+
context_losses: number;
|
|
300
|
+
compile_stalls: number;
|
|
301
|
+
incidents: number;
|
|
302
|
+
}
|
|
303
|
+
export interface PerfDailyRow {
|
|
304
|
+
day: string;
|
|
305
|
+
samples: number;
|
|
306
|
+
avg_fps: number;
|
|
307
|
+
min_fps: number;
|
|
308
|
+
p50_fps: number;
|
|
309
|
+
}
|
|
310
|
+
export interface EventsDailyRow {
|
|
311
|
+
day: string;
|
|
312
|
+
event_type: string;
|
|
313
|
+
events: number;
|
|
314
|
+
}
|
|
315
|
+
export interface SceneRow {
|
|
316
|
+
scene_id: string;
|
|
317
|
+
events: number;
|
|
318
|
+
last_seen: string;
|
|
319
|
+
}
|
|
320
|
+
export interface TimeseriesBucketRow {
|
|
321
|
+
/** Start of the bucket as epoch milliseconds. */
|
|
322
|
+
bucket: number;
|
|
323
|
+
events: number;
|
|
324
|
+
avg_fps: number;
|
|
325
|
+
}
|
|
326
|
+
export interface EventTypeCountRow {
|
|
327
|
+
event_type: string;
|
|
328
|
+
count: number;
|
|
329
|
+
}
|
|
330
|
+
/** One occupied camera-position voxel for scene coverage / dead-zone analysis. */
|
|
331
|
+
export interface CoverageVoxelRow {
|
|
332
|
+
vx: number;
|
|
333
|
+
vy: number;
|
|
334
|
+
vz: number;
|
|
335
|
+
count: number;
|
|
336
|
+
}
|
|
337
|
+
/** One distance-histogram bucket: `bucket * bucketSize` world units from center. */
|
|
338
|
+
export interface CameraDistanceBucketRow {
|
|
339
|
+
bucket: number;
|
|
340
|
+
count: number;
|
|
341
|
+
}
|
|
342
|
+
/** Per-session navigation-effort summary (travel distance, active vs idle). */
|
|
343
|
+
export interface NavigationStatsRow {
|
|
344
|
+
session_id: string;
|
|
345
|
+
segments: number;
|
|
346
|
+
total_distance: number;
|
|
347
|
+
active_segments: number;
|
|
348
|
+
active_distance: number;
|
|
349
|
+
}
|
|
350
|
+
/** Per-session XR motion-sickness proxy: view-rotation rate over the pose stream. */
|
|
351
|
+
export interface XrRotationRateRow {
|
|
352
|
+
session_id: string;
|
|
353
|
+
samples: number;
|
|
354
|
+
avg_turn_rad: number;
|
|
355
|
+
max_turn_rad: number;
|
|
356
|
+
total_turn_rad: number;
|
|
357
|
+
rapid_segments: number;
|
|
358
|
+
}
|
|
359
|
+
/** One XR input source (`hand`, `xr-controller`, …) with its usage counts. */
|
|
360
|
+
export interface XrSourceUsageRow {
|
|
361
|
+
source: string;
|
|
362
|
+
interactions: number;
|
|
363
|
+
sessions: number;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* One `(event_type, source)` pairing from the input-source breakdown (ADR 0011):
|
|
367
|
+
* how many interactions of that type came from that input source, and across how
|
|
368
|
+
* many distinct sessions.
|
|
369
|
+
*/
|
|
370
|
+
export interface InteractionSourceRow {
|
|
371
|
+
/** The interaction event type (e.g. `mesh_interaction`, `pointer_click`). */
|
|
372
|
+
event_type: string;
|
|
373
|
+
/** The input source that triggered it (e.g. `mouse`, `xr-controller`, `hand`). */
|
|
374
|
+
source: string;
|
|
375
|
+
/** Number of events of this `(event_type, source)` pairing. */
|
|
376
|
+
count: number;
|
|
377
|
+
/** Number of distinct sessions that produced this pairing. */
|
|
378
|
+
sessions: number;
|
|
379
|
+
}
|
|
380
|
+
/** Per-XR-session abandonment row: time bounds and event/interaction counts. */
|
|
381
|
+
export interface XrAbandonmentRow {
|
|
382
|
+
session_id: string;
|
|
383
|
+
events: number;
|
|
384
|
+
xr_interactions: number;
|
|
385
|
+
started_at: string;
|
|
386
|
+
ended_at: string;
|
|
387
|
+
}
|
|
388
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared, dialect-agnostic types for the analytics query layer (ADR 0020).
|
|
3
|
+
*
|
|
4
|
+
* These option and row shapes describe *what* an aggregation needs, independent
|
|
5
|
+
* of any SQL dialect. Aggregations are authored once against these types in
|
|
6
|
+
* `aggregations.ts` and rendered per engine via a {@link Dialect}; the OSS
|
|
7
|
+
* default engine is DuckDB, with a single-tenant ClickHouse dialect available to
|
|
8
|
+
* the optional scale tier.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/query/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
package/llms.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @uptimizr/db
|
|
2
|
+
|
|
3
|
+
> OSS storage contracts + the single-file DuckDB store (events + metadata in one `.duckdb` file;
|
|
4
|
+
> ADR 0020). Dialect-agnostic query builders defined once and emitted per engine. No
|
|
5
|
+
> ClickHouse/Postgres dependency — those live with a separately-licensed scale store. Server/Node
|
|
6
|
+
> only. Query-time aggregation; forward-only, additive migrations. Single-writer store.
|
|
7
|
+
|
|
8
|
+
## Docs
|
|
9
|
+
|
|
10
|
+
- [Package reference](./README.md): DuckDB usage, the spec-once/emit-per-dialect extension point, single-writer constraint.
|
|
11
|
+
- [Agent guide](./AGENTS.md): rules and canonical usage for AI agents.
|
|
12
|
+
- [Integration & API reference](https://github.com/RaananW/Uptimizr/blob/main/docs/integration.md): how queries surface to consumers.
|
|
13
|
+
- [Architecture Decision Records](https://github.com/RaananW/Uptimizr/tree/main/docs/adr): database choice (0002), migrations (0007), open-core storage boundary (0020).
|
|
14
|
+
|
|
15
|
+
## Key exports
|
|
16
|
+
|
|
17
|
+
- DuckDB store: `createDuckdbClient`, `migrateDuckdb`, `duckdbInsertEvents`, `duckdbGetSessionEvents`, `duckdbResolveApiKey`, `runDuckdbQuery`.
|
|
18
|
+
- Query layer: `buildX(projectId, opts, dialect)` builders, `duckdbDialect`, `Dialect`/`QuerySpec` types.
|
|
19
|
+
- Neutral helpers: `toEventRow`, `formatUtcTimestamp`, api-key helpers, `Project`/`ApiKeyRecord`/`SceneRepresentation*` types.
|
|
20
|
+
- Parity: `PARITY_CASES`, `diffParity` (DuckDB-vs-ClickHouse cross-engine equality).
|
|
21
|
+
- `readDbSettings()` — environment-driven DuckDB settings with a local-dev default (`DUCKDB_PATH`).
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@uptimizr/db",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OSS storage contracts (dialect-agnostic query layer, neutral event/metadata types) and the single-file DuckDB store for Uptimizr.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"uptimizr",
|
|
7
|
+
"analytics",
|
|
8
|
+
"duckdb",
|
|
9
|
+
"clickhouse",
|
|
10
|
+
"postgres",
|
|
11
|
+
"storage",
|
|
12
|
+
"query",
|
|
13
|
+
"events"
|
|
14
|
+
],
|
|
15
|
+
"license": "Apache-2.0",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/RaananW/Uptimizr.git",
|
|
19
|
+
"directory": "oss/packages/db"
|
|
20
|
+
},
|
|
21
|
+
"bugs": {
|
|
22
|
+
"url": "https://github.com/RaananW/Uptimizr/issues"
|
|
23
|
+
},
|
|
24
|
+
"homepage": "https://github.com/RaananW/Uptimizr/tree/main/oss/packages/db#readme",
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"type": "module",
|
|
29
|
+
"sideEffects": false,
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./query": {
|
|
36
|
+
"types": "./dist/query/index.d.ts",
|
|
37
|
+
"import": "./dist/query/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"bin": {
|
|
41
|
+
"uptimizr-db-migrate": "./dist/cli/migrate.js",
|
|
42
|
+
"uptimizr-db-new-project": "./dist/cli/createProject.js"
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE",
|
|
48
|
+
"AGENTS.md",
|
|
49
|
+
"llms.txt"
|
|
50
|
+
],
|
|
51
|
+
"dependencies": {
|
|
52
|
+
"@duckdb/node-api": "^1.5.4-r.1",
|
|
53
|
+
"@uptimizr/schema": "0.1.0"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/node": "^22.19.21",
|
|
57
|
+
"tsx": "^4.22.4",
|
|
58
|
+
"vitest": "^4.1.9"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsc -p tsconfig.json",
|
|
62
|
+
"dev": "tsc -p tsconfig.json --watch",
|
|
63
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
64
|
+
"test": "vitest run",
|
|
65
|
+
"lint": "eslint .",
|
|
66
|
+
"migrate": "tsx src/cli/migrate.ts",
|
|
67
|
+
"seed": "tsx src/cli/seed.ts",
|
|
68
|
+
"new-project": "tsx src/cli/createProject.ts",
|
|
69
|
+
"clean": "rm -rf dist"
|
|
70
|
+
}
|
|
71
|
+
}
|