@agentshouse/mdruntime 0.1.0-cee9c8aa4cd86 → 0.1.0-cef5833f6c689

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 (224) hide show
  1. package/README.md +11 -9
  2. package/dist/adapter.d.ts +96 -67
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +2 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +28 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +17 -9
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +143 -94
  13. package/dist/chain.d.ts +2 -1
  14. package/dist/chain.d.ts.map +1 -1
  15. package/dist/client.d.ts +12 -12
  16. package/dist/client.d.ts.map +1 -1
  17. package/dist/client.js +54 -8
  18. package/dist/collection.d.ts +7 -4
  19. package/dist/collection.d.ts.map +1 -1
  20. package/dist/collection.js +24 -19
  21. package/dist/compile.d.ts +1 -6
  22. package/dist/compile.d.ts.map +1 -1
  23. package/dist/compile.js +118 -247
  24. package/dist/connection.d.ts +11 -11
  25. package/dist/connection.d.ts.map +1 -1
  26. package/dist/connection.js +1598 -1248
  27. package/dist/context.d.ts +2 -0
  28. package/dist/context.d.ts.map +1 -0
  29. package/dist/{chat/context.js → context.js} +1 -4
  30. package/dist/conversation.d.ts +18 -15
  31. package/dist/conversation.d.ts.map +1 -1
  32. package/dist/conversation.js +268 -171
  33. package/dist/durability.d.ts +1 -5
  34. package/dist/durability.d.ts.map +1 -1
  35. package/dist/durability.js +5 -0
  36. package/dist/entry.d.ts +3 -2
  37. package/dist/entry.d.ts.map +1 -1
  38. package/dist/entry.js +15 -6
  39. package/dist/file.d.ts +2 -11
  40. package/dist/file.d.ts.map +1 -1
  41. package/dist/file.js +6 -4
  42. package/dist/host.d.ts +3 -6
  43. package/dist/host.d.ts.map +1 -1
  44. package/dist/host.js +49 -35
  45. package/dist/identity.d.ts +0 -1
  46. package/dist/identity.d.ts.map +1 -1
  47. package/dist/identity.js +0 -3
  48. package/dist/index.d.ts +15 -12
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +6 -3
  51. package/dist/job.d.ts +14 -0
  52. package/dist/job.d.ts.map +1 -0
  53. package/dist/job.js +28 -0
  54. package/dist/live.d.ts +2 -1
  55. package/dist/live.d.ts.map +1 -1
  56. package/dist/live.js +9 -5
  57. package/dist/media.d.ts +8 -0
  58. package/dist/media.d.ts.map +1 -0
  59. package/dist/media.js +218 -0
  60. package/dist/memory.d.ts +11 -6
  61. package/dist/memory.d.ts.map +1 -1
  62. package/dist/memory.js +178 -101
  63. package/dist/messages.d.ts +2 -2
  64. package/dist/messages.d.ts.map +1 -1
  65. package/dist/messages.js +15 -16
  66. package/dist/model.d.ts +7 -3
  67. package/dist/model.d.ts.map +1 -1
  68. package/dist/model.js +7 -13
  69. package/dist/observation.d.ts +3 -2
  70. package/dist/observation.d.ts.map +1 -1
  71. package/dist/observation.js +8 -3
  72. package/dist/outcome.d.ts +13 -6
  73. package/dist/outcome.d.ts.map +1 -1
  74. package/dist/outcome.js +16 -5
  75. package/dist/overlay.js +1 -1
  76. package/dist/paths.d.ts +1 -0
  77. package/dist/paths.d.ts.map +1 -1
  78. package/dist/paths.js +4 -0
  79. package/dist/query.d.ts +10 -205
  80. package/dist/query.d.ts.map +1 -1
  81. package/dist/query.js +3 -494
  82. package/dist/reach.d.ts +14 -9
  83. package/dist/reach.d.ts.map +1 -1
  84. package/dist/reach.js +81 -71
  85. package/dist/react.d.ts +3 -1
  86. package/dist/react.d.ts.map +1 -1
  87. package/dist/readiness.d.ts +13 -16
  88. package/dist/readiness.d.ts.map +1 -1
  89. package/dist/readiness.js +2 -8
  90. package/dist/recovery.d.ts +1 -0
  91. package/dist/recovery.d.ts.map +1 -1
  92. package/dist/recovery.js +26 -0
  93. package/dist/refresh.d.ts +10 -4
  94. package/dist/refresh.d.ts.map +1 -1
  95. package/dist/refresh.js +104 -30
  96. package/dist/replica.d.ts +6 -5
  97. package/dist/replica.d.ts.map +1 -1
  98. package/dist/replica.js +8 -7
  99. package/dist/room-draft.d.ts +22 -5
  100. package/dist/room-draft.d.ts.map +1 -1
  101. package/dist/room-draft.js +131 -51
  102. package/dist/rows.d.ts +8 -15
  103. package/dist/rows.d.ts.map +1 -1
  104. package/dist/rows.js +51 -151
  105. package/dist/save.d.ts +2 -0
  106. package/dist/save.d.ts.map +1 -1
  107. package/dist/save.js +13 -7
  108. package/dist/search.d.ts +12 -63
  109. package/dist/search.d.ts.map +1 -1
  110. package/dist/search.js +9 -52
  111. package/dist/shared.d.ts +0 -1
  112. package/dist/shared.d.ts.map +1 -1
  113. package/dist/shared.js +0 -10
  114. package/dist/status.d.ts +4 -3
  115. package/dist/status.d.ts.map +1 -1
  116. package/dist/status.js +3 -1
  117. package/dist/store.d.ts +32 -31
  118. package/dist/store.d.ts.map +1 -1
  119. package/dist/store.js +67 -63
  120. package/dist/stored.d.ts +42 -18
  121. package/dist/stored.d.ts.map +1 -1
  122. package/dist/stored.js +193 -194
  123. package/dist/tables.d.ts +60 -40
  124. package/dist/tables.d.ts.map +1 -1
  125. package/dist/tables.js +78 -62
  126. package/dist/transfer.d.ts +0 -5
  127. package/dist/transfer.d.ts.map +1 -1
  128. package/dist/validation.d.ts +3 -4
  129. package/dist/validation.d.ts.map +1 -1
  130. package/dist/validation.js +39 -97
  131. package/dist/windows.d.ts +1 -12
  132. package/dist/windows.d.ts.map +1 -1
  133. package/dist/windows.js +2 -75
  134. package/dist/wire.d.ts +6 -9
  135. package/dist/wire.d.ts.map +1 -1
  136. package/dist/wire.js +3 -3
  137. package/package.json +11 -18
  138. package/AGENTS.md +0 -320
  139. package/dist/chat/acts.d.ts +0 -33
  140. package/dist/chat/acts.d.ts.map +0 -1
  141. package/dist/chat/acts.js +0 -36
  142. package/dist/chat/context.d.ts +0 -3
  143. package/dist/chat/context.d.ts.map +0 -1
  144. package/dist/chat/earlier.d.ts +0 -10
  145. package/dist/chat/earlier.d.ts.map +0 -1
  146. package/dist/chat/earlier.js +0 -54
  147. package/dist/chat/house.d.ts +0 -25
  148. package/dist/chat/house.d.ts.map +0 -1
  149. package/dist/chat/house.js +0 -38
  150. package/dist/chat/input.d.ts +0 -11
  151. package/dist/chat/input.d.ts.map +0 -1
  152. package/dist/chat/input.js +0 -92
  153. package/dist/chat/kit.d.ts +0 -61
  154. package/dist/chat/kit.d.ts.map +0 -1
  155. package/dist/chat/kit.js +0 -123
  156. package/dist/chat/lasting.d.ts +0 -6
  157. package/dist/chat/lasting.d.ts.map +0 -1
  158. package/dist/chat/lasting.js +0 -19
  159. package/dist/chat/list.d.ts +0 -28
  160. package/dist/chat/list.d.ts.map +0 -1
  161. package/dist/chat/list.js +0 -103
  162. package/dist/chat/markdown.d.ts +0 -21
  163. package/dist/chat/markdown.d.ts.map +0 -1
  164. package/dist/chat/markdown.js +0 -246
  165. package/dist/chat/message.d.ts +0 -7
  166. package/dist/chat/message.d.ts.map +0 -1
  167. package/dist/chat/message.js +0 -254
  168. package/dist/chat/messages.d.ts +0 -35
  169. package/dist/chat/messages.d.ts.map +0 -1
  170. package/dist/chat/messages.js +0 -210
  171. package/dist/chat/name.d.ts +0 -7
  172. package/dist/chat/name.d.ts.map +0 -1
  173. package/dist/chat/name.js +0 -37
  174. package/dist/chat/opened.d.ts +0 -12
  175. package/dist/chat/opened.d.ts.map +0 -1
  176. package/dist/chat/opened.js +0 -19
  177. package/dist/chat/overlay.d.ts +0 -32
  178. package/dist/chat/overlay.d.ts.map +0 -1
  179. package/dist/chat/overlay.js +0 -103
  180. package/dist/chat/parts.d.ts +0 -58
  181. package/dist/chat/parts.d.ts.map +0 -1
  182. package/dist/chat/parts.js +0 -120
  183. package/dist/chat/pieces.d.ts +0 -62
  184. package/dist/chat/pieces.d.ts.map +0 -1
  185. package/dist/chat/pieces.js +0 -1110
  186. package/dist/chat/process.d.ts +0 -20
  187. package/dist/chat/process.d.ts.map +0 -1
  188. package/dist/chat/process.js +0 -32
  189. package/dist/chat/provider.d.ts +0 -70
  190. package/dist/chat/provider.d.ts.map +0 -1
  191. package/dist/chat/provider.js +0 -635
  192. package/dist/chat/question.d.ts +0 -9
  193. package/dist/chat/question.d.ts.map +0 -1
  194. package/dist/chat/question.js +0 -69
  195. package/dist/chat/questions.d.ts +0 -31
  196. package/dist/chat/questions.d.ts.map +0 -1
  197. package/dist/chat/questions.js +0 -111
  198. package/dist/chat/read.d.ts +0 -5
  199. package/dist/chat/read.d.ts.map +0 -1
  200. package/dist/chat/read.js +0 -13
  201. package/dist/chat/ready.d.ts +0 -37
  202. package/dist/chat/ready.d.ts.map +0 -1
  203. package/dist/chat/ready.js +0 -93
  204. package/dist/chat/room-file.d.ts +0 -8
  205. package/dist/chat/room-file.d.ts.map +0 -1
  206. package/dist/chat/room-file.js +0 -72
  207. package/dist/chat/steady.d.ts +0 -3
  208. package/dist/chat/steady.d.ts.map +0 -1
  209. package/dist/chat/steady.js +0 -26
  210. package/dist/chat/style.d.ts +0 -4
  211. package/dist/chat/style.d.ts.map +0 -1
  212. package/dist/chat/style.js +0 -307
  213. package/dist/chat.d.ts +0 -15
  214. package/dist/chat.d.ts.map +0 -1
  215. package/dist/chat.js +0 -8
  216. package/dist/fulltext.d.ts +0 -27
  217. package/dist/fulltext.d.ts.map +0 -1
  218. package/dist/fulltext.js +0 -368
  219. package/dist/reads.d.ts +0 -11
  220. package/dist/reads.d.ts.map +0 -1
  221. package/dist/reads.js +0 -98
  222. package/dist/words.d.ts +0 -19
  223. package/dist/words.d.ts.map +0 -1
  224. package/dist/words.js +0 -150
package/dist/reach.js CHANGED
@@ -2,11 +2,10 @@ import { unheldView } from './conversation.js';
2
2
  import { modelTypes, NO_MODEL } from './model.js';
3
3
  import { changeOf, digestApplied, digestOf, observing, } from './observation.js';
4
4
  import { runtimeError } from './failure.js';
5
- import { absentReference, failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
5
+ import { failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
6
6
  import { beneath } from './paths.js';
7
7
  import { moveTarget, readParts, staleWrite, } from './room-draft.js';
8
8
  import { documentKey } from './rows.js';
9
- import { undeclaredSearch } from './search.js';
10
9
  const UNHELD_TYPES = { collection: modelTypes(NO_MODEL), typedSelection: null };
11
10
  function unconversed(name) {
12
11
  return () => Promise.resolve(undeclared(name));
@@ -14,20 +13,26 @@ function unconversed(name) {
14
13
  const NO_CONVERSATION = {
15
14
  list: () => Promise.resolve([]),
16
15
  read: (conversation) => Promise.resolve(unheldView(conversation)),
17
- create: unconversed('conversation.create'),
18
- send: unconversed('conversation.send'),
19
- attach: unconversed('conversation.attach'),
20
- answer: unconversed('conversation.answer'),
21
- interrupt: unconversed('conversation.interrupt'),
22
- kill: unconversed('conversation.kill'),
23
- cancel: unconversed('conversation.cancel'),
24
- delete: unconversed('conversation.delete'),
16
+ create: unconversed('conversations/create'),
17
+ send: unconversed('conversations/send'),
18
+ answer: unconversed('conversations/interaction/answer'),
19
+ interrupt: unconversed('conversations/interrupt'),
20
+ kill: unconversed('conversations/kill'),
21
+ delete: unconversed('conversations/delete'),
25
22
  };
26
23
  const NO_CHAT_DRAFT = {
27
24
  write: () => Promise.resolve(),
28
25
  prepend: () => Promise.resolve(),
29
26
  discard: () => Promise.resolve(),
30
27
  };
28
+ function areasOf(reach) {
29
+ return reach.areas ?? [];
30
+ }
31
+ function fenced(reach, room, path) {
32
+ return areasOf(reach).some((area) => area.room === room &&
33
+ beneath(area.path, path) &&
34
+ !area.open.some((open) => beneath(open, path)));
35
+ }
31
36
  export function holds(reach, room) {
32
37
  return (reach === null ||
33
38
  reach.rooms.includes(room) ||
@@ -48,21 +53,13 @@ export function governs(reach, room) {
48
53
  }
49
54
  function covers(reach, room, path) {
50
55
  return (reach === null ||
51
- reach.rooms.includes(room) ||
52
- reach.documents.some((document) => document.room === room && document.path === path));
56
+ (!fenced(reach, room, path) &&
57
+ (reach.rooms.includes(room) ||
58
+ reach.documents.some((document) => document.room === room && document.path === path))));
53
59
  }
54
60
  function conversing(reach) {
55
61
  return reach === null || reach.conversations;
56
62
  }
57
- function refers(reach, scope) {
58
- if (reach === null)
59
- return true;
60
- if (scope === null)
61
- return false;
62
- return scope.path === undefined
63
- ? wholly(reach, scope.locator)
64
- : covers(reach, scope.locator, scope.path);
65
- }
66
63
  export function planReach(reach) {
67
64
  return reach === null
68
65
  ? null
@@ -71,6 +68,9 @@ export function planReach(reach) {
71
68
  documents: [
72
69
  ...new Set(reach.documents.map(({ room, path }) => documentKey(room, path))),
73
70
  ].sort(),
71
+ areas: areasOf(reach)
72
+ .map(({ room, path, open }) => ({ room, path, open: [...new Set(open)].sort() }))
73
+ .sort((left, right) => documentKey(left.room, left.path) < documentKey(right.room, right.path) ? -1 : 1),
74
74
  };
75
75
  }
76
76
  function roomsWithin(reach, rooms) {
@@ -119,7 +119,8 @@ function savedWithin(reach, room, result) {
119
119
  function statusWithin(reach, status) {
120
120
  return {
121
121
  ...status,
122
- attentionRequired: status.attentionRequired.filter((entry) => 'refusal' in entry ? wholly(reach, entry.room) : covers(reach, entry.room, entry.path)),
122
+ attentionRequired: status.attentionRequired.filter((entry) => covers(reach, entry.room, entry.path)),
123
+ unsent: status.unsent.filter((change) => covers(reach, change.room, change.path)),
123
124
  };
124
125
  }
125
126
  function queueWithin(reach, room, entries) {
@@ -136,7 +137,7 @@ function queueWithin(reach, room, entries) {
136
137
  });
137
138
  }
138
139
  function unreached(room) {
139
- return runtimeError('room-not-held', `No Local Replica for ${room}`);
140
+ return runtimeError('unknown-room', `Unknown Room ${room}`);
140
141
  }
141
142
  function lockedError(room) {
142
143
  return runtimeError(ROOM_LOCKED, `${room} is locked until House confirms its access`, true);
@@ -144,10 +145,16 @@ function lockedError(room) {
144
145
  function deviceUnreached() {
145
146
  return runtimeError('device-unreached', 'Only the panel cleans up this device');
146
147
  }
147
- export function narrowed(runtime, given, told) {
148
+ const ATTACH_REQUIRED = 'attach-required';
149
+ function attachRequired() {
150
+ return runtimeError(ATTACH_REQUIRED, 'App code takes a file in with binaryFile.attach');
151
+ }
152
+ function carriesFile(parts) {
153
+ return parts !== null && typeof parts === 'object' && Object.hasOwn(parts, 'file');
154
+ }
155
+ export function narrowed(runtime, given, port) {
148
156
  const { md, watch } = runtime;
149
157
  let reach = given;
150
- let port = told;
151
158
  const open = new Set();
152
159
  function following(begin, locking = false) {
153
160
  let stop = begin();
@@ -171,9 +178,9 @@ export function narrowed(runtime, given, told) {
171
178
  };
172
179
  const unlocked = (entries) => entries.filter((entry) => !runtime.locked(entry.room));
173
180
  const intoLocked = (held) => held.some((move) => move?.room !== undefined && runtime.locked(move.room));
174
- const within = (topic, input, deliver) => {
181
+ const within = (topic, input, deliver, fail) => {
175
182
  if (topic === 'rooms') {
176
- return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms))));
183
+ return following(() => watch(topic, input, (rooms) => deliver(roomsWithin(reach, rooms)), fail));
177
184
  }
178
185
  if (topic === 'readiness') {
179
186
  return following(() => runtime.watchReadiness(port, reach, deliver));
@@ -182,10 +189,10 @@ export function narrowed(runtime, given, told) {
182
189
  return following(() => watch(topic, input, (status) => {
183
190
  const within = statusWithin(reach, status);
184
191
  deliver({ ...within, attentionRequired: unlocked(within.attentionRequired) });
185
- }), true);
192
+ }, fail), true);
186
193
  }
187
194
  if (topic === 'room-drafts') {
188
- return following(() => watch(topic, input, (drafts) => deliver(unlocked(draftsWithin(reach, drafts)))), true);
195
+ return following(() => watch(topic, input, (drafts) => deliver(unlocked(draftsWithin(reach, drafts))), fail), true);
189
196
  }
190
197
  if (topic === 'queue') {
191
198
  const room = input[0];
@@ -194,7 +201,7 @@ export function narrowed(runtime, given, told) {
194
201
  deliver([]);
195
202
  return () => { };
196
203
  }
197
- return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)));
204
+ return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)), fail);
198
205
  }, true);
199
206
  }
200
207
  if (topic === 'query') {
@@ -227,6 +234,9 @@ export function narrowed(runtime, given, told) {
227
234
  const stop = runtime.watchPlan(current, (message) => {
228
235
  if (open)
229
236
  heard(message);
237
+ }, (error) => {
238
+ if (open)
239
+ fail(error);
230
240
  });
231
241
  return () => {
232
242
  open = false;
@@ -237,7 +247,7 @@ export function narrowed(runtime, given, told) {
237
247
  if (topic === 'conversation') {
238
248
  return following(() => {
239
249
  if (conversing(reach))
240
- return watch(topic, input, deliver);
250
+ return watch(topic, input, deliver, fail);
241
251
  deliver(unheldView(input[0]));
242
252
  return () => { };
243
253
  });
@@ -245,16 +255,16 @@ export function narrowed(runtime, given, told) {
245
255
  if (topic === 'conversations' || topic === 'agents') {
246
256
  return following(() => {
247
257
  if (conversing(reach))
248
- return watch(topic, input, deliver);
258
+ return watch(topic, input, deliver, fail);
249
259
  deliver([]);
250
260
  return () => { };
251
261
  });
252
262
  }
253
- return watch(topic, input, deliver);
263
+ return watch(topic, input, deliver, fail);
254
264
  };
255
265
  const files = new Map();
256
266
  let handed = 0;
257
- const hand = async (reading) => {
267
+ async function hand(reading) {
258
268
  const answer = await reading;
259
269
  if (answer.kind !== 'binary')
260
270
  return answer;
@@ -262,19 +272,17 @@ export function narrowed(runtime, given, told) {
262
272
  const file = String(handed);
263
273
  files.set(file, answer.file);
264
274
  return { ...answer, file };
265
- };
275
+ }
266
276
  const conversation = () => (conversing(reach) ? md.conversation : NO_CONVERSATION);
267
277
  const chatDraft = () => (conversing(reach) ? md.chatDraft : NO_CHAT_DRAFT);
268
278
  const view = {
269
279
  ...md,
270
- rooms: () => roomsWithin(reach, md.rooms()),
280
+ rooms: () => md.rooms().then((rooms) => roomsWithin(reach, rooms)),
271
281
  query: ((input) => {
272
282
  const plan = runtime.plan(input, reach);
273
283
  return Promise.resolve(unlocking(plan.rooms) ?? runtime.query({ ...plan, locked: runtime.lockedRooms() }));
274
284
  }),
275
- search: (input) => port.search === 'required'
276
- ? runtime.search(input, reach, runtime.lockedRooms())
277
- : Promise.resolve(undeclaredSearch()),
285
+ search: (input) => runtime.search(input, reach),
278
286
  types(room) {
279
287
  if (holds(reach, room) && runtime.locked(room))
280
288
  throw lockedError(room);
@@ -282,8 +290,7 @@ export function narrowed(runtime, given, told) {
282
290
  return md.types(room);
283
291
  if (!holds(reach, room))
284
292
  return structuredClone(UNHELD_TYPES);
285
- const listed = md.rooms().find(({ locator }) => locator === room);
286
- return typesWithin(reach, listed, md.types(room));
293
+ return typesWithin(reach, runtime.room(room), md.types(room));
287
294
  },
288
295
  async save(room, roomDrafts, writtenBy) {
289
296
  if (!holds(reach, room))
@@ -302,9 +309,13 @@ export function narrowed(runtime, given, told) {
302
309
  async saveParts(room, parts, writtenBy) {
303
310
  if (!holds(reach, room))
304
311
  throw unreached(room);
312
+ const filed = reach === null ? undefined : parts.find(({ parts: one }) => carriesFile(one));
313
+ if (filed !== undefined) {
314
+ return { outcome: 'refused', code: ATTACH_REQUIRED, retryable: false, file: filed.path };
315
+ }
305
316
  if (runtime.locked(room))
306
317
  return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
307
- const held = parts.map(({ parts: one }) => readParts(one).move);
318
+ const held = parts.map(({ path, parts: one }) => readParts(one, path).move);
308
319
  if (parts.some(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]))) {
309
320
  throw unreached(room);
310
321
  }
@@ -334,15 +345,16 @@ export function narrowed(runtime, given, told) {
334
345
  : runtime.locked(room)
335
346
  ? Promise.resolve(lockedRoom(room))
336
347
  : md.binaryFile.link(room, path, revision),
337
- readReference(reference) {
338
- const scope = runtime.referrerScope(reference.referrer);
339
- if (!refers(reach, scope))
340
- return Promise.resolve(absentReference(reference.fileRef));
341
- if (scope !== null && runtime.locked(scope.locator)) {
342
- return Promise.resolve(lockedRoom(scope.locator));
343
- }
344
- return hand(md.binaryFile.readReference(reference));
345
- },
348
+ show: (room, path, revision) => !covers(reach, room, path)
349
+ ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
350
+ : runtime.locked(room)
351
+ ? Promise.resolve(lockedRoom(room))
352
+ : hand(md.binaryFile.show(room, path, revision)),
353
+ attach: (room, file) => !wholly(reach, room)
354
+ ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
355
+ : runtime.locked(room)
356
+ ? Promise.resolve(lockedRoom(room))
357
+ : md.binaryFile.attach(room, file),
346
358
  async part(file, part) {
347
359
  const key = files.get(file);
348
360
  if (key === undefined)
@@ -367,15 +379,24 @@ export function narrowed(runtime, given, told) {
367
379
  throw lockedError(room);
368
380
  return shownDraft(reach, await md.roomDraft.read(room, path));
369
381
  },
370
- async write(room, path, revision, parts) {
371
- const move = readParts(parts).move;
372
- if (!covers(reach, room, path) || !moves(reach, room, move))
373
- throw unreached(room);
374
- if (runtime.locked(room))
375
- throw lockedError(room);
376
- if (intoLocked([move]))
377
- throw lockedError(move.room);
378
- return writeWithin(reach, await md.roomDraft.write(room, path, revision, parts));
382
+ write(room, path, revision, parts, next) {
383
+ try {
384
+ if (reach !== null && carriesFile(parts))
385
+ throw attachRequired();
386
+ const move = readParts(parts, path).move;
387
+ if (!covers(reach, room, path) || !moves(reach, room, move))
388
+ throw unreached(room);
389
+ if (runtime.locked(room))
390
+ throw lockedError(room);
391
+ if (intoLocked([move]))
392
+ throw lockedError(move.room);
393
+ }
394
+ catch (error) {
395
+ return Promise.reject(error);
396
+ }
397
+ return md.roomDraft
398
+ .write(room, path, revision, parts, next)
399
+ .then((written) => writeWithin(reach, written));
379
400
  },
380
401
  async discard(room, path, revision) {
381
402
  if (!covers(reach, room, path))
@@ -390,15 +411,9 @@ export function narrowed(runtime, given, told) {
390
411
  read: (id, options) => conversation().read(id, options),
391
412
  create: (input) => conversation().create(input),
392
413
  send: (id, operation, draft) => conversation().send(id, operation, draft),
393
- attach: (room, file) => !wholly(reach, room)
394
- ? Promise.resolve(failure({ kind: 'room-not-readable', locator: room }))
395
- : runtime.locked(room)
396
- ? Promise.resolve(lockedRoom(room))
397
- : conversation().attach(room, file),
398
414
  answer: (id, answer) => conversation().answer(id, answer),
399
415
  interrupt: (id) => conversation().interrupt(id),
400
416
  kill: (id) => conversation().kill(id),
401
- cancel: (id, turn) => conversation().cancel(id, turn),
402
417
  delete: (id) => conversation().delete(id),
403
418
  },
404
419
  chatDraft: {
@@ -416,10 +431,5 @@ export function narrowed(runtime, given, told) {
416
431
  for (const restart of [...open])
417
432
  restart();
418
433
  },
419
- facts(next) {
420
- port = next;
421
- for (const restart of [...open])
422
- restart();
423
- },
424
434
  };
425
435
  }
package/dist/react.d.ts CHANGED
@@ -1,10 +1,11 @@
1
+ import type { DocumentQuery, GroupQuery } from '@agentshouse/mdmodel';
1
2
  import type { MdRuntimeClient } from './client.js';
2
3
  import type { AppRoom, ConnectionRefusal, SavedRoomDraft, SaveResult } from './connection.js';
3
4
  import type { Member, ServiceMode } from './adapter.js';
4
5
  import type { ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
5
6
  import { type RuntimeError } from './failure.js';
6
7
  import type { QueueEntry } from './outcome.js';
7
- import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
8
+ import type { DocumentResult, GroupResult, PendingResult } from './query.js';
8
9
  import type { Readiness } from './readiness.js';
9
10
  import type { RoomDraft, RoomDraftParts } from './room-draft.js';
10
11
  import type { SyncStatus } from './status.js';
@@ -23,6 +24,7 @@ export declare function useObserve(client: Client, topic: 'storage-loss'): Obser
23
24
  export declare function useObserve(client: Client, topic: 'sync-status'): Observed<SyncStatus>;
24
25
  export declare function useObserve(client: Client, topic: 'service-mode'): Observed<ServiceMode>;
25
26
  export declare function useObserve(client: Client, topic: 'member'): Observed<Member | null>;
27
+ export declare function useObserve(client: Client, topic: 'authority-changes'): Observed<number>;
26
28
  export declare function useObserve(client: Client, topic: 'query', query: DocumentQuery): Observed<DocumentResult | PendingResult>;
27
29
  export declare function useObserve(client: Client, topic: 'query', query: GroupQuery): Observed<GroupResult | PendingResult>;
28
30
  export declare function useObserve(client: Client, topic: 'queue', locator: string): Observed<readonly QueueEntry[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,33 @@
1
1
  import type { Open } from './open.js';
2
2
  export type CodeAvailability = Open<'stored' | 'absent'>;
3
- export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | 'refused' | 'unadmitted'>;
3
+ export type RoomPreparation = Open<'complete' | 'acquiring' | 'preparing' | 'unadmitted'>;
4
4
  export type RoomCoverage = {
5
5
  readonly room: string;
6
6
  readonly state: RoomPreparation;
7
7
  };
8
8
  export type ConversationCoverage = Open<'complete' | 'acquiring' | 'undeclared'>;
9
- export type SearchObligation = Open<'required' | 'unused'>;
10
9
  export type TargetCoverage = {
11
10
  readonly complete: boolean;
12
11
  readonly listed: boolean;
13
12
  readonly rooms: readonly RoomCoverage[];
14
13
  readonly conversations: ConversationCoverage;
15
- readonly search: SearchObligation;
16
14
  };
17
15
  export type Persistence = Open<'granted' | 'denied' | 'unavailable'>;
18
16
  export type Durability = Open<'persistent' | 'best-effort'>;
19
17
  export type ConnectionAvailability = Open<'connected' | 'connecting' | 'unreachable'>;
20
18
  export type HouseOutcome = Open<'open' | 'write-halted' | 'refused'>;
21
- export type CapacityCause = {
22
- readonly cause: Open<'insufficient-space' | 'storage-exceeded'>;
23
- readonly needed: number | null;
24
- readonly available: number | null;
19
+ export type Space = Open<'full'>;
20
+ export type InstallationStep = Open<'downloading' | 'writing' | 'replaying'>;
21
+ export type InstallationAmount = {
22
+ readonly done: number;
23
+ readonly total: number;
25
24
  };
26
- export type RefusedRoom = {
27
- readonly room: string;
28
- readonly file: string;
29
- readonly rule: string;
30
- readonly location: string | null;
25
+ export type Installation = {
26
+ readonly step: InstallationStep | null;
27
+ readonly rooms: InstallationAmount;
28
+ readonly bytes: InstallationAmount;
31
29
  };
32
- export type ReadinessStatus = Open<'preparing' | 'paused' | 'refused' | 'ready' | 'lost'>;
30
+ export type ReadinessStatus = Open<'preparing' | 'paused' | 'ready' | 'lost'>;
33
31
  export type Readiness = {
34
32
  readonly status: ReadinessStatus;
35
33
  readonly ready: boolean;
@@ -40,14 +38,13 @@ export type Readiness = {
40
38
  readonly persistence: Persistence;
41
39
  readonly connection: ConnectionAvailability;
42
40
  readonly house: HouseOutcome;
43
- readonly capacity: CapacityCause | null;
44
- readonly refused: readonly RefusedRoom[];
41
+ readonly space: Space | null;
42
+ readonly installation: Installation;
45
43
  readonly lost: boolean;
46
44
  };
47
45
  export type ReadinessFacts = Omit<Readiness, 'status' | 'ready' | 'usable' | 'durability' | 'coverage'> & {
48
46
  readonly coverage: Omit<TargetCoverage, 'complete'>;
49
47
  readonly established: boolean;
50
48
  };
51
- export declare const SETTLED_ROOMS: ReadonlySet<string>;
52
49
  export declare function readinessOf(facts: ReadinessFacts): Readiness;
53
50
  //# sourceMappingURL=readiness.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../src/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;AAEzD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;AAE1F,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAA;CAAE,CAAC;AAEtF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;AAEjF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,oBAAoB,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,aAAa,CAAC,CAAC;AAErE,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,CAAC;AAE5D,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,WAAW,GAAG,YAAY,GAAG,aAAa,CAAC,CAAC;AAEtF,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAEjC,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,aAAa,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;AAE7E,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAE9E,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,SAAS,EACT,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAC1D,GAAG;IACF,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B,CAAC;AAIF,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CA2B5D"}
package/dist/readiness.js CHANGED
@@ -1,27 +1,21 @@
1
1
  const COMPLETE_ROOMS = new Set(['complete', 'unadmitted']);
2
- export const SETTLED_ROOMS = new Set([...COMPLETE_ROOMS, 'refused']);
3
2
  export function readinessOf(facts) {
4
3
  const { established, coverage: held, ...reported } = facts;
5
4
  const settledConversations = held.conversations === 'complete' || held.conversations === 'undeclared';
6
5
  const complete = held.listed &&
7
6
  settledConversations &&
8
7
  held.rooms.every((room) => COMPLETE_ROOMS.has(room.state));
9
- const settled = held.listed &&
10
- settledConversations &&
11
- held.rooms.every((room) => SETTLED_ROOMS.has(room.state));
12
8
  const coverage = { ...held, complete };
13
9
  const stored = facts.code === 'stored';
14
10
  const ready = stored && complete;
15
11
  const usable = stored && (ready || established);
16
12
  const status = ready
17
13
  ? 'ready'
18
- : facts.capacity !== null
14
+ : facts.space !== null
19
15
  ? 'paused'
20
16
  : facts.lost && !established
21
17
  ? 'lost'
22
- : settled && !complete
23
- ? 'refused'
24
- : 'preparing';
18
+ : 'preparing';
25
19
  return {
26
20
  ...reported,
27
21
  coverage,
@@ -21,5 +21,6 @@ export type Recovery = {
21
21
  retire(): Promise<void>;
22
22
  };
23
23
  export declare function retryDelay(tries: number, firstMs?: number, maxMs?: number): number;
24
+ export declare function untilAnswered<T>(ask: () => Promise<T>, signal: AbortSignal, answered?: (answer: T) => boolean): Promise<T>;
24
25
  export declare function createRecovery(options?: RecoveryOptions): Recovery;
25
26
  //# sourceMappingURL=recovery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAwKD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB,CAAC;AAsBF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAW,EAAE,KAAK,SAAS,GAAG,MAAM,CAGpF;AAED,wBAAsB,aAAa,CAAC,CAAC,EACnC,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,MAAM,EAAE,WAAW,EACnB,QAAQ,GAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAoB,GAC5C,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAwKD,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,QAAQ,CAStE"}
package/dist/recovery.js CHANGED
@@ -7,6 +7,32 @@ export function retryDelay(tries, firstMs = FIRST_MS, maxMs = MAX_MS) {
7
7
  const longest = Math.min(maxMs, firstMs * 2 ** tries);
8
8
  return longest / 2 + (Math.random() * longest) / 2;
9
9
  }
10
+ export async function untilAnswered(ask, signal, answered = () => true) {
11
+ for (let tries = 0;; tries += 1) {
12
+ try {
13
+ const answer = await ask();
14
+ if (answered(answer) || signal.aborted)
15
+ return answer;
16
+ }
17
+ catch (error) {
18
+ if (signal.aborted)
19
+ throw error;
20
+ }
21
+ await new Promise((resume) => {
22
+ const stop = () => {
23
+ clearTimeout(again);
24
+ resume();
25
+ };
26
+ // A read that failed is asked again on the doubling backoff, so its asker is answered once the failure clears.
27
+ const again = setTimeout(() => {
28
+ signal.removeEventListener('abort', stop);
29
+ resume();
30
+ }, retryDelay(tries));
31
+ signal.addEventListener('abort', stop, { once: true });
32
+ });
33
+ signal.throwIfAborted();
34
+ }
35
+ }
10
36
  function owner(backoff, inFlight, release = () => { }) {
11
37
  const intents = new Map();
12
38
  const children = new Set();
package/dist/refresh.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import type { AdapterFailure, Authorization, RetryableRefusal } from './adapter.js';
2
- import type { Reads, Remodel } from './bootstrap.js';
1
+ import type { AdapterFailure, Authorization, RefreshPage, RefreshRequest, RefreshResult, RetryableRefusal } from './adapter.js';
2
+ import type { Remodel } from './bootstrap.js';
3
3
  import type { ReplicaRecord } from './replica.js';
4
4
  import type { RefreshedPage } from './store.js';
5
- import type { HeldEntry } from './tables.js';
5
+ import type { HeldEntry, StoredEntry } from './tables.js';
6
6
  import { type Unconfirmed } from './transfer.js';
7
7
  export type Advancement = {
8
8
  kind: 'still-current';
@@ -13,9 +13,15 @@ export type Advancement = {
13
13
  } | {
14
14
  kind: 'beyond-horizon';
15
15
  } | RetryableRefusal | Unconfirmed | AdapterFailure;
16
+ export type Refresher = (authorization: Authorization, request: RefreshRequest) => Promise<RefreshResult>;
16
17
  export type Refreshing = {
18
+ turn(): void;
17
19
  prior(paths: readonly string[]): Promise<ReadonlyMap<string, HeldEntry>>;
20
+ later(paths: readonly string[], roomVersion: string): Promise<ReadonlySet<string>>;
18
21
  stage(page: RefreshedPage): Promise<boolean>;
19
22
  };
20
- export declare function advancement(adapter: Reads, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
23
+ type PageContent = Pick<RefreshPage, 'documents' | 'outlines' | 'revisions' | 'fileIds' | 'changes' | 'binaryFiles'>;
24
+ export declare function pageEntries(page: PageContent, removals: readonly string[], roomVersion: string, prior: (paths: readonly string[]) => Promise<ReadonlyMap<string, HeldEntry>>): Promise<StoredEntry[]>;
25
+ export declare function advancement(refresh: Refresher, authorization: Authorization, held: ReplicaRecord, remodel: Remodel, continuing: () => boolean, staging: Refreshing): Promise<Advancement>;
26
+ export {};
21
27
  //# sourceMappingURL=refresh.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAe,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AAkEF,wBAAsB,WAAW,CAC/B,OAAO,EAAE,KAAK,EACd,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA+CtB"}
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAG9D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,gBAAgB,GAChB,WAAW,GACX,cAAc,CAAC;AAEnB,MAAM,MAAM,SAAS,GAAG,CACtB,aAAa,EAAE,aAAa,EAC5B,OAAO,EAAE,cAAc,KACpB,OAAO,CAAC,aAAa,CAAC,CAAC;AAE5B,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,KAAK,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9C,CAAC;AAUF,KAAK,WAAW,GAAG,IAAI,CACrB,WAAW,EACX,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,aAAa,CAC/E,CAAC;AAoGF,wBAAsB,WAAW,CAC/B,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAC3E,OAAO,CAAC,WAAW,EAAE,CAAC,CAKxB;AAgDD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,SAAS,EAClB,aAAa,EAAE,aAAa,EAC5B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,OAAO,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA8CtB"}