@weaveintel/realm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,18 @@
1
+ import { type Payload, type RealmConfigStore } from './realm-store.js';
2
+ export interface SqlClient {
3
+ query(text: string, params?: readonly unknown[]): Promise<{
4
+ rows: Array<Record<string, unknown>>;
5
+ }>;
6
+ }
7
+ export type SqlDialect = 'sqlite' | 'postgres';
8
+ export interface SqlRealmStoreOptions {
9
+ readonly client: SqlClient;
10
+ readonly dialect: SqlDialect;
11
+ readonly table?: string;
12
+ readonly ensureSchema?: boolean;
13
+ readonly idFactory?: () => string;
14
+ readonly clock?: () => string;
15
+ }
16
+ export declare function realmConfigDdl(table?: string): string[];
17
+ export declare function createSqlRealmStore<T extends Payload = Payload>(opts: SqlRealmStoreOptions): RealmConfigStore<T>;
18
+ //# sourceMappingURL=realm-store-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-store-sql.d.ts","sourceRoot":"","sources":["../src/realm-store-sql.ts"],"names":[],"mappings":"AAkBA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC;CACrG;AACD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE/C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IAClC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAiB,GAAG,MAAM,EAAE,CAqB/D;AAmBD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,oBAAoB,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAyLhH"}
@@ -0,0 +1,251 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * SQL-backed realm config store — one implementation for SQLite and Postgres. The visibility rule
4
+ * from `resolve.ts` is pushed down into a single WHERE clause (the "one query per family" read):
5
+ * a tenant sees every global default, its own rows, a parent's rows shared to it, and higher
6
+ * ancestors' rows shared to the whole subtree. Everything else is plain parameterised SQL — no
7
+ * recursive CTEs — so both engines behave identically.
8
+ */
9
+ import { newUUIDv7 } from '@weaveintel/core';
10
+ import { computeContentHash, globalOriginalFields, } from './realm-record.js';
11
+ import { parentTenantId, strictGrandAncestorIds } from './context.js';
12
+ import { resolveOne } from './resolve.js';
13
+ import { NothingToCustomizeError, RealmRecordNotFoundError, } from './realm-store.js';
14
+ export function realmConfigDdl(table = 'realm_config') {
15
+ assertTable(table);
16
+ return [
17
+ `CREATE TABLE IF NOT EXISTS ${table} (
18
+ id TEXT PRIMARY KEY,
19
+ logical_key TEXT NOT NULL,
20
+ realm TEXT NOT NULL DEFAULT 'global',
21
+ owner_tenant_id TEXT,
22
+ origin_id TEXT,
23
+ origin_hash TEXT,
24
+ content_hash TEXT NOT NULL,
25
+ track_mode TEXT NOT NULL DEFAULT 'pin',
26
+ share_mode TEXT NOT NULL DEFAULT 'private',
27
+ payload TEXT NOT NULL DEFAULT '{}',
28
+ created_at TEXT NOT NULL,
29
+ updated_at TEXT NOT NULL
30
+ )`,
31
+ // One copy per (logical_key, owner). COALESCE folds the global NULL owner to '' so it's unique too.
32
+ `CREATE UNIQUE INDEX IF NOT EXISTS ux_${table}_key_owner ON ${table}(logical_key, COALESCE(owner_tenant_id, ''))`,
33
+ `CREATE INDEX IF NOT EXISTS ix_${table}_owner ON ${table}(owner_tenant_id)`,
34
+ ];
35
+ }
36
+ function assertTable(t) {
37
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(t))
38
+ throw new Error(`Unsafe table name ${JSON.stringify(t)}.`);
39
+ }
40
+ function monotonicClock() {
41
+ let last = 0;
42
+ return () => {
43
+ const v = Math.max(Date.now(), last + 1);
44
+ last = v;
45
+ return new Date(v).toISOString();
46
+ };
47
+ }
48
+ const raw = (s) => ({ __raw: s });
49
+ const isRaw = (v) => typeof v === 'object' && v !== null && '__raw' in v;
50
+ export function createSqlRealmStore(opts) {
51
+ const { client, dialect } = opts;
52
+ const table = opts.table ?? 'realm_config';
53
+ assertTable(table);
54
+ const T = raw(table);
55
+ const newId = opts.idFactory ?? newUUIDv7;
56
+ const now = opts.clock ?? monotonicClock();
57
+ let ready;
58
+ const ensure = () => {
59
+ if (opts.ensureSchema === false)
60
+ return Promise.resolve();
61
+ return (ready ??= (async () => {
62
+ for (const stmt of realmConfigDdl(table))
63
+ await client.query(stmt);
64
+ })());
65
+ };
66
+ const q = async (strings, ...values) => {
67
+ await ensure();
68
+ let text = '';
69
+ const params = [];
70
+ for (let i = 0; i < strings.length; i++) {
71
+ text += strings[i];
72
+ if (i < values.length) {
73
+ const v = values[i];
74
+ if (isRaw(v))
75
+ text += v.__raw;
76
+ else {
77
+ params.push(v);
78
+ text += dialect === 'postgres' ? `$${params.length}` : '?';
79
+ }
80
+ }
81
+ }
82
+ const { rows } = await client.query(text, params);
83
+ return rows;
84
+ };
85
+ const toRecord = (r) => {
86
+ const payload = parseJson(r['payload']);
87
+ return {
88
+ ...payload,
89
+ id: String(r['id']),
90
+ logicalKey: String(r['logical_key']),
91
+ realm: String(r['realm']),
92
+ ownerTenantId: r['owner_tenant_id'] == null ? null : String(r['owner_tenant_id']),
93
+ originId: r['origin_id'] == null ? null : String(r['origin_id']),
94
+ originHash: r['origin_hash'] == null ? null : String(r['origin_hash']),
95
+ contentHash: String(r['content_hash']),
96
+ trackMode: String(r['track_mode']),
97
+ shareMode: String(r['share_mode']),
98
+ };
99
+ };
100
+ const getRow = async (id) => {
101
+ const rows = await q `SELECT * FROM ${T} WHERE id = ${id}`;
102
+ return rows[0] ? toRecord(rows[0]) : null;
103
+ };
104
+ const byOwnerKey = async (ownerTenantId, logicalKey) => {
105
+ const rows = ownerTenantId == null
106
+ ? await q `SELECT * FROM ${T} WHERE logical_key = ${logicalKey} AND owner_tenant_id IS NULL`
107
+ : await q `SELECT * FROM ${T} WHERE logical_key = ${logicalKey} AND owner_tenant_id = ${ownerTenantId}`;
108
+ return rows[0] ? toRecord(rows[0]) : null;
109
+ };
110
+ const insert = async (rec, payload) => {
111
+ const ts = now();
112
+ await q `INSERT INTO ${T} (id, logical_key, realm, owner_tenant_id, origin_id, origin_hash, content_hash, track_mode, share_mode, payload, created_at, updated_at)
113
+ VALUES (${rec.id}, ${rec.logicalKey}, ${rec.realm}, ${rec.ownerTenantId}, ${rec.originId}, ${rec.originHash}, ${rec.contentHash}, ${rec.trackMode}, ${rec.shareMode}, ${JSON.stringify(payload)}, ${ts}, ${ts})`;
114
+ };
115
+ const updatePayload = async (id, payload, contentHash) => {
116
+ await q `UPDATE ${T} SET payload = ${JSON.stringify(payload)}, content_hash = ${contentHash}, updated_at = ${now()} WHERE id = ${id}`;
117
+ };
118
+ const store = {
119
+ async publishGlobal(logicalKey, payload, o) {
120
+ const contentHash = computeContentHash(payload);
121
+ const existing = await byOwnerKey(null, logicalKey);
122
+ if (existing) {
123
+ await updatePayload(existing.id, payload, contentHash);
124
+ if (o?.trackModeDefault)
125
+ await q `UPDATE ${T} SET track_mode = ${o.trackModeDefault} WHERE id = ${existing.id}`;
126
+ return (await getRow(existing.id));
127
+ }
128
+ const rec = { ...payload, id: newId(), ...globalOriginalFields(logicalKey, contentHash) };
129
+ if (o?.trackModeDefault)
130
+ rec.trackMode = o.trackModeDefault;
131
+ await insert(rec, payload);
132
+ return (await getRow(rec.id));
133
+ },
134
+ async customize(logicalKey, ctx, payload) {
135
+ if (ctx.tenantId == null)
136
+ throw new NothingToCustomizeError(logicalKey);
137
+ const visible = await store.listVisible(ctx, [logicalKey]);
138
+ const base = resolveOne(visible, logicalKey, ctx);
139
+ if (!base)
140
+ throw new NothingToCustomizeError(logicalKey);
141
+ const contentHash = computeContentHash(payload);
142
+ const own = await byOwnerKey(ctx.tenantId, logicalKey);
143
+ if (own && own.realm === 'tenant') {
144
+ await updatePayload(own.id, payload, contentHash);
145
+ return (await getRow(own.id));
146
+ }
147
+ const rec = {
148
+ ...payload,
149
+ id: newId(),
150
+ realm: 'tenant',
151
+ ownerTenantId: ctx.tenantId,
152
+ logicalKey,
153
+ originId: base.id,
154
+ originHash: base.contentHash,
155
+ contentHash,
156
+ trackMode: 'pin',
157
+ shareMode: 'private',
158
+ };
159
+ await insert(rec, payload);
160
+ return (await getRow(rec.id));
161
+ },
162
+ async putNative(logicalKey, ownerTenantId, payload) {
163
+ const contentHash = computeContentHash(payload);
164
+ const own = await byOwnerKey(ownerTenantId, logicalKey);
165
+ if (own) {
166
+ await updatePayload(own.id, payload, contentHash);
167
+ return (await getRow(own.id));
168
+ }
169
+ const rec = {
170
+ ...payload,
171
+ id: newId(),
172
+ realm: 'tenant',
173
+ ownerTenantId,
174
+ logicalKey,
175
+ originId: null,
176
+ originHash: null,
177
+ contentHash,
178
+ trackMode: 'pin',
179
+ shareMode: 'private',
180
+ };
181
+ await insert(rec, payload);
182
+ return (await getRow(rec.id));
183
+ },
184
+ async setShareMode(id, shareMode) {
185
+ if (!(await getRow(id)))
186
+ throw new RealmRecordNotFoundError(id);
187
+ await q `UPDATE ${T} SET share_mode = ${shareMode}, updated_at = ${now()} WHERE id = ${id}`;
188
+ return (await getRow(id));
189
+ },
190
+ async delete(id) {
191
+ if (!(await getRow(id)))
192
+ throw new RealmRecordNotFoundError(id);
193
+ await q `DELETE FROM ${T} WHERE id = ${id}`;
194
+ },
195
+ async get(id) {
196
+ return getRow(id);
197
+ },
198
+ async listAll(logicalKeys) {
199
+ const rows = logicalKeys && logicalKeys.length > 0
200
+ ? await client.query(`SELECT * FROM ${table} WHERE logical_key IN (${logicalKeys.map((_, i) => (dialect === 'postgres' ? `$${i + 1}` : '?')).join(', ')})`, logicalKeys).then((r) => (ensure(), r.rows))
201
+ : (await q `SELECT * FROM ${T}`);
202
+ return rows.map(toRecord);
203
+ },
204
+ async listVisible(ctx, logicalKeys) {
205
+ await ensure();
206
+ const params = [];
207
+ const ph = (v) => {
208
+ params.push(v);
209
+ return dialect === 'postgres' ? `$${params.length}` : '?';
210
+ };
211
+ const where = [];
212
+ if (logicalKeys && logicalKeys.length > 0) {
213
+ where.push(`logical_key IN (${logicalKeys.map((k) => ph(k)).join(', ')})`);
214
+ }
215
+ // The visibility rule.
216
+ const vis = [`realm = 'global'`];
217
+ if (ctx.tenantId != null) {
218
+ vis.push(`owner_tenant_id = ${ph(ctx.tenantId)}`);
219
+ const parent = parentTenantId(ctx);
220
+ if (parent != null)
221
+ vis.push(`(owner_tenant_id = ${ph(parent)} AND share_mode IN ('children','subtree'))`);
222
+ const grand = strictGrandAncestorIds(ctx);
223
+ if (grand.length > 0) {
224
+ vis.push(`(owner_tenant_id IN (${grand.map((g) => ph(g)).join(', ')}) AND share_mode = 'subtree')`);
225
+ }
226
+ }
227
+ where.push(`(${vis.join(' OR ')})`);
228
+ const { rows } = await client.query(`SELECT * FROM ${table} WHERE ${where.join(' AND ')}`, params);
229
+ return rows.map(toRecord);
230
+ },
231
+ async count() {
232
+ const rows = await q `SELECT count(*) AS c FROM ${T}`;
233
+ return Number(rows[0]?.['c'] ?? 0);
234
+ },
235
+ };
236
+ return store;
237
+ }
238
+ function parseJson(v) {
239
+ if (v == null)
240
+ return {};
241
+ if (typeof v === 'object')
242
+ return v;
243
+ try {
244
+ const p = JSON.parse(String(v));
245
+ return p && typeof p === 'object' ? p : {};
246
+ }
247
+ catch {
248
+ return {};
249
+ }
250
+ }
251
+ //# sourceMappingURL=realm-store-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-store-sql.js","sourceRoot":"","sources":["../src/realm-store-sql.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GAIrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAqB,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GAGzB,MAAM,kBAAkB,CAAC;AAgB1B,MAAM,UAAU,cAAc,CAAC,KAAK,GAAG,cAAc;IACnD,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO;QACL,8BAA8B,KAAK;;;;;;;;;;;;;OAahC;QACH,oGAAoG;QACpG,wCAAwC,KAAK,iBAAiB,KAAK,8CAA8C;QACjH,iCAAiC,KAAK,aAAa,KAAK,mBAAmB;KAC5E,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACtG,CAAC;AACD,SAAS,cAAc;IACrB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,CAAC;QACT,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAID,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAClD,MAAM,KAAK,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,IAAI,CAAC,CAAC;AAE/F,MAAM,UAAU,mBAAmB,CAA8B,IAA0B;IACzF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,cAAc,CAAC;IAC3C,WAAW,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,IAAI,cAAc,EAAE,CAAC;IAE3C,IAAI,KAAgC,CAAC;IACrC,MAAM,MAAM,GAAG,GAAkB,EAAE;QACjC,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1D,OAAO,CAAC,KAAK,KAAK,CAAC,KAAK,IAAI,EAAE;YAC5B,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC;gBAAE,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrE,CAAC,CAAC,EAAE,CAAC,CAAC;IACR,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,KAAK,EAAE,OAA6B,EAAE,GAAG,MAAiB,EAA2C,EAAE;QAC/G,MAAM,MAAM,EAAE,CAAC;QACf,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,KAAK,CAAC,CAAC,CAAC;oBAAE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC;qBACzB,CAAC;oBACJ,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACf,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC7D,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,CAAC,CAA0B,EAAkB,EAAE;QAC9D,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACxC,OAAO;YACL,GAAI,OAAa;YACjB,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACpC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAwB;YAChD,aAAa,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACjF,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAChE,UAAU,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;YACtE,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YACtC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAc;YAC/C,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAc;SAC9B,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,EAAU,EAAkC,EAAE;QAClE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAA,iBAAiB,CAAC,eAAe,EAAE,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,EAAE,aAA4B,EAAE,UAAkB,EAAkC,EAAE;QAC5G,MAAM,IAAI,GAAG,aAAa,IAAI,IAAI;YAChC,CAAC,CAAC,MAAM,CAAC,CAAA,iBAAiB,CAAC,wBAAwB,UAAU,8BAA8B;YAC3F,CAAC,CAAC,MAAM,CAAC,CAAA,iBAAiB,CAAC,wBAAwB,UAAU,0BAA0B,aAAa,EAAE,CAAC;QACzG,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,KAAK,EAAE,GAAmB,EAAE,OAAU,EAAiB,EAAE;QACtE,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;QACjB,MAAM,CAAC,CAAA,eAAe,CAAC;sBACL,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,aAAa,KAAK,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC;IAC3N,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,KAAK,EAAE,EAAU,EAAE,OAAU,EAAE,WAAmB,EAAiB,EAAE;QACzF,MAAM,CAAC,CAAA,UAAU,CAAC,kBAAkB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,oBAAoB,WAAW,kBAAkB,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC;IACvI,CAAC,CAAC;IAEF,MAAM,KAAK,GAAwB;QACjC,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;YACxC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,aAAa,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;gBACvD,IAAI,CAAC,EAAE,gBAAgB;oBAAE,MAAM,CAAC,CAAA,UAAU,CAAC,qBAAqB,CAAC,CAAC,gBAAgB,eAAe,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAC/G,OAAO,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAE,CAAC;YACtC,CAAC;YACD,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,GAAG,oBAAoB,CAAC,UAAU,EAAE,WAAW,CAAC,EAAoB,CAAC;YAC5G,IAAI,CAAC,EAAE,gBAAgB;gBAAG,GAAgC,CAAC,SAAS,GAAG,CAAC,CAAC,gBAAgB,CAAC;YAC1F,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO;YACtC,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI;gBAAE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACvD,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;gBAClD,OAAO,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;YACjC,CAAC;YACD,MAAM,GAAG,GAAG;gBACV,GAAG,OAAO;gBACV,EAAE,EAAE,KAAK,EAAE;gBACX,KAAK,EAAE,QAAiB;gBACxB,aAAa,EAAE,GAAG,CAAC,QAAQ;gBAC3B,UAAU;gBACV,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,WAAW;gBACX,SAAS,EAAE,KAAc;gBACzB,SAAS,EAAE,SAAkB;aACZ,CAAC;YACpB,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO;YAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YACxD,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;gBAClD,OAAO,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;YACjC,CAAC;YACD,MAAM,GAAG,GAAG;gBACV,GAAG,OAAO;gBACV,EAAE,EAAE,KAAK,EAAE;gBACX,KAAK,EAAE,QAAiB;gBACxB,aAAa;gBACb,UAAU;gBACV,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,WAAW;gBACX,SAAS,EAAE,KAAc;gBACzB,SAAS,EAAE,SAAkB;aACZ,CAAC;YACpB,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3B,OAAO,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAE,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS;YAC9B,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,CAAA,UAAU,CAAC,qBAAqB,SAAS,kBAAkB,GAAG,EAAE,eAAe,EAAE,EAAE,CAAC;YAC3F,OAAO,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAE,CAAC;QAC7B,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,EAAE,CAAC,CAAC;gBAAE,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAChE,MAAM,CAAC,CAAA,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW;YACvB,MAAM,IAAI,GAAG,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;gBAChD,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,CAChB,iBAAiB,KAAK,0BAA0B,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACrI,WAAW,CACZ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;gBACnC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA,iBAAiB,CAAC,EAAE,CAAC,CAAC;YAClC,OAAQ,IAAuC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChE,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW;YAChC,MAAM,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAc,EAAE,CAAC;YAC7B,MAAM,EAAE,GAAG,CAAC,CAAU,EAAU,EAAE;gBAChC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACf,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAC5D,CAAC,CAAC;YACF,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,mBAAmB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7E,CAAC;YACD,uBAAuB;YACvB,MAAM,GAAG,GAAa,CAAC,kBAAkB,CAAC,CAAC;YAC3C,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACzB,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAClD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;gBACnC,IAAI,MAAM,IAAI,IAAI;oBAAE,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC;gBAC3G,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;gBAC1C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,GAAG,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBACtG,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,UAAU,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACnG,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,GAAG,MAAM,CAAC,CAAA,6BAA6B,CAAC,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,CAAU;IAC3B,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IACzB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAA4B,CAAC;IAC/D,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type RealmRecord, type ShareMode, type TrackMode } from './realm-record.js';
2
+ import { GLOBAL_CONTEXT, type RealmContext } from './context.js';
3
+ import { type EffectiveRecord } from './resolve.js';
4
+ /** A config payload is any JSON-ish object (the "substance" — a prompt template, a guardrail rule…). */
5
+ export type Payload = Record<string, unknown>;
6
+ export declare class RealmRecordNotFoundError extends Error {
7
+ constructor(id: string);
8
+ }
9
+ export declare class NothingToCustomizeError extends Error {
10
+ constructor(logicalKey: string);
11
+ }
12
+ /** Storage-agnostic contract for one realm-enabled config family (e.g. "prompts"). */
13
+ export interface RealmConfigStore<T extends Payload = Payload> {
14
+ /** Publish or update a GLOBAL default for a logical key. Idempotent by logical key. */
15
+ publishGlobal(logicalKey: string, payload: T, opts?: {
16
+ trackModeDefault?: TrackMode;
17
+ }): Promise<RealmRecord<T>>;
18
+ /** A tenant forks the copy it currently sees (copy-on-write), recording origin + base hash. */
19
+ customize(logicalKey: string, ctx: RealmContext, payload: T): Promise<RealmRecord<T>>;
20
+ /** A tenant authors a from-scratch record (no origin). */
21
+ putNative(logicalKey: string, ownerTenantId: string, payload: T): Promise<RealmRecord<T>>;
22
+ /** Flip how far a tenant's own record is shared down the tree. */
23
+ setShareMode(id: string, shareMode: ShareMode): Promise<RealmRecord<T>>;
24
+ /** Retire a record (e.g. revert an override so resolution falls through). */
25
+ delete(id: string): Promise<void>;
26
+ /** Fetch one row by id. */
27
+ get(id: string): Promise<RealmRecord<T> | null>;
28
+ /** Every copy of a set of logical keys (or all, if omitted). For in-memory resolution. */
29
+ listAll(logicalKeys?: readonly string[]): Promise<Array<RealmRecord<T>>>;
30
+ /** Only the rows a tenant may SEE (visibility predicate applied). */
31
+ listVisible(ctx: RealmContext, logicalKeys?: readonly string[]): Promise<Array<RealmRecord<T>>>;
32
+ /** Total row count (all copies). */
33
+ count(): Promise<number>;
34
+ }
35
+ /** In-memory reference store — the behavioural source of truth. */
36
+ export declare function createInMemoryRealmStore<T extends Payload = Payload>(): RealmConfigStore<T>;
37
+ export interface RealmResolverOptions<T extends Payload> {
38
+ readonly store: RealmConfigStore<T>;
39
+ }
40
+ /**
41
+ * The read path the app pipeline uses: for a tenant, hand back the single EFFECTIVE record per logical
42
+ * key (nearest owner wins), each stamped with provenance. This is what a choke point like
43
+ * "render the system prompt by key" calls instead of listing raw config.
44
+ */
45
+ export interface RealmResolver<T extends Payload = Payload> {
46
+ /** The one record that applies to this tenant for a logical key, or null. */
47
+ resolve(logicalKey: string, ctx: RealmContext): Promise<EffectiveRecord<T> | null>;
48
+ /** One effective record per logical key the tenant can see. */
49
+ listEffective(ctx: RealmContext, logicalKeys?: readonly string[]): Promise<Array<EffectiveRecord<T>>>;
50
+ }
51
+ export declare function createRealmResolver<T extends Payload = Payload>(opts: RealmResolverOptions<T>): RealmResolver<T>;
52
+ export { GLOBAL_CONTEXT };
53
+ //# sourceMappingURL=realm-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-store.d.ts","sourceRoot":"","sources":["../src/realm-store.ts"],"names":[],"mappings":"AAgBA,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAA2C,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7F,wGAAwG;AACxG,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE9C,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,EAAE,EAAE,MAAM;CAIvB;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,UAAU,EAAE,MAAM;CAI/B;AAED,sFAAsF;AACtF,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC3D,uFAAuF;IACvF,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,+FAA+F;IAC/F,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,0DAA0D;IAC1D,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,kEAAkE;IAClE,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,6EAA6E;IAC7E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,2BAA2B;IAC3B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChD,0FAA0F;IAC1F,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,qEAAqE;IACrE,WAAW,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,oCAAoC;IACpC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1B;AAWD,mEAAmE;AACnE,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,KAAK,gBAAgB,CAAC,CAAC,CAAC,CA0G3F;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,OAAO;IACrD,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CACrC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IACxD,6EAA6E;IAC7E,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACnF,+DAA+D;IAC/D,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACvG;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAkBhH;AAOD,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,172 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * The realm config store — where realm-enabled configuration lives, plus the write actions that keep
4
+ * the global→tenant story honest:
5
+ *
6
+ * • publishGlobal — the product ships / an admin publishes a global default (this is what "seeding"
7
+ * becomes: a global record with a recorded content hash).
8
+ * • customize — a tenant forks the copy it currently sees (copy-on-write), recording where it
9
+ * came from so drift is detectable later.
10
+ * • putNative — a tenant authors its own record from scratch (no global equivalent).
11
+ *
12
+ * Reads go through the resolver (`RealmResolver`), which returns the single EFFECTIVE record per
13
+ * logical key for a tenant, with provenance. Implemented in-memory (here) and over SQL
14
+ * (`realm-store-sql`), both held to the same conformance contract.
15
+ */
16
+ import { newUUIDv7 } from '@weaveintel/core';
17
+ import { archetypeOf, computeContentHash, globalOriginalFields, } from './realm-record.js';
18
+ import { GLOBAL_CONTEXT } from './context.js';
19
+ import { isVisible, resolveEffective, resolveOne } from './resolve.js';
20
+ export class RealmRecordNotFoundError extends Error {
21
+ constructor(id) {
22
+ super(`Realm record ${JSON.stringify(id)} not found.`);
23
+ this.name = 'RealmRecordNotFoundError';
24
+ }
25
+ }
26
+ export class NothingToCustomizeError extends Error {
27
+ constructor(logicalKey) {
28
+ super(`Cannot customize ${JSON.stringify(logicalKey)}: the tenant can see no record to fork.`);
29
+ this.name = 'NothingToCustomizeError';
30
+ }
31
+ }
32
+ function monotonicClock() {
33
+ let last = 0;
34
+ return () => {
35
+ const t = Math.max(Date.now(), last + 1);
36
+ last = t;
37
+ return new Date(t).toISOString();
38
+ };
39
+ }
40
+ /** In-memory reference store — the behavioural source of truth. */
41
+ export function createInMemoryRealmStore() {
42
+ const rows = new Map();
43
+ const now = monotonicClock();
44
+ const globalOf = (logicalKey) => [...rows.values()].find((r) => r.realm === 'global' && r.logicalKey === logicalKey);
45
+ const ownedOf = (logicalKey, ownerTenantId) => [...rows.values()].find((r) => r.logicalKey === logicalKey && r.ownerTenantId === ownerTenantId);
46
+ return {
47
+ async publishGlobal(logicalKey, payload, opts) {
48
+ const existing = globalOf(logicalKey);
49
+ const contentHash = computeContentHash(payload);
50
+ if (existing) {
51
+ const updated = { ...existing, ...payload, contentHash, trackMode: opts?.trackModeDefault ?? existing.trackMode };
52
+ rows.set(existing.id, updated);
53
+ return updated;
54
+ }
55
+ const id = newUUIDv7();
56
+ const rec = {
57
+ ...payload,
58
+ id,
59
+ ...globalOriginalFields(logicalKey, contentHash),
60
+ ...(opts?.trackModeDefault ? { trackMode: opts.trackModeDefault } : {}),
61
+ };
62
+ rows.set(id, rec);
63
+ return rec;
64
+ },
65
+ async customize(logicalKey, ctx, payload) {
66
+ if (ctx.tenantId == null)
67
+ throw new NothingToCustomizeError(logicalKey);
68
+ // Fork what you SEE: resolve the effective record for this tenant first.
69
+ const visible = [...rows.values()].filter((r) => isVisible(r, ctx) && r.logicalKey === logicalKey);
70
+ const base = resolveOne(visible, logicalKey, ctx);
71
+ if (!base)
72
+ throw new NothingToCustomizeError(logicalKey);
73
+ const existingOwn = ownedOf(logicalKey, ctx.tenantId);
74
+ const contentHash = computeContentHash(payload);
75
+ if (existingOwn) {
76
+ const updated = { ...existingOwn, ...payload, contentHash, updatedAt: now() };
77
+ rows.set(existingOwn.id, updated);
78
+ return updated;
79
+ }
80
+ const id = newUUIDv7();
81
+ const rec = {
82
+ ...payload,
83
+ id,
84
+ realm: 'tenant',
85
+ ownerTenantId: ctx.tenantId,
86
+ logicalKey,
87
+ originId: base.id,
88
+ originHash: base.contentHash, // Base
89
+ contentHash, // Local
90
+ trackMode: 'pin',
91
+ shareMode: 'private',
92
+ };
93
+ rows.set(id, rec);
94
+ return rec;
95
+ },
96
+ async putNative(logicalKey, ownerTenantId, payload) {
97
+ const existing = ownedOf(logicalKey, ownerTenantId);
98
+ const contentHash = computeContentHash(payload);
99
+ if (existing) {
100
+ const updated = { ...existing, ...payload, contentHash };
101
+ rows.set(existing.id, updated);
102
+ return updated;
103
+ }
104
+ const id = newUUIDv7();
105
+ const rec = {
106
+ ...payload,
107
+ id,
108
+ realm: 'tenant',
109
+ ownerTenantId,
110
+ logicalKey,
111
+ originId: null,
112
+ originHash: null,
113
+ contentHash,
114
+ trackMode: 'pin',
115
+ shareMode: 'private',
116
+ };
117
+ rows.set(id, rec);
118
+ return rec;
119
+ },
120
+ async setShareMode(id, shareMode) {
121
+ const r = rows.get(id);
122
+ if (!r)
123
+ throw new RealmRecordNotFoundError(id);
124
+ const updated = { ...r, shareMode };
125
+ rows.set(id, updated);
126
+ return updated;
127
+ },
128
+ async delete(id) {
129
+ if (!rows.has(id))
130
+ throw new RealmRecordNotFoundError(id);
131
+ rows.delete(id);
132
+ },
133
+ async get(id) {
134
+ return rows.get(id) ?? null;
135
+ },
136
+ async listAll(logicalKeys) {
137
+ const all = [...rows.values()];
138
+ return logicalKeys ? all.filter((r) => logicalKeys.includes(r.logicalKey)) : all;
139
+ },
140
+ async listVisible(ctx, logicalKeys) {
141
+ return (await this.listAll(logicalKeys)).filter((r) => isVisible(r, ctx));
142
+ },
143
+ async count() {
144
+ return rows.size;
145
+ },
146
+ };
147
+ }
148
+ export function createRealmResolver(opts) {
149
+ const { store } = opts;
150
+ return {
151
+ async resolve(logicalKey, ctx) {
152
+ // Pull every visible copy of this key (tenant + shared ancestors + global) in one go, plus the
153
+ // global original for drift, then resolve nearest-owner-wins in memory.
154
+ const candidates = await store.listVisible(ctx, [logicalKey]);
155
+ const globalOriginals = await store.listAll([logicalKey]).then((all) => all.filter((r) => r.realm === 'global'));
156
+ const remoteHashOf = buildRemoteHash([...candidates, ...globalOriginals]);
157
+ return resolveOne(candidates, logicalKey, ctx, remoteHashOf);
158
+ },
159
+ async listEffective(ctx, logicalKeys) {
160
+ const candidates = await store.listVisible(ctx, logicalKeys);
161
+ const globalOriginals = (await store.listAll(logicalKeys)).filter((r) => r.realm === 'global');
162
+ const remoteHashOf = buildRemoteHash([...candidates, ...globalOriginals]);
163
+ return resolveEffective(candidates, ctx, remoteHashOf);
164
+ },
165
+ };
166
+ }
167
+ function buildRemoteHash(records) {
168
+ const map = new Map(records.map((r) => [r.id, r.contentHash]));
169
+ return (originId) => map.get(originId);
170
+ }
171
+ export { GLOBAL_CONTEXT };
172
+ //# sourceMappingURL=realm-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-store.js","sourceRoot":"","sources":["../src/realm-store.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,oBAAoB,GAIrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAqB,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAwB,MAAM,cAAc,CAAC;AAK7F,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,EAAU;QACpB,KAAK,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AACD,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,UAAkB;QAC5B,KAAK,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC;QAC/F,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAwBD,SAAS,cAAc;IACrB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,EAAE;QACV,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,CAAC;QACT,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,wBAAwB;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC/C,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,CAAC,UAAkB,EAA8B,EAAE,CAClE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,CAAC,UAAkB,EAAE,aAAqB,EAA8B,EAAE,CACxF,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,aAAa,KAAK,aAAa,CAAC,CAAC;IAEnG,OAAO;QACL,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI;YAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAmB,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAClI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC/B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,GAAmB;gBAC1B,GAAG,OAAO;gBACV,EAAE;gBACF,GAAG,oBAAoB,CAAC,UAAU,EAAE,WAAW,CAAC;gBAChD,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtD,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO;YACtC,IAAI,GAAG,CAAC,QAAQ,IAAI,IAAI;gBAAE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACxE,yEAAyE;YACzE,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;YACnG,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;YAClD,IAAI,CAAC,IAAI;gBAAE,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAmB,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,EAAE,EAAoB,CAAC;gBAChH,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAClC,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,GAAmB;gBAC1B,GAAG,OAAO;gBACV,EAAE;gBACF,KAAK,EAAE,QAAQ;gBACf,aAAa,EAAE,GAAG,CAAC,QAAQ;gBAC3B,UAAU;gBACV,QAAQ,EAAE,IAAI,CAAC,EAAE;gBACjB,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,OAAO;gBACrC,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,SAAS;aACH,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,OAAO;YAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YACpD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAmB,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,WAAW,EAAoB,CAAC;gBAC3F,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;gBAC/B,OAAO,OAAO,CAAC;YACjB,CAAC;YACD,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,GAAmB;gBAC1B,GAAG,OAAO;gBACV,EAAE;gBACF,KAAK,EAAE,QAAQ;gBACf,aAAa;gBACb,UAAU;gBACV,QAAQ,EAAE,IAAI;gBACd,UAAU,EAAE,IAAI;gBAChB,WAAW;gBACX,SAAS,EAAE,KAAK;gBAChB,SAAS,EAAE,SAAS;aACH,CAAC;YACpB,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAClB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACtB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,MAAM,IAAI,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACV,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,WAAW;YACvB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/B,OAAO,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACnF,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW;YAChC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,KAAK,CAAC,KAAK;YACT,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAkBD,MAAM,UAAU,mBAAmB,CAA8B,IAA6B;IAC5F,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG;YAC3B,+FAA+F;YAC/F,wEAAwE;YACxE,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9D,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC;YACjH,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC;YAC1E,OAAO,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,WAAW;YAClC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC7D,MAAM,eAAe,GAAG,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;YAC/F,MAAM,YAAY,GAAG,eAAe,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC;YAC1E,OAAO,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAmC;IAC1D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * The resolution engine — given all the config rows a tenant is *allowed to see* for some family
3
+ * (e.g. every copy of the prompts), pick the ONE that applies to them, and explain why.
4
+ *
5
+ * The rule is "nearest owner wins": your own copy beats a parent's shared copy, which beats the
6
+ * global default. Every result carries **provenance** — is this the global default, your own edit,
7
+ * or something inherited from a parent — plus, for your own edits, whether they've drifted from the
8
+ * default they were forked from. Pure functions: no database, no clock. The store just hands them the
9
+ * visible rows.
10
+ */
11
+ import { type DriftState, type RealmFields, type RealmRecord } from './realm-record.js';
12
+ import { type RealmContext } from './context.js';
13
+ /** Where a resolved record came from, for badges / audit / run traces. */
14
+ export type RealmProvenance = {
15
+ readonly kind: 'global';
16
+ } | {
17
+ readonly kind: 'native';
18
+ readonly ownerTenantId: string;
19
+ } | {
20
+ readonly kind: 'own_override';
21
+ readonly ownerTenantId: string;
22
+ readonly drift: DriftState | 'not_a_fork';
23
+ } | {
24
+ readonly kind: 'inherited';
25
+ readonly fromTenantId: string;
26
+ readonly distance: number;
27
+ };
28
+ /** A resolved config row: the winning record plus how it was reached. */
29
+ export type EffectiveRecord<T = Record<string, unknown>> = RealmRecord<T> & {
30
+ readonly realmProvenance: RealmProvenance;
31
+ };
32
+ /**
33
+ * Can tenant `ctx` see this record?
34
+ * • every global default, and your own records, always;
35
+ * • a parent's record only if it's shared to 'children' or 'subtree';
36
+ * • a higher ancestor's record only if it's shared to the whole 'subtree'.
37
+ * A parent's *private* record stays invisible — you resolve past it to the next-nearest or global.
38
+ */
39
+ export declare function isVisible(record: Pick<RealmRecord, keyof RealmFields>, ctx: RealmContext): boolean;
40
+ /** Explain a winning record for a given context. `remoteHashOf` looks up the origin's CURRENT hash (for drift). */
41
+ export declare function provenanceOf(record: RealmRecord, ctx: RealmContext, remoteHashOf?: (originId: string) => string | null | undefined): RealmProvenance;
42
+ /**
43
+ * Resolve every logical key in a candidate set to its single effective record. Input can be the whole
44
+ * family (all copies of all keys); the function filters to what `ctx` may see, then keeps the nearest
45
+ * owner per logical key, attaching provenance. `remoteHashOf` (optional) enables drift on own edits;
46
+ * by default it's derived from the candidate set (the global original usually sits right there).
47
+ */
48
+ export declare function resolveEffective<T extends Record<string, unknown> = Record<string, unknown>>(records: ReadonlyArray<RealmRecord<T>>, ctx: RealmContext, remoteHashOf?: (originId: string) => string | null | undefined): Array<EffectiveRecord<T>>;
49
+ /** Resolve a single logical key, or null if the tenant can see no copy of it. */
50
+ export declare function resolveOne<T extends Record<string, unknown> = Record<string, unknown>>(records: ReadonlyArray<RealmRecord<T>>, logicalKey: string, ctx: RealmContext, remoteHashOf?: (originId: string) => string | null | undefined): EffectiveRecord<T> | null;
51
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AACH,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAEtB,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAAA;CAAE,GAC5G;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F,yEAAyE;AACzE,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG;IAC1E,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,WAAW,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAOlG;AAED,mHAAmH;AACnH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,YAAY,EACjB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7D,eAAe,CAUjB;AAQD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1F,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACtC,GAAG,EAAE,YAAY,EACjB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7D,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAuB3B;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpF,OAAO,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EACtC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,YAAY,EACjB,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7D,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAG3B"}