@agentshouse/mdruntime 0.1.0-cd3486bd400ed → 0.1.0-cd35ccee27a19

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 (343) hide show
  1. package/README.md +22 -10
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +308 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +195 -91
  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/attempt.d.ts.map +1 -1
  14. package/dist/attempt.js +14 -1
  15. package/dist/binary.d.ts +18 -0
  16. package/dist/binary.d.ts.map +1 -0
  17. package/dist/binary.js +8 -0
  18. package/dist/bootstrap.d.ts +31 -11
  19. package/dist/bootstrap.d.ts.map +1 -1
  20. package/dist/bootstrap.js +311 -92
  21. package/dist/cell.d.ts +6 -0
  22. package/dist/cell.d.ts.map +1 -0
  23. package/dist/cell.js +9 -0
  24. package/dist/chain.d.ts +12 -0
  25. package/dist/chain.d.ts.map +1 -0
  26. package/dist/chain.js +64 -0
  27. package/dist/change-set.d.ts +13 -14
  28. package/dist/change-set.d.ts.map +1 -1
  29. package/dist/change-set.js +17 -62
  30. package/dist/change.d.ts +42 -0
  31. package/dist/change.d.ts.map +1 -1
  32. package/dist/change.js +36 -0
  33. package/dist/chat-types.d.ts +5 -0
  34. package/dist/chat-types.d.ts.map +1 -0
  35. package/dist/chat-types.js +13 -0
  36. package/dist/client.d.ts +49 -21
  37. package/dist/client.d.ts.map +1 -1
  38. package/dist/client.js +131 -17
  39. package/dist/collection.d.ts +31 -9
  40. package/dist/collection.d.ts.map +1 -1
  41. package/dist/collection.js +49 -80
  42. package/dist/compile.d.ts +16 -0
  43. package/dist/compile.d.ts.map +1 -0
  44. package/dist/compile.js +711 -0
  45. package/dist/connection.d.ts +8 -111
  46. package/dist/connection.d.ts.map +1 -1
  47. package/dist/connection.js +107 -2218
  48. package/dist/context.d.ts +2 -0
  49. package/dist/context.d.ts.map +1 -0
  50. package/dist/context.js +7 -0
  51. package/dist/conversation-live.d.ts +136 -0
  52. package/dist/conversation-live.d.ts.map +1 -0
  53. package/dist/conversation-live.js +249 -0
  54. package/dist/conversation-row.d.ts +33 -0
  55. package/dist/conversation-row.d.ts.map +1 -0
  56. package/dist/conversation-row.js +53 -0
  57. package/dist/conversation.d.ts +71 -42
  58. package/dist/conversation.d.ts.map +1 -1
  59. package/dist/conversation.js +1068 -586
  60. package/dist/declaration.d.ts +10 -0
  61. package/dist/declaration.d.ts.map +1 -0
  62. package/dist/declaration.js +24 -0
  63. package/dist/digest.d.ts +7 -0
  64. package/dist/digest.d.ts.map +1 -0
  65. package/dist/digest.js +113 -0
  66. package/dist/discovery.d.ts +10 -0
  67. package/dist/discovery.d.ts.map +1 -0
  68. package/dist/discovery.js +148 -0
  69. package/dist/durability.d.ts +19 -1
  70. package/dist/durability.d.ts.map +1 -1
  71. package/dist/durability.js +5 -0
  72. package/dist/entry.d.ts +20 -0
  73. package/dist/entry.d.ts.map +1 -0
  74. package/dist/entry.js +161 -0
  75. package/dist/expectation.d.ts +4 -2
  76. package/dist/expectation.d.ts.map +1 -1
  77. package/dist/expectation.js +33 -11
  78. package/dist/failure.d.ts +1 -0
  79. package/dist/failure.d.ts.map +1 -1
  80. package/dist/failure.js +3 -0
  81. package/dist/figures.d.ts +49 -0
  82. package/dist/figures.d.ts.map +1 -0
  83. package/dist/figures.js +197 -0
  84. package/dist/file.d.ts +2 -19
  85. package/dist/file.d.ts.map +1 -1
  86. package/dist/file.js +7 -122
  87. package/dist/holdings.d.ts +29 -0
  88. package/dist/holdings.d.ts.map +1 -0
  89. package/dist/holdings.js +95 -0
  90. package/dist/host.d.ts +28 -4
  91. package/dist/host.d.ts.map +1 -1
  92. package/dist/host.js +163 -19
  93. package/dist/identity.d.ts +1 -0
  94. package/dist/identity.d.ts.map +1 -1
  95. package/dist/identity.js +3 -0
  96. package/dist/index.d.ts +37 -10
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +15 -0
  99. package/dist/install.d.ts +54 -0
  100. package/dist/install.d.ts.map +1 -0
  101. package/dist/install.js +538 -0
  102. package/dist/lifecycle.d.ts +7 -0
  103. package/dist/lifecycle.d.ts.map +1 -0
  104. package/dist/lifecycle.js +272 -0
  105. package/dist/listing.d.ts +48 -0
  106. package/dist/listing.d.ts.map +1 -0
  107. package/dist/listing.js +139 -0
  108. package/dist/live.d.ts +23 -0
  109. package/dist/live.d.ts.map +1 -0
  110. package/dist/live.js +165 -0
  111. package/dist/locks.d.ts +7 -0
  112. package/dist/locks.d.ts.map +1 -0
  113. package/dist/locks.js +33 -0
  114. package/dist/log.d.ts +1 -0
  115. package/dist/log.d.ts.map +1 -1
  116. package/dist/lost.d.ts +5 -0
  117. package/dist/lost.d.ts.map +1 -0
  118. package/dist/lost.js +50 -0
  119. package/dist/media.d.ts +8 -0
  120. package/dist/media.d.ts.map +1 -0
  121. package/dist/media.js +218 -0
  122. package/dist/memory.d.ts +24 -8
  123. package/dist/memory.d.ts.map +1 -1
  124. package/dist/memory.js +289 -96
  125. package/dist/messages.d.ts +49 -0
  126. package/dist/messages.d.ts.map +1 -0
  127. package/dist/messages.js +150 -0
  128. package/dist/model.d.ts +11 -12
  129. package/dist/model.d.ts.map +1 -1
  130. package/dist/model.js +7 -15
  131. package/dist/models.d.ts +10 -0
  132. package/dist/models.d.ts.map +1 -0
  133. package/dist/models.js +156 -0
  134. package/dist/name.d.ts +4 -0
  135. package/dist/name.d.ts.map +1 -0
  136. package/dist/name.js +122 -0
  137. package/dist/observation.d.ts +22 -4
  138. package/dist/observation.d.ts.map +1 -1
  139. package/dist/observation.js +127 -26
  140. package/dist/opened.d.ts +22 -0
  141. package/dist/opened.d.ts.map +1 -0
  142. package/dist/opened.js +107 -0
  143. package/dist/opening.d.ts +4 -0
  144. package/dist/opening.d.ts.map +1 -0
  145. package/dist/opening.js +59 -0
  146. package/dist/outcome.d.ts +56 -5
  147. package/dist/outcome.d.ts.map +1 -1
  148. package/dist/outcome.js +49 -0
  149. package/dist/overlay.d.ts +17 -5
  150. package/dist/overlay.d.ts.map +1 -1
  151. package/dist/overlay.js +161 -187
  152. package/dist/page-metadata.d.ts +8 -0
  153. package/dist/page-metadata.d.ts.map +1 -0
  154. package/dist/page-metadata.js +19 -0
  155. package/dist/parts.d.ts +11 -0
  156. package/dist/parts.d.ts.map +1 -0
  157. package/dist/parts.js +21 -0
  158. package/dist/paths.d.ts +2 -0
  159. package/dist/paths.d.ts.map +1 -1
  160. package/dist/paths.js +26 -0
  161. package/dist/preparation.d.ts +20 -0
  162. package/dist/preparation.d.ts.map +1 -0
  163. package/dist/preparation.js +233 -0
  164. package/dist/presence.d.ts +52 -0
  165. package/dist/presence.d.ts.map +1 -0
  166. package/dist/presence.js +220 -0
  167. package/dist/queries.d.ts +16 -0
  168. package/dist/queries.d.ts.map +1 -0
  169. package/dist/queries.js +270 -0
  170. package/dist/query.d.ts +51 -183
  171. package/dist/query.d.ts.map +1 -1
  172. package/dist/query.js +3 -464
  173. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  174. package/dist/questions.d.ts.map +1 -0
  175. package/dist/{chat/questions.js → questions.js} +13 -2
  176. package/dist/queue.d.ts +40 -0
  177. package/dist/queue.d.ts.map +1 -0
  178. package/dist/queue.js +455 -0
  179. package/dist/reach.d.ts +21 -5
  180. package/dist/reach.d.ts.map +1 -1
  181. package/dist/reach.js +313 -72
  182. package/dist/react.d.ts +20 -6
  183. package/dist/react.d.ts.map +1 -1
  184. package/dist/react.js +17 -18
  185. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  186. package/dist/read.d.ts.map +1 -0
  187. package/dist/{chat/read.js → read.js} +4 -0
  188. package/dist/readiness.d.ts +49 -0
  189. package/dist/readiness.d.ts.map +1 -0
  190. package/dist/readiness.js +27 -0
  191. package/dist/reads.d.ts +37 -0
  192. package/dist/reads.d.ts.map +1 -0
  193. package/dist/reads.js +174 -0
  194. package/dist/recovery.d.ts +26 -0
  195. package/dist/recovery.d.ts.map +1 -0
  196. package/dist/recovery.js +232 -0
  197. package/dist/refresh.d.ts +17 -14
  198. package/dist/refresh.d.ts.map +1 -1
  199. package/dist/refresh.js +145 -58
  200. package/dist/refusal.d.ts +5 -0
  201. package/dist/refusal.d.ts.map +1 -0
  202. package/dist/refusal.js +57 -0
  203. package/dist/replica.d.ts +53 -33
  204. package/dist/replica.d.ts.map +1 -1
  205. package/dist/replica.js +348 -166
  206. package/dist/room-draft.d.ts +55 -9
  207. package/dist/room-draft.d.ts.map +1 -1
  208. package/dist/room-draft.js +262 -73
  209. package/dist/room-drafts.d.ts +24 -0
  210. package/dist/room-drafts.d.ts.map +1 -0
  211. package/dist/room-drafts.js +217 -0
  212. package/dist/rows.d.ts +30 -35
  213. package/dist/rows.d.ts.map +1 -1
  214. package/dist/rows.js +60 -126
  215. package/dist/runtime.d.ts +34 -0
  216. package/dist/runtime.d.ts.map +1 -0
  217. package/dist/runtime.js +1 -0
  218. package/dist/save.d.ts +44 -22
  219. package/dist/save.d.ts.map +1 -1
  220. package/dist/save.js +950 -169
  221. package/dist/saves.d.ts +32 -0
  222. package/dist/saves.d.ts.map +1 -0
  223. package/dist/saves.js +413 -0
  224. package/dist/search.d.ts +15 -55
  225. package/dist/search.d.ts.map +1 -1
  226. package/dist/search.js +10 -121
  227. package/dist/seed.d.ts +25 -0
  228. package/dist/seed.d.ts.map +1 -0
  229. package/dist/seed.js +145 -0
  230. package/dist/shared.d.ts +10 -0
  231. package/dist/shared.d.ts.map +1 -0
  232. package/dist/shared.js +339 -0
  233. package/dist/shown.d.ts +32 -0
  234. package/dist/shown.d.ts.map +1 -0
  235. package/dist/shown.js +290 -0
  236. package/dist/socket/admission.d.ts +7 -0
  237. package/dist/socket/admission.d.ts.map +1 -0
  238. package/dist/socket/admission.js +39 -0
  239. package/dist/socket/answers.d.ts +6 -0
  240. package/dist/socket/answers.d.ts.map +1 -0
  241. package/dist/socket/answers.js +20 -0
  242. package/dist/socket/lanes.d.ts +20 -0
  243. package/dist/socket/lanes.d.ts.map +1 -0
  244. package/dist/socket/lanes.js +77 -0
  245. package/dist/socket/reads.d.ts +10 -0
  246. package/dist/socket/reads.d.ts.map +1 -0
  247. package/dist/socket/reads.js +31 -0
  248. package/dist/socket/session.d.ts +38 -0
  249. package/dist/socket/session.d.ts.map +1 -0
  250. package/dist/socket/session.js +23 -0
  251. package/dist/socket.d.ts +67 -0
  252. package/dist/socket.d.ts.map +1 -0
  253. package/dist/socket.js +170 -0
  254. package/dist/source.d.ts +61 -0
  255. package/dist/source.d.ts.map +1 -0
  256. package/dist/source.js +82 -0
  257. package/dist/status.d.ts +5 -2
  258. package/dist/status.d.ts.map +1 -1
  259. package/dist/status.js +3 -7
  260. package/dist/store/installs.d.ts +30 -0
  261. package/dist/store/installs.d.ts.map +1 -0
  262. package/dist/store/installs.js +34 -0
  263. package/dist/store/readiness.d.ts +10 -0
  264. package/dist/store/readiness.d.ts.map +1 -0
  265. package/dist/store/readiness.js +52 -0
  266. package/dist/store/records.d.ts +212 -0
  267. package/dist/store/records.d.ts.map +1 -0
  268. package/dist/store/records.js +430 -0
  269. package/dist/store/room-held.d.ts +8 -0
  270. package/dist/store/room-held.d.ts.map +1 -0
  271. package/dist/store/room-held.js +17 -0
  272. package/dist/store/space.d.ts +11 -0
  273. package/dist/store/space.d.ts.map +1 -0
  274. package/dist/store/space.js +41 -0
  275. package/dist/store/watchers.d.ts +17 -0
  276. package/dist/store/watchers.d.ts.map +1 -0
  277. package/dist/store/watchers.js +56 -0
  278. package/dist/store/writes.d.ts +24 -0
  279. package/dist/store/writes.d.ts.map +1 -0
  280. package/dist/store/writes.js +125 -0
  281. package/dist/store.d.ts +109 -117
  282. package/dist/store.d.ts.map +1 -1
  283. package/dist/store.js +155 -494
  284. package/dist/stored.d.ts +156 -0
  285. package/dist/stored.d.ts.map +1 -0
  286. package/dist/stored.js +649 -0
  287. package/dist/surface.d.ts +88 -0
  288. package/dist/surface.d.ts.map +1 -0
  289. package/dist/surface.js +223 -0
  290. package/dist/sync.d.ts +19 -0
  291. package/dist/sync.d.ts.map +1 -0
  292. package/dist/sync.js +521 -0
  293. package/dist/tables.d.ts +412 -0
  294. package/dist/tables.d.ts.map +1 -0
  295. package/dist/tables.js +737 -0
  296. package/dist/tallies.d.ts +18 -0
  297. package/dist/tallies.d.ts.map +1 -0
  298. package/dist/tallies.js +129 -0
  299. package/dist/transfer.d.ts +0 -5
  300. package/dist/transfer.d.ts.map +1 -1
  301. package/dist/turn.d.ts +9 -0
  302. package/dist/turn.d.ts.map +1 -0
  303. package/dist/turn.js +75 -0
  304. package/dist/validation.d.ts +29 -0
  305. package/dist/validation.d.ts.map +1 -0
  306. package/dist/validation.js +104 -0
  307. package/dist/windows.d.ts +11 -0
  308. package/dist/windows.d.ts.map +1 -0
  309. package/dist/windows.js +16 -0
  310. package/dist/wire.d.ts +220 -34
  311. package/dist/wire.d.ts.map +1 -1
  312. package/dist/wire.js +73 -31
  313. package/package.json +27 -15
  314. package/AGENTS.md +0 -290
  315. package/dist/attachment.d.ts +0 -3
  316. package/dist/attachment.d.ts.map +0 -1
  317. package/dist/attachment.js +0 -8
  318. package/dist/chat/acts.d.ts +0 -34
  319. package/dist/chat/acts.d.ts.map +0 -1
  320. package/dist/chat/acts.js +0 -36
  321. package/dist/chat/messages.d.ts +0 -21
  322. package/dist/chat/messages.d.ts.map +0 -1
  323. package/dist/chat/messages.js +0 -151
  324. package/dist/chat/overlay.d.ts +0 -31
  325. package/dist/chat/overlay.d.ts.map +0 -1
  326. package/dist/chat/overlay.js +0 -97
  327. package/dist/chat/parts.d.ts +0 -57
  328. package/dist/chat/parts.d.ts.map +0 -1
  329. package/dist/chat/parts.js +0 -119
  330. package/dist/chat/process.d.ts +0 -20
  331. package/dist/chat/process.d.ts.map +0 -1
  332. package/dist/chat/process.js +0 -32
  333. package/dist/chat/provider.d.ts +0 -57
  334. package/dist/chat/provider.d.ts.map +0 -1
  335. package/dist/chat/provider.js +0 -637
  336. package/dist/chat/questions.d.ts.map +0 -1
  337. package/dist/chat/read.d.ts.map +0 -1
  338. package/dist/chat.d.ts +0 -7
  339. package/dist/chat.d.ts.map +0 -1
  340. package/dist/chat.js +0 -2
  341. package/dist/read-side.d.ts +0 -18
  342. package/dist/read-side.d.ts.map +0 -1
  343. package/dist/read-side.js +0 -433
package/dist/client.js CHANGED
@@ -1,10 +1,31 @@
1
+ import { shownBy } from './media.js';
2
+ import { pageMetadataBlock } from './page-metadata.js';
1
3
  import { observed } from './observation.js';
2
4
  import { runtimeError } from './failure.js';
3
- import { answer, AUTHORIZATION_ENDED, PORT_CLOSED, } from './wire.js';
5
+ import { AUTHORIZATION_ENDED, PORT_CLOSED, wireAnswer, } from './wire.js';
6
+ // React renders an arrived value in a later task and opens what that render observes as it commits, so this many frames opening nothing mean the page drew what it observes.
7
+ const SETTLED_FRAMES = 2;
8
+ // A browser reads a download's address only after the click that hands it returns, so a copy's address is released a minute later.
9
+ const HANDED_COPY_MS = 60_000;
10
+ const PAGE = /\.html?$/iu;
11
+ const STARTED = { kind: 'started' };
12
+ const BLOCKED = {
13
+ kind: 'blocked',
14
+ code: 'popup-blocked',
15
+ fields: {},
16
+ retryable: true,
17
+ };
18
+ function handed(url, name) {
19
+ const anchor = document.createElement('a');
20
+ anchor.href = url;
21
+ anchor.download = name;
22
+ anchor.click();
23
+ }
4
24
  function refused(refusal) {
5
- return runtimeError(refusal.code, refusal.code, refusal.retryable);
25
+ return runtimeError(refusal.code);
6
26
  }
7
- export function connectMdRuntime(port) {
27
+ const UNBUILT = () => Promise.resolve(null);
28
+ export function connectMdRuntime(port, buildFile = UNBUILT) {
8
29
  let sequence = 0;
9
30
  let refusal = null;
10
31
  let ended = null;
@@ -16,13 +37,13 @@ export function connectMdRuntime(port) {
16
37
  const send = (message) => {
17
38
  port.postMessage(message);
18
39
  };
19
- function begin(id, topic, first) {
40
+ function begin(id, topic, input, first) {
20
41
  const handle = observed(first, () => {
21
42
  observations.delete(id);
22
43
  if (refusal === null)
23
44
  send({ kind: 'stop', id });
24
45
  }, topic === 'query');
25
- observations.set(id, { topic, handle });
46
+ observations.set(id, { topic, input, handle });
26
47
  return handle.observation;
27
48
  }
28
49
  function refuse(reported) {
@@ -34,7 +55,7 @@ export function connectMdRuntime(port) {
34
55
  const failure = refused(reported);
35
56
  for (const [id, waiting] of opening) {
36
57
  if (waiting.topic === 'connection-refusal')
37
- waiting.settle(begin(id, waiting.topic, reported));
58
+ waiting.settle(begin(id, waiting.topic, waiting.input, reported));
38
59
  else
39
60
  waiting.fail(failure);
40
61
  }
@@ -60,7 +81,7 @@ export function connectMdRuntime(port) {
60
81
  drawing?.();
61
82
  }
62
83
  port.addEventListener('message', (event) => {
63
- const message = answer(event.data);
84
+ const message = wireAnswer(event.data);
64
85
  if (message === null)
65
86
  return;
66
87
  if (message.kind === 'refusal') {
@@ -86,7 +107,7 @@ export function connectMdRuntime(port) {
86
107
  waiting.fail(runtimeError(message.code, message.message, message.retryable));
87
108
  }
88
109
  else
89
- waiting.settle(begin(message.id, waiting.topic, message.value));
110
+ waiting.settle(begin(message.id, waiting.topic, waiting.input, message.value));
90
111
  drawing?.();
91
112
  return;
92
113
  }
@@ -122,15 +143,66 @@ export function connectMdRuntime(port) {
122
143
  const id = (sequence += 1);
123
144
  if (refusal !== null) {
124
145
  return topic === 'connection-refusal'
125
- ? Promise.resolve(begin(id, topic, refusal))
146
+ ? Promise.resolve(begin(id, topic, input, refusal))
126
147
  : Promise.reject(refused(refusal));
127
148
  }
128
149
  return new Promise((settle, fail) => {
129
- opening.set(id, { topic, settle, fail });
150
+ opening.set(id, { topic, input, settle, fail });
130
151
  send({ kind: 'observe', id, topic, input });
131
152
  drawing?.();
132
153
  });
133
154
  }
155
+ function streamed(answer) {
156
+ if (answer.kind !== 'binary')
157
+ return answer;
158
+ const { file, byteLength, mediaType } = answer;
159
+ let part = 0;
160
+ let received = 0;
161
+ const stream = new ReadableStream({
162
+ async pull(controller) {
163
+ const bytes = await ask('binaryFile.part', [file, part]);
164
+ if (bytes === null) {
165
+ if (received === byteLength)
166
+ controller.close();
167
+ else
168
+ controller.error(runtimeError('binary-file-absent', 'The file ended early'));
169
+ return;
170
+ }
171
+ part += 1;
172
+ received += bytes.byteLength;
173
+ controller.enqueue(bytes);
174
+ },
175
+ }, { highWaterMark: 0 });
176
+ return { kind: 'binary', stream, byteLength, mediaType };
177
+ }
178
+ async function download(room, path, revision) {
179
+ const tab = PAGE.test(path) ? globalThis.open('', '_blank') : null;
180
+ const linked = await ask('binaryFile.link', [room, path, revision]);
181
+ if (linked.kind === 'link' && PAGE.test(linked.name)) {
182
+ const away = tab ?? globalThis.open('', '_blank');
183
+ if (away === null)
184
+ return BLOCKED;
185
+ away.location.replace(linked.url);
186
+ return STARTED;
187
+ }
188
+ tab?.close();
189
+ if (linked.kind === 'link') {
190
+ handed(linked.url, linked.name);
191
+ return STARTED;
192
+ }
193
+ if (linked.kind !== 'absent')
194
+ return linked;
195
+ const read = streamed(await ask('binaryFile.read', [room, path, revision]));
196
+ if (read.kind !== 'binary')
197
+ return read;
198
+ const copy = await new Response(read.stream, {
199
+ headers: { 'content-type': read.mediaType },
200
+ }).blob();
201
+ const url = URL.createObjectURL(copy);
202
+ handed(url, path.slice(path.lastIndexOf('/') + 1));
203
+ setTimeout(() => URL.revokeObjectURL(url), HANDED_COPY_MS);
204
+ return STARTED;
205
+ }
134
206
  function settled() {
135
207
  if (settling !== null)
136
208
  return settling;
@@ -141,21 +213,28 @@ export function connectMdRuntime(port) {
141
213
  if (opening.size > 0)
142
214
  return;
143
215
  const at = moved;
144
- requestAnimationFrame(() => {
216
+ const waited = (frames) => {
145
217
  requestAnimationFrame(() => {
218
+ if (frames < SETTLED_FRAMES) {
219
+ waited(frames + 1);
220
+ return;
221
+ }
146
222
  if (moved !== at || opening.size > 0)
147
223
  return;
148
224
  drawing = null;
149
225
  resolve();
150
226
  });
151
- });
227
+ };
228
+ waited(1);
152
229
  };
153
230
  drawing = check;
154
231
  check();
155
232
  });
156
233
  return settling;
157
234
  }
158
- return {
235
+ const show = (room, path, revision) => ask('binaryFile.show', [room, path, revision]).then((shown) => streamed(shown));
236
+ return shownBy(show, {
237
+ buildFile,
159
238
  rooms: () => ask('rooms', []),
160
239
  query: ((query) => ask('query', [query])),
161
240
  search: (request) => ask('search', [request]),
@@ -163,36 +242,71 @@ export function connectMdRuntime(port) {
163
242
  roomDraft: {
164
243
  list: () => ask('roomDraft.list', []),
165
244
  read: (room, path) => ask('roomDraft.read', [room, path]),
166
- write: (room, path, revision, parts) => ask('roomDraft.write', [room, path, revision, parts]),
245
+ write: (room, path, revision, parts, next) => ask('roomDraft.write', next === undefined ? [room, path, revision, parts] : [room, path, revision, parts, next]),
167
246
  discard: (room, path, revision) => ask('roomDraft.discard', [room, path, revision]),
168
247
  },
169
248
  save: (room, roomDrafts) => ask('save', [room, roomDrafts]),
249
+ saveParts: (room, parts) => ask('saveParts', [room, parts]),
170
250
  presentation: {
171
251
  read: () => ask('presentation.read', []),
172
252
  write: (value) => ask('presentation.write', [value]),
253
+ edit: (members) => ask('presentation.edit', [members]),
173
254
  },
174
255
  conversation: {
175
256
  list: () => ask('conversation.list', []),
176
257
  read: (conversation, options) => ask('conversation.read', [conversation, options]),
177
258
  create: (input) => ask('conversation.create', [input]),
178
- send: (conversation) => ask('conversation.send', [conversation]),
259
+ send: (conversation, operation, draft) => ask('conversation.send', [conversation, operation, draft]),
179
260
  answer: (conversation, answer) => ask('conversation.answer', [conversation, answer]),
180
261
  interrupt: (conversation) => ask('conversation.interrupt', [conversation]),
181
262
  kill: (conversation) => ask('conversation.kill', [conversation]),
182
- cancel: (conversation, turn) => ask('conversation.cancel', [conversation, turn]),
183
263
  delete: (conversation) => ask('conversation.delete', [conversation]),
264
+ takeOut: (conversation, message, operation) => ask('conversation.takeOut', [conversation, message, operation]),
265
+ decide: (request, decision, operation) => ask('conversation.decide', [request, decision, operation]),
266
+ rename: (conversation, name, operation) => ask('conversation.rename', [conversation, name, operation]),
267
+ option: (conversation, option, value, operation) => ask('conversation.option', [conversation, option, value, operation]),
268
+ retry: (conversation, message, operation) => ask('conversation.retry', [conversation, message, operation]),
269
+ pins: () => ask('conversation.pins', []),
270
+ pin: (figures) => ask('conversation.pin', [figures]),
271
+ openedTurns: () => ask('conversation.openedTurns', []),
272
+ openTurn: (conversation, turn) => ask('conversation.openTurn', [conversation, turn]),
273
+ pageMetadata: async (app, address) => pageMetadataBlock(app, address, [...observations]
274
+ .sort(([left], [right]) => left - right)
275
+ .flatMap(([, { topic, input }]) => (topic === 'query' ? [input[0]] : []))),
184
276
  },
185
277
  chatDraft: {
186
278
  write: (conversation, draft, revision) => ask('chatDraft.write', [conversation, draft, revision]),
279
+ prepend: (conversation, draft) => ask('chatDraft.prepend', [conversation, draft]),
187
280
  discard: (conversation) => ask('chatDraft.discard', [conversation]),
188
281
  },
189
282
  history: (locator, path, query) => ask('history', [locator, path, query]),
283
+ resolve: (room, path, destination) => ask('resolve', [room, path, destination]),
284
+ binaryFile: {
285
+ read: (room, path, revision) => ask('binaryFile.read', [room, path, revision]).then((read) => streamed(read)),
286
+ attach: (room, file) => ask('binaryFile.attach', [room, file]),
287
+ download,
288
+ },
190
289
  call: (name, input) => ask('call', [name, input]),
191
290
  reached: (locator, roomVersion, path) => ask('reached', [locator, roomVersion, path]),
192
291
  log: () => ask('log', []),
193
292
  persistence: () => ask('persistence', []),
293
+ retry: () => ask('retry', []),
294
+ cleanUp: () => ask('cleanUp', []),
295
+ unsent: () => ask('unsent', []),
296
+ reset: () => ask('reset', []),
297
+ readAgain: () => ask('readAgain', []),
194
298
  observe: ((topic, ...input) => watch(topic, input)),
195
299
  reauthorize: () => ask('reauthorize', []),
196
300
  settled,
197
- };
301
+ });
302
+ }
303
+ const turns = new WeakMap();
304
+ export function inTurn(client, work) {
305
+ const turn = (turns.get(client) ?? Promise.resolve()).then(work);
306
+ turns.set(client, turn.then(() => undefined, () => undefined));
307
+ return turn;
198
308
  }
309
+ export { chainedWindows } from './chain.js';
310
+ export { roomDraftRevision } from './identity.js';
311
+ export { defineRoomMedia, ROOM_MEDIA } from './media.js';
312
+ export { unanswered } from './wire.js';
@@ -1,7 +1,7 @@
1
- import { type Document, type Validation } from '@agentshouse/mdmodel';
2
- import type { ModelState } from './model.js';
1
+ import { type DefinitionOf, type Document, type TypedPath } from '@agentshouse/mdmodel';
2
+ import type { ModelState, TypesResult } from './model.js';
3
+ import type { AppTypedSelection } from './listing.js';
3
4
  import type { MdModelIdentity } from './adapter.js';
4
- import type { Refused } from './transfer.js';
5
5
  export declare const MD_MODEL: MdModelIdentity;
6
6
  export type Collection = {
7
7
  text: Readonly<Record<string, string>>;
@@ -14,12 +14,34 @@ export type Composition = {
14
14
  roots: readonly string[];
15
15
  model: ModelState;
16
16
  } | null;
17
+ typedPaths: readonly TypedPath[];
17
18
  };
18
- export declare function governing(composition: Composition, path: string): ModelState;
19
- export declare function collectionOf(text: Readonly<Record<string, string>>, composition: Composition, previous?: Collection): Collection;
20
- export declare function passingDocument(collection: Collection, path: string): Document | undefined;
21
- export declare function documentsOf(collection: Collection): Generator<readonly [string, Document]>;
22
- export declare function unreadable(text: Readonly<Record<string, string>>, previous?: Readonly<Record<string, string>>): Refused | null;
19
+ export type Composed = {
20
+ readonly composition: Composition;
21
+ readonly fingerprint: string;
22
+ };
23
+ export declare function composedOf(composition: Composition): Composed;
24
+ type Selecting<M> = {
25
+ readonly model: M;
26
+ readonly selection: {
27
+ readonly roots: readonly string[];
28
+ readonly model: M;
29
+ } | null;
30
+ };
31
+ export declare function selected(composition: {
32
+ readonly selection: {
33
+ readonly roots: readonly string[];
34
+ } | null;
35
+ }, path: string): boolean;
36
+ export declare function governing<M>(composition: Selecting<M>, path: string): M;
37
+ export declare function definitionsAt(composition: Composition, path: string): DefinitionOf;
38
+ export declare function definitionsIn(room: {
39
+ readonly model: TypesResult;
40
+ readonly typedSelection: AppTypedSelection | null;
41
+ }, path: string, typedPaths: readonly TypedPath[]): DefinitionOf;
42
+ export declare function collectionOf(text: Readonly<Record<string, string>>, composition: Composition): Collection;
43
+ export declare function documentsOf(collection: Collection): Generator<number, Iterable<readonly [string, Document]>, void>;
23
44
  export declare function validRoot(root: unknown): root is string;
24
- export declare function validateCollection(text: Readonly<Record<string, string>>, binaryTargets: readonly string[], composition: Composition): Validation;
45
+ export declare function available(composition: Composition): boolean;
46
+ export {};
25
47
  //# sourceMappingURL=collection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,UAAU,EAEhB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAIhG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE,CAAC;AASF,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI5E;AAID,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,EACxB,QAAQ,CAAC,EAAE,UAAU,GACpB,UAAU,CAsBZ;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAO1F;AAED,wBAAiB,WAAW,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAY3F;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAC1C,OAAO,GAAG,IAAI,CAOhB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAwBD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,WAAW,EAAE,WAAW,GACvB,UAAU,CA0BZ"}
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,SAAS,EAEf,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIpD,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAEhG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,UAAU,EAAE,SAAS,SAAS,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAc3F,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,QAAQ,CAS7D;AAED,KAAK,SAAS,CAAC,CAAC,IAAI;IAClB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;CACrF,CAAC;AAEF,wBAAgB,QAAQ,CACtB,WAAW,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;CAAE,EACjF,IAAI,EAAE,MAAM,GACX,OAAO,CAKT;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,CAIvE;AAYD,wBAAgB,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAIlF;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAAE,EACxF,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,SAAS,SAAS,EAAE,GAC/B,YAAY,CAQd;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,UAAU,CAcZ;AAED,wBAAiB,WAAW,CAC1B,UAAU,EAAE,UAAU,GACrB,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAQhE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE3D"}
@@ -1,8 +1,30 @@
1
- import { parse, validate, VERSION, } from '@agentshouse/mdmodel';
1
+ import { definitionAt, parse, VERSION, } from '@agentshouse/mdmodel';
2
2
  import { beneath, normalize } from './paths.js';
3
+ import { hashed } from './observation.js';
4
+ import { sortedKeys } from './shared.js';
3
5
  export const MD_MODEL = { identity: '@agentshouse/mdmodel', version: VERSION };
4
- const NO_TYPES = { types: {} };
5
- function selected(composition, path) {
6
+ const typesPrinted = new WeakMap();
7
+ function typesPrint(model) {
8
+ if (model.status === 'unavailable')
9
+ return '';
10
+ let print = typesPrinted.get(model.types);
11
+ if (print === undefined) {
12
+ print = hashed(JSON.stringify(model.types)).toString(36);
13
+ typesPrinted.set(model.types, print);
14
+ }
15
+ return print;
16
+ }
17
+ export function composedOf(composition) {
18
+ const { model, selection } = composition;
19
+ return {
20
+ composition,
21
+ fingerprint: JSON.stringify([
22
+ typesPrint(model),
23
+ selection === null ? null : [selection.roots, typesPrint(selection.model)],
24
+ ]),
25
+ };
26
+ }
27
+ export function selected(composition, path) {
6
28
  return (composition.selection !== null &&
7
29
  composition.selection.roots.some((root) => beneath(root, path)));
8
30
  }
@@ -11,99 +33,46 @@ export function governing(composition, path) {
11
33
  ? composition.selection.model
12
34
  : composition.model;
13
35
  }
14
- const parsedIn = new WeakMap();
15
- export function collectionOf(text, composition, previous) {
36
+ function definitionsUnder(composition, path, typedPaths, typesOf) {
37
+ const types = typesOf(governing(composition, path));
38
+ return types === null ? () => undefined : definitionAt({ types }, path, typedPaths);
39
+ }
40
+ export function definitionsAt(composition, path) {
41
+ return definitionsUnder(composition, path, composition.typedPaths, (model) => model.status === 'unavailable' ? null : model.types);
42
+ }
43
+ export function definitionsIn(room, path, typedPaths) {
44
+ return definitionsUnder({ model: room.model, selection: room.typedSelection }, path, typedPaths, ({ types }) => types === null ? null : Object.fromEntries(types.map((type) => [type.name, type])));
45
+ }
46
+ export function collectionOf(text, composition) {
16
47
  const parsed = new Map();
17
- if (previous !== undefined) {
18
- for (const [path, held] of parsedIn.get(previous) ?? []) {
19
- if (previous.text[path] === text[path])
20
- parsed.set(path, held);
21
- }
22
- }
23
- const collection = {
48
+ return {
24
49
  text,
25
50
  composition,
26
51
  document(path) {
27
- const held = parsed.get(path);
28
- if (held !== undefined)
29
- return held ?? undefined;
52
+ if (parsed.has(path))
53
+ return parsed.get(path) ?? undefined;
30
54
  const content = text[path];
31
55
  if (content === undefined)
32
56
  return undefined;
33
- const read = parse(content, path);
57
+ const read = parse(content, path, definitionsAt(composition, path));
34
58
  parsed.set(path, read.ok ? read.document : null);
35
59
  return read.ok ? read.document : undefined;
36
60
  },
37
61
  };
38
- parsedIn.set(collection, parsed);
39
- return collection;
40
- }
41
- export function passingDocument(collection, path) {
42
- const held = parsedIn.get(collection)?.get(path);
43
- if (held !== undefined)
44
- return held ?? undefined;
45
- const content = collection.text[path];
46
- if (content === undefined)
47
- return undefined;
48
- const read = parse(content, path);
49
- return read.ok ? read.document : undefined;
50
62
  }
51
63
  export function* documentsOf(collection) {
52
- const parsed = parsedIn.get(collection);
53
- for (const path of Object.keys(collection.text).sort()) {
54
- const held = parsed?.get(path);
55
- if (held === null)
56
- continue;
57
- if (held !== undefined) {
58
- yield [path, held];
59
- continue;
64
+ const paths = yield* sortedKeys(collection.text);
65
+ return (function* () {
66
+ for (const path of paths) {
67
+ const document = collection.document(path);
68
+ if (document !== undefined)
69
+ yield [path, document];
60
70
  }
61
- const read = parse(collection.text[path], path);
62
- if (read.ok)
63
- yield [path, read.document];
64
- }
65
- }
66
- export function unreadable(text, previous) {
67
- for (const path of Object.keys(text).sort()) {
68
- if (previous?.[path] === text[path])
69
- continue;
70
- const read = parse(text[path], path);
71
- if (!read.ok)
72
- return { kind: 'refused', refusal: read.refusal };
73
- }
74
- return null;
71
+ })();
75
72
  }
76
73
  export function validRoot(root) {
77
74
  return typeof root === 'string' && normalize(root) === root;
78
75
  }
79
- function validateAgainst(documents, binaryTargets, model) {
80
- if (model.status === 'unavailable') {
81
- const typed = Object.entries(documents).find(([, content]) => {
82
- const parsed = parse(content);
83
- return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';
84
- });
85
- if (typed !== undefined)
86
- return { verdict: 'refuse', rule: 'model-unavailable', file: typed[0] };
87
- }
88
- return validate(documents, { binaryTargets }, model.status === 'unavailable' ? NO_TYPES : { types: model.types });
89
- }
90
- export function validateCollection(text, binaryTargets, composition) {
91
- const collection = {};
92
- const selection = {};
93
- for (const [path, content] of Object.entries(text)) {
94
- if (selected(composition, path))
95
- selection[path] = content;
96
- else
97
- collection[path] = content;
98
- }
99
- const verdicts = [
100
- validateAgainst(collection, binaryTargets.filter((path) => !selected(composition, path)), composition.model),
101
- ];
102
- if (composition.selection !== null) {
103
- verdicts.push(validateAgainst(selection, binaryTargets.filter((path) => selected(composition, path)), composition.selection.model));
104
- }
105
- const refusals = verdicts.filter((verdict) => verdict.verdict === 'refuse');
106
- if (refusals.length === 0)
107
- return verdicts[0];
108
- return refusals.find((refusal) => refusal.rule !== 'model-unavailable') ?? refusals[0];
76
+ export function available(composition) {
77
+ return composition.model.status !== 'unavailable';
109
78
  }
@@ -0,0 +1,16 @@
1
+ import { sql } from '@agentshouse/mdmodel';
2
+ import type { Plan, QueryRows } from './query.js';
3
+ import type { Connection } from './tables.js';
4
+ export type QueryRoom = {
5
+ readonly locator: string;
6
+ readonly key: number;
7
+ };
8
+ type Fragment = sql.Fragment;
9
+ export declare const VISIBLE: (alias: string) => string;
10
+ export declare function within(alias: string, path: string): Fragment;
11
+ export type QueryAnswer = QueryRows & {
12
+ readonly more?: string;
13
+ };
14
+ export declare function answerQuery(connection: Connection, plan: Plan, rooms: readonly QueryRoom[], budget?: number | null): QueryAnswer;
15
+ export {};
16
+ //# sourceMappingURL=compile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,GAAG,EAOJ,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,IAAI,EAAuC,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAG1D,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,KAAK,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;AAI7B,eAAO,MAAM,OAAO,UAAW,MAAM,KAAG,MACkC,CAAC;AAa3E,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAM5D;AA2cD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA6ZjE,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,GAAE,MAAM,GAAG,IAAW,GAC3B,WAAW,CAUb"}