@reopt-ai/data-contract 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +11 -4
  2. package/dist/{chunk-2LJ7JLDX.js → chunk-2LZBZXBF.js} +9 -3
  3. package/dist/chunk-2LZBZXBF.js.map +1 -0
  4. package/dist/{chunk-ATPS4UV6.cjs → chunk-4B4AY44F.cjs} +33 -7
  5. package/dist/chunk-4B4AY44F.cjs.map +1 -0
  6. package/dist/{chunk-J4VD3TLV.js → chunk-AHXPQQKO.js} +30 -4
  7. package/dist/chunk-AHXPQQKO.js.map +1 -0
  8. package/dist/{chunk-55IWO4S3.js → chunk-BCGR27G2.js} +123 -11
  9. package/dist/chunk-BCGR27G2.js.map +1 -0
  10. package/dist/{chunk-3A7WZ7L6.js → chunk-MFZEIH5Z.js} +5 -4
  11. package/dist/chunk-MFZEIH5Z.js.map +1 -0
  12. package/dist/{chunk-KXEQGD3E.cjs → chunk-OLSMH4RY.cjs} +9 -3
  13. package/dist/chunk-OLSMH4RY.cjs.map +1 -0
  14. package/dist/{chunk-I2T4HRBM.cjs → chunk-VQ2CD5MG.cjs} +131 -19
  15. package/dist/chunk-VQ2CD5MG.cjs.map +1 -0
  16. package/dist/{chunk-RDPPPFGO.cjs → chunk-XI3VP5DN.cjs} +5 -4
  17. package/dist/chunk-XI3VP5DN.cjs.map +1 -0
  18. package/dist/client.cjs +83 -43
  19. package/dist/client.cjs.map +1 -1
  20. package/dist/client.d.cts +6 -2
  21. package/dist/client.d.ts +6 -2
  22. package/dist/client.js +45 -5
  23. package/dist/client.js.map +1 -1
  24. package/dist/control.cjs +14 -4
  25. package/dist/control.cjs.map +1 -1
  26. package/dist/control.d.cts +49 -7
  27. package/dist/control.d.ts +49 -7
  28. package/dist/control.js +15 -5
  29. package/dist/index.cjs +2 -2
  30. package/dist/index.d.cts +3 -3
  31. package/dist/index.d.ts +3 -3
  32. package/dist/index.js +1 -1
  33. package/dist/ingest.cjs +2 -2
  34. package/dist/ingest.d.cts +6 -6
  35. package/dist/ingest.d.ts +6 -6
  36. package/dist/ingest.js +1 -1
  37. package/dist/query.cjs +27 -3
  38. package/dist/query.cjs.map +1 -1
  39. package/dist/query.d.cts +302 -22
  40. package/dist/query.d.ts +302 -22
  41. package/dist/query.js +28 -4
  42. package/dist/report.cjs +85 -0
  43. package/dist/report.cjs.map +1 -0
  44. package/dist/report.d.cts +167 -0
  45. package/dist/report.d.ts +167 -0
  46. package/dist/report.js +85 -0
  47. package/dist/report.js.map +1 -0
  48. package/package.json +7 -2
  49. package/dist/chunk-2LJ7JLDX.js.map +0 -1
  50. package/dist/chunk-3A7WZ7L6.js.map +0 -1
  51. package/dist/chunk-55IWO4S3.js.map +0 -1
  52. package/dist/chunk-ATPS4UV6.cjs.map +0 -1
  53. package/dist/chunk-I2T4HRBM.cjs.map +0 -1
  54. package/dist/chunk-J4VD3TLV.js.map +0 -1
  55. package/dist/chunk-KXEQGD3E.cjs.map +0 -1
  56. package/dist/chunk-RDPPPFGO.cjs.map +0 -1
package/dist/query.d.ts CHANGED
@@ -16,10 +16,10 @@ export { zDate, zInstant } from './index.js';
16
16
 
17
17
  /** Bucket width for a time series. */
18
18
  declare const zGranularity: z.ZodEnum<{
19
- hour: "hour";
19
+ month: "month";
20
20
  day: "day";
21
+ hour: "hour";
21
22
  week: "week";
22
- month: "month";
23
23
  }>;
24
24
  type Granularity = z.infer<typeof zGranularity>;
25
25
  /**
@@ -54,13 +54,29 @@ type ChannelFilter = z.infer<typeof zChannelFilter>;
54
54
  * TTL, while ingest lag means the read model is genuinely behind and the right
55
55
  * response is an "aggregating" badge, not a refresh.
56
56
  */
57
+ declare const zQuerySource: z.ZodEnum<{
58
+ rollup: "rollup";
59
+ raw: "raw";
60
+ mixed: "mixed";
61
+ }>;
62
+ type QuerySource = z.infer<typeof zQuerySource>;
57
63
  declare const zQueryMeta: z.ZodObject<{
58
64
  projectId: z.ZodString;
59
65
  computedAt: z.ZodString;
60
66
  cacheAgeSeconds: z.ZodNumber;
61
- ingestLagSeconds: z.ZodNumber;
67
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
68
+ ingestLagStatus: z.ZodEnum<{
69
+ unknown: "unknown";
70
+ known: "known";
71
+ }>;
72
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
62
73
  cached: z.ZodBoolean;
63
74
  timezone: z.ZodString;
75
+ source: z.ZodEnum<{
76
+ rollup: "rollup";
77
+ raw: "raw";
78
+ mixed: "mixed";
79
+ }>;
64
80
  requestId: z.ZodString;
65
81
  }, z.core.$strip>;
66
82
  type QueryMeta = z.infer<typeof zQueryMeta>;
@@ -71,9 +87,19 @@ declare function zQueryEnvelope<T extends z.ZodTypeAny>(data: T): z.ZodObject<{
71
87
  projectId: z.ZodString;
72
88
  computedAt: z.ZodString;
73
89
  cacheAgeSeconds: z.ZodNumber;
74
- ingestLagSeconds: z.ZodNumber;
90
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
91
+ ingestLagStatus: z.ZodEnum<{
92
+ unknown: "unknown";
93
+ known: "known";
94
+ }>;
95
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
75
96
  cached: z.ZodBoolean;
76
97
  timezone: z.ZodString;
98
+ source: z.ZodEnum<{
99
+ rollup: "rollup";
100
+ raw: "raw";
101
+ mixed: "mixed";
102
+ }>;
77
103
  requestId: z.ZodString;
78
104
  }, z.core.$strip>;
79
105
  }, z.core.$strip>;
@@ -88,17 +114,29 @@ declare const zTimeseriesBreakdown: z.ZodObject<{
88
114
  topN: z.ZodDefault<z.ZodNumber>;
89
115
  }, z.core.$strip>;
90
116
  type TimeseriesBreakdown = z.infer<typeof zTimeseriesBreakdown>;
117
+ /** Exact-match filter for a top-level event `properties` key. Multiple filters are ANDed. */
118
+ declare const zEventPropertyFilter: z.ZodObject<{
119
+ key: z.ZodString;
120
+ operator: z.ZodDefault<z.ZodLiteral<"eq">>;
121
+ value: z.ZodString;
122
+ }, z.core.$strip>;
123
+ type EventPropertyFilter = z.infer<typeof zEventPropertyFilter>;
91
124
  declare const zEventsTimeseriesInput: z.ZodObject<{
92
125
  projectId: z.ZodString;
93
126
  startDate: z.ZodString;
94
127
  endDate: z.ZodString;
95
128
  granularity: z.ZodDefault<z.ZodEnum<{
96
- hour: "hour";
129
+ month: "month";
97
130
  day: "day";
131
+ hour: "hour";
98
132
  week: "week";
99
- month: "month";
100
133
  }>>;
101
134
  eventName: z.ZodOptional<z.ZodString>;
135
+ propertyFilters: z.ZodOptional<z.ZodArray<z.ZodObject<{
136
+ key: z.ZodString;
137
+ operator: z.ZodDefault<z.ZodLiteral<"eq">>;
138
+ value: z.ZodString;
139
+ }, z.core.$strip>>>;
102
140
  breakdown: z.ZodOptional<z.ZodObject<{
103
141
  kind: z.ZodLiteral<"property">;
104
142
  key: z.ZodString;
@@ -106,6 +144,7 @@ declare const zEventsTimeseriesInput: z.ZodObject<{
106
144
  }, z.core.$strip>>;
107
145
  segmentId: z.ZodOptional<z.ZodString>;
108
146
  timezone: z.ZodOptional<z.ZodString>;
147
+ includeInternal: z.ZodDefault<z.ZodBoolean>;
109
148
  }, z.core.$strip>;
110
149
  type EventsTimeseriesInput = z.input<typeof zEventsTimeseriesInput>;
111
150
  /**
@@ -129,10 +168,10 @@ declare const zTimeseriesPoint: z.ZodObject<{
129
168
  type TimeseriesPoint = z.infer<typeof zTimeseriesPoint>;
130
169
  declare const zEventsTimeseriesData: z.ZodObject<{
131
170
  granularity: z.ZodEnum<{
132
- hour: "hour";
171
+ month: "month";
133
172
  day: "day";
173
+ hour: "hour";
134
174
  week: "week";
135
- month: "month";
136
175
  }>;
137
176
  timezone: z.ZodString;
138
177
  series: z.ZodArray<z.ZodObject<{
@@ -151,10 +190,10 @@ type EventsTimeseriesData = z.infer<typeof zEventsTimeseriesData>;
151
190
  declare const zEventsTimeseriesResponse: z.ZodObject<{
152
191
  data: z.ZodObject<{
153
192
  granularity: z.ZodEnum<{
154
- hour: "hour";
193
+ month: "month";
155
194
  day: "day";
195
+ hour: "hour";
156
196
  week: "week";
157
- month: "month";
158
197
  }>;
159
198
  timezone: z.ZodString;
160
199
  series: z.ZodArray<z.ZodObject<{
@@ -173,9 +212,19 @@ declare const zEventsTimeseriesResponse: z.ZodObject<{
173
212
  projectId: z.ZodString;
174
213
  computedAt: z.ZodString;
175
214
  cacheAgeSeconds: z.ZodNumber;
176
- ingestLagSeconds: z.ZodNumber;
215
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
216
+ ingestLagStatus: z.ZodEnum<{
217
+ unknown: "unknown";
218
+ known: "known";
219
+ }>;
220
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
177
221
  cached: z.ZodBoolean;
178
222
  timezone: z.ZodString;
223
+ source: z.ZodEnum<{
224
+ rollup: "rollup";
225
+ raw: "raw";
226
+ mixed: "mixed";
227
+ }>;
179
228
  requestId: z.ZodString;
180
229
  }, z.core.$strip>;
181
230
  }, z.core.$strip>;
@@ -195,6 +244,7 @@ declare const zFunnelInput: z.ZodObject<{
195
244
  utmCampaigns: z.ZodOptional<z.ZodArray<z.ZodString>>;
196
245
  }, z.core.$strip>>;
197
246
  timezone: z.ZodOptional<z.ZodString>;
247
+ includeInternal: z.ZodDefault<z.ZodBoolean>;
198
248
  }, z.core.$strip>;
199
249
  type FunnelInput = z.input<typeof zFunnelInput>;
200
250
  declare const zFunnelStep: z.ZodObject<{
@@ -235,26 +285,36 @@ declare const zFunnelResponse: z.ZodObject<{
235
285
  projectId: z.ZodString;
236
286
  computedAt: z.ZodString;
237
287
  cacheAgeSeconds: z.ZodNumber;
238
- ingestLagSeconds: z.ZodNumber;
288
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
289
+ ingestLagStatus: z.ZodEnum<{
290
+ unknown: "unknown";
291
+ known: "known";
292
+ }>;
293
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
239
294
  cached: z.ZodBoolean;
240
295
  timezone: z.ZodString;
296
+ source: z.ZodEnum<{
297
+ rollup: "rollup";
298
+ raw: "raw";
299
+ mixed: "mixed";
300
+ }>;
241
301
  requestId: z.ZodString;
242
302
  }, z.core.$strip>;
243
303
  }, z.core.$strip>;
244
304
  type FunnelResponse = z.infer<typeof zFunnelResponse>;
245
305
  declare const zRetentionInterval: z.ZodEnum<{
306
+ month: "month";
246
307
  day: "day";
247
308
  week: "week";
248
- month: "month";
249
309
  }>;
250
310
  declare const zRetentionInput: z.ZodObject<{
251
311
  projectId: z.ZodString;
252
312
  startDate: z.ZodString;
253
313
  endDate: z.ZodString;
254
314
  interval: z.ZodDefault<z.ZodEnum<{
315
+ month: "month";
255
316
  day: "day";
256
317
  week: "week";
257
- month: "month";
258
318
  }>>;
259
319
  periods: z.ZodDefault<z.ZodNumber>;
260
320
  startEvent: z.ZodOptional<z.ZodString>;
@@ -276,6 +336,7 @@ declare const zRetentionInput: z.ZodObject<{
276
336
  utmCampaigns: z.ZodOptional<z.ZodArray<z.ZodString>>;
277
337
  }, z.core.$strip>>;
278
338
  timezone: z.ZodOptional<z.ZodString>;
339
+ includeInternal: z.ZodDefault<z.ZodBoolean>;
279
340
  }, z.core.$strip>;
280
341
  type RetentionInput = z.input<typeof zRetentionInput>;
281
342
  declare const zRetentionCell: z.ZodObject<{
@@ -298,9 +359,9 @@ declare const zRetentionData: z.ZodObject<{
298
359
  rate: z.ZodNumber;
299
360
  }, z.core.$strip>>;
300
361
  interval: z.ZodEnum<{
362
+ month: "month";
301
363
  day: "day";
302
364
  week: "week";
303
- month: "month";
304
365
  }>;
305
366
  periods: z.ZodNumber;
306
367
  retentionType: z.ZodEnum<{
@@ -326,9 +387,9 @@ declare const zRetentionResponse: z.ZodObject<{
326
387
  rate: z.ZodNumber;
327
388
  }, z.core.$strip>>;
328
389
  interval: z.ZodEnum<{
390
+ month: "month";
329
391
  day: "day";
330
392
  week: "week";
331
- month: "month";
332
393
  }>;
333
394
  periods: z.ZodNumber;
334
395
  retentionType: z.ZodEnum<{
@@ -341,20 +402,237 @@ declare const zRetentionResponse: z.ZodObject<{
341
402
  projectId: z.ZodString;
342
403
  computedAt: z.ZodString;
343
404
  cacheAgeSeconds: z.ZodNumber;
344
- ingestLagSeconds: z.ZodNumber;
405
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
406
+ ingestLagStatus: z.ZodEnum<{
407
+ unknown: "unknown";
408
+ known: "known";
409
+ }>;
410
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
345
411
  cached: z.ZodBoolean;
346
412
  timezone: z.ZodString;
413
+ source: z.ZodEnum<{
414
+ rollup: "rollup";
415
+ raw: "raw";
416
+ mixed: "mixed";
417
+ }>;
347
418
  requestId: z.ZodString;
348
419
  }, z.core.$strip>;
349
420
  }, z.core.$strip>;
350
421
  type RetentionResponse = z.infer<typeof zRetentionResponse>;
422
+ /**
423
+ * Session-level traffic for a brand site, served from the hourly rollups.
424
+ * `newVisitors` counts sessions whose device was first seen inside them;
425
+ * `returningVisitors` is the rest. Both are session counts, not people —
426
+ * "visitor" is the vocabulary the dashboards already use.
427
+ */
428
+ declare const zTrafficOverviewInput: z.ZodObject<{
429
+ projectId: z.ZodString;
430
+ startDate: z.ZodString;
431
+ endDate: z.ZodString;
432
+ granularity: z.ZodDefault<z.ZodEnum<{
433
+ month: "month";
434
+ day: "day";
435
+ hour: "hour";
436
+ week: "week";
437
+ }>>;
438
+ timezone: z.ZodOptional<z.ZodString>;
439
+ }, z.core.$strip>;
440
+ type TrafficOverviewInput = z.input<typeof zTrafficOverviewInput>;
441
+ declare const zTrafficTotals: z.ZodObject<{
442
+ sessions: z.ZodNumber;
443
+ pageviews: z.ZodNumber;
444
+ newVisitors: z.ZodNumber;
445
+ returningVisitors: z.ZodNumber;
446
+ bounceRate: z.ZodNumber;
447
+ }, z.core.$strip>;
448
+ type TrafficTotals = z.infer<typeof zTrafficTotals>;
449
+ declare const zTrafficSeriesPoint: z.ZodObject<{
450
+ sessions: z.ZodNumber;
451
+ pageviews: z.ZodNumber;
452
+ newVisitors: z.ZodNumber;
453
+ returningVisitors: z.ZodNumber;
454
+ bounceRate: z.ZodNumber;
455
+ date: z.ZodString;
456
+ }, z.core.$strip>;
457
+ declare const zTrafficOverviewData: z.ZodObject<{
458
+ granularity: z.ZodEnum<{
459
+ month: "month";
460
+ day: "day";
461
+ hour: "hour";
462
+ week: "week";
463
+ }>;
464
+ timezone: z.ZodString;
465
+ totals: z.ZodObject<{
466
+ sessions: z.ZodNumber;
467
+ pageviews: z.ZodNumber;
468
+ newVisitors: z.ZodNumber;
469
+ returningVisitors: z.ZodNumber;
470
+ bounceRate: z.ZodNumber;
471
+ }, z.core.$strip>;
472
+ series: z.ZodArray<z.ZodObject<{
473
+ sessions: z.ZodNumber;
474
+ pageviews: z.ZodNumber;
475
+ newVisitors: z.ZodNumber;
476
+ returningVisitors: z.ZodNumber;
477
+ bounceRate: z.ZodNumber;
478
+ date: z.ZodString;
479
+ }, z.core.$strip>>;
480
+ }, z.core.$strip>;
481
+ type TrafficOverviewData = z.infer<typeof zTrafficOverviewData>;
482
+ declare const zTrafficOverviewResponse: z.ZodObject<{
483
+ data: z.ZodObject<{
484
+ granularity: z.ZodEnum<{
485
+ month: "month";
486
+ day: "day";
487
+ hour: "hour";
488
+ week: "week";
489
+ }>;
490
+ timezone: z.ZodString;
491
+ totals: z.ZodObject<{
492
+ sessions: z.ZodNumber;
493
+ pageviews: z.ZodNumber;
494
+ newVisitors: z.ZodNumber;
495
+ returningVisitors: z.ZodNumber;
496
+ bounceRate: z.ZodNumber;
497
+ }, z.core.$strip>;
498
+ series: z.ZodArray<z.ZodObject<{
499
+ sessions: z.ZodNumber;
500
+ pageviews: z.ZodNumber;
501
+ newVisitors: z.ZodNumber;
502
+ returningVisitors: z.ZodNumber;
503
+ bounceRate: z.ZodNumber;
504
+ date: z.ZodString;
505
+ }, z.core.$strip>>;
506
+ }, z.core.$strip>;
507
+ meta: z.ZodObject<{
508
+ projectId: z.ZodString;
509
+ computedAt: z.ZodString;
510
+ cacheAgeSeconds: z.ZodNumber;
511
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
512
+ ingestLagStatus: z.ZodEnum<{
513
+ unknown: "unknown";
514
+ known: "known";
515
+ }>;
516
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
517
+ cached: z.ZodBoolean;
518
+ timezone: z.ZodString;
519
+ source: z.ZodEnum<{
520
+ rollup: "rollup";
521
+ raw: "raw";
522
+ mixed: "mixed";
523
+ }>;
524
+ requestId: z.ZodString;
525
+ }, z.core.$strip>;
526
+ }, z.core.$strip>;
527
+ type TrafficOverviewResponse = z.infer<typeof zTrafficOverviewResponse>;
528
+ declare const zTrafficDimension: z.ZodEnum<{
529
+ channel: "channel";
530
+ referrer: "referrer";
531
+ utm: "utm";
532
+ }>;
533
+ type TrafficDimension = z.infer<typeof zTrafficDimension>;
534
+ declare const zTrafficSourcesInput: z.ZodObject<{
535
+ projectId: z.ZodString;
536
+ startDate: z.ZodString;
537
+ endDate: z.ZodString;
538
+ dimension: z.ZodEnum<{
539
+ channel: "channel";
540
+ referrer: "referrer";
541
+ utm: "utm";
542
+ }>;
543
+ limit: z.ZodDefault<z.ZodNumber>;
544
+ timezone: z.ZodOptional<z.ZodString>;
545
+ }, z.core.$strip>;
546
+ type TrafficSourcesInput = z.input<typeof zTrafficSourcesInput>;
547
+ declare const zTrafficSourceRow: z.ZodObject<{
548
+ sessions: z.ZodNumber;
549
+ pageviews: z.ZodNumber;
550
+ newVisitors: z.ZodNumber;
551
+ returningVisitors: z.ZodNumber;
552
+ bounceRate: z.ZodNumber;
553
+ key: z.ZodString;
554
+ channelType: z.ZodOptional<z.ZodString>;
555
+ referrerName: z.ZodOptional<z.ZodString>;
556
+ referrerType: z.ZodOptional<z.ZodString>;
557
+ utmSource: z.ZodOptional<z.ZodString>;
558
+ utmMedium: z.ZodOptional<z.ZodString>;
559
+ utmCampaign: z.ZodOptional<z.ZodString>;
560
+ }, z.core.$strip>;
561
+ type TrafficSourceRow = z.infer<typeof zTrafficSourceRow>;
562
+ declare const zTrafficSourcesData: z.ZodObject<{
563
+ dimension: z.ZodEnum<{
564
+ channel: "channel";
565
+ referrer: "referrer";
566
+ utm: "utm";
567
+ }>;
568
+ timezone: z.ZodString;
569
+ rows: z.ZodArray<z.ZodObject<{
570
+ sessions: z.ZodNumber;
571
+ pageviews: z.ZodNumber;
572
+ newVisitors: z.ZodNumber;
573
+ returningVisitors: z.ZodNumber;
574
+ bounceRate: z.ZodNumber;
575
+ key: z.ZodString;
576
+ channelType: z.ZodOptional<z.ZodString>;
577
+ referrerName: z.ZodOptional<z.ZodString>;
578
+ referrerType: z.ZodOptional<z.ZodString>;
579
+ utmSource: z.ZodOptional<z.ZodString>;
580
+ utmMedium: z.ZodOptional<z.ZodString>;
581
+ utmCampaign: z.ZodOptional<z.ZodString>;
582
+ }, z.core.$strip>>;
583
+ }, z.core.$strip>;
584
+ type TrafficSourcesData = z.infer<typeof zTrafficSourcesData>;
585
+ declare const zTrafficSourcesResponse: z.ZodObject<{
586
+ data: z.ZodObject<{
587
+ dimension: z.ZodEnum<{
588
+ channel: "channel";
589
+ referrer: "referrer";
590
+ utm: "utm";
591
+ }>;
592
+ timezone: z.ZodString;
593
+ rows: z.ZodArray<z.ZodObject<{
594
+ sessions: z.ZodNumber;
595
+ pageviews: z.ZodNumber;
596
+ newVisitors: z.ZodNumber;
597
+ returningVisitors: z.ZodNumber;
598
+ bounceRate: z.ZodNumber;
599
+ key: z.ZodString;
600
+ channelType: z.ZodOptional<z.ZodString>;
601
+ referrerName: z.ZodOptional<z.ZodString>;
602
+ referrerType: z.ZodOptional<z.ZodString>;
603
+ utmSource: z.ZodOptional<z.ZodString>;
604
+ utmMedium: z.ZodOptional<z.ZodString>;
605
+ utmCampaign: z.ZodOptional<z.ZodString>;
606
+ }, z.core.$strip>>;
607
+ }, z.core.$strip>;
608
+ meta: z.ZodObject<{
609
+ projectId: z.ZodString;
610
+ computedAt: z.ZodString;
611
+ cacheAgeSeconds: z.ZodNumber;
612
+ ingestLagSeconds: z.ZodNullable<z.ZodNumber>;
613
+ ingestLagStatus: z.ZodEnum<{
614
+ unknown: "unknown";
615
+ known: "known";
616
+ }>;
617
+ ingestDeadLetterCount: z.ZodNullable<z.ZodNumber>;
618
+ cached: z.ZodBoolean;
619
+ timezone: z.ZodString;
620
+ source: z.ZodEnum<{
621
+ rollup: "rollup";
622
+ raw: "raw";
623
+ mixed: "mixed";
624
+ }>;
625
+ requestId: z.ZodString;
626
+ }, z.core.$strip>;
627
+ }, z.core.$strip>;
628
+ type TrafficSourcesResponse = z.infer<typeof zTrafficSourcesResponse>;
351
629
  declare const QUERY_ERROR_CODES: readonly ["unauthorized", "project_scope_mismatch", "query_scope_missing", "validation_failed", "unsupported_combination", "project_purging", "rate_limited", "query_timeout", "internal_error"];
352
630
  declare const zQueryErrorCode: z.ZodEnum<{
353
- validation_failed: "validation_failed";
354
631
  unauthorized: "unauthorized";
632
+ validation_failed: "validation_failed";
355
633
  rate_limited: "rate_limited";
356
- project_purging: "project_purging";
357
634
  internal_error: "internal_error";
635
+ project_purging: "project_purging";
358
636
  project_scope_mismatch: "project_scope_mismatch";
359
637
  query_scope_missing: "query_scope_missing";
360
638
  unsupported_combination: "unsupported_combination";
@@ -364,11 +642,11 @@ type QueryErrorCode = z.infer<typeof zQueryErrorCode>;
364
642
  declare const zQueryError: z.ZodObject<{
365
643
  status: z.ZodNumber;
366
644
  code: z.ZodEnum<{
367
- validation_failed: "validation_failed";
368
645
  unauthorized: "unauthorized";
646
+ validation_failed: "validation_failed";
369
647
  rate_limited: "rate_limited";
370
- project_purging: "project_purging";
371
648
  internal_error: "internal_error";
649
+ project_purging: "project_purging";
372
650
  project_scope_mismatch: "project_scope_mismatch";
373
651
  query_scope_missing: "query_scope_missing";
374
652
  unsupported_combination: "unsupported_combination";
@@ -385,6 +663,8 @@ declare const QUERY_API_PATHS: {
385
663
  readonly eventsTimeseries: "/api/v1/query/events/timeseries";
386
664
  readonly funnel: "/api/v1/query/funnel";
387
665
  readonly retention: "/api/v1/query/retention";
666
+ readonly trafficOverview: "/api/v1/query/traffic/overview";
667
+ readonly trafficSources: "/api/v1/query/traffic/sources";
388
668
  };
389
669
 
390
- export { type ChannelFilter, type EventsTimeseriesData, type EventsTimeseriesInput, type EventsTimeseriesResponse, type FunnelData, type FunnelInput, type FunnelResponse, type Granularity, QUERY_API_PATHS, QUERY_ERROR_CODES, type QueryError, type QueryErrorCode, type QueryMeta, type RetentionData, type RetentionInput, type RetentionResponse, type TimeseriesBreakdown, type TimeseriesPoint, isValidTimeZone, zBucketStart, zChannelFilter, zEventsTimeseriesData, zEventsTimeseriesInput, zEventsTimeseriesResponse, zFunnelData, zFunnelInput, zFunnelResponse, zFunnelStep, zGranularity, zQueryEnvelope, zQueryError, zQueryErrorCode, zQueryMeta, zRetentionCell, zRetentionData, zRetentionInput, zRetentionInterval, zRetentionResponse, zTimeseriesBreakdown, zTimeseriesPoint, zTimezone };
670
+ export { type ChannelFilter, type EventPropertyFilter, type EventsTimeseriesData, type EventsTimeseriesInput, type EventsTimeseriesResponse, type FunnelData, type FunnelInput, type FunnelResponse, type Granularity, QUERY_API_PATHS, QUERY_ERROR_CODES, type QueryError, type QueryErrorCode, type QueryMeta, type QuerySource, type RetentionData, type RetentionInput, type RetentionResponse, type TimeseriesBreakdown, type TimeseriesPoint, type TrafficDimension, type TrafficOverviewData, type TrafficOverviewInput, type TrafficOverviewResponse, type TrafficSourceRow, type TrafficSourcesData, type TrafficSourcesInput, type TrafficSourcesResponse, type TrafficTotals, isValidTimeZone, zBucketStart, zChannelFilter, zEventPropertyFilter, zEventsTimeseriesData, zEventsTimeseriesInput, zEventsTimeseriesResponse, zFunnelData, zFunnelInput, zFunnelResponse, zFunnelStep, zGranularity, zQueryEnvelope, zQueryError, zQueryErrorCode, zQueryMeta, zQuerySource, zRetentionCell, zRetentionData, zRetentionInput, zRetentionInterval, zRetentionResponse, zTimeseriesBreakdown, zTimeseriesPoint, zTimezone, zTrafficDimension, zTrafficOverviewData, zTrafficOverviewInput, zTrafficOverviewResponse, zTrafficSeriesPoint, zTrafficSourceRow, zTrafficSourcesData, zTrafficSourcesInput, zTrafficSourcesResponse, zTrafficTotals };
package/dist/query.js CHANGED
@@ -4,6 +4,7 @@ import {
4
4
  isValidTimeZone,
5
5
  zBucketStart,
6
6
  zChannelFilter,
7
+ zEventPropertyFilter,
7
8
  zEventsTimeseriesData,
8
9
  zEventsTimeseriesInput,
9
10
  zEventsTimeseriesResponse,
@@ -16,6 +17,7 @@ import {
16
17
  zQueryError,
17
18
  zQueryErrorCode,
18
19
  zQueryMeta,
20
+ zQuerySource,
19
21
  zRetentionCell,
20
22
  zRetentionData,
21
23
  zRetentionInput,
@@ -23,12 +25,22 @@ import {
23
25
  zRetentionResponse,
24
26
  zTimeseriesBreakdown,
25
27
  zTimeseriesPoint,
26
- zTimezone
27
- } from "./chunk-55IWO4S3.js";
28
+ zTimezone,
29
+ zTrafficDimension,
30
+ zTrafficOverviewData,
31
+ zTrafficOverviewInput,
32
+ zTrafficOverviewResponse,
33
+ zTrafficSeriesPoint,
34
+ zTrafficSourceRow,
35
+ zTrafficSourcesData,
36
+ zTrafficSourcesInput,
37
+ zTrafficSourcesResponse,
38
+ zTrafficTotals
39
+ } from "./chunk-BCGR27G2.js";
28
40
  import {
29
41
  zDate,
30
42
  zInstant
31
- } from "./chunk-2LJ7JLDX.js";
43
+ } from "./chunk-2LZBZXBF.js";
32
44
  export {
33
45
  QUERY_API_PATHS,
34
46
  QUERY_ERROR_CODES,
@@ -36,6 +48,7 @@ export {
36
48
  zBucketStart,
37
49
  zChannelFilter,
38
50
  zDate,
51
+ zEventPropertyFilter,
39
52
  zEventsTimeseriesData,
40
53
  zEventsTimeseriesInput,
41
54
  zEventsTimeseriesResponse,
@@ -49,6 +62,7 @@ export {
49
62
  zQueryError,
50
63
  zQueryErrorCode,
51
64
  zQueryMeta,
65
+ zQuerySource,
52
66
  zRetentionCell,
53
67
  zRetentionData,
54
68
  zRetentionInput,
@@ -56,6 +70,16 @@ export {
56
70
  zRetentionResponse,
57
71
  zTimeseriesBreakdown,
58
72
  zTimeseriesPoint,
59
- zTimezone
73
+ zTimezone,
74
+ zTrafficDimension,
75
+ zTrafficOverviewData,
76
+ zTrafficOverviewInput,
77
+ zTrafficOverviewResponse,
78
+ zTrafficSeriesPoint,
79
+ zTrafficSourceRow,
80
+ zTrafficSourcesData,
81
+ zTrafficSourcesInput,
82
+ zTrafficSourcesResponse,
83
+ zTrafficTotals
60
84
  };
61
85
  //# sourceMappingURL=query.js.map
@@ -0,0 +1,85 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/report.ts
2
+ var _zod = require('zod');
3
+ var REPORT_SPEC_VERSION = 1;
4
+ var zReportRange = _zod.z.string().regex(/^\d+[dhm]$/, "expected a relative range such as 7d or 24h");
5
+ var zReportInterval = _zod.z.enum(["minute", "hour", "day", "week", "month"]);
6
+ var zLegacyChartType = _zod.z.enum([
7
+ "linear",
8
+ "bar",
9
+ "pie",
10
+ "metric",
11
+ "area",
12
+ "gauge",
13
+ "scatter",
14
+ "table",
15
+ "sparkline"
16
+ ]);
17
+ var zCommon = {
18
+ version: _zod.z.literal(REPORT_SPEC_VERSION),
19
+ range: zReportRange.default("30d"),
20
+ segmentId: _zod.z.string().min(1).optional()
21
+ };
22
+ var zTimeseriesReportSpec = _zod.z.object({
23
+ ...zCommon,
24
+ kind: _zod.z.literal("timeseries"),
25
+ chartType: zLegacyChartType,
26
+ interval: zReportInterval,
27
+ events: _zod.z.array(_zod.z.object({ name: _zod.z.string().min(1).max(200) })).min(1).max(20),
28
+ breakdowns: _zod.z.array(_zod.z.string().min(1).max(200)).max(5).default([]),
29
+ comparePrevious: _zod.z.boolean().default(false)
30
+ });
31
+ var zFunnelReportSpec = _zod.z.object({
32
+ ...zCommon,
33
+ kind: _zod.z.literal("funnel"),
34
+ steps: _zod.z.array(_zod.z.string().min(1).max(200)).min(2).max(10),
35
+ windowSeconds: _zod.z.number().int().min(60).max(2592e3).default(86400)
36
+ });
37
+ var zRetentionReportSpec = _zod.z.object({
38
+ ...zCommon,
39
+ kind: _zod.z.literal("retention"),
40
+ interval: _zod.z.enum(["day", "week", "month"]).default("day"),
41
+ periods: _zod.z.number().int().min(1).max(30).default(7),
42
+ startEvent: _zod.z.string().min(1).max(200).optional(),
43
+ returnEvent: _zod.z.string().min(1).max(200).optional(),
44
+ retentionType: _zod.z.enum(["bounded", "unbounded"]).default("bounded"),
45
+ cohortMode: _zod.z.enum(["first-ever", "first-in-window"]).default("first-ever")
46
+ });
47
+ var zPathReportSpec = _zod.z.object({
48
+ ...zCommon,
49
+ kind: _zod.z.literal("path"),
50
+ limit: _zod.z.number().int().min(1).max(100).default(30),
51
+ startPage: _zod.z.string().max(2e3).optional(),
52
+ endPage: _zod.z.string().max(2e3).optional()
53
+ });
54
+ var zReportSpec = _zod.z.discriminatedUnion("kind", [
55
+ zTimeseriesReportSpec,
56
+ zFunnelReportSpec,
57
+ zRetentionReportSpec,
58
+ zPathReportSpec
59
+ ]);
60
+ function legacyReportToSpec(input) {
61
+ const events = _zod.z.array(_zod.z.object({ name: _zod.z.string().min(1).max(200) })).safeParse(input.events);
62
+ const breakdowns = _zod.z.array(_zod.z.string().min(1).max(200)).safeParse(input.breakdowns);
63
+ return zTimeseriesReportSpec.parse({
64
+ version: REPORT_SPEC_VERSION,
65
+ kind: "timeseries",
66
+ chartType: input.chartType,
67
+ interval: input.interval,
68
+ range: input.range,
69
+ events: events.success && events.data.length > 0 ? events.data : [{ name: "$pageview" }],
70
+ breakdowns: breakdowns.success ? breakdowns.data : []
71
+ });
72
+ }
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+ exports.REPORT_SPEC_VERSION = REPORT_SPEC_VERSION; exports.legacyReportToSpec = legacyReportToSpec; exports.zFunnelReportSpec = zFunnelReportSpec; exports.zLegacyChartType = zLegacyChartType; exports.zPathReportSpec = zPathReportSpec; exports.zReportInterval = zReportInterval; exports.zReportRange = zReportRange; exports.zReportSpec = zReportSpec; exports.zRetentionReportSpec = zRetentionReportSpec; exports.zTimeseriesReportSpec = zTimeseriesReportSpec;
85
+ //# sourceMappingURL=report.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/eric/reopt-ai/reopt-data/packages/data-contract/dist/report.cjs","../src/report.ts"],"names":[],"mappings":"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","file":"/Users/eric/reopt-ai/reopt-data/packages/data-contract/dist/report.cjs","sourcesContent":[null,"import { z } from \"zod\";\n\nexport const REPORT_SPEC_VERSION = 1 as const;\n\nexport const zReportRange = z.string().regex(/^\\d+[dhm]$/, \"expected a relative range such as 7d or 24h\");\nexport const zReportInterval = z.enum([\"minute\", \"hour\", \"day\", \"week\", \"month\"]);\nexport const zLegacyChartType = z.enum([\n \"linear\",\n \"bar\",\n \"pie\",\n \"metric\",\n \"area\",\n \"gauge\",\n \"scatter\",\n \"table\",\n \"sparkline\",\n]);\n\nconst zCommon = {\n version: z.literal(REPORT_SPEC_VERSION),\n range: zReportRange.default(\"30d\"),\n segmentId: z.string().min(1).optional(),\n};\n\nexport const zTimeseriesReportSpec = z.object({\n ...zCommon,\n kind: z.literal(\"timeseries\"),\n chartType: zLegacyChartType,\n interval: zReportInterval,\n events: z\n .array(z.object({ name: z.string().min(1).max(200) }))\n .min(1)\n .max(20),\n breakdowns: z.array(z.string().min(1).max(200)).max(5).default([]),\n comparePrevious: z.boolean().default(false),\n});\n\nexport const zFunnelReportSpec = z.object({\n ...zCommon,\n kind: z.literal(\"funnel\"),\n steps: z.array(z.string().min(1).max(200)).min(2).max(10),\n windowSeconds: z.number().int().min(60).max(2_592_000).default(86_400),\n});\n\nexport const zRetentionReportSpec = z.object({\n ...zCommon,\n kind: z.literal(\"retention\"),\n interval: z.enum([\"day\", \"week\", \"month\"]).default(\"day\"),\n periods: z.number().int().min(1).max(30).default(7),\n startEvent: z.string().min(1).max(200).optional(),\n returnEvent: z.string().min(1).max(200).optional(),\n retentionType: z.enum([\"bounded\", \"unbounded\"]).default(\"bounded\"),\n cohortMode: z.enum([\"first-ever\", \"first-in-window\"]).default(\"first-ever\"),\n});\n\nexport const zPathReportSpec = z.object({\n ...zCommon,\n kind: z.literal(\"path\"),\n limit: z.number().int().min(1).max(100).default(30),\n startPage: z.string().max(2_000).optional(),\n endPage: z.string().max(2_000).optional(),\n});\n\nexport const zReportSpec = z.discriminatedUnion(\"kind\", [\n zTimeseriesReportSpec,\n zFunnelReportSpec,\n zRetentionReportSpec,\n zPathReportSpec,\n]);\n\nexport type ReportSpec = z.infer<typeof zReportSpec>;\nexport type TimeseriesReportSpec = z.infer<typeof zTimeseriesReportSpec>;\n\n/** Convert a pre-ReportSpec row into the canonical v1 representation. */\nexport function legacyReportToSpec(input: {\n chartType: z.infer<typeof zLegacyChartType>;\n interval: z.infer<typeof zReportInterval>;\n range: string;\n events: unknown;\n breakdowns: unknown;\n}): TimeseriesReportSpec {\n const events = z.array(z.object({ name: z.string().min(1).max(200) })).safeParse(input.events);\n const breakdowns = z.array(z.string().min(1).max(200)).safeParse(input.breakdowns);\n return zTimeseriesReportSpec.parse({\n version: REPORT_SPEC_VERSION,\n kind: \"timeseries\",\n chartType: input.chartType,\n interval: input.interval,\n range: input.range,\n events: events.success && events.data.length > 0 ? events.data : [{ name: \"$pageview\" }],\n breakdowns: breakdowns.success ? breakdowns.data : [],\n });\n}\n"]}