@iann29/rastro 0.1.0-alpha.5 → 0.1.0-alpha.7

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 (125) hide show
  1. package/README.md +82 -29
  2. package/agent/integration.md +17 -15
  3. package/agent/manifest.json +7 -5
  4. package/agent/manifest.schema.json +8 -5
  5. package/dist/client/federation.d.ts +34 -8
  6. package/dist/client/federation.d.ts.map +1 -1
  7. package/dist/client/federation.js +17 -3
  8. package/dist/client/federation.js.map +1 -1
  9. package/dist/client/index.d.ts +418 -21
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +191 -41
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/component/_generated/api.d.ts +2 -0
  14. package/dist/component/_generated/api.d.ts.map +1 -1
  15. package/dist/component/_generated/api.js.map +1 -1
  16. package/dist/component/_generated/component.d.ts +63 -7
  17. package/dist/component/_generated/component.d.ts.map +1 -1
  18. package/dist/component/affiliates.d.ts.map +1 -1
  19. package/dist/component/affiliates.js +6 -2
  20. package/dist/component/affiliates.js.map +1 -1
  21. package/dist/component/cardinality.d.ts.map +1 -1
  22. package/dist/component/cardinality.js.map +1 -1
  23. package/dist/component/constants.d.ts +7 -1
  24. package/dist/component/constants.d.ts.map +1 -1
  25. package/dist/component/constants.js +13 -1
  26. package/dist/component/constants.js.map +1 -1
  27. package/dist/component/diagnostics.d.ts.map +1 -1
  28. package/dist/component/diagnostics.js.map +1 -1
  29. package/dist/component/eventStore.d.ts +2 -1
  30. package/dist/component/eventStore.d.ts.map +1 -1
  31. package/dist/component/eventStore.js +13 -10
  32. package/dist/component/eventStore.js.map +1 -1
  33. package/dist/component/funnels.d.ts.map +1 -1
  34. package/dist/component/funnels.js +5 -3
  35. package/dist/component/funnels.js.map +1 -1
  36. package/dist/component/geo.d.ts.map +1 -1
  37. package/dist/component/geo.js +3 -2
  38. package/dist/component/geo.js.map +1 -1
  39. package/dist/component/goals.d.ts.map +1 -1
  40. package/dist/component/goals.js +8 -5
  41. package/dist/component/goals.js.map +1 -1
  42. package/dist/component/guards.d.ts.map +1 -1
  43. package/dist/component/guards.js.map +1 -1
  44. package/dist/component/http.d.ts.map +1 -1
  45. package/dist/component/http.js +51 -17
  46. package/dist/component/http.js.map +1 -1
  47. package/dist/component/ingest.d.ts +2 -1
  48. package/dist/component/ingest.d.ts.map +1 -1
  49. package/dist/component/ingest.js +143 -23
  50. package/dist/component/ingest.js.map +1 -1
  51. package/dist/component/live.d.ts.map +1 -1
  52. package/dist/component/live.js +1 -3
  53. package/dist/component/live.js.map +1 -1
  54. package/dist/component/reports.d.ts +60 -3
  55. package/dist/component/reports.d.ts.map +1 -1
  56. package/dist/component/reports.js +215 -49
  57. package/dist/component/reports.js.map +1 -1
  58. package/dist/component/retention.d.ts +4 -4
  59. package/dist/component/retention.d.ts.map +1 -1
  60. package/dist/component/retention.js +54 -22
  61. package/dist/component/retention.js.map +1 -1
  62. package/dist/component/sanitize.d.ts +11 -0
  63. package/dist/component/sanitize.d.ts.map +1 -1
  64. package/dist/component/sanitize.js +58 -11
  65. package/dist/component/sanitize.js.map +1 -1
  66. package/dist/component/schema.d.ts +47 -5
  67. package/dist/component/schema.js +21 -1
  68. package/dist/component/schema.js.map +1 -1
  69. package/dist/component/sites.d.ts.map +1 -1
  70. package/dist/component/sites.js +6 -6
  71. package/dist/component/sites.js.map +1 -1
  72. package/dist/component/validators.d.ts +14 -9
  73. package/dist/component/validators.d.ts.map +1 -1
  74. package/dist/component/validators.js +5 -1
  75. package/dist/component/validators.js.map +1 -1
  76. package/dist/component/visitors.d.ts.map +1 -1
  77. package/dist/component/visitors.js.map +1 -1
  78. package/dist/component/vitals.d.ts +41 -0
  79. package/dist/component/vitals.d.ts.map +1 -0
  80. package/dist/component/vitals.js +115 -0
  81. package/dist/component/vitals.js.map +1 -0
  82. package/dist/react/index.d.ts.map +1 -1
  83. package/dist/react/index.js.map +1 -1
  84. package/dist/tracker/generated.d.ts +8 -4
  85. package/dist/tracker/generated.d.ts.map +1 -1
  86. package/dist/tracker/generated.js +8 -4
  87. package/dist/tracker/generated.js.map +1 -1
  88. package/dist/tracker/tracker.d.ts.map +1 -1
  89. package/dist/tracker/tracker.js +3 -1
  90. package/dist/tracker/tracker.js.map +1 -1
  91. package/dist/tracker/vitals.d.ts +10 -0
  92. package/dist/tracker/vitals.d.ts.map +1 -0
  93. package/dist/tracker/vitals.js +140 -0
  94. package/dist/tracker/vitals.js.map +1 -0
  95. package/dist/tracker.min.js +1 -1
  96. package/dist/vitals.min.js +1 -0
  97. package/docs/benchmarks/2026-08-20-realistic.md +71 -71
  98. package/docs/benchmarks/2026-08-21-formal-certification.md +50 -30
  99. package/docs/benchmarks/2026-08-30-alpha6-recertification.md +206 -0
  100. package/docs/upgrading.md +46 -8
  101. package/llms.txt +5 -1
  102. package/package.json +17 -3
  103. package/scripts/benchmark-ingest.mjs +101 -48
  104. package/src/component/_generated/api.ts +2 -0
  105. package/src/component/_generated/component.ts +69 -4
  106. package/src/component/affiliates.ts +20 -5
  107. package/src/component/cardinality.ts +8 -7
  108. package/src/component/constants.ts +13 -1
  109. package/src/component/diagnostics.ts +3 -2
  110. package/src/component/eventStore.ts +53 -46
  111. package/src/component/funnels.ts +19 -16
  112. package/src/component/geo.ts +16 -14
  113. package/src/component/goals.ts +29 -21
  114. package/src/component/guards.ts +3 -1
  115. package/src/component/http.ts +93 -54
  116. package/src/component/ingest.ts +320 -127
  117. package/src/component/live.ts +5 -4
  118. package/src/component/reports.ts +563 -219
  119. package/src/component/retention.ts +221 -98
  120. package/src/component/sanitize.ts +99 -29
  121. package/src/component/schema.ts +31 -5
  122. package/src/component/sites.ts +22 -11
  123. package/src/component/validators.ts +16 -7
  124. package/src/component/visitors.ts +16 -5
  125. package/src/component/vitals.ts +146 -0
@@ -1,11 +1,13 @@
1
1
  import type { FunctionArgs, FunctionReturnType, GenericActionCtx, GenericDataModel, GenericMutationCtx, GenericQueryCtx } from "convex/server";
2
2
  import { type Infer } from "convex/values";
3
3
  import type { ComponentApi } from "../component/_generated/component.js";
4
- import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator } from "../component/validators.js";
4
+ import { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, vitalMetricValidator } from "../component/validators.js";
5
5
  import { type FederatedAnalyticsAuthorizerOptions, type FederatedAnalyticsConnectionStatus, type FederatedSiteSummary } from "./federation.js";
6
- export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, };
6
+ export { eventPropertiesValidator, eventTypeValidator, funnelStepValidator, goalMatchTypeValidator, ingestContextValidator, ingestResultValidator, trackerEventValidator, vitalMetricValidator, };
7
7
  export type { EventProperties, EventType, FunnelStep, IngestContext, TrackerEvent, } from "../component/validators.js";
8
- export { FEDERATED_ANALYTICS_CLAIMS, FEDERATED_ANALYTICS_CONNECTOR_MANIFEST, FEDERATED_ANALYTICS_ERROR_CODES, FEDERATED_ANALYTICS_READ_PERMISSION, } from "./federation.js";
8
+ export { VITAL_METRICS, VITAL_THRESHOLDS } from "../component/vitals.js";
9
+ export type { VitalMetric } from "../component/vitals.js";
10
+ export { FEDERATED_ANALYTICS_CLAIMS, FEDERATED_ANALYTICS_CONNECTOR_MANIFEST, FEDERATED_ANALYTICS_ERROR_CODES, FEDERATED_ANALYTICS_READ_PERMISSION, FEDERATED_ANALYTICS_REQUIRED_CAPABILITIES, FEDERATED_ANALYTICS_REQUIRED_FUNCTIONS, } from "./federation.js";
9
11
  export type { FederatedAnalyticsCapability, FederatedAnalyticsAuthorizerOptions, FederatedAnalyticsConnection, FederatedAnalyticsConnectionStatus, FederatedAnalyticsErrorCode, FederatedAnalyticsIdentity, FederatedAnalyticsManifest, FederatedSiteSummary, ResolveFederatedAnalyticsConnection, } from "./federation.js";
10
12
  export type CreateSiteInput = FunctionArgs<ComponentApi["sites"]["create"]>;
11
13
  export type CreateSiteOutput = FunctionReturnType<ComponentApi["sites"]["create"]>;
@@ -38,6 +40,8 @@ export type FunnelsReportInput = FunctionArgs<ComponentApi["reports"]["funnelsRe
38
40
  export type FunnelsReport = Infer<typeof hostFunnelsReportValidator>;
39
41
  export type AffiliatesReportInput = FunctionArgs<ComponentApi["reports"]["affiliatesReport"]>;
40
42
  export type AffiliatesReport = Infer<typeof hostAffiliatesReportValidator>;
43
+ export type VitalsReportInput = FunctionArgs<ComponentApi["reports"]["vitalsReport"]>;
44
+ export type VitalsReport = Infer<typeof hostVitalsReportValidator>;
41
45
  export type UpsertGoalInput = FunctionArgs<ComponentApi["goals"]["upsert"]>;
42
46
  export type UpsertGoalOutput = FunctionReturnType<ComponentApi["goals"]["upsert"]>;
43
47
  export type Goal = FunctionReturnType<ComponentApi["goals"]["list"]>[number];
@@ -68,7 +72,7 @@ export type DataCoverage = {
68
72
  from: number;
69
73
  to: number;
70
74
  datasets: Array<{
71
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
75
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
72
76
  coverage: CoverageStatus;
73
77
  }>;
74
78
  };
@@ -101,7 +105,7 @@ export type RetentionStatus = {
101
105
  }>;
102
106
  backlog: number;
103
107
  };
104
- export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
108
+ export type RetentionKind = "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
105
109
  export type RunRetentionPolicyInput = {
106
110
  siteId: string;
107
111
  kind: RetentionKind;
@@ -347,7 +351,7 @@ export declare class Rastro {
347
351
  siteId: string;
348
352
  target?: string;
349
353
  timestamp: number;
350
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
354
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
351
355
  visitorId: string;
352
356
  }>;
353
357
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -402,7 +406,7 @@ export declare class Rastro {
402
406
  siteId: string;
403
407
  target?: string;
404
408
  timestamp: number;
405
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
409
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
406
410
  visitorId: string;
407
411
  }[]>;
408
412
  goalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: GoalsReportInput): Promise<{
@@ -517,6 +521,57 @@ export declare class Rastro {
517
521
  };
518
522
  truncated: boolean;
519
523
  }>;
524
+ vitalsReport(ctx: QueryCtx | MutationCtx | ActionCtx, args: VitalsReportInput): Promise<{
525
+ metadata: {
526
+ basis: "dailyRollup" | "boundedLegacy";
527
+ coverage: {
528
+ availableFrom: number | null;
529
+ availableThrough: number | null;
530
+ generation: number | null;
531
+ retainedBefore: number | null;
532
+ state: "complete" | "partial" | "retained" | "unavailable";
533
+ };
534
+ range: {
535
+ boundary: "inclusive";
536
+ from: number;
537
+ timezone: "UTC";
538
+ to: number;
539
+ };
540
+ };
541
+ metrics: Array<{
542
+ average: number;
543
+ count: number;
544
+ devices: Array<{
545
+ average: number;
546
+ count: number;
547
+ device: string;
548
+ good: number;
549
+ needsImprovement: number;
550
+ p75: number;
551
+ poor: number;
552
+ }>;
553
+ good: number;
554
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
555
+ needsImprovement: number;
556
+ p75: number;
557
+ pages: Array<{
558
+ average: number;
559
+ count: number;
560
+ good: number;
561
+ needsImprovement: number;
562
+ p75: number;
563
+ page: string;
564
+ poor: number;
565
+ }>;
566
+ poor: number;
567
+ timeSeries: Array<{
568
+ count: number;
569
+ p75: number;
570
+ timestamp: number;
571
+ }>;
572
+ }>;
573
+ truncated: boolean;
574
+ }>;
520
575
  upsertGoal(ctx: MutationCtx, args: UpsertGoalInput): Promise<string>;
521
576
  listGoals(ctx: QueryCtx | MutationCtx | ActionCtx, siteId: string): Promise<{
522
577
  _creationTime: number;
@@ -578,7 +633,7 @@ export declare class Rastro {
578
633
  retainedBefore: number | null;
579
634
  state: "complete" | "partial" | "retained" | "unavailable";
580
635
  };
581
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
636
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
582
637
  }>;
583
638
  from: number;
584
639
  siteId: string;
@@ -591,7 +646,7 @@ export declare class Rastro {
591
646
  jobs: Array<{
592
647
  before: number;
593
648
  deleted: number;
594
- kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
649
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
595
650
  scheduledAt: number | null;
596
651
  status: "pending" | "running" | "complete";
597
652
  updatedAt: number;
@@ -611,7 +666,7 @@ export declare class Rastro {
611
666
  hasMore: boolean;
612
667
  }>;
613
668
  }
614
- export type AnalyticsOperation = "site.create" | "site.update" | "site.get" | "site.list" | "ingest" | "conversion.track" | "visitor.link" | "report.overview" | "report.live" | "report.sessions" | "report.sessionJourney" | "report.conversions" | "report.visitorJourney" | "report.goals" | "report.funnels" | "report.affiliates" | "goal.upsert" | "goal.list" | "goal.remove" | "funnel.upsert" | "funnel.list" | "funnel.remove" | "affiliate.upsert" | "affiliate.list" | "affiliate.remove" | "retention.cleanup" | "retention.policy" | "retention.status" | "coverage.read";
669
+ export type AnalyticsOperation = "site.create" | "site.update" | "site.get" | "site.list" | "ingest" | "conversion.track" | "visitor.link" | "report.overview" | "report.live" | "report.sessions" | "report.sessionJourney" | "report.conversions" | "report.visitorJourney" | "report.goals" | "report.funnels" | "report.affiliates" | "report.vitals" | "goal.upsert" | "goal.list" | "goal.remove" | "funnel.upsert" | "funnel.list" | "funnel.remove" | "affiliate.upsert" | "affiliate.list" | "affiliate.remove" | "retention.cleanup" | "retention.policy" | "retention.status" | "coverage.read";
615
670
  export type AnalyticsAuthorizationRequest = {
616
671
  operation: AnalyticsOperation;
617
672
  siteIds: string[];
@@ -1416,6 +1471,235 @@ declare const hostAffiliatesReportValidator: import("convex/values").VObject<{
1416
1471
  }, "required", "basis" | "exact">;
1417
1472
  }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to" | "uniqueVisitors" | "uniqueVisitors.basis" | "uniqueVisitors.exact">;
1418
1473
  }, "required", "affiliates" | "metadata" | "metadata.basis" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metadata.uniqueVisitors" | "metadata.uniqueVisitors.basis" | "metadata.uniqueVisitors.exact" | "truncated">;
1474
+ declare const hostVitalsReportValidator: import("convex/values").VObject<{
1475
+ metadata: {
1476
+ basis: "boundedLegacy" | "dailyRollup";
1477
+ coverage: {
1478
+ availableFrom: number | null;
1479
+ availableThrough: number | null;
1480
+ generation: number | null;
1481
+ retainedBefore: number | null;
1482
+ state: "complete" | "partial" | "retained" | "unavailable";
1483
+ };
1484
+ range: {
1485
+ boundary: "inclusive";
1486
+ from: number;
1487
+ timezone: "UTC";
1488
+ to: number;
1489
+ };
1490
+ };
1491
+ metrics: {
1492
+ average: number;
1493
+ count: number;
1494
+ devices: {
1495
+ average: number;
1496
+ count: number;
1497
+ device: string;
1498
+ good: number;
1499
+ needsImprovement: number;
1500
+ p75: number;
1501
+ poor: number;
1502
+ }[];
1503
+ good: number;
1504
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1505
+ needsImprovement: number;
1506
+ p75: number;
1507
+ pages: {
1508
+ average: number;
1509
+ count: number;
1510
+ good: number;
1511
+ needsImprovement: number;
1512
+ p75: number;
1513
+ page: string;
1514
+ poor: number;
1515
+ }[];
1516
+ poor: number;
1517
+ timeSeries: {
1518
+ count: number;
1519
+ p75: number;
1520
+ timestamp: number;
1521
+ }[];
1522
+ }[];
1523
+ truncated: boolean;
1524
+ }, {
1525
+ metrics: import("convex/values").VArray<{
1526
+ average: number;
1527
+ count: number;
1528
+ devices: {
1529
+ average: number;
1530
+ count: number;
1531
+ device: string;
1532
+ good: number;
1533
+ needsImprovement: number;
1534
+ p75: number;
1535
+ poor: number;
1536
+ }[];
1537
+ good: number;
1538
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1539
+ needsImprovement: number;
1540
+ p75: number;
1541
+ pages: {
1542
+ average: number;
1543
+ count: number;
1544
+ good: number;
1545
+ needsImprovement: number;
1546
+ p75: number;
1547
+ page: string;
1548
+ poor: number;
1549
+ }[];
1550
+ poor: number;
1551
+ timeSeries: {
1552
+ count: number;
1553
+ p75: number;
1554
+ timestamp: number;
1555
+ }[];
1556
+ }[], import("convex/values").VObject<{
1557
+ average: number;
1558
+ count: number;
1559
+ devices: {
1560
+ average: number;
1561
+ count: number;
1562
+ device: string;
1563
+ good: number;
1564
+ needsImprovement: number;
1565
+ p75: number;
1566
+ poor: number;
1567
+ }[];
1568
+ good: number;
1569
+ metric: "CLS" | "FCP" | "INP" | "LCP" | "TTFB";
1570
+ needsImprovement: number;
1571
+ p75: number;
1572
+ pages: {
1573
+ average: number;
1574
+ count: number;
1575
+ good: number;
1576
+ needsImprovement: number;
1577
+ p75: number;
1578
+ page: string;
1579
+ poor: number;
1580
+ }[];
1581
+ poor: number;
1582
+ timeSeries: {
1583
+ count: number;
1584
+ p75: number;
1585
+ timestamp: number;
1586
+ }[];
1587
+ }, {
1588
+ count: import("convex/values").VFloat64<number, "required">;
1589
+ p75: import("convex/values").VFloat64<number, "required">;
1590
+ average: import("convex/values").VFloat64<number, "required">;
1591
+ good: import("convex/values").VFloat64<number, "required">;
1592
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1593
+ poor: import("convex/values").VFloat64<number, "required">;
1594
+ metric: import("convex/values").VUnion<"CLS" | "FCP" | "INP" | "LCP" | "TTFB", [import("convex/values").VLiteral<"LCP", "required">, import("convex/values").VLiteral<"CLS", "required">, import("convex/values").VLiteral<"INP", "required">, import("convex/values").VLiteral<"FCP", "required">, import("convex/values").VLiteral<"TTFB", "required">], "required", never>;
1595
+ devices: import("convex/values").VArray<{
1596
+ average: number;
1597
+ count: number;
1598
+ device: string;
1599
+ good: number;
1600
+ needsImprovement: number;
1601
+ p75: number;
1602
+ poor: number;
1603
+ }[], import("convex/values").VObject<{
1604
+ average: number;
1605
+ count: number;
1606
+ device: string;
1607
+ good: number;
1608
+ needsImprovement: number;
1609
+ p75: number;
1610
+ poor: number;
1611
+ }, {
1612
+ count: import("convex/values").VFloat64<number, "required">;
1613
+ p75: import("convex/values").VFloat64<number, "required">;
1614
+ average: import("convex/values").VFloat64<number, "required">;
1615
+ good: import("convex/values").VFloat64<number, "required">;
1616
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1617
+ poor: import("convex/values").VFloat64<number, "required">;
1618
+ device: import("convex/values").VString<string, "required">;
1619
+ }, "required", "average" | "count" | "device" | "good" | "needsImprovement" | "p75" | "poor">, "required">;
1620
+ pages: import("convex/values").VArray<{
1621
+ average: number;
1622
+ count: number;
1623
+ good: number;
1624
+ needsImprovement: number;
1625
+ p75: number;
1626
+ page: string;
1627
+ poor: number;
1628
+ }[], import("convex/values").VObject<{
1629
+ average: number;
1630
+ count: number;
1631
+ good: number;
1632
+ needsImprovement: number;
1633
+ p75: number;
1634
+ page: string;
1635
+ poor: number;
1636
+ }, {
1637
+ count: import("convex/values").VFloat64<number, "required">;
1638
+ p75: import("convex/values").VFloat64<number, "required">;
1639
+ average: import("convex/values").VFloat64<number, "required">;
1640
+ good: import("convex/values").VFloat64<number, "required">;
1641
+ needsImprovement: import("convex/values").VFloat64<number, "required">;
1642
+ poor: import("convex/values").VFloat64<number, "required">;
1643
+ page: import("convex/values").VString<string, "required">;
1644
+ }, "required", "average" | "count" | "good" | "needsImprovement" | "p75" | "page" | "poor">, "required">;
1645
+ timeSeries: import("convex/values").VArray<{
1646
+ count: number;
1647
+ p75: number;
1648
+ timestamp: number;
1649
+ }[], import("convex/values").VObject<{
1650
+ count: number;
1651
+ p75: number;
1652
+ timestamp: number;
1653
+ }, {
1654
+ timestamp: import("convex/values").VFloat64<number, "required">;
1655
+ count: import("convex/values").VFloat64<number, "required">;
1656
+ p75: import("convex/values").VFloat64<number, "required">;
1657
+ }, "required", "count" | "p75" | "timestamp">, "required">;
1658
+ }, "required", "average" | "count" | "devices" | "good" | "metric" | "needsImprovement" | "p75" | "pages" | "poor" | "timeSeries">, "required">;
1659
+ truncated: import("convex/values").VBoolean<boolean, "required">;
1660
+ metadata: import("convex/values").VObject<{
1661
+ basis: "boundedLegacy" | "dailyRollup";
1662
+ coverage: {
1663
+ availableFrom: number | null;
1664
+ availableThrough: number | null;
1665
+ generation: number | null;
1666
+ retainedBefore: number | null;
1667
+ state: "complete" | "partial" | "retained" | "unavailable";
1668
+ };
1669
+ range: {
1670
+ boundary: "inclusive";
1671
+ from: number;
1672
+ timezone: "UTC";
1673
+ to: number;
1674
+ };
1675
+ }, {
1676
+ basis: import("convex/values").VUnion<"boundedLegacy" | "dailyRollup", [import("convex/values").VLiteral<"dailyRollup", "required">, import("convex/values").VLiteral<"boundedLegacy", "required">], "required", never>;
1677
+ coverage: import("convex/values").VObject<{
1678
+ availableFrom: number | null;
1679
+ availableThrough: number | null;
1680
+ generation: number | null;
1681
+ retainedBefore: number | null;
1682
+ state: "complete" | "partial" | "retained" | "unavailable";
1683
+ }, {
1684
+ state: import("convex/values").VUnion<"complete" | "partial" | "retained" | "unavailable", [import("convex/values").VLiteral<"complete", "required">, import("convex/values").VLiteral<"partial", "required">, import("convex/values").VLiteral<"retained", "required">, import("convex/values").VLiteral<"unavailable", "required">], "required", never>;
1685
+ generation: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1686
+ availableFrom: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1687
+ availableThrough: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1688
+ retainedBefore: import("convex/values").VUnion<number | null, [import("convex/values").VFloat64<number, "required">, import("convex/values").VNull<null, "required">], "required", never>;
1689
+ }, "required", "availableFrom" | "availableThrough" | "generation" | "retainedBefore" | "state">;
1690
+ range: import("convex/values").VObject<{
1691
+ boundary: "inclusive";
1692
+ from: number;
1693
+ timezone: "UTC";
1694
+ to: number;
1695
+ }, {
1696
+ from: import("convex/values").VFloat64<number, "required">;
1697
+ to: import("convex/values").VFloat64<number, "required">;
1698
+ boundary: import("convex/values").VLiteral<"inclusive", "required">;
1699
+ timezone: import("convex/values").VLiteral<"UTC", "required">;
1700
+ }, "required", "boundary" | "from" | "timezone" | "to">;
1701
+ }, "required", "basis" | "coverage" | "coverage.availableFrom" | "coverage.availableThrough" | "coverage.generation" | "coverage.retainedBefore" | "coverage.state" | "range" | "range.boundary" | "range.from" | "range.timezone" | "range.to">;
1702
+ }, "required", "metadata" | "metadata.basis" | "metadata.coverage" | "metadata.coverage.availableFrom" | "metadata.coverage.availableThrough" | "metadata.coverage.generation" | "metadata.coverage.retainedBefore" | "metadata.coverage.state" | "metadata.range" | "metadata.range.boundary" | "metadata.range.from" | "metadata.range.timezone" | "metadata.range.to" | "metrics" | "truncated">;
1419
1703
  export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1420
1704
  authorize: AnalyticsAuthorizer;
1421
1705
  }): {
@@ -1493,7 +1777,8 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1493
1777
  sessionId: string;
1494
1778
  target?: string | undefined;
1495
1779
  timestamp: number;
1496
- type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview";
1780
+ type: "click" | "conversion" | "custom" | "heartbeat" | "outbound" | "pageview" | "vital";
1781
+ value?: number | undefined;
1497
1782
  visitorId: string;
1498
1783
  }[];
1499
1784
  origin: string;
@@ -1756,7 +2041,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1756
2041
  siteId: string;
1757
2042
  target?: string;
1758
2043
  timestamp: number;
1759
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2044
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
1760
2045
  visitorId: string;
1761
2046
  }>;
1762
2047
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -1829,7 +2114,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1829
2114
  siteId: string;
1830
2115
  target?: string;
1831
2116
  timestamp: number;
1832
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2117
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
1833
2118
  visitorId: string;
1834
2119
  }[]>>;
1835
2120
  goalsReport: import("convex/server").RegisteredQuery<"public", {
@@ -1956,6 +2241,61 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1956
2241
  };
1957
2242
  truncated: boolean;
1958
2243
  }>>;
2244
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
2245
+ from: number;
2246
+ siteId: string;
2247
+ to: number;
2248
+ }, Promise<{
2249
+ metadata: {
2250
+ basis: "dailyRollup" | "boundedLegacy";
2251
+ coverage: {
2252
+ availableFrom: number | null;
2253
+ availableThrough: number | null;
2254
+ generation: number | null;
2255
+ retainedBefore: number | null;
2256
+ state: "complete" | "partial" | "retained" | "unavailable";
2257
+ };
2258
+ range: {
2259
+ boundary: "inclusive";
2260
+ from: number;
2261
+ timezone: "UTC";
2262
+ to: number;
2263
+ };
2264
+ };
2265
+ metrics: Array<{
2266
+ average: number;
2267
+ count: number;
2268
+ devices: Array<{
2269
+ average: number;
2270
+ count: number;
2271
+ device: string;
2272
+ good: number;
2273
+ needsImprovement: number;
2274
+ p75: number;
2275
+ poor: number;
2276
+ }>;
2277
+ good: number;
2278
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
2279
+ needsImprovement: number;
2280
+ p75: number;
2281
+ pages: Array<{
2282
+ average: number;
2283
+ count: number;
2284
+ good: number;
2285
+ needsImprovement: number;
2286
+ p75: number;
2287
+ page: string;
2288
+ poor: number;
2289
+ }>;
2290
+ poor: number;
2291
+ timeSeries: Array<{
2292
+ count: number;
2293
+ p75: number;
2294
+ timestamp: number;
2295
+ }>;
2296
+ }>;
2297
+ truncated: boolean;
2298
+ }>>;
1959
2299
  dataCoverage: import("convex/server").RegisteredQuery<"public", {
1960
2300
  from: number;
1961
2301
  siteId: string;
@@ -1969,7 +2309,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1969
2309
  retainedBefore: number | null;
1970
2310
  state: "complete" | "partial" | "retained" | "unavailable";
1971
2311
  };
1972
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
2312
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
1973
2313
  }>;
1974
2314
  from: number;
1975
2315
  siteId: string;
@@ -1982,7 +2322,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
1982
2322
  jobs: Array<{
1983
2323
  before: number;
1984
2324
  deleted: number;
1985
- kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
2325
+ kind: "events" | "sessions" | "conversions" | "goalCompletions" | "aggregateHour" | "aggregateDay" | "funnelProgress" | "funnelSteps" | "affiliateStats" | "goalRollups" | "funnelRollups" | "affiliateRollups" | "vitalRollups" | "attributions" | "liveSessions" | "ingestWindows" | "siteIngestWindows";
1986
2326
  scheduledAt: number | null;
1987
2327
  status: "pending" | "running" | "complete";
1988
2328
  updatedAt: number;
@@ -2009,7 +2349,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
2009
2349
  }, Promise<null>>;
2010
2350
  runRetentionPolicy: import("convex/server").RegisteredMutation<"public", {
2011
2351
  batchSize?: number | undefined;
2012
- kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2352
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "vitalRollups";
2013
2353
  siteId: string;
2014
2354
  }, Promise<{
2015
2355
  before: number;
@@ -2110,7 +2450,7 @@ export declare function exposeAnalyticsApi(component: ComponentApi, options: {
2110
2450
  cleanupAnalytics: import("convex/server").RegisteredMutation<"public", {
2111
2451
  batchSize?: number | undefined;
2112
2452
  before: number;
2113
- kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows";
2453
+ kind: "affiliateRollups" | "affiliateStats" | "aggregateDay" | "aggregateHour" | "attributions" | "conversions" | "events" | "funnelProgress" | "funnelRollups" | "funnelSteps" | "goalCompletions" | "goalRollups" | "ingestWindows" | "liveSessions" | "sessions" | "siteIngestWindows" | "vitalRollups";
2114
2454
  siteId: string;
2115
2455
  }, Promise<{
2116
2456
  before: number;
@@ -2138,8 +2478,9 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2138
2478
  funnelsReport: "funnelsReport";
2139
2479
  affiliatesReport: "affiliatesReport";
2140
2480
  dataCoverage: "dataCoverage";
2481
+ vitalsReport: "vitalsReport";
2141
2482
  };
2142
- capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteSummaries" | "visitorJourney")[];
2483
+ capabilities: ("affiliates" | "conversions" | "dataCoverage" | "funnels" | "goals" | "liveVisitors" | "overview" | "sessionJourney" | "sessions" | "siteSummaries" | "visitorJourney" | "vitals")[];
2143
2484
  limits: {
2144
2485
  maxSitesPerRequest: 10;
2145
2486
  maxSitesPerConnection: 10;
@@ -2379,7 +2720,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2379
2720
  siteId: string;
2380
2721
  target?: string;
2381
2722
  timestamp: number;
2382
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2723
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
2383
2724
  visitorId: string;
2384
2725
  }>;
2385
2726
  pageStatus?: "SplitRecommended" | "SplitRequired" | null;
@@ -2452,7 +2793,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2452
2793
  siteId: string;
2453
2794
  target?: string;
2454
2795
  timestamp: number;
2455
- type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound";
2796
+ type: "pageview" | "click" | "custom" | "conversion" | "heartbeat" | "outbound" | "vital";
2456
2797
  visitorId: string;
2457
2798
  }[]>>;
2458
2799
  goalsReport: import("convex/server").RegisteredQuery<"public", {
@@ -2579,6 +2920,61 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2579
2920
  };
2580
2921
  truncated: boolean;
2581
2922
  }>>;
2923
+ vitalsReport: import("convex/server").RegisteredQuery<"public", {
2924
+ from: number;
2925
+ siteId: string;
2926
+ to: number;
2927
+ }, Promise<{
2928
+ metadata: {
2929
+ basis: "dailyRollup" | "boundedLegacy";
2930
+ coverage: {
2931
+ availableFrom: number | null;
2932
+ availableThrough: number | null;
2933
+ generation: number | null;
2934
+ retainedBefore: number | null;
2935
+ state: "complete" | "partial" | "retained" | "unavailable";
2936
+ };
2937
+ range: {
2938
+ boundary: "inclusive";
2939
+ from: number;
2940
+ timezone: "UTC";
2941
+ to: number;
2942
+ };
2943
+ };
2944
+ metrics: Array<{
2945
+ average: number;
2946
+ count: number;
2947
+ devices: Array<{
2948
+ average: number;
2949
+ count: number;
2950
+ device: string;
2951
+ good: number;
2952
+ needsImprovement: number;
2953
+ p75: number;
2954
+ poor: number;
2955
+ }>;
2956
+ good: number;
2957
+ metric: "LCP" | "CLS" | "INP" | "FCP" | "TTFB";
2958
+ needsImprovement: number;
2959
+ p75: number;
2960
+ pages: Array<{
2961
+ average: number;
2962
+ count: number;
2963
+ good: number;
2964
+ needsImprovement: number;
2965
+ p75: number;
2966
+ page: string;
2967
+ poor: number;
2968
+ }>;
2969
+ poor: number;
2970
+ timeSeries: Array<{
2971
+ count: number;
2972
+ p75: number;
2973
+ timestamp: number;
2974
+ }>;
2975
+ }>;
2976
+ truncated: boolean;
2977
+ }>>;
2582
2978
  dataCoverage: import("convex/server").RegisteredQuery<"public", {
2583
2979
  from: number;
2584
2980
  siteId: string;
@@ -2592,7 +2988,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2592
2988
  retainedBefore: number | null;
2593
2989
  state: "complete" | "partial" | "retained" | "unavailable";
2594
2990
  };
2595
- dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates";
2991
+ dataset: "overviewHour" | "overviewDay" | "events" | "sessions" | "conversions" | "goals" | "funnels" | "affiliates" | "vitals";
2596
2992
  }>;
2597
2993
  from: number;
2598
2994
  siteId: string;
@@ -2602,6 +2998,7 @@ export declare function exposeFederatedAnalyticsApi(component: ComponentApi, opt
2602
2998
  export declare function componentHttpPaths(prefix?: string): {
2603
2999
  readonly events: `${string}/events`;
2604
3000
  readonly tracker: `${string}/tracker.js`;
3001
+ readonly vitals: `${string}/vitals.js`;
2605
3002
  readonly health: `${string}/health`;
2606
3003
  };
2607
3004
  type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;