@weaveintel/realm 0.1.0 → 0.2.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
@@ -101,6 +101,61 @@ import pg from 'pg';
101
101
  const store = createSqlRealmStore({ client: new pg.Pool({ connectionString: process.env.DATABASE_URL }), dialect: 'postgres' });
102
102
  ```
103
103
 
104
+ ## Shipping updates without clobbering edits (the version log + reconcile)
105
+
106
+ Here's the problem every product with built-in defaults eventually hits. You ship a set of default
107
+ prompts (or guardrails, or skills). An operator edits a few to suit their organisation. Then you ship a
108
+ new release that improves some of those same defaults. Now what? Overwrite and lose their edits? Skip
109
+ and leave them on an old version forever? Neither is acceptable.
110
+
111
+ This is the exact problem your operating system's package manager solved decades ago. When a new package
112
+ version wants to replace a config file in `/etc`, it doesn't guess — it remembers the version it shipped
113
+ last time (the **baseline**) and compares three things: what it shipped before, what's on disk now, and
114
+ what the new package wants. Then it only bothers you when *both* sides changed.
115
+
116
+ `@weaveintel/realm` gives you the same machinery for config records:
117
+
118
+ - A **version log** (`createInMemoryVersionLog` / `createSqlVersionLog`) records every default you
119
+ publish. It's the baseline — kept separate from the live record, so an operator's edit never erases it.
120
+ - **`reconcile(store, log, family, desiredDefaults)`** compares your new release against what's stored
121
+ and sorts every default into one of six buckets:
122
+
123
+ | bucket | meaning | what reconcile does |
124
+ |---|---|---|
125
+ | `in_sync` | nobody changed it | nothing |
126
+ | `customized` | operator edited it; you didn't change it | **keeps theirs** |
127
+ | `stale` | operator didn't touch it; you shipped a change | **adopts the new default** automatically |
128
+ | `diverged` | both changed | leaves it, flags for review (a real merge) |
129
+ | `new` | you ship a default not in the store yet | publishes it |
130
+ | `removed` | the store has a default you no longer ship | flags it, never auto-deletes |
131
+
132
+ ```ts
133
+ import { createInMemoryRealmStore, createInMemoryVersionLog, reconcile } from '@weaveintel/realm';
134
+
135
+ const store = createInMemoryRealmStore(); // or the SQL store
136
+ const log = createInMemoryVersionLog(); // or createSqlVersionLog
137
+
138
+ // Your release's current defaults:
139
+ const defaults = [
140
+ { logicalKey: 'assistant.general', payload: { template: 'You are a helpful assistant.' } },
141
+ { logicalKey: 'assistant.legal', payload: { template: 'You are a careful legal assistant.' } },
142
+ ];
143
+
144
+ const { report, applied, needsReview } = await reconcile(store, log, 'prompts', defaults);
145
+ // report.summary → { in_sync, customized, stale, diverged, new, removed }
146
+ // applied → what it published/adopted automatically
147
+ // needsReview → what a human should look at (the customized/diverged ones)
148
+ ```
149
+
150
+ The first run publishes everything (`new`). Re-running the same release is a clean no-op — the version
151
+ log is content-addressed, so re-seeding never inflates history. And a `reconcile` **is** the seeding
152
+ mechanism: first seed and later upgrade are the same call.
153
+
154
+ When an operator decides a `diverged` default should just take the shipped version, `resyncToDesired`
155
+ records that choice and drift returns to `in_sync` — the equivalent of "install the package maintainer's
156
+ version". `publishToRealm` publishes a single global default plus its version, for an admin "save"
157
+ button.
158
+
104
159
  ## License
105
160
 
106
161
  MIT.
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * @weaveintel/realm — resolve the effective configuration for a tenant across a global→tenant
3
- * hierarchy, with provenance and git-style drift. Phase 1 of the tenancy realm design.
3
+ * hierarchy, with provenance and git-style drift (Phase 1), plus a version log and a package-upgrade
4
+ * reconcile engine so shipped defaults and operator edits never clobber each other (Phase 2).
4
5
  */
5
6
  export * from './realm-record.js';
6
7
  export * from './context.js';
@@ -8,4 +9,7 @@ export * from './resolve.js';
8
9
  export * from './realm-store.js';
9
10
  export * from './realm-store-sql.js';
10
11
  export * from './realm-contract.js';
12
+ export * from './realm-version.js';
13
+ export * from './realm-version-sql.js';
14
+ export * from './reconcile.js';
11
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // SPDX-License-Identifier: MIT
2
2
  /**
3
3
  * @weaveintel/realm — resolve the effective configuration for a tenant across a global→tenant
4
- * hierarchy, with provenance and git-style drift. Phase 1 of the tenancy realm design.
4
+ * hierarchy, with provenance and git-style drift (Phase 1), plus a version log and a package-upgrade
5
+ * reconcile engine so shipped defaults and operator edits never clobber each other (Phase 2).
5
6
  */
6
7
  export * from './realm-record.js';
7
8
  export * from './context.js';
@@ -9,4 +10,7 @@ export * from './resolve.js';
9
10
  export * from './realm-store.js';
10
11
  export * from './realm-store-sql.js';
11
12
  export * from './realm-contract.js';
13
+ export * from './realm-version.js';
14
+ export * from './realm-version-sql.js';
15
+ export * from './reconcile.js';
12
16
  //# 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,+BAA+B;AAC/B;;;GAGG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B;;;;GAIG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
@@ -1 +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"}
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,CA0LhH"}
@@ -196,8 +196,9 @@ export function createSqlRealmStore(opts) {
196
196
  return getRow(id);
197
197
  },
198
198
  async listAll(logicalKeys) {
199
+ await ensure(); // create the schema before the first read too (reconcile reads an empty store first)
199
200
  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 client.query(`SELECT * FROM ${table} WHERE logical_key IN (${logicalKeys.map((_, i) => (dialect === 'postgres' ? `$${i + 1}` : '?')).join(', ')})`, logicalKeys).then((r) => r.rows)
201
202
  : (await q `SELECT * FROM ${T}`);
202
203
  return rows.map(toRecord);
203
204
  },
@@ -1 +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"}
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,MAAM,EAAE,CAAC,CAAC,qFAAqF;YACrG,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,CAAC,IAAI,CAAC;gBACvB,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,14 @@
1
+ import type { Payload } from './realm-store.js';
2
+ import type { SqlClient, SqlDialect } from './realm-store-sql.js';
3
+ import type { RealmVersionLog } from './realm-version.js';
4
+ export interface SqlVersionLogOptions {
5
+ readonly client: SqlClient;
6
+ readonly dialect: SqlDialect;
7
+ readonly table?: string;
8
+ readonly ensureSchema?: boolean;
9
+ readonly idFactory?: () => string;
10
+ }
11
+ /** Portable DDL for the version log. All TEXT/INTEGER; timestamps set in code, not by DB defaults. */
12
+ export declare function realmVersionsDdl(table?: string): string[];
13
+ export declare function createSqlVersionLog<T extends Payload = Payload>(opts: SqlVersionLogOptions): RealmVersionLog<T>;
14
+ //# sourceMappingURL=realm-version-sql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-version-sql.d.ts","sourceRoot":"","sources":["../src/realm-version-sql.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,KAAK,EAA8B,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEtF,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;CACnC;AAED,sGAAsG;AACtG,wBAAgB,gBAAgB,CAAC,KAAK,SAAmB,GAAG,MAAM,EAAE,CAgBnE;AAID,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,oBAAoB,GAAG,eAAe,CAAC,CAAC,CAAC,CAgF/G"}
@@ -0,0 +1,100 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * SQL-backed realm version log — one implementation for SQLite and Postgres over the same `SqlClient`
4
+ * seam the config store uses. Append-only; content-addressed (a repeat publish of identical content is
5
+ * a no-op). No recursive SQL, so both engines behave identically.
6
+ */
7
+ import { newUUIDv7 } from '@weaveintel/core';
8
+ import { computeContentHash } from './realm-record.js';
9
+ /** Portable DDL for the version log. All TEXT/INTEGER; timestamps set in code, not by DB defaults. */
10
+ export function realmVersionsDdl(table = 'realm_versions') {
11
+ return [
12
+ `CREATE TABLE IF NOT EXISTS ${table} (
13
+ id TEXT PRIMARY KEY,
14
+ family TEXT NOT NULL,
15
+ logical_key TEXT NOT NULL,
16
+ version INTEGER NOT NULL,
17
+ content_hash TEXT NOT NULL,
18
+ payload TEXT NOT NULL,
19
+ published_by TEXT,
20
+ note TEXT,
21
+ published_at TEXT NOT NULL
22
+ )`,
23
+ `CREATE UNIQUE INDEX IF NOT EXISTS ux_${table}_key_version ON ${table}(family, logical_key, version)`,
24
+ `CREATE INDEX IF NOT EXISTS ix_${table}_family_key ON ${table}(family, logical_key)`,
25
+ ];
26
+ }
27
+ const DEFAULT_AT = '1970-01-01T00:00:00.000Z';
28
+ export function createSqlVersionLog(opts) {
29
+ const { client, dialect } = opts;
30
+ const table = opts.table ?? 'realm_versions';
31
+ const newId = opts.idFactory ?? newUUIDv7;
32
+ const ph = (i) => (dialect === 'postgres' ? `$${i}` : '?');
33
+ let ready = null;
34
+ const ensure = () => {
35
+ if (opts.ensureSchema === false)
36
+ return Promise.resolve();
37
+ if (!ready)
38
+ ready = (async () => { for (const stmt of realmVersionsDdl(table))
39
+ await client.query(stmt); })();
40
+ return ready;
41
+ };
42
+ const rowToVersion = (r) => ({
43
+ id: String(r['id']),
44
+ family: String(r['family']),
45
+ logicalKey: String(r['logical_key']),
46
+ version: Number(r['version']),
47
+ contentHash: String(r['content_hash']),
48
+ payload: JSON.parse(String(r['payload'])),
49
+ publishedAt: String(r['published_at']),
50
+ ...(r['published_by'] != null ? { publishedBy: String(r['published_by']) } : {}),
51
+ ...(r['note'] != null ? { note: String(r['note']) } : {}),
52
+ });
53
+ return {
54
+ async append(input) {
55
+ await ensure();
56
+ const contentHash = computeContentHash(input.payload);
57
+ const latest = await this.latest(input.family, input.logicalKey);
58
+ if (latest && latest.contentHash === contentHash)
59
+ return latest; // content-addressed no-op
60
+ const version = (latest?.version ?? 0) + 1;
61
+ const id = newId();
62
+ await client.query(`INSERT INTO ${table} (id, family, logical_key, version, content_hash, payload, published_by, note, published_at)
63
+ VALUES (${ph(1)}, ${ph(2)}, ${ph(3)}, ${ph(4)}, ${ph(5)}, ${ph(6)}, ${ph(7)}, ${ph(8)}, ${ph(9)})`, [id, input.family, input.logicalKey, version, contentHash, JSON.stringify(input.payload),
64
+ input.publishedBy ?? null, input.note ?? null, input.at ?? DEFAULT_AT]);
65
+ return {
66
+ id, family: input.family, logicalKey: input.logicalKey, version, contentHash,
67
+ payload: input.payload, publishedAt: input.at ?? DEFAULT_AT,
68
+ ...(input.publishedBy !== undefined ? { publishedBy: input.publishedBy } : {}),
69
+ ...(input.note !== undefined ? { note: input.note } : {}),
70
+ };
71
+ },
72
+ async latest(family, logicalKey) {
73
+ await ensure();
74
+ const { rows } = await client.query(`SELECT * FROM ${table} WHERE family = ${ph(1)} AND logical_key = ${ph(2)} ORDER BY version DESC LIMIT 1`, [family, logicalKey]);
75
+ return rows[0] ? rowToVersion(rows[0]) : null;
76
+ },
77
+ async history(family, logicalKey) {
78
+ await ensure();
79
+ const { rows } = await client.query(`SELECT * FROM ${table} WHERE family = ${ph(1)} AND logical_key = ${ph(2)} ORDER BY version DESC`, [family, logicalKey]);
80
+ return rows.map(rowToVersion);
81
+ },
82
+ async at(family, logicalKey, version) {
83
+ await ensure();
84
+ const { rows } = await client.query(`SELECT * FROM ${table} WHERE family = ${ph(1)} AND logical_key = ${ph(2)} AND version = ${ph(3)}`, [family, logicalKey, version]);
85
+ return rows[0] ? rowToVersion(rows[0]) : null;
86
+ },
87
+ async latestAll(family) {
88
+ await ensure();
89
+ const { rows } = await client.query(`SELECT * FROM ${table} WHERE family = ${ph(1)} ORDER BY logical_key, version DESC`, [family]);
90
+ const out = new Map();
91
+ for (const r of rows) {
92
+ const v = rowToVersion(r);
93
+ if (!out.has(v.logicalKey))
94
+ out.set(v.logicalKey, v);
95
+ }
96
+ return out;
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=realm-version-sql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-version-sql.js","sourceRoot":"","sources":["../src/realm-version-sql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Payload } from './realm-store.js';
2
+ /** One immutable published version of a global default. */
3
+ export interface RealmVersion<T extends Payload = Payload> {
4
+ readonly id: string;
5
+ /** Which config family this belongs to, e.g. 'prompts' or 'prompt_fragments'. */
6
+ readonly family: string;
7
+ readonly logicalKey: string;
8
+ /** 1-based, monotonic per (family, logicalKey). */
9
+ readonly version: number;
10
+ /** Content hash of `payload` — the drift *baseline* for this key. */
11
+ readonly contentHash: string;
12
+ readonly payload: T;
13
+ readonly publishedAt: string;
14
+ /** Optional actor: a package name/version, or an admin id. */
15
+ readonly publishedBy?: string;
16
+ readonly note?: string;
17
+ }
18
+ /** What a caller hands `append` — the log computes the hash, version number and timestamps. */
19
+ export interface PublishInput<T extends Payload = Payload> {
20
+ readonly family: string;
21
+ readonly logicalKey: string;
22
+ readonly payload: T;
23
+ readonly publishedBy?: string;
24
+ readonly note?: string;
25
+ /** Timestamp to stamp (ISO). Callers pass one so the log stays deterministic/testable. */
26
+ readonly at?: string;
27
+ }
28
+ /**
29
+ * Append-only history of published global defaults. `append` is content-addressed: publishing the
30
+ * same content twice returns the existing latest version instead of creating a duplicate.
31
+ */
32
+ export interface RealmVersionLog<T extends Payload = Payload> {
33
+ append(input: PublishInput<T>): Promise<RealmVersion<T>>;
34
+ /** The most recent published version for a key (the drift baseline), or null if never published. */
35
+ latest(family: string, logicalKey: string): Promise<RealmVersion<T> | null>;
36
+ /** Full history for a key, newest first. */
37
+ history(family: string, logicalKey: string): Promise<Array<RealmVersion<T>>>;
38
+ /** A specific version (for the diff workbench's "Base" payload). */
39
+ at(family: string, logicalKey: string, version: number): Promise<RealmVersion<T> | null>;
40
+ /** Every key's latest version in a family — the baseline snapshot a reconcile compares against. */
41
+ latestAll(family: string): Promise<Map<string, RealmVersion<T>>>;
42
+ }
43
+ /** In-memory reference implementation (and the semantics every backend must match). */
44
+ export declare function createInMemoryVersionLog<T extends Payload = Payload>(): RealmVersionLog<T>;
45
+ //# sourceMappingURL=realm-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-version.d.ts","sourceRoot":"","sources":["../src/realm-version.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,2DAA2D;AAC3D,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,+FAA+F;AAC/F,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO;IAC1D,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,oGAAoG;IACpG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5E,4CAA4C;IAC5C,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,oEAAoE;IACpE,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzF,mGAAmG;IACnG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAClE;AAID,uFAAuF;AACvF,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,CA4C1F"}
@@ -0,0 +1,67 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Realm version log — an append-only record of every version of a GLOBAL default the product has
4
+ * published. It is the *baseline* store for drift detection.
5
+ *
6
+ * The analogy is your operating system's package manager. When a package ships a config file to
7
+ * `/etc`, the package manager remembers the version it shipped. Later, on an upgrade, it compares
8
+ * three things: what it shipped last time (the baseline), what's on disk now (maybe you edited it),
9
+ * and what the new package wants to ship. Debian's `ucf`/dpkg-conffile handling keeps that baseline
10
+ * in a side file precisely so it can tell "you changed this" from "we changed this". This log is that
11
+ * side file for realm config: the last published version of each global default, kept out of the
12
+ * live row so an operator's in-place edit never erases the baseline we measure drift against.
13
+ *
14
+ * It is append-only and content-addressed: publishing a payload whose content hash already matches the
15
+ * latest version is a no-op (returns that version), so re-running a seed doesn't inflate history.
16
+ */
17
+ import { newUUIDv7 } from '@weaveintel/core';
18
+ import { computeContentHash } from './realm-record.js';
19
+ const DEFAULT_AT = '1970-01-01T00:00:00.000Z';
20
+ /** In-memory reference implementation (and the semantics every backend must match). */
21
+ export function createInMemoryVersionLog() {
22
+ const rows = [];
23
+ const keyFilter = (family, logicalKey) => (r) => r.family === family && r.logicalKey === logicalKey;
24
+ return {
25
+ async append(input) {
26
+ const contentHash = computeContentHash(input.payload);
27
+ const forKey = rows.filter(keyFilter(input.family, input.logicalKey)).sort((a, b) => b.version - a.version);
28
+ const latest = forKey[0];
29
+ // Content-addressed: same content as the latest → no new version.
30
+ if (latest && latest.contentHash === contentHash)
31
+ return latest;
32
+ const version = {
33
+ id: newUUIDv7(),
34
+ family: input.family,
35
+ logicalKey: input.logicalKey,
36
+ version: (latest?.version ?? 0) + 1,
37
+ contentHash,
38
+ payload: input.payload,
39
+ publishedAt: input.at ?? DEFAULT_AT,
40
+ ...(input.publishedBy !== undefined ? { publishedBy: input.publishedBy } : {}),
41
+ ...(input.note !== undefined ? { note: input.note } : {}),
42
+ };
43
+ rows.push(version);
44
+ return version;
45
+ },
46
+ async latest(family, logicalKey) {
47
+ const forKey = rows.filter(keyFilter(family, logicalKey)).sort((a, b) => b.version - a.version);
48
+ return forKey[0] ?? null;
49
+ },
50
+ async history(family, logicalKey) {
51
+ return rows.filter(keyFilter(family, logicalKey)).sort((a, b) => b.version - a.version);
52
+ },
53
+ async at(family, logicalKey, version) {
54
+ return rows.find((r) => r.family === family && r.logicalKey === logicalKey && r.version === version) ?? null;
55
+ },
56
+ async latestAll(family) {
57
+ const out = new Map();
58
+ for (const r of rows.filter((x) => x.family === family)) {
59
+ const cur = out.get(r.logicalKey);
60
+ if (!cur || r.version > cur.version)
61
+ out.set(r.logicalKey, r);
62
+ }
63
+ return out;
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=realm-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realm-version.js","sourceRoot":"","sources":["../src/realm-version.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Reconcile shipped defaults with what's actually in the store — the "self-upgrade" engine.
3
+ *
4
+ * When the product ships a new version, some of its built-in defaults change. Meanwhile an operator may
5
+ * have edited some of those defaults in place. We must never silently clobber the operator, and never
6
+ * leave them stuck on a stale default. This is exactly what your OS package manager does with a config
7
+ * file in /etc on upgrade — Debian's dpkg/ucf keeps the version it shipped last time (the *baseline*),
8
+ * and compares three things:
9
+ *
10
+ * • Base — what we shipped last time (the version log's latest entry)
11
+ * • Local — what's in the store now (may carry operator edits)
12
+ * • Remote — what the new release wants to ship (the desired default handed in)
13
+ *
14
+ * and classifies each default:
15
+ *
16
+ * • in_sync — you didn't touch it, we didn't change it → nothing to do
17
+ * • customized — you edited it, we didn't → keep yours (never overwritten)
18
+ * • stale — you didn't touch it, we changed it → safe to adopt the new default automatically
19
+ * • diverged — both changed → leave it, flag for review (a real merge, like ucf's 3-way prompt)
20
+ * • new — we ship a default that isn't in the store yet → publish it
21
+ * • removed — the store has a managed default we no longer ship → flag, never auto-delete
22
+ *
23
+ * `planReconcile` is the read-only report (a "terraform plan" for config). `reconcile` applies the safe
24
+ * moves (publish new, adopt stale) and returns what still needs a human. Nothing here is destructive by
25
+ * default.
26
+ */
27
+ import { type DriftState } from './realm-record.js';
28
+ import type { Payload, RealmConfigStore } from './realm-store.js';
29
+ import type { RealmVersionLog } from './realm-version.js';
30
+ /** One shipped default from the current release (Remote). */
31
+ export interface DesiredDefault<T extends Payload = Payload> {
32
+ readonly logicalKey: string;
33
+ readonly payload: T;
34
+ }
35
+ export type ReconcileState = DriftState | 'new' | 'removed';
36
+ export interface DriftEntry<T extends Payload = Payload> {
37
+ readonly logicalKey: string;
38
+ readonly state: ReconcileState;
39
+ readonly base: string | null;
40
+ readonly local: string | null;
41
+ readonly remote: string | null;
42
+ /** Payloads for the diff/merge workbench (only populated where meaningful). */
43
+ readonly basePayload?: T;
44
+ readonly localPayload?: T;
45
+ readonly remotePayload?: T;
46
+ }
47
+ export interface DriftReport<T extends Payload = Payload> {
48
+ readonly entries: Array<DriftEntry<T>>;
49
+ readonly summary: Record<ReconcileState, number>;
50
+ }
51
+ /** Classify one key from its three hashes. base=null means "never recorded a baseline" (unmanaged). */
52
+ export declare function classifyDrift(base: string | null, local: string | null, remote: string | null): ReconcileState;
53
+ /** Inputs to the pure planner — snapshots, so it needs no store/log. */
54
+ export interface ReconcilePlanInput<T extends Payload = Payload> {
55
+ /** Current global rows keyed by logicalKey (Local). */
56
+ readonly current: Map<string, {
57
+ contentHash: string;
58
+ payload: T;
59
+ }>;
60
+ /** Latest published version keyed by logicalKey (Base). */
61
+ readonly baseline: Map<string, {
62
+ contentHash: string;
63
+ payload: T;
64
+ }>;
65
+ /** The release's desired defaults (Remote). */
66
+ readonly desired: ReadonlyArray<DesiredDefault<T>>;
67
+ }
68
+ /** Read-only drift report — the "plan". Considers every key present on any side. */
69
+ export declare function planReconcile<T extends Payload = Payload>(input: ReconcilePlanInput<T>): DriftReport<T>;
70
+ export interface ReconcileOptions {
71
+ /** Adopt 'stale' defaults automatically (operator didn't touch them). Default true. */
72
+ readonly autoAdoptStale?: boolean;
73
+ /** Publish 'new' defaults the store doesn't have yet. Default true. */
74
+ readonly publishNew?: boolean;
75
+ /** Stamp on version-log entries this reconcile writes. */
76
+ readonly publishedBy?: string;
77
+ readonly at?: string;
78
+ }
79
+ export interface ReconcileResult<T extends Payload = Payload> {
80
+ readonly report: DriftReport<T>;
81
+ /** Keys this reconcile changed, with what it did. */
82
+ readonly applied: Array<{
83
+ logicalKey: string;
84
+ action: 'published' | 'adopted';
85
+ }>;
86
+ /** Keys a human still needs to look at (customized / diverged / removed). */
87
+ readonly needsReview: Array<{
88
+ logicalKey: string;
89
+ state: ReconcileState;
90
+ }>;
91
+ }
92
+ /**
93
+ * Apply the safe moves and report the rest. Publishes new defaults, adopts stale ones (recording a new
94
+ * baseline version), and leaves customized/diverged/removed for a human. Every write goes through the
95
+ * store + version log — the same path a fresh seed uses — so this doubles as the seeding mechanism
96
+ * (`PublishToRealm`): a first run publishes everything as `new`; later runs reconcile.
97
+ */
98
+ export declare function reconcile<T extends Payload = Payload>(store: RealmConfigStore<T>, versionLog: RealmVersionLog<T>, family: string, desired: ReadonlyArray<DesiredDefault<T>>, opts?: ReconcileOptions): Promise<ReconcileResult<T>>;
99
+ /**
100
+ * Force "take the shipped version" for one key — the operator's explicit choice on a customized/diverged
101
+ * default (like `ucf`'s "install the package maintainer's version"). Overwrites the global and records a
102
+ * fresh baseline so drift returns to in_sync.
103
+ */
104
+ export declare function resyncToDesired<T extends Payload = Payload>(store: RealmConfigStore<T>, versionLog: RealmVersionLog<T>, family: string, logicalKey: string, payload: T, opts?: {
105
+ publishedBy?: string;
106
+ at?: string;
107
+ }): Promise<void>;
108
+ /**
109
+ * Publish a single global default and record its version — `PublishToRealm` for one record. Idempotent
110
+ * on unchanged content (the version log dedupes). This is what an admin "save a global default" calls.
111
+ */
112
+ export declare function publishToRealm<T extends Payload = Payload>(store: RealmConfigStore<T>, versionLog: RealmVersionLog<T>, family: string, logicalKey: string, payload: T, opts?: {
113
+ publishedBy?: string;
114
+ note?: string;
115
+ at?: string;
116
+ }): Promise<{
117
+ contentHash: string;
118
+ }>;
119
+ //# sourceMappingURL=reconcile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ // SPDX-License-Identifier: MIT
2
+ /**
3
+ * Reconcile shipped defaults with what's actually in the store — the "self-upgrade" engine.
4
+ *
5
+ * When the product ships a new version, some of its built-in defaults change. Meanwhile an operator may
6
+ * have edited some of those defaults in place. We must never silently clobber the operator, and never
7
+ * leave them stuck on a stale default. This is exactly what your OS package manager does with a config
8
+ * file in /etc on upgrade — Debian's dpkg/ucf keeps the version it shipped last time (the *baseline*),
9
+ * and compares three things:
10
+ *
11
+ * • Base — what we shipped last time (the version log's latest entry)
12
+ * • Local — what's in the store now (may carry operator edits)
13
+ * • Remote — what the new release wants to ship (the desired default handed in)
14
+ *
15
+ * and classifies each default:
16
+ *
17
+ * • in_sync — you didn't touch it, we didn't change it → nothing to do
18
+ * • customized — you edited it, we didn't → keep yours (never overwritten)
19
+ * • stale — you didn't touch it, we changed it → safe to adopt the new default automatically
20
+ * • diverged — both changed → leave it, flag for review (a real merge, like ucf's 3-way prompt)
21
+ * • new — we ship a default that isn't in the store yet → publish it
22
+ * • removed — the store has a managed default we no longer ship → flag, never auto-delete
23
+ *
24
+ * `planReconcile` is the read-only report (a "terraform plan" for config). `reconcile` applies the safe
25
+ * moves (publish new, adopt stale) and returns what still needs a human. Nothing here is destructive by
26
+ * default.
27
+ */
28
+ import { computeContentHash, driftState } from './realm-record.js';
29
+ const EMPTY_SUMMARY = () => ({ in_sync: 0, customized: 0, stale: 0, diverged: 0, new: 0, removed: 0 });
30
+ /** Classify one key from its three hashes. base=null means "never recorded a baseline" (unmanaged). */
31
+ export function classifyDrift(base, local, remote) {
32
+ if (local == null)
33
+ return remote != null ? 'new' : 'in_sync';
34
+ if (remote == null)
35
+ return 'removed';
36
+ // Both present now (local, remote both non-null).
37
+ if (base == null)
38
+ return local === remote ? 'in_sync' : 'diverged'; // unmanaged → never auto-overwrite
39
+ const d = driftState(base, local, remote);
40
+ return d === 'not_a_fork' ? 'diverged' : d; // base is non-null here, so this is unreachable, but keeps it safe
41
+ }
42
+ /** Read-only drift report — the "plan". Considers every key present on any side. */
43
+ export function planReconcile(input) {
44
+ const { current, baseline, desired } = input;
45
+ const desiredByKey = new Map(desired.map((d) => [d.logicalKey, d]));
46
+ const keys = new Set([...current.keys(), ...baseline.keys(), ...desiredByKey.keys()]);
47
+ const entries = [];
48
+ const summary = EMPTY_SUMMARY();
49
+ for (const logicalKey of [...keys].sort()) {
50
+ const cur = current.get(logicalKey);
51
+ const base = baseline.get(logicalKey);
52
+ const des = desiredByKey.get(logicalKey);
53
+ const localHash = cur?.contentHash ?? null;
54
+ const baseHash = base?.contentHash ?? null;
55
+ const remoteHash = des ? computeContentHash(des.payload) : null;
56
+ const state = classifyDrift(baseHash, localHash, remoteHash);
57
+ summary[state] += 1;
58
+ entries.push({
59
+ logicalKey, state, base: baseHash, local: localHash, remote: remoteHash,
60
+ ...(base ? { basePayload: base.payload } : {}),
61
+ ...(cur ? { localPayload: cur.payload } : {}),
62
+ ...(des ? { remotePayload: des.payload } : {}),
63
+ });
64
+ }
65
+ return { entries, summary };
66
+ }
67
+ /**
68
+ * Apply the safe moves and report the rest. Publishes new defaults, adopts stale ones (recording a new
69
+ * baseline version), and leaves customized/diverged/removed for a human. Every write goes through the
70
+ * store + version log — the same path a fresh seed uses — so this doubles as the seeding mechanism
71
+ * (`PublishToRealm`): a first run publishes everything as `new`; later runs reconcile.
72
+ */
73
+ export async function reconcile(store, versionLog, family, desired, opts = {}) {
74
+ const autoAdoptStale = opts.autoAdoptStale ?? true;
75
+ const publishNew = opts.publishNew ?? true;
76
+ // Snapshot current globals + baselines.
77
+ const keys = desired.map((d) => d.logicalKey);
78
+ const allGlobals = (await store.listAll(keys)).filter((r) => r.realm === 'global');
79
+ const current = new Map(allGlobals.map((r) => [r.logicalKey, { contentHash: r.contentHash, payload: r }]));
80
+ const baselineVersions = await versionLog.latestAll(family);
81
+ const baseline = new Map([...baselineVersions].map(([k, v]) => [k, { contentHash: v.contentHash, payload: v.payload }]));
82
+ const report = planReconcile({ current, baseline, desired });
83
+ const applied = [];
84
+ const needsReview = [];
85
+ const desiredByKey = new Map(desired.map((d) => [d.logicalKey, d]));
86
+ for (const entry of report.entries) {
87
+ const des = desiredByKey.get(entry.logicalKey);
88
+ if ((entry.state === 'new') && des && publishNew) {
89
+ await store.publishGlobal(entry.logicalKey, des.payload);
90
+ await versionLog.append({ family, logicalKey: entry.logicalKey, payload: des.payload, publishedBy: opts.publishedBy, note: 'publish', at: opts.at });
91
+ applied.push({ logicalKey: entry.logicalKey, action: 'published' });
92
+ }
93
+ else if (entry.state === 'stale' && des && autoAdoptStale) {
94
+ await store.publishGlobal(entry.logicalKey, des.payload);
95
+ await versionLog.append({ family, logicalKey: entry.logicalKey, payload: des.payload, publishedBy: opts.publishedBy, note: 'adopt', at: opts.at });
96
+ applied.push({ logicalKey: entry.logicalKey, action: 'adopted' });
97
+ }
98
+ else if (entry.state === 'customized' || entry.state === 'diverged' || entry.state === 'removed') {
99
+ needsReview.push({ logicalKey: entry.logicalKey, state: entry.state });
100
+ }
101
+ }
102
+ return { report, applied, needsReview };
103
+ }
104
+ /**
105
+ * Force "take the shipped version" for one key — the operator's explicit choice on a customized/diverged
106
+ * default (like `ucf`'s "install the package maintainer's version"). Overwrites the global and records a
107
+ * fresh baseline so drift returns to in_sync.
108
+ */
109
+ export async function resyncToDesired(store, versionLog, family, logicalKey, payload, opts = {}) {
110
+ await store.publishGlobal(logicalKey, payload);
111
+ await versionLog.append({ family, logicalKey, payload, publishedBy: opts.publishedBy, note: 'resync', at: opts.at });
112
+ }
113
+ /**
114
+ * Publish a single global default and record its version — `PublishToRealm` for one record. Idempotent
115
+ * on unchanged content (the version log dedupes). This is what an admin "save a global default" calls.
116
+ */
117
+ export async function publishToRealm(store, versionLog, family, logicalKey, payload, opts = {}) {
118
+ const rec = await store.publishGlobal(logicalKey, payload);
119
+ await versionLog.append({ family, logicalKey, payload, publishedBy: opts.publishedBy, note: opts.note ?? 'publish', at: opts.at });
120
+ return { contentHash: rec.contentHash };
121
+ }
122
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../src/reconcile.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,25 @@
1
1
  {
2
2
  "name": "@weaveintel/realm",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Realm configuration — resolve the effective config record for a tenant across a global→tenant hierarchy, with provenance and git-style drift.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
- "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js", "default": "./dist/index.js" } },
9
- "files": ["dist", "!dist/**/*.test.*", "!dist/**/*.spec.*"],
10
- "publishConfig": { "access": "public" },
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "!dist/**/*.test.*",
18
+ "!dist/**/*.spec.*"
19
+ ],
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
11
23
  "scripts": {
12
24
  "build": "tsc -b",
13
25
  "test": "vitest run",