@uptimizr/collector-server 0.8.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -185,14 +185,22 @@ The storage backend is chosen with `COLLECTOR_STORE`:
185
185
  instance per file; back up by copying the file.
186
186
  - `memory` — a dependency-free in-memory store for local dev / E2E only (seed its
187
187
  project/key via `COLLECTOR_MEMORY_PROJECT_ID` / `COLLECTOR_MEMORY_API_KEY`).
188
+ - `postgres` — a **single-tenant Postgres store** (`@uptimizr/db-postgres`): events **and**
189
+ metadata in one Postgres database (`POSTGRES_URL` / `DATABASE_URL`, optional `POSTGRES_SCHEMA`,
190
+ `POSTGRES_POOL_MAX`). Multi-writer; identical analytics results (parity suite).
191
+ - `mssql` — a **single-tenant Microsoft SQL Server store** (`@uptimizr/db-mssql`): events **and**
192
+ metadata in one SQL Server / Azure SQL database (`MSSQL_URL`, or `MSSQL_SERVER` / `MSSQL_PORT` /
193
+ `MSSQL_DATABASE` / `MSSQL_USER` / `MSSQL_PASSWORD`), created on first boot. Multi-writer;
194
+ identical analytics results (parity suite); SQL Server 2022+ / Azure SQL.
188
195
  - `clickhouse` — a **single-tenant ClickHouse store** for the scale tier: events **and**
189
196
  metadata (projects, API keys, scene representations) live in one ClickHouse database
190
197
  (`CLICKHOUSE_URL` / `CLICKHOUSE_DATABASE` / `CLICKHOUSE_USER` / `CLICKHOUSE_PASSWORD`), created
191
198
  on first boot. Use it for concurrent writers / horizontal scale and high-volume ingestion. The
192
199
  full analytics surface returns results identical to DuckDB (cross-engine parity suite).
193
200
 
194
- For multi-writer / horizontal scale, choose the `clickhouse` store; spin up a local ClickHouse
195
- with `infra/docker` (`pnpm stack:up`). The default DuckDB store needs no external service.
201
+ For multi-writer / horizontal scale, choose the `postgres`, `mssql` or `clickhouse` store; spin
202
+ up local servers with `infra/docker` (`pnpm stack:up`). The default DuckDB store needs no external
203
+ service.
196
204
 
197
205
  ## Develop
198
206
 
@@ -0,0 +1,22 @@
1
+ import type { CollectorStore } from "./store.js";
2
+ /**
3
+ * Optional single-tenant Microsoft SQL Server store (ADR 0020, #85): the
4
+ * relational, multi-writer path for self-hosters standardized on SQL Server /
5
+ * Azure SQL who have outgrown DuckDB's single read-write process. It carries
6
+ * the **full** analytics surface — no stubbed aggregates — by rendering the same
7
+ * dialect-agnostic builders with {@link mssqlDialect} (vectors as JSON, ASOF
8
+ * joins emulated via `CROSS`/`OUTER APPLY`, daily rollups recomputed at query
9
+ * time) and executing them over a pooled `mssql` (tedious) connection. Events
10
+ * live in the wide `events` table (plus the dedicated `node_samples`); metadata
11
+ * (projects, API keys, scene registry) is re-homed into the same database.
12
+ *
13
+ * The database is created on first boot when the login may (`CREATE ANY
14
+ * DATABASE`), and the schema is migrated on creation (migrations are
15
+ * idempotent, forward-only and serialized behind an application lock, so
16
+ * several collector instances can boot against one database). Connection
17
+ * settings come from `readDbSettings().mssql` (`MSSQL_URL`, or `MSSQL_SERVER` /
18
+ * `MSSQL_PORT` / `MSSQL_DATABASE` / `MSSQL_USER` / `MSSQL_PASSWORD` with
19
+ * `MSSQL_ENCRYPT` / `MSSQL_TRUST_SERVER_CERTIFICATE`, plus `MSSQL_POOL_MAX`).
20
+ */
21
+ export declare function createMssqlStore(): Promise<CollectorStore>;
22
+ //# sourceMappingURL=mssqlStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mssqlStore.d.ts","sourceRoot":"","sources":["../src/mssqlStore.ts"],"names":[],"mappings":"AAqJA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC,CAwLhE"}
@@ -0,0 +1,120 @@
1
+ import { buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildDistinctScenes, buildEventTypeCounts, buildFlowHeatmap, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, buildListSessions, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildRenderScaleTruth, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildTopInputActions, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, mssqlDialect, readDbSettings, } from "@uptimizr/db";
2
+ import { createMssqlClient, ensureMssqlDatabase, migrateMssql, resolveMssqlConfig, runMssqlQuery, insertEvents as msInsertEvents, getSessionEvents as msGetSessionEvents, streamSessionEvents as msStreamSessionEvents, getSessionMeta as msGetSessionMeta, getProject as msGetProject, resolveApiKey as msResolveApiKey, upsertSceneProxy as msUpsertSceneProxy, getSceneRepresentation as msGetSceneRepresentation, listSceneRepresentations as msListSceneRepresentations, } from "@uptimizr/db-mssql";
3
+ /**
4
+ * Optional single-tenant Microsoft SQL Server store (ADR 0020, #85): the
5
+ * relational, multi-writer path for self-hosters standardized on SQL Server /
6
+ * Azure SQL who have outgrown DuckDB's single read-write process. It carries
7
+ * the **full** analytics surface — no stubbed aggregates — by rendering the same
8
+ * dialect-agnostic builders with {@link mssqlDialect} (vectors as JSON, ASOF
9
+ * joins emulated via `CROSS`/`OUTER APPLY`, daily rollups recomputed at query
10
+ * time) and executing them over a pooled `mssql` (tedious) connection. Events
11
+ * live in the wide `events` table (plus the dedicated `node_samples`); metadata
12
+ * (projects, API keys, scene registry) is re-homed into the same database.
13
+ *
14
+ * The database is created on first boot when the login may (`CREATE ANY
15
+ * DATABASE`), and the schema is migrated on creation (migrations are
16
+ * idempotent, forward-only and serialized behind an application lock, so
17
+ * several collector instances can boot against one database). Connection
18
+ * settings come from `readDbSettings().mssql` (`MSSQL_URL`, or `MSSQL_SERVER` /
19
+ * `MSSQL_PORT` / `MSSQL_DATABASE` / `MSSQL_USER` / `MSSQL_PASSWORD` with
20
+ * `MSSQL_ENCRYPT` / `MSSQL_TRUST_SERVER_CERTIFICATE`, plus `MSSQL_POOL_MAX`).
21
+ */
22
+ export async function createMssqlStore() {
23
+ const settings = readDbSettings().mssql;
24
+ const database = resolveMssqlConfig(settings).database ?? settings.database;
25
+ await ensureMssqlDatabase(settings, database);
26
+ const msc = createMssqlClient(settings);
27
+ await migrateMssql(msc);
28
+ const d = mssqlDialect;
29
+ return {
30
+ resolveApiKey: (key) => msResolveApiKey(msc, key),
31
+ projectExists: async (projectId) => (await msGetProject(msc, projectId)) !== null,
32
+ insertEvents: (events) => msInsertEvents(msc, [...events]),
33
+ listSessions: (projectId, opts = {}) => runMssqlQuery(msc, buildListSessions(projectId, opts, d)),
34
+ pointerHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildPointerHeatmap(projectId, opts, d)),
35
+ meshUvHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshUvHeatmap(projectId, opts, d)),
36
+ worldHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildWorldHeatmap(projectId, opts, d)),
37
+ worldHeatmapStats: async (projectId, opts = {}) => {
38
+ const rows = await runMssqlQuery(msc, buildWorldHeatmapStats(projectId, opts, d));
39
+ return rows[0] ?? { cells: 0, hits: 0 };
40
+ },
41
+ gazeHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildGazeHeatmap(projectId, opts, d)),
42
+ gazeHeatmapStats: async (projectId, opts = {}) => {
43
+ const rows = await runMssqlQuery(msc, buildGazeHeatmapStats(projectId, opts, d));
44
+ return rows[0] ?? { cells: 0, hits: 0 };
45
+ },
46
+ cameraHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraDirectionHeatmap(projectId, opts, d)),
47
+ viewCoverageHistogram: (projectId, opts = {}) => runMssqlQuery(msc, buildViewCoverageHistogram(projectId, opts, d)),
48
+ cameraPositionHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraPositionHeatmap(projectId, opts, d)),
49
+ sessionTrajectory: (projectId, sessionId, opts = {}) => runMssqlQuery(msc, buildSessionTrajectory(projectId, { ...opts, session: sessionId }, d)),
50
+ aggregateTrajectories: (projectId, opts = {}) => runMssqlQuery(msc, buildAggregateTrajectories(projectId, opts, d)),
51
+ clickGazeRays: (projectId, opts = {}) => runMssqlQuery(msc, buildClickGazeRay(projectId, opts, d)),
52
+ flowHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildFlowHeatmap(projectId, opts, d)),
53
+ topMeshes: (projectId, opts = {}) => runMssqlQuery(msc, buildTopMeshes(projectId, opts, d)),
54
+ topMeshesBySource: (projectId, opts = {}) => runMssqlQuery(msc, buildTopMeshesBySource(projectId, opts, d)),
55
+ topMeshesTrend: (projectId, opts = {}) => runMssqlQuery(msc, buildTopMeshesTrend(projectId, opts, d)),
56
+ meshDwell: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshDwell(projectId, opts, d)),
57
+ meshBlindSpots: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshBlindSpots(projectId, opts, d)),
58
+ meshInteractionKinds: (projectId, opts = {}) => runMssqlQuery(msc, buildMeshInteractionKinds(projectId, opts, d)),
59
+ reachability: (projectId, opts = {}) => runMssqlQuery(msc, buildReachability(projectId, opts, d)),
60
+ deadClicks: (projectId, opts = {}) => runMssqlQuery(msc, buildDeadClicks(projectId, opts, d)),
61
+ rageClicks: (projectId, opts = {}) => runMssqlQuery(msc, buildRageClicks(projectId, opts, d)),
62
+ hoverDwell: (projectId, opts = {}) => runMssqlQuery(msc, buildHoverDwell(projectId, opts, d)),
63
+ compileStalls: (projectId, opts = {}) => runMssqlQuery(msc, buildCompileStalls(projectId, opts, d)),
64
+ arPlacementTimeToPlace: (projectId, opts = {}) => runMssqlQuery(msc, buildArPlacementTimeToPlace(projectId, opts, d)),
65
+ arPlacementAttempts: (projectId, opts = {}) => runMssqlQuery(msc, buildArPlacementAttempts(projectId, opts, d)),
66
+ arPlacementSurfaces: (projectId, opts = {}) => runMssqlQuery(msc, buildArPlacementSurfaces(projectId, opts, d)),
67
+ resourceSummary: (projectId, opts = {}) => runMssqlQuery(msc, buildResourceSummary(projectId, opts, d)),
68
+ capabilityChanges: (projectId, opts = {}) => runMssqlQuery(msc, buildCapabilityChanges(projectId, opts, d)),
69
+ cameraGestures: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraGestures(projectId, opts, d)),
70
+ perfSummary: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfSummary(projectId, opts, d)),
71
+ renderScaleTruth: (projectId, opts = {}) => runMssqlQuery(msc, buildRenderScaleTruth(projectId, opts, d)),
72
+ perfDistribution: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfDistribution(projectId, opts, d)),
73
+ fpsHistogram: (projectId, opts = {}) => runMssqlQuery(msc, buildFpsHistogram(projectId, opts, d)),
74
+ frameTimePercentiles: (projectId, opts = {}) => runMssqlQuery(msc, buildFrameTimePercentiles(projectId, opts, d)),
75
+ jankRate: (projectId, opts = {}) => runMssqlQuery(msc, buildJankRate(projectId, opts, d)),
76
+ perfChurn: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfChurn(projectId, opts, d)),
77
+ perfByDevice: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfByDevice(projectId, opts, d)),
78
+ perfByScene: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfByScene(projectId, opts, d)),
79
+ resourcePercentiles: (projectId, opts = {}) => runMssqlQuery(msc, buildResourcePercentiles(projectId, opts, d)),
80
+ stabilityCounts: (projectId, opts = {}) => runMssqlQuery(msc, buildStabilityCounts(projectId, opts, d)),
81
+ graphicsDiagnosticCounts: (projectId, opts = {}) => runMssqlQuery(msc, buildGraphicsDiagnosticCounts(projectId, opts, d)),
82
+ errorHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildErrorHeatmap(projectId, opts, d)),
83
+ boundaryHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildBoundaryHeatmap(projectId, opts, d)),
84
+ boundaryHeatmapStats: async (projectId, opts = {}) => {
85
+ const rows = await runMssqlQuery(msc, buildBoundaryHeatmapStats(projectId, opts, d));
86
+ return rows[0] ?? { cells: 0, hits: 0 };
87
+ },
88
+ renderingTechnology: (projectId, opts = {}) => runMssqlQuery(msc, buildRenderingTechnology(projectId, opts, d)),
89
+ sceneCoverage: (projectId, opts = {}) => runMssqlQuery(msc, buildSceneCoverage(projectId, opts, d)),
90
+ perfHeatmap: (projectId, opts = {}) => runMssqlQuery(msc, buildPerfHeatmap(projectId, opts, d)),
91
+ cameraDistance: (projectId, opts = {}) => runMssqlQuery(msc, buildCameraDistance(projectId, opts, d)),
92
+ navigationStats: (projectId, opts = {}) => runMssqlQuery(msc, buildNavigationStats(projectId, opts, d)),
93
+ backtrackRatio: (projectId, opts = {}) => runMssqlQuery(msc, buildBacktrackRatio(projectId, opts, d)),
94
+ xrRotationRate: (projectId, opts = {}) => runMssqlQuery(msc, buildXrRotationRate(projectId, opts, d)),
95
+ xrSourceUsage: (projectId, opts = {}) => runMssqlQuery(msc, buildXrSourceUsage(projectId, opts, d)),
96
+ xrAbandonment: (projectId, opts = {}) => runMssqlQuery(msc, buildXrAbandonment(projectId, opts, d)),
97
+ xrLocomotion: (projectId, opts = {}) => runMssqlQuery(msc, buildXrLocomotionComfort(projectId, opts, d)),
98
+ boundaryContacts: (projectId, opts = {}) => runMssqlQuery(msc, buildBoundaryContacts(projectId, opts, d)),
99
+ trackingQuality: (projectId, opts = {}) => runMssqlQuery(msc, buildTrackingQuality(projectId, opts, d)),
100
+ interactionsBySource: (projectId, opts = {}) => runMssqlQuery(msc, buildInteractionsBySource(projectId, opts, d)),
101
+ topInputActions: (projectId, opts = {}) => runMssqlQuery(msc, buildTopInputActions(projectId, opts, d)),
102
+ scenes: (projectId, opts = {}) => runMssqlQuery(msc, buildDistinctScenes(projectId, opts, d)),
103
+ timeseries: (projectId, opts = {}) => runMssqlQuery(msc, buildTimeseries(projectId, opts, d)),
104
+ eventTypeCounts: (projectId, opts = {}) => runMssqlQuery(msc, buildEventTypeCounts(projectId, opts, d)),
105
+ funnel: (projectId, opts) => runMssqlQuery(msc, buildFunnel(projectId, opts, d)),
106
+ sceneRetention: (projectId, opts) => runMssqlQuery(msc, buildSceneRetention(projectId, opts, d)),
107
+ loadBounceFunnel: (projectId, opts = {}) => runMssqlQuery(msc, buildLoadBounceFunnel(projectId, opts, d)),
108
+ variantLeaderboard: (projectId, opts) => runMssqlQuery(msc, buildVariantLeaderboard(projectId, opts, d)),
109
+ getSessionEvents: (projectId, sessionId) => msGetSessionEvents(msc, projectId, sessionId),
110
+ streamSessionEvents: (projectId, sessionId) => msStreamSessionEvents(msc, projectId, sessionId),
111
+ getSessionMeta: (projectId, sessionId) => msGetSessionMeta(msc, projectId, sessionId),
112
+ putSceneProxy: (projectId, proxy, label) => msUpsertSceneProxy(msc, projectId, proxy, label),
113
+ getSceneRepresentation: (projectId, sceneId) => msGetSceneRepresentation(msc, projectId, sceneId),
114
+ listSceneRepresentations: (projectId) => msListSceneRepresentations(msc, projectId),
115
+ async close() {
116
+ await msc.close();
117
+ },
118
+ };
119
+ }
120
+ //# sourceMappingURL=mssqlStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mssqlStore.js","sourceRoot":"","sources":["../src/mssqlStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CollectorStore } from "./store.js";
2
+ /**
3
+ * Optional single-tenant Postgres store (ADR 0020, #84): the relational,
4
+ * multi-writer path for self-hosters who already run Postgres and have
5
+ * outgrown DuckDB's single read-write process. It carries the **full** analytics
6
+ * surface — no stubbed aggregates — by rendering the same dialect-agnostic
7
+ * builders with {@link postgresDialect} (ASOF joins emulated via `LATERAL`,
8
+ * daily rollups recomputed at query time) and executing them over a pooled
9
+ * `pg` connection. Events live in the wide `events` table (plus the dedicated
10
+ * `node_samples`); metadata (projects, API keys, scene registry) is re-homed
11
+ * into the same database.
12
+ *
13
+ * The schema is migrated on creation (migrations are idempotent, forward-only
14
+ * and serialized behind an advisory lock, so several collector instances can
15
+ * boot against one database). Connection settings come from
16
+ * `readDbSettings().postgres` (`POSTGRES_URL` / `DATABASE_URL`, `POSTGRES_SCHEMA`,
17
+ * `POSTGRES_POOL_MAX`).
18
+ */
19
+ export declare function createPostgresStore(): Promise<CollectorStore>;
20
+ //# sourceMappingURL=postgresStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresStore.d.ts","sourceRoot":"","sources":["../src/postgresStore.ts"],"names":[],"mappings":"AAmJA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,cAAc,CAAC,CAyLnE"}
@@ -0,0 +1,116 @@
1
+ import { buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraDistance, buildCameraPositionHeatmap, buildClickGazeRay, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildDistinctScenes, buildEventTypeCounts, buildFlowHeatmap, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, buildListSessions, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildPerfSummary, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPointerHeatmap, buildMeshUvHeatmap, buildSceneCoverage, buildPerfHeatmap, buildSessionTrajectory, buildAggregateTrajectories, buildRenderScaleTruth, buildTimeseries, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildTopInputActions, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, postgresDialect, readDbSettings, } from "@uptimizr/db";
2
+ import { createPostgresClient, migratePostgres, runPostgresQuery, insertEvents as pgInsertEvents, getSessionEvents as pgGetSessionEvents, streamSessionEvents as pgStreamSessionEvents, getSessionMeta as pgGetSessionMeta, getProject as pgGetProject, resolveApiKey as pgResolveApiKey, upsertSceneProxy as pgUpsertSceneProxy, getSceneRepresentation as pgGetSceneRepresentation, listSceneRepresentations as pgListSceneRepresentations, } from "@uptimizr/db-postgres";
3
+ /**
4
+ * Optional single-tenant Postgres store (ADR 0020, #84): the relational,
5
+ * multi-writer path for self-hosters who already run Postgres and have
6
+ * outgrown DuckDB's single read-write process. It carries the **full** analytics
7
+ * surface — no stubbed aggregates — by rendering the same dialect-agnostic
8
+ * builders with {@link postgresDialect} (ASOF joins emulated via `LATERAL`,
9
+ * daily rollups recomputed at query time) and executing them over a pooled
10
+ * `pg` connection. Events live in the wide `events` table (plus the dedicated
11
+ * `node_samples`); metadata (projects, API keys, scene registry) is re-homed
12
+ * into the same database.
13
+ *
14
+ * The schema is migrated on creation (migrations are idempotent, forward-only
15
+ * and serialized behind an advisory lock, so several collector instances can
16
+ * boot against one database). Connection settings come from
17
+ * `readDbSettings().postgres` (`POSTGRES_URL` / `DATABASE_URL`, `POSTGRES_SCHEMA`,
18
+ * `POSTGRES_POOL_MAX`).
19
+ */
20
+ export async function createPostgresStore() {
21
+ const settings = readDbSettings().postgres;
22
+ const pgc = createPostgresClient(settings);
23
+ await migratePostgres(pgc, settings);
24
+ const d = postgresDialect;
25
+ return {
26
+ resolveApiKey: (key) => pgResolveApiKey(pgc, key),
27
+ projectExists: async (projectId) => (await pgGetProject(pgc, projectId)) !== null,
28
+ insertEvents: (events) => pgInsertEvents(pgc, [...events]),
29
+ listSessions: (projectId, opts = {}) => runPostgresQuery(pgc, buildListSessions(projectId, opts, d)),
30
+ pointerHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildPointerHeatmap(projectId, opts, d)),
31
+ meshUvHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshUvHeatmap(projectId, opts, d)),
32
+ worldHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildWorldHeatmap(projectId, opts, d)),
33
+ worldHeatmapStats: async (projectId, opts = {}) => {
34
+ const rows = await runPostgresQuery(pgc, buildWorldHeatmapStats(projectId, opts, d));
35
+ return rows[0] ?? { cells: 0, hits: 0 };
36
+ },
37
+ gazeHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildGazeHeatmap(projectId, opts, d)),
38
+ gazeHeatmapStats: async (projectId, opts = {}) => {
39
+ const rows = await runPostgresQuery(pgc, buildGazeHeatmapStats(projectId, opts, d));
40
+ return rows[0] ?? { cells: 0, hits: 0 };
41
+ },
42
+ cameraHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraDirectionHeatmap(projectId, opts, d)),
43
+ viewCoverageHistogram: (projectId, opts = {}) => runPostgresQuery(pgc, buildViewCoverageHistogram(projectId, opts, d)),
44
+ cameraPositionHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraPositionHeatmap(projectId, opts, d)),
45
+ sessionTrajectory: (projectId, sessionId, opts = {}) => runPostgresQuery(pgc, buildSessionTrajectory(projectId, { ...opts, session: sessionId }, d)),
46
+ aggregateTrajectories: (projectId, opts = {}) => runPostgresQuery(pgc, buildAggregateTrajectories(projectId, opts, d)),
47
+ clickGazeRays: (projectId, opts = {}) => runPostgresQuery(pgc, buildClickGazeRay(projectId, opts, d)),
48
+ flowHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildFlowHeatmap(projectId, opts, d)),
49
+ topMeshes: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopMeshes(projectId, opts, d)),
50
+ topMeshesBySource: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopMeshesBySource(projectId, opts, d)),
51
+ topMeshesTrend: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopMeshesTrend(projectId, opts, d)),
52
+ meshDwell: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshDwell(projectId, opts, d)),
53
+ meshBlindSpots: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshBlindSpots(projectId, opts, d)),
54
+ meshInteractionKinds: (projectId, opts = {}) => runPostgresQuery(pgc, buildMeshInteractionKinds(projectId, opts, d)),
55
+ reachability: (projectId, opts = {}) => runPostgresQuery(pgc, buildReachability(projectId, opts, d)),
56
+ deadClicks: (projectId, opts = {}) => runPostgresQuery(pgc, buildDeadClicks(projectId, opts, d)),
57
+ rageClicks: (projectId, opts = {}) => runPostgresQuery(pgc, buildRageClicks(projectId, opts, d)),
58
+ hoverDwell: (projectId, opts = {}) => runPostgresQuery(pgc, buildHoverDwell(projectId, opts, d)),
59
+ compileStalls: (projectId, opts = {}) => runPostgresQuery(pgc, buildCompileStalls(projectId, opts, d)),
60
+ arPlacementTimeToPlace: (projectId, opts = {}) => runPostgresQuery(pgc, buildArPlacementTimeToPlace(projectId, opts, d)),
61
+ arPlacementAttempts: (projectId, opts = {}) => runPostgresQuery(pgc, buildArPlacementAttempts(projectId, opts, d)),
62
+ arPlacementSurfaces: (projectId, opts = {}) => runPostgresQuery(pgc, buildArPlacementSurfaces(projectId, opts, d)),
63
+ resourceSummary: (projectId, opts = {}) => runPostgresQuery(pgc, buildResourceSummary(projectId, opts, d)),
64
+ capabilityChanges: (projectId, opts = {}) => runPostgresQuery(pgc, buildCapabilityChanges(projectId, opts, d)),
65
+ cameraGestures: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraGestures(projectId, opts, d)),
66
+ perfSummary: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfSummary(projectId, opts, d)),
67
+ renderScaleTruth: (projectId, opts = {}) => runPostgresQuery(pgc, buildRenderScaleTruth(projectId, opts, d)),
68
+ perfDistribution: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfDistribution(projectId, opts, d)),
69
+ fpsHistogram: (projectId, opts = {}) => runPostgresQuery(pgc, buildFpsHistogram(projectId, opts, d)),
70
+ frameTimePercentiles: (projectId, opts = {}) => runPostgresQuery(pgc, buildFrameTimePercentiles(projectId, opts, d)),
71
+ jankRate: (projectId, opts = {}) => runPostgresQuery(pgc, buildJankRate(projectId, opts, d)),
72
+ perfChurn: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfChurn(projectId, opts, d)),
73
+ perfByDevice: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfByDevice(projectId, opts, d)),
74
+ perfByScene: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfByScene(projectId, opts, d)),
75
+ resourcePercentiles: (projectId, opts = {}) => runPostgresQuery(pgc, buildResourcePercentiles(projectId, opts, d)),
76
+ stabilityCounts: (projectId, opts = {}) => runPostgresQuery(pgc, buildStabilityCounts(projectId, opts, d)),
77
+ graphicsDiagnosticCounts: (projectId, opts = {}) => runPostgresQuery(pgc, buildGraphicsDiagnosticCounts(projectId, opts, d)),
78
+ errorHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildErrorHeatmap(projectId, opts, d)),
79
+ boundaryHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildBoundaryHeatmap(projectId, opts, d)),
80
+ boundaryHeatmapStats: async (projectId, opts = {}) => {
81
+ const rows = await runPostgresQuery(pgc, buildBoundaryHeatmapStats(projectId, opts, d));
82
+ return rows[0] ?? { cells: 0, hits: 0 };
83
+ },
84
+ renderingTechnology: (projectId, opts = {}) => runPostgresQuery(pgc, buildRenderingTechnology(projectId, opts, d)),
85
+ sceneCoverage: (projectId, opts = {}) => runPostgresQuery(pgc, buildSceneCoverage(projectId, opts, d)),
86
+ perfHeatmap: (projectId, opts = {}) => runPostgresQuery(pgc, buildPerfHeatmap(projectId, opts, d)),
87
+ cameraDistance: (projectId, opts = {}) => runPostgresQuery(pgc, buildCameraDistance(projectId, opts, d)),
88
+ navigationStats: (projectId, opts = {}) => runPostgresQuery(pgc, buildNavigationStats(projectId, opts, d)),
89
+ backtrackRatio: (projectId, opts = {}) => runPostgresQuery(pgc, buildBacktrackRatio(projectId, opts, d)),
90
+ xrRotationRate: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrRotationRate(projectId, opts, d)),
91
+ xrSourceUsage: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrSourceUsage(projectId, opts, d)),
92
+ xrAbandonment: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrAbandonment(projectId, opts, d)),
93
+ xrLocomotion: (projectId, opts = {}) => runPostgresQuery(pgc, buildXrLocomotionComfort(projectId, opts, d)),
94
+ boundaryContacts: (projectId, opts = {}) => runPostgresQuery(pgc, buildBoundaryContacts(projectId, opts, d)),
95
+ trackingQuality: (projectId, opts = {}) => runPostgresQuery(pgc, buildTrackingQuality(projectId, opts, d)),
96
+ interactionsBySource: (projectId, opts = {}) => runPostgresQuery(pgc, buildInteractionsBySource(projectId, opts, d)),
97
+ topInputActions: (projectId, opts = {}) => runPostgresQuery(pgc, buildTopInputActions(projectId, opts, d)),
98
+ scenes: (projectId, opts = {}) => runPostgresQuery(pgc, buildDistinctScenes(projectId, opts, d)),
99
+ timeseries: (projectId, opts = {}) => runPostgresQuery(pgc, buildTimeseries(projectId, opts, d)),
100
+ eventTypeCounts: (projectId, opts = {}) => runPostgresQuery(pgc, buildEventTypeCounts(projectId, opts, d)),
101
+ funnel: (projectId, opts) => runPostgresQuery(pgc, buildFunnel(projectId, opts, d)),
102
+ sceneRetention: (projectId, opts) => runPostgresQuery(pgc, buildSceneRetention(projectId, opts, d)),
103
+ loadBounceFunnel: (projectId, opts = {}) => runPostgresQuery(pgc, buildLoadBounceFunnel(projectId, opts, d)),
104
+ variantLeaderboard: (projectId, opts) => runPostgresQuery(pgc, buildVariantLeaderboard(projectId, opts, d)),
105
+ getSessionEvents: (projectId, sessionId) => pgGetSessionEvents(pgc, projectId, sessionId),
106
+ streamSessionEvents: (projectId, sessionId) => pgStreamSessionEvents(pgc, projectId, sessionId),
107
+ getSessionMeta: (projectId, sessionId) => pgGetSessionMeta(pgc, projectId, sessionId),
108
+ putSceneProxy: (projectId, proxy, label) => pgUpsertSceneProxy(pgc, projectId, proxy, label),
109
+ getSceneRepresentation: (projectId, sceneId) => pgGetSceneRepresentation(pgc, projectId, sceneId),
110
+ listSceneRepresentations: (projectId) => pgListSceneRepresentations(pgc, projectId),
111
+ async close() {
112
+ await pgc.close();
113
+ },
114
+ };
115
+ }
116
+ //# sourceMappingURL=postgresStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresStore.js","sourceRoot":"","sources":["../src/postgresStore.ts"],"names":[],"mappings":"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"}
package/dist/serve.d.ts CHANGED
@@ -4,6 +4,14 @@ import type { CollectorStore } from "./store.js";
4
4
  * - `duckdb` (default) — the OSS single-file DuckDB store (events + metadata in
5
5
  * one file, full analytics, zero external services; ADR 0020). Path from
6
6
  * `DUCKDB_PATH`.
7
+ * - `postgres` — the optional single-tenant Postgres store (multi-writer
8
+ * relational backend for shops that already run Postgres; ADR 0020, #84).
9
+ * Connection from `POSTGRES_URL` (or `DATABASE_URL`) plus the optional
10
+ * `POSTGRES_SCHEMA` / `POSTGRES_POOL_MAX`. Requires a reachable Postgres.
11
+ * - `mssql` — the optional single-tenant Microsoft SQL Server store (for shops
12
+ * standardized on SQL Server / Azure SQL; ADR 0020, #85). Connection from
13
+ * `MSSQL_URL` or `MSSQL_SERVER` / `MSSQL_PORT` / `MSSQL_DATABASE` /
14
+ * `MSSQL_USER` / `MSSQL_PASSWORD`. Requires a reachable SQL Server 2022+.
7
15
  * - `clickhouse` — the optional single-tenant ClickHouse store for scale
8
16
  * (concurrent, high-volume ingestion; ADR 0020). Connection from the
9
17
  * `CLICKHOUSE_*` env vars. Requires a reachable ClickHouse server.
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAezF;AAED;;;;GAIG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB3C"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAmBzF;AAED;;;;GAIG;AACH,wBAAsB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB3C"}
package/dist/serve.js CHANGED
@@ -3,11 +3,21 @@ import { loadConfig } from "./config.js";
3
3
  import { createClickhouseStore } from "./clickhouseStore.js";
4
4
  import { createDuckdbStore } from "./duckdbStore.js";
5
5
  import { createMemoryStore } from "./memoryStore.js";
6
+ import { createMssqlStore } from "./mssqlStore.js";
7
+ import { createPostgresStore } from "./postgresStore.js";
6
8
  /**
7
9
  * Select the storage backend (`COLLECTOR_STORE`):
8
10
  * - `duckdb` (default) — the OSS single-file DuckDB store (events + metadata in
9
11
  * one file, full analytics, zero external services; ADR 0020). Path from
10
12
  * `DUCKDB_PATH`.
13
+ * - `postgres` — the optional single-tenant Postgres store (multi-writer
14
+ * relational backend for shops that already run Postgres; ADR 0020, #84).
15
+ * Connection from `POSTGRES_URL` (or `DATABASE_URL`) plus the optional
16
+ * `POSTGRES_SCHEMA` / `POSTGRES_POOL_MAX`. Requires a reachable Postgres.
17
+ * - `mssql` — the optional single-tenant Microsoft SQL Server store (for shops
18
+ * standardized on SQL Server / Azure SQL; ADR 0020, #85). Connection from
19
+ * `MSSQL_URL` or `MSSQL_SERVER` / `MSSQL_PORT` / `MSSQL_DATABASE` /
20
+ * `MSSQL_USER` / `MSSQL_PASSWORD`. Requires a reachable SQL Server 2022+.
11
21
  * - `clickhouse` — the optional single-tenant ClickHouse store for scale
12
22
  * (concurrent, high-volume ingestion; ADR 0020). Connection from the
13
23
  * `CLICKHOUSE_*` env vars. Requires a reachable ClickHouse server.
@@ -22,6 +32,10 @@ export function createStore(env = process.env) {
22
32
  projectId: env.COLLECTOR_MEMORY_PROJECT_ID ?? "demo",
23
33
  apiKey: env.COLLECTOR_MEMORY_API_KEY ?? "utk_memory_dev",
24
34
  }));
35
+ case "postgres":
36
+ return createPostgresStore();
37
+ case "mssql":
38
+ return createMssqlStore();
25
39
  case "clickhouse":
26
40
  return createClickhouseStore();
27
41
  case "duckdb":
package/dist/serve.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,QAAQ,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CACpB,iBAAiB,CAAC;gBAChB,SAAS,EAAE,GAAG,CAAC,2BAA2B,IAAI,MAAM;gBACpD,MAAM,EAAE,GAAG,CAAC,wBAAwB,IAAI,gBAAgB;aACzD,CAAC,CACH,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,QAAQ,CAAC;QACd;YACE,OAAO,iBAAiB,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,IAAI,CACV,yFAAyF;YACvF,qFAAqF,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE7B,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,WAAW,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC9D,QAAQ,GAAG,CAAC,eAAe,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,OAAO,CAAC,OAAO,CACpB,iBAAiB,CAAC;gBAChB,SAAS,EAAE,GAAG,CAAC,2BAA2B,IAAI,MAAM;gBACpD,MAAM,EAAE,GAAG,CAAC,wBAAwB,IAAI,gBAAgB;aACzD,CAAC,CACH,CAAC;QACJ,KAAK,UAAU;YACb,OAAO,mBAAmB,EAAE,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,gBAAgB,EAAE,CAAC;QAC5B,KAAK,YAAY;YACf,OAAO,qBAAqB,EAAE,CAAC;QACjC,KAAK,QAAQ,CAAC;QACd;YACE,OAAO,iBAAiB,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK;IACzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,MAAM,CAAC,0BAA0B,EAAE,CAAC;QACvC,GAAG,CAAC,GAAG,CAAC,IAAI,CACV,yFAAyF;YACvF,qFAAqF,CACxF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;QACvB,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE7B,MAAM,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uptimizr/collector-server",
3
- "version": "0.8.0",
3
+ "version": "1.0.0",
4
4
  "description": "Uptimizr ingestion + query API (Fastify). Self-hostable collector for the OSS data-collector.",
5
5
  "keywords": [
6
6
  "uptimizr",
@@ -45,9 +45,11 @@
45
45
  "fastify": "^5.12.1",
46
46
  "fastify-type-provider-zod": "^7.0.0",
47
47
  "zod": "^4.5.4",
48
- "@uptimizr/db-clickhouse": "0.3.8",
49
- "@uptimizr/schema": "0.6.1",
50
- "@uptimizr/db": "0.8.2"
48
+ "@uptimizr/db": "1.0.0",
49
+ "@uptimizr/db-clickhouse": "1.0.0",
50
+ "@uptimizr/db-mssql": "1.0.0",
51
+ "@uptimizr/schema": "1.0.0",
52
+ "@uptimizr/db-postgres": "1.0.0"
51
53
  },
52
54
  "devDependencies": {
53
55
  "@types/node": "^26.4.0",