@agentshouse/mdruntime 0.1.0-c7bd7ca3faee4 → 0.1.0-c89fa07b05d4b

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 (185) hide show
  1. package/AGENTS.md +259 -216
  2. package/README.md +11 -1
  3. package/dist/adapter.d.ts +66 -16
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attempt.d.ts +16 -0
  6. package/dist/attempt.d.ts.map +1 -0
  7. package/dist/attempt.js +70 -0
  8. package/dist/binary.d.ts +23 -0
  9. package/dist/binary.d.ts.map +1 -0
  10. package/dist/binary.js +8 -0
  11. package/dist/bootstrap.d.ts +17 -5
  12. package/dist/bootstrap.d.ts.map +1 -1
  13. package/dist/bootstrap.js +109 -37
  14. package/dist/change-set.d.ts +2 -0
  15. package/dist/change-set.d.ts.map +1 -1
  16. package/dist/change-set.js +48 -16
  17. package/dist/change.d.ts +15 -0
  18. package/dist/change.d.ts.map +1 -1
  19. package/dist/change.js +26 -1
  20. package/dist/chat/acts.d.ts +33 -0
  21. package/dist/chat/acts.d.ts.map +1 -0
  22. package/dist/chat/acts.js +36 -0
  23. package/dist/chat/context.d.ts +3 -0
  24. package/dist/chat/context.d.ts.map +1 -0
  25. package/dist/chat/context.js +10 -0
  26. package/dist/chat/input.d.ts +9 -0
  27. package/dist/chat/input.d.ts.map +1 -0
  28. package/dist/chat/input.js +99 -0
  29. package/dist/chat/kit.d.ts +60 -0
  30. package/dist/chat/kit.d.ts.map +1 -0
  31. package/dist/chat/kit.js +123 -0
  32. package/dist/chat/lasting.d.ts +6 -0
  33. package/dist/chat/lasting.d.ts.map +1 -0
  34. package/dist/chat/lasting.js +19 -0
  35. package/dist/chat/list.d.ts +26 -0
  36. package/dist/chat/list.d.ts.map +1 -0
  37. package/dist/chat/list.js +62 -0
  38. package/dist/chat/markdown.d.ts +20 -0
  39. package/dist/chat/markdown.d.ts.map +1 -0
  40. package/dist/chat/markdown.js +188 -0
  41. package/dist/chat/message.d.ts +6 -0
  42. package/dist/chat/message.d.ts.map +1 -0
  43. package/dist/chat/message.js +192 -0
  44. package/dist/chat/messages.d.ts +21 -0
  45. package/dist/chat/messages.d.ts.map +1 -0
  46. package/dist/chat/messages.js +151 -0
  47. package/dist/chat/name.d.ts +6 -0
  48. package/dist/chat/name.d.ts.map +1 -0
  49. package/dist/chat/name.js +37 -0
  50. package/dist/chat/opened.d.ts +11 -0
  51. package/dist/chat/opened.d.ts.map +1 -0
  52. package/dist/chat/opened.js +17 -0
  53. package/dist/chat/overlay.d.ts +31 -0
  54. package/dist/chat/overlay.d.ts.map +1 -0
  55. package/dist/chat/overlay.js +97 -0
  56. package/dist/chat/parts.d.ts +57 -0
  57. package/dist/chat/parts.d.ts.map +1 -0
  58. package/dist/chat/parts.js +119 -0
  59. package/dist/chat/process.d.ts +20 -0
  60. package/dist/chat/process.d.ts.map +1 -0
  61. package/dist/chat/process.js +32 -0
  62. package/dist/chat/provider.d.ts +63 -0
  63. package/dist/chat/provider.d.ts.map +1 -0
  64. package/dist/chat/provider.js +620 -0
  65. package/dist/chat/question.d.ts +9 -0
  66. package/dist/chat/question.d.ts.map +1 -0
  67. package/dist/chat/question.js +80 -0
  68. package/dist/chat/questions.d.ts +31 -0
  69. package/dist/chat/questions.d.ts.map +1 -0
  70. package/dist/chat/questions.js +111 -0
  71. package/dist/chat/read.d.ts +5 -0
  72. package/dist/chat/read.d.ts.map +1 -0
  73. package/dist/chat/read.js +13 -0
  74. package/dist/chat/ready.d.ts +33 -0
  75. package/dist/chat/ready.d.ts.map +1 -0
  76. package/dist/chat/ready.js +91 -0
  77. package/dist/chat/style.d.ts +4 -0
  78. package/dist/chat/style.d.ts.map +1 -0
  79. package/dist/chat/style.js +302 -0
  80. package/dist/chat.d.ts +14 -0
  81. package/dist/chat.d.ts.map +1 -0
  82. package/dist/chat.js +8 -0
  83. package/dist/client.d.ts +18 -11
  84. package/dist/client.d.ts.map +1 -1
  85. package/dist/client.js +31 -16
  86. package/dist/collection.d.ts +21 -12
  87. package/dist/collection.d.ts.map +1 -1
  88. package/dist/collection.js +271 -23
  89. package/dist/connection.d.ts +28 -14
  90. package/dist/connection.d.ts.map +1 -1
  91. package/dist/connection.js +1218 -370
  92. package/dist/conversation.d.ts +23 -10
  93. package/dist/conversation.d.ts.map +1 -1
  94. package/dist/conversation.js +304 -136
  95. package/dist/entry.d.ts +17 -0
  96. package/dist/entry.d.ts.map +1 -0
  97. package/dist/entry.js +156 -0
  98. package/dist/expectation.d.ts +21 -0
  99. package/dist/expectation.d.ts.map +1 -0
  100. package/dist/expectation.js +70 -0
  101. package/dist/failure.d.ts +13 -0
  102. package/dist/failure.d.ts.map +1 -0
  103. package/dist/failure.js +19 -0
  104. package/dist/fence.d.ts +6 -0
  105. package/dist/fence.d.ts.map +1 -0
  106. package/dist/fence.js +10 -0
  107. package/dist/host.d.ts +4 -2
  108. package/dist/host.d.ts.map +1 -1
  109. package/dist/host.js +17 -13
  110. package/dist/identity.d.ts +5 -0
  111. package/dist/identity.d.ts.map +1 -1
  112. package/dist/identity.js +19 -1
  113. package/dist/index.d.ts +12 -6
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +4 -0
  116. package/dist/memory.d.ts +4 -3
  117. package/dist/memory.d.ts.map +1 -1
  118. package/dist/memory.js +63 -21
  119. package/dist/model.d.ts +4 -2
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +9 -0
  122. package/dist/observation.d.ts +5 -2
  123. package/dist/observation.d.ts.map +1 -1
  124. package/dist/observation.js +22 -11
  125. package/dist/open.d.ts +2 -0
  126. package/dist/open.d.ts.map +1 -0
  127. package/dist/open.js +1 -0
  128. package/dist/outcome.d.ts +32 -3
  129. package/dist/outcome.d.ts.map +1 -1
  130. package/dist/outcome.js +42 -1
  131. package/dist/overlay.d.ts +15 -3
  132. package/dist/overlay.d.ts.map +1 -1
  133. package/dist/overlay.js +94 -77
  134. package/dist/query.d.ts +32 -3
  135. package/dist/query.d.ts.map +1 -1
  136. package/dist/query.js +3 -0
  137. package/dist/reach.d.ts +2 -0
  138. package/dist/reach.d.ts.map +1 -1
  139. package/dist/reach.js +45 -21
  140. package/dist/react.d.ts +7 -5
  141. package/dist/react.d.ts.map +1 -1
  142. package/dist/react.js +3 -2
  143. package/dist/read-side.d.ts +13 -6
  144. package/dist/read-side.d.ts.map +1 -1
  145. package/dist/read-side.js +291 -85
  146. package/dist/recovery.d.ts +25 -0
  147. package/dist/recovery.d.ts.map +1 -0
  148. package/dist/recovery.js +197 -0
  149. package/dist/refresh.d.ts +10 -0
  150. package/dist/refresh.d.ts.map +1 -1
  151. package/dist/refresh.js +43 -38
  152. package/dist/replica.d.ts +8 -5
  153. package/dist/replica.d.ts.map +1 -1
  154. package/dist/replica.js +114 -67
  155. package/dist/room-draft.d.ts +26 -9
  156. package/dist/room-draft.d.ts.map +1 -1
  157. package/dist/room-draft.js +132 -23
  158. package/dist/rows.d.ts +8 -13
  159. package/dist/rows.d.ts.map +1 -1
  160. package/dist/rows.js +12 -14
  161. package/dist/save.d.ts +31 -1
  162. package/dist/save.d.ts.map +1 -1
  163. package/dist/save.js +376 -45
  164. package/dist/search.d.ts +31 -8
  165. package/dist/search.d.ts.map +1 -1
  166. package/dist/search.js +109 -44
  167. package/dist/shared.d.ts +11 -0
  168. package/dist/shared.d.ts.map +1 -0
  169. package/dist/shared.js +368 -0
  170. package/dist/status.d.ts +2 -2
  171. package/dist/status.d.ts.map +1 -1
  172. package/dist/status.js +0 -8
  173. package/dist/store.d.ts +64 -18
  174. package/dist/store.d.ts.map +1 -1
  175. package/dist/store.js +494 -195
  176. package/dist/turn.d.ts +7 -0
  177. package/dist/turn.d.ts.map +1 -0
  178. package/dist/turn.js +45 -0
  179. package/dist/wire.d.ts +6 -3
  180. package/dist/wire.d.ts.map +1 -1
  181. package/dist/wire.js +14 -2
  182. package/package.json +26 -14
  183. package/dist/attachment.d.ts +0 -3
  184. package/dist/attachment.d.ts.map +0 -1
  185. package/dist/attachment.js +0 -8
@@ -0,0 +1,197 @@
1
+ // A first retry waits about a second, so a passing failure clears before the next attempt.
2
+ const FIRST_MS = 1_000;
3
+ // Waits stop doubling at half a minute, so work resumes soon after a long failure ends.
4
+ const CEILING_MS = 30_000;
5
+ const ATTEMPTS = 8;
6
+ export function retryDelay(tries, firstMs = FIRST_MS, ceilingMs = CEILING_MS) {
7
+ const ceiling = Math.min(ceilingMs, firstMs * 2 ** tries);
8
+ return ceiling / 2 + (Math.random() * ceiling) / 2;
9
+ }
10
+ function owner(backoff, inFlight, release = () => { }) {
11
+ const intents = new Map();
12
+ const children = new Set();
13
+ const running = new Set();
14
+ const queued = [];
15
+ let free = inFlight;
16
+ let retired = false;
17
+ function finish(key, intent, done) {
18
+ if (intents.get(key) === intent)
19
+ intents.delete(key);
20
+ if (intent.timer !== null)
21
+ clearTimeout(intent.timer);
22
+ intent.timer = null;
23
+ intent.end(done);
24
+ }
25
+ function wait(key, intent, at, guided) {
26
+ if (intent.timer !== null)
27
+ clearTimeout(intent.timer);
28
+ intent.due = at;
29
+ intent.guided = guided;
30
+ intent.timer = setTimeout(() => {
31
+ intent.timer = null;
32
+ launch(key, intent);
33
+ }, Math.max(0, at - Date.now()));
34
+ }
35
+ function launch(key, intent) {
36
+ intent.due = null;
37
+ intent.guided = false;
38
+ const controller = new AbortController();
39
+ intent.controller = controller;
40
+ const run = start(key, intent, controller);
41
+ running.add(run);
42
+ void run.finally(() => running.delete(run));
43
+ }
44
+ async function start(key, intent, controller) {
45
+ while (free === 0)
46
+ await new Promise((admit) => queued.push(admit));
47
+ if (controller.signal.aborted) {
48
+ queued.shift()?.();
49
+ return;
50
+ }
51
+ free -= 1;
52
+ const abandoned = new Promise((resolve) => {
53
+ controller.signal.addEventListener('abort', () => resolve(null), { once: true });
54
+ });
55
+ let result;
56
+ try {
57
+ result = await Promise.race([intent.run(controller.signal), abandoned]);
58
+ }
59
+ catch {
60
+ result = 'again';
61
+ }
62
+ finally {
63
+ free += 1;
64
+ queued.shift()?.();
65
+ }
66
+ if (result === null || controller.signal.aborted || intents.get(key) !== intent)
67
+ return;
68
+ intent.controller = null;
69
+ const again = intent.again;
70
+ intent.again = null;
71
+ if (result === 'done') {
72
+ intent.tries = 0;
73
+ if (again === null)
74
+ finish(key, intent, true);
75
+ else if (again === 'now')
76
+ launch(key, intent);
77
+ else
78
+ wait(key, intent, again, true);
79
+ return;
80
+ }
81
+ intent.tries += 1;
82
+ if (intent.tries >= backoff.attempts) {
83
+ finish(key, intent, false);
84
+ return;
85
+ }
86
+ if (result === 'again') {
87
+ const delay = retryDelay(intent.tries - 1, backoff.firstMs, backoff.ceilingMs);
88
+ wait(key, intent, Date.now() + delay, false);
89
+ }
90
+ else
91
+ wait(key, intent, result.at, true);
92
+ }
93
+ const recovery = {
94
+ attempt(key, run, options = {}) {
95
+ if (retired)
96
+ return Promise.resolve(false);
97
+ const held = intents.get(key);
98
+ if (held !== undefined) {
99
+ held.run = run;
100
+ if (held.controller !== null) {
101
+ const at = options.at;
102
+ held.again =
103
+ at === undefined || held.again === 'now'
104
+ ? 'now'
105
+ : Math.min(at, held.again ?? Number.POSITIVE_INFINITY);
106
+ }
107
+ else if (held.due !== null && held.due <= Date.now()) {
108
+ if (held.timer !== null)
109
+ clearTimeout(held.timer);
110
+ held.timer = null;
111
+ launch(key, held);
112
+ }
113
+ else if (options.at !== undefined && (held.due === null || options.at < held.due)) {
114
+ wait(key, held, options.at, true);
115
+ }
116
+ return held.ended;
117
+ }
118
+ let end = () => { };
119
+ const ended = new Promise((resolve) => {
120
+ end = resolve;
121
+ });
122
+ const intent = {
123
+ run,
124
+ tries: 0,
125
+ timer: null,
126
+ due: null,
127
+ guided: false,
128
+ controller: null,
129
+ again: null,
130
+ ended,
131
+ end,
132
+ };
133
+ intents.set(key, intent);
134
+ if (options.at !== undefined)
135
+ wait(key, intent, options.at, true);
136
+ else if (options.again === true) {
137
+ intent.tries = 1;
138
+ wait(key, intent, Date.now() + retryDelay(0, backoff.firstMs, backoff.ceilingMs), false);
139
+ }
140
+ else
141
+ launch(key, intent);
142
+ return ended;
143
+ },
144
+ pending(key) {
145
+ const intent = intents.get(key);
146
+ return intent !== undefined && intent.controller === null;
147
+ },
148
+ resume() {
149
+ if (retired)
150
+ return;
151
+ for (const [key, intent] of [...intents]) {
152
+ if (intent.guided && intent.due !== null && intent.due > Date.now())
153
+ continue;
154
+ if (intent.timer !== null)
155
+ clearTimeout(intent.timer);
156
+ intent.timer = null;
157
+ intent.controller?.abort();
158
+ intent.again = null;
159
+ intent.tries = 0;
160
+ launch(key, intent);
161
+ }
162
+ },
163
+ cancel(key) {
164
+ const intent = intents.get(key);
165
+ if (intent === undefined)
166
+ return;
167
+ intent.controller?.abort();
168
+ finish(key, intent, false);
169
+ },
170
+ scope(bound = Infinity) {
171
+ const child = owner(backoff, bound, () => children.delete(child));
172
+ if (retired)
173
+ void child.retire();
174
+ else
175
+ children.add(child);
176
+ return child;
177
+ },
178
+ async retire() {
179
+ retired = true;
180
+ release();
181
+ for (const [key, intent] of [...intents]) {
182
+ intent.controller?.abort();
183
+ finish(key, intent, false);
184
+ }
185
+ await Promise.all([...children].map((child) => child.retire()));
186
+ await Promise.all(running);
187
+ },
188
+ };
189
+ return recovery;
190
+ }
191
+ export function createRecovery(options = {}) {
192
+ return owner({
193
+ firstMs: options.firstMs ?? FIRST_MS,
194
+ ceilingMs: options.ceilingMs ?? CEILING_MS,
195
+ attempts: options.attempts ?? ATTEMPTS,
196
+ }, options.inFlight ?? Infinity);
197
+ }
package/dist/refresh.d.ts CHANGED
@@ -1,7 +1,16 @@
1
1
  import type { Adapter, AdapterFailure, Authorization, RetryableRefusal } from './adapter.js';
2
2
  import type { Remodel } from './bootstrap.js';
3
3
  import { type ConfirmedLayer } from './replica.js';
4
+ import type { ReplicaRecord } from './store.js';
4
5
  import { type Refused, type Unconfirmed } from './transfer.js';
6
+ export type Advancement = {
7
+ kind: 'still-current';
8
+ } | {
9
+ kind: 'advanced';
10
+ record: ReplicaRecord;
11
+ } | {
12
+ kind: 'beyond-horizon';
13
+ } | RetryableRefusal | Unconfirmed | AdapterFailure;
5
14
  export type RefreshOutcome = {
6
15
  kind: 'still-current';
7
16
  } | {
@@ -10,5 +19,6 @@ export type RefreshOutcome = {
10
19
  } | {
11
20
  kind: 'beyond-horizon';
12
21
  } | RetryableRefusal | Unconfirmed | Refused | AdapterFailure;
22
+ export declare function advancement(adapter: Adapter, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean): Promise<Advancement>;
13
23
  export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, remodel: Remodel, continuing: () => boolean): Promise<RefreshOutcome>;
14
24
  //# sourceMappingURL=refresh.d.ts.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,aAAa,EAEb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5E,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,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,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,GACxB,OAAO,CAAC,WAAW,CAAC,CAwEtB;AAED,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,CAKzB"}
package/dist/refresh.js CHANGED
@@ -1,51 +1,48 @@
1
- import { declaredAttachments } from './attachment.js';
1
+ import { acceptedBinaries } from './overlay.js';
2
2
  import { readStaged } from './replica.js';
3
+ import { drafted, settled } from './shared.js';
3
4
  import { unconfirmed } from './transfer.js';
4
- export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
5
- const locator = confirmed.record.locator;
6
- const fromRoomVersion = confirmed.record.roomVersion;
5
+ export async function advancement(adapter, authorization, held, remodel, continuing) {
6
+ const locator = held.locator;
7
+ const fromRoomVersion = held.roomVersion;
7
8
  const first = await adapter.refresh(authorization, {
8
9
  locator,
9
- selection: confirmed.record.replica.selection,
10
+ selection: held.replica.selection,
10
11
  fromRoomVersion,
11
12
  });
12
13
  if (first.kind !== 'net-advancement')
13
14
  return first;
14
15
  const roomVersion = first.roomVersion;
15
16
  const models = remodel(first.models, {
16
- collection: confirmed.record.model,
17
- selection: confirmed.record.selectionModel,
17
+ collection: held.model,
18
+ selection: held.selectionModel,
18
19
  });
19
- const documents = { ...confirmed.record.documents };
20
- const revisions = { ...confirmed.record.revisions };
21
- const changes = { ...confirmed.record.changes };
22
- const written = { ...confirmed.record.written };
23
- const binaryTargets = new Set(confirmed.record.binaryTargets);
24
- const attachments = [];
20
+ const documents = drafted(held.documents);
21
+ const revisions = drafted(held.revisions);
22
+ const changes = drafted(held.changes);
23
+ const written = drafted(held.written);
24
+ const binaries = drafted(held.binaries);
25
25
  const stage = (page) => {
26
- if (page.attachments !== undefined)
27
- attachments.push(page.attachments);
28
- Object.assign(documents, page.documents);
29
- Object.assign(revisions, page.revisions);
30
26
  for (const path of Object.keys(page.documents)) {
31
- binaryTargets.delete(path);
27
+ delete binaries[path];
32
28
  delete changes[path];
33
29
  written[path] = roomVersion;
34
30
  }
35
- for (const target of page.binaryTargets) {
36
- delete documents[target];
37
- delete revisions[target];
38
- delete changes[target];
39
- delete written[target];
40
- binaryTargets.add(target);
31
+ for (const path of Object.keys(page.binaryFiles)) {
32
+ delete documents[path];
33
+ delete changes[path];
34
+ delete written[path];
41
35
  }
36
+ Object.assign(documents, page.documents);
37
+ Object.assign(binaries, acceptedBinaries(page.binaryFiles));
38
+ Object.assign(revisions, page.revisions);
42
39
  Object.assign(changes, page.changes);
43
40
  for (const path of page.removals) {
44
41
  delete documents[path];
45
42
  delete revisions[path];
46
43
  delete changes[path];
47
44
  delete written[path];
48
- binaryTargets.delete(path);
45
+ delete binaries[path];
49
46
  }
50
47
  };
51
48
  stage(first);
@@ -55,7 +52,7 @@ export async function refreshRoom(adapter, authorization, confirmed, remodel, co
55
52
  return unconfirmed;
56
53
  const page = await adapter.refresh(authorization, {
57
54
  locator,
58
- selection: confirmed.record.replica.selection,
55
+ selection: held.replica.selection,
59
56
  fromRoomVersion,
60
57
  pageToken,
61
58
  });
@@ -68,17 +65,25 @@ export async function refreshRoom(adapter, authorization, confirmed, remodel, co
68
65
  stage(page);
69
66
  pageToken = page.pageToken;
70
67
  }
71
- const staged = readStaged({
72
- ...confirmed.record,
73
- model: models.collection,
74
- selectionModel: models.selection,
75
- roomVersion,
76
- documents,
77
- binaryTargets: [...binaryTargets].sort(),
78
- revisions,
79
- changes,
80
- written,
81
- attachments: attachments.length === 0 ? confirmed.record.attachments : declaredAttachments(attachments),
82
- }, confirmed);
68
+ return {
69
+ kind: 'advanced',
70
+ record: {
71
+ ...held,
72
+ model: models.collection,
73
+ selectionModel: models.selection,
74
+ roomVersion,
75
+ documents: settled(documents),
76
+ binaries: settled(binaries),
77
+ revisions: settled(revisions),
78
+ changes: settled(changes),
79
+ written: settled(written),
80
+ },
81
+ };
82
+ }
83
+ export async function refreshRoom(adapter, authorization, confirmed, remodel, continuing) {
84
+ const advanced = await advancement(adapter, authorization, confirmed.record, remodel, continuing);
85
+ if (advanced.kind !== 'advanced')
86
+ return advanced;
87
+ const staged = readStaged(advanced.record, confirmed);
83
88
  return staged.kind === 'staged' ? { kind: 'advanced', confirmed: staged.confirmed } : staged;
84
89
  }
package/dist/replica.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type ChangeBatch } from './change.js';
2
2
  import { type Collection, type Composition } from './collection.js';
3
3
  import { type Layer } from './overlay.js';
4
- import type { HeadChange, RoomAttachment } from './adapter.js';
4
+ import type { MutationResult } from './adapter.js';
5
5
  import type { ReplicaRecord } from './store.js';
6
6
  import type { Refused } from './transfer.js';
7
7
  export type ConfirmedLayer = {
@@ -29,15 +29,18 @@ type ReplayStep = {
29
29
  collection?: Collection;
30
30
  };
31
31
  export declare function compositionOf(record: ReplicaRecord): Composition;
32
- export declare function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
32
+ export declare function confirmedOf(record: ReplicaRecord, previous?: ConfirmedLayer): ConfirmedLayer;
33
33
  export declare function sameMembership(record: ReplicaRecord, other: ReplicaRecord): boolean;
34
- export declare function readStaged(record: ReplicaRecord, previous?: ConfirmedLayer): Staged;
34
+ export declare function readStaged(staged: ReplicaRecord, previous?: ConfirmedLayer): Staged;
35
35
  export declare function readReclassified(record: ReplicaRecord, previous: ConfirmedLayer): Staged | {
36
36
  kind: 'deferred';
37
37
  };
38
- export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, changes: Readonly<Record<string, HeadChange>>, removals: readonly string[], attachments: readonly RoomAttachment[] | undefined, roomVersion: string, writtenAt: string): Staged;
38
+ type Accepted = Extract<MutationResult, {
39
+ kind: 'accepted';
40
+ }>;
41
+ export declare function applyReturned(confirmed: ConfirmedLayer, submitted: ChangeBatch, accepted: Accepted, roomVersion: string, writtenAt: string): Staged;
39
42
  export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], previous?: Replica): Replica;
40
43
  export declare function landed(batch: ChangeBatch, confirmed: ConfirmedLayer, current?: Readonly<Record<string, string>>): boolean;
41
- export declare function withdrawals(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean): readonly ChangeBatch[];
44
+ export declare function withdrawals(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], withdrawable: (batch: ChangeBatch) => boolean, local: boolean): readonly ChangeBatch[];
42
45
  export {};
43
46
  //# sourceMappingURL=replica.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,WAAW,EAAqB,MAAM,aAAa,CAAC;AACnG,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAML,KAAK,KAAK,EACX,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,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;AAiBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,cAAc,CAM5F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAKnF;AAYD,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CA6BnF;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,cAAc,GACvB,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAW/B;AAoBD,KAAK,QAAQ,GAAG,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAE9D,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,WAAW,EACtB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CA+BR;AAgDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA8BT;AA0ED,wBAAgB,MAAM,CACpB,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,cAAc,EACzB,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GAC7C,OAAO,CAoBT;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,EAC7C,KAAK,EAAE,OAAO,GACb,SAAS,WAAW,EAAE,CA2BxB"}