@agentshouse/mdruntime 0.1.0-c3fa75348e547 → 0.1.0-c3faae279d4d2

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 (368) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +385 -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 +150 -81
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +7 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +40 -41
  13. package/dist/binary.d.ts +0 -5
  14. package/dist/binary.d.ts.map +1 -1
  15. package/dist/binary.js +1 -1
  16. package/dist/bootstrap.d.ts +30 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +320 -111
  19. package/dist/cell.d.ts +6 -0
  20. package/dist/cell.d.ts.map +1 -0
  21. package/dist/cell.js +9 -0
  22. package/dist/chain.d.ts +12 -0
  23. package/dist/chain.d.ts.map +1 -0
  24. package/dist/chain.js +64 -0
  25. package/dist/change-set.d.ts +9 -16
  26. package/dist/change-set.d.ts.map +1 -1
  27. package/dist/change-set.js +11 -89
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +14 -3
  31. package/dist/chat-types.d.ts +5 -0
  32. package/dist/chat-types.d.ts.map +1 -0
  33. package/dist/chat-types.js +13 -0
  34. package/dist/client.d.ts +33 -10
  35. package/dist/client.d.ts.map +1 -1
  36. package/dist/client.js +90 -10
  37. package/dist/collection.d.ts +11 -21
  38. package/dist/collection.d.ts.map +1 -1
  39. package/dist/collection.js +39 -291
  40. package/dist/compile.d.ts +16 -0
  41. package/dist/compile.d.ts.map +1 -0
  42. package/dist/compile.js +711 -0
  43. package/dist/connection.d.ts +7 -132
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +100 -3568
  46. package/dist/context.d.ts +2 -0
  47. package/dist/context.d.ts.map +1 -0
  48. package/dist/{chat/context.js → context.js} +1 -4
  49. package/dist/conversation-live.d.ts +136 -0
  50. package/dist/conversation-live.d.ts.map +1 -0
  51. package/dist/conversation-live.js +248 -0
  52. package/dist/conversation-row.d.ts +33 -0
  53. package/dist/conversation-row.d.ts.map +1 -0
  54. package/dist/conversation-row.js +53 -0
  55. package/dist/conversation.d.ts +53 -44
  56. package/dist/conversation.d.ts.map +1 -1
  57. package/dist/conversation.js +938 -715
  58. package/dist/digest.d.ts +7 -0
  59. package/dist/digest.d.ts.map +1 -0
  60. package/dist/digest.js +113 -0
  61. package/dist/discovery.d.ts +10 -0
  62. package/dist/discovery.d.ts.map +1 -0
  63. package/dist/discovery.js +175 -0
  64. package/dist/durability.d.ts +16 -4
  65. package/dist/durability.d.ts.map +1 -1
  66. package/dist/durability.js +5 -0
  67. package/dist/entry.d.ts +5 -2
  68. package/dist/entry.d.ts.map +1 -1
  69. package/dist/entry.js +33 -28
  70. package/dist/figures.d.ts +49 -0
  71. package/dist/figures.d.ts.map +1 -0
  72. package/dist/figures.js +197 -0
  73. package/dist/file.d.ts +2 -19
  74. package/dist/file.d.ts.map +1 -1
  75. package/dist/file.js +7 -122
  76. package/dist/holdings.d.ts +29 -0
  77. package/dist/holdings.d.ts.map +1 -0
  78. package/dist/holdings.js +95 -0
  79. package/dist/host.d.ts +4 -10
  80. package/dist/host.d.ts.map +1 -1
  81. package/dist/host.js +74 -41
  82. package/dist/identity.d.ts +0 -2
  83. package/dist/identity.d.ts.map +1 -1
  84. package/dist/identity.js +0 -6
  85. package/dist/index.d.ts +33 -13
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +12 -2
  88. package/dist/install.d.ts +56 -0
  89. package/dist/install.d.ts.map +1 -0
  90. package/dist/install.js +554 -0
  91. package/dist/job.d.ts +33 -0
  92. package/dist/job.d.ts.map +1 -0
  93. package/dist/job.js +54 -0
  94. package/dist/lifecycle.d.ts +7 -0
  95. package/dist/lifecycle.d.ts.map +1 -0
  96. package/dist/lifecycle.js +268 -0
  97. package/dist/listing.d.ts +53 -0
  98. package/dist/listing.d.ts.map +1 -0
  99. package/dist/listing.js +176 -0
  100. package/dist/live.d.ts +23 -0
  101. package/dist/live.d.ts.map +1 -0
  102. package/dist/live.js +163 -0
  103. package/dist/locks.d.ts +9 -0
  104. package/dist/locks.d.ts.map +1 -0
  105. package/dist/locks.js +61 -0
  106. package/dist/log.d.ts +1 -0
  107. package/dist/log.d.ts.map +1 -1
  108. package/dist/lost.d.ts +5 -0
  109. package/dist/lost.d.ts.map +1 -0
  110. package/dist/lost.js +61 -0
  111. package/dist/media.d.ts +8 -0
  112. package/dist/media.d.ts.map +1 -0
  113. package/dist/media.js +218 -0
  114. package/dist/memory.d.ts +14 -7
  115. package/dist/memory.d.ts.map +1 -1
  116. package/dist/memory.js +241 -107
  117. package/dist/messages.d.ts +52 -0
  118. package/dist/messages.d.ts.map +1 -0
  119. package/dist/messages.js +162 -0
  120. package/dist/model.d.ts +8 -10
  121. package/dist/model.d.ts.map +1 -1
  122. package/dist/model.js +6 -18
  123. package/dist/models.d.ts +14 -0
  124. package/dist/models.d.ts.map +1 -0
  125. package/dist/models.js +195 -0
  126. package/dist/name.d.ts +4 -0
  127. package/dist/name.d.ts.map +1 -0
  128. package/dist/name.js +122 -0
  129. package/dist/observation.d.ts +17 -2
  130. package/dist/observation.d.ts.map +1 -1
  131. package/dist/observation.js +107 -17
  132. package/dist/opened.d.ts +22 -0
  133. package/dist/opened.d.ts.map +1 -0
  134. package/dist/opened.js +107 -0
  135. package/dist/opening.d.ts +4 -0
  136. package/dist/opening.d.ts.map +1 -0
  137. package/dist/opening.js +57 -0
  138. package/dist/outcome.d.ts +49 -8
  139. package/dist/outcome.d.ts.map +1 -1
  140. package/dist/outcome.js +42 -0
  141. package/dist/overlay.d.ts +3 -5
  142. package/dist/overlay.d.ts.map +1 -1
  143. package/dist/overlay.js +98 -172
  144. package/dist/{chat/parts.d.ts → parts.d.ts} +12 -9
  145. package/dist/parts.d.ts.map +1 -0
  146. package/dist/{chat/parts.js → parts.js} +53 -46
  147. package/dist/paths.d.ts +2 -0
  148. package/dist/paths.d.ts.map +1 -1
  149. package/dist/paths.js +26 -0
  150. package/dist/preparation.d.ts +20 -0
  151. package/dist/preparation.d.ts.map +1 -0
  152. package/dist/preparation.js +226 -0
  153. package/dist/queries.d.ts +16 -0
  154. package/dist/queries.d.ts.map +1 -0
  155. package/dist/queries.js +272 -0
  156. package/dist/query.d.ts +25 -191
  157. package/dist/query.d.ts.map +1 -1
  158. package/dist/query.js +3 -470
  159. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  160. package/dist/questions.d.ts.map +1 -0
  161. package/dist/{chat/questions.js → questions.js} +13 -2
  162. package/dist/reach.d.ts +20 -9
  163. package/dist/reach.d.ts.map +1 -1
  164. package/dist/reach.js +287 -99
  165. package/dist/react.d.ts +11 -4
  166. package/dist/react.d.ts.map +1 -1
  167. package/dist/react.js +2 -14
  168. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  169. package/dist/read.d.ts.map +1 -0
  170. package/dist/{chat/read.js → read.js} +4 -0
  171. package/dist/readiness.d.ts +13 -17
  172. package/dist/readiness.d.ts.map +1 -1
  173. package/dist/readiness.js +2 -8
  174. package/dist/reads.d.ts +36 -10
  175. package/dist/reads.d.ts.map +1 -1
  176. package/dist/reads.js +157 -84
  177. package/dist/recovery.d.ts +3 -2
  178. package/dist/recovery.d.ts.map +1 -1
  179. package/dist/recovery.js +43 -8
  180. package/dist/refresh.d.ts +18 -15
  181. package/dist/refresh.d.ts.map +1 -1
  182. package/dist/refresh.js +143 -58
  183. package/dist/refusal.d.ts +5 -0
  184. package/dist/refusal.d.ts.map +1 -0
  185. package/dist/refusal.js +55 -0
  186. package/dist/replica.d.ts +56 -33
  187. package/dist/replica.d.ts.map +1 -1
  188. package/dist/replica.js +332 -190
  189. package/dist/room-draft.d.ts +25 -8
  190. package/dist/room-draft.d.ts.map +1 -1
  191. package/dist/room-draft.js +161 -74
  192. package/dist/room-drafts.d.ts +24 -0
  193. package/dist/room-drafts.d.ts.map +1 -0
  194. package/dist/room-drafts.js +217 -0
  195. package/dist/rows.d.ts +31 -30
  196. package/dist/rows.d.ts.map +1 -1
  197. package/dist/rows.js +59 -118
  198. package/dist/runtime.d.ts +43 -0
  199. package/dist/runtime.d.ts.map +1 -0
  200. package/dist/runtime.js +1 -0
  201. package/dist/save.d.ts +57 -14
  202. package/dist/save.d.ts.map +1 -1
  203. package/dist/save.js +537 -192
  204. package/dist/saves.d.ts +70 -0
  205. package/dist/saves.d.ts.map +1 -0
  206. package/dist/saves.js +1005 -0
  207. package/dist/search.d.ts +12 -82
  208. package/dist/search.d.ts.map +1 -1
  209. package/dist/search.js +10 -207
  210. package/dist/seed.d.ts +11 -2
  211. package/dist/seed.d.ts.map +1 -1
  212. package/dist/seed.js +89 -5
  213. package/dist/shared.d.ts +6 -7
  214. package/dist/shared.d.ts.map +1 -1
  215. package/dist/shared.js +75 -104
  216. package/dist/shown.d.ts +31 -0
  217. package/dist/shown.d.ts.map +1 -0
  218. package/dist/shown.js +292 -0
  219. package/dist/socket/admission.d.ts +7 -0
  220. package/dist/socket/admission.d.ts.map +1 -0
  221. package/dist/socket/admission.js +39 -0
  222. package/dist/socket/answers.d.ts +6 -0
  223. package/dist/socket/answers.d.ts.map +1 -0
  224. package/dist/socket/answers.js +20 -0
  225. package/dist/socket/lanes.d.ts +20 -0
  226. package/dist/socket/lanes.d.ts.map +1 -0
  227. package/dist/socket/lanes.js +77 -0
  228. package/dist/socket/reads.d.ts +10 -0
  229. package/dist/socket/reads.d.ts.map +1 -0
  230. package/dist/socket/reads.js +31 -0
  231. package/dist/socket/rooms.d.ts +44 -0
  232. package/dist/socket/rooms.d.ts.map +1 -0
  233. package/dist/socket/rooms.js +90 -0
  234. package/dist/socket/session.d.ts +38 -0
  235. package/dist/socket/session.d.ts.map +1 -0
  236. package/dist/socket/session.js +23 -0
  237. package/dist/socket.d.ts +70 -0
  238. package/dist/socket.d.ts.map +1 -0
  239. package/dist/socket.js +175 -0
  240. package/dist/source.d.ts +61 -0
  241. package/dist/source.d.ts.map +1 -0
  242. package/dist/source.js +82 -0
  243. package/dist/status.d.ts +4 -5
  244. package/dist/status.d.ts.map +1 -1
  245. package/dist/status.js +3 -7
  246. package/dist/store/fences.d.ts +16 -0
  247. package/dist/store/fences.d.ts.map +1 -0
  248. package/dist/store/fences.js +26 -0
  249. package/dist/store/installs.d.ts +30 -0
  250. package/dist/store/installs.d.ts.map +1 -0
  251. package/dist/store/installs.js +34 -0
  252. package/dist/store/readiness.d.ts +10 -0
  253. package/dist/store/readiness.d.ts.map +1 -0
  254. package/dist/store/readiness.js +52 -0
  255. package/dist/store/records.d.ts +212 -0
  256. package/dist/store/records.d.ts.map +1 -0
  257. package/dist/store/records.js +431 -0
  258. package/dist/store/room-held.d.ts +8 -0
  259. package/dist/store/room-held.d.ts.map +1 -0
  260. package/dist/store/room-held.js +17 -0
  261. package/dist/store/space.d.ts +11 -0
  262. package/dist/store/space.d.ts.map +1 -0
  263. package/dist/store/space.js +41 -0
  264. package/dist/store/watchers.d.ts +17 -0
  265. package/dist/store/watchers.d.ts.map +1 -0
  266. package/dist/store/watchers.js +56 -0
  267. package/dist/store/writes.d.ts +24 -0
  268. package/dist/store/writes.d.ts.map +1 -0
  269. package/dist/store/writes.js +125 -0
  270. package/dist/store.d.ts +106 -158
  271. package/dist/store.d.ts.map +1 -1
  272. package/dist/store.js +136 -734
  273. package/dist/stored.d.ts +156 -0
  274. package/dist/stored.d.ts.map +1 -0
  275. package/dist/stored.js +649 -0
  276. package/dist/surface.d.ts +88 -0
  277. package/dist/surface.d.ts.map +1 -0
  278. package/dist/surface.js +223 -0
  279. package/dist/sync.d.ts +19 -0
  280. package/dist/sync.d.ts.map +1 -0
  281. package/dist/sync.js +532 -0
  282. package/dist/tables.d.ts +416 -0
  283. package/dist/tables.d.ts.map +1 -0
  284. package/dist/tables.js +740 -0
  285. package/dist/tallies.d.ts +18 -0
  286. package/dist/tallies.d.ts.map +1 -0
  287. package/dist/tallies.js +129 -0
  288. package/dist/transfer.d.ts +0 -5
  289. package/dist/transfer.d.ts.map +1 -1
  290. package/dist/turn.d.ts +5 -3
  291. package/dist/turn.d.ts.map +1 -1
  292. package/dist/turn.js +51 -21
  293. package/dist/validation.d.ts +29 -0
  294. package/dist/validation.d.ts.map +1 -0
  295. package/dist/validation.js +104 -0
  296. package/dist/windows.d.ts +11 -0
  297. package/dist/windows.d.ts.map +1 -0
  298. package/dist/windows.js +16 -0
  299. package/dist/wire.d.ts +50 -6
  300. package/dist/wire.d.ts.map +1 -1
  301. package/dist/wire.js +16 -2
  302. package/package.json +18 -19
  303. package/AGENTS.md +0 -299
  304. package/dist/acquisition.d.ts +0 -14
  305. package/dist/acquisition.d.ts.map +0 -1
  306. package/dist/acquisition.js +0 -24
  307. package/dist/chat/acts.d.ts +0 -33
  308. package/dist/chat/acts.d.ts.map +0 -1
  309. package/dist/chat/acts.js +0 -36
  310. package/dist/chat/context.d.ts +0 -3
  311. package/dist/chat/context.d.ts.map +0 -1
  312. package/dist/chat/input.d.ts +0 -9
  313. package/dist/chat/input.d.ts.map +0 -1
  314. package/dist/chat/input.js +0 -99
  315. package/dist/chat/kit.d.ts +0 -61
  316. package/dist/chat/kit.d.ts.map +0 -1
  317. package/dist/chat/kit.js +0 -123
  318. package/dist/chat/lasting.d.ts +0 -6
  319. package/dist/chat/lasting.d.ts.map +0 -1
  320. package/dist/chat/lasting.js +0 -19
  321. package/dist/chat/list.d.ts +0 -27
  322. package/dist/chat/list.d.ts.map +0 -1
  323. package/dist/chat/list.js +0 -63
  324. package/dist/chat/markdown.d.ts +0 -20
  325. package/dist/chat/markdown.d.ts.map +0 -1
  326. package/dist/chat/markdown.js +0 -188
  327. package/dist/chat/message.d.ts +0 -6
  328. package/dist/chat/message.d.ts.map +0 -1
  329. package/dist/chat/message.js +0 -192
  330. package/dist/chat/messages.d.ts +0 -22
  331. package/dist/chat/messages.d.ts.map +0 -1
  332. package/dist/chat/messages.js +0 -155
  333. package/dist/chat/name.d.ts +0 -6
  334. package/dist/chat/name.d.ts.map +0 -1
  335. package/dist/chat/name.js +0 -37
  336. package/dist/chat/opened.d.ts +0 -11
  337. package/dist/chat/opened.d.ts.map +0 -1
  338. package/dist/chat/opened.js +0 -17
  339. package/dist/chat/overlay.d.ts +0 -31
  340. package/dist/chat/overlay.d.ts.map +0 -1
  341. package/dist/chat/overlay.js +0 -97
  342. package/dist/chat/parts.d.ts.map +0 -1
  343. package/dist/chat/process.d.ts +0 -20
  344. package/dist/chat/process.d.ts.map +0 -1
  345. package/dist/chat/process.js +0 -32
  346. package/dist/chat/provider.d.ts +0 -63
  347. package/dist/chat/provider.d.ts.map +0 -1
  348. package/dist/chat/provider.js +0 -629
  349. package/dist/chat/question.d.ts +0 -9
  350. package/dist/chat/question.d.ts.map +0 -1
  351. package/dist/chat/question.js +0 -80
  352. package/dist/chat/questions.d.ts.map +0 -1
  353. package/dist/chat/read.d.ts.map +0 -1
  354. package/dist/chat/ready.d.ts +0 -34
  355. package/dist/chat/ready.d.ts.map +0 -1
  356. package/dist/chat/ready.js +0 -91
  357. package/dist/chat/style.d.ts +0 -4
  358. package/dist/chat/style.d.ts.map +0 -1
  359. package/dist/chat/style.js +0 -302
  360. package/dist/chat.d.ts +0 -14
  361. package/dist/chat.d.ts.map +0 -1
  362. package/dist/chat.js +0 -8
  363. package/dist/fence.d.ts +0 -6
  364. package/dist/fence.d.ts.map +0 -1
  365. package/dist/fence.js +0 -10
  366. package/dist/read-side.d.ts +0 -25
  367. package/dist/read-side.d.ts.map +0 -1
  368. package/dist/read-side.js +0 -642
package/dist/overlay.js CHANGED
@@ -1,7 +1,9 @@
1
- import { apply, parse, serialize } from '@agentshouse/mdmodel';
2
- import { differing, drafted, patched, settled } from './shared.js';
3
- export function acceptedBinaries(files) {
4
- return Object.fromEntries(Object.entries(files).map(([path, file]) => [path, { state: 'accepted', ...file }]));
1
+ import { apply, frontmatterValue, parse, serialize, } from '@agentshouse/mdmodel';
2
+ import { drafted, entriesIn, settling } from './shared.js';
3
+ import { ROW_WEIGHT } from './turn.js';
4
+ export function* acceptedBinaries(files) {
5
+ for (const [path, file] of entriesIn(files))
6
+ yield [path, { state: 'accepted', ...file }];
5
7
  }
6
8
  export function sameBinary(left, right) {
7
9
  if (left === undefined || right === undefined)
@@ -11,7 +13,7 @@ export function sameBinary(left, right) {
11
13
  left.mediaType === right.mediaType &&
12
14
  left.sha256 === right.sha256 &&
13
15
  (left.state === 'accepted'
14
- ? right.state === 'accepted' && left.fileRef === right.fileRef
16
+ ? right.state === 'accepted'
15
17
  : right.state === 'pending' && left.localId === right.localId));
16
18
  }
17
19
  export function sameChange(left, right) {
@@ -23,10 +25,13 @@ export function sameChange(left, right) {
23
25
  left.author?.name === right.author?.name);
24
26
  }
25
27
  const EMPTY_FRONTMATTER = '---\n---\n';
28
+ function isPart(change) {
29
+ return change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble';
30
+ }
26
31
  function at(path, name) {
27
32
  return `${path} ${name}`;
28
33
  }
29
- function priorsOf(preconditions) {
34
+ function* priorsOf(preconditions) {
30
35
  const fields = new Map();
31
36
  const sections = new Map();
32
37
  const preambles = new Map();
@@ -40,6 +45,7 @@ function priorsOf(preconditions) {
40
45
  if (precondition.kind === 'preamble') {
41
46
  preambles.set(precondition.path, precondition.value);
42
47
  }
48
+ yield ROW_WEIGHT;
43
49
  }
44
50
  return {
45
51
  field: (path, name) => fields.get(at(path, name)),
@@ -55,51 +61,50 @@ function compose(fields, sections) {
55
61
  const opened = parse(skeleton);
56
62
  if (!opened.ok)
57
63
  return skeleton;
58
- let document = opened.document;
59
- for (const [name, value] of Object.entries(fields)) {
60
- const next = apply(document, { kind: 'field', name, value, prior: undefined });
61
- if (next.outcome === 'applied')
62
- document = next.document;
63
- }
64
- return serialize(document);
64
+ const next = apply(opened.document, Object.entries(fields).flatMap(([name, value]) => frontmatterValue(value) ? [{ kind: 'field', name, value, prior: undefined }] : []));
65
+ return serialize(next.outcome === 'applied' ? next.document : opened.document);
65
66
  }
66
- function edited(document, change, priors) {
67
- if (change.kind === 'field') {
68
- return apply(document, {
67
+ function edited(change, priors) {
68
+ if (change.kind === 'field')
69
+ return {
69
70
  kind: 'field',
70
71
  name: change.name,
71
72
  value: change.value,
72
73
  prior: priors.field(change.path, change.name),
73
- });
74
- }
75
- if (change.kind === 'preamble') {
76
- return apply(document, {
77
- kind: 'preamble',
78
- value: change.value,
79
- prior: priors.preamble(change.path),
80
- });
81
- }
82
- if (change.kind !== 'section')
83
- return null;
84
- return apply(document, {
74
+ };
75
+ if (change.kind === 'preamble')
76
+ return { kind: 'preamble', value: change.value, prior: priors.preamble(change.path) };
77
+ return {
85
78
  kind: 'section',
86
79
  name: change.name,
87
80
  value: change.value,
88
81
  prior: priors.section(change.path, change.name),
89
- });
82
+ };
90
83
  }
91
- function edit(staged, change, priors) {
92
- const text = staged.documents[change.path];
84
+ function edit(staged, changes, priors) {
85
+ const path = changes[0].path;
86
+ delete staged.revisions[path];
87
+ const text = staged.documents[path];
93
88
  if (text === undefined)
94
- return false;
95
- const parsed = parse(text, change.path);
89
+ return changes.length;
90
+ const parsed = parse(text, path);
96
91
  if (!parsed.ok)
97
- return false;
98
- const next = edited(parsed.document, change, priors);
99
- if (next?.outcome !== 'applied')
100
- return false;
101
- staged.documents[change.path] = serialize(next.document);
102
- return true;
92
+ return changes.length;
93
+ const wanted = changes.map((change) => edited(change, priors));
94
+ const first = apply(parsed.document, wanted);
95
+ if (first.outcome === 'refuse')
96
+ return changes.length;
97
+ if (first.outcome === 'applied') {
98
+ staged.documents[path] = serialize(first.document);
99
+ return 0;
100
+ }
101
+ const stale = new Set(first.stale);
102
+ const kept = wanted.filter((_, at) => !stale.has(at));
103
+ const rest = apply(parsed.document, kept);
104
+ if (rest.outcome !== 'applied')
105
+ return changes.length;
106
+ staged.documents[path] = serialize(rest.document);
107
+ return first.stale.length;
103
108
  }
104
109
  function relocate(staged, from, to) {
105
110
  const text = staged.documents[from];
@@ -120,16 +125,21 @@ function relocate(staged, from, to) {
120
125
  function moveHead(heads, from, to) {
121
126
  const revision = heads.revisions[from];
122
127
  const fileId = heads.fileIds[from];
128
+ const created = heads.created[from];
123
129
  const change = heads.changes[from];
124
130
  delete heads.revisions[from];
125
131
  delete heads.fileIds[from];
132
+ delete heads.created[from];
126
133
  delete heads.changes[from];
127
134
  delete heads.fileIds[to];
135
+ delete heads.created[to];
128
136
  delete heads.changes[to];
129
137
  if (revision !== undefined)
130
138
  heads.revisions[to] = revision;
131
139
  if (fileId !== undefined)
132
140
  heads.fileIds[to] = fileId;
141
+ if (created !== undefined)
142
+ heads.created[to] = created;
133
143
  if (change !== undefined)
134
144
  heads.changes[to] = change;
135
145
  }
@@ -137,18 +147,16 @@ function erase(staged, path) {
137
147
  delete staged.documents[path];
138
148
  delete staged.revisions[path];
139
149
  delete staged.fileIds[path];
150
+ delete staged.created[path];
140
151
  delete staged.changes[path];
141
152
  delete staged.binaries[path];
142
153
  }
143
- function stage(staged, change, priors) {
144
- if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
145
- delete staged.revisions[change.path];
146
- return edit(staged, change, priors);
147
- }
154
+ function stage(staged, change) {
148
155
  if (change.kind === 'create') {
149
156
  staged.documents[change.path] =
150
157
  'content' in change ? change.content : compose(change.fields, change.sections);
151
158
  delete staged.fileIds[change.path];
159
+ delete staged.created[change.path];
152
160
  delete staged.changes[change.path];
153
161
  return true;
154
162
  }
@@ -176,149 +184,67 @@ function stage(staged, change, priors) {
176
184
  if (change.kind === 'move') {
177
185
  return relocate(staged, change.path, change.to);
178
186
  }
187
+ if (change.kind === 'arrival') {
188
+ erase(staged, change.path);
189
+ if ('content' in change)
190
+ staged.documents[change.path] = change.content;
191
+ else
192
+ staged.binaries[change.path] = { state: 'accepted', ...change.binary };
193
+ arrive(staged, change);
194
+ return true;
195
+ }
179
196
  erase(staged, change.path);
180
197
  return true;
181
198
  }
182
- export function overlay(base, queue, unapplied) {
199
+ function arrive(heads, change) {
200
+ if (change.revision !== undefined)
201
+ heads.revisions[change.path] = change.revision;
202
+ if (change.fileId !== undefined)
203
+ heads.fileIds[change.path] = change.fileId;
204
+ if (change.created !== undefined)
205
+ heads.created[change.path] = change.created;
206
+ if (change.change !== undefined)
207
+ heads.changes[change.path] = change.change;
208
+ }
209
+ export function* overlaying(base, queue, unapplied) {
183
210
  const staged = {
184
211
  documents: drafted(base.documents),
185
212
  binaries: drafted(base.binaries),
186
213
  revisions: drafted(base.revisions),
187
214
  fileIds: drafted(base.fileIds),
215
+ created: drafted(base.created),
188
216
  changes: drafted(base.changes),
189
217
  };
190
218
  for (const batch of queue) {
191
- const priors = priorsOf(batch.preconditions);
192
- for (const change of batch.changes) {
193
- if (!stage(staged, change, priors))
194
- unapplied?.();
195
- }
196
- }
197
- return {
198
- documents: settled(staged.documents),
199
- binaries: settled(staged.binaries),
200
- revisions: settled(staged.revisions),
201
- fileIds: settled(staged.fileIds),
202
- changes: settled(staged.changes),
203
- };
204
- }
205
- function pathsOf(batch) {
206
- return batch.changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]);
207
- }
208
- export function sameLayerText(left, right) {
209
- return (differing(left.documents, right.documents).size === 0 &&
210
- differing(left.binaries, right.binaries, sameBinary).size === 0);
211
- }
212
- export function changedPaths(left, right) {
213
- return new Set([
214
- ...differing(left.documents, right.documents),
215
- ...differing(left.revisions, right.revisions),
216
- ...differing(left.fileIds, right.fileIds),
217
- ...differing(left.changes, right.changes, sameChange),
218
- ...differing(left.binaries, right.binaries, sameBinary),
219
- ]);
220
- }
221
- function replayHeads(base, queue) {
222
- const heads = {
223
- revisions: drafted(base.revisions),
224
- fileIds: drafted(base.fileIds),
225
- changes: drafted(base.changes),
226
- };
227
- for (const batch of queue) {
228
- for (const change of batch.changes) {
229
- if (change.kind === 'remove') {
230
- delete heads.revisions[change.path];
231
- delete heads.fileIds[change.path];
232
- delete heads.changes[change.path];
233
- }
234
- else if (change.kind === 'create') {
235
- delete heads.fileIds[change.path];
236
- delete heads.changes[change.path];
237
- }
238
- else if (change.kind === 'replace' ||
239
- change.kind === 'field' ||
240
- change.kind === 'section' ||
241
- change.kind === 'preamble') {
242
- delete heads.revisions[change.path];
243
- }
244
- else if (change.kind === 'binary') {
245
- delete heads.revisions[change.path];
246
- delete heads.changes[change.path];
247
- }
248
- else if (change.kind === 'move') {
249
- moveHead(heads, change.path, change.to);
250
- }
251
- }
252
- }
253
- return {
254
- revisions: settled(heads.revisions),
255
- fileIds: settled(heads.fileIds),
256
- changes: settled(heads.changes),
257
- };
258
- }
259
- export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
260
- const before = previousQueue.map((batch) => JSON.stringify(batch));
261
- const after = queue.map((batch) => JSON.stringify(batch));
262
- if (before.length === after.length &&
263
- before.every((id, index) => id === after[index]) &&
264
- sameLayerText(base, previousBase)) {
265
- return {
266
- documents: previousVisible.documents,
267
- binaries: previousVisible.binaries,
268
- ...replayHeads(base, queue),
269
- };
270
- }
271
- const affected = new Set(changedPaths(base, previousBase));
272
- const oldIds = new Set(before);
273
- const newIds = new Set(after);
274
- for (const batch of previousQueue) {
275
- if (!newIds.has(JSON.stringify(batch)))
276
- for (const path of pathsOf(batch))
277
- affected.add(path);
278
- }
279
- for (const batch of queue) {
280
- if (!oldIds.has(JSON.stringify(batch)))
281
- for (const path of pathsOf(batch))
282
- affected.add(path);
283
- }
284
- let expanded = true;
285
- while (expanded) {
286
- expanded = false;
287
- for (const batch of queue) {
288
- const touched = pathsOf(batch);
289
- if (!touched.some((path) => affected.has(path)))
219
+ const priors = yield* priorsOf(batch.preconditions);
220
+ for (let index = 0; index < batch.changes.length; index += 1) {
221
+ const change = batch.changes[index];
222
+ if (!isPart(change)) {
223
+ if (!stage(staged, change))
224
+ unapplied?.();
225
+ yield ROW_WEIGHT;
290
226
  continue;
291
- for (const path of touched) {
292
- if (affected.has(path))
293
- continue;
294
- affected.add(path);
295
- expanded = true;
296
227
  }
228
+ const run = [change];
229
+ while (index + 1 < batch.changes.length) {
230
+ const next = batch.changes[index + 1];
231
+ if (!isPart(next) || next.path !== change.path)
232
+ break;
233
+ run.push(next);
234
+ index += 1;
235
+ }
236
+ const text = staged.documents[change.path] ?? '';
237
+ for (let left = edit(staged, run, priors); left > 0; left -= 1)
238
+ unapplied?.();
239
+ yield ROW_WEIGHT + text.length;
297
240
  }
298
241
  }
299
- const documents = {};
300
- const revisions = {};
301
- const fileIds = {};
302
- const changes = {};
303
- const binaries = {};
304
- for (const path of affected) {
305
- if (base.documents[path] !== undefined)
306
- documents[path] = base.documents[path];
307
- if (base.revisions[path] !== undefined)
308
- revisions[path] = base.revisions[path];
309
- if (base.fileIds[path] !== undefined)
310
- fileIds[path] = base.fileIds[path];
311
- if (base.changes[path] !== undefined)
312
- changes[path] = base.changes[path];
313
- if (base.binaries[path] !== undefined)
314
- binaries[path] = base.binaries[path];
315
- }
316
- const staged = overlay({ documents, revisions, fileIds, changes, binaries }, queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))));
317
242
  return {
318
- documents: patched(previousVisible.documents, Object.entries(staged.documents), affected),
319
- revisions: patched(previousVisible.revisions, Object.entries(staged.revisions), affected),
320
- fileIds: patched(previousVisible.fileIds, Object.entries(staged.fileIds), affected),
321
- changes: patched(previousVisible.changes, Object.entries(staged.changes), affected),
322
- binaries: patched(previousVisible.binaries, Object.entries(staged.binaries), affected),
243
+ documents: yield* settling(staged.documents),
244
+ binaries: yield* settling(staged.binaries),
245
+ revisions: yield* settling(staged.revisions),
246
+ fileIds: yield* settling(staged.fileIds),
247
+ created: yield* settling(staged.created),
248
+ changes: yield* settling(staged.changes),
323
249
  };
324
250
  }
@@ -1,4 +1,5 @@
1
- import type { TurnContext } from '../adapter.js';
1
+ import type { RunningSubagent, TurnContext } from './adapter.js';
2
+ import { type JobMarker, type OpenJob } from './job.js';
2
3
  export type PlanStep = {
3
4
  readonly content: string;
4
5
  readonly status: string;
@@ -24,6 +25,7 @@ export type Part = {
24
25
  readonly target: string | null;
25
26
  } | {
26
27
  readonly type: 'image';
28
+ readonly path: string;
27
29
  readonly name: string;
28
30
  readonly mediaType: string;
29
31
  } | {
@@ -36,6 +38,7 @@ export type Part = {
36
38
  };
37
39
  export declare function partsOf(raw: readonly unknown[]): readonly Part[];
38
40
  export declare function contextIn(raw: unknown): TurnContext | null;
41
+ export declare function tokensIn(raw: unknown): number | null;
39
42
  export type Turn = {
40
43
  readonly turn: string;
41
44
  readonly parts: readonly Part[];
@@ -45,13 +48,13 @@ export type ChatWork = {
45
48
  readonly kind: 'job' | 'schedule' | 'subagent';
46
49
  readonly title: string;
47
50
  readonly next: string | null;
51
+ readonly activity: string | null;
48
52
  };
49
- export type Job = {
50
- readonly label: string;
51
- readonly kind: 'started' | 'scheduled' | 'ended';
52
- readonly state: string;
53
- readonly next: string | null;
54
- };
55
- export declare function jobOf(said: string): Job;
56
- export declare function stillRunning(turns: readonly Turn[]): ReadonlyMap<string, readonly ChatWork[]>;
53
+ export declare function counted(count: number): string;
54
+ export declare function runningLine(raw: readonly unknown[]): string | null;
55
+ export declare function jobsOf(markers: readonly JobMarker[], turn: {
56
+ readonly started: string | null;
57
+ readonly parts: readonly unknown[];
58
+ } | null): readonly OpenJob[];
59
+ export declare function stillRunning(turns: readonly Turn[], subagents: readonly RunningSubagent[]): ReadonlyMap<string, readonly ChatWork[]>;
57
60
  //# sourceMappingURL=parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../src/parts.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { list, record, text } from './read.js';
1
+ import { closeLast, markerMoved, openJobs } from './job.js';
2
+ import { excerpt, list, record, text } from './read.js';
2
3
  const MARKERS = ['mode', 'compaction', 'retry', 'model', 'job'];
3
4
  function partOf(raw) {
4
5
  const part = record(raw);
@@ -22,10 +23,11 @@ function partOf(raw) {
22
23
  return command === null ? null : { type: 'message', command, target: text(part, 'target') };
23
24
  }
24
25
  case 'image': {
26
+ const path = text(part, 'file');
25
27
  const name = text(part, 'name');
26
- return name === null
28
+ return path === null || name === null
27
29
  ? null
28
- : { type: 'image', name, mediaType: text(part, 'media_type') ?? '' };
30
+ : { type: 'image', path, name, mediaType: text(part, 'media_type') ?? '' };
29
31
  }
30
32
  case 'marker': {
31
33
  const marker = text(part, 'marker');
@@ -55,65 +57,70 @@ export function contextIn(raw) {
55
57
  ? { used: held.used, window: held.window }
56
58
  : null;
57
59
  }
58
- const NEXT_RUN = 'next run ';
59
- export function jobOf(said) {
60
- const at = said.lastIndexOf(': ');
61
- const label = at === -1 ? said : said.slice(0, at);
62
- const state = at === -1 ? '' : said.slice(at + 2);
63
- if (state === 'running')
64
- return { label, kind: 'started', state, next: null };
65
- if (state === 'scheduled')
66
- return { label, kind: 'scheduled', state, next: null };
67
- return state.startsWith(NEXT_RUN)
68
- ? { label, kind: 'scheduled', state, next: state.slice(NEXT_RUN.length) }
69
- : { label, kind: 'ended', state, next: null };
60
+ const TOKEN_KINDS = ['input', 'output', 'cache_read', 'cache_write'];
61
+ export function tokensIn(raw) {
62
+ const held = record(raw);
63
+ const counts = TOKEN_KINDS.map((kind) => held[kind]);
64
+ return counts.every((count) => typeof count === 'number')
65
+ ? counts.reduce((sum, count) => sum + count, 0)
66
+ : null;
67
+ }
68
+ export function counted(count) {
69
+ return count === 1 ? '1 command' : `${count} commands`;
70
+ }
71
+ export function runningLine(raw) {
72
+ const parts = partsOf(raw);
73
+ const note = [...parts].reverse().find((part) => part.type === 'text' && part.text.trim() !== '');
74
+ if (note?.type === 'text')
75
+ return excerpt(note.text);
76
+ const commands = parts.reduce((sum, part) => (part.type === 'commands' ? sum + part.count : sum), 0);
77
+ return commands === 0 ? null : counted(commands);
70
78
  }
71
- export function stillRunning(turns) {
79
+ export function jobsOf(markers, turn) {
80
+ const running = (turn === null ? [] : partsOf(turn.parts)).flatMap((part) => part.type === 'marker' && part.marker === 'job'
81
+ ? [{ said: part.text, at: turn?.started ?? null }]
82
+ : []);
83
+ return openJobs([...markers, ...running]);
84
+ }
85
+ export function stillRunning(turns, subagents) {
72
86
  const open = [];
73
- const close = (key) => {
74
- const at = open.map((one) => one.key).lastIndexOf(key);
75
- if (at !== -1)
76
- open.splice(at, 1);
77
- };
78
87
  for (const { turn, parts, ended } of turns) {
79
88
  for (const part of parts) {
80
89
  if (part.type === 'subagent') {
81
90
  const key = `subagent\u0000${part.description}`;
82
91
  if (part.done)
83
- close(key);
92
+ closeLast(open, key);
84
93
  else if (ended) {
85
- open.push({ turn, key, work: { kind: 'subagent', title: part.description, next: null } });
86
- }
87
- continue;
88
- }
89
- if (part.type !== 'marker' || part.marker !== 'job')
90
- continue;
91
- const job = jobOf(part.text);
92
- const started = `job\u0000${job.label}`;
93
- const schedule = `schedule\u0000${job.label}`;
94
- if (job.kind === 'scheduled') {
95
- close(schedule);
96
- if (ended) {
97
94
  open.push({
98
95
  turn,
99
- key: schedule,
100
- work: { kind: 'schedule', title: job.label, next: job.next },
96
+ key,
97
+ work: { kind: 'subagent', title: part.description, next: null, activity: null },
101
98
  });
102
99
  }
100
+ continue;
103
101
  }
104
- else if (job.kind === 'started') {
105
- if (ended) {
106
- open.push({ turn, key: started, work: { kind: 'job', title: job.label, next: null } });
102
+ if (part.type !== 'marker' || part.marker !== 'job')
103
+ continue;
104
+ markerMoved(open, part.text, (job, key) => ended
105
+ ? {
106
+ turn,
107
+ key,
108
+ work: {
109
+ kind: job.kind === 'started' ? 'job' : 'schedule',
110
+ title: job.label,
111
+ next: job.next,
112
+ activity: null,
113
+ },
107
114
  }
108
- }
109
- else {
110
- close(started);
111
- close(schedule);
112
- }
115
+ : null);
113
116
  }
114
117
  }
118
+ const doing = [...subagents];
115
119
  const under = new Map();
116
- for (const one of open)
117
- under.set(one.turn, [...(under.get(one.turn) ?? []), one.work]);
120
+ for (const { turn, work } of open) {
121
+ const at = work.kind === 'subagent' ? doing.findIndex((one) => one.description === work.title) : -1;
122
+ const shown = at === -1 ? work : { ...work, activity: doing.splice(at, 1)[0].activity };
123
+ under.set(turn, [...(under.get(turn) ?? []), shown]);
124
+ }
118
125
  return under;
119
126
  }
package/dist/paths.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export declare function normalize(path: string): string | null;
2
2
  export declare function beneath(prefix: string, path: string): boolean;
3
3
  export declare function covered(prefixes: readonly string[], path: string): boolean;
4
+ export declare function authoredAt(patterns: readonly string[], path: string): boolean;
5
+ export declare function ancestors(path: string): readonly string[];
4
6
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E;AAwBD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAGzD"}
package/dist/paths.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { isDocumentPath } from '@agentshouse/mdmodel';
1
2
  export function normalize(path) {
2
3
  const parts = [];
3
4
  for (const part of path.split('/')) {
@@ -22,3 +23,28 @@ export function covered(prefixes, path) {
22
23
  return normalized !== null && (normalized === '' || beneath(normalized, path));
23
24
  });
24
25
  }
26
+ function named(pattern, name) {
27
+ const star = pattern.indexOf('*');
28
+ if (star === -1)
29
+ return pattern === name;
30
+ const before = pattern.slice(0, star);
31
+ const after = pattern.slice(star + 1);
32
+ return (name.length > before.length + after.length && name.startsWith(before) && name.endsWith(after));
33
+ }
34
+ function matched(pattern, path) {
35
+ if (pattern === '/')
36
+ return isDocumentPath(path);
37
+ const wanted = pattern.split('/');
38
+ const names = path.split('/');
39
+ const open = wanted.at(-1) === '**';
40
+ const fixed = open ? wanted.slice(0, -1) : wanted;
41
+ return ((open ? names.length > fixed.length : names.length === fixed.length) &&
42
+ fixed.every((one, at) => named(one, names[at])));
43
+ }
44
+ export function authoredAt(patterns, path) {
45
+ return patterns.some((pattern) => matched(pattern, path));
46
+ }
47
+ export function ancestors(path) {
48
+ const parts = path.split('/');
49
+ return parts.slice(1).map((_, at) => parts.slice(0, at + 1).join('/'));
50
+ }
@@ -0,0 +1,20 @@
1
+ import type { PlanReach } from './query.js';
2
+ import { type PortReach } from './reach.js';
3
+ import { type CodeAvailability, type ConnectionAvailability, type Readiness } from './readiness.js';
4
+ import type { Runtime } from './runtime.js';
5
+ export type ReadinessPort = {
6
+ readonly target: string;
7
+ readonly code: CodeAvailability;
8
+ };
9
+ export type ReadinessWatch = {
10
+ readonly port: ReadinessPort;
11
+ readonly reach: PortReach | null;
12
+ readonly deliver: (readiness: Readiness) => void;
13
+ };
14
+ export declare function prepare(runtime: Runtime, locators?: readonly string[]): void;
15
+ export declare function roomsOfReach(reach: PlanReach): ReadonlySet<string>;
16
+ export declare function connectionNow(runtime: Runtime): Promise<ConnectionAvailability>;
17
+ export declare function deliverOwedReadiness(runtime: Runtime, owed: readonly ReadinessWatch[]): Promise<void>;
18
+ export declare function watchReadiness({ store }: Runtime, port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
19
+ export declare function filled(runtime: Runtime): void;
20
+ //# sourceMappingURL=preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../src/preparation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEf,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAClD,CAAC;AAuCF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,QA8BzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAElE;AAmDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrF;AAkFD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,iBAI3F;AAED,wBAAgB,cAAc,CAC5B,EAAE,KAAK,EAAE,EAAE,OAAO,EAClB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GACtC,MAAM,IAAI,CAQZ;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,QAMtC"}