@agentshouse/mdruntime 0.1.0-alpha.5 → 0.1.0-alpha.50

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 (129) hide show
  1. package/AGENTS.md +210 -0
  2. package/README.md +44 -0
  3. package/dist/adapter.d.ts +253 -19
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +2 -1
  6. package/dist/adapter.js.map +1 -1
  7. package/dist/attachment.d.ts +3 -0
  8. package/dist/attachment.d.ts.map +1 -0
  9. package/dist/attachment.js +11 -0
  10. package/dist/attachment.js.map +1 -0
  11. package/dist/bootstrap.d.ts +7 -6
  12. package/dist/bootstrap.d.ts.map +1 -1
  13. package/dist/bootstrap.js +30 -10
  14. package/dist/bootstrap.js.map +1 -1
  15. package/dist/change-set.d.ts +33 -0
  16. package/dist/change-set.d.ts.map +1 -0
  17. package/dist/change-set.js +95 -0
  18. package/dist/change-set.js.map +1 -0
  19. package/dist/change.d.ts +10 -0
  20. package/dist/change.d.ts.map +1 -1
  21. package/dist/change.js.map +1 -1
  22. package/dist/client.d.ts +75 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +237 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/collection.d.ts +26 -12
  27. package/dist/collection.d.ts.map +1 -1
  28. package/dist/collection.js +78 -31
  29. package/dist/collection.js.map +1 -1
  30. package/dist/connection.d.ts +85 -28
  31. package/dist/connection.d.ts.map +1 -1
  32. package/dist/connection.js +1756 -510
  33. package/dist/connection.js.map +1 -1
  34. package/dist/conversation.d.ts +79 -0
  35. package/dist/conversation.d.ts.map +1 -0
  36. package/dist/conversation.js +635 -0
  37. package/dist/conversation.js.map +1 -0
  38. package/dist/durability.d.ts +8 -3
  39. package/dist/durability.d.ts.map +1 -1
  40. package/dist/durability.js +8 -62
  41. package/dist/durability.js.map +1 -1
  42. package/dist/file.d.ts +20 -0
  43. package/dist/file.d.ts.map +1 -0
  44. package/dist/file.js +149 -0
  45. package/dist/file.js.map +1 -0
  46. package/dist/host.d.ts +14 -0
  47. package/dist/host.d.ts.map +1 -0
  48. package/dist/host.js +213 -0
  49. package/dist/host.js.map +1 -0
  50. package/dist/identity.d.ts +3 -0
  51. package/dist/identity.d.ts.map +1 -0
  52. package/dist/identity.js +23 -0
  53. package/dist/identity.js.map +1 -0
  54. package/dist/index.d.ts +15 -7
  55. package/dist/index.d.ts.map +1 -1
  56. package/dist/index.js +1 -0
  57. package/dist/index.js.map +1 -1
  58. package/dist/memory.d.ts +19 -2
  59. package/dist/memory.d.ts.map +1 -1
  60. package/dist/memory.js +283 -24
  61. package/dist/memory.js.map +1 -1
  62. package/dist/model.d.ts +55 -0
  63. package/dist/model.d.ts.map +1 -0
  64. package/dist/model.js +36 -0
  65. package/dist/model.js.map +1 -0
  66. package/dist/observation.d.ts +25 -0
  67. package/dist/observation.d.ts.map +1 -0
  68. package/dist/observation.js +92 -0
  69. package/dist/observation.js.map +1 -0
  70. package/dist/outcome.d.ts +22 -18
  71. package/dist/outcome.d.ts.map +1 -1
  72. package/dist/outcome.js +1 -11
  73. package/dist/outcome.js.map +1 -1
  74. package/dist/overlay.d.ts +9 -2
  75. package/dist/overlay.d.ts.map +1 -1
  76. package/dist/overlay.js +145 -6
  77. package/dist/overlay.js.map +1 -1
  78. package/dist/paths.d.ts +0 -1
  79. package/dist/paths.d.ts.map +1 -1
  80. package/dist/paths.js +0 -4
  81. package/dist/paths.js.map +1 -1
  82. package/dist/query.d.ts +213 -0
  83. package/dist/query.d.ts.map +1 -0
  84. package/dist/query.js +470 -0
  85. package/dist/query.js.map +1 -0
  86. package/dist/read-side.d.ts +14 -0
  87. package/dist/read-side.d.ts.map +1 -0
  88. package/dist/read-side.js +457 -0
  89. package/dist/read-side.js.map +1 -0
  90. package/dist/refresh.d.ts +4 -4
  91. package/dist/refresh.d.ts.map +1 -1
  92. package/dist/refresh.js +40 -10
  93. package/dist/refresh.js.map +1 -1
  94. package/dist/replica.d.ts +27 -4
  95. package/dist/replica.d.ts.map +1 -1
  96. package/dist/replica.js +255 -13
  97. package/dist/replica.js.map +1 -1
  98. package/dist/room-draft.d.ts +124 -0
  99. package/dist/room-draft.d.ts.map +1 -0
  100. package/dist/room-draft.js +406 -0
  101. package/dist/room-draft.js.map +1 -0
  102. package/dist/rows.d.ts +41 -0
  103. package/dist/rows.d.ts.map +1 -0
  104. package/dist/rows.js +102 -0
  105. package/dist/rows.js.map +1 -0
  106. package/dist/save.d.ts +11 -2
  107. package/dist/save.d.ts.map +1 -1
  108. package/dist/save.js +116 -128
  109. package/dist/save.js.map +1 -1
  110. package/dist/search.d.ts +61 -0
  111. package/dist/search.d.ts.map +1 -0
  112. package/dist/search.js +155 -0
  113. package/dist/search.js.map +1 -0
  114. package/dist/status.d.ts +9 -2
  115. package/dist/status.d.ts.map +1 -1
  116. package/dist/status.js +5 -4
  117. package/dist/status.js.map +1 -1
  118. package/dist/store.d.ts +90 -18
  119. package/dist/store.d.ts.map +1 -1
  120. package/dist/store.js +492 -67
  121. package/dist/store.js.map +1 -1
  122. package/dist/transfer.d.ts +5 -0
  123. package/dist/transfer.d.ts.map +1 -1
  124. package/dist/transfer.js.map +1 -1
  125. package/dist/wire.d.ts +64 -0
  126. package/dist/wire.d.ts.map +1 -0
  127. package/dist/wire.js +145 -0
  128. package/dist/wire.js.map +1 -0
  129. package/package.json +15 -13
@@ -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 {\n Adapter,\n AdapterFailure,\n Authorization,\n HeadChange,\n RefreshPage,\n RetryableRefusal,\n RoomAttachment,\n} from './adapter.js';\nimport { declaredAttachments } from './attachment.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Refused, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | RetryableRefusal\n | Unconfirmed\n | Refused\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n continuing: () => boolean,\n minPosition: string | undefined,\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 ...(minPosition === undefined ? {} : { minPosition }),\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 changes: Record<string, HeadChange> = { ...confirmed.record.changes };\n const written: Record<string, string> = { ...confirmed.record.written };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const attachments: (readonly RoomAttachment[])[] = [];\n const stage = (page: RefreshPage) => {\n if (page.attachments !== undefined) attachments.push(page.attachments);\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) {\n binaryTargets.delete(path);\n delete changes[path];\n written[path] = roomVersion;\n }\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n delete changes[target];\n delete written[target];\n binaryTargets.add(target);\n }\n Object.assign(changes, page.changes);\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n delete changes[path];\n delete written[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n if (!continuing()) return unconfirmed;\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n ...(minPosition === undefined ? {} : { minPosition }),\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 staged = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n changes,\n written,\n attachments:\n attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),\n },\n confirmed,\n );\n return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;\n}\n"],"names":["declaredAttachments","readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","continuing","minPosition","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","undefined","kind","documents","revisions","changes","written","binaryTargets","Set","attachments","stage","page","push","Object","assign","path","keys","delete","target","add","removals","pageToken","staged","sort","length"],"mappings":"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"}
package/dist/replica.d.ts CHANGED
@@ -1,7 +1,9 @@
1
1
  import { type ChangeBatch } from './change.js';
2
- import { type Collection } from './collection.js';
2
+ import { type Collection, type Composition } from './collection.js';
3
3
  import { type Layer } from './overlay.js';
4
+ import { type Rewriting } from './save.js';
4
5
  import type { ReplicaRecord } from './store.js';
6
+ import type { Refused } from './transfer.js';
5
7
  export type ConfirmedLayer = {
6
8
  record: ReplicaRecord;
7
9
  collection: Collection;
@@ -9,12 +11,33 @@ export type ConfirmedLayer = {
9
11
  export type VisibleLayer = Layer & {
10
12
  collection: Collection;
11
13
  };
14
+ export type Staged = {
15
+ kind: 'staged';
16
+ confirmed: ConfirmedLayer;
17
+ } | Refused;
12
18
  export type Replica = {
13
19
  confirmed: ConfirmedLayer;
14
20
  queue: readonly ChangeBatch[];
15
21
  visible: VisibleLayer;
22
+ replay: readonly ReplayStep[];
23
+ };
24
+ type ReplayStep = {
25
+ id: string;
26
+ before: Layer;
27
+ after: Layer;
28
+ effective: ChangeBatch;
29
+ collection?: Collection;
30
+ };
31
+ export declare function compositionOf(record: ReplicaRecord): Composition;
32
+ export declare function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
33
+ export declare function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean;
34
+ export declare function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
35
+ export declare function readReclassified(record: ReplicaRecord, previous: ConfirmedLayer): Staged | {
36
+ kind: 'deferred';
16
37
  };
17
- 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;
19
- export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): Replica;
38
+ export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], roomVersion: string): Staged;
39
+ export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], rewriting: Rewriting, previous?: Replica): Replica;
40
+ export declare function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean;
41
+ export declare function withdrawals(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean, rewriting: Rewriting): readonly ChangeBatch[];
42
+ export {};
20
43
  //# 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":"AACA,OAAO,EAA0B,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AAC1F,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,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,MAAM,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAWtF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAMnF;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAkBnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAM/B;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,MAAM,CA+BR;AAwDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA4CT;AAkFD,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,GAAG,OAAO,CAa7E;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,SAAS,EAAE,SAAS,GACnB,SAAS,WAAW,EAAE,CAoBxB"}
package/dist/replica.js CHANGED
@@ -1,11 +1,55 @@
1
+ import { parse } from '@agentshouse/mdmodel';
1
2
  import { immutable } from './change.js';
2
- import { parseCollection, readCollection } from './collection.js';
3
- import { overlay } from './overlay.js';
4
- export function readConfirmed(record) {
5
- const collection = readCollection(record.documents, record.binaryTargets);
6
- return collection === null ? null : {
7
- record,
8
- collection
3
+ import { parseCollection, readCollection, validateCollection } from './collection.js';
4
+ import { overlay, overlayChanged, sameLayerText } from './overlay.js';
5
+ import { providerRewritten } from './save.js';
6
+ import { equalValue } from './room-draft.js';
7
+ export function compositionOf(record) {
8
+ return {
9
+ model: record.model,
10
+ selection: record.typedSelection === null ? null : {
11
+ roots: record.typedSelection.roots,
12
+ model: record.selectionModel
13
+ },
14
+ untypedFolders: record.untypedFolders
15
+ };
16
+ }
17
+ export function readConfirmed(record, previous) {
18
+ const read = readCollection(record.documents, compositionOf(record), previous === undefined ? undefined : {
19
+ text: previous.record.documents,
20
+ collection: previous.collection
21
+ });
22
+ return read.kind === 'read' ? {
23
+ kind: 'staged',
24
+ confirmed: {
25
+ record,
26
+ collection: read.collection
27
+ }
28
+ } : read;
29
+ }
30
+ export function sameMembership(record, other) {
31
+ return JSON.stringify(record.untypedFolders) === JSON.stringify(other.untypedFolders) && JSON.stringify(record.typedSelection?.roots ?? null) === JSON.stringify(other.typedSelection?.roots ?? null);
32
+ }
33
+ export function readStaged(record, previous) {
34
+ if ((record.model.status === 'current' || record.selectionModel.status === 'current') && (previous === undefined || !sameLayerText(record, previous.record) || record.model !== previous.record.model || record.selectionModel !== previous.record.selectionModel)) {
35
+ const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
36
+ if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
37
+ return {
38
+ kind: 'refused',
39
+ refusal: verdict
40
+ };
41
+ }
42
+ }
43
+ return readConfirmed(record, previous);
44
+ }
45
+ export function readReclassified(record, previous) {
46
+ const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
47
+ if (verdict.verdict !== 'refuse') return readConfirmed(record, previous);
48
+ return verdict.rule === 'model-unavailable' ? {
49
+ kind: 'deferred'
50
+ } : {
51
+ kind: 'refused',
52
+ refusal: verdict
9
53
  };
10
54
  }
11
55
  export function applyReturned(confirmed, documents, revisions, removals, roomVersion) {
@@ -17,23 +61,86 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
17
61
  ...confirmed.record.revisions,
18
62
  ...revisions
19
63
  };
64
+ const nextChanges = {
65
+ ...confirmed.record.changes
66
+ };
67
+ const nextWritten = {
68
+ ...confirmed.record.written,
69
+ ...Object.fromEntries(Object.keys(documents).map((path)=>[
70
+ path,
71
+ roomVersion
72
+ ]))
73
+ };
20
74
  const binaryTargets = new Set(confirmed.record.binaryTargets);
75
+ for (const [path, revision] of Object.entries(revisions)){
76
+ if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];
77
+ }
21
78
  for (const path of removals){
22
79
  delete nextDocuments[path];
23
80
  delete nextRevisions[path];
81
+ delete nextChanges[path];
82
+ delete nextWritten[path];
24
83
  binaryTargets.delete(path);
25
84
  }
26
- return readConfirmed({
85
+ return readStaged({
27
86
  ...confirmed.record,
28
87
  roomVersion,
29
88
  documents: nextDocuments,
30
89
  revisions: nextRevisions,
90
+ changes: nextChanges,
91
+ written: nextWritten,
31
92
  binaryTargets: [
32
93
  ...binaryTargets
33
94
  ].sort()
34
- });
95
+ }, confirmed);
35
96
  }
36
- export function replicaOf(confirmed, queue) {
97
+ function predicted(confirmed, batches, previous) {
98
+ const composition = compositionOf(confirmed.record);
99
+ let layer = confirmed.record;
100
+ const replay = [];
101
+ const prior = new Map(previous?.replay.map((step)=>[
102
+ step.id,
103
+ step
104
+ ]) ?? []);
105
+ for (const batch of batches){
106
+ const before = layer;
107
+ const old = prior.get(batch.id);
108
+ const hasMove = batch.changes.some((change)=>change.kind === 'move');
109
+ const reuseRewrite = old?.collection !== undefined && sameLayerText(before, old.before) && JSON.stringify(old.collection.composition.untypedFolders) === JSON.stringify(composition.untypedFolders) && old.collection.composition.model === composition.model && old.collection.composition.selection?.model === composition.selection?.model && JSON.stringify(old.collection.composition.selection?.roots) === JSON.stringify(composition.selection?.roots);
110
+ const collection = hasMove ? reuseRewrite ? old.collection : parseCollection(before.documents, composition, old?.collection === undefined ? {
111
+ text: confirmed.record.documents,
112
+ collection: confirmed.collection
113
+ } : {
114
+ text: old.before.documents,
115
+ collection: old.collection
116
+ }) : undefined;
117
+ const effective = collection === undefined ? batch : reuseRewrite ? old.effective : providerRewritten(batch, {
118
+ ...before,
119
+ collection
120
+ });
121
+ layer = old === undefined ? overlay(before, [
122
+ effective
123
+ ]) : overlayChanged(before, [
124
+ effective
125
+ ], old.before, [
126
+ old.effective
127
+ ], old.after);
128
+ replay.push({
129
+ id: batch.id,
130
+ before,
131
+ after: layer,
132
+ effective,
133
+ ...collection === undefined ? {} : {
134
+ collection
135
+ }
136
+ });
137
+ }
138
+ return {
139
+ layer,
140
+ replay
141
+ };
142
+ }
143
+ export function replicaOf(confirmed, queue, rewriting, previous) {
37
144
  const batches = Object.freeze(queue.map(immutable));
38
145
  if (batches.length === 0) {
39
146
  return {
@@ -43,19 +150,154 @@ export function replicaOf(confirmed, queue) {
43
150
  documents: confirmed.record.documents,
44
151
  binaryTargets: confirmed.record.binaryTargets,
45
152
  revisions: confirmed.record.revisions,
153
+ changes: confirmed.record.changes,
46
154
  collection: confirmed.collection
47
- }
155
+ },
156
+ replay: []
48
157
  };
49
158
  }
50
- const layer = overlay(confirmed.record, batches);
159
+ const predictedState = rewriting === 'provider' ? predicted(confirmed, batches, previous) : null;
160
+ const layer = rewriting === 'provider' ? predictedState.layer : previous === undefined ? overlay(confirmed.record, batches) : overlayChanged(confirmed.record, batches, previous.confirmed.record, previous.queue, previous.visible);
51
161
  return {
52
162
  confirmed,
53
163
  queue: batches,
164
+ replay: predictedState?.replay ?? [],
54
165
  visible: {
55
166
  ...layer,
56
- collection: parseCollection(layer.documents)
167
+ collection: parseCollection(layer.documents, compositionOf(confirmed.record), previous === undefined ? undefined : {
168
+ text: previous.visible.documents,
169
+ collection: previous.visible.collection
170
+ })
57
171
  }
58
172
  };
59
173
  }
174
+ function present(layer, path) {
175
+ return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);
176
+ }
177
+ function holds(layer, preconditions) {
178
+ const parsed = new Map();
179
+ const documentAt = (path)=>{
180
+ if (!parsed.has(path)) {
181
+ const text = layer.documents[path];
182
+ const opened = text === undefined ? null : parse(text, path);
183
+ parsed.set(path, opened?.ok === true ? opened.document : null);
184
+ }
185
+ return parsed.get(path) ?? null;
186
+ };
187
+ return preconditions.every((precondition)=>{
188
+ const path = precondition.path;
189
+ if (precondition.kind === 'absent') return !present(layer, path);
190
+ if (precondition.kind === 'present') return present(layer, path);
191
+ if (precondition.kind === 'revision') {
192
+ return present(layer, path) && layer.revisions[path] === precondition.revision;
193
+ }
194
+ const document = documentAt(path);
195
+ if (document === null) return false;
196
+ if (precondition.kind === 'field') {
197
+ const value = Object.hasOwn(document.fields, precondition.name) ? document.fields[precondition.name] : undefined;
198
+ return equalValue(value, precondition.value);
199
+ }
200
+ if (precondition.kind === 'section') {
201
+ return Object.hasOwn(document.sections, precondition.name) && document.sections[precondition.name] === precondition.value;
202
+ }
203
+ return document.preamble === precondition.value;
204
+ });
205
+ }
206
+ function effects(change) {
207
+ const path = change.path;
208
+ if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
209
+ return [
210
+ change
211
+ ];
212
+ }
213
+ if (change.kind === 'create' && !('content' in change)) {
214
+ return [
215
+ {
216
+ kind: 'present',
217
+ path
218
+ },
219
+ ...Object.entries(change.fields).map(([name, value])=>({
220
+ kind: 'field',
221
+ path,
222
+ name,
223
+ value
224
+ })),
225
+ ...Object.entries(change.sections).map(([name, value])=>({
226
+ kind: 'section',
227
+ path,
228
+ name,
229
+ value
230
+ }))
231
+ ];
232
+ }
233
+ if (change.kind === 'move') {
234
+ return [
235
+ {
236
+ kind: 'absent',
237
+ path
238
+ },
239
+ {
240
+ kind: 'present',
241
+ path: change.to
242
+ }
243
+ ];
244
+ }
245
+ return [
246
+ {
247
+ kind: 'absent',
248
+ path
249
+ }
250
+ ];
251
+ }
252
+ function after(changes, index, path) {
253
+ let at = path;
254
+ for (const change of changes.slice(index + 1)){
255
+ if (change.path !== at) continue;
256
+ if (change.kind === 'remove') return null;
257
+ if (change.kind === 'move') at = change.to;
258
+ }
259
+ return at;
260
+ }
261
+ export function landed(batch, confirmed) {
262
+ const layer = confirmed.record;
263
+ return batch.changes.every((change, index)=>{
264
+ if (change.kind === 'replace' || change.kind === 'create' && 'content' in change) {
265
+ const at = after(batch.changes, index, change.path);
266
+ return at === null || layer.documents[at] === change.content;
267
+ }
268
+ return effects(change).every((effect)=>{
269
+ if (effect.kind === 'absent') return holds(layer, [
270
+ effect
271
+ ]);
272
+ const at = after(batch.changes, index, effect.path);
273
+ return at === null || holds(layer, [
274
+ {
275
+ ...effect,
276
+ path: at
277
+ }
278
+ ]);
279
+ });
280
+ });
281
+ }
282
+ export function withdrawals(confirmed, queue, withdrawable, rewriting) {
283
+ if (!queue.some(withdrawable)) return [];
284
+ const composition = compositionOf(confirmed.record);
285
+ let layer = confirmed.record;
286
+ const withdrawn = [];
287
+ for (const batch of queue){
288
+ if (withdrawable(batch) && !holds(layer, batch.preconditions)) {
289
+ withdrawn.push(batch);
290
+ continue;
291
+ }
292
+ const effective = rewriting === 'provider' && batch.changes.some((change)=>change.kind === 'move') ? providerRewritten(batch, {
293
+ ...layer,
294
+ collection: parseCollection(layer.documents, composition)
295
+ }) : batch;
296
+ layer = overlay(layer, [
297
+ effective
298
+ ]);
299
+ }
300
+ return withdrawn;
301
+ }
60
302
 
61
303
  //# sourceMappingURL=replica.js.map
@@ -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 { parse, type Document } from '@agentshouse/mdmodel';\nimport { immutable, type Change, type ChangeBatch, type Precondition } from './change.js';\nimport {\n parseCollection,\n readCollection,\n validateCollection,\n type Collection,\n type Composition,\n} from './collection.js';\nimport { overlay, overlayChanged, sameLayerText, type Layer } from './overlay.js';\nimport { providerRewritten, type Rewriting } from './save.js';\nimport { equalValue } from './room-draft.js';\nimport type { ReplicaRecord } from './store.js';\nimport type { Refused } from './transfer.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Staged = { kind: 'staged'; confirmed: ConfirmedLayer } | Refused;\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n replay: readonly ReplayStep[];\n};\n\ntype ReplayStep = {\n id: string;\n before: Layer;\n after: Layer;\n effective: ChangeBatch;\n collection?: Collection;\n};\n\nexport function compositionOf(record: ReplicaRecord): Composition {\n return {\n model: record.model,\n selection:\n record.typedSelection === null\n ? null\n : { roots: record.typedSelection.roots, model: record.selectionModel },\n untypedFolders: record.untypedFolders,\n };\n}\n\nexport function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n const read = readCollection(\n record.documents,\n compositionOf(record),\n previous === undefined\n ? undefined\n : { text: previous.record.documents, collection: previous.collection },\n );\n return read.kind === 'read'\n ? { kind: 'staged', confirmed: { record, collection: read.collection } }\n : read;\n}\n\nexport function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean {\n return (\n JSON.stringify(record.untypedFolders) === JSON.stringify(other.untypedFolders) &&\n JSON.stringify(record.typedSelection?.roots ?? null) ===\n JSON.stringify(other.typedSelection?.roots ?? null)\n );\n}\n\nexport function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged {\n if (\n (record.model.status === 'current' || record.selectionModel.status === 'current') &&\n (previous === undefined ||\n !sameLayerText(record, previous.record) ||\n record.model !== previous.record.model ||\n record.selectionModel !== previous.record.selectionModel)\n ) {\n const verdict = validateCollection(\n record.documents,\n record.binaryTargets,\n compositionOf(record),\n );\n if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {\n return { kind: 'refused', refusal: verdict };\n }\n }\n return readConfirmed(record, previous);\n}\n\nexport function readReclassified(\n record: ReplicaRecord,\n previous: ConfirmedLayer,\n): Staged | { kind: 'deferred' } {\n const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));\n if (verdict.verdict !== 'refuse') return readConfirmed(record, previous);\n return verdict.rule === 'model-unavailable'\n ? { kind: 'deferred' }\n : { kind: 'refused', refusal: verdict };\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): Staged {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const nextChanges = { ...confirmed.record.changes };\n const nextWritten = {\n ...confirmed.record.written,\n ...Object.fromEntries(Object.keys(documents).map((path) => [path, roomVersion])),\n };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const [path, revision] of Object.entries(revisions)) {\n if (confirmed.record.revisions[path] !== revision) delete nextChanges[path];\n }\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n delete nextChanges[path];\n delete nextWritten[path];\n binaryTargets.delete(path);\n }\n return readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n changes: nextChanges,\n written: nextWritten,\n binaryTargets: [...binaryTargets].sort(),\n },\n confirmed,\n );\n}\n\nfunction predicted(\n confirmed: ConfirmedLayer,\n batches: readonly ChangeBatch[],\n previous?: Replica,\n): { layer: Layer; replay: readonly ReplayStep[] } {\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const replay: ReplayStep[] = [];\n const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);\n for (const batch of batches) {\n const before = layer;\n const old = prior.get(batch.id);\n const hasMove = batch.changes.some((change) => change.kind === 'move');\n const reuseRewrite =\n old?.collection !== undefined &&\n sameLayerText(before, old.before) &&\n JSON.stringify(old.collection.composition.untypedFolders) ===\n JSON.stringify(composition.untypedFolders) &&\n old.collection.composition.model === composition.model &&\n old.collection.composition.selection?.model === composition.selection?.model &&\n JSON.stringify(old.collection.composition.selection?.roots) ===\n JSON.stringify(composition.selection?.roots);\n const collection = hasMove\n ? reuseRewrite\n ? old.collection\n : parseCollection(\n before.documents,\n composition,\n old?.collection === undefined\n ? { text: confirmed.record.documents, collection: confirmed.collection }\n : { text: old.before.documents, collection: old.collection },\n )\n : undefined;\n const effective =\n collection === undefined\n ? batch\n : reuseRewrite\n ? old.effective\n : providerRewritten(batch, { ...before, collection });\n layer =\n old === undefined\n ? overlay(before, [effective])\n : overlayChanged(before, [effective], old.before, [old.effective], old.after);\n replay.push({\n id: batch.id,\n before,\n after: layer,\n effective,\n ...(collection === undefined ? {} : { collection }),\n });\n }\n return { layer, replay };\n}\n\nexport function replicaOf(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n rewriting: Rewriting,\n previous?: Replica,\n): 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 changes: confirmed.record.changes,\n collection: confirmed.collection,\n },\n replay: [],\n };\n }\n const predictedState = rewriting === 'provider' ? predicted(confirmed, batches, previous) : null;\n const layer =\n rewriting === 'provider'\n ? predictedState!.layer\n : previous === undefined\n ? overlay(confirmed.record, batches)\n : overlayChanged(\n confirmed.record,\n batches,\n previous.confirmed.record,\n previous.queue,\n previous.visible,\n );\n return {\n confirmed,\n queue: batches,\n replay: predictedState?.replay ?? [],\n visible: {\n ...layer,\n collection: parseCollection(\n layer.documents,\n compositionOf(confirmed.record),\n previous === undefined\n ? undefined\n : { text: previous.visible.documents, collection: previous.visible.collection },\n ),\n },\n };\n}\n\nfunction present(layer: Layer, path: string): boolean {\n return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);\n}\n\nfunction holds(layer: Layer, preconditions: readonly Precondition[]): boolean {\n const parsed = new Map<string, Document | null>();\n const documentAt = (path: string) => {\n if (!parsed.has(path)) {\n const text = layer.documents[path];\n const opened = text === undefined ? null : parse(text, path);\n parsed.set(path, opened?.ok === true ? opened.document : null);\n }\n return parsed.get(path) ?? null;\n };\n return preconditions.every((precondition) => {\n const path = precondition.path;\n if (precondition.kind === 'absent') return !present(layer, path);\n if (precondition.kind === 'present') return present(layer, path);\n if (precondition.kind === 'revision') {\n return present(layer, path) && layer.revisions[path] === precondition.revision;\n }\n const document = documentAt(path);\n if (document === null) return false;\n if (precondition.kind === 'field') {\n const value = Object.hasOwn(document.fields, precondition.name)\n ? document.fields[precondition.name]\n : undefined;\n return equalValue(value, precondition.value);\n }\n if (precondition.kind === 'section') {\n return (\n Object.hasOwn(document.sections, precondition.name) &&\n document.sections[precondition.name] === precondition.value\n );\n }\n return document.preamble === precondition.value;\n });\n}\n\nfunction effects(change: Change): readonly Precondition[] {\n const path = change.path;\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n return [change];\n }\n if (change.kind === 'create' && !('content' in change)) {\n return [\n { kind: 'present', path },\n ...Object.entries(change.fields).map(([name, value]): Precondition => ({\n kind: 'field',\n path,\n name,\n value,\n })),\n ...Object.entries(change.sections).map(([name, value]): Precondition => ({\n kind: 'section',\n path,\n name,\n value,\n })),\n ];\n }\n if (change.kind === 'move') {\n return [\n { kind: 'absent', path },\n { kind: 'present', path: change.to },\n ];\n }\n return [{ kind: 'absent', path }];\n}\n\nfunction after(changes: readonly Change[], index: number, path: string): string | null {\n let at = path;\n for (const change of changes.slice(index + 1)) {\n if (change.path !== at) continue;\n if (change.kind === 'remove') return null;\n if (change.kind === 'move') at = change.to;\n }\n return at;\n}\n\nexport function landed(batch: ChangeBatch, confirmed: ConfirmedLayer): boolean {\n const layer = confirmed.record;\n return batch.changes.every((change, index) => {\n if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {\n const at = after(batch.changes, index, change.path);\n return at === null || layer.documents[at] === change.content;\n }\n return effects(change).every((effect) => {\n if (effect.kind === 'absent') return holds(layer, [effect]);\n const at = after(batch.changes, index, effect.path);\n return at === null || holds(layer, [{ ...effect, path: at }]);\n });\n });\n}\n\nexport function withdrawals(\n confirmed: ConfirmedLayer,\n queue: readonly ChangeBatch[],\n withdrawable: (batch: ChangeBatch) => boolean,\n rewriting: Rewriting,\n): readonly ChangeBatch[] {\n if (!queue.some(withdrawable)) return [];\n const composition = compositionOf(confirmed.record);\n let layer: Layer = confirmed.record;\n const withdrawn: ChangeBatch[] = [];\n for (const batch of queue) {\n if (withdrawable(batch) && !holds(layer, batch.preconditions)) {\n withdrawn.push(batch);\n continue;\n }\n const effective =\n rewriting === 'provider' && batch.changes.some((change) => change.kind === 'move')\n ? providerRewritten(batch, {\n ...layer,\n collection: parseCollection(layer.documents, composition),\n })\n : batch;\n layer = overlay(layer, [effective]);\n }\n return withdrawn;\n}\n"],"names":["parse","immutable","parseCollection","readCollection","validateCollection","overlay","overlayChanged","sameLayerText","providerRewritten","equalValue","compositionOf","record","model","selection","typedSelection","roots","selectionModel","untypedFolders","readConfirmed","previous","read","documents","undefined","text","collection","kind","confirmed","sameMembership","other","JSON","stringify","readStaged","status","verdict","binaryTargets","rule","refusal","readReclassified","applyReturned","revisions","removals","roomVersion","nextDocuments","nextRevisions","nextChanges","changes","nextWritten","written","Object","fromEntries","keys","map","path","Set","revision","entries","delete","sort","predicted","batches","composition","layer","replay","prior","Map","step","id","batch","before","old","get","hasMove","some","change","reuseRewrite","effective","after","push","replicaOf","queue","rewriting","freeze","length","visible","predictedState","present","includes","holds","preconditions","parsed","documentAt","has","opened","set","ok","document","every","precondition","value","hasOwn","fields","name","sections","preamble","effects","to","index","at","slice","landed","content","effect","withdrawals","withdrawable","withdrawn"],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ import type { ProviderRefusal } from './adapter.js';
2
+ import type { Change, Precondition } from './change.js';
3
+ import type { VisibleLayer } from './replica.js';
4
+ export type FieldValue = {
5
+ readonly value: unknown;
6
+ } | null;
7
+ export type RoomDraftCreation = {
8
+ readonly type: string;
9
+ readonly fields: Readonly<Record<string, unknown>>;
10
+ readonly sections: Readonly<Record<string, string>>;
11
+ } | {
12
+ readonly markdown: string;
13
+ };
14
+ export type RoomDraftParts = {
15
+ readonly fields?: Readonly<Record<string, {
16
+ readonly value: unknown;
17
+ readonly base?: FieldValue;
18
+ }>>;
19
+ readonly sections?: Readonly<Record<string, {
20
+ readonly value: string;
21
+ readonly base?: string;
22
+ }>>;
23
+ readonly preamble?: {
24
+ readonly value: string;
25
+ readonly base?: string;
26
+ };
27
+ readonly markdown?: {
28
+ readonly value: string;
29
+ readonly base?: string;
30
+ };
31
+ readonly creation?: RoomDraftCreation;
32
+ readonly move?: {
33
+ readonly to: string;
34
+ readonly base?: string | null;
35
+ };
36
+ readonly removal?: {
37
+ readonly base?: string | null;
38
+ };
39
+ };
40
+ type HeldParts = {
41
+ readonly fields?: Readonly<Record<string, {
42
+ readonly value: unknown;
43
+ readonly base: FieldValue;
44
+ }>>;
45
+ readonly sections?: Readonly<Record<string, {
46
+ readonly value: string;
47
+ readonly base: string;
48
+ }>>;
49
+ readonly preamble?: {
50
+ readonly value: string;
51
+ readonly base: string;
52
+ };
53
+ readonly markdown?: {
54
+ readonly value: string;
55
+ readonly base: string;
56
+ };
57
+ readonly creation?: RoomDraftCreation;
58
+ readonly move?: {
59
+ readonly to: string;
60
+ readonly base: string | null;
61
+ };
62
+ readonly removal?: {
63
+ readonly base: string | null;
64
+ };
65
+ };
66
+ type ChangedUnderneath = {
67
+ readonly fields?: Readonly<Record<string, FieldValue>>;
68
+ readonly sections?: Readonly<Record<string, string | null>>;
69
+ readonly preamble?: string | null;
70
+ readonly markdown?: string | null;
71
+ readonly creation?: string;
72
+ readonly move?: string | null;
73
+ readonly removal?: string | null;
74
+ };
75
+ export type ReturnReason = (ProviderRefusal & {
76
+ readonly kind: 'conflicted' | 'rejected';
77
+ }) | {
78
+ readonly kind: 'expired';
79
+ } | {
80
+ readonly kind: 'withdrawn';
81
+ };
82
+ export type RoomDraft = {
83
+ readonly room: string;
84
+ readonly path: string;
85
+ readonly revision: string;
86
+ readonly parts: HeldParts;
87
+ readonly changedUnderneath: ChangedUnderneath;
88
+ readonly returned: ReturnReason | null;
89
+ };
90
+ export type RoomDraftWrite = {
91
+ readonly outcome: 'written';
92
+ readonly roomDraft: RoomDraft | null;
93
+ } | {
94
+ readonly outcome: 'stale';
95
+ readonly current: RoomDraft | null;
96
+ };
97
+ export type ChangedPart = {
98
+ readonly path: string;
99
+ readonly part: 'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal';
100
+ readonly name?: string;
101
+ };
102
+ export type RoomDraftRecord = {
103
+ readonly locator: string;
104
+ readonly path: string;
105
+ readonly revision: string;
106
+ readonly parts: HeldParts;
107
+ readonly returned: ReturnReason | null;
108
+ };
109
+ export type SavedDraft = {
110
+ readonly path: string;
111
+ readonly parts: HeldParts;
112
+ };
113
+ export declare function readParts(value: unknown): RoomDraftParts;
114
+ export declare function held(current: HeldParts | undefined, parts: RoomDraftParts): HeldParts;
115
+ export declare function equalValue(left: unknown, right: unknown): boolean;
116
+ export declare function underneath(parts: HeldParts, path: string, visible: VisibleLayer | undefined): ChangedUnderneath;
117
+ export declare function changedParts(path: string, report: ChangedUnderneath): readonly ChangedPart[];
118
+ export declare function returnedInto(existing: HeldParts | undefined, returned: HeldParts): HeldParts;
119
+ export declare function changesOf(path: string, parts: HeldParts): {
120
+ changes: readonly Change[];
121
+ bases: readonly Precondition[];
122
+ };
123
+ export {};
124
+ //# sourceMappingURL=room-draft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-draft.d.ts","sourceRoot":"","sources":["../src/room-draft.ts"],"names":[],"mappings":"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"}