@agentshouse/mdruntime 0.1.0-cee9c8aa4cd86 → 0.1.0-cef76ea952695

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 (376) hide show
  1. package/README.md +19 -17
  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 +111 -109
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +5 -11
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +36 -47
  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 +22 -10
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +303 -123
  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 +2 -1
  23. package/dist/chain.d.ts.map +1 -1
  24. package/dist/change.d.ts +1 -0
  25. package/dist/change.d.ts.map +1 -1
  26. package/dist/change.js +4 -2
  27. package/dist/chat-types.d.ts +5 -0
  28. package/dist/chat-types.d.ts.map +1 -0
  29. package/dist/chat-types.js +13 -0
  30. package/dist/client.d.ts +30 -14
  31. package/dist/client.d.ts.map +1 -1
  32. package/dist/client.js +61 -10
  33. package/dist/collection.d.ts +7 -4
  34. package/dist/collection.d.ts.map +1 -1
  35. package/dist/collection.js +24 -19
  36. package/dist/compile.d.ts +6 -6
  37. package/dist/compile.d.ts.map +1 -1
  38. package/dist/compile.js +290 -297
  39. package/dist/connection.d.ts +6 -142
  40. package/dist/connection.d.ts.map +1 -1
  41. package/dist/connection.js +105 -4827
  42. package/dist/context.d.ts +2 -0
  43. package/dist/context.d.ts.map +1 -0
  44. package/dist/{chat/context.js → context.js} +1 -4
  45. package/dist/conversation-live.d.ts +135 -0
  46. package/dist/conversation-live.d.ts.map +1 -0
  47. package/dist/conversation-live.js +247 -0
  48. package/dist/conversation-row.d.ts +33 -0
  49. package/dist/conversation-row.d.ts.map +1 -0
  50. package/dist/conversation-row.js +53 -0
  51. package/dist/conversation.d.ts +42 -46
  52. package/dist/conversation.d.ts.map +1 -1
  53. package/dist/conversation.js +901 -815
  54. package/dist/discovery.d.ts +10 -0
  55. package/dist/discovery.d.ts.map +1 -0
  56. package/dist/discovery.js +175 -0
  57. package/dist/durability.d.ts +15 -4
  58. package/dist/durability.d.ts.map +1 -1
  59. package/dist/durability.js +5 -0
  60. package/dist/entry.d.ts +3 -2
  61. package/dist/entry.d.ts.map +1 -1
  62. package/dist/entry.js +18 -8
  63. package/dist/expectation.d.ts +4 -2
  64. package/dist/expectation.d.ts.map +1 -1
  65. package/dist/expectation.js +33 -11
  66. package/dist/failure.d.ts +1 -0
  67. package/dist/failure.d.ts.map +1 -1
  68. package/dist/failure.js +3 -0
  69. package/dist/figures.d.ts +49 -0
  70. package/dist/figures.d.ts.map +1 -0
  71. package/dist/figures.js +197 -0
  72. package/dist/file.d.ts +2 -11
  73. package/dist/file.d.ts.map +1 -1
  74. package/dist/file.js +6 -4
  75. package/dist/holdings.d.ts +29 -0
  76. package/dist/holdings.d.ts.map +1 -0
  77. package/dist/holdings.js +95 -0
  78. package/dist/host.d.ts +4 -6
  79. package/dist/host.d.ts.map +1 -1
  80. package/dist/host.js +59 -38
  81. package/dist/identity.d.ts +0 -1
  82. package/dist/identity.d.ts.map +1 -1
  83. package/dist/identity.js +0 -3
  84. package/dist/index.d.ts +30 -13
  85. package/dist/index.d.ts.map +1 -1
  86. package/dist/index.js +10 -3
  87. package/dist/install.d.ts +56 -0
  88. package/dist/install.d.ts.map +1 -0
  89. package/dist/install.js +556 -0
  90. package/dist/job.d.ts +5 -0
  91. package/dist/job.d.ts.map +1 -0
  92. package/dist/job.js +7 -0
  93. package/dist/lifecycle.d.ts +7 -0
  94. package/dist/lifecycle.d.ts.map +1 -0
  95. package/dist/lifecycle.js +270 -0
  96. package/dist/listing.d.ts +53 -0
  97. package/dist/listing.d.ts.map +1 -0
  98. package/dist/listing.js +176 -0
  99. package/dist/live.d.ts +5 -4
  100. package/dist/live.d.ts.map +1 -1
  101. package/dist/live.js +63 -21
  102. package/dist/locks.d.ts +9 -0
  103. package/dist/locks.d.ts.map +1 -0
  104. package/dist/locks.js +62 -0
  105. package/dist/log.d.ts +1 -0
  106. package/dist/log.d.ts.map +1 -1
  107. package/dist/lost.d.ts +5 -0
  108. package/dist/lost.d.ts.map +1 -0
  109. package/dist/lost.js +61 -0
  110. package/dist/media.d.ts +8 -0
  111. package/dist/media.d.ts.map +1 -0
  112. package/dist/media.js +218 -0
  113. package/dist/memory.d.ts +13 -6
  114. package/dist/memory.d.ts.map +1 -1
  115. package/dist/memory.js +219 -102
  116. package/dist/messages.d.ts +24 -3
  117. package/dist/messages.d.ts.map +1 -1
  118. package/dist/messages.js +89 -31
  119. package/dist/model.d.ts +8 -10
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +6 -18
  122. package/dist/models.d.ts +14 -0
  123. package/dist/models.d.ts.map +1 -0
  124. package/dist/models.js +197 -0
  125. package/dist/observation.d.ts +3 -2
  126. package/dist/observation.d.ts.map +1 -1
  127. package/dist/observation.js +15 -15
  128. package/dist/opened.js +3 -3
  129. package/dist/opening.d.ts +4 -0
  130. package/dist/opening.d.ts.map +1 -0
  131. package/dist/opening.js +60 -0
  132. package/dist/outcome.d.ts +17 -7
  133. package/dist/outcome.d.ts.map +1 -1
  134. package/dist/outcome.js +19 -5
  135. package/dist/overlay.d.ts +1 -0
  136. package/dist/overlay.d.ts.map +1 -1
  137. package/dist/overlay.js +12 -1
  138. package/dist/parts.d.ts +11 -0
  139. package/dist/parts.d.ts.map +1 -0
  140. package/dist/parts.js +21 -0
  141. package/dist/paths.d.ts +2 -0
  142. package/dist/paths.d.ts.map +1 -1
  143. package/dist/paths.js +26 -0
  144. package/dist/preparation.d.ts +20 -0
  145. package/dist/preparation.d.ts.map +1 -0
  146. package/dist/preparation.js +233 -0
  147. package/dist/queries.d.ts +16 -0
  148. package/dist/queries.d.ts.map +1 -0
  149. package/dist/queries.js +272 -0
  150. package/dist/query.d.ts +19 -206
  151. package/dist/query.d.ts.map +1 -1
  152. package/dist/query.js +3 -494
  153. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  154. package/dist/questions.d.ts.map +1 -0
  155. package/dist/{chat/questions.js → questions.js} +13 -2
  156. package/dist/reach.d.ts +20 -13
  157. package/dist/reach.d.ts.map +1 -1
  158. package/dist/reach.js +204 -135
  159. package/dist/react.d.ts +14 -2
  160. package/dist/react.d.ts.map +1 -1
  161. package/dist/react.js +10 -1
  162. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  163. package/dist/read.d.ts.map +1 -0
  164. package/dist/{chat/read.js → read.js} +4 -0
  165. package/dist/readiness.d.ts +12 -16
  166. package/dist/readiness.d.ts.map +1 -1
  167. package/dist/readiness.js +2 -8
  168. package/dist/reads.d.ts +36 -10
  169. package/dist/reads.d.ts.map +1 -1
  170. package/dist/reads.js +159 -83
  171. package/dist/recovery.d.ts +1 -0
  172. package/dist/recovery.d.ts.map +1 -1
  173. package/dist/recovery.js +35 -1
  174. package/dist/refresh.d.ts +10 -4
  175. package/dist/refresh.d.ts.map +1 -1
  176. package/dist/refresh.js +92 -30
  177. package/dist/refusal.d.ts +5 -0
  178. package/dist/refusal.d.ts.map +1 -0
  179. package/dist/refusal.js +57 -0
  180. package/dist/replica.d.ts +11 -10
  181. package/dist/replica.d.ts.map +1 -1
  182. package/dist/replica.js +56 -23
  183. package/dist/room-draft.d.ts +22 -7
  184. package/dist/room-draft.d.ts.map +1 -1
  185. package/dist/room-draft.js +134 -54
  186. package/dist/room-drafts.d.ts +24 -0
  187. package/dist/room-drafts.d.ts.map +1 -0
  188. package/dist/room-drafts.js +217 -0
  189. package/dist/rows.d.ts +18 -16
  190. package/dist/rows.d.ts.map +1 -1
  191. package/dist/rows.js +45 -153
  192. package/dist/runtime.d.ts +43 -0
  193. package/dist/runtime.d.ts.map +1 -0
  194. package/dist/runtime.js +1 -0
  195. package/dist/save.d.ts +7 -1
  196. package/dist/save.d.ts.map +1 -1
  197. package/dist/save.js +46 -27
  198. package/dist/saves.d.ts +70 -0
  199. package/dist/saves.d.ts.map +1 -0
  200. package/dist/saves.js +1005 -0
  201. package/dist/search.d.ts +12 -63
  202. package/dist/search.d.ts.map +1 -1
  203. package/dist/search.js +9 -52
  204. package/dist/seed.d.ts +11 -2
  205. package/dist/seed.d.ts.map +1 -1
  206. package/dist/seed.js +71 -1
  207. package/dist/shared.d.ts +1 -7
  208. package/dist/shared.d.ts.map +1 -1
  209. package/dist/shared.js +13 -105
  210. package/dist/shown.d.ts +31 -0
  211. package/dist/shown.d.ts.map +1 -0
  212. package/dist/shown.js +290 -0
  213. package/dist/socket/admission.d.ts +7 -0
  214. package/dist/socket/admission.d.ts.map +1 -0
  215. package/dist/socket/admission.js +39 -0
  216. package/dist/socket/answers.d.ts +6 -0
  217. package/dist/socket/answers.d.ts.map +1 -0
  218. package/dist/socket/answers.js +20 -0
  219. package/dist/socket/lanes.d.ts +20 -0
  220. package/dist/socket/lanes.d.ts.map +1 -0
  221. package/dist/socket/lanes.js +77 -0
  222. package/dist/socket/reads.d.ts +10 -0
  223. package/dist/socket/reads.d.ts.map +1 -0
  224. package/dist/socket/reads.js +31 -0
  225. package/dist/socket/rooms.d.ts +44 -0
  226. package/dist/socket/rooms.d.ts.map +1 -0
  227. package/dist/socket/rooms.js +90 -0
  228. package/dist/socket/session.d.ts +38 -0
  229. package/dist/socket/session.d.ts.map +1 -0
  230. package/dist/socket/session.js +23 -0
  231. package/dist/socket.d.ts +70 -0
  232. package/dist/socket.d.ts.map +1 -0
  233. package/dist/socket.js +175 -0
  234. package/dist/source.d.ts +61 -0
  235. package/dist/source.d.ts.map +1 -0
  236. package/dist/source.js +82 -0
  237. package/dist/status.d.ts +4 -5
  238. package/dist/status.d.ts.map +1 -1
  239. package/dist/status.js +3 -7
  240. package/dist/store/fences.d.ts +16 -0
  241. package/dist/store/fences.d.ts.map +1 -0
  242. package/dist/store/fences.js +26 -0
  243. package/dist/store/installs.d.ts +30 -0
  244. package/dist/store/installs.d.ts.map +1 -0
  245. package/dist/store/installs.js +34 -0
  246. package/dist/store/readiness.d.ts +10 -0
  247. package/dist/store/readiness.d.ts.map +1 -0
  248. package/dist/store/readiness.js +52 -0
  249. package/dist/store/records.d.ts +210 -0
  250. package/dist/store/records.d.ts.map +1 -0
  251. package/dist/store/records.js +428 -0
  252. package/dist/store/room-held.d.ts +8 -0
  253. package/dist/store/room-held.d.ts.map +1 -0
  254. package/dist/store/room-held.js +17 -0
  255. package/dist/store/space.d.ts +11 -0
  256. package/dist/store/space.d.ts.map +1 -0
  257. package/dist/store/space.js +41 -0
  258. package/dist/store/watchers.d.ts +17 -0
  259. package/dist/store/watchers.d.ts.map +1 -0
  260. package/dist/store/watchers.js +56 -0
  261. package/dist/store/writes.d.ts +24 -0
  262. package/dist/store/writes.d.ts.map +1 -0
  263. package/dist/store/writes.js +125 -0
  264. package/dist/store.d.ts +105 -149
  265. package/dist/store.d.ts.map +1 -1
  266. package/dist/store.js +143 -390
  267. package/dist/stored.d.ts +67 -49
  268. package/dist/stored.d.ts.map +1 -1
  269. package/dist/stored.js +358 -253
  270. package/dist/surface.d.ts +88 -0
  271. package/dist/surface.d.ts.map +1 -0
  272. package/dist/surface.js +224 -0
  273. package/dist/sync.d.ts +19 -0
  274. package/dist/sync.d.ts.map +1 -0
  275. package/dist/sync.js +532 -0
  276. package/dist/tables.d.ts +140 -60
  277. package/dist/tables.d.ts.map +1 -1
  278. package/dist/tables.js +268 -101
  279. package/dist/tallies.d.ts +18 -0
  280. package/dist/tallies.d.ts.map +1 -0
  281. package/dist/tallies.js +129 -0
  282. package/dist/transfer.d.ts +0 -5
  283. package/dist/transfer.d.ts.map +1 -1
  284. package/dist/validation.d.ts +3 -4
  285. package/dist/validation.d.ts.map +1 -1
  286. package/dist/validation.js +42 -100
  287. package/dist/windows.d.ts +1 -12
  288. package/dist/windows.d.ts.map +1 -1
  289. package/dist/windows.js +2 -75
  290. package/dist/wire.d.ts +22 -10
  291. package/dist/wire.d.ts.map +1 -1
  292. package/dist/wire.js +9 -3
  293. package/package.json +12 -18
  294. package/AGENTS.md +0 -320
  295. package/dist/chat/acts.d.ts +0 -33
  296. package/dist/chat/acts.d.ts.map +0 -1
  297. package/dist/chat/acts.js +0 -36
  298. package/dist/chat/context.d.ts +0 -3
  299. package/dist/chat/context.d.ts.map +0 -1
  300. package/dist/chat/earlier.d.ts +0 -10
  301. package/dist/chat/earlier.d.ts.map +0 -1
  302. package/dist/chat/earlier.js +0 -54
  303. package/dist/chat/house.d.ts +0 -25
  304. package/dist/chat/house.d.ts.map +0 -1
  305. package/dist/chat/house.js +0 -38
  306. package/dist/chat/input.d.ts +0 -11
  307. package/dist/chat/input.d.ts.map +0 -1
  308. package/dist/chat/input.js +0 -92
  309. package/dist/chat/kit.d.ts +0 -61
  310. package/dist/chat/kit.d.ts.map +0 -1
  311. package/dist/chat/kit.js +0 -123
  312. package/dist/chat/lasting.d.ts +0 -6
  313. package/dist/chat/lasting.d.ts.map +0 -1
  314. package/dist/chat/lasting.js +0 -19
  315. package/dist/chat/list.d.ts +0 -28
  316. package/dist/chat/list.d.ts.map +0 -1
  317. package/dist/chat/list.js +0 -103
  318. package/dist/chat/markdown.d.ts +0 -21
  319. package/dist/chat/markdown.d.ts.map +0 -1
  320. package/dist/chat/markdown.js +0 -246
  321. package/dist/chat/message.d.ts +0 -7
  322. package/dist/chat/message.d.ts.map +0 -1
  323. package/dist/chat/message.js +0 -254
  324. package/dist/chat/messages.d.ts +0 -35
  325. package/dist/chat/messages.d.ts.map +0 -1
  326. package/dist/chat/messages.js +0 -210
  327. package/dist/chat/name.d.ts +0 -7
  328. package/dist/chat/name.d.ts.map +0 -1
  329. package/dist/chat/name.js +0 -37
  330. package/dist/chat/opened.d.ts +0 -12
  331. package/dist/chat/opened.d.ts.map +0 -1
  332. package/dist/chat/opened.js +0 -19
  333. package/dist/chat/overlay.d.ts +0 -32
  334. package/dist/chat/overlay.d.ts.map +0 -1
  335. package/dist/chat/overlay.js +0 -103
  336. package/dist/chat/parts.d.ts +0 -58
  337. package/dist/chat/parts.d.ts.map +0 -1
  338. package/dist/chat/parts.js +0 -120
  339. package/dist/chat/pieces.d.ts +0 -62
  340. package/dist/chat/pieces.d.ts.map +0 -1
  341. package/dist/chat/pieces.js +0 -1110
  342. package/dist/chat/process.d.ts +0 -20
  343. package/dist/chat/process.d.ts.map +0 -1
  344. package/dist/chat/process.js +0 -32
  345. package/dist/chat/provider.d.ts +0 -70
  346. package/dist/chat/provider.d.ts.map +0 -1
  347. package/dist/chat/provider.js +0 -635
  348. package/dist/chat/question.d.ts +0 -9
  349. package/dist/chat/question.d.ts.map +0 -1
  350. package/dist/chat/question.js +0 -69
  351. package/dist/chat/questions.d.ts.map +0 -1
  352. package/dist/chat/read.d.ts.map +0 -1
  353. package/dist/chat/ready.d.ts +0 -37
  354. package/dist/chat/ready.d.ts.map +0 -1
  355. package/dist/chat/ready.js +0 -93
  356. package/dist/chat/room-file.d.ts +0 -8
  357. package/dist/chat/room-file.d.ts.map +0 -1
  358. package/dist/chat/room-file.js +0 -72
  359. package/dist/chat/steady.d.ts +0 -3
  360. package/dist/chat/steady.d.ts.map +0 -1
  361. package/dist/chat/steady.js +0 -26
  362. package/dist/chat/style.d.ts +0 -4
  363. package/dist/chat/style.d.ts.map +0 -1
  364. package/dist/chat/style.js +0 -307
  365. package/dist/chat.d.ts +0 -15
  366. package/dist/chat.d.ts.map +0 -1
  367. package/dist/chat.js +0 -8
  368. package/dist/fence.d.ts +0 -6
  369. package/dist/fence.d.ts.map +0 -1
  370. package/dist/fence.js +0 -10
  371. package/dist/fulltext.d.ts +0 -27
  372. package/dist/fulltext.d.ts.map +0 -1
  373. package/dist/fulltext.js +0 -368
  374. package/dist/words.d.ts +0 -19
  375. package/dist/words.d.ts.map +0 -1
  376. package/dist/words.js +0 -150
package/dist/refresh.js CHANGED
@@ -1,46 +1,75 @@
1
1
  import { unconfirmed } from './transfer.js';
2
- async function pageOf(page, roomVersion, staging) {
3
- const removed = new Set(page.removals);
4
- const documents = Object.keys(page.documents).filter((path) => !removed.has(path));
5
- const binaries = Object.keys(page.binaryFiles).filter((path) => !removed.has(path));
6
- const written = new Set([...documents, ...binaries]);
7
- const others = [
8
- ...new Set([
9
- ...Object.keys(page.revisions),
10
- ...Object.keys(page.fileIds ?? {}),
11
- ...Object.keys(page.changes),
12
- ]),
13
- ].filter((path) => !written.has(path) && !removed.has(path));
14
- const asked = [
15
- ...documents.filter((path) => page.revisions[path] === undefined),
16
- ...binaries.filter((path) => page.revisions[path] === undefined),
17
- ...others,
18
- ];
19
- const prior = asked.length === 0 ? new Map() : await staging.prior(asked);
2
+ import { ROW_WEIGHT, stepped, yielded } from './turn.js';
3
+ function* listing(page, removals) {
4
+ const removed = new Set();
5
+ for (const path of removals) {
6
+ removed.add(path);
7
+ yield ROW_WEIGHT;
8
+ }
9
+ const documents = [];
10
+ const binaries = [];
11
+ const asked = [];
12
+ const written = new Set();
13
+ for (const [kept, named] of [
14
+ [documents, page.documents],
15
+ [binaries, page.binaryFiles],
16
+ ]) {
17
+ for (const path of Object.keys(named)) {
18
+ yield ROW_WEIGHT;
19
+ if (removed.has(path))
20
+ continue;
21
+ kept.push(path);
22
+ written.add(path);
23
+ if (page.revisions[path] === undefined)
24
+ asked.push(path);
25
+ }
26
+ }
27
+ const others = [];
28
+ const seen = new Set();
29
+ for (const named of [page.revisions, page.fileIds ?? {}, page.changes]) {
30
+ for (const path of Object.keys(named)) {
31
+ yield ROW_WEIGHT;
32
+ if (seen.has(path))
33
+ continue;
34
+ seen.add(path);
35
+ if (!written.has(path) && !removed.has(path))
36
+ others.push(path);
37
+ }
38
+ }
39
+ return { documents, binaries, others, asked: [...asked, ...others] };
40
+ }
41
+ function* entering(page, roomVersion, listed, prior) {
20
42
  const entries = [];
21
- for (const path of documents) {
43
+ for (const path of listed.documents) {
44
+ yield ROW_WEIGHT;
22
45
  entries.push({
23
46
  path,
24
47
  content: page.documents[path],
48
+ facts: page.facts[path] ?? null,
25
49
  binary: null,
26
50
  revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
27
51
  fileId: page.fileIds?.[path] ?? null,
52
+ created: page.created?.[path] ?? null,
28
53
  change: page.changes[path] ?? null,
29
54
  written: roomVersion,
30
55
  });
31
56
  }
32
- for (const path of binaries) {
57
+ for (const path of listed.binaries) {
58
+ yield ROW_WEIGHT;
33
59
  entries.push({
34
60
  path,
35
61
  content: null,
62
+ facts: null,
36
63
  binary: { state: 'accepted', ...page.binaryFiles[path] },
37
64
  revision: page.revisions[path] ?? prior.get(path)?.revision ?? null,
38
65
  fileId: page.fileIds?.[path] ?? null,
66
+ created: page.created?.[path] ?? null,
39
67
  change: page.changes[path] ?? null,
40
68
  written: null,
41
69
  });
42
70
  }
43
- for (const path of others) {
71
+ for (const path of listed.others) {
72
+ yield ROW_WEIGHT;
44
73
  const held = prior.get(path);
45
74
  if (held === undefined)
46
75
  continue;
@@ -49,20 +78,56 @@ async function pageOf(page, roomVersion, staging) {
49
78
  ...kept,
50
79
  revision: page.revisions[path] ?? held.revision,
51
80
  fileId: page.fileIds?.[path] ?? held.fileId,
81
+ created: page.created?.[path] ?? held.created,
52
82
  change: page.changes[path] ?? held.change,
53
83
  });
54
84
  }
85
+ return entries;
86
+ }
87
+ export async function pageEntries(page, removals, roomVersion, prior) {
88
+ await yielded();
89
+ const listed = await stepped(listing(page, removals));
90
+ const held = listed.asked.length === 0 ? new Map() : await prior(listed.asked);
91
+ return stepped(entering(page, roomVersion, listed, held));
92
+ }
93
+ function without(named, kept) {
94
+ return Object.fromEntries(Object.entries(named).filter(([path]) => !kept.has(path)));
95
+ }
96
+ function unwritten(page, kept) {
97
+ if (kept.size === 0)
98
+ return page;
99
+ return {
100
+ ...page,
101
+ documents: without(page.documents, kept),
102
+ facts: without(page.facts, kept),
103
+ revisions: without(page.revisions, kept),
104
+ ...(page.fileIds === undefined ? {} : { fileIds: without(page.fileIds, kept) }),
105
+ ...(page.created === undefined ? {} : { created: without(page.created, kept) }),
106
+ changes: without(page.changes, kept),
107
+ binaryFiles: without(page.binaryFiles, kept),
108
+ removals: page.removals.filter((path) => !kept.has(path)),
109
+ };
110
+ }
111
+ async function pageOf(answered, roomVersion, staging) {
112
+ const page = unwritten(answered, await staging.later([
113
+ ...Object.keys(answered.documents),
114
+ ...Object.keys(answered.binaryFiles),
115
+ ...answered.removals,
116
+ ], roomVersion));
55
117
  return {
56
- entries,
118
+ entries: await pageEntries(page, page.removals, roomVersion, (paths) => staging.prior(paths)),
57
119
  removals: page.removals,
58
120
  folders: page.folders ?? [],
59
121
  folderRemovals: page.folderRemovals ?? [],
60
122
  };
61
123
  }
62
- export async function advancement(adapter, authorization, held, remodel, continuing, staging) {
124
+ export async function advancement(refresh, authorization, held, remodel, continuing, staging) {
63
125
  const locator = held.locator;
64
126
  const fromRoomVersion = held.roomVersion;
65
- const first = await adapter.refresh(authorization, {
127
+ staging.turn();
128
+ if (!continuing())
129
+ return unconfirmed;
130
+ const first = await refresh(authorization, {
66
131
  locator,
67
132
  selection: held.replica.selection,
68
133
  fromRoomVersion,
@@ -70,10 +135,7 @@ export async function advancement(adapter, authorization, held, remodel, continu
70
135
  if (first.kind !== 'net-advancement')
71
136
  return first;
72
137
  const roomVersion = first.roomVersion;
73
- const models = remodel(first.models, {
74
- collection: held.model,
75
- selection: held.selectionModel,
76
- });
138
+ const models = remodel(first.models, { collection: held.model });
77
139
  const changed = new Set();
78
140
  const staged = async (page) => {
79
141
  const read = await pageOf(page, roomVersion, staging);
@@ -87,9 +149,10 @@ export async function advancement(adapter, authorization, held, remodel, continu
87
149
  return unconfirmed;
88
150
  let pageToken = first.pageToken;
89
151
  while (pageToken !== undefined) {
152
+ await staging.turn();
90
153
  if (!continuing())
91
154
  return unconfirmed;
92
- const page = await adapter.refresh(authorization, {
155
+ const page = await refresh(authorization, {
93
156
  locator,
94
157
  selection: held.replica.selection,
95
158
  fromRoomVersion,
@@ -110,7 +173,6 @@ export async function advancement(adapter, authorization, held, remodel, continu
110
173
  record: {
111
174
  ...held,
112
175
  model: models.collection,
113
- selectionModel: models.selection,
114
176
  roomVersion,
115
177
  },
116
178
  changed,
@@ -0,0 +1,5 @@
1
+ import type { ProviderRefusal } from './adapter.js';
2
+ import type { Runtime } from './runtime.js';
3
+ import type { RefusalReason } from './socket.js';
4
+ export declare function refuse(runtime: Runtime, reason: RefusalReason, provider?: ProviderRefusal | null): Promise<void>;
5
+ //# sourceMappingURL=refusal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAQpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,QAAQ,GAAE,eAAe,GAAG,IAAW,iBAmDxC"}
@@ -0,0 +1,57 @@
1
+ import { changeSet, mergeChangeSets } from './change-set.js';
2
+ import { composedOf } from './collection.js';
3
+ import { uncaught } from './failure.js';
4
+ import { listedLocators } from './listing.js';
5
+ import { prepare } from './preparation.js';
6
+ import { storedRecord } from './replica.js';
7
+ import { emitRefusal } from './shown.js';
8
+ export async function refuse(runtime, reason, provider = null) {
9
+ const { store, socket, journal } = runtime;
10
+ socket.session.set({ paused: true });
11
+ socket.abortReads();
12
+ try {
13
+ if (reason === 'revoked-authorization') {
14
+ await store.exclusive(async () => {
15
+ const revoked = { status: 'unavailable', reason: 'revoked' };
16
+ let held = new Map();
17
+ try {
18
+ const local = await store.open();
19
+ held = await store.rooms();
20
+ await local.commit({
21
+ rooms: [...held.values()].map(({ record: kept }) => {
22
+ const record = { ...kept, model: revoked };
23
+ return {
24
+ locator: record.locator,
25
+ key: record.key,
26
+ record: storedRecord(record),
27
+ composed: composedOf(store.composed(record)),
28
+ };
29
+ }),
30
+ });
31
+ }
32
+ catch (error) {
33
+ journal.record('model revocation persistence failed');
34
+ uncaught(error);
35
+ }
36
+ const listedNow = listedLocators(runtime, held);
37
+ for (const locator of listedNow) {
38
+ if (!held.has(locator))
39
+ socket.rooms.stand(locator, { unheldModel: revoked });
40
+ }
41
+ store.changed(mergeChangeSets(listedNow.map((locator) => changeSet(locator, { documents: null, room: true }))));
42
+ prepare(runtime);
43
+ });
44
+ }
45
+ }
46
+ finally {
47
+ socket.session.set({
48
+ refusal: {
49
+ code: reason,
50
+ reauthorizationOffered: reason === 'revoked-authorization',
51
+ refusal: provider,
52
+ },
53
+ });
54
+ journal.record(`connection refused ${reason}`);
55
+ emitRefusal(runtime);
56
+ }
57
+ }
package/dist/replica.d.ts CHANGED
@@ -1,7 +1,8 @@
1
- import type { MutationResult, OperationScopes, ReplicaAdmission, TypedSelection } from './adapter.js';
1
+ import { type TypedPath } from '@agentshouse/mdmodel';
2
+ import type { BootstrapInventory, SavedFacts, MutationResult, OperationScopes, ReplicaAdmission, TypedSelection } from './adapter.js';
2
3
  import { type ChangeBatch, type Precondition } from './change.js';
3
4
  import { type Collection, type Composition } from './collection.js';
4
- import type { ModelState } from './model.js';
5
+ import { type ModelState } from './model.js';
5
6
  import { type Layer } from './overlay.js';
6
7
  import type { HeldEntry, OverlayEntry, StoredEntry } from './tables.js';
7
8
  export type ReplicaRecord = {
@@ -12,33 +13,33 @@ export type ReplicaRecord = {
12
13
  readonly replica: ReplicaAdmission;
13
14
  readonly model: ModelState;
14
15
  readonly typedSelection: TypedSelection | null;
15
- readonly selectionModel: ModelState;
16
16
  readonly providerOwnedPaths: readonly string[];
17
+ readonly authoredPaths?: readonly string[];
17
18
  readonly roomVersion: string;
18
19
  readonly transfer: string;
20
+ readonly inventory: BootstrapInventory;
19
21
  readonly key: number;
20
22
  };
21
23
  export type HeldReplica = {
22
24
  readonly record: ReplicaRecord;
23
25
  readonly queue: readonly ChangeBatch[];
24
26
  readonly overlaid: ReadonlySet<string>;
25
- readonly count: number;
26
- readonly confirmed: number;
27
27
  };
28
28
  export type VisibleLayer = Layer & {
29
29
  readonly collection: Collection;
30
30
  };
31
31
  export type Slice = Layer & {
32
32
  readonly written: Readonly<Record<string, string>>;
33
+ readonly facts: Readonly<Record<string, SavedFacts>>;
33
34
  readonly held: ReadonlySet<string>;
34
35
  };
35
- export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection' | 'selectionModel'>): Composition;
36
- export declare function sameMembership(record: Pick<ReplicaRecord, 'typedSelection'>, other: Pick<ReplicaRecord, 'typedSelection'>): boolean;
36
+ export declare function compositionOf(record: Pick<ReplicaRecord, 'model' | 'typedSelection'>, builtIn: ModelState, typedPaths: readonly TypedPath[]): Composition;
37
37
  export declare function storedRecord(record: ReplicaRecord): string;
38
38
  export declare function slicing(entries: readonly HeldEntry[], paths: Iterable<string>): Generator<number, Slice, void>;
39
+ export type LayerEntry = Omit<StoredEntry, 'facts'>;
39
40
  export declare function entryAt(layer: Layer & {
40
41
  readonly written?: Readonly<Record<string, string>>;
41
- }, path: string): StoredEntry | null;
42
+ }, path: string): LayerEntry | null;
42
43
  export declare function slicingWith(slice: Slice, set: readonly StoredEntry[], removed: readonly string[]): Generator<number, Slice, void>;
43
44
  export declare function touchedBy(queue: readonly ChangeBatch[]): Set<string>;
44
45
  export declare function movedBy(queue: readonly ChangeBatch[], locator: string): Set<string>;
@@ -47,7 +48,7 @@ export type Replayed = {
47
48
  readonly touched: ReadonlySet<string>;
48
49
  };
49
50
  export declare function replaying(confirmed: Slice, queue: readonly ChangeBatch[], locator: string, composition: Composition): Generator<number, Replayed, void>;
50
- export declare function overlayOf(visible: Layer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
51
+ export declare function overlayOf(visible: VisibleLayer, touched: Iterable<string>): Generator<number, OverlayEntry[], void>;
51
52
  export declare function holds(layer: Layer, preconditions: readonly Precondition[]): boolean;
52
53
  export declare function landed(batch: ChangeBatch, confirmed: Layer, current?: Readonly<Record<string, string>>): boolean;
53
54
  export type Standing = {
@@ -63,6 +64,6 @@ export type Returned = {
63
64
  readonly removed: readonly string[];
64
65
  };
65
66
  export declare function returnedPaths(submitted: ChangeBatch, accepted: Accepted): Set<string>;
66
- export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string): Generator<number, Returned, void>;
67
+ export declare function returning(confirmed: Slice, submitted: ChangeBatch, accepted: Accepted, writtenAt: string, composition: Composition): Generator<number, Returned, void>;
67
68
  export {};
68
69
  //# sourceMappingURL=replica.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"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"}
package/dist/replica.js CHANGED
@@ -1,24 +1,24 @@
1
1
  import { equalValue, parse } from '@agentshouse/mdmodel';
2
2
  import { immutable, landing } from './change.js';
3
3
  import { collectionOf } from './collection.js';
4
+ import { storedModel } from './model.js';
4
5
  import { acceptedBinaries, overlaying } from './overlay.js';
6
+ import { writtenFacts } from './rows.js';
5
7
  import { effectiveIn, rewriting } from './save.js';
8
+ import { guarding } from './shared.js';
6
9
  import { ROW_WEIGHT } from './turn.js';
7
- export function compositionOf(record) {
10
+ export function compositionOf(record, builtIn, typedPaths) {
8
11
  return {
9
12
  model: record.model,
10
13
  selection: record.typedSelection === null
11
14
  ? null
12
- : { roots: record.typedSelection.roots, model: record.selectionModel },
15
+ : { roots: record.typedSelection.roots, model: builtIn },
16
+ typedPaths,
13
17
  };
14
18
  }
15
- export function sameMembership(record, other) {
16
- return (JSON.stringify(record.typedSelection?.roots ?? null) ===
17
- JSON.stringify(other.typedSelection?.roots ?? null));
18
- }
19
19
  export function storedRecord(record) {
20
20
  const { key: _key, ...stored } = record;
21
- return JSON.stringify(stored);
21
+ return JSON.stringify({ ...stored, model: storedModel(stored.model) });
22
22
  }
23
23
  const PROBES = new Set([
24
24
  'then',
@@ -38,7 +38,7 @@ function strict(values, held) {
38
38
  throw new UnreadPath(property);
39
39
  }
40
40
  };
41
- return new Proxy(values, {
41
+ return guarding(values, {
42
42
  get(target, property, receiver) {
43
43
  guard(property);
44
44
  return Reflect.get(target, property, receiver);
@@ -61,9 +61,13 @@ export function* slicing(entries, paths) {
61
61
  const binaries = {};
62
62
  const revisions = {};
63
63
  const fileIds = {};
64
+ const created = {};
64
65
  const changes = {};
65
66
  const written = {};
67
+ const facts = {};
66
68
  for (const entry of entries) {
69
+ if (entry.facts !== null)
70
+ facts[entry.path] = entry.facts;
67
71
  if (entry.binary !== null)
68
72
  binaries[entry.path] = entry.binary;
69
73
  else if (entry.content !== null)
@@ -72,6 +76,8 @@ export function* slicing(entries, paths) {
72
76
  revisions[entry.path] = entry.revision;
73
77
  if (entry.fileId !== null)
74
78
  fileIds[entry.path] = entry.fileId;
79
+ if (entry.created !== null)
80
+ created[entry.path] = entry.created;
75
81
  if (entry.change !== null)
76
82
  changes[entry.path] = entry.change;
77
83
  if (entry.written !== null)
@@ -83,8 +89,10 @@ export function* slicing(entries, paths) {
83
89
  binaries: strict(binaries, held),
84
90
  revisions: strict(revisions, held),
85
91
  fileIds: strict(fileIds, held),
92
+ created: strict(created, held),
86
93
  changes: strict(changes, held),
87
94
  written: strict(written, held),
95
+ facts: strict(facts, held),
88
96
  held,
89
97
  };
90
98
  }
@@ -99,6 +107,7 @@ export function entryAt(layer, path) {
99
107
  binary: binary ?? null,
100
108
  revision: layer.revisions[path] ?? null,
101
109
  fileId: layer.fileIds[path] ?? null,
110
+ created: layer.created[path] ?? null,
102
111
  change: layer.changes[path] ?? null,
103
112
  written: layer.written?.[path] ?? null,
104
113
  };
@@ -107,8 +116,9 @@ export function* slicingWith(slice, set, removed) {
107
116
  const entries = new Map();
108
117
  for (const path of slice.held) {
109
118
  const entry = entryAt(slice, path);
110
- if (entry !== null)
111
- entries.set(path, { ...entry, type: null });
119
+ if (entry !== null) {
120
+ entries.set(path, { ...entry, type: null, facts: slice.facts[path] ?? null });
121
+ }
112
122
  yield ROW_WEIGHT;
113
123
  }
114
124
  for (const path of removed)
@@ -172,8 +182,9 @@ export function* replaying(confirmed, queue, locator, composition) {
172
182
  export function* overlayOf(visible, touched) {
173
183
  const rows = [];
174
184
  for (const path of touched) {
175
- yield ROW_WEIGHT;
176
185
  const entry = entryAt(visible, path);
186
+ yield ROW_WEIGHT + (entry?.content?.length ?? 0);
187
+ const text = entry?.binary === null ? entry.content : null;
177
188
  rows.push(entry === null
178
189
  ? {
179
190
  path,
@@ -182,10 +193,17 @@ export function* overlayOf(visible, touched) {
182
193
  binary: null,
183
194
  revision: null,
184
195
  fileId: null,
196
+ created: null,
185
197
  change: null,
186
198
  written: null,
199
+ facts: null,
187
200
  }
188
- : { ...entry, written: null, present: true });
201
+ : {
202
+ ...entry,
203
+ written: null,
204
+ present: true,
205
+ facts: text === null ? null : writtenFacts(path, text, visible.collection.composition),
206
+ });
189
207
  }
190
208
  return rows;
191
209
  }
@@ -257,7 +275,7 @@ function effects(change) {
257
275
  { kind: 'present', path: change.to },
258
276
  ];
259
277
  }
260
- if (change.kind === 'binary' || change.kind === 'arrival')
278
+ if (change.kind === 'arrival')
261
279
  return [{ kind: 'present', path }];
262
280
  return [{ kind: 'absent', path }];
263
281
  }
@@ -350,17 +368,20 @@ export function returnedPaths(submitted, accepted) {
350
368
  }
351
369
  return paths;
352
370
  }
353
- export function* returning(confirmed, submitted, accepted, writtenAt) {
371
+ export function* returning(confirmed, submitted, accepted, writtenAt, composition) {
354
372
  const documents = new Map();
355
373
  const binaries = new Map();
356
374
  const revisions = new Map();
357
375
  const fileIds = new Map();
376
+ const created = new Map();
358
377
  const changes = new Map();
359
378
  const written = new Map();
379
+ const facts = new Map();
360
380
  const read = (changed, held, path) => (changed.has(path) ? changed.get(path) : held[path]);
361
381
  for (const [path, content] of Object.entries(accepted.documents)) {
362
- yield ROW_WEIGHT;
382
+ yield ROW_WEIGHT + content.length;
363
383
  documents.set(path, content);
384
+ facts.set(path, writtenFacts(path, content, composition));
364
385
  fileIds.set(path, undefined);
365
386
  written.set(path, writtenAt);
366
387
  }
@@ -383,48 +404,60 @@ export function* returning(confirmed, submitted, accepted, writtenAt) {
383
404
  written.set(path, undefined);
384
405
  }
385
406
  for (const change of submitted.changes) {
386
- if (change.kind === 'arrival' && 'binary' in change) {
387
- if (accepted.revisions[change.path] !== undefined) {
407
+ if (change.kind === 'arrival') {
408
+ if (accepted.revisions[change.path] === undefined)
409
+ continue;
410
+ created.set(change.path, change.created);
411
+ if ('binary' in change)
388
412
  binaries.set(change.path, { state: 'accepted', ...change.binary });
389
- }
390
413
  continue;
391
414
  }
392
- if (change.kind !== 'move')
415
+ if (change.kind !== 'move' || accepted.revisions[change.to] === undefined)
393
416
  continue;
417
+ created.set(change.to, read(created, confirmed.created, change.path));
418
+ created.set(change.path, undefined);
394
419
  const moved = read(binaries, confirmed.binaries, change.path);
395
- if (moved === undefined || accepted.revisions[change.to] === undefined)
420
+ if (moved === undefined)
396
421
  continue;
397
422
  binaries.set(change.to, moved);
398
423
  binaries.set(change.path, undefined);
399
424
  }
400
425
  for (const [path, binary] of acceptedBinaries(accepted.binaryFiles ?? {}))
401
426
  binaries.set(path, binary);
402
- for (const path of accepted.removals)
427
+ for (const path of accepted.removals) {
403
428
  binaries.set(path, undefined);
429
+ created.set(path, undefined);
430
+ }
404
431
  const paths = new Set([
405
432
  ...documents.keys(),
406
433
  ...binaries.keys(),
407
434
  ...revisions.keys(),
408
435
  ...fileIds.keys(),
436
+ ...created.keys(),
409
437
  ...changes.keys(),
410
438
  ...written.keys(),
411
439
  ]);
412
440
  const set = [];
413
441
  const removed = [];
414
442
  for (const path of paths) {
415
- yield ROW_WEIGHT;
416
443
  const content = read(documents, confirmed.documents, path);
417
444
  const binary = read(binaries, confirmed.binaries, path);
445
+ yield ROW_WEIGHT;
418
446
  if (content === undefined && binary === undefined) {
419
447
  removed.push(path);
420
448
  continue;
421
449
  }
450
+ const text = binary === undefined ? (content ?? null) : null;
451
+ const fresh = confirmed.documents[path] === undefined && confirmed.binaries[path] === undefined;
422
452
  set.push({
423
453
  path,
424
- content: binary === undefined ? (content ?? null) : null,
454
+ content: text,
455
+ facts: text === null ? null : (read(facts, confirmed.facts, path) ?? null),
425
456
  binary: binary ?? null,
426
457
  revision: read(revisions, confirmed.revisions, path) ?? null,
427
458
  fileId: read(fileIds, confirmed.fileIds, path) ?? null,
459
+ created: read(created, confirmed.created, path) ??
460
+ (fresh ? (read(changes, confirmed.changes, path)?.time ?? null) : null),
428
461
  change: read(changes, confirmed.changes, path) ?? null,
429
462
  written: read(written, confirmed.written, path) ?? null,
430
463
  });
@@ -40,6 +40,7 @@ export type RoomDraftParts = {
40
40
  };
41
41
  readonly file?: {
42
42
  readonly blob: Blob;
43
+ readonly base?: string | null;
43
44
  };
44
45
  };
45
46
  export type HeldFile = {
@@ -89,9 +90,9 @@ type ChangedUnderneath = {
89
90
  readonly file?: string | null;
90
91
  };
91
92
  export type ReturnReason = ProviderRefusal & {
92
- readonly kind: Open<'conflicted' | 'rejected' | 'expired' | 'withdrawn'>;
93
+ readonly kind: Open<'conflicted' | 'rejected' | 'withdrawn'>;
93
94
  };
94
- export declare function returnedBy(kind: 'expired' | 'withdrawn'): ReturnReason;
95
+ export declare function returnedBy(): ReturnReason;
95
96
  export type RoomDraft = {
96
97
  readonly room: string;
97
98
  readonly path: string;
@@ -105,14 +106,12 @@ export type RoomDraftWrite = {
105
106
  readonly roomDraft: RoomDraft | null;
106
107
  } | {
107
108
  readonly outcome: 'stale';
108
- readonly code: string;
109
- readonly retryable: boolean;
110
109
  readonly current: RoomDraft | null;
111
110
  };
112
111
  export declare function staleWrite(current: RoomDraft | null): RoomDraftWrite;
113
112
  export type ChangedPart = {
114
113
  readonly path: string;
115
- readonly part: Open<'field' | 'section' | 'preamble' | 'markdown' | 'creation' | 'move' | 'removal' | 'file'>;
114
+ readonly part: Open<'field' | 'section' | 'preamble' | 'markdown' | 'move' | 'removal' | 'file'>;
116
115
  readonly name?: string;
117
116
  };
118
117
  export type RoomDraftRecord = {
@@ -126,12 +125,14 @@ export type SavedDraft = {
126
125
  readonly path: string;
127
126
  readonly parts: HeldParts;
128
127
  };
129
- export declare function readParts(value: unknown): RoomDraftParts;
128
+ export declare function readParts(value: unknown, path: string): RoomDraftParts;
129
+ export declare function gatheredParts(earlier: unknown, later: unknown): unknown;
130
130
  export declare function held(current: HeldParts | undefined, parts: RoomDraftParts, file?: HeldFile): HeldParts;
131
131
  export declare function underneath(parts: HeldParts, path: string, visible: VisibleLayer | undefined): ChangedUnderneath;
132
132
  export declare function heldFile(blob: Blob, base: string | null): Promise<HeldFile>;
133
133
  export declare function binaryBase(visible: VisibleLayer | undefined, path: string): string | null;
134
- export declare function changedParts(path: string, report: ChangedUnderneath): readonly ChangedPart[];
134
+ export declare function changedParts(path: string, parts: HeldParts, visible: VisibleLayer | undefined): readonly ChangedPart[];
135
+ export declare function lineEnded(text: string): string;
135
136
  export type TextParts = {
136
137
  readonly fields?: Readonly<Record<string, {
137
138
  readonly value: unknown;
@@ -148,6 +149,20 @@ export declare function returnedInto(existing: HeldParts | undefined, returned:
148
149
  export declare function moveTarget(move: {
149
150
  readonly to: string;
150
151
  }): string;
152
+ export declare function readSavedParts(named: readonly {
153
+ readonly path: string;
154
+ readonly parts: unknown;
155
+ }[]): readonly {
156
+ readonly path: string;
157
+ readonly parts: RoomDraftParts;
158
+ }[];
159
+ export declare function partsChanges(named: readonly {
160
+ readonly path: string;
161
+ readonly parts: unknown;
162
+ }[]): {
163
+ readonly changes: readonly Change[];
164
+ readonly preconditions: readonly Precondition[];
165
+ };
151
166
  export declare function changesOf(path: string, parts: HeldParts): {
152
167
  changes: readonly Change[];
153
168
  bases: readonly Precondition[];