@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 +55 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/realm-store-sql.d.ts.map +1 -1
- package/dist/realm-store-sql.js +2 -1
- package/dist/realm-store-sql.js.map +1 -1
- package/dist/realm-version-sql.d.ts +14 -0
- package/dist/realm-version-sql.d.ts.map +1 -0
- package/dist/realm-version-sql.js +100 -0
- package/dist/realm-version-sql.js.map +1 -0
- package/dist/realm-version.d.ts +45 -0
- package/dist/realm-version.d.ts.map +1 -0
- package/dist/realm-version.js +67 -0
- package/dist/realm-version.js.map +1 -0
- package/dist/reconcile.d.ts +119 -0
- package/dist/reconcile.d.ts.map +1 -0
- package/dist/reconcile.js +122 -0
- package/dist/reconcile.js.map +1 -0
- package/package.json +16 -4
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA
|
|
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
|
|
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
|
|
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,
|
|
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"}
|
package/dist/realm-store-sql.js
CHANGED
|
@@ -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) =>
|
|
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":"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"}
|
|
1
|
+
{"version":3,"file":"realm-store-sql.js","sourceRoot":"","sources":["../src/realm-store-sql.ts"],"names":[],"mappings":"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"}
|
|
@@ -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.
|
|
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": {
|
|
9
|
-
|
|
10
|
-
|
|
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",
|