@agentshouse/mdruntime 0.1.0-c94cfdbdb6f68 → 0.1.0-c95dc33df5c05

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 (364) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +389 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +250 -0
  8. package/dist/adapter.d.ts +140 -85
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +7 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +40 -41
  13. package/dist/binary.d.ts +0 -5
  14. package/dist/binary.d.ts.map +1 -1
  15. package/dist/binary.js +1 -1
  16. package/dist/bootstrap.d.ts +30 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +319 -111
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +12 -0
  23. package/dist/chain.d.ts.map +1 -0
  24. package/dist/chain.js +64 -0
  25. package/dist/change-set.d.ts +9 -16
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +11 -89
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +10 -1
  31. package/dist/chat-types.d.ts +5 -0
  32. package/dist/chat-types.d.ts.map +1 -0
  33. package/dist/chat-types.js +13 -0
  34. package/dist/client.d.ts +30 -11
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +83 -7
  37. package/dist/collection.d.ts +11 -21
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +39 -321
  40. package/dist/compile.d.ts +16 -0
  41. package/dist/compile.d.ts.map +1 -0
  42. package/dist/compile.js +717 -0
  43. package/dist/connection.d.ts +7 -137
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +98 -3600
  46. package/dist/context.d.ts +2 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/{chat/context.js → context.js} +1 -4
  49. package/dist/conversation-row.d.ts +33 -0
  50. package/dist/conversation-row.d.ts.map +1 -0
  51. package/dist/conversation-row.js +53 -0
  52. package/dist/conversation.d.ts +37 -18
  53. package/dist/conversation.d.ts.map +1 -1
  54. package/dist/conversation.js +573 -287
  55. package/dist/digest.d.ts +7 -0
  56. package/dist/digest.d.ts.map +1 -0
  57. package/dist/digest.js +113 -0
  58. package/dist/discovery.d.ts +10 -0
  59. package/dist/discovery.d.ts.map +1 -0
  60. package/dist/discovery.js +175 -0
  61. package/dist/durability.d.ts +16 -4
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/durability.js +5 -0
  64. package/dist/entry.d.ts +5 -2
  65. package/dist/entry.d.ts.map +1 -1
  66. package/dist/entry.js +33 -29
  67. package/dist/figures.d.ts +48 -0
  68. package/dist/figures.d.ts.map +1 -0
  69. package/dist/figures.js +197 -0
  70. package/dist/file.d.ts +2 -19
  71. package/dist/file.d.ts.map +1 -1
  72. package/dist/file.js +7 -122
  73. package/dist/holdings.d.ts +29 -0
  74. package/dist/holdings.d.ts.map +1 -0
  75. package/dist/holdings.js +95 -0
  76. package/dist/host.d.ts +4 -7
  77. package/dist/host.d.ts.map +1 -1
  78. package/dist/host.js +67 -39
  79. package/dist/identity.d.ts +0 -2
  80. package/dist/identity.d.ts.map +1 -1
  81. package/dist/identity.js +0 -6
  82. package/dist/index.d.ts +31 -13
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +10 -2
  85. package/dist/install.d.ts +56 -0
  86. package/dist/install.d.ts.map +1 -0
  87. package/dist/install.js +560 -0
  88. package/dist/job.d.ts +33 -0
  89. package/dist/job.d.ts.map +1 -0
  90. package/dist/job.js +54 -0
  91. package/dist/lifecycle.d.ts +7 -0
  92. package/dist/lifecycle.d.ts.map +1 -0
  93. package/dist/lifecycle.js +267 -0
  94. package/dist/listing.d.ts +53 -0
  95. package/dist/listing.d.ts.map +1 -0
  96. package/dist/listing.js +175 -0
  97. package/dist/live.d.ts +23 -0
  98. package/dist/live.d.ts.map +1 -0
  99. package/dist/live.js +165 -0
  100. package/dist/locks.d.ts +9 -0
  101. package/dist/locks.d.ts.map +1 -0
  102. package/dist/locks.js +61 -0
  103. package/dist/log.d.ts +1 -0
  104. package/dist/log.d.ts.map +1 -1
  105. package/dist/lost.d.ts +5 -0
  106. package/dist/lost.d.ts.map +1 -0
  107. package/dist/lost.js +61 -0
  108. package/dist/media.d.ts +8 -0
  109. package/dist/media.d.ts.map +1 -0
  110. package/dist/media.js +218 -0
  111. package/dist/memory.d.ts +14 -6
  112. package/dist/memory.d.ts.map +1 -1
  113. package/dist/memory.js +237 -105
  114. package/dist/messages.d.ts +52 -0
  115. package/dist/messages.d.ts.map +1 -0
  116. package/dist/messages.js +168 -0
  117. package/dist/model.d.ts +8 -10
  118. package/dist/model.d.ts.map +1 -1
  119. package/dist/model.js +6 -18
  120. package/dist/models.d.ts +14 -0
  121. package/dist/models.d.ts.map +1 -0
  122. package/dist/models.js +193 -0
  123. package/dist/name.d.ts +4 -0
  124. package/dist/name.d.ts.map +1 -0
  125. package/dist/name.js +122 -0
  126. package/dist/observation.d.ts +15 -2
  127. package/dist/observation.d.ts.map +1 -1
  128. package/dist/observation.js +91 -2
  129. package/dist/opened.d.ts +22 -0
  130. package/dist/opened.d.ts.map +1 -0
  131. package/dist/opened.js +107 -0
  132. package/dist/opening.d.ts +4 -0
  133. package/dist/opening.d.ts.map +1 -0
  134. package/dist/opening.js +56 -0
  135. package/dist/outcome.d.ts +44 -9
  136. package/dist/outcome.d.ts.map +1 -1
  137. package/dist/outcome.js +41 -2
  138. package/dist/overlay.d.ts +3 -5
  139. package/dist/overlay.d.ts.map +1 -1
  140. package/dist/overlay.js +98 -172
  141. package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
  142. package/dist/parts.d.ts.map +1 -0
  143. package/dist/{chat/parts.js → parts.js} +45 -46
  144. package/dist/paths.d.ts +1 -0
  145. package/dist/paths.d.ts.map +1 -1
  146. package/dist/paths.js +4 -0
  147. package/dist/preparation.d.ts +20 -0
  148. package/dist/preparation.d.ts.map +1 -0
  149. package/dist/preparation.js +226 -0
  150. package/dist/queries.d.ts +16 -0
  151. package/dist/queries.d.ts.map +1 -0
  152. package/dist/queries.js +272 -0
  153. package/dist/query.d.ts +21 -206
  154. package/dist/query.d.ts.map +1 -1
  155. package/dist/query.js +3 -493
  156. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  157. package/dist/questions.d.ts.map +1 -0
  158. package/dist/{chat/questions.js → questions.js} +12 -1
  159. package/dist/reach.d.ts +20 -9
  160. package/dist/reach.d.ts.map +1 -1
  161. package/dist/reach.js +278 -103
  162. package/dist/react.d.ts +10 -2
  163. package/dist/react.d.ts.map +1 -1
  164. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  165. package/dist/read.d.ts.map +1 -0
  166. package/dist/{chat/read.js → read.js} +4 -0
  167. package/dist/readiness.d.ts +14 -17
  168. package/dist/readiness.d.ts.map +1 -1
  169. package/dist/readiness.js +2 -8
  170. package/dist/reads.d.ts +35 -10
  171. package/dist/reads.d.ts.map +1 -1
  172. package/dist/reads.js +136 -84
  173. package/dist/recovery.d.ts +3 -2
  174. package/dist/recovery.d.ts.map +1 -1
  175. package/dist/recovery.js +43 -8
  176. package/dist/refresh.d.ts +18 -15
  177. package/dist/refresh.d.ts.map +1 -1
  178. package/dist/refresh.js +143 -58
  179. package/dist/refusal.d.ts +5 -0
  180. package/dist/refusal.d.ts.map +1 -0
  181. package/dist/refusal.js +56 -0
  182. package/dist/replica.d.ts +54 -36
  183. package/dist/replica.d.ts.map +1 -1
  184. package/dist/replica.js +313 -188
  185. package/dist/room-draft.d.ts +25 -6
  186. package/dist/room-draft.d.ts.map +1 -1
  187. package/dist/room-draft.js +158 -71
  188. package/dist/room-drafts.d.ts +24 -0
  189. package/dist/room-drafts.d.ts.map +1 -0
  190. package/dist/room-drafts.js +216 -0
  191. package/dist/rows.d.ts +31 -31
  192. package/dist/rows.d.ts.map +1 -1
  193. package/dist/rows.js +59 -123
  194. package/dist/runtime.d.ts +42 -0
  195. package/dist/runtime.d.ts.map +1 -0
  196. package/dist/runtime.js +1 -0
  197. package/dist/save.d.ts +52 -14
  198. package/dist/save.d.ts.map +1 -1
  199. package/dist/save.js +518 -185
  200. package/dist/saves.d.ts +70 -0
  201. package/dist/saves.d.ts.map +1 -0
  202. package/dist/saves.js +1004 -0
  203. package/dist/search.d.ts +12 -95
  204. package/dist/search.d.ts.map +1 -1
  205. package/dist/search.js +10 -266
  206. package/dist/seed.d.ts +11 -2
  207. package/dist/seed.d.ts.map +1 -1
  208. package/dist/seed.js +71 -0
  209. package/dist/shared.d.ts +7 -3
  210. package/dist/shared.d.ts.map +1 -1
  211. package/dist/shared.js +119 -66
  212. package/dist/shown.d.ts +31 -0
  213. package/dist/shown.d.ts.map +1 -0
  214. package/dist/shown.js +294 -0
  215. package/dist/socket/admission.d.ts +7 -0
  216. package/dist/socket/admission.d.ts.map +1 -0
  217. package/dist/socket/admission.js +39 -0
  218. package/dist/socket/answers.d.ts +6 -0
  219. package/dist/socket/answers.d.ts.map +1 -0
  220. package/dist/socket/answers.js +20 -0
  221. package/dist/socket/lanes.d.ts +20 -0
  222. package/dist/socket/lanes.d.ts.map +1 -0
  223. package/dist/socket/lanes.js +77 -0
  224. package/dist/socket/reads.d.ts +10 -0
  225. package/dist/socket/reads.d.ts.map +1 -0
  226. package/dist/socket/reads.js +31 -0
  227. package/dist/socket/rooms.d.ts +43 -0
  228. package/dist/socket/rooms.d.ts.map +1 -0
  229. package/dist/socket/rooms.js +90 -0
  230. package/dist/socket/session.d.ts +39 -0
  231. package/dist/socket/session.d.ts.map +1 -0
  232. package/dist/socket/session.js +23 -0
  233. package/dist/socket.d.ts +70 -0
  234. package/dist/socket.d.ts.map +1 -0
  235. package/dist/socket.js +175 -0
  236. package/dist/source.d.ts +61 -0
  237. package/dist/source.d.ts.map +1 -0
  238. package/dist/source.js +81 -0
  239. package/dist/status.d.ts +4 -5
  240. package/dist/status.d.ts.map +1 -1
  241. package/dist/status.js +3 -7
  242. package/dist/store/fences.d.ts +16 -0
  243. package/dist/store/fences.d.ts.map +1 -0
  244. package/dist/store/fences.js +26 -0
  245. package/dist/store/installs.d.ts +30 -0
  246. package/dist/store/installs.d.ts.map +1 -0
  247. package/dist/store/installs.js +34 -0
  248. package/dist/store/readiness.d.ts +10 -0
  249. package/dist/store/readiness.d.ts.map +1 -0
  250. package/dist/store/readiness.js +52 -0
  251. package/dist/store/records.d.ts +212 -0
  252. package/dist/store/records.d.ts.map +1 -0
  253. package/dist/store/records.js +408 -0
  254. package/dist/store/room-held.d.ts +8 -0
  255. package/dist/store/room-held.d.ts.map +1 -0
  256. package/dist/store/room-held.js +17 -0
  257. package/dist/store/space.d.ts +11 -0
  258. package/dist/store/space.d.ts.map +1 -0
  259. package/dist/store/space.js +43 -0
  260. package/dist/store/watchers.d.ts +17 -0
  261. package/dist/store/watchers.d.ts.map +1 -0
  262. package/dist/store/watchers.js +57 -0
  263. package/dist/store/writes.d.ts +24 -0
  264. package/dist/store/writes.d.ts.map +1 -0
  265. package/dist/store/writes.js +125 -0
  266. package/dist/store.d.ts +106 -164
  267. package/dist/store.d.ts.map +1 -1
  268. package/dist/store.js +136 -752
  269. package/dist/stored.d.ts +156 -0
  270. package/dist/stored.d.ts.map +1 -0
  271. package/dist/stored.js +637 -0
  272. package/dist/surface.d.ts +88 -0
  273. package/dist/surface.d.ts.map +1 -0
  274. package/dist/surface.js +222 -0
  275. package/dist/sync.d.ts +20 -0
  276. package/dist/sync.d.ts.map +1 -0
  277. package/dist/sync.js +531 -0
  278. package/dist/tables.d.ts +415 -0
  279. package/dist/tables.d.ts.map +1 -0
  280. package/dist/tables.js +740 -0
  281. package/dist/tallies.d.ts +18 -0
  282. package/dist/tallies.d.ts.map +1 -0
  283. package/dist/tallies.js +129 -0
  284. package/dist/transfer.d.ts +0 -5
  285. package/dist/transfer.d.ts.map +1 -1
  286. package/dist/turn.d.ts +4 -2
  287. package/dist/turn.d.ts.map +1 -1
  288. package/dist/turn.js +46 -22
  289. package/dist/validation.d.ts +29 -0
  290. package/dist/validation.d.ts.map +1 -0
  291. package/dist/validation.js +104 -0
  292. package/dist/windows.d.ts +1 -16
  293. package/dist/windows.d.ts.map +1 -1
  294. package/dist/windows.js +2 -79
  295. package/dist/wire.d.ts +34 -6
  296. package/dist/wire.d.ts.map +1 -1
  297. package/dist/wire.js +12 -2
  298. package/package.json +18 -19
  299. package/AGENTS.md +0 -299
  300. package/dist/chat/acts.d.ts +0 -33
  301. package/dist/chat/acts.d.ts.map +0 -1
  302. package/dist/chat/acts.js +0 -36
  303. package/dist/chat/context.d.ts +0 -3
  304. package/dist/chat/context.d.ts.map +0 -1
  305. package/dist/chat/earlier.d.ts +0 -10
  306. package/dist/chat/earlier.d.ts.map +0 -1
  307. package/dist/chat/earlier.js +0 -54
  308. package/dist/chat/input.d.ts +0 -9
  309. package/dist/chat/input.d.ts.map +0 -1
  310. package/dist/chat/input.js +0 -99
  311. package/dist/chat/kit.d.ts +0 -61
  312. package/dist/chat/kit.d.ts.map +0 -1
  313. package/dist/chat/kit.js +0 -123
  314. package/dist/chat/lasting.d.ts +0 -6
  315. package/dist/chat/lasting.d.ts.map +0 -1
  316. package/dist/chat/lasting.js +0 -19
  317. package/dist/chat/list.d.ts +0 -27
  318. package/dist/chat/list.d.ts.map +0 -1
  319. package/dist/chat/list.js +0 -99
  320. package/dist/chat/markdown.d.ts +0 -20
  321. package/dist/chat/markdown.d.ts.map +0 -1
  322. package/dist/chat/markdown.js +0 -188
  323. package/dist/chat/message.d.ts +0 -6
  324. package/dist/chat/message.d.ts.map +0 -1
  325. package/dist/chat/message.js +0 -192
  326. package/dist/chat/messages.d.ts +0 -22
  327. package/dist/chat/messages.d.ts.map +0 -1
  328. package/dist/chat/messages.js +0 -155
  329. package/dist/chat/name.d.ts +0 -6
  330. package/dist/chat/name.d.ts.map +0 -1
  331. package/dist/chat/name.js +0 -37
  332. package/dist/chat/opened.d.ts +0 -11
  333. package/dist/chat/opened.d.ts.map +0 -1
  334. package/dist/chat/opened.js +0 -17
  335. package/dist/chat/overlay.d.ts +0 -31
  336. package/dist/chat/overlay.d.ts.map +0 -1
  337. package/dist/chat/overlay.js +0 -97
  338. package/dist/chat/parts.d.ts.map +0 -1
  339. package/dist/chat/process.d.ts +0 -20
  340. package/dist/chat/process.d.ts.map +0 -1
  341. package/dist/chat/process.js +0 -32
  342. package/dist/chat/provider.d.ts +0 -63
  343. package/dist/chat/provider.d.ts.map +0 -1
  344. package/dist/chat/provider.js +0 -628
  345. package/dist/chat/question.d.ts +0 -9
  346. package/dist/chat/question.d.ts.map +0 -1
  347. package/dist/chat/question.js +0 -69
  348. package/dist/chat/questions.d.ts.map +0 -1
  349. package/dist/chat/read.d.ts.map +0 -1
  350. package/dist/chat/ready.d.ts +0 -34
  351. package/dist/chat/ready.d.ts.map +0 -1
  352. package/dist/chat/ready.js +0 -91
  353. package/dist/chat/style.d.ts +0 -4
  354. package/dist/chat/style.d.ts.map +0 -1
  355. package/dist/chat/style.js +0 -302
  356. package/dist/chat.d.ts +0 -14
  357. package/dist/chat.d.ts.map +0 -1
  358. package/dist/chat.js +0 -8
  359. package/dist/fence.d.ts +0 -6
  360. package/dist/fence.d.ts.map +0 -1
  361. package/dist/fence.js +0 -10
  362. package/dist/read-side.d.ts +0 -27
  363. package/dist/read-side.d.ts.map +0 -1
  364. package/dist/read-side.js +0 -824
package/dist/bootstrap.js CHANGED
@@ -1,133 +1,341 @@
1
1
  import { transferIdentity } from './identity.js';
2
- import { advancement } from './refresh.js';
3
- import { acceptedBinaries } from './overlay.js';
4
- import { readStaged } from './replica.js';
2
+ import { advancement, pageEntries } from './refresh.js';
3
+ import { entriesIn } from './shared.js';
5
4
  import { unconfirmed } from './transfer.js';
6
- const RESUMABLE = new Set([
7
- 'transport-uncertainty',
8
- 'retryable-refusal',
9
- 'unconfirmed',
10
- ]);
11
- function pageLayer(page) {
5
+ const NOTHING_PRIOR = () => Promise.resolve(new Map());
6
+ const PARTS_IN_FLIGHT = 6;
7
+ function textOf(page) {
8
+ let text = 0;
9
+ for (const [, content] of entriesIn(page.documents))
10
+ text += content.length;
11
+ return text;
12
+ }
13
+ async function pageOf(page, part) {
12
14
  return {
13
- documents: page.documents,
14
- revisions: page.revisions,
15
- fileIds: page.fileIds ?? {},
16
- changes: page.changes,
17
- written: Object.fromEntries(Object.keys(page.documents).map((path) => [path, page.roomVersion])),
18
- binaries: acceptedBinaries(page.binaryFiles),
15
+ entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
16
+ folders: page.folders ?? [],
17
+ ...(part === undefined ? {} : { part }),
19
18
  };
20
19
  }
21
- async function heldTransfer(staging, room) {
22
- const record = staging.held(room.locator);
23
- if (record === null)
24
- return null;
25
- if (record.selection === room.replica.selection) {
26
- return { record, layer: await staging.staged(record) };
20
+ export async function bootstrapRoom(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
21
+ if (staging.held(room.locator) !== null)
22
+ await staging.abandon(room.locator);
23
+ const begun = () => started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging);
24
+ const first = await begun();
25
+ if (first.kind !== 'expired')
26
+ return first;
27
+ await staging.setAside(room.locator);
28
+ try {
29
+ const replacement = await begun();
30
+ if (replacement.kind !== 'expired')
31
+ return replacement;
32
+ await staging.abandon(room.locator);
33
+ return unconfirmed;
27
34
  }
28
- await staging.abandon(room.locator);
29
- return null;
35
+ finally {
36
+ if (first.key !== null)
37
+ await staging.release(first.key);
38
+ }
39
+ }
40
+ function dropped(ahead) {
41
+ void ahead?.fetched.then(({ next, written }) => {
42
+ written();
43
+ dropped(next);
44
+ }, () => { });
30
45
  }
31
- function pooled(pool, layer) {
46
+ function compositionFor(room, models, builtIn, typedPaths) {
32
47
  return {
33
- documents: { ...pool?.documents, ...layer.documents },
34
- revisions: { ...pool?.revisions, ...layer.revisions },
48
+ model: models.collection,
49
+ selection: room.typedSelection === undefined
50
+ ? null
51
+ : { roots: room.typedSelection.roots, model: builtIn },
52
+ typedPaths,
35
53
  };
36
54
  }
37
- export async function bootstrapRoom(adapter, authorization, room, held, remodel, continuing, staging, reuse) {
38
- const first = await bundle(adapter, authorization, room, held, remodel, continuing, staging, await heldTransfer(staging, room), reuse);
39
- if (first.kind !== 'expired')
40
- return first;
41
- await staging.abandon(room.locator);
42
- const replacement = await bundle(adapter, authorization, room, held, remodel, continuing, staging, null, pooled(reuse, first.held));
43
- if (replacement.kind !== 'expired')
44
- return replacement;
45
- await staging.abandon(room.locator);
46
- return unconfirmed;
55
+ async function started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
56
+ const mode = { paged: false };
57
+ let outcome;
58
+ try {
59
+ outcome = await bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode);
60
+ }
61
+ catch (error) {
62
+ await stopped(staging, room.locator, mode).catch(() => { });
63
+ throw error;
64
+ }
65
+ if (outcome.kind !== 'staged' && outcome.kind !== 'expired') {
66
+ await stopped(staging, room.locator, mode);
67
+ }
68
+ return outcome;
47
69
  }
48
- async function bundle(adapter, authorization, room, held, remodel, continuing, staging, kept, pool) {
70
+ function stopped(staging, locator, mode) {
71
+ return mode.paged ? staging.abandon(locator) : staging.setAside(locator);
72
+ }
73
+ async function bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode) {
49
74
  const locator = room.locator;
50
75
  const selection = room.replica.selection;
51
- const documents = { ...kept?.layer.documents };
52
- const revisions = { ...kept?.layer.revisions };
53
- const fileIds = { ...kept?.layer.fileIds };
54
- const changes = { ...kept?.layer.changes };
55
- const written = { ...kept?.layer.written };
56
- const binaries = { ...kept?.layer.binaries };
57
- let transfer = kept?.record ?? null;
58
- while (transfer === null || transfer.pageToken !== null) {
59
- if (!continuing())
60
- return unconfirmed;
61
- const page = await adapter.bootstrap(authorization, {
76
+ const ending = new AbortController();
77
+ const arriving = staging.arriving(locator);
78
+ const downloaded = await staging.turn(locator, 'downloading');
79
+ const asking = (token) => adapter.bootstrap(authorization, {
80
+ locator,
81
+ selection,
82
+ signal: ending.signal,
83
+ ...(token === null
84
+ ? { arriving: (bytes) => arriving.at(bytes) }
85
+ : { pageToken: token }),
86
+ });
87
+ const fetching = (token) => {
88
+ const fetched = (async () => {
89
+ await staging.unqueued();
90
+ const page = continuing() ? await asking(token) : unconfirmed;
91
+ if (page.kind !== 'bootstrap')
92
+ return { page, next: null, written: () => { } };
93
+ const written = staging.queued(textOf(page));
94
+ const later = page.pageToken;
95
+ if (later === undefined && page.parts === undefined) {
96
+ downloaded();
97
+ arriving.end();
98
+ }
99
+ return { page, written, next: later === undefined || !continuing() ? null : fetching(later) };
100
+ })();
101
+ fetched.catch(() => { });
102
+ return { fetched };
103
+ };
104
+ let transfer = null;
105
+ let ahead = fetching(null);
106
+ try {
107
+ while (ahead !== null) {
108
+ if (!continuing())
109
+ return unconfirmed;
110
+ const fetched = await ahead.fetched;
111
+ ahead = fetched.next;
112
+ try {
113
+ if (!continuing())
114
+ return unconfirmed;
115
+ const page = fetched.page;
116
+ if (page.kind === 'beyond-horizon')
117
+ return { kind: 'expired', key: transfer?.key ?? null };
118
+ if (page.kind !== 'bootstrap')
119
+ return page;
120
+ if (transfer === null && page.parts !== undefined) {
121
+ const parted = await parts(page, page.parts);
122
+ if (parted.kind !== 'parted')
123
+ return parted;
124
+ transfer = parted.transfer;
125
+ continue;
126
+ }
127
+ if (transfer === null)
128
+ mode.paged = true;
129
+ const models = remodel(page.models, transfer?.models ?? held);
130
+ const staged = await staging.stage({
131
+ locator,
132
+ transfer: transfer?.transfer ?? transferIdentity(),
133
+ selection,
134
+ from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
135
+ ? transfer.from
136
+ : page.roomVersion,
137
+ last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
138
+ ? transfer.last
139
+ : page.roomVersion,
140
+ done: { bytes: (transfer?.done.bytes ?? 0) + (page.bytes ?? 0) },
141
+ models,
142
+ key: transfer?.key ?? null,
143
+ }, await pageOf(page), compositionFor(room, models, builtIn, typedPaths));
144
+ if (staged === null)
145
+ return unconfirmed;
146
+ transfer = staged;
147
+ }
148
+ finally {
149
+ fetched.written();
150
+ }
151
+ }
152
+ }
153
+ finally {
154
+ ending.abort();
155
+ downloaded();
156
+ arriving.end();
157
+ dropped(ahead);
158
+ }
159
+ if (transfer === null)
160
+ return unconfirmed;
161
+ return installed(transfer);
162
+ async function parts(head, listed) {
163
+ const models = remodel(head.models, held);
164
+ const composition = compositionFor(room, models, builtIn, typedPaths);
165
+ const resumed = await staging.resume({
62
166
  locator,
167
+ transfer: transferIdentity(),
63
168
  selection,
64
- ...(transfer?.pageToken == null ? {} : { pageToken: transfer.pageToken }),
65
- ...(pool === null ? {} : { held: pool }),
66
- });
67
- if (page.kind === 'beyond-horizon')
68
- return { kind: 'expired', held: { documents, revisions } };
69
- if (page.kind !== 'bootstrap') {
70
- if (!RESUMABLE.has(page.kind))
71
- await staging.abandon(locator);
72
- return page;
73
- }
74
- transfer = {
169
+ from: head.roomVersion,
170
+ last: head.roomVersion,
171
+ done: { bytes: 0 },
172
+ models,
173
+ key: null,
174
+ }, listed, composition);
175
+ if (resumed === null)
176
+ return unconfirmed;
177
+ let staged = resumed.record ?? {
75
178
  locator,
76
- transfer: transfer?.transfer ?? transferIdentity(),
179
+ transfer: transferIdentity(),
77
180
  selection,
78
- from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
79
- ? transfer.from
80
- : page.roomVersion,
81
- last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
82
- ? transfer.last
83
- : page.roomVersion,
84
- pageToken: page.pageToken ?? null,
85
- models: remodel(page.models, transfer?.models ?? held),
181
+ from: head.roomVersion,
182
+ last: head.roomVersion,
183
+ done: { bytes: 0 },
184
+ models,
185
+ key: null,
86
186
  };
87
- const staged = pageLayer(page);
88
- if (!(await staging.stage(transfer, staged)))
89
- return unconfirmed;
90
- Object.assign(documents, staged.documents);
91
- Object.assign(revisions, staged.revisions);
92
- Object.assign(fileIds, staged.fileIds);
93
- Object.assign(changes, staged.changes);
94
- Object.assign(written, staged.written);
95
- Object.assign(binaries, staged.binaries);
96
- }
97
- const record = {
98
- locator,
99
- name: room.name,
100
- handle: room.handle,
101
- operations: room.operations,
102
- replica: room.replica,
103
- model: transfer.models.collection,
104
- typedSelection: room.typedSelection ?? null,
105
- selectionModel: transfer.models.selection,
106
- providerOwnedPaths: room.providerOwnedPaths,
107
- roomVersion: transfer.from,
108
- transfer: transfer.transfer,
109
- documents,
110
- binaries,
111
- revisions,
112
- fileIds,
113
- changes,
114
- written,
115
- };
116
- const reconciled = transfer.last === transfer.from
117
- ? { kind: 'still-current' }
118
- : await advancement(adapter, authorization, record, remodel, continuing);
119
- if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
120
- const read = readStaged(reconciled.kind === 'advanced' ? reconciled.record : record);
121
- if (read.kind === 'refused') {
122
- await staging.abandon(locator);
123
- return read;
187
+ const wanted = listed.filter((part) => !resumed.staged.has(part.id));
188
+ let arrived = staged.done.bytes;
189
+ const partial = new Map();
190
+ const report = () => {
191
+ let bytes = arrived;
192
+ for (const held of partial.values())
193
+ bytes += held;
194
+ arriving.at(bytes);
195
+ };
196
+ report();
197
+ const arrivals = [];
198
+ let woken = null;
199
+ let next = 0;
200
+ let flying = 0;
201
+ let halted = false;
202
+ let stopped = false;
203
+ let admitted = Promise.resolve();
204
+ const fetched = () => {
205
+ if ((next < wanted.length && !halted) || flying > 0)
206
+ return;
207
+ downloaded();
208
+ arriving.end();
209
+ };
210
+ const landed = (one) => {
211
+ flying -= 1;
212
+ if (stopped)
213
+ one.written();
214
+ else
215
+ arrivals.push(one);
216
+ woken?.();
217
+ ask();
218
+ fetched();
219
+ };
220
+ const fetch = async (part) => {
221
+ let written = () => { };
222
+ const admission = admitted.then(async () => {
223
+ await staging.unqueued();
224
+ written = staging.queued(part.bytes);
225
+ });
226
+ admitted = admission;
227
+ await admission;
228
+ const page = continuing()
229
+ ? await adapter.bootstrap(authorization, {
230
+ locator,
231
+ selection,
232
+ signal: ending.signal,
233
+ pageToken: part.id,
234
+ arriving: (bytes) => {
235
+ partial.set(part.id, Math.min(bytes, part.bytes));
236
+ report();
237
+ },
238
+ })
239
+ : unconfirmed;
240
+ landed({ part, page, written });
241
+ };
242
+ const ask = () => {
243
+ while (!stopped && !halted && flying < PARTS_IN_FLIGHT && next < wanted.length) {
244
+ const part = wanted[next];
245
+ next += 1;
246
+ flying += 1;
247
+ fetch(part).catch((error) => landed({ part, page: unconfirmed, written: () => { }, error }));
248
+ }
249
+ };
250
+ let failed = null;
251
+ ask();
252
+ fetched();
253
+ try {
254
+ for (;;) {
255
+ while (arrivals.length === 0) {
256
+ if (flying === 0 && (halted || next >= wanted.length))
257
+ break;
258
+ await new Promise((wake) => (woken = wake));
259
+ woken = null;
260
+ }
261
+ const one = arrivals.shift();
262
+ if (one === undefined)
263
+ break;
264
+ const { part, page, written, error } = one;
265
+ try {
266
+ if (error !== undefined)
267
+ throw error;
268
+ if (!continuing())
269
+ return unconfirmed;
270
+ if (page.kind !== 'bootstrap') {
271
+ halted = true;
272
+ failed ??= page.kind === 'beyond-horizon' ? unconfirmed : page;
273
+ continue;
274
+ }
275
+ partial.delete(part.id);
276
+ arrived += part.bytes;
277
+ report();
278
+ const kept = await staging.stage({ ...staged, done: { bytes: staged.done.bytes + part.bytes } }, await pageOf({ ...page, roomVersion: head.roomVersion }, part.id), composition);
279
+ if (kept === null)
280
+ return unconfirmed;
281
+ staged = kept;
282
+ }
283
+ finally {
284
+ written();
285
+ }
286
+ }
287
+ }
288
+ finally {
289
+ stopped = true;
290
+ for (const one of arrivals.splice(0))
291
+ one.written();
292
+ }
293
+ if (failed !== null)
294
+ return failed;
295
+ if (staged.key === null) {
296
+ const empty = await staging.stage(staged, { entries: [], folders: [] }, composition);
297
+ if (empty === null)
298
+ return unconfirmed;
299
+ staged = empty;
124
300
  }
125
- return { kind: 'staged', confirmed: read.confirmed, stored: record };
301
+ return { kind: 'parted', transfer: staged };
126
302
  }
127
- if (reconciled.kind === 'beyond-horizon') {
128
- return { kind: 'expired', held: { documents, revisions } };
303
+ async function installed(transfer) {
304
+ const composition = compositionFor(room, transfer.models, builtIn, typedPaths);
305
+ if (!(await staging.derive(locator, transfer.key, composition)))
306
+ return unconfirmed;
307
+ await staging.turn(locator, 'replaying');
308
+ if (!continuing())
309
+ return unconfirmed;
310
+ const record = {
311
+ locator,
312
+ name: room.name,
313
+ handle: room.handle,
314
+ operations: room.operations,
315
+ replica: room.replica,
316
+ model: transfer.models.collection,
317
+ typedSelection: room.typedSelection ?? null,
318
+ providerOwnedPaths: room.providerOwnedPaths,
319
+ roomVersion: transfer.from,
320
+ transfer: transfer.transfer,
321
+ inventory: transfer.done,
322
+ key: transfer.key,
323
+ };
324
+ const last = transfer.last;
325
+ const refresh = adapter.refresh;
326
+ const reconciled = last === transfer.from &&
327
+ (staging.streamed || adapter.reached(locator, last, room.roomVersion))
328
+ ? { kind: 'still-current' }
329
+ : refresh === undefined
330
+ ? unconfirmed
331
+ : await advancement(refresh, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
332
+ if (reconciled.kind === 'advanced') {
333
+ return { kind: 'staged', record: reconciled.record, refreshed: true };
334
+ }
335
+ if (reconciled.kind === 'still-current')
336
+ return { kind: 'staged', record, refreshed: false };
337
+ if (reconciled.kind === 'beyond-horizon')
338
+ return { kind: 'expired', key: record.key };
339
+ return reconciled;
129
340
  }
130
- if (!RESUMABLE.has(reconciled.kind))
131
- await staging.abandon(locator);
132
- return reconciled;
133
341
  }
package/dist/cell.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export type Cell<T> = {
2
+ now(): T;
3
+ set(change: Partial<T>): void;
4
+ };
5
+ export declare function createCell<T extends object>(first: T): Cell<T>;
6
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI;IACpB,GAAG,IAAI,CAAC,CAAC;IACT,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAQ9D"}
package/dist/cell.js ADDED
@@ -0,0 +1,9 @@
1
+ export function createCell(first) {
2
+ let held = first;
3
+ return {
4
+ now: () => held,
5
+ set(change) {
6
+ held = { ...held, ...change };
7
+ },
8
+ };
9
+ }
@@ -0,0 +1,12 @@
1
+ import type { DocumentQuery, GroupQuery } from '@agentshouse/mdmodel';
2
+ import type { MdRuntimeClient } from './client.js';
3
+ import type { DocumentResult, GroupResult, PendingResult } from './query.js';
4
+ type Rows = DocumentResult | GroupResult;
5
+ export type WindowAnswer = Rows | PendingResult;
6
+ export type WindowChain = {
7
+ want(count: number): void;
8
+ close(): void;
9
+ };
10
+ export declare function chainedWindows(runtime: MdRuntimeClient, query: DocumentQuery | GroupQuery, count: number, publish: (answers: readonly (WindowAnswer | null)[], settled: boolean) => void): WindowChain;
11
+ export {};
12
+ //# sourceMappingURL=chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E,KAAK,IAAI,GAAG,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAaF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,aAAa,GAAG,UAAU,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAC7E,WAAW,CAkEb"}
package/dist/chain.js ADDED
@@ -0,0 +1,64 @@
1
+ function answered(answer) {
2
+ return answer !== null && !('pending' in answer);
3
+ }
4
+ export function chainedWindows(runtime, query, count, publish) {
5
+ let links = [];
6
+ let wanted = count;
7
+ let closed = false;
8
+ const observe = runtime.observe;
9
+ const open = (after, shown) => {
10
+ const link = { after, observation: null, value: shown, fresh: false };
11
+ void observe('query', after === undefined ? query : { ...query, after }).then((observation) => {
12
+ if (closed || !links.includes(link)) {
13
+ observation.close();
14
+ return;
15
+ }
16
+ link.observation = observation;
17
+ const take = (value) => {
18
+ link.value = value;
19
+ link.fresh = true;
20
+ settle();
21
+ };
22
+ observation.subscribe(take);
23
+ take(observation.current());
24
+ }, () => { });
25
+ return link;
26
+ };
27
+ const settle = () => {
28
+ if (closed)
29
+ return;
30
+ const next = [];
31
+ for (let at = 0; at < wanted; at += 1) {
32
+ const before = next[at - 1];
33
+ if (before !== undefined && !before.fresh) {
34
+ next.push(...links.slice(at, wanted));
35
+ break;
36
+ }
37
+ if (before !== undefined && (!answered(before.value) || before.value.next === undefined)) {
38
+ break;
39
+ }
40
+ const after = before === undefined ? undefined : before.value.next;
41
+ const held = links[at];
42
+ next.push(held !== undefined && held.after === after ? held : open(after, held?.value ?? null));
43
+ }
44
+ for (const link of links)
45
+ if (!next.includes(link))
46
+ link.observation?.close();
47
+ links = next;
48
+ publish(links.map((link) => link.value), links.every((link) => link.fresh));
49
+ };
50
+ settle();
51
+ return {
52
+ want(count) {
53
+ if (count === wanted)
54
+ return;
55
+ wanted = count;
56
+ settle();
57
+ },
58
+ close() {
59
+ closed = true;
60
+ for (const link of links)
61
+ link.observation?.close();
62
+ },
63
+ };
64
+ }
@@ -1,15 +1,6 @@
1
- import { type Replica } from './replica.js';
2
- import { type Row } from './rows.js';
3
1
  export type DocumentChange = {
4
- locator: string;
5
- path: string;
6
- before: readonly Row[];
7
- after: readonly Row[];
8
- };
9
- export type MessageChange = {
10
- conversation: string;
11
- identity: string;
12
- text: string | null;
2
+ readonly locator: string;
3
+ readonly path: string | null;
13
4
  };
14
5
  export type ChangeSet = {
15
6
  documents: readonly DocumentChange[];
@@ -20,16 +11,18 @@ export type ChangeSet = {
20
11
  rooms: readonly string[];
21
12
  queues: readonly string[];
22
13
  presentations: readonly string[];
23
- messages: readonly MessageChange[];
24
14
  conversations: readonly string[];
25
15
  };
26
- export declare function changeSet(locator: string, before: Replica | null, after: Replica | null, changed?: {
16
+ type Changed = {
17
+ documents?: readonly string[] | null;
27
18
  drafts?: readonly string[];
28
19
  room?: boolean;
29
20
  queue?: boolean;
30
21
  presentation?: string;
31
- }): ChangeSet;
32
- export declare function entering(locator: string, replica: Replica, paths: readonly string[]): ChangeSet;
33
- export declare function conversationChangeSet(messages: readonly MessageChange[], conversations: readonly string[]): ChangeSet;
22
+ };
23
+ export declare function changeSet(locator: string, changed?: Changed): ChangeSet;
24
+ export declare function conversationChangeSet(conversations: readonly string[]): ChangeSet;
34
25
  export declare function mergeChangeSets(sets: readonly ChangeSet[]): ChangeSet;
26
+ export declare function touches(set: ChangeSet, locator: string, path: string): boolean;
27
+ export {};
35
28
  //# sourceMappingURL=change-set.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAIA,OAAO,EAAiC,KAAK,OAAO,EAAE,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,EAAE,CAAC;IACvB,KAAK,EAAE,SAAS,GAAG,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE5F,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;IACnC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAwBF,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GAAG,IAAI,EACtB,KAAK,EAAE,OAAO,GAAG,IAAI,EACrB,OAAO,GAAE;IACP,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,SAAS,CA+DX;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAiB/F;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,aAAa,EAAE,SAAS,MAAM,EAAE,GAC/B,SAAS,CAUX;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAUrE"}
1
+ {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAExF,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IACrC,MAAM,EAAE,SAAS;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,KAAK,OAAO,GAAG;IACb,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,GAAG,SAAS,CAe3E;AAED,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CASjF;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CASrE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAI9E"}