@agentshouse/mdruntime 0.1.0-cdb8840578a20 → 0.1.0-cdded6c080913

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 (365) 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 +389 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +250 -0
  8. package/dist/adapter.d.ts +151 -79
  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 +31 -11
  17. package/dist/bootstrap.d.ts.map +1 -1
  18. package/dist/bootstrap.js +319 -107
  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 -88
  28. package/dist/change.d.ts +32 -1
  29. package/dist/change.d.ts.map +1 -1
  30. package/dist/change.js +10 -1
  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 +98 -11
  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 +717 -0
  43. package/dist/connection.d.ts +7 -129
  44. package/dist/connection.d.ts.map +1 -1
  45. package/dist/connection.js +97 -3359
  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-row.d.ts +33 -0
  50. package/dist/conversation-row.d.ts.map +1 -0
  51. package/dist/conversation-row.js +53 -0
  52. package/dist/conversation.d.ts +43 -18
  53. package/dist/conversation.d.ts.map +1 -1
  54. package/dist/conversation.js +718 -312
  55. package/dist/digest.d.ts +7 -0
  56. package/dist/digest.d.ts.map +1 -0
  57. package/dist/digest.js +113 -0
  58. package/dist/discovery.d.ts +10 -0
  59. package/dist/discovery.d.ts.map +1 -0
  60. package/dist/discovery.js +175 -0
  61. package/dist/durability.d.ts +16 -4
  62. package/dist/durability.d.ts.map +1 -1
  63. package/dist/durability.js +5 -0
  64. package/dist/entry.d.ts +5 -2
  65. package/dist/entry.d.ts.map +1 -1
  66. package/dist/entry.js +33 -28
  67. package/dist/figures.d.ts +48 -0
  68. package/dist/figures.d.ts.map +1 -0
  69. package/dist/figures.js +197 -0
  70. package/dist/file.d.ts +2 -19
  71. package/dist/file.d.ts.map +1 -1
  72. package/dist/file.js +7 -122
  73. package/dist/holdings.d.ts +29 -0
  74. package/dist/holdings.d.ts.map +1 -0
  75. package/dist/holdings.js +95 -0
  76. package/dist/host.d.ts +7 -8
  77. package/dist/host.d.ts.map +1 -1
  78. package/dist/host.js +101 -24
  79. package/dist/identity.d.ts +0 -2
  80. package/dist/identity.d.ts.map +1 -1
  81. package/dist/identity.js +0 -6
  82. package/dist/index.d.ts +32 -13
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +10 -1
  85. package/dist/install.d.ts +56 -0
  86. package/dist/install.d.ts.map +1 -0
  87. package/dist/install.js +560 -0
  88. package/dist/job.d.ts +33 -0
  89. package/dist/job.d.ts.map +1 -0
  90. package/dist/job.js +54 -0
  91. package/dist/lifecycle.d.ts +7 -0
  92. package/dist/lifecycle.d.ts.map +1 -0
  93. package/dist/lifecycle.js +267 -0
  94. package/dist/listing.d.ts +53 -0
  95. package/dist/listing.d.ts.map +1 -0
  96. package/dist/listing.js +175 -0
  97. package/dist/live.d.ts +23 -0
  98. package/dist/live.d.ts.map +1 -0
  99. package/dist/live.js +165 -0
  100. package/dist/locks.d.ts +9 -0
  101. package/dist/locks.d.ts.map +1 -0
  102. package/dist/locks.js +61 -0
  103. package/dist/log.d.ts +1 -0
  104. package/dist/log.d.ts.map +1 -1
  105. package/dist/lost.d.ts +5 -0
  106. package/dist/lost.d.ts.map +1 -0
  107. package/dist/lost.js +61 -0
  108. package/dist/media.d.ts +8 -0
  109. package/dist/media.d.ts.map +1 -0
  110. package/dist/media.js +218 -0
  111. package/dist/memory.d.ts +19 -7
  112. package/dist/memory.d.ts.map +1 -1
  113. package/dist/memory.js +248 -103
  114. package/dist/messages.d.ts +52 -0
  115. package/dist/messages.d.ts.map +1 -0
  116. package/dist/messages.js +168 -0
  117. package/dist/model.d.ts +8 -10
  118. package/dist/model.d.ts.map +1 -1
  119. package/dist/model.js +6 -18
  120. package/dist/models.d.ts +14 -0
  121. package/dist/models.d.ts.map +1 -0
  122. package/dist/models.js +193 -0
  123. package/dist/name.d.ts +4 -0
  124. package/dist/name.d.ts.map +1 -0
  125. package/dist/name.js +122 -0
  126. package/dist/observation.d.ts +17 -2
  127. package/dist/observation.d.ts.map +1 -1
  128. package/dist/observation.js +100 -5
  129. package/dist/opened.d.ts +22 -0
  130. package/dist/opened.d.ts.map +1 -0
  131. package/dist/opened.js +107 -0
  132. package/dist/opening.d.ts +4 -0
  133. package/dist/opening.d.ts.map +1 -0
  134. package/dist/opening.js +56 -0
  135. package/dist/outcome.d.ts +49 -8
  136. package/dist/outcome.d.ts.map +1 -1
  137. package/dist/outcome.js +42 -0
  138. package/dist/overlay.d.ts +4 -5
  139. package/dist/overlay.d.ts.map +1 -1
  140. package/dist/overlay.js +106 -156
  141. package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
  142. package/dist/parts.d.ts.map +1 -0
  143. package/dist/{chat/parts.js → parts.js} +45 -46
  144. package/dist/paths.d.ts +1 -0
  145. package/dist/paths.d.ts.map +1 -1
  146. package/dist/paths.js +4 -0
  147. package/dist/preparation.d.ts +20 -0
  148. package/dist/preparation.d.ts.map +1 -0
  149. package/dist/preparation.js +226 -0
  150. package/dist/queries.d.ts +16 -0
  151. package/dist/queries.d.ts.map +1 -0
  152. package/dist/queries.js +272 -0
  153. package/dist/query.d.ts +26 -185
  154. package/dist/query.d.ts.map +1 -1
  155. package/dist/query.js +3 -464
  156. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -2
  157. package/dist/questions.d.ts.map +1 -0
  158. package/dist/{chat/questions.js → questions.js} +12 -1
  159. package/dist/reach.d.ts +19 -9
  160. package/dist/reach.d.ts.map +1 -1
  161. package/dist/reach.js +287 -99
  162. package/dist/react.d.ts +12 -4
  163. package/dist/react.d.ts.map +1 -1
  164. package/dist/react.js +7 -17
  165. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  166. package/dist/read.d.ts.map +1 -0
  167. package/dist/{chat/read.js → read.js} +4 -0
  168. package/dist/readiness.d.ts +14 -17
  169. package/dist/readiness.d.ts.map +1 -1
  170. package/dist/readiness.js +2 -8
  171. package/dist/reads.d.ts +36 -0
  172. package/dist/reads.d.ts.map +1 -0
  173. package/dist/reads.js +150 -0
  174. package/dist/recovery.d.ts +3 -2
  175. package/dist/recovery.d.ts.map +1 -1
  176. package/dist/recovery.js +43 -8
  177. package/dist/refresh.d.ts +17 -14
  178. package/dist/refresh.d.ts.map +1 -1
  179. package/dist/refresh.js +143 -52
  180. package/dist/refusal.d.ts +5 -0
  181. package/dist/refusal.d.ts.map +1 -0
  182. package/dist/refusal.js +56 -0
  183. package/dist/replica.d.ts +55 -33
  184. package/dist/replica.d.ts.map +1 -1
  185. package/dist/replica.js +331 -181
  186. package/dist/room-draft.d.ts +37 -6
  187. package/dist/room-draft.d.ts.map +1 -1
  188. package/dist/room-draft.js +161 -74
  189. package/dist/room-drafts.d.ts +24 -0
  190. package/dist/room-drafts.d.ts.map +1 -0
  191. package/dist/room-drafts.js +216 -0
  192. package/dist/rows.d.ts +31 -29
  193. package/dist/rows.d.ts.map +1 -1
  194. package/dist/rows.js +59 -116
  195. package/dist/runtime.d.ts +42 -0
  196. package/dist/runtime.d.ts.map +1 -0
  197. package/dist/runtime.js +1 -0
  198. package/dist/save.d.ts +53 -14
  199. package/dist/save.d.ts.map +1 -1
  200. package/dist/save.js +534 -187
  201. package/dist/saves.d.ts +70 -0
  202. package/dist/saves.d.ts.map +1 -0
  203. package/dist/saves.js +1004 -0
  204. package/dist/search.d.ts +15 -78
  205. package/dist/search.d.ts.map +1 -1
  206. package/dist/search.js +10 -184
  207. package/dist/seed.d.ts +25 -0
  208. package/dist/seed.d.ts.map +1 -0
  209. package/dist/seed.js +146 -0
  210. package/dist/shared.d.ts +7 -3
  211. package/dist/shared.d.ts.map +1 -1
  212. package/dist/shared.js +119 -66
  213. package/dist/shown.d.ts +31 -0
  214. package/dist/shown.d.ts.map +1 -0
  215. package/dist/shown.js +294 -0
  216. package/dist/socket/admission.d.ts +7 -0
  217. package/dist/socket/admission.d.ts.map +1 -0
  218. package/dist/socket/admission.js +39 -0
  219. package/dist/socket/answers.d.ts +6 -0
  220. package/dist/socket/answers.d.ts.map +1 -0
  221. package/dist/socket/answers.js +20 -0
  222. package/dist/socket/lanes.d.ts +20 -0
  223. package/dist/socket/lanes.d.ts.map +1 -0
  224. package/dist/socket/lanes.js +77 -0
  225. package/dist/socket/reads.d.ts +10 -0
  226. package/dist/socket/reads.d.ts.map +1 -0
  227. package/dist/socket/reads.js +31 -0
  228. package/dist/socket/rooms.d.ts +43 -0
  229. package/dist/socket/rooms.d.ts.map +1 -0
  230. package/dist/socket/rooms.js +90 -0
  231. package/dist/socket/session.d.ts +39 -0
  232. package/dist/socket/session.d.ts.map +1 -0
  233. package/dist/socket/session.js +23 -0
  234. package/dist/socket.d.ts +70 -0
  235. package/dist/socket.d.ts.map +1 -0
  236. package/dist/socket.js +175 -0
  237. package/dist/source.d.ts +61 -0
  238. package/dist/source.d.ts.map +1 -0
  239. package/dist/source.js +81 -0
  240. package/dist/status.d.ts +4 -5
  241. package/dist/status.d.ts.map +1 -1
  242. package/dist/status.js +3 -7
  243. package/dist/store/fences.d.ts +16 -0
  244. package/dist/store/fences.d.ts.map +1 -0
  245. package/dist/store/fences.js +26 -0
  246. package/dist/store/installs.d.ts +30 -0
  247. package/dist/store/installs.d.ts.map +1 -0
  248. package/dist/store/installs.js +34 -0
  249. package/dist/store/readiness.d.ts +10 -0
  250. package/dist/store/readiness.d.ts.map +1 -0
  251. package/dist/store/readiness.js +52 -0
  252. package/dist/store/records.d.ts +212 -0
  253. package/dist/store/records.d.ts.map +1 -0
  254. package/dist/store/records.js +408 -0
  255. package/dist/store/room-held.d.ts +8 -0
  256. package/dist/store/room-held.d.ts.map +1 -0
  257. package/dist/store/room-held.js +17 -0
  258. package/dist/store/space.d.ts +11 -0
  259. package/dist/store/space.d.ts.map +1 -0
  260. package/dist/store/space.js +43 -0
  261. package/dist/store/watchers.d.ts +17 -0
  262. package/dist/store/watchers.d.ts.map +1 -0
  263. package/dist/store/watchers.js +57 -0
  264. package/dist/store/writes.d.ts +24 -0
  265. package/dist/store/writes.d.ts.map +1 -0
  266. package/dist/store/writes.js +125 -0
  267. package/dist/store.d.ts +106 -150
  268. package/dist/store.d.ts.map +1 -1
  269. package/dist/store.js +136 -713
  270. package/dist/stored.d.ts +156 -0
  271. package/dist/stored.d.ts.map +1 -0
  272. package/dist/stored.js +637 -0
  273. package/dist/surface.d.ts +88 -0
  274. package/dist/surface.d.ts.map +1 -0
  275. package/dist/surface.js +222 -0
  276. package/dist/sync.d.ts +20 -0
  277. package/dist/sync.d.ts.map +1 -0
  278. package/dist/sync.js +531 -0
  279. package/dist/tables.d.ts +415 -0
  280. package/dist/tables.d.ts.map +1 -0
  281. package/dist/tables.js +740 -0
  282. package/dist/tallies.d.ts +18 -0
  283. package/dist/tallies.d.ts.map +1 -0
  284. package/dist/tallies.js +129 -0
  285. package/dist/transfer.d.ts +0 -5
  286. package/dist/transfer.d.ts.map +1 -1
  287. package/dist/turn.d.ts +5 -3
  288. package/dist/turn.d.ts.map +1 -1
  289. package/dist/turn.js +51 -21
  290. package/dist/validation.d.ts +29 -0
  291. package/dist/validation.d.ts.map +1 -0
  292. package/dist/validation.js +104 -0
  293. package/dist/windows.d.ts +11 -0
  294. package/dist/windows.d.ts.map +1 -0
  295. package/dist/windows.js +16 -0
  296. package/dist/wire.d.ts +50 -6
  297. package/dist/wire.d.ts.map +1 -1
  298. package/dist/wire.js +16 -2
  299. package/package.json +18 -19
  300. package/AGENTS.md +0 -300
  301. package/dist/acquisition.d.ts +0 -14
  302. package/dist/acquisition.d.ts.map +0 -1
  303. package/dist/acquisition.js +0 -24
  304. package/dist/chat/acts.d.ts +0 -33
  305. package/dist/chat/acts.d.ts.map +0 -1
  306. package/dist/chat/acts.js +0 -36
  307. package/dist/chat/context.d.ts +0 -3
  308. package/dist/chat/context.d.ts.map +0 -1
  309. package/dist/chat/input.d.ts +0 -9
  310. package/dist/chat/input.d.ts.map +0 -1
  311. package/dist/chat/input.js +0 -99
  312. package/dist/chat/kit.d.ts +0 -61
  313. package/dist/chat/kit.d.ts.map +0 -1
  314. package/dist/chat/kit.js +0 -123
  315. package/dist/chat/lasting.d.ts +0 -6
  316. package/dist/chat/lasting.d.ts.map +0 -1
  317. package/dist/chat/lasting.js +0 -19
  318. package/dist/chat/list.d.ts +0 -27
  319. package/dist/chat/list.d.ts.map +0 -1
  320. package/dist/chat/list.js +0 -63
  321. package/dist/chat/markdown.d.ts +0 -20
  322. package/dist/chat/markdown.d.ts.map +0 -1
  323. package/dist/chat/markdown.js +0 -188
  324. package/dist/chat/message.d.ts +0 -6
  325. package/dist/chat/message.d.ts.map +0 -1
  326. package/dist/chat/message.js +0 -192
  327. package/dist/chat/messages.d.ts +0 -22
  328. package/dist/chat/messages.d.ts.map +0 -1
  329. package/dist/chat/messages.js +0 -155
  330. package/dist/chat/name.d.ts +0 -6
  331. package/dist/chat/name.d.ts.map +0 -1
  332. package/dist/chat/name.js +0 -37
  333. package/dist/chat/opened.d.ts +0 -11
  334. package/dist/chat/opened.d.ts.map +0 -1
  335. package/dist/chat/opened.js +0 -17
  336. package/dist/chat/overlay.d.ts +0 -31
  337. package/dist/chat/overlay.d.ts.map +0 -1
  338. package/dist/chat/overlay.js +0 -97
  339. package/dist/chat/parts.d.ts.map +0 -1
  340. package/dist/chat/process.d.ts +0 -20
  341. package/dist/chat/process.d.ts.map +0 -1
  342. package/dist/chat/process.js +0 -32
  343. package/dist/chat/provider.d.ts +0 -63
  344. package/dist/chat/provider.d.ts.map +0 -1
  345. package/dist/chat/provider.js +0 -629
  346. package/dist/chat/question.d.ts +0 -9
  347. package/dist/chat/question.d.ts.map +0 -1
  348. package/dist/chat/question.js +0 -80
  349. package/dist/chat/questions.d.ts.map +0 -1
  350. package/dist/chat/read.d.ts.map +0 -1
  351. package/dist/chat/ready.d.ts +0 -34
  352. package/dist/chat/ready.d.ts.map +0 -1
  353. package/dist/chat/ready.js +0 -91
  354. package/dist/chat/style.d.ts +0 -4
  355. package/dist/chat/style.d.ts.map +0 -1
  356. package/dist/chat/style.js +0 -302
  357. package/dist/chat.d.ts +0 -14
  358. package/dist/chat.d.ts.map +0 -1
  359. package/dist/chat.js +0 -8
  360. package/dist/fence.d.ts +0 -6
  361. package/dist/fence.d.ts.map +0 -1
  362. package/dist/fence.js +0 -10
  363. package/dist/read-side.d.ts +0 -25
  364. package/dist/read-side.d.ts.map +0 -1
  365. package/dist/read-side.js +0 -639
package/dist/sync.js ADDED
@@ -0,0 +1,531 @@
1
+ import { submitAll, submitLater } from './acceptance.js';
2
+ import { resendCalls, resendLater } from './actions.js';
3
+ import { applyDiscovery, discoverRooms, malformed, signIn } from './discovery.js';
4
+ import { behind, caughtUpTo, publish, pullBootstrap, pullRefresh, reachedBy, replaced, standingAt, } from './install.js';
5
+ import { heldRooms, listHeld, name, readable } from './listing.js';
6
+ import { declaredAsHeld, keepNaming, retainModel, revoked, scoped } from './models.js';
7
+ import { refuse } from './refusal.js';
8
+ import { emitRooms, moveTo, rest, roomUnreadable, transferring, AUTHORITY_TOPIC } from './shown.js';
9
+ import { unconfirmed } from './transfer.js';
10
+ export const OPENING_LANE = 'opening';
11
+ async function advance(runtime, room, local, authorized, running, unheld) {
12
+ const { store, socket } = runtime;
13
+ const live = () => running() && !store.space.full();
14
+ if (!live())
15
+ return unconfirmed;
16
+ const held = unheld === undefined ? await store.record(room.locator) : undefined;
17
+ if (socket.streamed && (held !== undefined || !store.installs.of(room.locator).beyondHorizon)) {
18
+ socket.rooms.stand(room.locator, { stale: false });
19
+ await name(runtime, room.locator);
20
+ return null;
21
+ }
22
+ const refresh = socket.reads.refresh;
23
+ if (held !== undefined && refresh !== undefined) {
24
+ const refreshed = await store.ahead((hold) => refreshedRoom(runtime, room, local, authorized, held, live, hold, refresh));
25
+ if (refreshed === 'behind')
26
+ return advance(runtime, room, local, authorized, live);
27
+ if (refreshed !== 'beyond-horizon')
28
+ return refreshed;
29
+ if (socket.rooms.standing(room.locator).reloadDue)
30
+ return unconfirmed;
31
+ replaced(store, [room.locator]);
32
+ }
33
+ const prior = held === undefined ? undefined : await store.record(room.locator);
34
+ const from = standingAt(store, room.locator, prior);
35
+ const bootstrapped = await pullBootstrap(runtime, authorized, room, local, live, prior, socket.reads, unheld);
36
+ if (bootstrapped.kind !== 'staged')
37
+ return live() ? bootstrapped : unconfirmed;
38
+ const landing = { kind: 'bootstrapped', refreshed: bootstrapped.refreshed, from };
39
+ if (await publish(runtime, local, room, bootstrapped.record, landing, live)) {
40
+ return live() ? null : unconfirmed;
41
+ }
42
+ return (await reachedBy(runtime, room.locator, bootstrapped.record.roomVersion))
43
+ ? null
44
+ : advance(runtime, room, local, authorized, live);
45
+ }
46
+ async function refreshedRoom(runtime, room, local, authorized, held, live, hold, refresh) {
47
+ const { store, socket } = runtime;
48
+ const { rooms } = socket;
49
+ const refreshed = await pullRefresh(runtime, authorized, held, live, hold, refresh);
50
+ if (!live())
51
+ return unconfirmed;
52
+ if (refreshed.kind === 'still-current') {
53
+ rooms.stand(room.locator, { stale: false });
54
+ if (rooms.standing(room.locator).unreadable) {
55
+ rooms.stand(room.locator, { refusal: null });
56
+ readable(runtime, room);
57
+ emitRooms(runtime);
58
+ }
59
+ return null;
60
+ }
61
+ if (refreshed.kind === 'advanced') {
62
+ const landing = {
63
+ kind: 'refreshed',
64
+ from: refreshed.from,
65
+ remodelled: refreshed.remodelled,
66
+ };
67
+ if (!(await publish(runtime, local, room, refreshed.record, landing, live))) {
68
+ const now = (await store.record(room.locator))?.roomVersion;
69
+ const reached = now !== undefined && socket.reads.reached(room.locator, now, refreshed.record.roomVersion);
70
+ return reached ? null : 'behind';
71
+ }
72
+ await retainModel(runtime, local, room, null);
73
+ return null;
74
+ }
75
+ return refreshed.kind === 'beyond-horizon' ? 'beyond-horizon' : refreshed;
76
+ }
77
+ export function advanced(runtime, room, local, authorized) {
78
+ return runtime.socket.lanes.inRoom(room.locator, (live) => advance(runtime, room, local, authorized, live));
79
+ }
80
+ export async function withhold(runtime, withheld, room, local, progress) {
81
+ const { store, socket, journal } = runtime;
82
+ const { rooms } = socket;
83
+ if (withheld.kind === 'unconfirmed' || store.fences.has(room.locator))
84
+ return;
85
+ if (withheld.kind === 'not-ready') {
86
+ progress.complete = false;
87
+ askAgain(runtime, room.locator);
88
+ return;
89
+ }
90
+ rooms.stand(room.locator, { stale: true });
91
+ if (withheld.kind === 'transport-uncertainty' || withheld.kind === 'retryable-refusal') {
92
+ const reset = withheld.kind === 'retryable-refusal' ? withheld.reset : undefined;
93
+ rooms.stand(room.locator, { repairable: { reset } });
94
+ repairLater(runtime, room.locator, reset === undefined ? { again: true } : { at: Date.parse(reset) });
95
+ }
96
+ else
97
+ rooms.stand(room.locator, { repairable: null });
98
+ if (withheld.kind === 'scoped-refusal') {
99
+ await scoped(runtime, withheld, room, local);
100
+ }
101
+ else if (withheld.kind === 'transport-uncertainty') {
102
+ progress.reachable = false;
103
+ }
104
+ else if (withheld.kind === 'retryable-refusal') {
105
+ journal.record(`refusal ${withheld.kind} ${withheld.code}`);
106
+ }
107
+ else if (withheld.kind === 'room-not-readable') {
108
+ roomUnreadable(runtime, room);
109
+ }
110
+ else if (withheld.kind === 'revoked-authorization') {
111
+ await refuse(runtime, 'revoked-authorization');
112
+ }
113
+ }
114
+ function askAgain(runtime, locator) {
115
+ const { store, socket } = runtime;
116
+ socket.rooms.askAgain(locator, () => {
117
+ const room = socket.rooms.discovered(locator);
118
+ if (socket.closed() ||
119
+ socket.stopping() ||
120
+ (socket.streamed && !socket.isOpen()) ||
121
+ room === undefined)
122
+ return;
123
+ const progress = { complete: true, reachable: true };
124
+ void store
125
+ .open()
126
+ .then((local) => socket.lanes.roomTask(locator, (live) => loadRoom(runtime, room, local, progress, live)))
127
+ .then(() => rest(runtime, progress), () => undefined);
128
+ });
129
+ }
130
+ async function prepareRoom(runtime, room, local, progress, prior) {
131
+ const { socket, journal } = runtime;
132
+ const { session } = socket;
133
+ if (socket.closed() || session.now().authorization === undefined) {
134
+ progress.complete = false;
135
+ return false;
136
+ }
137
+ if (prior !== undefined && prior.replica.selection !== room.replica.selection) {
138
+ listHeld(runtime, room.locator);
139
+ emitRooms(runtime);
140
+ journal.record(`selection changed ${room.locator}`);
141
+ progress.complete = false;
142
+ return false;
143
+ }
144
+ if (prior !== undefined && !declaredAsHeld(prior, room)) {
145
+ await retainModel(runtime, local, room, null);
146
+ }
147
+ if (prior !== undefined && (prior.name !== room.name || prior.handle !== room.handle)) {
148
+ await keepNaming(runtime, local, room);
149
+ }
150
+ const { paused, authorization } = session.now();
151
+ if (paused || authorization === undefined)
152
+ return false;
153
+ return room.replica.admission === 'admitted';
154
+ }
155
+ export async function synchronize(runtime, listed, local, progress, attempt, live) {
156
+ const { store, socket } = runtime;
157
+ const heldNow = await store.rooms(listed.map(({ locator }) => locator));
158
+ const prepared = await Promise.allSettled(listed.map((room) => prepareRoom(runtime, room, local, progress, heldNow.get(room.locator)?.record)));
159
+ if (!live())
160
+ return;
161
+ const ready = listed.filter((_, index) => {
162
+ const outcome = prepared[index];
163
+ return outcome?.status === 'fulfilled' && outcome.value;
164
+ });
165
+ const held = await heldRooms(runtime, ready);
166
+ if (!live())
167
+ return;
168
+ if (attempt === 'opened') {
169
+ socket.hand(held);
170
+ }
171
+ const kept = attempt === 'unstreamed'
172
+ ? new Set()
173
+ : new Set((await store.rooms(ready.map(({ locator }) => locator))).keys());
174
+ for (const room of ready) {
175
+ if (attempt === 'opened' || kept.has(room.locator)) {
176
+ if (attempt === 'authorized')
177
+ await name(runtime, room.locator);
178
+ continue;
179
+ }
180
+ void socket.lanes
181
+ .roomTask(room.locator, (live) => loadRoom(runtime, room, local, progress, live))
182
+ .then(() => rest(runtime, progress));
183
+ }
184
+ const failed = prepared.find((room) => room.status === 'rejected');
185
+ if (failed !== undefined)
186
+ throw failed.reason;
187
+ }
188
+ async function caughtUp(runtime, room, local, progress, live) {
189
+ const { socket } = runtime;
190
+ const { authorization } = socket.session.now();
191
+ if (socket.streamed || authorization === undefined)
192
+ return;
193
+ if (!live() || !(await behind(runtime, room)))
194
+ return;
195
+ const withheld = await advance(runtime, room, local, authorization, live);
196
+ if (withheld !== null)
197
+ await withhold(runtime, withheld, room, local, progress);
198
+ }
199
+ export async function loadRoom(runtime, room, local, progress, live, unheld) {
200
+ const { store, socket } = runtime;
201
+ const { authorization } = socket.session.now();
202
+ if (!live() || authorization === undefined)
203
+ return;
204
+ const prior = unheld === undefined ? await store.record(room.locator) : undefined;
205
+ if (prior !== undefined) {
206
+ if (!(await prepareRoom(runtime, room, local, progress, prior)))
207
+ return;
208
+ if (revoked(prior.model)) {
209
+ await reload(runtime, room, local, progress, live);
210
+ return;
211
+ }
212
+ }
213
+ const withheld = await advance(runtime, room, local, authorization, live, unheld);
214
+ if (withheld !== null) {
215
+ await withhold(runtime, withheld, room, local, progress);
216
+ return;
217
+ }
218
+ await caughtUp(runtime, room, local, progress, live);
219
+ }
220
+ export async function reload(runtime, room, local, progress, live) {
221
+ const { store, socket } = runtime;
222
+ try {
223
+ if (live())
224
+ socket.rooms.stand(room.locator, { reloadDue: false });
225
+ const { authorization } = socket.session.now();
226
+ if (!live() || authorization === undefined)
227
+ return;
228
+ const prior = await store.record(room.locator);
229
+ const from = standingAt(store, room.locator, prior);
230
+ const bootstrapped = await pullBootstrap(runtime, authorization, room, local, live, prior);
231
+ if (bootstrapped.kind !== 'staged') {
232
+ if (live())
233
+ await withhold(runtime, bootstrapped, room, local, progress);
234
+ return;
235
+ }
236
+ await publish(runtime, local, room, bootstrapped.record, { kind: 'bootstrapped', refreshed: bootstrapped.refreshed, from }, live);
237
+ await caughtUp(runtime, room, local, progress, live);
238
+ }
239
+ finally {
240
+ caughtUpTo(runtime, room.locator);
241
+ }
242
+ }
243
+ function repairLater(runtime, locator, when) {
244
+ const { socket, recovery } = runtime;
245
+ if (!socket.isOpen() || socket.rooms.standing(locator).repairing)
246
+ return;
247
+ void recovery.attempt(`repair ${locator}`, (signal) => repairPass(runtime, locator, signal), when);
248
+ }
249
+ async function repairPass(runtime, locator, signal) {
250
+ const { store, socket } = runtime;
251
+ const { rooms } = socket;
252
+ const room = rooms.discovered(locator);
253
+ if (!socket.isOpen() ||
254
+ !socket.continuing() ||
255
+ socket.stopping() ||
256
+ !rooms.standing(locator).stale)
257
+ return 'done';
258
+ if (room === undefined || room.replica.admission !== 'admitted')
259
+ return 'done';
260
+ const progress = { complete: true, reachable: true };
261
+ rooms.stand(locator, { repairing: true });
262
+ try {
263
+ const local = await store.open();
264
+ await socket.lanes.roomTask(locator, async (live) => {
265
+ const { authorization } = socket.session.now();
266
+ if (!live() || authorization === undefined)
267
+ return;
268
+ const withheld = await advance(runtime, room, local, authorization, live);
269
+ if (withheld !== null && live())
270
+ await withhold(runtime, withheld, room, local, progress);
271
+ });
272
+ }
273
+ catch {
274
+ rooms.stand(locator, { stale: true });
275
+ progress.reachable = false;
276
+ }
277
+ finally {
278
+ rooms.stand(locator, { repairing: false });
279
+ }
280
+ if (signal.aborted)
281
+ return 'done';
282
+ await rest(runtime, progress);
283
+ if (!rooms.standing(locator).stale) {
284
+ if ((await (await store.open()).order(locator)).length > 0)
285
+ submitLater(runtime, locator);
286
+ return 'done';
287
+ }
288
+ const { repairable } = rooms.standing(locator);
289
+ if (repairable === null)
290
+ return 'done';
291
+ return repairable.reset === undefined ? 'again' : { at: Date.parse(repairable.reset) };
292
+ }
293
+ export async function finishOpening(runtime, progress, live) {
294
+ const { socket, conversations, recovery } = runtime;
295
+ try {
296
+ if (!live()) {
297
+ progress.complete = false;
298
+ return;
299
+ }
300
+ await submitAll(runtime);
301
+ for (const locator of socket.rooms.standingWhere(({ stale, repairable }) => stale && repairable !== null)) {
302
+ repairLater(runtime, locator, {});
303
+ }
304
+ await conversations.reconcile();
305
+ const reading = { complete: true, reachable: true };
306
+ await conversations.catchUp(reading);
307
+ if (progress.reachable && reading.reachable)
308
+ await conversations.resend(reading);
309
+ if (progress.reachable) {
310
+ void recovery.attempt('calls', (signal) => resendCalls(runtime, signal));
311
+ }
312
+ if (!reading.reachable) {
313
+ progress.reachable = false;
314
+ resendLater(runtime);
315
+ }
316
+ }
317
+ catch {
318
+ progress.complete = false;
319
+ }
320
+ finally {
321
+ if (live()) {
322
+ socket.session.set({ complete: progress.complete });
323
+ await rest(runtime, progress, live);
324
+ }
325
+ }
326
+ }
327
+ export function sync(runtime, attempt, found) {
328
+ const { store, socket } = runtime;
329
+ const { session } = socket;
330
+ return socket.lanes.task(OPENING_LANE, async (live) => {
331
+ if (!live()) {
332
+ socket.readyFromStore();
333
+ return;
334
+ }
335
+ const progress = { complete: true, reachable: true };
336
+ session.set({
337
+ underway: attempt === 'opened' ? progress : null,
338
+ ...(attempt === 'opened' ? { streamed: progress } : {}),
339
+ complete: false,
340
+ recorded: false,
341
+ });
342
+ moveTo(runtime, transferring(runtime));
343
+ try {
344
+ const local = await store.open();
345
+ if (!live())
346
+ return;
347
+ await socket.authorize();
348
+ if (!live())
349
+ return;
350
+ const listed = await discoverRooms(runtime, local, progress, live, found);
351
+ if (listed !== null)
352
+ await synchronize(runtime, listed, local, progress, attempt, live);
353
+ }
354
+ catch {
355
+ progress.complete = false;
356
+ if (attempt === 'opened' && !socket.isHanded())
357
+ progress.reachable = false;
358
+ }
359
+ finally {
360
+ socket.notifyReady();
361
+ }
362
+ if (!live())
363
+ return;
364
+ if (attempt !== 'opened') {
365
+ await finishOpening(runtime, progress, live);
366
+ return;
367
+ }
368
+ if (socket.isHanded() || socket.closed() || progress.reachable)
369
+ return;
370
+ session.set({ underway: null });
371
+ await rest(runtime, progress, live);
372
+ });
373
+ }
374
+ export function resynchronize(runtime) {
375
+ const { store, socket } = runtime;
376
+ return socket.lanes.task(OPENING_LANE, async (live) => {
377
+ if (!live() || !socket.isAnnounced())
378
+ return;
379
+ const progress = { complete: true, reachable: true };
380
+ moveTo(runtime, transferring(runtime));
381
+ try {
382
+ const local = await store.open();
383
+ if (!live())
384
+ return;
385
+ await synchronize(runtime, socket.rooms.discoveredRooms(), local, progress, 'unstreamed', live);
386
+ }
387
+ catch {
388
+ progress.complete = false;
389
+ }
390
+ if (live())
391
+ await finishOpening(runtime, progress, live);
392
+ });
393
+ }
394
+ export function countAuthorityChange({ store, socket, lastAnswers }) {
395
+ const authorityChanges = socket.session.now().authorityChanges + 1;
396
+ socket.session.set({ authorityChanges });
397
+ store.tell(AUTHORITY_TOPIC, authorityChanges);
398
+ lastAnswers.again();
399
+ }
400
+ export function changeAuthority(runtime, change) {
401
+ const { store, socket, journal } = runtime;
402
+ const { session } = socket;
403
+ return socket.lanes.task(OPENING_LANE, async (live) => {
404
+ if (!live() || !socket.isAnnounced())
405
+ return;
406
+ countAuthorityChange(runtime);
407
+ const progress = { complete: true, reachable: true };
408
+ moveTo(runtime, transferring(runtime));
409
+ try {
410
+ const local = await store.open();
411
+ if (!live())
412
+ return;
413
+ const invalid = malformed(change.rooms);
414
+ if (invalid !== null) {
415
+ journal.record(invalid);
416
+ await refuse(runtime, 'missing-required-guarantee');
417
+ return;
418
+ }
419
+ if (change.member !== undefined)
420
+ await signIn(runtime, local, change.member);
421
+ const discoveries = session.now().discoveries + 1;
422
+ session.set({ discoveries });
423
+ const listed = await applyDiscovery(runtime, change.rooms, discoveries, change.left);
424
+ await synchronize(runtime, listed, local, progress, 'authorized', live);
425
+ }
426
+ catch {
427
+ progress.complete = false;
428
+ }
429
+ if (!live())
430
+ return;
431
+ if (!progress.complete)
432
+ session.set({ complete: false });
433
+ await rest(runtime, progress, live);
434
+ });
435
+ }
436
+ async function installCarried(runtime, room, local, change, live, progress) {
437
+ const { store, socket } = runtime;
438
+ const { authorization, underway } = socket.session.now();
439
+ if (authorization === undefined)
440
+ return;
441
+ if (underway === null)
442
+ moveTo(runtime, transferring(runtime));
443
+ const prior = await store.record(room.locator);
444
+ const from = standingAt(store, room.locator, prior);
445
+ const page = await change.read();
446
+ const carried = {
447
+ bootstrap: () => Promise.resolve({
448
+ kind: 'bootstrap',
449
+ roomVersion: page.roomVersion,
450
+ ...(page.models === undefined ? {} : { models: page.models }),
451
+ documents: page.documents,
452
+ facts: page.facts,
453
+ revisions: page.revisions,
454
+ ...(page.fileIds === undefined ? {} : { fileIds: page.fileIds }),
455
+ ...(page.created === undefined ? {} : { created: page.created }),
456
+ changes: page.changes,
457
+ binaryFiles: page.binaryFiles,
458
+ ...(page.folders === undefined ? {} : { folders: page.folders }),
459
+ }),
460
+ reached: socket.reads.reached,
461
+ };
462
+ const bootstrapped = await pullBootstrap(runtime, authorization, room, local, live, prior, carried);
463
+ if (bootstrapped.kind !== 'staged') {
464
+ if (live())
465
+ await withhold(runtime, bootstrapped, room, local, progress);
466
+ return;
467
+ }
468
+ await publish(runtime, local, room, bootstrapped.record, { kind: 'bootstrapped', refreshed: bootstrapped.refreshed, from }, live);
469
+ }
470
+ export function applyRoom(runtime, change) {
471
+ const { store, socket } = runtime;
472
+ const { rooms, session } = socket;
473
+ const { locator } = change;
474
+ if (socket.stopping())
475
+ return Promise.resolve();
476
+ return socket.lanes
477
+ .inRoom(locator, async (live) => {
478
+ await socket.answered(locator);
479
+ const progress = session.now().underway ?? { complete: true, reachable: true };
480
+ try {
481
+ const local = await store.open();
482
+ for (;;) {
483
+ if (!live())
484
+ return null;
485
+ const room = rooms.discovered(locator);
486
+ if (room === undefined || room.replica.admission !== 'admitted')
487
+ return null;
488
+ const held = await store.record(locator);
489
+ if (held === undefined) {
490
+ if (change.from !== null)
491
+ return null;
492
+ await installCarried(runtime, room, local, change, live, progress);
493
+ return progress;
494
+ }
495
+ if (held.replica.selection !== room.replica.selection)
496
+ return null;
497
+ const at = held.roomVersion;
498
+ if (socket.reads.reached(locator, at, change.roomVersion))
499
+ return progress;
500
+ if (change.from === null || !socket.reads.reached(locator, at, change.from)) {
501
+ await name(runtime, locator);
502
+ return progress;
503
+ }
504
+ if (session.now().underway === null)
505
+ moveTo(runtime, transferring(runtime));
506
+ const writing = () => live() && !store.space.full();
507
+ const refreshed = await store.ahead((hold) => pullRefresh(runtime, session.now().authorization ?? {}, held, writing, hold, () => change.read()));
508
+ if (refreshed.kind !== 'advanced')
509
+ return progress;
510
+ const landing = {
511
+ kind: 'refreshed',
512
+ from: refreshed.from,
513
+ remodelled: refreshed.remodelled,
514
+ };
515
+ if (await publish(runtime, local, room, refreshed.record, landing, writing)) {
516
+ rooms.stand(locator, { stale: false });
517
+ if (!declaredAsHeld(held, room))
518
+ await retainModel(runtime, local, room, null);
519
+ return progress;
520
+ }
521
+ }
522
+ }
523
+ catch {
524
+ if (!rooms.standing(locator).stale)
525
+ void name(runtime, locator);
526
+ rooms.stand(locator, { stale: true });
527
+ return progress;
528
+ }
529
+ })
530
+ .then((progress) => rest(runtime, progress), () => undefined);
531
+ }