@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.
Files changed (86) hide show
  1. package/dist/adapter.d.ts +107 -16
  2. package/dist/adapter.d.ts.map +1 -1
  3. package/dist/adapter.js.map +1 -1
  4. package/dist/bootstrap.d.ts +6 -1
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/bootstrap.js +14 -6
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/change.d.ts +1 -0
  9. package/dist/change.d.ts.map +1 -1
  10. package/dist/change.js.map +1 -1
  11. package/dist/client.d.ts +63 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +227 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/collection.d.ts +19 -4
  16. package/dist/collection.d.ts.map +1 -1
  17. package/dist/collection.js +88 -25
  18. package/dist/collection.js.map +1 -1
  19. package/dist/connection.d.ts +37 -9
  20. package/dist/connection.d.ts.map +1 -1
  21. package/dist/connection.js +818 -274
  22. package/dist/connection.js.map +1 -1
  23. package/dist/conversation.d.ts +57 -0
  24. package/dist/conversation.d.ts.map +1 -0
  25. package/dist/conversation.js +401 -0
  26. package/dist/conversation.js.map +1 -0
  27. package/dist/durability.d.ts +8 -3
  28. package/dist/durability.d.ts.map +1 -1
  29. package/dist/durability.js +5 -59
  30. package/dist/durability.js.map +1 -1
  31. package/dist/file.d.ts +20 -0
  32. package/dist/file.d.ts.map +1 -0
  33. package/dist/file.js +149 -0
  34. package/dist/file.js.map +1 -0
  35. package/dist/host.d.ts +9 -0
  36. package/dist/host.d.ts.map +1 -0
  37. package/dist/host.js +200 -0
  38. package/dist/host.js.map +1 -0
  39. package/dist/identity.d.ts +2 -0
  40. package/dist/identity.d.ts.map +1 -0
  41. package/dist/identity.js +16 -0
  42. package/dist/identity.js.map +1 -0
  43. package/dist/index.d.ts +10 -4
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/memory.d.ts +16 -2
  47. package/dist/memory.d.ts.map +1 -1
  48. package/dist/memory.js +196 -15
  49. package/dist/memory.js.map +1 -1
  50. package/dist/model.d.ts +70 -0
  51. package/dist/model.d.ts.map +1 -0
  52. package/dist/model.js +28 -0
  53. package/dist/model.js.map +1 -0
  54. package/dist/outcome.d.ts +16 -9
  55. package/dist/outcome.d.ts.map +1 -1
  56. package/dist/outcome.js +10 -0
  57. package/dist/outcome.js.map +1 -1
  58. package/dist/query.d.ts +13 -0
  59. package/dist/query.d.ts.map +1 -0
  60. package/dist/query.js +18 -0
  61. package/dist/query.js.map +1 -0
  62. package/dist/refresh.d.ts +2 -1
  63. package/dist/refresh.d.ts.map +1 -1
  64. package/dist/refresh.js +6 -4
  65. package/dist/refresh.js.map +1 -1
  66. package/dist/replica.d.ts +5 -2
  67. package/dist/replica.d.ts.map +1 -1
  68. package/dist/replica.js +23 -6
  69. package/dist/replica.js.map +1 -1
  70. package/dist/save.d.ts +6 -1
  71. package/dist/save.d.ts.map +1 -1
  72. package/dist/save.js +52 -11
  73. package/dist/save.js.map +1 -1
  74. package/dist/status.d.ts +11 -2
  75. package/dist/status.d.ts.map +1 -1
  76. package/dist/status.js +5 -4
  77. package/dist/status.js.map +1 -1
  78. package/dist/store.d.ts +38 -4
  79. package/dist/store.d.ts.map +1 -1
  80. package/dist/store.js +64 -7
  81. package/dist/store.js.map +1 -1
  82. package/dist/wire.d.ts +63 -0
  83. package/dist/wire.d.ts.map +1 -0
  84. package/dist/wire.js +139 -0
  85. package/dist/wire.js.map +1 -0
  86. package/package.json +10 -2
package/dist/refresh.js CHANGED
@@ -1,10 +1,11 @@
1
- import { readConfirmed } from './replica.js';
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 = readConfirmed({
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
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type { Adapter, AdapterFailure, Authorization, RefreshPage } from './adapter.js';\nimport { readConfirmed, 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): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, { locator, fromRoomVersion });\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, { locator, fromRoomVersion, pageToken });\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 = readConfirmed({\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n });\n return advanced === null ? unconfirmed : { kind: 'advanced', confirmed: advanced };\n}\n"],"names":["readConfirmed","unconfirmed","refreshRoom","adapter","authorization","confirmed","locator","record","fromRoomVersion","roomVersion","first","refresh","kind","documents","revisions","binaryTargets","Set","stage","page","Object","assign","path","keys","delete","target","add","removals","pageToken","undefined","advanced","sort"],"mappings":"AACA,SAASA,aAAa,QAA6B,eAAe;AAClE,SAASC,WAAW,QAA0B,gBAAgB;AAS9D,OAAO,eAAeC,YACpBC,OAAgB,EAChBC,aAA4B,EAC5BC,SAAyB;IAEzB,MAAMC,UAAUD,UAAUE,MAAM,CAACD,OAAO;IACxC,MAAME,kBAAkBH,UAAUE,MAAM,CAACE,WAAW;IACpD,MAAMC,QAAQ,MAAMP,QAAQQ,OAAO,CAACP,eAAe;QAAEE;QAASE;IAAgB;IAC9E,IAAIE,MAAME,IAAI,KAAK,mBAAmB,OAAOF;IAC7C,MAAMD,cAAcC,MAAMD,WAAW;IACrC,MAAMI,YAAoC;QAAE,GAAGR,UAAUE,MAAM,CAACM,SAAS;IAAC;IAC1E,MAAMC,YAAoC;QAAE,GAAGT,UAAUE,MAAM,CAACO,SAAS;IAAC;IAC1E,MAAMC,gBAAgB,IAAIC,IAAIX,UAAUE,MAAM,CAACQ,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,MAAMP;IACN,IAAIiB,YAAYjB,MAAMiB,SAAS;IAC/B,MAAOA,cAAcC,UAAW;QAC9B,MAAMV,OAAO,MAAMf,QAAQQ,OAAO,CAACP,eAAe;YAAEE;YAASE;YAAiBmB;QAAU;QACxF,IAAIT,KAAKN,IAAI,KAAK,mBAAmBM,KAAKN,IAAI,KAAK,kBAAkB,OAAOX;QAC5E,IAAIiB,KAAKN,IAAI,KAAK,mBAAmB,OAAOM;QAC5C,IAAIA,KAAKT,WAAW,KAAKA,aAAa,OAAOR;QAC7CgB,MAAMC;QACNS,YAAYT,KAAKS,SAAS;IAC5B;IACA,MAAME,WAAW7B,cAAc;QAC7B,GAAGK,UAAUE,MAAM;QACnBE;QACAI;QACAE,eAAe;eAAIA;SAAc,CAACe,IAAI;QACtChB;IACF;IACA,OAAOe,aAAa,OAAO5B,cAAc;QAAEW,MAAM;QAAYP,WAAWwB;IAAS;AACnF"}
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 applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], roomVersion: string): ConfirmedLayer | null;
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
@@ -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,EAAmC,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACnF,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,cAAc,GAAG,IAAI,CAG1E;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,GAClB,cAAc,GAAG,IAAI,CAgBvB;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAoB3F"}
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.binaryTargets);
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 applyReturned(confirmed, documents, revisions, removals, roomVersion) {
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 readConfirmed({
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
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { immutable, type ChangeBatch } from './change.js';\nimport { parseCollection, readCollection, type Collection } 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 readConfirmed(record: ReplicaRecord): ConfirmedLayer | null {\n const collection = readCollection(record.documents, record.binaryTargets);\n return collection === null ? null : { record, collection };\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): 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 readConfirmed({\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n binaryTargets: [...binaryTargets].sort(),\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: { ...layer, collection: parseCollection(layer.documents) },\n };\n}\n"],"names":["immutable","parseCollection","readCollection","overlay","readConfirmed","record","collection","documents","binaryTargets","applyReturned","confirmed","revisions","removals","roomVersion","nextDocuments","nextRevisions","Set","path","delete","sort","replicaOf","queue","batches","Object","freeze","map","length","visible","layer"],"mappings":"AAAA,SAASA,SAAS,QAA0B,cAAc;AAC1D,SAASC,eAAe,EAAEC,cAAc,QAAyB,kBAAkB;AACnF,SAASC,OAAO,QAAoB,eAAe;AAkBnD,OAAO,SAASC,cAAcC,MAAqB;IACjD,MAAMC,aAAaJ,eAAeG,OAAOE,SAAS,EAAEF,OAAOG,aAAa;IACxE,OAAOF,eAAe,OAAO,OAAO;QAAED;QAAQC;IAAW;AAC3D;AAEA,OAAO,SAASG,cACdC,SAAyB,EACzBH,SAA2C,EAC3CI,SAA2C,EAC3CC,QAA2B,EAC3BC,WAAmB;IAEnB,MAAMC,gBAAgB;QAAE,GAAGJ,UAAUL,MAAM,CAACE,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMQ,gBAAgB;QAAE,GAAGL,UAAUL,MAAM,CAACM,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMH,gBAAgB,IAAIQ,IAAIN,UAAUL,MAAM,CAACG,aAAa;IAC5D,KAAK,MAAMS,QAAQL,SAAU;QAC3B,OAAOE,aAAa,CAACG,KAAK;QAC1B,OAAOF,aAAa,CAACE,KAAK;QAC1BT,cAAcU,MAAM,CAACD;IACvB;IACA,OAAOb,cAAc;QACnB,GAAGM,UAAUL,MAAM;QACnBQ;QACAN,WAAWO;QACXH,WAAWI;QACXP,eAAe;eAAIA;SAAc,CAACW,IAAI;IACxC;AACF;AAEA,OAAO,SAASC,UAAUV,SAAyB,EAAEW,KAA6B;IAChF,MAAMC,UAAUC,OAAOC,MAAM,CAACH,MAAMI,GAAG,CAACzB;IACxC,IAAIsB,QAAQI,MAAM,KAAK,GAAG;QACxB,OAAO;YACLhB;YACAW,OAAOC;YACPK,SAAS;gBACPpB,WAAWG,UAAUL,MAAM,CAACE,SAAS;gBACrCC,eAAeE,UAAUL,MAAM,CAACG,aAAa;gBAC7CG,WAAWD,UAAUL,MAAM,CAACM,SAAS;gBACrCL,YAAYI,UAAUJ,UAAU;YAClC;QACF;IACF;IACA,MAAMsB,QAAQzB,QAAQO,UAAUL,MAAM,EAAEiB;IACxC,OAAO;QACLZ;QACAW,OAAOC;QACPK,SAAS;YAAE,GAAGC,KAAK;YAAEtB,YAAYL,gBAAgB2B,MAAMrB,SAAS;QAAE;IACpE;AACF"}
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
- writeGrants: readonly string[];
16
+ operations: import('./adapter.js').OperationScopes;
17
+ binding: AttachedModelBinding | null;
13
18
  providerOwnedPaths: readonly string[];
14
19
  providerLimits: readonly ProviderLimit[];
15
20
  visible: VisibleLayer;
@@ -1 +1 @@
1
- {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../src/save.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAI1F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,WAAW,GAAG;IACxB,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,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,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;AA0X9C,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CA2CxD"}
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, serialize, validate } from '@agentshouse/mdmodel';
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.types, document.type);
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.types, document.type);
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
- if (!covered(input.writeGrants, normalized)) return refuse('write-grant', normalized);
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 verdict = validate(resulting.documents, {
466
- binaryTargets: resulting.binaryTargets
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: crypto.randomUUID(),
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: boolean;
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, attentionRequired: boolean): SyncStatus;
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
@@ -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,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAKtB,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,EACV,MAAM,EAAE,OAAO,EACf,iBAAiB,EAAE,OAAO,GACzB,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,CAOhE"}
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: false
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, attentionRequired) {
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
- attentionRequired
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
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/status.ts"],"sourcesContent":["export type SyncStatus = {\n state: 'pending' | 'syncing' | 'synced';\n lastCompleted: string | null;\n providerUnreachable: boolean;\n attentionRequired: boolean;\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: false,\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,\n queued: boolean,\n attentionRequired: boolean,\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 attentionRequired,\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.attentionRequired === other.attentionRequired\n );\n}\n"],"names":["STARTING","state","lastCompleted","providerUnreachable","attentionRequired","transferring","status","settled","progress","at","queued","complete","reachable","saving","same","one","other"],"mappings":"AAYA,OAAO,MAAMA,WAAuB;IAClCC,OAAO;IACPC,eAAe;IACfC,qBAAqB;IACrBC,mBAAmB;AACrB,EAAE;AAEF,OAAO,SAASC,aAAaC,MAAkB;IAC7C,OAAO;QAAE,GAAGA,MAAM;QAAEL,OAAO;IAAU;AACvC;AAEA,OAAO,SAASM,QACdD,MAAkB,EAClBE,QAAuB,EACvBC,EAAU,EACVC,MAAe,EACfN,iBAA0B;IAE1B,OAAO;QACLH,OAAOS,SAAS,YAAYF,SAASG,QAAQ,GAAG,WAAWL,OAAOL,KAAK;QACvEC,eAAeM,SAASG,QAAQ,GAAGF,KAAKH,OAAOJ,aAAa;QAC5DC,qBAAqB,CAACK,SAASI,SAAS;QACxCR;IACF;AACF;AAEA,OAAO,SAASS,OAAOP,MAAkB;IACvC,OAAO;QAAE,GAAGA,MAAM;QAAEL,OAAO;IAAU;AACvC;AAEA,OAAO,SAASa,KAAKC,GAAe,EAAEC,KAAiB;IACrD,OACED,IAAId,KAAK,KAAKe,MAAMf,KAAK,IACzBc,IAAIb,aAAa,KAAKc,MAAMd,aAAa,IACzCa,IAAIZ,mBAAmB,KAAKa,MAAMb,mBAAmB,IACrDY,IAAIX,iBAAiB,KAAKY,MAAMZ,iBAAiB;AAErD"}
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"}