@agentshouse/mdruntime 0.1.0-alpha.9 → 0.1.0-c30ed2b8e04d5

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 (130) hide show
  1. package/AGENTS.md +217 -0
  2. package/README.md +43 -0
  3. package/dist/adapter.d.ts +184 -34
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -10
  6. package/dist/attached-model.d.ts +11 -0
  7. package/dist/attached-model.d.ts.map +1 -0
  8. package/dist/attached-model.js +34 -0
  9. package/dist/attachment.d.ts +3 -0
  10. package/dist/attachment.d.ts.map +1 -0
  11. package/dist/attachment.js +8 -0
  12. package/dist/bootstrap.d.ts +7 -9
  13. package/dist/bootstrap.d.ts.map +1 -1
  14. package/dist/bootstrap.js +29 -28
  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 +83 -0
  18. package/dist/change.d.ts +9 -0
  19. package/dist/change.d.ts.map +1 -1
  20. package/dist/change.js +6 -5
  21. package/dist/client.d.ts +38 -32
  22. package/dist/client.d.ts.map +1 -1
  23. package/dist/client.js +114 -183
  24. package/dist/collection.d.ts +13 -16
  25. package/dist/collection.d.ts.map +1 -1
  26. package/dist/collection.js +45 -88
  27. package/dist/connection.d.ts +47 -44
  28. package/dist/connection.d.ts.map +1 -1
  29. package/dist/connection.js +1542 -1158
  30. package/dist/conversation.d.ts +44 -22
  31. package/dist/conversation.d.ts.map +1 -1
  32. package/dist/conversation.js +540 -328
  33. package/dist/durability.js +6 -6
  34. package/dist/file.d.ts +2 -2
  35. package/dist/file.d.ts.map +1 -1
  36. package/dist/file.js +48 -71
  37. package/dist/host.d.ts +12 -2
  38. package/dist/host.d.ts.map +1 -1
  39. package/dist/host.js +97 -119
  40. package/dist/identity.d.ts +1 -0
  41. package/dist/identity.d.ts.map +1 -1
  42. package/dist/identity.js +10 -9
  43. package/dist/index.d.ts +12 -11
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -3
  46. package/dist/log.js +5 -6
  47. package/dist/memory.d.ts +15 -7
  48. package/dist/memory.d.ts.map +1 -1
  49. package/dist/memory.js +255 -220
  50. package/dist/model.d.ts +10 -29
  51. package/dist/model.d.ts.map +1 -1
  52. package/dist/model.js +18 -21
  53. package/dist/observation.d.ts +27 -0
  54. package/dist/observation.d.ts.map +1 -0
  55. package/dist/observation.js +95 -0
  56. package/dist/outcome.d.ts +10 -29
  57. package/dist/outcome.d.ts.map +1 -1
  58. package/dist/outcome.js +1 -23
  59. package/dist/overlay.d.ts +9 -2
  60. package/dist/overlay.d.ts.map +1 -1
  61. package/dist/overlay.js +187 -43
  62. package/dist/paths.d.ts +0 -1
  63. package/dist/paths.d.ts.map +1 -1
  64. package/dist/paths.js +12 -19
  65. package/dist/query.d.ts +215 -10
  66. package/dist/query.d.ts.map +1 -1
  67. package/dist/query.js +421 -15
  68. package/dist/reach.d.ts +40 -0
  69. package/dist/reach.d.ts.map +1 -0
  70. package/dist/reach.js +277 -0
  71. package/dist/read-side.d.ts +18 -0
  72. package/dist/read-side.d.ts.map +1 -0
  73. package/dist/read-side.js +377 -0
  74. package/dist/refresh.d.ts +5 -5
  75. package/dist/refresh.d.ts.map +1 -1
  76. package/dist/refresh.js +49 -30
  77. package/dist/replica.d.ts +25 -5
  78. package/dist/replica.d.ts.map +1 -1
  79. package/dist/replica.js +227 -38
  80. package/dist/room-draft.d.ts +127 -0
  81. package/dist/room-draft.d.ts.map +1 -0
  82. package/dist/room-draft.js +329 -0
  83. package/dist/rows.d.ts +41 -0
  84. package/dist/rows.d.ts.map +1 -0
  85. package/dist/rows.js +100 -0
  86. package/dist/save.d.ts +6 -4
  87. package/dist/save.d.ts.map +1 -1
  88. package/dist/save.js +262 -350
  89. package/dist/search.d.ts +61 -0
  90. package/dist/search.d.ts.map +1 -0
  91. package/dist/search.js +125 -0
  92. package/dist/status.d.ts +4 -6
  93. package/dist/status.d.ts.map +1 -1
  94. package/dist/status.js +9 -13
  95. package/dist/store.d.ts +59 -32
  96. package/dist/store.d.ts.map +1 -1
  97. package/dist/store.js +338 -134
  98. package/dist/transfer.d.ts +5 -0
  99. package/dist/transfer.d.ts.map +1 -1
  100. package/dist/transfer.js +1 -5
  101. package/dist/wire.d.ts +51 -16
  102. package/dist/wire.d.ts.map +1 -1
  103. package/dist/wire.js +77 -108
  104. package/package.json +6 -12
  105. package/dist/adapter.js.map +0 -1
  106. package/dist/bootstrap.js.map +0 -1
  107. package/dist/change.js.map +0 -1
  108. package/dist/client.js.map +0 -1
  109. package/dist/collection.js.map +0 -1
  110. package/dist/connection.js.map +0 -1
  111. package/dist/conversation.js.map +0 -1
  112. package/dist/durability.js.map +0 -1
  113. package/dist/file.js.map +0 -1
  114. package/dist/host.js.map +0 -1
  115. package/dist/identity.js.map +0 -1
  116. package/dist/index.js.map +0 -1
  117. package/dist/log.js.map +0 -1
  118. package/dist/memory.js.map +0 -1
  119. package/dist/model.js.map +0 -1
  120. package/dist/outcome.js.map +0 -1
  121. package/dist/overlay.js.map +0 -1
  122. package/dist/paths.js.map +0 -1
  123. package/dist/query.js.map +0 -1
  124. package/dist/refresh.js.map +0 -1
  125. package/dist/replica.js.map +0 -1
  126. package/dist/save.js.map +0 -1
  127. package/dist/status.js.map +0 -1
  128. package/dist/store.js.map +0 -1
  129. package/dist/transfer.js.map +0 -1
  130. package/dist/wire.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AACxF,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,WAAW,GACX,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,OAAO,CAAC,cAAc,CAAC,CAsDzB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAGb,gBAAgB,EAEjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,OAAO,GACP,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,cAAc,CAAC,CA8EzB"}
package/dist/refresh.js CHANGED
@@ -1,65 +1,84 @@
1
+ import { declaredAttachments } from './attachment.js';
1
2
  import { readStaged } from './replica.js';
2
3
  import { unconfirmed } from './transfer.js';
3
- export async function refreshRoom(adapter, authorization, confirmed, binding) {
4
+ export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
4
5
  const locator = confirmed.record.locator;
5
6
  const fromRoomVersion = confirmed.record.roomVersion;
6
7
  const first = await adapter.refresh(authorization, {
7
8
  locator,
8
9
  selection: confirmed.record.replica.selection,
9
- fromRoomVersion
10
+ fromRoomVersion,
10
11
  });
11
- if (first.kind !== 'net-advancement') return first;
12
+ if (first.kind !== 'net-advancement')
13
+ return first;
12
14
  const roomVersion = first.roomVersion;
13
- const documents = {
14
- ...confirmed.record.documents
15
- };
16
- const revisions = {
17
- ...confirmed.record.revisions
18
- };
15
+ const models = remodel(first.models, {
16
+ collection: confirmed.record.model,
17
+ selection: confirmed.record.selectionModel,
18
+ });
19
+ const documents = { ...confirmed.record.documents };
20
+ const revisions = { ...confirmed.record.revisions };
21
+ const changes = { ...confirmed.record.changes };
22
+ const written = { ...confirmed.record.written };
19
23
  const binaryTargets = new Set(confirmed.record.binaryTargets);
20
- const stage = (page)=>{
24
+ const attachments = [];
25
+ const stage = (page) => {
26
+ if (page.attachments !== undefined)
27
+ attachments.push(page.attachments);
21
28
  Object.assign(documents, page.documents);
22
29
  Object.assign(revisions, page.revisions);
23
- for (const path of Object.keys(page.documents))binaryTargets.delete(path);
24
- for (const target of page.binaryTargets){
30
+ for (const path of Object.keys(page.documents)) {
31
+ binaryTargets.delete(path);
32
+ delete changes[path];
33
+ written[path] = roomVersion;
34
+ }
35
+ for (const target of page.binaryTargets) {
25
36
  delete documents[target];
26
37
  delete revisions[target];
38
+ delete changes[target];
39
+ delete written[target];
27
40
  binaryTargets.add(target);
28
41
  }
29
- for (const path of page.removals){
42
+ Object.assign(changes, page.changes);
43
+ for (const path of page.removals) {
30
44
  delete documents[path];
31
45
  delete revisions[path];
46
+ delete changes[path];
47
+ delete written[path];
32
48
  binaryTargets.delete(path);
33
49
  }
34
50
  };
35
51
  stage(first);
36
52
  let pageToken = first.pageToken;
37
- while(pageToken !== undefined){
53
+ while (pageToken !== undefined) {
54
+ if (!continuing())
55
+ return unconfirmed;
38
56
  const page = await adapter.refresh(authorization, {
39
57
  locator,
40
58
  selection: confirmed.record.replica.selection,
41
59
  fromRoomVersion,
42
- pageToken
60
+ pageToken,
43
61
  });
44
- if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;
45
- if (page.kind !== 'net-advancement') return page;
46
- if (page.roomVersion !== roomVersion) return unconfirmed;
62
+ if (page.kind === 'still-current' || page.kind === 'beyond-horizon')
63
+ return unconfirmed;
64
+ if (page.kind !== 'net-advancement')
65
+ return page;
66
+ if (page.roomVersion !== roomVersion)
67
+ return unconfirmed;
47
68
  stage(page);
48
69
  pageToken = page.pageToken;
49
70
  }
50
- const advanced = readStaged({
71
+ const staged = readStaged({
51
72
  ...confirmed.record,
73
+ model: models.collection,
74
+ selectionModel: models.selection,
52
75
  roomVersion,
53
76
  documents,
54
- binaryTargets: [
55
- ...binaryTargets
56
- ].sort(),
57
- revisions
58
- }, binding);
59
- return advanced === null ? unconfirmed : {
60
- kind: 'advanced',
61
- confirmed: advanced
62
- };
77
+ binaryTargets: [...binaryTargets].sort(),
78
+ revisions,
79
+ changes,
80
+ written,
81
+ attachments: attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),
82
+ }, confirmed);
83
+ return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;
63
84
  }
64
-
65
- //# sourceMappingURL=refresh.js.map
package/dist/replica.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import type { AttachedModelBinding } from './model.js';
2
1
  import { type ChangeBatch } from './change.js';
3
2
  import { type Collection, type Composition } from './collection.js';
4
3
  import { type Layer } from './overlay.js';
4
+ import type { RoomAttachment } from './adapter.js';
5
5
  import type { ReplicaRecord } from './store.js';
6
+ import type { Refused } from './transfer.js';
6
7
  export type ConfirmedLayer = {
7
8
  record: ReplicaRecord;
8
9
  collection: Collection;
@@ -10,14 +11,33 @@ export type ConfirmedLayer = {
10
11
  export type VisibleLayer = Layer & {
11
12
  collection: Collection;
12
13
  };
14
+ export type Staged = {
15
+ kind: 'staged';
16
+ confirmed: ConfirmedLayer;
17
+ } | Refused;
13
18
  export type Replica = {
14
19
  confirmed: ConfirmedLayer;
15
20
  queue: readonly ChangeBatch[];
16
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;
17
30
  };
18
31
  export declare function compositionOf(record: ReplicaRecord): Composition;
19
- export declare function readConfirmed(record: ReplicaRecord): 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;
22
- export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): Replica;
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';
37
+ };
38
+ export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], attachments: readonly RoomAttachment[] | undefined, roomVersion: string, writtenAt: string): Staged;
39
+ export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], 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): readonly ChangeBatch[];
42
+ export {};
23
43
  //# sourceMappingURL=replica.d.ts.map
@@ -1 +1 @@
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"}
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;AAGlF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,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,CAQhE;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,CAKnF;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,SAAS,cAAc,EAAE,GAAG,SAAS,EAClD,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CAmCR;AAsDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CAgCT;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,GAC5C,SAAS,WAAW,EAAE,CAmBxB"}
package/dist/replica.js CHANGED
@@ -1,43 +1,69 @@
1
+ import { parse } from '@agentshouse/mdmodel';
1
2
  import { immutable } from './change.js';
2
- import { parseCollection, readCollection, validateCollection } from './collection.js';
3
- import { overlay } from './overlay.js';
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
+ import { declaredAttachments } from './attachment.js';
4
8
  export function compositionOf(record) {
5
9
  return {
6
- collectionRoot: record.collectionRoot,
7
10
  model: record.model,
8
- selection: record.typedSelection === null ? null : {
9
- roots: record.typedSelection.roots,
10
- model: record.selectionModel
11
- }
11
+ selection: record.typedSelection === null
12
+ ? null
13
+ : { roots: record.typedSelection.roots, model: record.selectionModel },
12
14
  };
13
15
  }
14
- export function readConfirmed(record) {
15
- const collection = readCollection(record.documents, compositionOf(record));
16
- return collection === null ? null : {
17
- record,
18
- collection
19
- };
16
+ export function readConfirmed(record, previous) {
17
+ const read = readCollection(record.documents, compositionOf(record), previous === undefined
18
+ ? undefined
19
+ : { text: previous.record.documents, collection: previous.collection });
20
+ return read.kind === 'read'
21
+ ? { kind: 'staged', confirmed: { record, collection: read.collection } }
22
+ : read;
20
23
  }
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;
24
+ export function sameMembership(record, other) {
25
+ return (JSON.stringify(record.typedSelection?.roots ?? null) ===
26
+ JSON.stringify(other.typedSelection?.roots ?? null));
27
+ }
28
+ export function readStaged(record, previous) {
29
+ if ((record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable') &&
30
+ (previous === undefined ||
31
+ !sameLayerText(record, previous.record) ||
32
+ record.model !== previous.record.model ||
33
+ record.selectionModel !== previous.record.selectionModel)) {
34
+ const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
35
+ if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
36
+ return { kind: 'refused', refusal: verdict };
37
+ }
25
38
  }
26
- return readConfirmed(record);
39
+ return readConfirmed(record, previous);
27
40
  }
28
- export function applyReturned(confirmed, documents, revisions, removals, roomVersion, binding) {
29
- const nextDocuments = {
30
- ...confirmed.record.documents,
31
- ...documents
32
- };
33
- const nextRevisions = {
34
- ...confirmed.record.revisions,
35
- ...revisions
41
+ export function readReclassified(record, previous) {
42
+ const verdict = validateCollection(record.documents, record.binaryTargets, compositionOf(record));
43
+ if (verdict.verdict !== 'refuse')
44
+ return readConfirmed(record, previous);
45
+ return verdict.rule === 'model-unavailable'
46
+ ? { kind: 'deferred' }
47
+ : { kind: 'refused', refusal: verdict };
48
+ }
49
+ export function applyReturned(confirmed, documents, revisions, removals, attachments, roomVersion, writtenAt) {
50
+ const nextDocuments = { ...confirmed.record.documents, ...documents };
51
+ const nextRevisions = { ...confirmed.record.revisions, ...revisions };
52
+ const nextChanges = { ...confirmed.record.changes };
53
+ const nextWritten = {
54
+ ...confirmed.record.written,
55
+ ...Object.fromEntries(Object.keys(documents).map((path) => [path, writtenAt])),
36
56
  };
37
57
  const binaryTargets = new Set(confirmed.record.binaryTargets);
38
- for (const path of removals){
58
+ for (const [path, revision] of Object.entries(revisions)) {
59
+ if (confirmed.record.revisions[path] !== revision)
60
+ delete nextChanges[path];
61
+ }
62
+ for (const path of removals) {
39
63
  delete nextDocuments[path];
40
64
  delete nextRevisions[path];
65
+ delete nextChanges[path];
66
+ delete nextWritten[path];
41
67
  binaryTargets.delete(path);
42
68
  }
43
69
  return readStaged({
@@ -45,12 +71,56 @@ export function applyReturned(confirmed, documents, revisions, removals, roomVer
45
71
  roomVersion,
46
72
  documents: nextDocuments,
47
73
  revisions: nextRevisions,
48
- binaryTargets: [
49
- ...binaryTargets
50
- ].sort()
51
- }, binding);
74
+ changes: nextChanges,
75
+ written: nextWritten,
76
+ binaryTargets: [...binaryTargets].sort(),
77
+ attachments: attachments === undefined
78
+ ? confirmed.record.attachments
79
+ : declaredAttachments([attachments]),
80
+ }, confirmed);
52
81
  }
53
- export function replicaOf(confirmed, queue) {
82
+ function predicted(confirmed, batches, previous) {
83
+ const composition = compositionOf(confirmed.record);
84
+ let layer = confirmed.record;
85
+ const replay = [];
86
+ const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);
87
+ for (const batch of batches) {
88
+ const before = layer;
89
+ const old = prior.get(batch.id);
90
+ const hasMove = batch.changes.some((change) => change.kind === 'move');
91
+ const reuseRewrite = old?.collection !== undefined &&
92
+ sameLayerText(before, old.before) &&
93
+ old.collection.composition.model === composition.model &&
94
+ old.collection.composition.selection?.model === composition.selection?.model &&
95
+ JSON.stringify(old.collection.composition.selection?.roots) ===
96
+ JSON.stringify(composition.selection?.roots);
97
+ const collection = hasMove
98
+ ? reuseRewrite
99
+ ? old.collection
100
+ : parseCollection(before.documents, composition, old?.collection === undefined
101
+ ? { text: confirmed.record.documents, collection: confirmed.collection }
102
+ : { text: old.before.documents, collection: old.collection })
103
+ : undefined;
104
+ const effective = collection === undefined
105
+ ? batch
106
+ : reuseRewrite
107
+ ? old.effective
108
+ : providerRewritten(batch, { ...before, collection });
109
+ layer =
110
+ old === undefined
111
+ ? overlay(before, [effective])
112
+ : overlayChanged(before, [effective], old.before, [old.effective], old.after);
113
+ replay.push({
114
+ id: batch.id,
115
+ before,
116
+ after: layer,
117
+ effective,
118
+ ...(collection === undefined ? {} : { collection }),
119
+ });
120
+ }
121
+ return { layer, replay };
122
+ }
123
+ export function replicaOf(confirmed, queue, previous) {
54
124
  const batches = Object.freeze(queue.map(immutable));
55
125
  if (batches.length === 0) {
56
126
  return {
@@ -60,19 +130,138 @@ export function replicaOf(confirmed, queue) {
60
130
  documents: confirmed.record.documents,
61
131
  binaryTargets: confirmed.record.binaryTargets,
62
132
  revisions: confirmed.record.revisions,
63
- collection: confirmed.collection
64
- }
133
+ changes: confirmed.record.changes,
134
+ collection: confirmed.collection,
135
+ },
136
+ replay: [],
65
137
  };
66
138
  }
67
- const layer = overlay(confirmed.record, batches);
139
+ const { layer, replay } = predicted(confirmed, batches, previous);
68
140
  return {
69
141
  confirmed,
70
142
  queue: batches,
143
+ replay,
71
144
  visible: {
72
145
  ...layer,
73
- collection: parseCollection(layer.documents, compositionOf(confirmed.record))
146
+ collection: parseCollection(layer.documents, compositionOf(confirmed.record), previous === undefined
147
+ ? undefined
148
+ : { text: previous.visible.documents, collection: previous.visible.collection }),
149
+ },
150
+ };
151
+ }
152
+ function present(layer, path) {
153
+ return layer.documents[path] !== undefined || layer.binaryTargets.includes(path);
154
+ }
155
+ function holds(layer, preconditions) {
156
+ const parsed = new Map();
157
+ const documentAt = (path) => {
158
+ if (!parsed.has(path)) {
159
+ const text = layer.documents[path];
160
+ const opened = text === undefined ? null : parse(text, path);
161
+ parsed.set(path, opened?.ok === true ? opened.document : null);
74
162
  }
163
+ return parsed.get(path) ?? null;
75
164
  };
165
+ return preconditions.every((precondition) => {
166
+ const path = precondition.path;
167
+ if (precondition.kind === 'absent')
168
+ return !present(layer, path);
169
+ if (precondition.kind === 'present')
170
+ return present(layer, path);
171
+ if (precondition.kind === 'revision') {
172
+ return present(layer, path) && layer.revisions[path] === precondition.revision;
173
+ }
174
+ const document = documentAt(path);
175
+ if (document === null)
176
+ return false;
177
+ if (precondition.kind === 'field') {
178
+ const value = Object.hasOwn(document.fields, precondition.name)
179
+ ? document.fields[precondition.name]
180
+ : undefined;
181
+ return equalValue(value, precondition.value);
182
+ }
183
+ if (precondition.kind === 'section') {
184
+ return (Object.hasOwn(document.sections, precondition.name) &&
185
+ document.sections[precondition.name] === precondition.value);
186
+ }
187
+ return document.preamble === precondition.value;
188
+ });
189
+ }
190
+ function effects(change) {
191
+ const path = change.path;
192
+ if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
193
+ return [change];
194
+ }
195
+ if (change.kind === 'create' && !('content' in change)) {
196
+ return [
197
+ { kind: 'present', path },
198
+ ...Object.entries(change.fields).map(([name, value]) => ({
199
+ kind: 'field',
200
+ path,
201
+ name,
202
+ value,
203
+ })),
204
+ ...Object.entries(change.sections).map(([name, value]) => ({
205
+ kind: 'section',
206
+ path,
207
+ name,
208
+ value,
209
+ })),
210
+ ];
211
+ }
212
+ if (change.kind === 'move') {
213
+ return [
214
+ { kind: 'absent', path },
215
+ { kind: 'present', path: change.to },
216
+ ];
217
+ }
218
+ return [{ kind: 'absent', path }];
219
+ }
220
+ function after(changes, index, path) {
221
+ let at = path;
222
+ for (const change of changes.slice(index + 1)) {
223
+ if (change.path !== at)
224
+ continue;
225
+ if (change.kind === 'remove')
226
+ return null;
227
+ if (change.kind === 'move')
228
+ at = change.to;
229
+ }
230
+ return at;
231
+ }
232
+ export function landed(batch, confirmed) {
233
+ const layer = confirmed.record;
234
+ return batch.changes.every((change, index) => {
235
+ if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {
236
+ const at = after(batch.changes, index, change.path);
237
+ return at === null || layer.documents[at] === change.content;
238
+ }
239
+ return effects(change).every((effect) => {
240
+ if (effect.kind === 'absent')
241
+ return holds(layer, [effect]);
242
+ const at = after(batch.changes, index, effect.path);
243
+ return at === null || holds(layer, [{ ...effect, path: at }]);
244
+ });
245
+ });
246
+ }
247
+ export function withdrawals(confirmed, queue, withdrawable) {
248
+ if (!queue.some(withdrawable))
249
+ return [];
250
+ const composition = compositionOf(confirmed.record);
251
+ let layer = confirmed.record;
252
+ const withdrawn = [];
253
+ for (const batch of queue) {
254
+ if (withdrawable(batch) && !holds(layer, batch.preconditions)) {
255
+ withdrawn.push(batch);
256
+ continue;
257
+ }
258
+ const effective = batch.changes.some((change) => change.kind === 'move')
259
+ ? providerRewritten(batch, {
260
+ ...layer,
261
+ collection: parseCollection(layer.documents, composition),
262
+ })
263
+ : batch;
264
+ layer = overlay(layer, [effective]);
265
+ }
266
+ return withdrawn;
76
267
  }
77
-
78
- //# sourceMappingURL=replica.js.map
@@ -0,0 +1,127 @@
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 moveTarget(move: {
120
+ readonly to: string;
121
+ }): string;
122
+ export declare function changesOf(path: string, parts: HeldParts): {
123
+ changes: readonly Change[];
124
+ bases: readonly Precondition[];
125
+ };
126
+ export {};
127
+ //# 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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"}