@agentshouse/mdruntime 0.1.0-caee7332d2235 → 0.1.0-caf080a9a9c60

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 (394) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +318 -0
  5. package/dist/act-lanes.d.ts +29 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +177 -0
  8. package/dist/actions.d.ts +25 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +261 -0
  11. package/dist/adapter.d.ts +162 -122
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +7 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +40 -41
  16. package/dist/binary.d.ts +0 -5
  17. package/dist/binary.d.ts.map +1 -1
  18. package/dist/binary.js +1 -1
  19. package/dist/bootstrap.d.ts +30 -11
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +309 -113
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/chain.d.ts +12 -0
  26. package/dist/chain.d.ts.map +1 -0
  27. package/dist/chain.js +64 -0
  28. package/dist/change-set.d.ts +10 -16
  29. package/dist/change-set.d.ts.map +1 -1
  30. package/dist/change-set.js +17 -94
  31. package/dist/change.d.ts +32 -1
  32. package/dist/change.d.ts.map +1 -1
  33. package/dist/change.js +14 -3
  34. package/dist/chat-types.d.ts +5 -0
  35. package/dist/chat-types.d.ts.map +1 -0
  36. package/dist/chat-types.js +13 -0
  37. package/dist/client.d.ts +33 -19
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +112 -21
  40. package/dist/collection.d.ts +29 -22
  41. package/dist/collection.d.ts.map +1 -1
  42. package/dist/collection.js +47 -354
  43. package/dist/compile.d.ts +18 -0
  44. package/dist/compile.d.ts.map +1 -0
  45. package/dist/compile.js +724 -0
  46. package/dist/connection.d.ts +7 -137
  47. package/dist/connection.d.ts.map +1 -1
  48. package/dist/connection.js +111 -3623
  49. package/dist/context.d.ts +2 -0
  50. package/dist/context.d.ts.map +1 -0
  51. package/dist/{chat/context.js → context.js} +1 -4
  52. package/dist/conversation-live.d.ts +138 -0
  53. package/dist/conversation-live.d.ts.map +1 -0
  54. package/dist/conversation-live.js +249 -0
  55. package/dist/conversation-row.d.ts +33 -0
  56. package/dist/conversation-row.d.ts.map +1 -0
  57. package/dist/conversation-row.js +53 -0
  58. package/dist/conversation.d.ts +66 -49
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +962 -799
  61. package/dist/declaration.d.ts +10 -0
  62. package/dist/declaration.d.ts.map +1 -0
  63. package/dist/declaration.js +24 -0
  64. package/dist/digest.d.ts +7 -0
  65. package/dist/digest.d.ts.map +1 -0
  66. package/dist/digest.js +113 -0
  67. package/dist/discovery.d.ts +10 -0
  68. package/dist/discovery.d.ts.map +1 -0
  69. package/dist/discovery.js +153 -0
  70. package/dist/durability.d.ts +19 -4
  71. package/dist/durability.d.ts.map +1 -1
  72. package/dist/durability.js +5 -0
  73. package/dist/entry.d.ts +5 -2
  74. package/dist/entry.d.ts.map +1 -1
  75. package/dist/entry.js +33 -29
  76. package/dist/expectation.d.ts +26 -13
  77. package/dist/expectation.d.ts.map +1 -1
  78. package/dist/expectation.js +72 -19
  79. package/dist/failure.d.ts +3 -0
  80. package/dist/failure.d.ts.map +1 -1
  81. package/dist/failure.js +6 -0
  82. package/dist/figures.d.ts +49 -0
  83. package/dist/figures.d.ts.map +1 -0
  84. package/dist/figures.js +197 -0
  85. package/dist/file.d.ts +2 -19
  86. package/dist/file.d.ts.map +1 -1
  87. package/dist/file.js +7 -122
  88. package/dist/holdings.d.ts +29 -0
  89. package/dist/holdings.d.ts.map +1 -0
  90. package/dist/holdings.js +95 -0
  91. package/dist/host.d.ts +20 -8
  92. package/dist/host.d.ts.map +1 -1
  93. package/dist/host.js +103 -45
  94. package/dist/identity.d.ts +0 -2
  95. package/dist/identity.d.ts.map +1 -1
  96. package/dist/identity.js +0 -6
  97. package/dist/index.d.ts +39 -15
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +18 -4
  100. package/dist/install.d.ts +54 -0
  101. package/dist/install.d.ts.map +1 -0
  102. package/dist/install.js +539 -0
  103. package/dist/lifecycle.d.ts +7 -0
  104. package/dist/lifecycle.d.ts.map +1 -0
  105. package/dist/lifecycle.js +279 -0
  106. package/dist/listing.d.ts +48 -0
  107. package/dist/listing.d.ts.map +1 -0
  108. package/dist/listing.js +139 -0
  109. package/dist/live.d.ts +23 -0
  110. package/dist/live.d.ts.map +1 -0
  111. package/dist/live.js +165 -0
  112. package/dist/locks.d.ts +7 -0
  113. package/dist/locks.d.ts.map +1 -0
  114. package/dist/locks.js +33 -0
  115. package/dist/log.d.ts +1 -0
  116. package/dist/log.d.ts.map +1 -1
  117. package/dist/lost.d.ts +5 -0
  118. package/dist/lost.d.ts.map +1 -0
  119. package/dist/lost.js +50 -0
  120. package/dist/media.d.ts +8 -0
  121. package/dist/media.d.ts.map +1 -0
  122. package/dist/media.js +218 -0
  123. package/dist/memory.d.ts +17 -7
  124. package/dist/memory.d.ts.map +1 -1
  125. package/dist/memory.js +272 -118
  126. package/dist/messages.d.ts +49 -0
  127. package/dist/messages.d.ts.map +1 -0
  128. package/dist/messages.js +150 -0
  129. package/dist/model.d.ts +8 -11
  130. package/dist/model.d.ts.map +1 -1
  131. package/dist/model.js +6 -23
  132. package/dist/models.d.ts +10 -0
  133. package/dist/models.d.ts.map +1 -0
  134. package/dist/models.js +156 -0
  135. package/dist/name.d.ts +4 -0
  136. package/dist/name.d.ts.map +1 -0
  137. package/dist/name.js +122 -0
  138. package/dist/observation.d.ts +15 -2
  139. package/dist/observation.d.ts.map +1 -1
  140. package/dist/observation.js +98 -14
  141. package/dist/opened.d.ts +22 -0
  142. package/dist/opened.d.ts.map +1 -0
  143. package/dist/opened.js +107 -0
  144. package/dist/opening.d.ts +4 -0
  145. package/dist/opening.d.ts.map +1 -0
  146. package/dist/opening.js +59 -0
  147. package/dist/outcome.d.ts +47 -9
  148. package/dist/outcome.d.ts.map +1 -1
  149. package/dist/outcome.js +56 -2
  150. package/dist/overlay.d.ts +7 -5
  151. package/dist/overlay.d.ts.map +1 -1
  152. package/dist/overlay.js +69 -169
  153. package/dist/page-metadata.d.ts +8 -0
  154. package/dist/page-metadata.d.ts.map +1 -0
  155. package/dist/page-metadata.js +19 -0
  156. package/dist/parts.d.ts +3 -0
  157. package/dist/parts.d.ts.map +1 -0
  158. package/dist/parts.js +10 -0
  159. package/dist/paths.d.ts +2 -0
  160. package/dist/paths.d.ts.map +1 -1
  161. package/dist/paths.js +26 -0
  162. package/dist/preparation.d.ts +20 -0
  163. package/dist/preparation.d.ts.map +1 -0
  164. package/dist/preparation.js +233 -0
  165. package/dist/presence.d.ts +52 -0
  166. package/dist/presence.d.ts.map +1 -0
  167. package/dist/presence.js +220 -0
  168. package/dist/queries.d.ts +16 -0
  169. package/dist/queries.d.ts.map +1 -0
  170. package/dist/queries.js +285 -0
  171. package/dist/query.d.ts +21 -207
  172. package/dist/query.d.ts.map +1 -1
  173. package/dist/query.js +3 -493
  174. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -7
  175. package/dist/questions.d.ts.map +1 -0
  176. package/dist/{chat/questions.js → questions.js} +11 -7
  177. package/dist/queue.d.ts +40 -0
  178. package/dist/queue.d.ts.map +1 -0
  179. package/dist/queue.js +465 -0
  180. package/dist/reach.d.ts +20 -9
  181. package/dist/reach.d.ts.map +1 -1
  182. package/dist/reach.js +306 -111
  183. package/dist/react.d.ts +15 -2
  184. package/dist/react.d.ts.map +1 -1
  185. package/dist/react.js +33 -1
  186. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  187. package/dist/read.d.ts.map +1 -0
  188. package/dist/{chat/read.js → read.js} +4 -0
  189. package/dist/readiness.d.ts +13 -17
  190. package/dist/readiness.d.ts.map +1 -1
  191. package/dist/readiness.js +2 -8
  192. package/dist/reads.d.ts +38 -10
  193. package/dist/reads.d.ts.map +1 -1
  194. package/dist/reads.js +163 -83
  195. package/dist/recovery.d.ts +5 -2
  196. package/dist/recovery.d.ts.map +1 -1
  197. package/dist/recovery.js +65 -8
  198. package/dist/refresh.d.ts +18 -15
  199. package/dist/refresh.d.ts.map +1 -1
  200. package/dist/refresh.js +145 -79
  201. package/dist/refusal.d.ts +5 -0
  202. package/dist/refusal.d.ts.map +1 -0
  203. package/dist/refusal.js +57 -0
  204. package/dist/replica.d.ts +50 -39
  205. package/dist/replica.d.ts.map +1 -1
  206. package/dist/replica.js +319 -208
  207. package/dist/retried.d.ts +30 -0
  208. package/dist/retried.d.ts.map +1 -0
  209. package/dist/retried.js +72 -0
  210. package/dist/room-draft.d.ts +28 -11
  211. package/dist/room-draft.d.ts.map +1 -1
  212. package/dist/room-draft.js +194 -117
  213. package/dist/room-drafts.d.ts +24 -0
  214. package/dist/room-drafts.d.ts.map +1 -0
  215. package/dist/room-drafts.js +217 -0
  216. package/dist/rows.d.ts +31 -31
  217. package/dist/rows.d.ts.map +1 -1
  218. package/dist/rows.js +60 -125
  219. package/dist/runtime.d.ts +36 -0
  220. package/dist/runtime.d.ts.map +1 -0
  221. package/dist/runtime.js +1 -0
  222. package/dist/save.d.ts +43 -50
  223. package/dist/save.d.ts.map +1 -1
  224. package/dist/save.js +661 -228
  225. package/dist/saves.d.ts +32 -0
  226. package/dist/saves.d.ts.map +1 -0
  227. package/dist/saves.js +413 -0
  228. package/dist/search.d.ts +12 -95
  229. package/dist/search.d.ts.map +1 -1
  230. package/dist/search.js +10 -266
  231. package/dist/seed.d.ts +11 -2
  232. package/dist/seed.d.ts.map +1 -1
  233. package/dist/seed.js +71 -1
  234. package/dist/shared.d.ts +4 -9
  235. package/dist/shared.d.ts.map +1 -1
  236. package/dist/shared.js +61 -120
  237. package/dist/shown.d.ts +32 -0
  238. package/dist/shown.d.ts.map +1 -0
  239. package/dist/shown.js +290 -0
  240. package/dist/socket/admission.d.ts +7 -0
  241. package/dist/socket/admission.d.ts.map +1 -0
  242. package/dist/socket/admission.js +39 -0
  243. package/dist/socket/answers.d.ts +6 -0
  244. package/dist/socket/answers.d.ts.map +1 -0
  245. package/dist/socket/answers.js +20 -0
  246. package/dist/socket/lanes.d.ts +21 -0
  247. package/dist/socket/lanes.d.ts.map +1 -0
  248. package/dist/socket/lanes.js +80 -0
  249. package/dist/socket/reads.d.ts +10 -0
  250. package/dist/socket/reads.d.ts.map +1 -0
  251. package/dist/socket/reads.js +31 -0
  252. package/dist/socket/session.d.ts +38 -0
  253. package/dist/socket/session.d.ts.map +1 -0
  254. package/dist/socket/session.js +23 -0
  255. package/dist/socket.d.ts +68 -0
  256. package/dist/socket.d.ts.map +1 -0
  257. package/dist/socket.js +171 -0
  258. package/dist/source.d.ts +54 -0
  259. package/dist/source.d.ts.map +1 -0
  260. package/dist/source.js +82 -0
  261. package/dist/status.d.ts +4 -5
  262. package/dist/status.d.ts.map +1 -1
  263. package/dist/status.js +3 -7
  264. package/dist/store/installs.d.ts +30 -0
  265. package/dist/store/installs.d.ts.map +1 -0
  266. package/dist/store/installs.js +34 -0
  267. package/dist/store/readiness.d.ts +10 -0
  268. package/dist/store/readiness.d.ts.map +1 -0
  269. package/dist/store/readiness.js +52 -0
  270. package/dist/store/records.d.ts +212 -0
  271. package/dist/store/records.d.ts.map +1 -0
  272. package/dist/store/records.js +430 -0
  273. package/dist/store/room-held.d.ts +8 -0
  274. package/dist/store/room-held.d.ts.map +1 -0
  275. package/dist/store/room-held.js +17 -0
  276. package/dist/store/space.d.ts +11 -0
  277. package/dist/store/space.d.ts.map +1 -0
  278. package/dist/store/space.js +41 -0
  279. package/dist/store/watchers.d.ts +17 -0
  280. package/dist/store/watchers.d.ts.map +1 -0
  281. package/dist/store/watchers.js +56 -0
  282. package/dist/store/writes.d.ts +24 -0
  283. package/dist/store/writes.d.ts.map +1 -0
  284. package/dist/store/writes.js +125 -0
  285. package/dist/store.d.ts +111 -166
  286. package/dist/store.d.ts.map +1 -1
  287. package/dist/store.js +158 -797
  288. package/dist/stored.d.ts +156 -0
  289. package/dist/stored.d.ts.map +1 -0
  290. package/dist/stored.js +649 -0
  291. package/dist/surface.d.ts +88 -0
  292. package/dist/surface.d.ts.map +1 -0
  293. package/dist/surface.js +223 -0
  294. package/dist/sync.d.ts +19 -0
  295. package/dist/sync.d.ts.map +1 -0
  296. package/dist/sync.js +540 -0
  297. package/dist/tables.d.ts +412 -0
  298. package/dist/tables.d.ts.map +1 -0
  299. package/dist/tables.js +737 -0
  300. package/dist/tallies.d.ts +18 -0
  301. package/dist/tallies.d.ts.map +1 -0
  302. package/dist/tallies.js +129 -0
  303. package/dist/transfer.d.ts +0 -5
  304. package/dist/transfer.d.ts.map +1 -1
  305. package/dist/turn.d.ts +1 -1
  306. package/dist/turn.d.ts.map +1 -1
  307. package/dist/turn.js +31 -20
  308. package/dist/validation.d.ts +29 -0
  309. package/dist/validation.d.ts.map +1 -0
  310. package/dist/validation.js +104 -0
  311. package/dist/windows.d.ts +1 -16
  312. package/dist/windows.d.ts.map +1 -1
  313. package/dist/windows.js +2 -79
  314. package/dist/wire.d.ts +72 -8
  315. package/dist/wire.d.ts.map +1 -1
  316. package/dist/wire.js +24 -5
  317. package/package.json +19 -19
  318. package/AGENTS.md +0 -299
  319. package/dist/attempt.d.ts +0 -16
  320. package/dist/attempt.d.ts.map +0 -1
  321. package/dist/attempt.js +0 -70
  322. package/dist/chat/acts.d.ts +0 -33
  323. package/dist/chat/acts.d.ts.map +0 -1
  324. package/dist/chat/acts.js +0 -36
  325. package/dist/chat/context.d.ts +0 -3
  326. package/dist/chat/context.d.ts.map +0 -1
  327. package/dist/chat/earlier.d.ts +0 -10
  328. package/dist/chat/earlier.d.ts.map +0 -1
  329. package/dist/chat/earlier.js +0 -54
  330. package/dist/chat/input.d.ts +0 -9
  331. package/dist/chat/input.d.ts.map +0 -1
  332. package/dist/chat/input.js +0 -99
  333. package/dist/chat/kit.d.ts +0 -61
  334. package/dist/chat/kit.d.ts.map +0 -1
  335. package/dist/chat/kit.js +0 -123
  336. package/dist/chat/lasting.d.ts +0 -6
  337. package/dist/chat/lasting.d.ts.map +0 -1
  338. package/dist/chat/lasting.js +0 -19
  339. package/dist/chat/list.d.ts +0 -27
  340. package/dist/chat/list.d.ts.map +0 -1
  341. package/dist/chat/list.js +0 -99
  342. package/dist/chat/markdown.d.ts +0 -21
  343. package/dist/chat/markdown.d.ts.map +0 -1
  344. package/dist/chat/markdown.js +0 -246
  345. package/dist/chat/message.d.ts +0 -6
  346. package/dist/chat/message.d.ts.map +0 -1
  347. package/dist/chat/message.js +0 -192
  348. package/dist/chat/messages.d.ts +0 -22
  349. package/dist/chat/messages.d.ts.map +0 -1
  350. package/dist/chat/messages.js +0 -171
  351. package/dist/chat/name.d.ts +0 -6
  352. package/dist/chat/name.d.ts.map +0 -1
  353. package/dist/chat/name.js +0 -37
  354. package/dist/chat/opened.d.ts +0 -11
  355. package/dist/chat/opened.d.ts.map +0 -1
  356. package/dist/chat/opened.js +0 -17
  357. package/dist/chat/overlay.d.ts +0 -31
  358. package/dist/chat/overlay.d.ts.map +0 -1
  359. package/dist/chat/overlay.js +0 -97
  360. package/dist/chat/parts.d.ts +0 -57
  361. package/dist/chat/parts.d.ts.map +0 -1
  362. package/dist/chat/parts.js +0 -119
  363. package/dist/chat/pieces.d.ts +0 -62
  364. package/dist/chat/pieces.d.ts.map +0 -1
  365. package/dist/chat/pieces.js +0 -1110
  366. package/dist/chat/process.d.ts +0 -20
  367. package/dist/chat/process.d.ts.map +0 -1
  368. package/dist/chat/process.js +0 -32
  369. package/dist/chat/provider.d.ts +0 -63
  370. package/dist/chat/provider.d.ts.map +0 -1
  371. package/dist/chat/provider.js +0 -630
  372. package/dist/chat/question.d.ts +0 -9
  373. package/dist/chat/question.d.ts.map +0 -1
  374. package/dist/chat/question.js +0 -69
  375. package/dist/chat/questions.d.ts.map +0 -1
  376. package/dist/chat/read.d.ts.map +0 -1
  377. package/dist/chat/ready.d.ts +0 -34
  378. package/dist/chat/ready.d.ts.map +0 -1
  379. package/dist/chat/ready.js +0 -91
  380. package/dist/chat/steady.d.ts +0 -3
  381. package/dist/chat/steady.d.ts.map +0 -1
  382. package/dist/chat/steady.js +0 -26
  383. package/dist/chat/style.d.ts +0 -4
  384. package/dist/chat/style.d.ts.map +0 -1
  385. package/dist/chat/style.js +0 -302
  386. package/dist/chat.d.ts +0 -14
  387. package/dist/chat.d.ts.map +0 -1
  388. package/dist/chat.js +0 -8
  389. package/dist/fence.d.ts +0 -6
  390. package/dist/fence.d.ts.map +0 -1
  391. package/dist/fence.js +0 -10
  392. package/dist/read-side.d.ts +0 -27
  393. package/dist/read-side.d.ts.map +0 -1
  394. package/dist/read-side.js +0 -826
package/dist/replica.js CHANGED
@@ -1,226 +1,219 @@
1
1
  import { equalValue, parse } from '@agentshouse/mdmodel';
2
2
  import { immutable, landing } from './change.js';
3
- import { changedCleanly, collecting, unreadable, validateCollection, } from './collection.js';
4
- import { acceptedBinaries, overlayChanged, overlaying, sameText, } from './overlay.js';
5
- import { providerRewritten } from './save.js';
6
- import { drafted, patched, settled, sharing } from './shared.js';
7
- import { finished, stepped } from './turn.js';
8
- export function compositionOf(record) {
3
+ import { collectionOf, definitionsAt } from './collection.js';
4
+ import { storedModel } from './model.js';
5
+ import { acceptedBinaries, overlaying } from './overlay.js';
6
+ import { writtenFacts } from './rows.js';
7
+ import { effectiveIn, rewriting } from './save.js';
8
+ import { guarding } from './shared.js';
9
+ import { ROW_WEIGHT } from './turn.js';
10
+ export function compositionOf(model, typedSelection, builtIn, typedPaths) {
9
11
  return {
10
- model: record.model,
11
- selection: record.typedSelection === null
12
- ? null
13
- : { roots: record.typedSelection.roots, model: record.selectionModel },
12
+ model,
13
+ selection: typedSelection === null ? null : { roots: typedSelection.roots, model: builtIn },
14
+ typedPaths,
14
15
  };
15
16
  }
16
- function* holding(record) {
17
- const documents = yield* sharing(record.documents);
18
- const binaries = yield* sharing(record.binaries);
19
- const revisions = yield* sharing(record.revisions);
20
- const fileIds = yield* sharing(record.fileIds);
21
- const changes = yield* sharing(record.changes);
22
- const written = yield* sharing(record.written);
23
- return documents === record.documents &&
24
- binaries === record.binaries &&
25
- revisions === record.revisions &&
26
- fileIds === record.fileIds &&
27
- changes === record.changes &&
28
- written === record.written
29
- ? record
30
- : { ...record, documents, binaries, revisions, fileIds, changes, written };
17
+ export function storedRecord(record) {
18
+ const { key: _key, ...stored } = record;
19
+ return JSON.stringify({ ...stored, model: storedModel(stored.model) });
31
20
  }
32
- export function confirmedOf(record, previous) {
33
- return finished(confirming(record, previous));
21
+ const PROBES = new Set([
22
+ 'then',
23
+ 'toJSON',
24
+ 'constructor',
25
+ 'valueOf',
26
+ 'toString',
27
+ ]);
28
+ class UnreadPath extends Error {
29
+ constructor(path) {
30
+ super(`the replica slice holds no row for ${path}`);
31
+ }
34
32
  }
35
- function* confirming(record, previous) {
36
- const kept = yield* holding(record);
37
- return {
38
- record: kept,
39
- collection: yield* collecting(kept.documents, compositionOf(kept), previous?.collection),
33
+ function strict(values, held) {
34
+ const guard = (property) => {
35
+ if (typeof property === 'string' && !held.has(property) && !PROBES.has(property)) {
36
+ throw new UnreadPath(property);
37
+ }
40
38
  };
39
+ return guarding(values, {
40
+ get(target, property, receiver) {
41
+ guard(property);
42
+ return Reflect.get(target, property, receiver);
43
+ },
44
+ has(target, property) {
45
+ guard(property);
46
+ return Reflect.has(target, property);
47
+ },
48
+ getOwnPropertyDescriptor(target, property) {
49
+ guard(property);
50
+ return Reflect.getOwnPropertyDescriptor(target, property);
51
+ },
52
+ });
41
53
  }
42
- export function sameMembership(record, other) {
43
- return (JSON.stringify(record.typedSelection?.roots ?? null) ===
44
- JSON.stringify(other.typedSelection?.roots ?? null));
54
+ export function* slicing(entries, paths) {
55
+ const held = new Set(paths);
56
+ for (const entry of entries)
57
+ held.add(entry.path);
58
+ const documents = {};
59
+ const binaries = {};
60
+ const revisions = {};
61
+ const fileIds = {};
62
+ const created = {};
63
+ const changes = {};
64
+ const written = {};
65
+ const facts = {};
66
+ for (const entry of entries) {
67
+ if (entry.facts !== null)
68
+ facts[entry.path] = entry.facts;
69
+ if (entry.binary !== null)
70
+ binaries[entry.path] = entry.binary;
71
+ else if (entry.content !== null)
72
+ documents[entry.path] = entry.content;
73
+ if (entry.revision !== null)
74
+ revisions[entry.path] = entry.revision;
75
+ if (entry.fileId !== null)
76
+ fileIds[entry.path] = entry.fileId;
77
+ if (entry.created !== null)
78
+ created[entry.path] = entry.created;
79
+ if (entry.change !== null)
80
+ changes[entry.path] = entry.change;
81
+ if (entry.written !== null)
82
+ written[entry.path] = entry.written;
83
+ yield ROW_WEIGHT;
84
+ }
85
+ return {
86
+ documents: strict(documents, held),
87
+ binaries: strict(binaries, held),
88
+ revisions: strict(revisions, held),
89
+ fileIds: strict(fileIds, held),
90
+ created: strict(created, held),
91
+ changes: strict(changes, held),
92
+ written: strict(written, held),
93
+ facts: strict(facts, held),
94
+ held,
95
+ };
45
96
  }
46
- function* cleanly(record, previous) {
47
- if (previous === undefined)
48
- return false;
49
- const before = previous.record;
50
- return yield* changedCleanly({ text: record.documents, binaries: record.binaries }, { text: before.documents, binaries: before.binaries, composition: compositionOf(before) }, compositionOf(record));
97
+ export function entryAt(layer, path) {
98
+ const content = layer.documents[path];
99
+ const binary = layer.binaries[path];
100
+ if (content === undefined && binary === undefined)
101
+ return null;
102
+ return {
103
+ path,
104
+ content: content ?? null,
105
+ binary: binary ?? null,
106
+ revision: layer.revisions[path] ?? null,
107
+ fileId: layer.fileIds[path] ?? null,
108
+ created: layer.created[path] ?? null,
109
+ change: layer.changes[path] ?? null,
110
+ written: layer.written?.[path] ?? null,
111
+ };
51
112
  }
52
- function* staging(staged, previous) {
53
- const record = yield* holding(staged);
54
- const textChanged = previous === undefined || !(yield* sameText(record, previous.record));
55
- const modeled = record.model.status !== 'unavailable' || record.selectionModel.status !== 'unavailable';
56
- if (modeled &&
57
- (textChanged ||
58
- record.model !== previous?.record.model ||
59
- record.selectionModel !== previous?.record.selectionModel) &&
60
- !(yield* cleanly(record, previous))) {
61
- const verdict = yield* validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
62
- if (verdict.verdict === 'refuse' && verdict.rule !== 'model-unavailable') {
63
- return { kind: 'refused', refusal: verdict };
64
- }
65
- if (verdict.verdict === 'refuse') {
66
- const refused = yield* unreadable(record.documents, previous?.record.documents);
67
- if (refused !== null)
68
- return refused;
113
+ export function* slicingWith(slice, set, removed) {
114
+ const entries = new Map();
115
+ for (const path of slice.held) {
116
+ const entry = entryAt(slice, path);
117
+ if (entry !== null) {
118
+ entries.set(path, { ...entry, type: null, facts: slice.facts[path] ?? null });
69
119
  }
120
+ yield ROW_WEIGHT;
70
121
  }
71
- else if (textChanged) {
72
- const refused = yield* unreadable(record.documents, previous?.record.documents);
73
- if (refused !== null)
74
- return refused;
75
- }
76
- return { kind: 'staged', confirmed: yield* confirming(record, previous) };
122
+ for (const path of removed)
123
+ entries.delete(path);
124
+ for (const entry of set)
125
+ entries.set(entry.path, { ...entry, type: null });
126
+ return yield* slicing([...entries.values()], [...slice.held, ...set.map(({ path }) => path), ...removed]);
77
127
  }
78
- export function readStaged(staged, previous) {
79
- return stepped(staging(staged, previous));
128
+ function changePaths(change) {
129
+ return change.kind === 'move' ? [change.path, change.to] : [change.path];
80
130
  }
81
- function* reclassifying(record, previous) {
82
- const verdict = yield* validateCollection(record.documents, Object.keys(record.binaries), compositionOf(record));
83
- if (verdict.verdict !== 'refuse')
84
- return { kind: 'staged', confirmed: yield* confirming(record, previous) };
85
- return verdict.rule === 'model-unavailable'
86
- ? { kind: 'deferred' }
87
- : { kind: 'refused', refusal: verdict };
88
- }
89
- export function readReclassified(record, previous) {
90
- return stepped(reclassifying(record, previous));
91
- }
92
- function returnedBinaries(held, submitted, accepted) {
93
- const binaries = drafted(held);
94
- for (const change of submitted.changes) {
95
- if (change.kind !== 'move')
96
- continue;
97
- const moved = binaries[change.path];
98
- if (moved === undefined || accepted.revisions[change.to] === undefined)
99
- continue;
100
- binaries[change.to] = moved;
101
- delete binaries[change.path];
102
- }
103
- Object.assign(binaries, acceptedBinaries(accepted.binaryFiles ?? {}));
104
- for (const path of accepted.removals)
105
- delete binaries[path];
106
- return settled(binaries);
107
- }
108
- export function applyReturned(confirmed, submitted, accepted, roomVersion, writtenAt) {
109
- const { documents, revisions, fileIds, changes, removals } = accepted;
110
- const nextDocuments = drafted(confirmed.record.documents);
111
- const nextRevisions = drafted(confirmed.record.revisions);
112
- const nextFileIds = drafted(confirmed.record.fileIds);
113
- const nextChanges = drafted(confirmed.record.changes);
114
- const nextWritten = drafted(confirmed.record.written);
115
- Object.assign(nextDocuments, documents);
116
- Object.assign(nextRevisions, revisions);
117
- for (const path of Object.keys({ ...documents, ...revisions }))
118
- delete nextFileIds[path];
119
- Object.assign(nextFileIds, fileIds);
120
- for (const path of Object.keys(documents))
121
- nextWritten[path] = writtenAt;
122
- for (const [path, revision] of Object.entries(revisions)) {
123
- if (confirmed.record.revisions[path] !== revision)
124
- delete nextChanges[path];
125
- }
126
- Object.assign(nextChanges, changes);
127
- for (const path of removals) {
128
- delete nextDocuments[path];
129
- delete nextRevisions[path];
130
- delete nextFileIds[path];
131
- delete nextChanges[path];
132
- delete nextWritten[path];
131
+ export function touchedBy(queue) {
132
+ const paths = new Set();
133
+ for (const batch of queue) {
134
+ for (const change of batch.changes)
135
+ for (const path of changePaths(change))
136
+ paths.add(path);
137
+ for (const precondition of batch.preconditions)
138
+ paths.add(precondition.path);
139
+ for (const move of batch.between?.moves ?? [])
140
+ paths.add(move.path);
133
141
  }
134
- return readStaged({
135
- ...confirmed.record,
136
- roomVersion,
137
- documents: settled(nextDocuments),
138
- revisions: settled(nextRevisions),
139
- fileIds: settled(nextFileIds),
140
- changes: settled(nextChanges),
141
- written: settled(nextWritten),
142
- binaries: returnedBinaries(confirmed.record.binaries, submitted, accepted),
143
- }, confirmed);
142
+ return paths;
144
143
  }
145
- function* predicting(confirmed, batches, previous) {
146
- const composition = compositionOf(confirmed.record);
147
- let layer = confirmed.record;
148
- const replay = [];
149
- const prior = new Map(previous?.replay.map((step) => [step.id, step]) ?? []);
150
- for (const batch of batches) {
151
- const before = layer;
152
- const old = prior.get(batch.id);
153
- const hasMove = batch.changes.some((change) => change.kind === 'move');
154
- const reuseRewrite = old?.collection !== undefined &&
155
- (yield* sameText(before, old.before)) &&
156
- old.collection.composition.model === composition.model &&
157
- old.collection.composition.selection?.model === composition.selection?.model &&
158
- JSON.stringify(old.collection.composition.selection?.roots) ===
159
- JSON.stringify(composition.selection?.roots);
160
- const collection = hasMove
161
- ? reuseRewrite
162
- ? old.collection
163
- : yield* collecting(before.documents, composition, old?.collection ?? confirmed.collection)
164
- : undefined;
165
- const effective = collection === undefined
166
- ? batch
167
- : reuseRewrite
168
- ? old.effective
169
- : yield* providerRewritten(batch, { ...before, collection });
170
- layer =
171
- old === undefined
172
- ? yield* overlaying(before, [effective])
173
- : yield* overlayChanged(before, effective, old.before, old.effective, old.after);
174
- replay.push({
175
- id: batch.id,
176
- before,
177
- after: layer,
178
- effective,
179
- ...(collection === undefined ? {} : { collection }),
180
- });
144
+ export function movedBy(queue, locator) {
145
+ const paths = new Set();
146
+ for (const batch of queue) {
147
+ if (!rewriting(batch, locator))
148
+ continue;
149
+ for (const change of batch.changes)
150
+ if (change.kind === 'move')
151
+ paths.add(change.path);
152
+ if (batch.between?.source.room === locator) {
153
+ for (const move of batch.between.moves)
154
+ paths.add(move.path);
155
+ }
181
156
  }
182
- return { layer, replay };
157
+ return paths;
183
158
  }
184
- export function* replicating(confirmed, queue, previous) {
185
- const batches = Object.freeze(queue.map(immutable));
186
- if (batches.length === 0) {
187
- return {
188
- confirmed,
189
- queue: batches,
190
- visible: {
191
- documents: confirmed.record.documents,
192
- binaries: confirmed.record.binaries,
193
- revisions: confirmed.record.revisions,
194
- fileIds: confirmed.record.fileIds,
195
- changes: confirmed.record.changes,
196
- collection: confirmed.collection,
197
- },
198
- replay: [],
199
- };
159
+ export function* replaying(confirmed, queue, locator, composition) {
160
+ let layer = confirmed;
161
+ const touched = new Set();
162
+ for (const batch of queue) {
163
+ const effective = rewriting(batch, locator)
164
+ ? yield* effectiveIn(batch, locator, {
165
+ ...layer,
166
+ collection: collectionOf(layer.documents, composition),
167
+ })
168
+ : batch;
169
+ for (const change of effective.changes)
170
+ for (const path of changePaths(change))
171
+ touched.add(path);
172
+ layer = yield* overlaying(layer, [effective], composition);
173
+ yield ROW_WEIGHT;
200
174
  }
201
- const { layer, replay } = yield* predicting(confirmed, batches, previous);
202
175
  return {
203
- confirmed,
204
- queue: batches,
205
- replay,
206
- visible: {
207
- ...layer,
208
- collection: yield* collecting(layer.documents, compositionOf(confirmed.record), previous?.visible.collection ?? confirmed.collection),
209
- },
176
+ visible: { ...layer, collection: collectionOf(layer.documents, composition) },
177
+ touched,
210
178
  };
211
179
  }
212
- export function replicaOf(confirmed, queue, previous) {
213
- return finished(replicating(confirmed, queue, previous));
180
+ export function* overlayOf(visible, touched) {
181
+ const rows = [];
182
+ for (const path of touched) {
183
+ const entry = entryAt(visible, path);
184
+ yield ROW_WEIGHT + (entry?.content?.length ?? 0);
185
+ const text = entry?.binary === null ? entry.content : null;
186
+ rows.push(entry === null
187
+ ? {
188
+ path,
189
+ present: false,
190
+ content: null,
191
+ binary: null,
192
+ revision: null,
193
+ fileId: null,
194
+ created: null,
195
+ change: null,
196
+ written: null,
197
+ facts: null,
198
+ }
199
+ : {
200
+ ...entry,
201
+ written: null,
202
+ present: true,
203
+ facts: text === null ? null : writtenFacts(path, text, visible.collection.composition),
204
+ });
205
+ }
206
+ return rows;
214
207
  }
215
208
  function present(layer, path) {
216
209
  return layer.documents[path] !== undefined || layer.binaries[path] !== undefined;
217
210
  }
218
- function holds(layer, preconditions) {
211
+ export function holds(layer, preconditions, composition) {
219
212
  const parsed = new Map();
220
213
  const documentAt = (path) => {
221
214
  if (!parsed.has(path)) {
222
215
  const text = layer.documents[path];
223
- const opened = text === undefined ? null : parse(text, path);
216
+ const opened = text === undefined ? null : parse(text, path, definitionsAt(composition, path));
224
217
  parsed.set(path, opened?.ok === true ? opened.document : null);
225
218
  }
226
219
  return parsed.get(path) ?? null;
@@ -280,15 +273,19 @@ function effects(change) {
280
273
  { kind: 'present', path: change.to },
281
274
  ];
282
275
  }
283
- if (change.kind === 'binary')
276
+ if (change.kind === 'arrival')
284
277
  return [{ kind: 'present', path }];
285
278
  return [{ kind: 'absent', path }];
286
279
  }
287
- export function landed(batch, confirmed, current = {}) {
288
- const layer = {
289
- ...confirmed.record,
290
- documents: patched(confirmed.record.documents, Object.entries(current)),
291
- };
280
+ export function landed(batch, confirmed, composition, current = {}) {
281
+ const documents = new Proxy(confirmed.documents, {
282
+ get(target, property, receiver) {
283
+ if (typeof property === 'string' && Object.hasOwn(current, property))
284
+ return current[property];
285
+ return Reflect.get(target, property, receiver);
286
+ },
287
+ });
288
+ const layer = { ...confirmed, documents };
292
289
  return batch.changes.every((change, index) => {
293
290
  if (change.kind === 'replace' || (change.kind === 'create' && 'content' in change)) {
294
291
  const at = landing(batch.changes, index, change.path);
@@ -300,9 +297,9 @@ export function landed(batch, confirmed, current = {}) {
300
297
  }
301
298
  return effects(change).every((effect) => {
302
299
  if (effect.kind === 'absent')
303
- return holds(layer, [effect]);
300
+ return holds(layer, [effect], composition);
304
301
  const at = landing(batch.changes, index, effect.path);
305
- return at === null || holds(layer, [{ ...effect, path: at }]);
302
+ return at === null || holds(layer, [{ ...effect, path: at }], composition);
306
303
  });
307
304
  });
308
305
  }
@@ -320,26 +317,25 @@ function founded(batch, layer) {
320
317
  });
321
318
  return changed ? immutable({ ...batch, preconditions }) : batch;
322
319
  }
323
- export function* standing(confirmed, queue, withdrawable, local) {
320
+ export function* standing(confirmed, queue, withdrawable, local, locator, composition) {
324
321
  if (!queue.some(withdrawable))
325
322
  return { withdrawn: [], kept: queue };
326
- const composition = compositionOf(confirmed.record);
327
- let layer = confirmed.record;
323
+ let layer = confirmed;
328
324
  const withdrawn = [];
329
325
  const kept = [];
330
326
  for (const batch of queue) {
331
- if (withdrawable(batch) && !holds(layer, batch.preconditions)) {
327
+ if (withdrawable(batch) && !holds(layer, batch.preconditions, composition)) {
332
328
  withdrawn.push(batch);
333
329
  continue;
334
330
  }
335
- const effective = batch.changes.some((change) => change.kind === 'move')
336
- ? yield* providerRewritten(batch, {
331
+ const effective = rewriting(batch, locator)
332
+ ? yield* effectiveIn(batch, locator, {
337
333
  ...layer,
338
- collection: yield* collecting(layer.documents, composition),
334
+ collection: collectionOf(layer.documents, composition),
339
335
  })
340
336
  : batch;
341
337
  let unapplied = false;
342
- const next = yield* overlaying(layer, [effective], () => {
338
+ const next = yield* overlaying(layer, [effective], composition, () => {
343
339
  unapplied = true;
344
340
  });
345
341
  if (local && unapplied) {
@@ -351,3 +347,118 @@ export function* standing(confirmed, queue, withdrawable, local) {
351
347
  }
352
348
  return { withdrawn, kept };
353
349
  }
350
+ export function returnedPaths(submitted, accepted) {
351
+ const paths = new Set([
352
+ ...Object.keys(accepted.documents),
353
+ ...Object.keys(accepted.revisions),
354
+ ...Object.keys(accepted.fileIds ?? {}),
355
+ ...Object.keys(accepted.changes),
356
+ ...Object.keys(accepted.binaryFiles ?? {}),
357
+ ...accepted.removals,
358
+ ]);
359
+ for (const change of submitted.changes) {
360
+ if (change.kind === 'move') {
361
+ paths.add(change.path);
362
+ paths.add(change.to);
363
+ }
364
+ if (change.kind === 'arrival')
365
+ paths.add(change.path);
366
+ }
367
+ return paths;
368
+ }
369
+ export function* returning(confirmed, submitted, accepted, writtenAt, composition) {
370
+ const documents = new Map();
371
+ const binaries = new Map();
372
+ const revisions = new Map();
373
+ const fileIds = new Map();
374
+ const created = new Map();
375
+ const changes = new Map();
376
+ const written = new Map();
377
+ const facts = new Map();
378
+ const read = (changed, held, path) => (changed.has(path) ? changed.get(path) : held[path]);
379
+ for (const [path, content] of Object.entries(accepted.documents)) {
380
+ yield ROW_WEIGHT + content.length;
381
+ documents.set(path, content);
382
+ facts.set(path, writtenFacts(path, content, composition));
383
+ fileIds.set(path, undefined);
384
+ written.set(path, writtenAt);
385
+ }
386
+ for (const [path, revision] of Object.entries(accepted.revisions)) {
387
+ yield ROW_WEIGHT;
388
+ revisions.set(path, revision);
389
+ fileIds.set(path, undefined);
390
+ if (confirmed.revisions[path] !== revision)
391
+ changes.set(path, undefined);
392
+ }
393
+ for (const [path, fileId] of Object.entries(accepted.fileIds ?? {}))
394
+ fileIds.set(path, fileId);
395
+ for (const [path, change] of Object.entries(accepted.changes))
396
+ changes.set(path, change);
397
+ for (const path of accepted.removals) {
398
+ documents.set(path, undefined);
399
+ revisions.set(path, undefined);
400
+ fileIds.set(path, undefined);
401
+ changes.set(path, undefined);
402
+ written.set(path, undefined);
403
+ }
404
+ for (const change of submitted.changes) {
405
+ if (change.kind === 'arrival') {
406
+ if (accepted.revisions[change.path] === undefined)
407
+ continue;
408
+ created.set(change.path, change.created);
409
+ if ('binary' in change)
410
+ binaries.set(change.path, { state: 'accepted', ...change.binary });
411
+ continue;
412
+ }
413
+ if (change.kind !== 'move' || accepted.revisions[change.to] === undefined)
414
+ continue;
415
+ created.set(change.to, read(created, confirmed.created, change.path));
416
+ created.set(change.path, undefined);
417
+ const moved = read(binaries, confirmed.binaries, change.path);
418
+ if (moved === undefined)
419
+ continue;
420
+ binaries.set(change.to, moved);
421
+ binaries.set(change.path, undefined);
422
+ }
423
+ for (const [path, binary] of acceptedBinaries(accepted.binaryFiles ?? {}))
424
+ binaries.set(path, binary);
425
+ for (const path of accepted.removals) {
426
+ binaries.set(path, undefined);
427
+ created.set(path, undefined);
428
+ }
429
+ const paths = new Set([
430
+ ...documents.keys(),
431
+ ...binaries.keys(),
432
+ ...revisions.keys(),
433
+ ...fileIds.keys(),
434
+ ...created.keys(),
435
+ ...changes.keys(),
436
+ ...written.keys(),
437
+ ]);
438
+ const set = [];
439
+ const removed = [];
440
+ for (const path of paths) {
441
+ const content = read(documents, confirmed.documents, path);
442
+ const binary = read(binaries, confirmed.binaries, path);
443
+ yield ROW_WEIGHT;
444
+ if (content === undefined && binary === undefined) {
445
+ removed.push(path);
446
+ continue;
447
+ }
448
+ const text = binary === undefined ? (content ?? null) : null;
449
+ const fresh = confirmed.documents[path] === undefined && confirmed.binaries[path] === undefined;
450
+ set.push({
451
+ path,
452
+ content: text,
453
+ facts: text === null ? null : (read(facts, confirmed.facts, path) ?? null),
454
+ binary: binary ?? null,
455
+ revision: read(revisions, confirmed.revisions, path) ?? null,
456
+ fileId: read(fileIds, confirmed.fileIds, path) ?? null,
457
+ created: read(created, confirmed.created, path) ??
458
+ (fresh ? (read(changes, confirmed.changes, path)?.time ?? null) : null),
459
+ change: read(changes, confirmed.changes, path) ?? null,
460
+ written: read(written, confirmed.written, path) ?? null,
461
+ });
462
+ }
463
+ return { set, removed };
464
+ }
@@ -0,0 +1,30 @@
1
+ import { type RuntimeShell } from './durability.js';
2
+ export declare const STEPS: readonly ['database', 'sign_in', 'connection', 'code', 'download', 'conversations', 'sending', 'reading'];
3
+ export type Step = (typeof STEPS)[number];
4
+ export type RetriedFailure = {
5
+ readonly step: Step;
6
+ readonly answered: false;
7
+ } | {
8
+ readonly step: Step;
9
+ readonly answered: true;
10
+ readonly error: unknown;
11
+ };
12
+ export type Uncertain = {
13
+ readonly failure?: unknown;
14
+ };
15
+ export type Attempt = {
16
+ readonly step: Step;
17
+ readonly instance: string;
18
+ };
19
+ export declare class Unanswered extends Error {
20
+ }
21
+ export declare function uncertainError(uncertainty: Uncertain): unknown;
22
+ export type Retries = {
23
+ failed(step: Step, instance: string, error: unknown): void;
24
+ unanswered(step: Step, instance: string): void;
25
+ uncertain(step: Step, instance: string, uncertainty: Uncertain): void;
26
+ succeeded(step: Step, instance: string): void;
27
+ };
28
+ export declare function createRetries(shell: Pick<RuntimeShell, 'retried' | 'succeeded'>): Retries;
29
+ export declare function retrying<T>(retries: Retries, step: Step, instance: string, ask: () => Promise<T>): () => Promise<T>;
30
+ //# sourceMappingURL=retried.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retried.d.ts","sourceRoot":"","sources":["../src/retried.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAErE,eAAO,MAAM,KAAK,YAChB,UAAU,EACV,SAAS,EACT,YAAY,EACZ,MAAM,EACN,UAAU,EACV,eAAe,EACf,SAAS,EACT,SAAS,CACD,CAAC;AAEX,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1C,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9E,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE,qBAAa,UAAW,SAAQ,KAAK;CAAG;AAExC,wBAAgB,cAAc,CAAC,WAAW,EAAE,SAAS,GAAG,OAAO,CAE9D;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3D,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,GAAG,IAAI,CAAC;IACtE,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/C,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,WAAW,CAAC,GAAG,OAAO,CA2CzF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACpB,MAAM,OAAO,CAAC,CAAC,CAAC,CAYlB"}