@agentshouse/mdruntime 0.1.0-alpha.7 → 0.1.0-alpha.9
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/dist/adapter.d.ts +107 -16
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/bootstrap.d.ts +6 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +14 -6
- package/dist/bootstrap.js.map +1 -1
- package/dist/change.d.ts +1 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js.map +1 -1
- package/dist/client.d.ts +63 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +227 -0
- package/dist/client.js.map +1 -0
- package/dist/collection.d.ts +19 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +88 -25
- package/dist/collection.js.map +1 -1
- package/dist/connection.d.ts +37 -9
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +818 -274
- package/dist/connection.js.map +1 -1
- package/dist/conversation.d.ts +57 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +401 -0
- package/dist/conversation.js.map +1 -0
- package/dist/durability.d.ts +8 -3
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -59
- package/dist/durability.js.map +1 -1
- package/dist/file.d.ts +20 -0
- package/dist/file.d.ts.map +1 -0
- package/dist/file.js +149 -0
- package/dist/file.js.map +1 -0
- package/dist/host.d.ts +9 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +200 -0
- package/dist/host.js.map +1 -0
- package/dist/identity.d.ts +2 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +16 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +16 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +196 -15
- package/dist/memory.js.map +1 -1
- package/dist/model.d.ts +70 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +28 -0
- package/dist/model.js.map +1 -0
- package/dist/outcome.d.ts +16 -9
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +10 -0
- package/dist/outcome.js.map +1 -1
- package/dist/query.d.ts +13 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +18 -0
- package/dist/query.js.map +1 -0
- package/dist/refresh.d.ts +2 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +6 -4
- package/dist/refresh.js.map +1 -1
- package/dist/replica.d.ts +5 -2
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +23 -6
- package/dist/replica.js.map +1 -1
- package/dist/save.d.ts +6 -1
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +52 -11
- package/dist/save.js.map +1 -1
- package/dist/status.d.ts +11 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +5 -4
- package/dist/status.js.map +1 -1
- package/dist/store.d.ts +38 -4
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +64 -7
- package/dist/store.js.map +1 -1
- package/dist/wire.d.ts +63 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +139 -0
- package/dist/wire.js.map +1 -0
- package/package.json +10 -2
package/dist/refresh.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { readStaged } from './replica.js';
|
|
2
2
|
import { unconfirmed } from './transfer.js';
|
|
3
|
-
export async function refreshRoom(adapter, authorization, confirmed) {
|
|
3
|
+
export async function refreshRoom(adapter, authorization, confirmed, binding) {
|
|
4
4
|
const locator = confirmed.record.locator;
|
|
5
5
|
const fromRoomVersion = confirmed.record.roomVersion;
|
|
6
6
|
const first = await adapter.refresh(authorization, {
|
|
7
7
|
locator,
|
|
8
|
+
selection: confirmed.record.replica.selection,
|
|
8
9
|
fromRoomVersion
|
|
9
10
|
});
|
|
10
11
|
if (first.kind !== 'net-advancement') return first;
|
|
@@ -36,6 +37,7 @@ export async function refreshRoom(adapter, authorization, confirmed) {
|
|
|
36
37
|
while(pageToken !== undefined){
|
|
37
38
|
const page = await adapter.refresh(authorization, {
|
|
38
39
|
locator,
|
|
40
|
+
selection: confirmed.record.replica.selection,
|
|
39
41
|
fromRoomVersion,
|
|
40
42
|
pageToken
|
|
41
43
|
});
|
|
@@ -45,7 +47,7 @@ export async function refreshRoom(adapter, authorization, confirmed) {
|
|
|
45
47
|
stage(page);
|
|
46
48
|
pageToken = page.pageToken;
|
|
47
49
|
}
|
|
48
|
-
const advanced =
|
|
50
|
+
const advanced = readStaged({
|
|
49
51
|
...confirmed.record,
|
|
50
52
|
roomVersion,
|
|
51
53
|
documents,
|
|
@@ -53,7 +55,7 @@ export async function refreshRoom(adapter, authorization, confirmed) {
|
|
|
53
55
|
...binaryTargets
|
|
54
56
|
].sort(),
|
|
55
57
|
revisions
|
|
56
|
-
});
|
|
58
|
+
}, binding);
|
|
57
59
|
return advanced === null ? unconfirmed : {
|
|
58
60
|
kind: 'advanced',
|
|
59
61
|
confirmed: advanced
|
package/dist/refresh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type { Adapter, AdapterFailure, Authorization, RefreshPage } from './adapter.js';\nimport {
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type { AttachedModelBinding } from './model.js';\nimport type { Adapter, AdapterFailure, Authorization, RefreshPage } from './adapter.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | Unconfirmed\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n binding: AttachedModelBinding | null,\n): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n });\n if (first.kind !== 'net-advancement') return first;\n const roomVersion = first.roomVersion;\n const documents: Record<string, string> = { ...confirmed.record.documents };\n const revisions: Record<string, string> = { ...confirmed.record.revisions };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const stage = (page: RefreshPage) => {\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) binaryTargets.delete(path);\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n binaryTargets.add(target);\n }\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n pageToken,\n });\n if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;\n if (page.kind !== 'net-advancement') return page;\n if (page.roomVersion !== roomVersion) return unconfirmed;\n stage(page);\n pageToken = page.pageToken;\n }\n const advanced = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n },\n binding,\n );\n return advanced === null ? unconfirmed : { kind: 'advanced', confirmed: advanced };\n}\n"],"names":["readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","binding","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","kind","documents","revisions","binaryTargets","Set","stage","page","Object","assign","path","keys","delete","target","add","removals","pageToken","undefined","advanced","sort"],"mappings":"AAEA,SAASA,UAAU,QAA6B,eAAe;AAC/D,SAASC,WAAW,QAA0B,gBAAgB;AAS9D,OAAO,eAAeC,YACpBC,OAAgB,EAChBC,aAA4B,EAC5BC,SAAyB,EACzBC,OAAoC;IAEpC,MAAMC,UAAUF,UAAUG,MAAM,CAACD,OAAO;IACxC,MAAME,kBAAkBJ,UAAUG,MAAM,CAACE,WAAW;IACpD,MAAMC,QAAQ,MAAMR,QAAQS,OAAO,CAACR,eAAe;QACjDG;QACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;QAC7CJ;IACF;IACA,IAAIE,MAAMI,IAAI,KAAK,mBAAmB,OAAOJ;IAC7C,MAAMD,cAAcC,MAAMD,WAAW;IACrC,MAAMM,YAAoC;QAAE,GAAGX,UAAUG,MAAM,CAACQ,SAAS;IAAC;IAC1E,MAAMC,YAAoC;QAAE,GAAGZ,UAAUG,MAAM,CAACS,SAAS;IAAC;IAC1E,MAAMC,gBAAgB,IAAIC,IAAId,UAAUG,MAAM,CAACU,aAAa;IAC5D,MAAME,QAAQ,CAACC;QACbC,OAAOC,MAAM,CAACP,WAAWK,KAAKL,SAAS;QACvCM,OAAOC,MAAM,CAACN,WAAWI,KAAKJ,SAAS;QACvC,KAAK,MAAMO,QAAQF,OAAOG,IAAI,CAACJ,KAAKL,SAAS,EAAGE,cAAcQ,MAAM,CAACF;QACrE,KAAK,MAAMG,UAAUN,KAAKH,aAAa,CAAE;YACvC,OAAOF,SAAS,CAACW,OAAO;YACxB,OAAOV,SAAS,CAACU,OAAO;YACxBT,cAAcU,GAAG,CAACD;QACpB;QACA,KAAK,MAAMH,QAAQH,KAAKQ,QAAQ,CAAE;YAChC,OAAOb,SAAS,CAACQ,KAAK;YACtB,OAAOP,SAAS,CAACO,KAAK;YACtBN,cAAcQ,MAAM,CAACF;QACvB;IACF;IACAJ,MAAMT;IACN,IAAImB,YAAYnB,MAAMmB,SAAS;IAC/B,MAAOA,cAAcC,UAAW;QAC9B,MAAMV,OAAO,MAAMlB,QAAQS,OAAO,CAACR,eAAe;YAChDG;YACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;YAC7CJ;YACAqB;QACF;QACA,IAAIT,KAAKN,IAAI,KAAK,mBAAmBM,KAAKN,IAAI,KAAK,kBAAkB,OAAOd;QAC5E,IAAIoB,KAAKN,IAAI,KAAK,mBAAmB,OAAOM;QAC5C,IAAIA,KAAKX,WAAW,KAAKA,aAAa,OAAOT;QAC7CmB,MAAMC;QACNS,YAAYT,KAAKS,SAAS;IAC5B;IACA,MAAME,WAAWhC,WACf;QACE,GAAGK,UAAUG,MAAM;QACnBE;QACAM;QACAE,eAAe;eAAIA;SAAc,CAACe,IAAI;QACtChB;IACF,GACAX;IAEF,OAAO0B,aAAa,OAAO/B,cAAc;QAAEc,MAAM;QAAYV,WAAW2B;IAAS;AACnF"}
|
package/dist/replica.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { AttachedModelBinding } from './model.js';
|
|
1
2
|
import { type ChangeBatch } from './change.js';
|
|
2
|
-
import { type Collection } from './collection.js';
|
|
3
|
+
import { type Collection, type Composition } from './collection.js';
|
|
3
4
|
import { type Layer } from './overlay.js';
|
|
4
5
|
import type { ReplicaRecord } from './store.js';
|
|
5
6
|
export type ConfirmedLayer = {
|
|
@@ -14,7 +15,9 @@ export type Replica = {
|
|
|
14
15
|
queue: readonly ChangeBatch[];
|
|
15
16
|
visible: VisibleLayer;
|
|
16
17
|
};
|
|
18
|
+
export declare function compositionOf(record: ReplicaRecord): Composition;
|
|
17
19
|
export declare function readConfirmed(record: ReplicaRecord): ConfirmedLayer | null;
|
|
18
|
-
export declare function
|
|
20
|
+
export declare function readStaged(record: ReplicaRecord, binding: AttachedModelBinding | null): ConfirmedLayer | null;
|
|
21
|
+
export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], roomVersion: string, binding: AttachedModelBinding | null): ConfirmedLayer | null;
|
|
19
22
|
export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): Replica;
|
|
20
23
|
//# sourceMappingURL=replica.d.ts.map
|
package/dist/replica.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,
|
|
1
|
+
{"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAW,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI,CAG1E;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAcvB;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAmBvB;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAuB3F"}
|
package/dist/replica.js
CHANGED
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
import { immutable } from './change.js';
|
|
2
|
-
import { parseCollection, readCollection } from './collection.js';
|
|
2
|
+
import { parseCollection, readCollection, validateCollection } from './collection.js';
|
|
3
3
|
import { overlay } from './overlay.js';
|
|
4
|
+
export function compositionOf(record) {
|
|
5
|
+
return {
|
|
6
|
+
collectionRoot: record.collectionRoot,
|
|
7
|
+
model: record.model,
|
|
8
|
+
selection: record.typedSelection === null ? null : {
|
|
9
|
+
roots: record.typedSelection.roots,
|
|
10
|
+
model: record.selectionModel
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
}
|
|
4
14
|
export function readConfirmed(record) {
|
|
5
|
-
const collection = readCollection(record.documents, record
|
|
15
|
+
const collection = readCollection(record.documents, compositionOf(record));
|
|
6
16
|
return collection === null ? null : {
|
|
7
17
|
record,
|
|
8
18
|
collection
|
|
9
19
|
};
|
|
10
20
|
}
|
|
11
|
-
export function
|
|
21
|
+
export function readStaged(record, binding) {
|
|
22
|
+
if (binding !== null && (record.model.status === 'current' || record.selectionModel.status === 'current')) {
|
|
23
|
+
const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record), binding);
|
|
24
|
+
if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') return null;
|
|
25
|
+
}
|
|
26
|
+
return readConfirmed(record);
|
|
27
|
+
}
|
|
28
|
+
export function applyReturned(confirmed, documents, revisions, removals, roomVersion, binding) {
|
|
12
29
|
const nextDocuments = {
|
|
13
30
|
...confirmed.record.documents,
|
|
14
31
|
...documents
|
|
@@ -23,7 +40,7 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
|
|
|
23
40
|
delete nextRevisions[path];
|
|
24
41
|
binaryTargets.delete(path);
|
|
25
42
|
}
|
|
26
|
-
return
|
|
43
|
+
return readStaged({
|
|
27
44
|
...confirmed.record,
|
|
28
45
|
roomVersion,
|
|
29
46
|
documents: nextDocuments,
|
|
@@ -31,7 +48,7 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
|
|
|
31
48
|
binaryTargets: [
|
|
32
49
|
...binaryTargets
|
|
33
50
|
].sort()
|
|
34
|
-
});
|
|
51
|
+
}, binding);
|
|
35
52
|
}
|
|
36
53
|
export function replicaOf(confirmed, queue) {
|
|
37
54
|
const batches = Object.freeze(queue.map(immutable));
|
|
@@ -53,7 +70,7 @@ export function replicaOf(confirmed, queue) {
|
|
|
53
70
|
queue: batches,
|
|
54
71
|
visible: {
|
|
55
72
|
...layer,
|
|
56
|
-
collection: parseCollection(layer.documents)
|
|
73
|
+
collection: parseCollection(layer.documents, compositionOf(confirmed.record))
|
|
57
74
|
}
|
|
58
75
|
};
|
|
59
76
|
}
|
package/dist/replica.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { immutable, type ChangeBatch } from './change.js';\nimport {
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import type { AttachedModelBinding } from './model.js';\nimport { immutable, type ChangeBatch } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, type Layer } from './overlay.js';\nimport type { ReplicaRecord } from './store.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n};\n\nexport function compositionOf(record: ReplicaRecord): Composition {\n return {\n collectionRoot: record.collectionRoot,\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\n };\n}\n\nexport function readConfirmed(record: ReplicaRecord): ConfirmedLayer | null {\n const collection = readCollection(record.documents, compositionOf(record));\n return collection === null ? null : { record, collection };\n}\n\nexport function readStaged(\n record: ReplicaRecord,\n binding: AttachedModelBinding | null,\n): ConfirmedLayer | null {\n if (\n binding !== null &&\n (record.model.status === 'current' || record.selectionModel.status === 'current')\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n binding,\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') return null;\n }\n return readConfirmed(record);\n}\n\nexport function applyReturned(\n confirmed: ConfirmedLayer,\n documents: Readonly<Record<string, string>>,\n revisions: Readonly<Record<string, string>>,\n removals: readonly string[],\n roomVersion: string,\n binding: AttachedModelBinding | null,\n): ConfirmedLayer | null {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n binaryTargets: [...binaryTargets].sort(),\n },\n binding,\n );\n}\n\nexport function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n collection: confirmed.collection,\n },\n };\n }\n const layer = overlay(confirmed.record, batches);\n return {\n confirmed,\n queue: batches,\n visible: {\n ...layer,\n collection: parseCollection(layer.documents, compositionOf(confirmed.record)),\n },\n };\n}\n"],"names":["immutable","parseCollection","readCollection","validateCollection","overlay","compositionOf","record","collectionRoot","model","selection","typedSelection","roots","selectionModel","readConfirmed","collection","documents","readStaged","binding","status","verdict","binaryTargets","rule","applyReturned","confirmed","revisions","removals","roomVersion","nextDocuments","nextRevisions","Set","path","delete","sort","replicaOf","queue","batches","Object","freeze","map","length","visible","layer"],"mappings":"AACA,SAASA,SAAS,QAA0B,cAAc;AAC1D,SACEC,eAAe,EACfC,cAAc,EACdC,kBAAkB,QAGb,kBAAkB;AACzB,SAASC,OAAO,QAAoB,eAAe;AAkBnD,OAAO,SAASC,cAAcC,MAAqB;IACjD,OAAO;QACLC,gBAAgBD,OAAOC,cAAc;QACrCC,OAAOF,OAAOE,KAAK;QACnBC,WACEH,OAAOI,cAAc,KAAK,OACtB,OACA;YAAEC,OAAOL,OAAOI,cAAc,CAACC,KAAK;YAAEH,OAAOF,OAAOM,cAAc;QAAC;IAC3E;AACF;AAEA,OAAO,SAASC,cAAcP,MAAqB;IACjD,MAAMQ,aAAaZ,eAAeI,OAAOS,SAAS,EAAEV,cAAcC;IAClE,OAAOQ,eAAe,OAAO,OAAO;QAAER;QAAQQ;IAAW;AAC3D;AAEA,OAAO,SAASE,WACdV,MAAqB,EACrBW,OAAoC;IAEpC,IACEA,YAAY,QACXX,CAAAA,OAAOE,KAAK,CAACU,MAAM,KAAK,aAAaZ,OAAOM,cAAc,CAACM,MAAM,KAAK,SAAQ,GAC/E;QACA,MAAMC,UAAUhB,mBACdG,OAAOS,SAAS,EAChBT,OAAOc,aAAa,EACpBf,cAAcC,SACdW;QAEF,IAAIE,QAAQA,OAAO,KAAK,YAAYA,QAAQE,IAAI,KAAK,qBAAqB,OAAO;IACnF;IACA,OAAOR,cAAcP;AACvB;AAEA,OAAO,SAASgB,cACdC,SAAyB,EACzBR,SAA2C,EAC3CS,SAA2C,EAC3CC,QAA2B,EAC3BC,WAAmB,EACnBT,OAAoC;IAEpC,MAAMU,gBAAgB;QAAE,GAAGJ,UAAUjB,MAAM,CAACS,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMa,gBAAgB;QAAE,GAAGL,UAAUjB,MAAM,CAACkB,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMJ,gBAAgB,IAAIS,IAAIN,UAAUjB,MAAM,CAACc,aAAa;IAC5D,KAAK,MAAMU,QAAQL,SAAU;QAC3B,OAAOE,aAAa,CAACG,KAAK;QAC1B,OAAOF,aAAa,CAACE,KAAK;QAC1BV,cAAcW,MAAM,CAACD;IACvB;IACA,OAAOd,WACL;QACE,GAAGO,UAAUjB,MAAM;QACnBoB;QACAX,WAAWY;QACXH,WAAWI;QACXR,eAAe;eAAIA;SAAc,CAACY,IAAI;IACxC,GACAf;AAEJ;AAEA,OAAO,SAASgB,UAAUV,SAAyB,EAAEW,KAA6B;IAChF,MAAMC,UAAUC,OAAOC,MAAM,CAACH,MAAMI,GAAG,CAACtC;IACxC,IAAImC,QAAQI,MAAM,KAAK,GAAG;QACxB,OAAO;YACLhB;YACAW,OAAOC;YACPK,SAAS;gBACPzB,WAAWQ,UAAUjB,MAAM,CAACS,SAAS;gBACrCK,eAAeG,UAAUjB,MAAM,CAACc,aAAa;gBAC7CI,WAAWD,UAAUjB,MAAM,CAACkB,SAAS;gBACrCV,YAAYS,UAAUT,UAAU;YAClC;QACF;IACF;IACA,MAAM2B,QAAQrC,QAAQmB,UAAUjB,MAAM,EAAE6B;IACxC,OAAO;QACLZ;QACAW,OAAOC;QACPK,SAAS;YACP,GAAGC,KAAK;YACR3B,YAAYb,gBAAgBwC,MAAM1B,SAAS,EAAEV,cAAckB,UAAUjB,MAAM;QAC7E;IACF;AACF"}
|
package/dist/save.d.ts
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
|
+
import type { AttachedModelBinding } from './model.js';
|
|
1
2
|
import type { ProviderLimit } from './adapter.js';
|
|
2
3
|
import { type Change, type ChangeBatch } from './change.js';
|
|
4
|
+
import { type Composition } from './collection.js';
|
|
3
5
|
import type { VisibleLayer } from './replica.js';
|
|
4
6
|
export type SaveRefusal = {
|
|
7
|
+
source?: 'model';
|
|
5
8
|
rule: string;
|
|
6
9
|
file?: string;
|
|
7
10
|
location?: string;
|
|
8
11
|
referrers?: readonly string[];
|
|
9
12
|
};
|
|
10
13
|
export type SaveInput = {
|
|
14
|
+
composition: Composition;
|
|
11
15
|
baseRoomVersion: string;
|
|
12
|
-
|
|
16
|
+
operations: import('./adapter.js').OperationScopes;
|
|
17
|
+
binding: AttachedModelBinding | null;
|
|
13
18
|
providerOwnedPaths: readonly string[];
|
|
14
19
|
providerLimits: readonly ProviderLimit[];
|
|
15
20
|
visible: VisibleLayer;
|
package/dist/save.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,YAAY,CAAC;AAEnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAML,KAAK,WAAW,EAEjB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,OAAO,cAAc,EAAE,eAAe,CAAC;IACnD,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,OAAO,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC;AA2Y9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAmGxD"}
|
package/dist/save.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { apply, links,
|
|
1
|
+
import { apply, links, parse, serialize } from '@agentshouse/mdmodel';
|
|
2
2
|
import { immutable } from './change.js';
|
|
3
|
-
import { parseCollection } from './collection.js';
|
|
3
|
+
import { governing, parseCollection, typesAt, validateCollection } from './collection.js';
|
|
4
|
+
import { changeBatchIdentity } from './identity.js';
|
|
4
5
|
import { overlay } from './overlay.js';
|
|
5
6
|
import { beneath, covered, normalize, relative, resolve } from './paths.js';
|
|
6
7
|
function refuse(rule, file, location) {
|
|
@@ -215,7 +216,7 @@ function rewrites(changes, visible) {
|
|
|
215
216
|
for (const [path, document] of Object.entries(visible.collection.documents)){
|
|
216
217
|
if (settled.has(path)) continue;
|
|
217
218
|
const moved = moves.get(path) ?? path;
|
|
218
|
-
const definition = definitionOf(visible.collection.
|
|
219
|
+
const definition = definitionOf(typesAt(visible.collection.composition, path), document.type);
|
|
219
220
|
for (const [name, spec] of Object.entries(definition?.fields ?? {})){
|
|
220
221
|
if (!referenceField(spec) || settled.has(`${path} ${name}`)) continue;
|
|
221
222
|
const value = retarget(document.fields[name], path, moved, moves);
|
|
@@ -269,7 +270,7 @@ function incoming(collection, removed) {
|
|
|
269
270
|
found.set(target, referrers);
|
|
270
271
|
};
|
|
271
272
|
for (const [path, document] of Object.entries(collection.documents)){
|
|
272
|
-
const definition = definitionOf(collection.
|
|
273
|
+
const definition = definitionOf(typesAt(collection.composition, path), document.type);
|
|
273
274
|
for (const [name, spec] of Object.entries(definition?.fields ?? {})){
|
|
274
275
|
if (!referenceField(spec)) continue;
|
|
275
276
|
for (const target of targets(document.fields[name], path))note(target, path);
|
|
@@ -301,19 +302,34 @@ function affected(change) {
|
|
|
301
302
|
change.path
|
|
302
303
|
];
|
|
303
304
|
}
|
|
305
|
+
function definitionAddresses(composition) {
|
|
306
|
+
const addresses = new Set();
|
|
307
|
+
if (composition.model.status !== 'unavailable') {
|
|
308
|
+
for (const path of Object.keys(composition.model.snapshot.definitions))addresses.add(path);
|
|
309
|
+
}
|
|
310
|
+
if (composition.selection !== null && composition.selection.model.status !== 'unavailable') {
|
|
311
|
+
for (const path of Object.keys(composition.selection.model.snapshot.definitions)){
|
|
312
|
+
addresses.add(path);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return addresses;
|
|
316
|
+
}
|
|
304
317
|
function guard(changes, input) {
|
|
305
318
|
const existing = new Set([
|
|
306
319
|
...Object.keys(input.visible.documents),
|
|
307
320
|
...input.visible.binaryTargets
|
|
308
321
|
]);
|
|
322
|
+
const definitions = definitionAddresses(input.composition);
|
|
309
323
|
for (const change of changes){
|
|
310
324
|
for (const path of affected(change)){
|
|
311
325
|
const normalized = normalize(path);
|
|
312
326
|
if (normalized === null || normalized === '') return refuse('room-root', path);
|
|
327
|
+
if (definitions.has(normalized)) return refuse('model-definition', normalized);
|
|
313
328
|
if (covered(input.providerOwnedPaths, normalized)) {
|
|
314
329
|
return refuse('provider-owned-path', normalized);
|
|
315
330
|
}
|
|
316
|
-
|
|
331
|
+
const operation = change.kind === 'remove' ? 'delete' : 'write';
|
|
332
|
+
if (!covered(input.operations[operation], normalized)) return refuse(`${operation}-grant`, normalized);
|
|
317
333
|
}
|
|
318
334
|
if (change.kind === 'create') {
|
|
319
335
|
if (existing.has(change.path)) return refuse('path-collision', change.path);
|
|
@@ -440,6 +456,8 @@ function exceeded(limits, changes, resulting) {
|
|
|
440
456
|
return null;
|
|
441
457
|
}
|
|
442
458
|
export function buildBatch(input) {
|
|
459
|
+
const structural = input.changes.find((change)=>change.kind === 'move' || change.kind === 'remove');
|
|
460
|
+
if (structural !== undefined && Object.entries(input.visible.collection.documents).some(([path, document])=>document.type !== undefined && document.type !== 'any' && governing(input.composition, path).status === 'unavailable')) return refuse('model-unavailable', structural.path);
|
|
443
461
|
const expanded = expand(input.changes, input.visible);
|
|
444
462
|
if (expanded.kind === 'refused') return expanded;
|
|
445
463
|
const rewritten = rewrites(expanded.changes, input.visible);
|
|
@@ -459,16 +477,31 @@ export function buildBatch(input) {
|
|
|
459
477
|
]);
|
|
460
478
|
const removed = new Set(changes.filter((change)=>change.kind === 'remove').map((change)=>change.path));
|
|
461
479
|
if (removed.size > 0) {
|
|
462
|
-
const referenced = incoming(parseCollection(resulting.documents), removed);
|
|
480
|
+
const referenced = incoming(parseCollection(resulting.documents, input.composition), removed);
|
|
463
481
|
if (referenced !== null) return referenced;
|
|
464
482
|
}
|
|
465
|
-
const
|
|
466
|
-
|
|
467
|
-
|
|
483
|
+
const typed = (content)=>{
|
|
484
|
+
if (content === undefined) return false;
|
|
485
|
+
const parsed = parse(content);
|
|
486
|
+
return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';
|
|
487
|
+
};
|
|
488
|
+
const typedPaths = [
|
|
489
|
+
...new Set(changes.flatMap(affected))
|
|
490
|
+
].filter((path)=>typed(input.visible.documents[path]) || typed(resulting.documents[path]));
|
|
491
|
+
const needsModel = typedPaths.length > 0;
|
|
492
|
+
const withoutModel = typedPaths.find((path)=>governing(input.composition, path).status === 'unavailable');
|
|
493
|
+
if (needsModel && (withoutModel !== undefined || input.binding === null)) {
|
|
494
|
+
return refuse('model-unavailable', withoutModel ?? typedPaths[0]);
|
|
495
|
+
}
|
|
496
|
+
const validationText = needsModel ? resulting.documents : Object.fromEntries(Object.entries(resulting.documents).filter(([path])=>changes.some((change)=>affected(change).includes(path))));
|
|
497
|
+
const verdict = validateCollection(validationText, resulting.binaryTargets, input.composition, input.binding);
|
|
468
498
|
if (verdict.verdict === 'refuse') {
|
|
469
499
|
return {
|
|
470
500
|
kind: 'refused',
|
|
471
501
|
refusal: {
|
|
502
|
+
...verdict.source === 'model' ? {
|
|
503
|
+
source: 'model'
|
|
504
|
+
} : {},
|
|
472
505
|
rule: verdict.rule,
|
|
473
506
|
file: verdict.file,
|
|
474
507
|
...verdict.location === undefined ? {} : {
|
|
@@ -482,13 +515,21 @@ export function buildBatch(input) {
|
|
|
482
515
|
}
|
|
483
516
|
const limited = exceeded(input.providerLimits, changes, resulting);
|
|
484
517
|
if (limited !== null) return limited;
|
|
518
|
+
const validated = typedPaths.map((path)=>governing(input.composition, path)).find((model)=>model.status !== 'unavailable');
|
|
485
519
|
return {
|
|
486
520
|
kind: 'batch',
|
|
487
521
|
batch: immutable({
|
|
488
|
-
id:
|
|
522
|
+
id: changeBatchIdentity(),
|
|
489
523
|
baseRoomVersion: input.baseRoomVersion,
|
|
490
524
|
changes,
|
|
491
|
-
preconditions
|
|
525
|
+
preconditions,
|
|
526
|
+
...validated === undefined ? {} : {
|
|
527
|
+
validation: {
|
|
528
|
+
identity: validated.snapshot.identity,
|
|
529
|
+
version: validated.snapshot.version,
|
|
530
|
+
source: validated.status
|
|
531
|
+
}
|
|
532
|
+
}
|
|
492
533
|
})
|
|
493
534
|
};
|
|
494
535
|
}
|
package/dist/save.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/save.ts"],"sourcesContent":["import { apply, links, serialize, validate, type Document } from '@agentshouse/mdmodel';\nimport type { ProviderLimit } from './adapter.js';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport { parseCollection, type Collection, type MdType } from './collection.js';\nimport { overlay, type Layer } from './overlay.js';\nimport { beneath, covered, normalize, relative, resolve } from './paths.js';\nimport type { VisibleLayer } from './replica.js';\n\nexport type SaveRefusal = {\n rule: string;\n file?: string;\n location?: string;\n referrers?: readonly string[];\n};\n\nexport type SaveInput = {\n baseRoomVersion: string;\n writeGrants: readonly string[];\n providerOwnedPaths: readonly string[];\n providerLimits: readonly ProviderLimit[];\n visible: VisibleLayer;\n changes: readonly Change[];\n};\n\nexport type BatchResult =\n | { kind: 'batch'; batch: ChangeBatch }\n | { kind: 'refused'; refusal: SaveRefusal };\n\ntype Structural = { kind: 'move'; path: string; to: string } | { kind: 'remove'; path: string };\n\ntype Expansion =\n | { kind: 'changes'; changes: readonly Change[] }\n | { kind: 'refused'; refusal: SaveRefusal };\n\nfunction refuse(rule: string, file?: string, location?: string): BatchResult {\n return {\n kind: 'refused',\n refusal: {\n rule,\n ...(file === undefined ? {} : { file }),\n ...(location === undefined ? {} : { location }),\n },\n };\n}\n\nfunction members(visible: Layer, prefix: string): readonly string[] {\n return [...Object.keys(visible.documents), ...visible.binaryTargets]\n .filter((path) => beneath(prefix, path))\n .sort();\n}\n\nfunction spread(change: Structural, path: string, member: string): Change {\n if (change.kind === 'remove') return { kind: 'remove', path: member };\n return { kind: 'move', path: member, to: `${change.to}${member.slice(path.length)}` };\n}\n\nfunction expand(changes: readonly Change[], visible: VisibleLayer): Expansion {\n const expanded: Change[] = [];\n for (const change of changes) {\n if (change.kind !== 'move' && change.kind !== 'remove') {\n expanded.push(change);\n continue;\n }\n const path = normalize(change.path);\n const to = change.kind === 'move' ? normalize(change.to) : '';\n if (path === null || path === '' || to === null || (change.kind === 'move' && to === '')) {\n return { kind: 'refused', refusal: { rule: 'room-root', file: change.path } };\n }\n const structural = change.kind === 'move' ? { ...change, path, to } : { ...change, path };\n const present = visible.documents[path] !== undefined || visible.binaryTargets.includes(path);\n if (present) {\n expanded.push(structural);\n continue;\n }\n const beneathIt = members(visible, path);\n if (beneathIt.length === 0) {\n return { kind: 'refused', refusal: { rule: 'path-absent', file: change.path } };\n }\n for (const member of beneathIt) expanded.push(spread(structural, path, member));\n }\n return { kind: 'changes', changes: expanded };\n}\n\nfunction referenceField(spec: unknown): boolean {\n if (typeof spec !== 'object' || spec === null) return false;\n const declared = spec as { kind?: unknown; of?: unknown };\n return declared.kind === 'reference' || (declared.kind === 'list' && declared.of === 'reference');\n}\n\nfunction definitionOf(types: readonly MdType[], type: string | undefined) {\n return types.find((declared) => declared.name === type);\n}\n\nfunction retarget(\n value: unknown,\n from: string,\n to: string,\n moves: ReadonlyMap<string, string>,\n): unknown {\n if (Array.isArray(value)) {\n const next = value.map((item) => retarget(item, from, to, moves) ?? item);\n return next.some((item, index) => item !== value[index]) ? next : undefined;\n }\n if (typeof value !== 'string') return undefined;\n const target = resolve(from, value);\n if (target === null) return undefined;\n const next = relative(to, moves.get(target) ?? target);\n return next === value ? undefined : next;\n}\n\nfunction edited(document: Document, path: string, changes: readonly Change[]): Document {\n let next = document;\n for (const change of changes) {\n if (change.path !== path) continue;\n if (change.kind !== 'section' && change.kind !== 'preamble') continue;\n const applied = apply(\n next,\n change.kind === 'preamble'\n ? { kind: 'preamble', value: change.value, prior: next.preamble }\n : {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: next.sections[change.name],\n },\n );\n if (applied.outcome === 'applied') next = applied.document;\n }\n return next;\n}\n\nfunction bodies(path: string, before: Document, after: Document): readonly Change[] {\n const changes: Change[] = [];\n if (after.preamble !== before.preamble) {\n changes.push({ kind: 'preamble', path, value: after.preamble });\n }\n for (const [name, value] of Object.entries(after.sections)) {\n if (before.sections[name] === value) continue;\n changes.push({ kind: 'section', path, name, value });\n }\n return changes;\n}\n\nfunction relinks(\n path: string,\n moved: string,\n before: Document,\n moves: ReadonlyMap<string, string>,\n): Expansion {\n let after = before;\n for (const link of links(before, path)) {\n const destination = moves.get(link.target) ?? link.target;\n if (destination === link.target && moved === path) continue;\n const to = relative(moved, destination);\n if (to === relative(path, link.target)) continue;\n const applied = apply(after, { kind: 'link', href: link.href, to });\n if (applied.outcome === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: applied.refusal.rule,\n file: path,\n ...(applied.refusal.location === undefined ? {} : { location: applied.refusal.location }),\n },\n };\n }\n after = applied.document;\n }\n if (after === before) return { kind: 'changes', changes: [] };\n if (before.type === undefined) {\n return { kind: 'changes', changes: [{ kind: 'replace', path, content: serialize(after) }] };\n }\n return { kind: 'changes', changes: bodies(path, before, after) };\n}\n\nfunction subsumed(merged: Change[], path: string) {\n for (let index = merged.length - 1; index >= 0; index -= 1) {\n const item = merged[index];\n if (item.path !== path) continue;\n if (item.kind === 'section' || item.kind === 'preamble') merged.splice(index, 1);\n }\n}\n\nfunction rewrites(changes: readonly Change[], visible: VisibleLayer): Expansion {\n const moves = new Map<string, string>();\n const settled = new Set<string>();\n for (const change of changes) {\n if (change.kind === 'move') moves.set(change.path, change.to);\n if (change.kind === 'remove' || change.kind === 'replace' || change.kind === 'create') {\n settled.add(change.path);\n }\n if (change.kind === 'field') settled.add(`${change.path} ${change.name}`);\n }\n if (moves.size === 0) return { kind: 'changes', changes };\n const merged = [...changes];\n const added: Change[] = [];\n for (const [path, document] of Object.entries(visible.collection.documents)) {\n if (settled.has(path)) continue;\n const moved = moves.get(path) ?? path;\n const definition = definitionOf(visible.collection.types, document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec) || settled.has(`${path} ${name}`)) continue;\n const value = retarget(document.fields[name], path, moved, moves);\n if (value === undefined) continue;\n added.push({ kind: 'field', path, name, value });\n }\n const relinked = relinks(path, moved, edited(document, path, merged), moves);\n if (relinked.kind === 'refused') return relinked;\n for (const change of relinked.changes) {\n if (change.kind === 'replace') {\n subsumed(merged, path);\n added.push(change);\n continue;\n }\n const index = merged.findIndex(\n (item) =>\n item.kind === change.kind &&\n item.path === path &&\n (change.kind !== 'section' || (item.kind === 'section' && item.name === change.name)),\n );\n if (index === -1) added.push(change);\n else merged[index] = change;\n }\n }\n return { kind: 'changes', changes: [...added, ...merged] };\n}\n\nfunction targets(value: unknown, from: string): readonly string[] {\n const values = Array.isArray(value) ? value : [value];\n const resolved: string[] = [];\n for (const item of values) {\n if (typeof item !== 'string') continue;\n const target = resolve(from, item);\n if (target !== null) resolved.push(target);\n }\n return resolved;\n}\n\nfunction incoming(collection: Collection, removed: ReadonlySet<string>): BatchResult | null {\n const found = new Map<string, Set<string>>();\n const note = (target: string, file: string) => {\n if (!removed.has(target)) return;\n const referrers = found.get(target) ?? new Set<string>();\n referrers.add(file);\n found.set(target, referrers);\n };\n for (const [path, document] of Object.entries(collection.documents)) {\n const definition = definitionOf(collection.types, document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec)) continue;\n for (const target of targets(document.fields[name], path)) note(target, path);\n }\n for (const link of links(document, path)) note(link.target, path);\n }\n const [first] = [...found.keys()].sort();\n if (first === undefined) return null;\n const every = new Set<string>();\n for (const referrers of found.values()) for (const file of referrers) every.add(file);\n return {\n kind: 'refused',\n refusal: { rule: 'referenced-missing-file', file: first, referrers: [...every].sort() },\n };\n}\n\nfunction affected(change: Change): readonly string[] {\n return change.kind === 'move' ? [change.path, change.to] : [change.path];\n}\n\nfunction guard(changes: readonly Change[], input: SaveInput): BatchResult | null {\n const existing = new Set([\n ...Object.keys(input.visible.documents),\n ...input.visible.binaryTargets,\n ]);\n for (const change of changes) {\n for (const path of affected(change)) {\n const normalized = normalize(path);\n if (normalized === null || normalized === '') return refuse('room-root', path);\n if (covered(input.providerOwnedPaths, normalized)) {\n return refuse('provider-owned-path', normalized);\n }\n if (!covered(input.writeGrants, normalized)) return refuse('write-grant', normalized);\n }\n if (change.kind === 'create') {\n if (existing.has(change.path)) return refuse('path-collision', change.path);\n existing.add(change.path);\n continue;\n }\n if (change.kind === 'move') {\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (existing.has(change.to)) return refuse('path-collision', change.to);\n existing.delete(change.path);\n existing.add(change.to);\n continue;\n }\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (change.kind === 'remove') {\n existing.delete(change.path);\n continue;\n }\n if (change.kind === 'replace') {\n if (input.visible.revisions[change.path] === undefined) {\n return refuse('unknown-revision', change.path);\n }\n continue;\n }\n const document = input.visible.collection.documents[change.path];\n if (document === undefined) return refuse('path-absent', change.path);\n if (change.kind === 'section' && document.sections[change.name] === undefined) {\n return refuse('required-section', change.path, change.name);\n }\n }\n return null;\n}\n\nfunction existence(visible: VisibleLayer, path: string): Precondition {\n const revision = visible.revisions[path];\n return revision === undefined ? { kind: 'present', path } : { kind: 'revision', path, revision };\n}\n\nfunction preconditionsOf(\n changes: readonly Change[],\n visible: VisibleLayer,\n): readonly Precondition[] {\n const preconditions: Precondition[] = [];\n const seen = new Set<string>();\n const add = (precondition: Precondition) => {\n const part =\n precondition.kind === 'field' || precondition.kind === 'section' ? precondition.name : '';\n const identity = `${precondition.kind} ${precondition.path} ${part}`;\n if (seen.has(identity)) return;\n seen.add(identity);\n preconditions.push(precondition);\n };\n for (const change of changes) {\n if (change.kind === 'field') {\n const document = visible.collection.documents[change.path];\n add({\n kind: 'field',\n path: change.path,\n name: change.name,\n value: document.fields[change.name],\n });\n continue;\n }\n if (change.kind === 'section') {\n const document = visible.collection.documents[change.path];\n add({\n kind: 'section',\n path: change.path,\n name: change.name,\n value: document.sections[change.name],\n });\n continue;\n }\n if (change.kind === 'preamble') {\n const document = visible.collection.documents[change.path];\n add({ kind: 'preamble', path: change.path, value: document.preamble });\n continue;\n }\n if (change.kind === 'create') {\n add({ kind: 'absent', path: change.path });\n continue;\n }\n add(existence(visible, change.path));\n if (change.kind === 'move') add({ kind: 'absent', path: change.to });\n }\n return preconditions;\n}\n\nfunction depth(path: string) {\n return path.split('/').length;\n}\n\nfunction exceeded(\n limits: readonly ProviderLimit[],\n changes: readonly Change[],\n resulting: Layer,\n): BatchResult | null {\n const written = changes.map((change) => (change.kind === 'move' ? change.to : change.path));\n const created = changes\n .filter((change) => change.kind === 'create' || change.kind === 'move')\n .map((change) => (change.kind === 'move' ? change.to : change.path));\n for (const limit of limits) {\n const value = limit.value;\n if (typeof value !== 'number') continue;\n if (limit.name === 'change-batch-operations' && changes.length > value) {\n return refuse('provider-limit', undefined, limit.name);\n }\n if (limit.name === 'document-size') {\n const large = written.find((path) => (resulting.documents[path] ?? '').length > value);\n if (large !== undefined) return refuse('provider-limit', large, limit.name);\n }\n if (limit.name === 'path-length') {\n const long = created.find((path) => path.length > value);\n if (long !== undefined) return refuse('provider-limit', long, limit.name);\n }\n if (limit.name === 'path-depth') {\n const deep = created.find((path) => depth(path) > value);\n if (deep !== undefined) return refuse('provider-limit', deep, limit.name);\n }\n }\n return null;\n}\n\nexport function buildBatch(input: SaveInput): BatchResult {\n const expanded = expand(input.changes, input.visible);\n if (expanded.kind === 'refused') return expanded;\n const rewritten = rewrites(expanded.changes, input.visible);\n if (rewritten.kind === 'refused') return rewritten;\n const changes = rewritten.changes;\n if (changes.length === 0) return refuse('no-change');\n const refusal = guard(changes, input);\n if (refusal !== null) return refusal;\n const preconditions = preconditionsOf(changes, input.visible);\n const resulting = overlay(input.visible, [\n { id: '', baseRoomVersion: input.baseRoomVersion, changes, preconditions },\n ]);\n const removed = new Set(\n changes.filter((change) => change.kind === 'remove').map((change) => change.path),\n );\n if (removed.size > 0) {\n const referenced = incoming(parseCollection(resulting.documents), removed);\n if (referenced !== null) return referenced;\n }\n const verdict = validate(resulting.documents, { binaryTargets: resulting.binaryTargets });\n if (verdict.verdict === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: verdict.rule,\n file: verdict.file,\n ...(verdict.location === undefined ? {} : { location: verdict.location }),\n ...(verdict.referrers === undefined ? {} : { referrers: verdict.referrers }),\n },\n };\n }\n const limited = exceeded(input.providerLimits, changes, resulting);\n if (limited !== null) return limited;\n return {\n kind: 'batch',\n batch: immutable({\n id: crypto.randomUUID(),\n baseRoomVersion: input.baseRoomVersion,\n changes,\n preconditions,\n }),\n };\n}\n"],"names":["apply","links","serialize","validate","immutable","parseCollection","overlay","beneath","covered","normalize","relative","resolve","refuse","rule","file","location","kind","refusal","undefined","members","visible","prefix","Object","keys","documents","binaryTargets","filter","path","sort","spread","change","member","to","slice","length","expand","changes","expanded","push","structural","present","includes","beneathIt","referenceField","spec","declared","of","definitionOf","types","type","find","name","retarget","value","from","moves","Array","isArray","next","map","item","some","index","target","get","edited","document","applied","prior","preamble","sections","outcome","bodies","before","after","entries","relinks","moved","link","destination","href","content","subsumed","merged","splice","rewrites","Map","settled","Set","set","add","size","added","collection","has","definition","fields","relinked","findIndex","targets","values","resolved","incoming","removed","found","note","referrers","first","every","affected","guard","input","existing","normalized","providerOwnedPaths","writeGrants","delete","revisions","existence","revision","preconditionsOf","preconditions","seen","precondition","part","identity","depth","split","exceeded","limits","resulting","written","created","limit","large","long","deep","buildBatch","rewritten","id","baseRoomVersion","referenced","verdict","limited","providerLimits","batch","crypto","randomUUID"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/save.ts"],"sourcesContent":["import type { AttachedModelBinding, ModelState } from './model.js';\nimport { apply, links, parse, serialize, type Document } from '@agentshouse/mdmodel';\nimport type { ProviderLimit } from './adapter.js';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport {\n governing,\n parseCollection,\n typesAt,\n validateCollection,\n type Collection,\n type Composition,\n type MdType,\n} from './collection.js';\nimport { changeBatchIdentity } from './identity.js';\nimport { overlay, type Layer } from './overlay.js';\nimport { beneath, covered, normalize, relative, resolve } from './paths.js';\nimport type { VisibleLayer } from './replica.js';\n\nexport type SaveRefusal = {\n source?: 'model';\n rule: string;\n file?: string;\n location?: string;\n referrers?: readonly string[];\n};\n\nexport type SaveInput = {\n composition: Composition;\n baseRoomVersion: string;\n operations: import('./adapter.js').OperationScopes;\n binding: AttachedModelBinding | null;\n providerOwnedPaths: readonly string[];\n providerLimits: readonly ProviderLimit[];\n visible: VisibleLayer;\n changes: readonly Change[];\n};\n\nexport type BatchResult =\n | { kind: 'batch'; batch: ChangeBatch }\n | { kind: 'refused'; refusal: SaveRefusal };\n\ntype Structural = { kind: 'move'; path: string; to: string } | { kind: 'remove'; path: string };\n\ntype Expansion =\n | { kind: 'changes'; changes: readonly Change[] }\n | { kind: 'refused'; refusal: SaveRefusal };\n\nfunction refuse(rule: string, file?: string, location?: string): BatchResult {\n return {\n kind: 'refused',\n refusal: {\n rule,\n ...(file === undefined ? {} : { file }),\n ...(location === undefined ? {} : { location }),\n },\n };\n}\n\nfunction members(visible: Layer, prefix: string): readonly string[] {\n return [...Object.keys(visible.documents), ...visible.binaryTargets]\n .filter((path) => beneath(prefix, path))\n .sort();\n}\n\nfunction spread(change: Structural, path: string, member: string): Change {\n if (change.kind === 'remove') return { kind: 'remove', path: member };\n return { kind: 'move', path: member, to: `${change.to}${member.slice(path.length)}` };\n}\n\nfunction expand(changes: readonly Change[], visible: VisibleLayer): Expansion {\n const expanded: Change[] = [];\n for (const change of changes) {\n if (change.kind !== 'move' && change.kind !== 'remove') {\n expanded.push(change);\n continue;\n }\n const path = normalize(change.path);\n const to = change.kind === 'move' ? normalize(change.to) : '';\n if (path === null || path === '' || to === null || (change.kind === 'move' && to === '')) {\n return { kind: 'refused', refusal: { rule: 'room-root', file: change.path } };\n }\n const structural = change.kind === 'move' ? { ...change, path, to } : { ...change, path };\n const present = visible.documents[path] !== undefined || visible.binaryTargets.includes(path);\n if (present) {\n expanded.push(structural);\n continue;\n }\n const beneathIt = members(visible, path);\n if (beneathIt.length === 0) {\n return { kind: 'refused', refusal: { rule: 'path-absent', file: change.path } };\n }\n for (const member of beneathIt) expanded.push(spread(structural, path, member));\n }\n return { kind: 'changes', changes: expanded };\n}\n\nfunction referenceField(spec: unknown): boolean {\n if (typeof spec !== 'object' || spec === null) return false;\n const declared = spec as { kind?: unknown; of?: unknown };\n return declared.kind === 'reference' || (declared.kind === 'list' && declared.of === 'reference');\n}\n\nfunction definitionOf(types: readonly MdType[], type: string | undefined) {\n return types.find((declared) => declared.name === type);\n}\n\nfunction retarget(\n value: unknown,\n from: string,\n to: string,\n moves: ReadonlyMap<string, string>,\n): unknown {\n if (Array.isArray(value)) {\n const next = value.map((item) => retarget(item, from, to, moves) ?? item);\n return next.some((item, index) => item !== value[index]) ? next : undefined;\n }\n if (typeof value !== 'string') return undefined;\n const target = resolve(from, value);\n if (target === null) return undefined;\n const next = relative(to, moves.get(target) ?? target);\n return next === value ? undefined : next;\n}\n\nfunction edited(document: Document, path: string, changes: readonly Change[]): Document {\n let next = document;\n for (const change of changes) {\n if (change.path !== path) continue;\n if (change.kind !== 'section' && change.kind !== 'preamble') continue;\n const applied = apply(\n next,\n change.kind === 'preamble'\n ? { kind: 'preamble', value: change.value, prior: next.preamble }\n : {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: next.sections[change.name],\n },\n );\n if (applied.outcome === 'applied') next = applied.document;\n }\n return next;\n}\n\nfunction bodies(path: string, before: Document, after: Document): readonly Change[] {\n const changes: Change[] = [];\n if (after.preamble !== before.preamble) {\n changes.push({ kind: 'preamble', path, value: after.preamble });\n }\n for (const [name, value] of Object.entries(after.sections)) {\n if (before.sections[name] === value) continue;\n changes.push({ kind: 'section', path, name, value });\n }\n return changes;\n}\n\nfunction relinks(\n path: string,\n moved: string,\n before: Document,\n moves: ReadonlyMap<string, string>,\n): Expansion {\n let after = before;\n for (const link of links(before, path)) {\n const destination = moves.get(link.target) ?? link.target;\n if (destination === link.target && moved === path) continue;\n const to = relative(moved, destination);\n if (to === relative(path, link.target)) continue;\n const applied = apply(after, { kind: 'link', href: link.href, to });\n if (applied.outcome === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n rule: applied.refusal.rule,\n file: path,\n ...(applied.refusal.location === undefined ? {} : { location: applied.refusal.location }),\n },\n };\n }\n after = applied.document;\n }\n if (after === before) return { kind: 'changes', changes: [] };\n if (before.type === undefined) {\n return { kind: 'changes', changes: [{ kind: 'replace', path, content: serialize(after) }] };\n }\n return { kind: 'changes', changes: bodies(path, before, after) };\n}\n\nfunction subsumed(merged: Change[], path: string) {\n for (let index = merged.length - 1; index >= 0; index -= 1) {\n const item = merged[index];\n if (item.path !== path) continue;\n if (item.kind === 'section' || item.kind === 'preamble') merged.splice(index, 1);\n }\n}\n\nfunction rewrites(changes: readonly Change[], visible: VisibleLayer): Expansion {\n const moves = new Map<string, string>();\n const settled = new Set<string>();\n for (const change of changes) {\n if (change.kind === 'move') moves.set(change.path, change.to);\n if (change.kind === 'remove' || change.kind === 'replace' || change.kind === 'create') {\n settled.add(change.path);\n }\n if (change.kind === 'field') settled.add(`${change.path} ${change.name}`);\n }\n if (moves.size === 0) return { kind: 'changes', changes };\n const merged = [...changes];\n const added: Change[] = [];\n for (const [path, document] of Object.entries(visible.collection.documents)) {\n if (settled.has(path)) continue;\n const moved = moves.get(path) ?? path;\n const definition = definitionOf(typesAt(visible.collection.composition, path), document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec) || settled.has(`${path} ${name}`)) continue;\n const value = retarget(document.fields[name], path, moved, moves);\n if (value === undefined) continue;\n added.push({ kind: 'field', path, name, value });\n }\n const relinked = relinks(path, moved, edited(document, path, merged), moves);\n if (relinked.kind === 'refused') return relinked;\n for (const change of relinked.changes) {\n if (change.kind === 'replace') {\n subsumed(merged, path);\n added.push(change);\n continue;\n }\n const index = merged.findIndex(\n (item) =>\n item.kind === change.kind &&\n item.path === path &&\n (change.kind !== 'section' || (item.kind === 'section' && item.name === change.name)),\n );\n if (index === -1) added.push(change);\n else merged[index] = change;\n }\n }\n return { kind: 'changes', changes: [...added, ...merged] };\n}\n\nfunction targets(value: unknown, from: string): readonly string[] {\n const values = Array.isArray(value) ? value : [value];\n const resolved: string[] = [];\n for (const item of values) {\n if (typeof item !== 'string') continue;\n const target = resolve(from, item);\n if (target !== null) resolved.push(target);\n }\n return resolved;\n}\n\nfunction incoming(collection: Collection, removed: ReadonlySet<string>): BatchResult | null {\n const found = new Map<string, Set<string>>();\n const note = (target: string, file: string) => {\n if (!removed.has(target)) return;\n const referrers = found.get(target) ?? new Set<string>();\n referrers.add(file);\n found.set(target, referrers);\n };\n for (const [path, document] of Object.entries(collection.documents)) {\n const definition = definitionOf(typesAt(collection.composition, path), document.type);\n for (const [name, spec] of Object.entries(definition?.fields ?? {})) {\n if (!referenceField(spec)) continue;\n for (const target of targets(document.fields[name], path)) note(target, path);\n }\n for (const link of links(document, path)) note(link.target, path);\n }\n const [first] = [...found.keys()].sort();\n if (first === undefined) return null;\n const every = new Set<string>();\n for (const referrers of found.values()) for (const file of referrers) every.add(file);\n return {\n kind: 'refused',\n refusal: { rule: 'referenced-missing-file', file: first, referrers: [...every].sort() },\n };\n}\n\nfunction affected(change: Change): readonly string[] {\n return change.kind === 'move' ? [change.path, change.to] : [change.path];\n}\n\nfunction definitionAddresses(composition: Composition): ReadonlySet<string> {\n const addresses = new Set<string>();\n if (composition.model.status !== 'unavailable') {\n for (const path of Object.keys(composition.model.snapshot.definitions)) addresses.add(path);\n }\n if (composition.selection !== null && composition.selection.model.status !== 'unavailable') {\n for (const path of Object.keys(composition.selection.model.snapshot.definitions)) {\n addresses.add(path);\n }\n }\n return addresses;\n}\n\nfunction guard(changes: readonly Change[], input: SaveInput): BatchResult | null {\n const existing = new Set([\n ...Object.keys(input.visible.documents),\n ...input.visible.binaryTargets,\n ]);\n const definitions = definitionAddresses(input.composition);\n for (const change of changes) {\n for (const path of affected(change)) {\n const normalized = normalize(path);\n if (normalized === null || normalized === '') return refuse('room-root', path);\n if (definitions.has(normalized)) return refuse('model-definition', normalized);\n if (covered(input.providerOwnedPaths, normalized)) {\n return refuse('provider-owned-path', normalized);\n }\n const operation = change.kind === 'remove' ? 'delete' : 'write';\n if (!covered(input.operations[operation], normalized))\n return refuse(`${operation}-grant`, normalized);\n }\n if (change.kind === 'create') {\n if (existing.has(change.path)) return refuse('path-collision', change.path);\n existing.add(change.path);\n continue;\n }\n if (change.kind === 'move') {\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (existing.has(change.to)) return refuse('path-collision', change.to);\n existing.delete(change.path);\n existing.add(change.to);\n continue;\n }\n if (!existing.has(change.path)) return refuse('path-absent', change.path);\n if (change.kind === 'remove') {\n existing.delete(change.path);\n continue;\n }\n if (change.kind === 'replace') {\n if (input.visible.revisions[change.path] === undefined) {\n return refuse('unknown-revision', change.path);\n }\n continue;\n }\n const document = input.visible.collection.documents[change.path];\n if (document === undefined) return refuse('path-absent', change.path);\n if (change.kind === 'section' && document.sections[change.name] === undefined) {\n return refuse('required-section', change.path, change.name);\n }\n }\n return null;\n}\n\nfunction existence(visible: VisibleLayer, path: string): Precondition {\n const revision = visible.revisions[path];\n return revision === undefined ? { kind: 'present', path } : { kind: 'revision', path, revision };\n}\n\nfunction preconditionsOf(\n changes: readonly Change[],\n visible: VisibleLayer,\n): readonly Precondition[] {\n const preconditions: Precondition[] = [];\n const seen = new Set<string>();\n const add = (precondition: Precondition) => {\n const part =\n precondition.kind === 'field' || precondition.kind === 'section' ? precondition.name : '';\n const identity = `${precondition.kind} ${precondition.path} ${part}`;\n if (seen.has(identity)) return;\n seen.add(identity);\n preconditions.push(precondition);\n };\n for (const change of changes) {\n if (change.kind === 'field') {\n const document = visible.collection.documents[change.path];\n add({\n kind: 'field',\n path: change.path,\n name: change.name,\n value: document.fields[change.name],\n });\n continue;\n }\n if (change.kind === 'section') {\n const document = visible.collection.documents[change.path];\n add({\n kind: 'section',\n path: change.path,\n name: change.name,\n value: document.sections[change.name],\n });\n continue;\n }\n if (change.kind === 'preamble') {\n const document = visible.collection.documents[change.path];\n add({ kind: 'preamble', path: change.path, value: document.preamble });\n continue;\n }\n if (change.kind === 'create') {\n add({ kind: 'absent', path: change.path });\n continue;\n }\n add(existence(visible, change.path));\n if (change.kind === 'move') add({ kind: 'absent', path: change.to });\n }\n return preconditions;\n}\n\nfunction depth(path: string) {\n return path.split('/').length;\n}\n\nfunction exceeded(\n limits: readonly ProviderLimit[],\n changes: readonly Change[],\n resulting: Layer,\n): BatchResult | null {\n const written = changes.map((change) => (change.kind === 'move' ? change.to : change.path));\n const created = changes\n .filter((change) => change.kind === 'create' || change.kind === 'move')\n .map((change) => (change.kind === 'move' ? change.to : change.path));\n for (const limit of limits) {\n const value = limit.value;\n if (typeof value !== 'number') continue;\n if (limit.name === 'change-batch-operations' && changes.length > value) {\n return refuse('provider-limit', undefined, limit.name);\n }\n if (limit.name === 'document-size') {\n const large = written.find((path) => (resulting.documents[path] ?? '').length > value);\n if (large !== undefined) return refuse('provider-limit', large, limit.name);\n }\n if (limit.name === 'path-length') {\n const long = created.find((path) => path.length > value);\n if (long !== undefined) return refuse('provider-limit', long, limit.name);\n }\n if (limit.name === 'path-depth') {\n const deep = created.find((path) => depth(path) > value);\n if (deep !== undefined) return refuse('provider-limit', deep, limit.name);\n }\n }\n return null;\n}\n\nexport function buildBatch(input: SaveInput): BatchResult {\n const structural = input.changes.find(\n (change) => change.kind === 'move' || change.kind === 'remove',\n );\n if (\n structural !== undefined &&\n Object.entries(input.visible.collection.documents).some(\n ([path, document]) =>\n document.type !== undefined &&\n document.type !== 'any' &&\n governing(input.composition, path).status === 'unavailable',\n )\n )\n return refuse('model-unavailable', structural.path);\n const expanded = expand(input.changes, input.visible);\n if (expanded.kind === 'refused') return expanded;\n const rewritten = rewrites(expanded.changes, input.visible);\n if (rewritten.kind === 'refused') return rewritten;\n const changes = rewritten.changes;\n if (changes.length === 0) return refuse('no-change');\n const refusal = guard(changes, input);\n if (refusal !== null) return refusal;\n const preconditions = preconditionsOf(changes, input.visible);\n const resulting = overlay(input.visible, [\n { id: '', baseRoomVersion: input.baseRoomVersion, changes, preconditions },\n ]);\n const removed = new Set(\n changes.filter((change) => change.kind === 'remove').map((change) => change.path),\n );\n if (removed.size > 0) {\n const referenced = incoming(parseCollection(resulting.documents, input.composition), removed);\n if (referenced !== null) return referenced;\n }\n const typed = (content: string | undefined) => {\n if (content === undefined) return false;\n const parsed = parse(content);\n return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';\n };\n const typedPaths = [...new Set(changes.flatMap(affected))].filter(\n (path) => typed(input.visible.documents[path]) || typed(resulting.documents[path]),\n );\n const needsModel = typedPaths.length > 0;\n const withoutModel = typedPaths.find(\n (path) => governing(input.composition, path).status === 'unavailable',\n );\n if (needsModel && (withoutModel !== undefined || input.binding === null)) {\n return refuse('model-unavailable', withoutModel ?? typedPaths[0]);\n }\n const validationText = needsModel\n ? resulting.documents\n : Object.fromEntries(\n Object.entries(resulting.documents).filter(([path]) =>\n changes.some((change) => affected(change).includes(path)),\n ),\n );\n const verdict = validateCollection(\n validationText,\n resulting.binaryTargets,\n input.composition,\n input.binding,\n );\n if (verdict.verdict === 'refuse') {\n return {\n kind: 'refused',\n refusal: {\n ...(verdict.source === 'model' ? { source: 'model' as const } : {}),\n rule: verdict.rule,\n file: verdict.file,\n ...(verdict.location === undefined ? {} : { location: verdict.location }),\n ...(verdict.referrers === undefined ? {} : { referrers: verdict.referrers }),\n },\n };\n }\n const limited = exceeded(input.providerLimits, changes, resulting);\n if (limited !== null) return limited;\n const validated = typedPaths\n .map((path) => governing(input.composition, path))\n .find(\n (model): model is Extract<ModelState, { status: 'current' | 'cached' }> =>\n model.status !== 'unavailable',\n );\n return {\n kind: 'batch',\n batch: immutable({\n id: changeBatchIdentity(),\n baseRoomVersion: input.baseRoomVersion,\n changes,\n preconditions,\n ...(validated === undefined\n ? {}\n : {\n validation: {\n identity: validated.snapshot.identity,\n version: validated.snapshot.version,\n source: validated.status,\n },\n }),\n }),\n };\n}\n"],"names":["apply","links","parse","serialize","immutable","governing","parseCollection","typesAt","validateCollection","changeBatchIdentity","overlay","beneath","covered","normalize","relative","resolve","refuse","rule","file","location","kind","refusal","undefined","members","visible","prefix","Object","keys","documents","binaryTargets","filter","path","sort","spread","change","member","to","slice","length","expand","changes","expanded","push","structural","present","includes","beneathIt","referenceField","spec","declared","of","definitionOf","types","type","find","name","retarget","value","from","moves","Array","isArray","next","map","item","some","index","target","get","edited","document","applied","prior","preamble","sections","outcome","bodies","before","after","entries","relinks","moved","link","destination","href","content","subsumed","merged","splice","rewrites","Map","settled","Set","set","add","size","added","collection","has","definition","composition","fields","relinked","findIndex","targets","values","resolved","incoming","removed","found","note","referrers","first","every","affected","definitionAddresses","addresses","model","status","snapshot","definitions","selection","guard","input","existing","normalized","providerOwnedPaths","operation","operations","delete","revisions","existence","revision","preconditionsOf","preconditions","seen","precondition","part","identity","depth","split","exceeded","limits","resulting","written","created","limit","large","long","deep","buildBatch","rewritten","id","baseRoomVersion","referenced","typed","parsed","ok","typedPaths","flatMap","needsModel","withoutModel","binding","validationText","fromEntries","verdict","source","limited","providerLimits","validated","batch","validation","version"],"mappings":"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"}
|
package/dist/status.d.ts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
import type { ProviderRefusal } from './adapter.js';
|
|
2
|
+
export type AttentionEntry = {
|
|
3
|
+
locator: string;
|
|
4
|
+
batch: string;
|
|
5
|
+
outcome: 'conflicted' | 'rejected' | 'expired';
|
|
6
|
+
refusal: ProviderRefusal | null;
|
|
7
|
+
roomVersion?: string;
|
|
8
|
+
};
|
|
1
9
|
export type SyncStatus = {
|
|
2
10
|
state: 'pending' | 'syncing' | 'synced';
|
|
3
11
|
lastCompleted: string | null;
|
|
4
12
|
providerUnreachable: boolean;
|
|
5
|
-
attentionRequired:
|
|
13
|
+
attentionRequired: readonly AttentionEntry[];
|
|
14
|
+
reset: string | null;
|
|
6
15
|
};
|
|
7
16
|
export type CycleProgress = {
|
|
8
17
|
complete: boolean;
|
|
@@ -10,7 +19,7 @@ export type CycleProgress = {
|
|
|
10
19
|
};
|
|
11
20
|
export declare const STARTING: SyncStatus;
|
|
12
21
|
export declare function transferring(status: SyncStatus): SyncStatus;
|
|
13
|
-
export declare function settled(status: SyncStatus, progress: CycleProgress, at: string, queued: boolean,
|
|
22
|
+
export declare function settled(status: SyncStatus, progress: CycleProgress, at: string | null, queued: boolean, attention: Pick<SyncStatus, 'attentionRequired' | 'reset'>): SyncStatus;
|
|
14
23
|
export declare function saving(status: SyncStatus): SyncStatus;
|
|
15
24
|
export declare function same(one: SyncStatus, other: SyncStatus): boolean;
|
|
16
25
|
//# sourceMappingURL=status.d.ts.map
|
package/dist/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAMtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,GAAG,IAAI,EACjB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,GACzD,UAAU,CAOZ;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhE"}
|
package/dist/status.js
CHANGED
|
@@ -2,7 +2,8 @@ export const STARTING = {
|
|
|
2
2
|
state: 'syncing',
|
|
3
3
|
lastCompleted: null,
|
|
4
4
|
providerUnreachable: false,
|
|
5
|
-
attentionRequired:
|
|
5
|
+
attentionRequired: [],
|
|
6
|
+
reset: null
|
|
6
7
|
};
|
|
7
8
|
export function transferring(status) {
|
|
8
9
|
return {
|
|
@@ -10,12 +11,12 @@ export function transferring(status) {
|
|
|
10
11
|
state: 'syncing'
|
|
11
12
|
};
|
|
12
13
|
}
|
|
13
|
-
export function settled(status, progress, at, queued,
|
|
14
|
+
export function settled(status, progress, at, queued, attention) {
|
|
14
15
|
return {
|
|
15
16
|
state: queued ? 'pending' : progress.complete ? 'synced' : status.state,
|
|
16
17
|
lastCompleted: progress.complete ? at : status.lastCompleted,
|
|
17
18
|
providerUnreachable: !progress.reachable,
|
|
18
|
-
|
|
19
|
+
...attention
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
22
|
export function saving(status) {
|
|
@@ -25,7 +26,7 @@ export function saving(status) {
|
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
export function same(one, other) {
|
|
28
|
-
return one.state === other.state && one.lastCompleted === other.lastCompleted && one.providerUnreachable === other.providerUnreachable && one.attentionRequired === other.attentionRequired;
|
|
29
|
+
return one.state === other.state && one.lastCompleted === other.lastCompleted && one.providerUnreachable === other.providerUnreachable && one.reset === other.reset && JSON.stringify(one.attentionRequired) === JSON.stringify(other.attentionRequired);
|
|
29
30
|
}
|
|
30
31
|
|
|
31
32
|
//# sourceMappingURL=status.js.map
|
package/dist/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/status.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/status.ts"],"sourcesContent":["import type { ProviderRefusal } from './adapter.js';\n\nexport type AttentionEntry = {\n locator: string;\n batch: string;\n outcome: 'conflicted' | 'rejected' | 'expired';\n refusal: ProviderRefusal | null;\n roomVersion?: string;\n};\n\nexport type SyncStatus = {\n state: 'pending' | 'syncing' | 'synced';\n lastCompleted: string | null;\n providerUnreachable: boolean;\n attentionRequired: readonly AttentionEntry[];\n reset: string | null;\n};\n\nexport type CycleProgress = {\n complete: boolean;\n reachable: boolean;\n};\n\nexport const STARTING: SyncStatus = {\n state: 'syncing',\n lastCompleted: null,\n providerUnreachable: false,\n attentionRequired: [],\n reset: null,\n};\n\nexport function transferring(status: SyncStatus): SyncStatus {\n return { ...status, state: 'syncing' };\n}\n\nexport function settled(\n status: SyncStatus,\n progress: CycleProgress,\n at: string | null,\n queued: boolean,\n attention: Pick<SyncStatus, 'attentionRequired' | 'reset'>,\n): SyncStatus {\n return {\n state: queued ? 'pending' : progress.complete ? 'synced' : status.state,\n lastCompleted: progress.complete ? at : status.lastCompleted,\n providerUnreachable: !progress.reachable,\n ...attention,\n };\n}\n\nexport function saving(status: SyncStatus): SyncStatus {\n return { ...status, state: 'pending' };\n}\n\nexport function same(one: SyncStatus, other: SyncStatus): boolean {\n return (\n one.state === other.state &&\n one.lastCompleted === other.lastCompleted &&\n one.providerUnreachable === other.providerUnreachable &&\n one.reset === other.reset &&\n JSON.stringify(one.attentionRequired) === JSON.stringify(other.attentionRequired)\n );\n}\n"],"names":["STARTING","state","lastCompleted","providerUnreachable","attentionRequired","reset","transferring","status","settled","progress","at","queued","attention","complete","reachable","saving","same","one","other","JSON","stringify"],"mappings":"AAuBA,OAAO,MAAMA,WAAuB;IAClCC,OAAO;IACPC,eAAe;IACfC,qBAAqB;IACrBC,mBAAmB,EAAE;IACrBC,OAAO;AACT,EAAE;AAEF,OAAO,SAASC,aAAaC,MAAkB;IAC7C,OAAO;QAAE,GAAGA,MAAM;QAAEN,OAAO;IAAU;AACvC;AAEA,OAAO,SAASO,QACdD,MAAkB,EAClBE,QAAuB,EACvBC,EAAiB,EACjBC,MAAe,EACfC,SAA0D;IAE1D,OAAO;QACLX,OAAOU,SAAS,YAAYF,SAASI,QAAQ,GAAG,WAAWN,OAAON,KAAK;QACvEC,eAAeO,SAASI,QAAQ,GAAGH,KAAKH,OAAOL,aAAa;QAC5DC,qBAAqB,CAACM,SAASK,SAAS;QACxC,GAAGF,SAAS;IACd;AACF;AAEA,OAAO,SAASG,OAAOR,MAAkB;IACvC,OAAO;QAAE,GAAGA,MAAM;QAAEN,OAAO;IAAU;AACvC;AAEA,OAAO,SAASe,KAAKC,GAAe,EAAEC,KAAiB;IACrD,OACED,IAAIhB,KAAK,KAAKiB,MAAMjB,KAAK,IACzBgB,IAAIf,aAAa,KAAKgB,MAAMhB,aAAa,IACzCe,IAAId,mBAAmB,KAAKe,MAAMf,mBAAmB,IACrDc,IAAIZ,KAAK,KAAKa,MAAMb,KAAK,IACzBc,KAAKC,SAAS,CAACH,IAAIb,iBAAiB,MAAMe,KAAKC,SAAS,CAACF,MAAMd,iBAAiB;AAEpF"}
|