@uptimizr/db 1.0.1 → 2.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/AGENTS.md +103 -1
- package/README.md +100 -3
- package/dist/cli/createProject.js +23 -6
- package/dist/cli/createProject.js.map +1 -1
- package/dist/cli/seed.js +12 -4
- package/dist/cli/seed.js.map +1 -1
- package/dist/duckdb/audit.d.ts +13 -0
- package/dist/duckdb/audit.d.ts.map +1 -0
- package/dist/duckdb/audit.js +67 -0
- package/dist/duckdb/audit.js.map +1 -0
- package/dist/duckdb/client.d.ts.map +1 -1
- package/dist/duckdb/client.js +4 -0
- package/dist/duckdb/client.js.map +1 -1
- package/dist/duckdb/migrations.d.ts.map +1 -1
- package/dist/duckdb/migrations.js +97 -0
- package/dist/duckdb/migrations.js.map +1 -1
- package/dist/duckdb/projects.d.ts +9 -5
- package/dist/duckdb/projects.d.ts.map +1 -1
- package/dist/duckdb/projects.js +54 -24
- package/dist/duckdb/projects.js.map +1 -1
- package/dist/duckdb/queries.d.ts +7 -0
- package/dist/duckdb/queries.d.ts.map +1 -1
- package/dist/duckdb/queries.js +10 -1
- package/dist/duckdb/queries.js.map +1 -1
- package/dist/duckdb/sceneRegions.d.ts +24 -0
- package/dist/duckdb/sceneRegions.d.ts.map +1 -0
- package/dist/duckdb/sceneRegions.js +72 -0
- package/dist/duckdb/sceneRegions.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata.d.ts +195 -9
- package/dist/metadata.d.ts.map +1 -1
- package/dist/metadata.js +192 -0
- package/dist/metadata.js.map +1 -1
- package/dist/parity/compare.d.ts +22 -0
- package/dist/parity/compare.d.ts.map +1 -1
- package/dist/parity/compare.js +31 -0
- package/dist/parity/compare.js.map +1 -1
- package/dist/query/aggregations.d.ts +8 -0
- package/dist/query/aggregations.d.ts.map +1 -1
- package/dist/query/aggregations.js +78 -0
- package/dist/query/aggregations.js.map +1 -1
- package/dist/query/coerce.d.ts +94 -0
- package/dist/query/coerce.d.ts.map +1 -0
- package/dist/query/coerce.js +191 -0
- package/dist/query/coerce.js.map +1 -0
- package/dist/query/summary/cluster.d.ts +78 -0
- package/dist/query/summary/cluster.d.ts.map +1 -0
- package/dist/query/summary/cluster.js +200 -0
- package/dist/query/summary/cluster.js.map +1 -0
- package/dist/query/summary/columns.d.ts +66 -0
- package/dist/query/summary/columns.d.ts.map +1 -0
- package/dist/query/summary/columns.js +98 -0
- package/dist/query/summary/columns.js.map +1 -0
- package/dist/query/summary/format.d.ts +31 -0
- package/dist/query/summary/format.d.ts.map +1 -0
- package/dist/query/summary/format.js +119 -0
- package/dist/query/summary/format.js.map +1 -0
- package/dist/query/summary/index.d.ts +19 -0
- package/dist/query/summary/index.d.ts.map +1 -0
- package/dist/query/summary/index.js +16 -0
- package/dist/query/summary/index.js.map +1 -0
- package/dist/query/summary/reading.d.ts +26 -0
- package/dist/query/summary/reading.d.ts.map +1 -0
- package/dist/query/summary/reading.js +169 -0
- package/dist/query/summary/reading.js.map +1 -0
- package/dist/query/summary/schema.d.ts +217 -0
- package/dist/query/summary/schema.d.ts.map +1 -0
- package/dist/query/summary/schema.js +167 -0
- package/dist/query/summary/schema.js.map +1 -0
- package/dist/query/summary/stats.d.ts +33 -0
- package/dist/query/summary/stats.d.ts.map +1 -0
- package/dist/query/summary/stats.js +73 -0
- package/dist/query/summary/stats.js.map +1 -0
- package/dist/query/summary/summarize.d.ts +57 -0
- package/dist/query/summary/summarize.d.ts.map +1 -0
- package/dist/query/summary/summarize.js +424 -0
- package/dist/query/summary/summarize.js.map +1 -0
- package/dist/query/summary/types.d.ts +223 -0
- package/dist/query/summary/types.d.ts.map +1 -0
- package/dist/query/summary/types.js +8 -0
- package/dist/query/summary/types.js.map +1 -0
- package/dist/query/types.d.ts +13 -0
- package/dist/query/types.d.ts.map +1 -1
- package/llms.txt +7 -3
- package/package.json +10 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { apiKeyPrefix, generateApiKey, hashApiKey, type
|
|
1
|
+
import { apiKeyPrefix, generateApiKey, hashApiKey, type ApiKeyRecord, type CreateApiKeyOptions, type Project, type ResolvedApiKey } from "../metadata.js";
|
|
2
2
|
import type { DuckdbClient } from "./client.js";
|
|
3
3
|
export type { Project, ApiKeyRecord };
|
|
4
4
|
export { hashApiKey, apiKeyPrefix, generateApiKey };
|
|
@@ -9,15 +9,19 @@ export declare function getProject(client: DuckdbClient, id: string): Promise<Pr
|
|
|
9
9
|
/**
|
|
10
10
|
* Issue a new API key for a project. Returns both the record and the plaintext
|
|
11
11
|
* key — the plaintext is shown to the caller exactly once and never stored.
|
|
12
|
+
*
|
|
13
|
+
* The legacy singular `capability` column is written alongside the set (its
|
|
14
|
+
* first token) so a collector still running older code keeps resolving the key.
|
|
12
15
|
*/
|
|
13
|
-
export declare function createApiKey(client: DuckdbClient, projectId: string,
|
|
16
|
+
export declare function createApiKey(client: DuckdbClient, projectId: string, options?: CreateApiKeyOptions): Promise<{
|
|
14
17
|
key: string;
|
|
15
18
|
record: ApiKeyRecord;
|
|
16
19
|
}>;
|
|
17
20
|
/**
|
|
18
|
-
* Resolve a plaintext API key to its (non-revoked) project id
|
|
19
|
-
* `null` when the key is unknown or
|
|
20
|
-
* authenticate and scope
|
|
21
|
+
* Resolve a plaintext API key to its (non-revoked) project id, key id,
|
|
22
|
+
* capability set and per-key rate limit, or `null` when the key is unknown or
|
|
23
|
+
* revoked. The collector uses this to authenticate and scope requests at the
|
|
24
|
+
* boundary, and to attribute audit rows to a key without ever logging the key.
|
|
21
25
|
*/
|
|
22
26
|
export declare function resolveApiKey(client: DuckdbClient, plaintext: string): Promise<ResolvedApiKey | null>;
|
|
23
27
|
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/duckdb/projects.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/duckdb/projects.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,EAIV,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,OAAO,EACZ,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AAiBpD,sCAAsC;AACtC,wBAAsB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASxF;AAED,6DAA6D;AAC7D,wBAAsB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAS1F;AAiCD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC,CA2BhD;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAehC"}
|
package/dist/duckdb/projects.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { apiKeyPrefix, generateApiKey, hashApiKey, } from "../metadata.js";
|
|
2
|
+
import { apiKeyPrefix, generateApiKey, hashApiKey, parseApiKeyCapabilities, toApiKeyColumns, toApiKeyRateLimit, } from "../metadata.js";
|
|
3
3
|
export { hashApiKey, apiKeyPrefix, generateApiKey };
|
|
4
4
|
/** Create a project and return it. */
|
|
5
5
|
export async function createProject(client, name) {
|
|
@@ -17,39 +17,69 @@ export async function getProject(client, id) {
|
|
|
17
17
|
? { id: row.id, name: row.name, orgId: null, createdAt: new Date(row.created_at_ms) }
|
|
18
18
|
: null;
|
|
19
19
|
}
|
|
20
|
+
/** Columns every API-key read selects, mapped by {@link toApiKeyRecord}. */
|
|
21
|
+
const API_KEY_COLS = `id, project_id, key_prefix, epoch_ms(created_at) AS created_at_ms,
|
|
22
|
+
epoch_ms(revoked_at) AS revoked_at_ms, capability, capabilities, label,
|
|
23
|
+
rate_limit_max, rate_limit_window_ms`;
|
|
24
|
+
function toApiKeyRecord(row) {
|
|
25
|
+
return {
|
|
26
|
+
id: row.id,
|
|
27
|
+
projectId: row.project_id,
|
|
28
|
+
keyPrefix: row.key_prefix,
|
|
29
|
+
createdAt: new Date(row.created_at_ms),
|
|
30
|
+
revokedAt: row.revoked_at_ms == null ? null : new Date(row.revoked_at_ms),
|
|
31
|
+
capabilities: parseApiKeyCapabilities(row.capabilities, row.capability),
|
|
32
|
+
label: row.label ?? null,
|
|
33
|
+
rateLimit: toApiKeyRateLimit(row.rate_limit_max, row.rate_limit_window_ms),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
20
36
|
/**
|
|
21
37
|
* Issue a new API key for a project. Returns both the record and the plaintext
|
|
22
38
|
* key — the plaintext is shown to the caller exactly once and never stored.
|
|
39
|
+
*
|
|
40
|
+
* The legacy singular `capability` column is written alongside the set (its
|
|
41
|
+
* first token) so a collector still running older code keeps resolving the key.
|
|
23
42
|
*/
|
|
24
|
-
export async function createApiKey(client, projectId,
|
|
43
|
+
export async function createApiKey(client, projectId, options = {}) {
|
|
25
44
|
const key = generateApiKey();
|
|
26
45
|
const id = randomUUID();
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
46
|
+
const cols = toApiKeyColumns(options);
|
|
47
|
+
await client.run(`INSERT INTO api_keys (id, project_id, key_hash, key_prefix, capability, capabilities,
|
|
48
|
+
label, rate_limit_max, rate_limit_window_ms)
|
|
49
|
+
VALUES ($id, $projectId, $keyHash, $keyPrefix, $capability, $capabilities,
|
|
50
|
+
CAST($label AS VARCHAR), CAST($rateLimitMax AS BIGINT),
|
|
51
|
+
CAST($rateLimitWindowMs AS BIGINT))`, {
|
|
52
|
+
id,
|
|
53
|
+
projectId,
|
|
54
|
+
keyHash: hashApiKey(key),
|
|
55
|
+
keyPrefix: apiKeyPrefix(key),
|
|
56
|
+
capability: cols.capabilities.split(",")[0],
|
|
57
|
+
capabilities: cols.capabilities,
|
|
58
|
+
label: cols.label,
|
|
59
|
+
rateLimitMax: cols.rateLimitMax,
|
|
60
|
+
rateLimitWindowMs: cols.rateLimitWindowMs,
|
|
61
|
+
});
|
|
62
|
+
const rows = await client.all(`SELECT ${API_KEY_COLS} FROM api_keys WHERE id = $id`, { id });
|
|
63
|
+
return { key, record: toApiKeyRecord(rows[0]) };
|
|
44
64
|
}
|
|
45
65
|
/**
|
|
46
|
-
* Resolve a plaintext API key to its (non-revoked) project id
|
|
47
|
-
* `null` when the key is unknown or
|
|
48
|
-
* authenticate and scope
|
|
66
|
+
* Resolve a plaintext API key to its (non-revoked) project id, key id,
|
|
67
|
+
* capability set and per-key rate limit, or `null` when the key is unknown or
|
|
68
|
+
* revoked. The collector uses this to authenticate and scope requests at the
|
|
69
|
+
* boundary, and to attribute audit rows to a key without ever logging the key.
|
|
49
70
|
*/
|
|
50
71
|
export async function resolveApiKey(client, plaintext) {
|
|
51
|
-
const rows = await client.all(`SELECT
|
|
72
|
+
const rows = await client.all(`SELECT ${API_KEY_COLS} FROM api_keys WHERE key_hash = $keyHash AND revoked_at IS NULL`, { keyHash: hashApiKey(plaintext) });
|
|
52
73
|
const row = rows[0];
|
|
53
|
-
|
|
74
|
+
if (!row)
|
|
75
|
+
return null;
|
|
76
|
+
const record = toApiKeyRecord(row);
|
|
77
|
+
return {
|
|
78
|
+
projectId: record.projectId,
|
|
79
|
+
keyId: record.id,
|
|
80
|
+
capabilities: record.capabilities,
|
|
81
|
+
label: record.label,
|
|
82
|
+
rateLimit: record.rateLimit,
|
|
83
|
+
};
|
|
54
84
|
}
|
|
55
85
|
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/duckdb/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,UAAU,
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/duckdb/projects.ts"],"names":[],"mappings":"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"}
|
package/dist/duckdb/queries.d.ts
CHANGED
|
@@ -5,6 +5,13 @@ import type { DuckdbClient } from "./client.js";
|
|
|
5
5
|
* against the DuckDB store and return typed rows. Values are already converted to
|
|
6
6
|
* plain JS by the client (bigint→number, list→array, timestamp→string), so rows
|
|
7
7
|
* match the shapes produced by the ClickHouse `runQuery`.
|
|
8
|
+
*
|
|
9
|
+
* This is the single point where rows leave the DuckDB driver, so it is where
|
|
10
|
+
* {@link coerceRows} runs (ADR 0051 §2): every column the spec's registry metric
|
|
11
|
+
* declares numeric is a number by the time it is returned. DuckDB already returns
|
|
12
|
+
* numbers, so the pass is allocation-free here — it is applied all the same so
|
|
13
|
+
* that *every* store upholds the same contract and a future driver or type-map
|
|
14
|
+
* regression is caught by the parity suite rather than by a consumer.
|
|
8
15
|
*/
|
|
9
16
|
export declare function runDuckdbQuery<T>(client: DuckdbClient, spec: QuerySpec): Promise<T[]>;
|
|
10
17
|
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/duckdb/queries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/duckdb/queries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAG3F"}
|
package/dist/duckdb/queries.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
|
+
import { coerceRows } from "../query/coerce.js";
|
|
1
2
|
/**
|
|
2
3
|
* Execute a dialect-agnostic {@link QuerySpec} (rendered with `duckdbDialect`)
|
|
3
4
|
* against the DuckDB store and return typed rows. Values are already converted to
|
|
4
5
|
* plain JS by the client (bigint→number, list→array, timestamp→string), so rows
|
|
5
6
|
* match the shapes produced by the ClickHouse `runQuery`.
|
|
7
|
+
*
|
|
8
|
+
* This is the single point where rows leave the DuckDB driver, so it is where
|
|
9
|
+
* {@link coerceRows} runs (ADR 0051 §2): every column the spec's registry metric
|
|
10
|
+
* declares numeric is a number by the time it is returned. DuckDB already returns
|
|
11
|
+
* numbers, so the pass is allocation-free here — it is applied all the same so
|
|
12
|
+
* that *every* store upholds the same contract and a future driver or type-map
|
|
13
|
+
* regression is caught by the parity suite rather than by a consumer.
|
|
6
14
|
*/
|
|
7
15
|
export async function runDuckdbQuery(client, spec) {
|
|
8
|
-
|
|
16
|
+
const rows = await client.all(spec.query, spec.query_params);
|
|
17
|
+
return coerceRows(spec.metric, rows);
|
|
9
18
|
}
|
|
10
19
|
//# sourceMappingURL=queries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/duckdb/queries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/duckdb/queries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIhD;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,MAAoB,EAAE,IAAe;IAC3E,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAI,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAuC,CAAC,CAAC;IAC3F,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SceneRegion } from "@uptimizr/schema";
|
|
2
|
+
import type { SceneRegionRecord, SceneRegionSummary } from "../metadata.js";
|
|
3
|
+
import type { DuckdbClient } from "./client.js";
|
|
4
|
+
export type { SceneRegionRecord, SceneRegionSummary };
|
|
5
|
+
/**
|
|
6
|
+
* Replace the whole region set of `(projectId, sceneId)` with `regions` and
|
|
7
|
+
* return the stored rows.
|
|
8
|
+
*
|
|
9
|
+
* Replace-the-set (rather than per-region upsert) keeps the authoring surface a
|
|
10
|
+
* single idempotent `PUT`: the caller declares what the scene's regions *are*,
|
|
11
|
+
* so removing a region is just leaving it out. The delete + insert runs inside
|
|
12
|
+
* one DuckDB transaction on the exclusive connection, so a concurrent reader
|
|
13
|
+
* never observes a half-replaced set (and a failed insert leaves the previous
|
|
14
|
+
* set intact).
|
|
15
|
+
*/
|
|
16
|
+
export declare function putSceneRegions(client: DuckdbClient, projectId: string, sceneId: string, regions: readonly SceneRegion[]): Promise<SceneRegionRecord[]>;
|
|
17
|
+
/** Read one scene's regions, ordered by region id (stable for callers/diffs). */
|
|
18
|
+
export declare function getSceneRegions(client: DuckdbClient, projectId: string, sceneId: string): Promise<SceneRegionRecord[]>;
|
|
19
|
+
/**
|
|
20
|
+
* Project-wide region names (no boxes) — the whole spatial vocabulary in one
|
|
21
|
+
* read, for a scene/region picker or an agent's project context.
|
|
22
|
+
*/
|
|
23
|
+
export declare function listSceneRegions(client: DuckdbClient, projectId: string): Promise<SceneRegionSummary[]>;
|
|
24
|
+
//# sourceMappingURL=sceneRegions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneRegions.d.ts","sourceRoot":"","sources":["../../src/duckdb/sceneRegions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,CAAC;AAsCtD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,WAAW,EAAE,GAC9B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8B9B;AAED,iFAAiF;AACjF,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAQ9B;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAY/B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
const SELECT_COLS = `project_id, scene_id, region_id, label, description, bounds,
|
|
2
|
+
epoch_ms(updated_at) AS updated_at_ms`;
|
|
3
|
+
function rowToRegion(row) {
|
|
4
|
+
return {
|
|
5
|
+
projectId: row.project_id,
|
|
6
|
+
sceneId: row.scene_id,
|
|
7
|
+
regionId: row.region_id,
|
|
8
|
+
label: row.label,
|
|
9
|
+
description: row.description,
|
|
10
|
+
bounds: JSON.parse(row.bounds),
|
|
11
|
+
updatedAt: new Date(row.updated_at_ms),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Replace the whole region set of `(projectId, sceneId)` with `regions` and
|
|
16
|
+
* return the stored rows.
|
|
17
|
+
*
|
|
18
|
+
* Replace-the-set (rather than per-region upsert) keeps the authoring surface a
|
|
19
|
+
* single idempotent `PUT`: the caller declares what the scene's regions *are*,
|
|
20
|
+
* so removing a region is just leaving it out. The delete + insert runs inside
|
|
21
|
+
* one DuckDB transaction on the exclusive connection, so a concurrent reader
|
|
22
|
+
* never observes a half-replaced set (and a failed insert leaves the previous
|
|
23
|
+
* set intact).
|
|
24
|
+
*/
|
|
25
|
+
export async function putSceneRegions(client, projectId, sceneId, regions) {
|
|
26
|
+
await client.exclusive(async (con) => {
|
|
27
|
+
await con.run("BEGIN TRANSACTION");
|
|
28
|
+
try {
|
|
29
|
+
await con.run(`DELETE FROM scene_regions WHERE project_id = $projectId AND scene_id = $sceneId`, { projectId, sceneId });
|
|
30
|
+
for (const region of regions) {
|
|
31
|
+
await con.run(`INSERT INTO scene_regions
|
|
32
|
+
(project_id, scene_id, region_id, label, description, bounds, updated_at)
|
|
33
|
+
VALUES ($projectId, $sceneId, $regionId, $label, $description, $bounds, now())`, {
|
|
34
|
+
projectId,
|
|
35
|
+
sceneId,
|
|
36
|
+
regionId: region.id,
|
|
37
|
+
label: region.label,
|
|
38
|
+
description: region.description ?? null,
|
|
39
|
+
bounds: JSON.stringify(region.bounds),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
await con.run("COMMIT");
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
await con.run("ROLLBACK");
|
|
46
|
+
throw err;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return getSceneRegions(client, projectId, sceneId);
|
|
50
|
+
}
|
|
51
|
+
/** Read one scene's regions, ordered by region id (stable for callers/diffs). */
|
|
52
|
+
export async function getSceneRegions(client, projectId, sceneId) {
|
|
53
|
+
const rows = await client.all(`SELECT ${SELECT_COLS} FROM scene_regions
|
|
54
|
+
WHERE project_id = $projectId AND scene_id = $sceneId
|
|
55
|
+
ORDER BY region_id`, { projectId, sceneId });
|
|
56
|
+
return rows.map(rowToRegion);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Project-wide region names (no boxes) — the whole spatial vocabulary in one
|
|
60
|
+
* read, for a scene/region picker or an agent's project context.
|
|
61
|
+
*/
|
|
62
|
+
export async function listSceneRegions(client, projectId) {
|
|
63
|
+
const rows = await client.all(`SELECT scene_id, region_id, label FROM scene_regions
|
|
64
|
+
WHERE project_id = $projectId
|
|
65
|
+
ORDER BY scene_id, region_id`, { projectId });
|
|
66
|
+
return rows.map((row) => ({
|
|
67
|
+
sceneId: row.scene_id,
|
|
68
|
+
regionId: row.region_id,
|
|
69
|
+
label: row.label,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=sceneRegions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneRegions.js","sourceRoot":"","sources":["../../src/duckdb/sceneRegions.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,GAAG;6CACyB,CAAC;AAE9C,SAAS,WAAW,CAAC,GAAc;IACjC,OAAO;QACL,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAS;QACtC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;KACvC,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,SAAiB,EACjB,OAAe,EACf,OAA+B;IAE/B,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACnC,MAAM,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CACX,iFAAiF,EACjF,EAAE,SAAS,EAAE,OAAO,EAAE,CACvB,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,GAAG,CAAC,GAAG,CACX;;0FAEgF,EAChF;oBACE,SAAS;oBACT,OAAO;oBACP,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;oBACvC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC;iBACtC,CACF,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC1B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AACrD,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAoB,EACpB,SAAiB,EACjB,OAAe;IAEf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,UAAU,WAAW;;wBAED,EACpB,EAAE,SAAS,EAAE,OAAO,EAAE,CACvB,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAoB,EACpB,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B;;kCAE8B,EAC9B,EAAE,SAAS,EAAE,CACd,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,7 +16,8 @@ export type { EventRow, SessionMeta } from "./events.js";
|
|
|
16
16
|
export { toNodeSampleRow, nodeSampleRowToEvent } from "./events.js";
|
|
17
17
|
export type { NodeSampleRow } from "./events.js";
|
|
18
18
|
export { hashApiKey, apiKeyPrefix, generateApiKey } from "./metadata.js";
|
|
19
|
-
export
|
|
19
|
+
export { API_KEY_CAPABILITIES, AUDIT_PARAMS_MAX_LENGTH, AUDIT_TOOL_MAX_LENGTH, DEFAULT_API_KEY_CAPABILITIES, clampAuditTool, hasCapability, isApiKeyCapability, parseApiKeyCapabilities, parseCapabilityList, serializeApiKeyCapabilities, serializeAuditParams, toApiKeyColumns, toApiKeyRateLimit, } from "./metadata.js";
|
|
20
|
+
export type { Project, AgentAuditEntry, AgentAuditInput, ApiKeyRecord, ApiKeyCapability, ApiKeyRateLimit, AuditQueryOptions, AuditSurface, CreateApiKeyOptions, ResolvedApiKey, SceneRepresentation, SceneRepresentationKind, SceneRepresentationSummary, SceneRegionRecord, SceneRegionSummary, } from "./metadata.js";
|
|
20
21
|
export type { Dialect, ParamType, AsofJoinSpec } from "./query/dialect.js";
|
|
21
22
|
export { duckdbDialect, toDuckdbTimestamp } from "./query/duckdbDialect.js";
|
|
22
23
|
export { clickhouseDialect, toClickhouseTimestamp } from "./query/clickhouseDialect.js";
|
|
@@ -25,6 +26,9 @@ export { mssqlDialect, toMssqlTimestamp, toTsql, mssqlVectorElement, MSSQL_NEARE
|
|
|
25
26
|
export { renderNativeAsofJoin, renderNearestRowJoin, toPositionalParams, } from "./query/relational.js";
|
|
26
27
|
export type { NearestRowJoinTokens, PositionalQuery } from "./query/relational.js";
|
|
27
28
|
export { buildListSessions, buildPointerHeatmap, buildMeshUvHeatmap, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraPositionHeatmap, defaultCellSizeForBounds, buildSessionTrajectory, buildAggregateTrajectories, buildClickGazeRay, buildFlowHeatmap, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildTopInputActions, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildPerfSummary, buildRenderScaleTruth, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPerfDaily, buildEventsDaily, buildDistinctScenes, buildTimeseries, buildEventTypeCounts, buildSceneCoverage, buildPerfHeatmap, buildCameraDistance, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, } from "./query/aggregations.js";
|
|
29
|
+
export { coerceRows, numericColumns, numericColumnsOfMetric } from "./query/coerce.js";
|
|
30
|
+
export type { CoerceRowsOptions } from "./query/coerce.js";
|
|
31
|
+
export * from "./query/summary/index.js";
|
|
28
32
|
export type { QuerySpec, RangeOptions, SceneOptions, SourceOptions, SessionOptions, MeshOptions, RegionOptions, ErrorHeatmapOptions, WorldAabb, CameraModeOptions, TimeseriesOptions, SessionSummaryRow, HeatmapBinRow, WorldHeatmapBinRow, SpatialStatsRow, PositionBinRow, TrajectoryPointRow, AggregateTrajectoryPointRow, DirectionBinRow, ViewCoverageHistogramRow, ClickGazeRayRow, FlowLinkRow, MeshCountRow, MeshDwellRow, MeshBlindSpotRow, MeshInteractionKindRow, ReachabilityBinRow, MeshSourceCountRow, MeshTrendPointRow, InputActionCountRow, DeadClickRow, RageClickRow, HoverDwellRow, CompileStallRow, ArPlacementTimeToPlaceRow, ArPlacementAttemptsRow, ArPlacementSurfaceRow, ResourceSummaryRow, CapabilityChangeRow, CameraGestureRow, PerfSummaryRow, RenderScaleTruthRow, PerfDistributionRow, FpsHistogramRow, FrameTimePercentileRow, JankRateRow, PerfChurnOptions, PerfChurnRow, PerfByDeviceRow, PerfBySceneRow, ResourcePercentileRow, StabilityCountRow, GraphicsDiagnosticCountRow, RenderingTechnologyRow, PerfDailyRow, EventsDailyRow, SceneRow, TimeseriesBucketRow, EventTypeCountRow, CoverageVoxelRow, PerfHeatmapVoxelRow, CameraDistanceBucketRow, NavigationStatsRow, BacktrackRatioRow, XrRotationRateRow, XrSourceUsageRow, XrAbandonmentRow, XrLocomotionRow, BoundaryContactsRow, TrackingQualityRow, InteractionSourceRow, FunnelStepInput, FunnelOptions, FunnelStepResultRow, SceneRetentionOptions, SceneRetentionRow, LoadBounceFunnelOptions, LoadBounceBandRow, VariantLeaderboardOptions, VariantLeaderboardRow, } from "./query/types.js";
|
|
29
33
|
export { createDuckdbClient, convertValue } from "./duckdb/client.js";
|
|
30
34
|
export type { DuckdbClient, DuckdbRow } from "./duckdb/client.js";
|
|
@@ -32,9 +36,11 @@ export { DUCKDB_MIGRATIONS, migrateDuckdb } from "./duckdb/migrations.js";
|
|
|
32
36
|
export { runDuckdbQuery } from "./duckdb/queries.js";
|
|
33
37
|
export { insertEvents as duckdbInsertEvents, getSessionEvents as duckdbGetSessionEvents, streamSessionEvents as duckdbStreamSessionEvents, getSessionMeta as duckdbGetSessionMeta, } from "./duckdb/events.js";
|
|
34
38
|
export { createProject as duckdbCreateProject, getProject as duckdbGetProject, createApiKey as duckdbCreateApiKey, resolveApiKey as duckdbResolveApiKey, } from "./duckdb/projects.js";
|
|
39
|
+
export { recordAudit as duckdbRecordAudit, listAudit as duckdbListAudit, pruneAudit as duckdbPruneAudit, } from "./duckdb/audit.js";
|
|
35
40
|
export { upsertSceneProxy as duckdbUpsertSceneProxy, getSceneRepresentation as duckdbGetSceneRepresentation, listSceneRepresentations as duckdbListSceneRepresentations, } from "./duckdb/sceneRegistry.js";
|
|
41
|
+
export { putSceneRegions as duckdbPutSceneRegions, getSceneRegions as duckdbGetSceneRegions, listSceneRegions as duckdbListSceneRegions, } from "./duckdb/sceneRegions.js";
|
|
36
42
|
export { PARITY_PROJECT_ID, PARITY_T0, PARITY_RANGE, PARITY_DAY_RANGE, PARITY_DAY, PARITY_EVENTS, } from "./parity/fixtures.js";
|
|
37
|
-
export { PARITY_ABS_TOLERANCE, PARITY_REL_TOLERANCE, diffParity } from "./parity/compare.js";
|
|
43
|
+
export { PARITY_ABS_TOLERANCE, PARITY_REL_TOLERANCE, diffParity, numericColumnsForSpec, } from "./parity/compare.js";
|
|
38
44
|
export type { ParityRow, ParityCompareOptions } from "./parity/compare.js";
|
|
39
45
|
export { PARITY_CASES } from "./parity/cases.js";
|
|
40
46
|
export type { ParityCase } from "./parity/cases.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EACV,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GACd,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,9 @@ export { toEventRow, formatUtcTimestamp } from "./events.js";
|
|
|
16
16
|
export { toNodeSampleRow, nodeSampleRowToEvent } from "./events.js";
|
|
17
17
|
// --- Engine-neutral metadata helpers and types (ADR 0020) ---
|
|
18
18
|
export { hashApiKey, apiKeyPrefix, generateApiKey } from "./metadata.js";
|
|
19
|
+
// Agent-scoped key capabilities, per-key rate limits and the audit log
|
|
20
|
+
// (#309, ADR 0051 §7).
|
|
21
|
+
export { API_KEY_CAPABILITIES, AUDIT_PARAMS_MAX_LENGTH, AUDIT_TOOL_MAX_LENGTH, DEFAULT_API_KEY_CAPABILITIES, clampAuditTool, hasCapability, isApiKeyCapability, parseApiKeyCapabilities, parseCapabilityList, serializeApiKeyCapabilities, serializeAuditParams, toApiKeyColumns, toApiKeyRateLimit, } from "./metadata.js";
|
|
19
22
|
export { duckdbDialect, toDuckdbTimestamp } from "./query/duckdbDialect.js";
|
|
20
23
|
export { clickhouseDialect, toClickhouseTimestamp } from "./query/clickhouseDialect.js";
|
|
21
24
|
export { postgresDialect, toPostgresTimestamp, POSTGRES_NEAREST_ROW_JOIN, } from "./query/postgresDialect.js";
|
|
@@ -24,17 +27,31 @@ export { mssqlDialect, toMssqlTimestamp, toTsql, mssqlVectorElement, MSSQL_NEARE
|
|
|
24
27
|
// Server — #84, #85): ASOF emulation and named→positional param rewriting.
|
|
25
28
|
export { renderNativeAsofJoin, renderNearestRowJoin, toPositionalParams, } from "./query/relational.js";
|
|
26
29
|
export { buildListSessions, buildPointerHeatmap, buildMeshUvHeatmap, buildWorldHeatmap, buildWorldHeatmapStats, buildGazeHeatmap, buildGazeHeatmapStats, buildCameraDirectionHeatmap, buildViewCoverageHistogram, buildCameraPositionHeatmap, defaultCellSizeForBounds, buildSessionTrajectory, buildAggregateTrajectories, buildClickGazeRay, buildFlowHeatmap, buildTopMeshes, buildTopMeshesBySource, buildTopMeshesTrend, buildMeshDwell, buildMeshBlindSpots, buildMeshInteractionKinds, buildReachability, buildTopInputActions, buildDeadClicks, buildRageClicks, buildHoverDwell, buildCompileStalls, buildResourceSummary, buildCapabilityChanges, buildCameraGestures, buildPerfSummary, buildRenderScaleTruth, buildPerfDistribution, buildFpsHistogram, buildFrameTimePercentiles, buildJankRate, buildPerfChurn, buildPerfByDevice, buildPerfByScene, buildResourcePercentiles, buildStabilityCounts, buildGraphicsDiagnosticCounts, buildErrorHeatmap, buildBoundaryHeatmap, buildBoundaryHeatmapStats, buildBoundaryContacts, buildRenderingTechnology, buildPerfDaily, buildEventsDaily, buildDistinctScenes, buildTimeseries, buildEventTypeCounts, buildSceneCoverage, buildPerfHeatmap, buildCameraDistance, buildNavigationStats, buildBacktrackRatio, buildXrRotationRate, buildXrSourceUsage, buildXrAbandonment, buildXrLocomotionComfort, buildTrackingQuality, buildInteractionsBySource, buildArPlacementTimeToPlace, buildArPlacementAttempts, buildArPlacementSurfaces, buildFunnel, buildSceneRetention, buildLoadBounceFunnel, buildVariantLeaderboard, } from "./query/aggregations.js";
|
|
30
|
+
// --- Numeric coercion at the store edge (ADR 0051 §2) ---
|
|
31
|
+
// Applied by every store's query runner so the collector always emits numbers.
|
|
32
|
+
// Lives on the root barrel rather than the browser-safe `/query` subpath because
|
|
33
|
+
// it reads the metric registry, which ships as its own dependency-free package
|
|
34
|
+
// (`@uptimizr/metrics`) so a browser bundle opts into that data explicitly.
|
|
35
|
+
export { coerceRows, numericColumns, numericColumnsOfMetric } from "./query/coerce.js";
|
|
36
|
+
// --- Agent-shaped result envelopes (ADR 0051 §2, design sketch §B.1) ---
|
|
37
|
+
// `format=table | summary`: pure, registry-driven summarisation of a metric's
|
|
38
|
+
// rows. Re-exported here for the collector's convenience; also published on its
|
|
39
|
+
// own browser-safe `@uptimizr/db/summary` subpath, which — like `/registry` —
|
|
40
|
+
// carries no DuckDB driver and no `node:` import.
|
|
41
|
+
export * from "./query/summary/index.js";
|
|
27
42
|
// --- DuckDB (OSS single-file store, ADR 0020) ---
|
|
28
43
|
export { createDuckdbClient, convertValue } from "./duckdb/client.js";
|
|
29
44
|
export { DUCKDB_MIGRATIONS, migrateDuckdb } from "./duckdb/migrations.js";
|
|
30
45
|
export { runDuckdbQuery } from "./duckdb/queries.js";
|
|
31
46
|
export { insertEvents as duckdbInsertEvents, getSessionEvents as duckdbGetSessionEvents, streamSessionEvents as duckdbStreamSessionEvents, getSessionMeta as duckdbGetSessionMeta, } from "./duckdb/events.js";
|
|
32
47
|
export { createProject as duckdbCreateProject, getProject as duckdbGetProject, createApiKey as duckdbCreateApiKey, resolveApiKey as duckdbResolveApiKey, } from "./duckdb/projects.js";
|
|
48
|
+
export { recordAudit as duckdbRecordAudit, listAudit as duckdbListAudit, pruneAudit as duckdbPruneAudit, } from "./duckdb/audit.js";
|
|
33
49
|
export { upsertSceneProxy as duckdbUpsertSceneProxy, getSceneRepresentation as duckdbGetSceneRepresentation, listSceneRepresentations as duckdbListSceneRepresentations, } from "./duckdb/sceneRegistry.js";
|
|
50
|
+
export { putSceneRegions as duckdbPutSceneRegions, getSceneRegions as duckdbGetSceneRegions, listSceneRegions as duckdbListSceneRegions, } from "./duckdb/sceneRegions.js";
|
|
34
51
|
// --- Cross-engine parity harness (ADR 0020) ---
|
|
35
52
|
// Shared fixtures, golden expectations, and a tolerance-aware comparator. OSS
|
|
36
53
|
// runs DuckDB-vs-golden; the scale tier reuses these to run DuckDB-vs-ClickHouse.
|
|
37
54
|
export { PARITY_PROJECT_ID, PARITY_T0, PARITY_RANGE, PARITY_DAY_RANGE, PARITY_DAY, PARITY_EVENTS, } from "./parity/fixtures.js";
|
|
38
|
-
export { PARITY_ABS_TOLERANCE, PARITY_REL_TOLERANCE, diffParity } from "./parity/compare.js";
|
|
55
|
+
export { PARITY_ABS_TOLERANCE, PARITY_REL_TOLERANCE, diffParity, numericColumnsForSpec, } from "./parity/compare.js";
|
|
39
56
|
export { PARITY_CASES } from "./parity/cases.js";
|
|
40
57
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAS1C,sDAAsD;AACtD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG7D,kFAAkF;AAClF,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGpE,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|