@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
@@ -1,60 +1,69 @@
1
- import { apply, equalValue, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
1
+ import { apply, create, equalValue, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
2
+ import { governing } from './collection.js';
2
3
  import { runtimeError } from './failure.js';
3
- import { hexDigest } from './file.js';
4
+ import { sha256 } from './digest.js';
4
5
  import { binaryLocalId } from './identity.js';
5
6
  import { normalize } from './paths.js';
6
- export function returnedBy(kind) {
7
- return { kind, code: kind, fields: {}, retryable: false };
7
+ export function returnedBy() {
8
+ return { kind: 'withdrawn', code: 'withdrawn', fields: {}, retryable: false };
8
9
  }
9
10
  export function staleWrite(current) {
10
- return { outcome: 'stale', code: 'stale', retryable: false, current };
11
+ return { outcome: 'stale', current };
11
12
  }
12
- function malformed() {
13
- throw runtimeError('room-draft-malformed');
13
+ function malformed(at, needs) {
14
+ throw runtimeError('room-draft-malformed', at === undefined ? 'room-draft-malformed' : `room-draft-malformed at ${at}: ${needs}`);
14
15
  }
15
16
  function plain(value) {
16
17
  return typeof value === 'object' && value !== null && !Array.isArray(value);
17
18
  }
18
- function text(value) {
19
- return typeof value === 'string' ? value : malformed();
19
+ function text(value, at) {
20
+ return typeof value === 'string' ? value : malformed(at, 'text');
20
21
  }
21
- function optionalText(value) {
22
- return value === undefined ? undefined : text(value);
22
+ function optionalText(value, at) {
23
+ return value === undefined ? undefined : text(value, at);
23
24
  }
24
- function markdownBase(value) {
25
- return value === null ? null : optionalText(value);
25
+ function markdownBase(value, at) {
26
+ return value === null ? null : optionalText(value, at);
26
27
  }
27
- function entries(value, each) {
28
+ function entries(value, at, each) {
28
29
  if (!plain(value))
29
- malformed();
30
+ malformed(at, 'an object of named values');
30
31
  const read = {};
31
32
  for (const [name, item] of Object.entries(value))
32
- read[name] = each(item);
33
+ read[name] = each(item, `${at}.${name}`);
33
34
  return read;
34
35
  }
35
- function fieldValue(value) {
36
+ function frontmatter(item, at) {
37
+ return frontmatterValue(item) ? item : malformed(at, 'a frontmatter value');
38
+ }
39
+ function fieldValue(value, at) {
36
40
  if (value === null)
37
41
  return null;
38
42
  if (!plain(value) || !Object.hasOwn(value, 'value') || !frontmatterValue(value.value)) {
39
- malformed();
43
+ malformed(at, '{ value } with a frontmatter value, or null where the document lacks it');
40
44
  }
41
45
  return { value: value.value };
42
46
  }
43
- function textPart(value) {
47
+ function textPart(value, at) {
44
48
  if (!plain(value))
45
- malformed();
46
- const base = optionalText(value.base);
47
- return { value: text(value.value), ...(base === undefined ? {} : { base }) };
49
+ malformed(at, '{ value, base }');
50
+ const base = optionalText(value.base, `${at}.base`);
51
+ return { value: text(value.value, `${at}.value`), ...(base === undefined ? {} : { base }) };
48
52
  }
49
- function creationOf(value) {
53
+ function creationOf(value, at) {
50
54
  if (!plain(value))
51
- malformed();
55
+ malformed(at, '{ type, fields, sections }, or { markdown }');
52
56
  if (Object.hasOwn(value, 'markdown'))
53
- return { markdown: text(value.markdown) };
54
- const fields = entries(value.fields, (item) => (frontmatterValue(item) ? item : malformed()));
55
- return { type: text(value.type), fields, sections: entries(value.sections, text) };
57
+ return { markdown: text(value.markdown, `${at}.markdown`) };
58
+ if (typeof value.type !== 'string')
59
+ malformed(`${at}.type`, 'a type name, or markdown in place of type, fields and sections');
60
+ return {
61
+ type: value.type,
62
+ fields: entries(value.fields, `${at}.fields`, frontmatter),
63
+ sections: entries(value.sections, `${at}.sections`, text),
64
+ };
56
65
  }
57
- const PART_NAMES = new Set([
66
+ const PART_NAMES = [
58
67
  'fields',
59
68
  'sections',
60
69
  'preamble',
@@ -63,47 +72,57 @@ const PART_NAMES = new Set([
63
72
  'move',
64
73
  'removal',
65
74
  'file',
66
- ]);
67
- export function readParts(value) {
68
- if (!plain(value) || Object.keys(value).some((name) => !PART_NAMES.has(name)))
69
- malformed();
75
+ ];
76
+ const NAMED_PARTS = `a part named ${PART_NAMES.slice(0, -1).join(', ')} or ${PART_NAMES.slice(-1).join('')}`;
77
+ export function readParts(value, path) {
78
+ if (!plain(value))
79
+ malformed(path, 'an object of parts');
80
+ const unknown = Object.keys(value).find((name) => !PART_NAMES.includes(name));
81
+ if (unknown !== undefined)
82
+ malformed(`${path} ${unknown}`, NAMED_PARTS);
70
83
  const parts = {};
71
84
  if (value.fields !== undefined) {
72
- parts.fields = entries(value.fields, (item) => {
85
+ parts.fields = entries(value.fields, `${path} fields`, (item, at) => {
73
86
  if (!plain(item) || !Object.hasOwn(item, 'value') || !frontmatterValue(item.value)) {
74
- malformed();
87
+ malformed(at, '{ value, base } with a frontmatter value');
75
88
  }
76
89
  return item.base === undefined
77
90
  ? { value: item.value }
78
- : { value: item.value, base: fieldValue(item.base) };
91
+ : { value: item.value, base: fieldValue(item.base, `${at}.base`) };
79
92
  });
80
93
  }
81
94
  if (value.sections !== undefined)
82
- parts.sections = entries(value.sections, textPart);
95
+ parts.sections = entries(value.sections, `${path} sections`, textPart);
83
96
  if (value.preamble !== undefined)
84
- parts.preamble = textPart(value.preamble);
97
+ parts.preamble = textPart(value.preamble, `${path} preamble`);
85
98
  if (value.markdown !== undefined)
86
- parts.markdown = textPart(value.markdown);
99
+ parts.markdown = textPart(value.markdown, `${path} markdown`);
87
100
  if (value.creation !== undefined)
88
- parts.creation = creationOf(value.creation);
101
+ parts.creation = creationOf(value.creation, `${path} creation`);
89
102
  if (value.move !== undefined) {
90
103
  if (!plain(value.move))
91
- malformed();
92
- const base = markdownBase(value.move.base);
93
- parts.move = { to: text(value.move.to), ...(base === undefined ? {} : { base }) };
104
+ malformed(`${path} move`, '{ to, room, base }');
105
+ const base = markdownBase(value.move.base, `${path} move.base`);
106
+ const room = optionalText(value.move.room, `${path} move.room`);
107
+ parts.move = {
108
+ to: text(value.move.to, `${path} move.to`),
109
+ ...(room === undefined ? {} : { room }),
110
+ ...(base === undefined ? {} : { base }),
111
+ };
94
112
  }
95
113
  if (value.removal !== undefined) {
96
114
  if (!plain(value.removal))
97
- malformed();
98
- const base = markdownBase(value.removal.base);
115
+ malformed(`${path} removal`, '{ base }');
116
+ const base = markdownBase(value.removal.base, `${path} removal.base`);
99
117
  parts.removal = base === undefined ? {} : { base };
100
118
  }
101
119
  if (value.file !== undefined) {
102
120
  if (!plain(value.file) || !(value.file.blob instanceof Blob))
103
- malformed();
121
+ malformed(`${path} file`, '{ blob, base } with a Blob');
104
122
  if (Object.keys(value).length > 1)
105
123
  throw runtimeError('room-draft-file-exclusive');
106
- parts.file = { blob: value.file.blob };
124
+ const base = markdownBase(value.file.base, `${path} file.base`);
125
+ parts.file = base === undefined ? { blob: value.file.blob } : { blob: value.file.blob, base };
107
126
  }
108
127
  return parts;
109
128
  }
@@ -120,11 +139,51 @@ function kept(prior, base) {
120
139
  throw runtimeError('room-draft-base-missing');
121
140
  return base;
122
141
  }
142
+ function movePart(current, move) {
143
+ return {
144
+ to: move.to,
145
+ ...(move.room === undefined ? {} : { room: move.room }),
146
+ base: kept(current, move.base),
147
+ };
148
+ }
123
149
  function editsText(parts) {
124
150
  return (parts.preamble !== undefined ||
125
151
  named(parts.fields).length > 0 ||
126
152
  named(parts.sections).length > 0);
127
153
  }
154
+ function partNames(parts) {
155
+ const names = [];
156
+ for (const [name, part] of Object.entries(parts)) {
157
+ if (name === 'preamble' || name === 'markdown')
158
+ names.push(name);
159
+ else if ((name === 'fields' || name === 'sections') && plain(part))
160
+ names.push(...Object.keys(part).map((one) => `${name}/${one}`));
161
+ else
162
+ return null;
163
+ }
164
+ return names.sort().join('\u0000');
165
+ }
166
+ function withBaseOf(prior, part) {
167
+ return plain(part) && plain(prior) && Object.hasOwn(prior, 'base')
168
+ ? { ...part, base: prior.base }
169
+ : part;
170
+ }
171
+ export function gatheredParts(earlier, later) {
172
+ if (!plain(earlier) || !plain(later))
173
+ return null;
174
+ const named = partNames(earlier);
175
+ if (named === null || named !== partNames(later))
176
+ return null;
177
+ return Object.fromEntries(Object.entries(later).map(([name, part]) => [
178
+ name,
179
+ name === 'fields' || name === 'sections'
180
+ ? Object.fromEntries(Object.entries(part).map(([one, value]) => [
181
+ one,
182
+ withBaseOf(earlier[name][one], value),
183
+ ]))
184
+ : withBaseOf(earlier[name], part),
185
+ ]));
186
+ }
128
187
  export function held(current, parts, file) {
129
188
  if (parts.markdown !== undefined && editsText(parts)) {
130
189
  throw runtimeError('room-draft-markdown-exclusive');
@@ -144,9 +203,7 @@ export function held(current, parts, file) {
144
203
  }
145
204
  return {
146
205
  file: current.file,
147
- ...(parts.move === undefined
148
- ? {}
149
- : { move: { to: parts.move.to, base: kept(current.move, parts.move.base) } }),
206
+ ...(parts.move === undefined ? {} : { move: movePart(current.move, parts.move) }),
150
207
  ...(parts.removal === undefined
151
208
  ? {}
152
209
  : { removal: { base: kept(current.removal, parts.removal.base) } }),
@@ -181,9 +238,8 @@ export function held(current, parts, file) {
181
238
  }
182
239
  if (parts.creation !== undefined)
183
240
  next.creation = parts.creation;
184
- if (parts.move !== undefined) {
185
- next.move = { to: parts.move.to, base: kept(current?.move, parts.move.base) };
186
- }
241
+ if (parts.move !== undefined)
242
+ next.move = movePart(current?.move, parts.move);
187
243
  if (parts.removal !== undefined) {
188
244
  next.removal = { base: kept(current?.removal, parts.removal.base) };
189
245
  }
@@ -200,8 +256,10 @@ export function underneath(parts, path, visible) {
200
256
  const markdown = visible?.documents[path] ?? null;
201
257
  const document = visible?.collection.document(path);
202
258
  const report = {};
259
+ const unread = document?.type !== undefined &&
260
+ governing(visible.collection.composition, path).status === 'unavailable';
203
261
  const fields = {};
204
- for (const [name, part] of named(parts.fields)) {
262
+ for (const [name, part] of unread ? [] : named(parts.fields)) {
205
263
  const current = document !== undefined && Object.hasOwn(document.fields, name)
206
264
  ? { value: document.fields[name] }
207
265
  : null;
@@ -211,7 +269,7 @@ export function underneath(parts, path, visible) {
211
269
  if (Object.keys(fields).length > 0)
212
270
  report.fields = fields;
213
271
  const sections = {};
214
- for (const [name, part] of named(parts.sections)) {
272
+ for (const [name, part] of unread ? [] : named(parts.sections)) {
215
273
  const current = document !== undefined && Object.hasOwn(document.sections, name)
216
274
  ? document.sections[name]
217
275
  : null;
@@ -221,8 +279,9 @@ export function underneath(parts, path, visible) {
221
279
  if (Object.keys(sections).length > 0)
222
280
  report.sections = sections;
223
281
  const preamble = document?.preamble ?? null;
224
- if (parts.preamble !== undefined && preamble !== parts.preamble.base)
282
+ if (!unread && parts.preamble !== undefined && preamble !== parts.preamble.base) {
225
283
  report.preamble = preamble;
284
+ }
226
285
  if (parts.markdown !== undefined && markdown !== parts.markdown.base)
227
286
  report.markdown = markdown;
228
287
  if (parts.creation !== undefined && markdown !== null)
@@ -240,29 +299,32 @@ export function underneath(parts, path, visible) {
240
299
  }
241
300
  const UNTYPED_MEDIA_TYPE = 'application/octet-stream';
242
301
  export async function heldFile(blob, base) {
243
- const bytes = await blob.arrayBuffer();
244
302
  return {
245
- blob,
246
303
  localId: binaryLocalId(),
247
- byteLength: bytes.byteLength,
304
+ ...(blob instanceof File ? { name: blob.name } : {}),
305
+ byteLength: blob.size,
248
306
  mediaType: blob.type === '' ? UNTYPED_MEDIA_TYPE : blob.type,
249
- sha256: hexDigest(await crypto.subtle.digest('SHA-256', bytes)),
307
+ sha256: await sha256(blob),
250
308
  base,
251
309
  };
252
310
  }
253
311
  export function binaryBase(visible, path) {
254
- return visible?.binaries[path] === undefined ? null : (visible.revisions[path] ?? null);
312
+ const binary = visible?.binaries[path];
313
+ if (binary === undefined)
314
+ return null;
315
+ return visible?.revisions[path] ?? (binary.state === 'pending' ? binary.localId : null);
255
316
  }
256
- export function changedParts(path, report) {
317
+ export function changedParts(path, parts, visible) {
318
+ const report = underneath(parts, path, visible);
319
+ const made = parts.file?.base === null;
257
320
  return [
258
- ...(report.creation === undefined ? [] : [{ path, part: 'creation' }]),
259
321
  ...named(report.fields).map(([name]) => ({ path, part: 'field', name })),
260
322
  ...named(report.sections).map(([name]) => ({ path, part: 'section', name })),
261
323
  ...(report.preamble === undefined ? [] : [{ path, part: 'preamble' }]),
262
324
  ...(report.markdown === undefined ? [] : [{ path, part: 'markdown' }]),
263
325
  ...(report.move === undefined ? [] : [{ path, part: 'move' }]),
264
326
  ...(report.removal === undefined ? [] : [{ path, part: 'removal' }]),
265
- ...(report.file === undefined ? [] : [{ path, part: 'file' }]),
327
+ ...(report.file === undefined || made ? [] : [{ path, part: 'file' }]),
266
328
  ];
267
329
  }
268
330
  function joined(existing, returned) {
@@ -272,33 +334,45 @@ function joined(existing, returned) {
272
334
  merged[name] = part;
273
335
  return Object.keys(merged).length === 0 ? undefined : merged;
274
336
  }
275
- function ended(text) {
337
+ export function lineEnded(text) {
276
338
  return text === '' || text.endsWith('\n') ? text : `${text}\n`;
277
339
  }
278
- function frontmatterOf(fields) {
279
- const opened = parse('---\n---\n');
280
- if (!opened.ok)
281
- return malformed();
282
- const next = apply(opened.document, fields.map(([name, part]) => ({
283
- kind: 'field',
284
- name,
285
- value: part.value,
286
- prior: undefined,
287
- })));
288
- return next.outcome === 'applied' ? serialize(next.document) : malformed();
340
+ function written(start, changes, definition) {
341
+ const next = apply(start, changes, definition);
342
+ return next.outcome === 'applied' ? next.document : malformed();
343
+ }
344
+ function empty(definition) {
345
+ const parsed = parse('', '', definition);
346
+ return parsed.ok ? parsed.document : malformed();
289
347
  }
290
- export function partsAfter(markdown, parts) {
348
+ export function partsAfter(markdown, parts, definitions) {
291
349
  const fields = named(parts.fields);
350
+ const sections = named(parts.sections);
351
+ if (fields.length === 0 && sections.length === 0 && parts.preamble === undefined)
352
+ return markdown;
353
+ const whole = parse(markdown, '', definitions);
354
+ const type = whole.ok ? whole.document.type : undefined;
355
+ const definition = definitions?.(type);
356
+ if (type !== undefined && definition === undefined)
357
+ return null;
358
+ const valued = fields.length === 0
359
+ ? empty(definition)
360
+ : written(create(type, definition), fields.map(([name, part]) => ({
361
+ kind: 'field',
362
+ name,
363
+ value: part.value,
364
+ prior: undefined,
365
+ })), definition);
366
+ const head = parts.preamble === undefined
367
+ ? valued
368
+ : written(valued, [{ kind: 'preamble', value: lineEnded(parts.preamble.value), prior: valued.preamble }], definition);
292
369
  const pieces = [
293
- ...(fields.length === 0 ? [] : [frontmatterOf(fields)]),
294
- ...(parts.preamble === undefined ? [] : [parts.preamble.value]),
295
- ...named(parts.sections).map(([name, part]) => `## ${name}\n${part.value}`),
370
+ ...(fields.length === 0 && parts.preamble === undefined ? [] : [serialize(head)]),
371
+ ...sections.map(([name, part]) => serialize(written(empty(definition), [{ kind: 'section', name, value: lineEnded(part.value), prior: undefined }], definition))),
296
372
  ];
297
- if (pieces.length === 0)
298
- return markdown;
299
- return `${ended(markdown)}\n${pieces.map(ended).join('')}`;
373
+ return `${lineEnded(markdown)}\n${pieces.join('')}`;
300
374
  }
301
- export function returnedInto(existing, returned) {
375
+ export function returnedInto(existing, returned, definitions) {
302
376
  if (existing === undefined)
303
377
  return returned;
304
378
  const next = { ...existing };
@@ -318,7 +392,9 @@ export function returnedInto(existing, returned) {
318
392
  delete next.fields;
319
393
  delete next.sections;
320
394
  delete next.preamble;
321
- const value = partsAfter(whole.value, existing.markdown === undefined ? existing : returned);
395
+ const value = partsAfter(whole.value, existing.markdown === undefined ? existing : returned, definitions);
396
+ if (value === null)
397
+ return null;
322
398
  next.markdown = { value, base: whole.base };
323
399
  }
324
400
  const creation = existing.creation ?? returned.creation;
@@ -339,6 +415,36 @@ export function moveTarget(move) {
339
415
  const to = normalize(move.to);
340
416
  return to === null || to === '' ? move.to : to;
341
417
  }
418
+ export function readSavedParts(named) {
419
+ const read = named.map(({ path, parts }) => ({ path, parts: readParts(parts, path) }));
420
+ read.forEach(({ path }, at) => {
421
+ if (path === '' || normalize(path) !== path)
422
+ malformed(path, 'a path inside the Room, such as notes/a.md');
423
+ if (read.findIndex((one) => one.path === path) !== at)
424
+ malformed(path, 'each path once in one save');
425
+ });
426
+ return read;
427
+ }
428
+ export function partsChanges(named) {
429
+ const changes = [];
430
+ const preconditions = [];
431
+ for (const { path, parts } of readSavedParts(named)) {
432
+ const parted = held(undefined, parts);
433
+ const made = changesOf(path, parted);
434
+ changes.push(...made.changes);
435
+ preconditions.push(...made.bases);
436
+ for (const change of made.changes) {
437
+ if (change.kind === 'create')
438
+ preconditions.push({ kind: 'absent', path });
439
+ if (change.kind === 'move')
440
+ preconditions.push({ kind: 'absent', path: change.to });
441
+ }
442
+ const revision = parted.markdown?.base ?? parted.move?.base ?? parted.removal?.base;
443
+ if (typeof revision === 'string')
444
+ preconditions.push({ kind: 'revision', path, revision });
445
+ }
446
+ return { changes, preconditions };
447
+ }
342
448
  export function changesOf(path, parts) {
343
449
  const changes = [];
344
450
  const bases = [];
@@ -358,23 +464,23 @@ export function changesOf(path, parts) {
358
464
  bases.push({ kind: 'field', path, name, value: part.base?.value });
359
465
  }
360
466
  for (const [name, part] of named(parts.sections)) {
361
- changes.push({ kind: 'section', path, name, value: part.value });
467
+ changes.push({ kind: 'section', path, name, value: lineEnded(part.value) });
362
468
  bases.push({ kind: 'section', path, name, value: part.base });
363
469
  }
364
470
  if (parts.preamble !== undefined) {
365
- changes.push({ kind: 'preamble', path, value: parts.preamble.value });
471
+ changes.push({ kind: 'preamble', path, value: lineEnded(parts.preamble.value) });
366
472
  bases.push({ kind: 'preamble', path, value: parts.preamble.base });
367
473
  }
368
474
  if (parts.markdown !== undefined) {
369
475
  changes.push({ kind: 'replace', path, content: parts.markdown.value });
370
476
  }
371
477
  if (parts.file !== undefined && parts.removal === undefined) {
372
- const { base, ...file } = parts.file;
478
+ const { base, name: _name, ...file } = parts.file;
373
479
  const at = parts.move === undefined ? path : moveTarget(parts.move);
374
480
  if (base !== null && at !== path)
375
481
  changes.push({ kind: 'move', path, to: at });
376
482
  changes.push({ kind: 'binary', path: at, ...file });
377
- if (base === null && at !== path)
483
+ if (base === null)
378
484
  bases.push({ kind: 'absent', path: at });
379
485
  return { changes, bases };
380
486
  }
@@ -386,35 +492,6 @@ export function changesOf(path, parts) {
386
492
  changes.push({ kind: 'remove', path });
387
493
  return { changes, bases };
388
494
  }
389
- function rebased(before, after) {
390
- return before === undefined ? after : { ...after, base: before.base };
391
- }
392
- function rebasedAll(before, after) {
393
- return {
394
- ...before,
395
- ...Object.fromEntries(Object.entries(after).map(([name, part]) => [name, rebased(before?.[name], part)])),
396
- };
397
- }
398
- export function joinedDraft(carried, saved) {
399
- const draft = saved.find((item) => item.path === carried.path);
400
- if (draft === undefined)
401
- return carried;
402
- const held = carried.parts;
403
- const next = draft.parts;
404
- return {
405
- path: carried.path,
406
- parts: {
407
- ...held,
408
- ...next,
409
- ...(next.fields === undefined ? {} : { fields: rebasedAll(held.fields, next.fields) }),
410
- ...(next.sections === undefined
411
- ? {}
412
- : { sections: rebasedAll(held.sections, next.sections) }),
413
- ...(next.preamble === undefined ? {} : { preamble: rebased(held.preamble, next.preamble) }),
414
- ...(next.markdown === undefined ? {} : { markdown: rebased(held.markdown, next.markdown) }),
415
- },
416
- };
417
- }
418
495
  export function withdrawnDrafts(drafts, changes) {
419
496
  return drafts.flatMap((draft) => {
420
497
  const file = draft.parts.file;
@@ -0,0 +1,24 @@
1
+ import { type ChangeSet } from './change-set.js';
2
+ import { type VisibleLayer } from './replica.js';
3
+ import { type RoomDraft, type RoomDraftWrite } from './room-draft.js';
4
+ import type { Runtime } from './runtime.js';
5
+ import type { Store } from './store.js';
6
+ export type RoomDraftSurface = {
7
+ list(): Promise<readonly RoomDraft[]>;
8
+ read(room: string, path: string): Promise<RoomDraft | null>;
9
+ write(room: string, path: string, revision: string | null, parts: unknown, next?: string): Promise<RoomDraftWrite>;
10
+ discard(room: string, path: string, revision: string): Promise<RoomDraftWrite>;
11
+ };
12
+ export type PresentationSurface = {
13
+ read(app: string): Promise<unknown>;
14
+ write(app: string, value: unknown): Promise<void>;
15
+ edit(app: string, members: Readonly<Record<string, unknown>>): Promise<void>;
16
+ };
17
+ export declare function visibleOf(store: Store, locator: string, paths: readonly string[]): Promise<VisibleLayer | undefined>;
18
+ export declare function publishRoomDrafts({ store, socket }: Runtime, waitingOnly: boolean, touched?: ChangeSet['documents'] | null): Promise<void>;
19
+ export declare function emitPresentation({ store, socket }: Runtime, app: string): Promise<void>;
20
+ export declare function roomDraftSurface(runtime: Runtime): RoomDraftSurface;
21
+ export declare function presentationSurface(runtime: Runtime): PresentationSurface;
22
+ export declare function watchRoomDrafts({ store, socket }: Runtime, deliver: (value: unknown) => void): () => void;
23
+ export declare function watchPresentation({ store, socket }: Runtime, app: string, deliver: (value: unknown) => void): () => void;
24
+ //# sourceMappingURL=room-drafts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-drafts.d.ts","sourceRoot":"","sources":["../src/room-drafts.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5D,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAQL,KAAK,SAAS,EAEd,KAAK,cAAc,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,IAAI,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC5D,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9E,CAAC;AAMF,wBAAsB,SAAS,CAC7B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAMnC;AA0CD,wBAAgB,iBAAiB,CAC/B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAC1B,WAAW,EAAE,OAAO,EACpB,OAAO,GAAE,SAAS,CAAC,WAAW,CAAC,GAAG,IAAW,GAC5C,OAAO,CAAC,IAAI,CAAC,CAuBf;AAOD,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUvF;AAoDD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAkDnE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CA8BzE;AAED,wBAAgB,eAAe,CAC7B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,MAAM,IAAI,CAiBZ;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAChC,MAAM,IAAI,CASZ"}