@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
@@ -0,0 +1,267 @@
1
+ import { submitAll } from './acceptance.js';
2
+ import { catching, replaced } from './install.js';
3
+ import { connectionLost } from './locks.js';
4
+ import { fenceLive } from './lost.js';
5
+ import { cachedModels, revoked, settleModels } from './models.js';
6
+ import { refuse } from './refusal.js';
7
+ import { moveTo, recoverReads, rest, SERVICE_MODE_TOPIC, show, transferring } from './shown.js';
8
+ import { applyRoom, changeAuthority, countAuthorityChange, finishOpening, loadRoom, OPENING_LANE, reload, resynchronize, sync, } from './sync.js';
9
+ const CONVERSATION_LANE = 'conversations';
10
+ function closing(runtime, opened) {
11
+ const { store, socket } = runtime;
12
+ return socket.lanes.task(OPENING_LANE, async (live) => {
13
+ if (!live())
14
+ return;
15
+ const local = await store.open();
16
+ if (!opened && !socket.isOpen())
17
+ await cachedModels(runtime, local);
18
+ await rest(runtime, null, live);
19
+ });
20
+ }
21
+ function closedSocket(runtime, lapsed, lost, opened) {
22
+ const { socket, conversations } = runtime;
23
+ const { session } = socket;
24
+ socket.notifyReady();
25
+ socket.rooms.unreadied();
26
+ connectionLost(runtime);
27
+ if (lost)
28
+ conversations.lost();
29
+ if (lapsed) {
30
+ void refuse(runtime, 'revoked-authorization');
31
+ return;
32
+ }
33
+ session.set({ complete: false });
34
+ const { streamed, moving } = session.now();
35
+ if (streamed !== null)
36
+ streamed.complete = false;
37
+ moveTo(runtime, {
38
+ ...moving,
39
+ state: moving.state === 'synced' ? 'syncing' : moving.state,
40
+ providerUnreachable: moving.providerUnreachable || (!opened && lost),
41
+ });
42
+ void closing(runtime, opened);
43
+ }
44
+ function owedReloads(runtime, expired, held) {
45
+ const { store, socket } = runtime;
46
+ const reloading = socket.rooms
47
+ .discoveredRooms()
48
+ .filter((room) => !expired.includes(room.locator) && revoked(held.get(room.locator)?.record.model))
49
+ .map((room) => room.locator);
50
+ for (const locator of reloading)
51
+ catching(store, locator);
52
+ recoverReads(runtime);
53
+ return reloading;
54
+ }
55
+ async function reloadNow(runtime, replacing, progress, held, installing) {
56
+ const { store, socket } = runtime;
57
+ const { rooms, lanes } = socket;
58
+ const discovered = rooms.discoveredRooms();
59
+ const reloaded = discovered.filter((room) => held.has(room.locator) && !installing.has(room.locator) && replacing(room));
60
+ const acquired = discovered.filter((room) => (!held.has(room.locator) || installing.has(room.locator)) &&
61
+ room.replica.admission === 'admitted' &&
62
+ replacing(room));
63
+ for (const room of reloaded)
64
+ rooms.stand(room.locator, { reloadDue: true });
65
+ try {
66
+ const local = await store.open();
67
+ const kept = acquired.length === 0 ? new Set() : (await local.held()).staged;
68
+ for (const room of reloaded) {
69
+ void lanes
70
+ .roomTask(room.locator, (live) => reload(runtime, room, local, progress, live))
71
+ .then(() => rest(runtime, progress));
72
+ }
73
+ for (const room of acquired) {
74
+ const unheld = installing.has(room.locator) ? undefined : { staged: kept.has(room.locator) };
75
+ void lanes
76
+ .roomTask(room.locator, (live) => loadRoom(runtime, room, local, progress, live, unheld))
77
+ .then(() => rest(runtime, progress));
78
+ }
79
+ }
80
+ catch {
81
+ for (const room of reloaded)
82
+ rooms.stand(room.locator, { reloadDue: false });
83
+ progress.reachable = false;
84
+ }
85
+ }
86
+ function caughtUpRooms(runtime, expired) {
87
+ const { store, socket } = runtime;
88
+ const { session } = socket;
89
+ const progress = session.now().underway;
90
+ session.set({ underway: null });
91
+ socket.named();
92
+ const cycle = progress ?? { complete: true, reachable: true };
93
+ replaced(store, expired);
94
+ const installing = store.installs.underway();
95
+ const held = progress === null ? store.rooms(expired) : store.rooms();
96
+ const reloading = progress === null
97
+ ? Promise.resolve([])
98
+ : held.then((stored) => owedReloads(runtime, expired, stored));
99
+ const replacing = Promise.all([held, reloading]).then(([stored, owed]) => reloadNow(runtime, (room) => expired.includes(room.locator) || owed.includes(room.locator), cycle, stored, installing));
100
+ return socket.lanes.task(OPENING_LANE, async (live) => {
101
+ if (!live())
102
+ return;
103
+ if (progress === null) {
104
+ await replacing;
105
+ await rest(runtime, cycle, live);
106
+ return;
107
+ }
108
+ try {
109
+ const local = await store.open();
110
+ await replacing;
111
+ if (progress.reachable) {
112
+ const stored = await held;
113
+ const owed = await reloading;
114
+ await settleModels(runtime, socket.rooms
115
+ .discoveredRooms()
116
+ .filter((room) => stored.has(room.locator) &&
117
+ !expired.includes(room.locator) &&
118
+ !owed.includes(room.locator)), 'current', local);
119
+ }
120
+ }
121
+ catch {
122
+ progress.complete = false;
123
+ progress.reachable = false;
124
+ }
125
+ if (live())
126
+ await finishOpening(runtime, progress, live);
127
+ });
128
+ }
129
+ function signalled(runtime, mode) {
130
+ const { store, socket, journal } = runtime;
131
+ const { session } = socket;
132
+ const { closed, serviceMode, haltedRefusal, openSignals } = session.now();
133
+ if (closed)
134
+ return;
135
+ if (mode === 'open')
136
+ session.set({ openSignals: openSignals + 1 });
137
+ const releasing = mode === 'open' && (haltedRefusal || serviceMode === 'write-halted');
138
+ if (mode === 'open')
139
+ session.set({ haltedRefusal: false });
140
+ if (mode !== serviceMode) {
141
+ session.set({ serviceMode: mode });
142
+ store.readiness.queue();
143
+ journal.record(`service mode ${mode}`);
144
+ store.tell(SERVICE_MODE_TOPIC, mode);
145
+ }
146
+ if (releasing)
147
+ submitAll(runtime);
148
+ }
149
+ async function runCurrency(runtime, live) {
150
+ const { socket, conversations } = runtime;
151
+ const { session } = socket;
152
+ if (session.now().currencyQueued === socket.generation())
153
+ session.set({ currencyQueued: null });
154
+ if (!live())
155
+ return;
156
+ await conversations.reconcile();
157
+ if (conversations.current()) {
158
+ show(runtime);
159
+ return;
160
+ }
161
+ const progress = {
162
+ complete: false,
163
+ reachable: !session.now().moving.providerUnreachable,
164
+ };
165
+ moveTo(runtime, transferring(runtime));
166
+ try {
167
+ await conversations.catchUp(progress);
168
+ }
169
+ catch {
170
+ progress.reachable = false;
171
+ }
172
+ await rest(runtime, progress, live);
173
+ }
174
+ export function scheduleCurrency(runtime) {
175
+ const { socket } = runtime;
176
+ const { session } = socket;
177
+ if (session.now().currencyQueued === socket.generation() || socket.closed() || socket.stopping())
178
+ return;
179
+ session.set({ currencyQueued: socket.generation() });
180
+ void socket.lanes.task(CONVERSATION_LANE, (live) => runCurrency(runtime, live));
181
+ }
182
+ export function spaceFreed(runtime) {
183
+ const { store, socket, journal } = runtime;
184
+ socket.rooms.standAll({ unpreparable: false });
185
+ journal.record('space freed');
186
+ store.readiness.queue();
187
+ const { closed, authorization } = socket.session.now();
188
+ if (closed || authorization === undefined)
189
+ return;
190
+ if (!socket.streamed)
191
+ void sync(runtime, 'unstreamed', null);
192
+ else
193
+ void resynchronize(runtime);
194
+ }
195
+ export function close({ store, socket, conversations, recovery, liveQueries, figures }) {
196
+ if (socket.closed())
197
+ return;
198
+ socket.close();
199
+ conversations.close();
200
+ void recovery.retire();
201
+ liveQueries.close();
202
+ figures.close();
203
+ store.close();
204
+ }
205
+ export async function stop(runtime) {
206
+ const { store, socket, recovery } = runtime;
207
+ socket.session.set({ stopping: true });
208
+ socket.rooms.unreadied();
209
+ socket.stopReads();
210
+ await recovery.retire();
211
+ await socket.lanes.finished();
212
+ await store.written();
213
+ close(runtime);
214
+ }
215
+ export function start(runtime, signal) {
216
+ const { store, socket, conversations, lastAnswers, recovery } = runtime;
217
+ const closeRuntime = () => close(runtime);
218
+ socket.observeServiceMode((mode) => signalled(runtime, mode));
219
+ socket.observeConversations((event) => {
220
+ if (event.kind === 'list' || event.kind === 'listed' || event.kind === 'unlisted')
221
+ store.readiness.queue();
222
+ conversations.receive(event);
223
+ if (event.kind !== 'gap' || conversations.current())
224
+ return;
225
+ show(runtime);
226
+ scheduleCurrency(runtime);
227
+ });
228
+ signal?.addEventListener('abort', closeRuntime, { once: true });
229
+ if (signal?.aborted)
230
+ closeRuntime();
231
+ socket.observe((event) => {
232
+ if (event.kind === 'opened') {
233
+ socket.rooms.connectionLive();
234
+ conversations.reopened();
235
+ lastAnswers.reopened();
236
+ recovery.resume();
237
+ }
238
+ else if (event.kind === 'discovered') {
239
+ if (event.missed)
240
+ countAuthorityChange(runtime);
241
+ void sync(runtime, 'opened', event.discovery);
242
+ }
243
+ else if (event.kind === 'closed') {
244
+ closedSocket(runtime, event.revoked, event.lost, event.opened);
245
+ }
246
+ else if (event.kind === 'caught-up')
247
+ void caughtUpRooms(runtime, event.expired);
248
+ else if (event.kind === 'authority-changed') {
249
+ if (socket.isAnnounced() && socket.isOpen())
250
+ fenceLive(runtime, event.left);
251
+ void changeAuthority(runtime, event);
252
+ }
253
+ else
254
+ void applyRoom(runtime, event);
255
+ });
256
+ void store
257
+ .open()
258
+ .then(async (local) => {
259
+ if ((await local.facts()).capabilities.length > 0)
260
+ socket.readyFromStore();
261
+ })
262
+ .catch(() => {
263
+ socket.readyFromStore();
264
+ });
265
+ if (!socket.streamed)
266
+ void sync(runtime, 'unstreamed', null);
267
+ }
@@ -0,0 +1,53 @@
1
+ import type { HeldRooms } from '@agentshouse/mdmodel';
2
+ import type { DiscoveredRoom, HeldRoom, OperationScopes, ProviderRefusal, ReplicaAdmission } from './adapter.js';
3
+ import type { Composition } from './collection.js';
4
+ import { type ModelState, type TypesResult } from './model.js';
5
+ import { type PortReach } from './reach.js';
6
+ import type { ReplicaRecord } from './replica.js';
7
+ import type { Runtime } from './runtime.js';
8
+ import type { RoomDeclaration } from './socket.js';
9
+ import type { Stored } from './store.js';
10
+ export type AppTypedSelection = {
11
+ roots: readonly string[];
12
+ model: TypesResult;
13
+ };
14
+ export type AppRoom = {
15
+ name: string;
16
+ locator: string;
17
+ handle: string;
18
+ operations: OperationScopes;
19
+ replica: ReplicaAdmission;
20
+ model: TypesResult;
21
+ typedSelection: AppTypedSelection | null;
22
+ providerOwnedPaths: readonly string[];
23
+ roomVersion: string | null;
24
+ documents: number;
25
+ synchronizationAvailable: boolean;
26
+ refusal: ProviderRefusal | null;
27
+ locked: boolean;
28
+ };
29
+ type ListedRoom = Omit<AppRoom, 'documents' | 'locked'>;
30
+ type ListedEntry = ListedRoom & {
31
+ readonly documents: number;
32
+ };
33
+ export type Listing = ReadonlyMap<string, ListedEntry>;
34
+ export declare function modelIn({ socket }: Runtime, locator: string, stored: Stored | undefined): ModelState;
35
+ export declare function compositionFor(runtime: Runtime, record: ReplicaRecord): Composition;
36
+ export declare function declarationOf({ socket }: Runtime, locator: string, stored: Stored | undefined): {
37
+ readonly room: RoomDeclaration;
38
+ readonly available: boolean;
39
+ } | undefined;
40
+ export declare function listedLocators({ store, socket }: Runtime, held: ReadonlyMap<string, unknown>): string[];
41
+ export declare function patchedListing(runtime: Runtime, changed: ReadonlySet<string>): Promise<Listing | null>;
42
+ export declare function listingNow(runtime: Runtime): Promise<Listing>;
43
+ export declare function shownRooms(runtime: Runtime, listing: Listing): readonly AppRoom[];
44
+ export declare function roomFacts(runtime: Runtime, reach?: PortReach | null): Promise<HeldRooms>;
45
+ export declare function list({ store, socket }: Runtime, room: RoomDeclaration, synchronizationAvailable: boolean): void;
46
+ export declare function listHeld({ store, socket }: Runtime, locator: string): void;
47
+ export declare function admitted({ socket }: Runtime, room: RoomDeclaration): boolean;
48
+ export declare function readable(runtime: Runtime, room: DiscoveredRoom): void;
49
+ export declare function usable(runtime: Runtime, room: DiscoveredRoom): void;
50
+ export declare function heldRooms({ store }: Runtime, listed: readonly DiscoveredRoom[]): Promise<HeldRoom[]>;
51
+ export declare function name(runtime: Runtime, locator: string): Promise<void>;
52
+ export {};
53
+ //# sourceMappingURL=listing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listing.d.ts","sourceRoot":"","sources":["../src/listing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ import { modelTypes, NO_MODEL } from './model.js';
2
+ import { governs, holds } from './reach.js';
3
+ export function modelIn({ socket }, locator, stored) {
4
+ if (socket.session.now().refusal?.code === 'revoked-authorization')
5
+ return { status: 'unavailable', reason: 'revoked' };
6
+ return stored?.record.model ?? socket.rooms.standing(locator).unheldModel ?? NO_MODEL;
7
+ }
8
+ export function compositionFor(runtime, record) {
9
+ return runtime.store.composed({
10
+ ...record,
11
+ model: modelIn(runtime, record.locator, { record, indexed: true, documents: 0 }),
12
+ });
13
+ }
14
+ export function declarationOf({ socket }, locator, stored) {
15
+ const held = socket.rooms.declared(locator);
16
+ const room = stored?.record ?? held?.room ?? socket.rooms.discovered(locator);
17
+ return room === undefined ? undefined : { room, available: held?.available ?? true };
18
+ }
19
+ export function listedLocators({ store, socket }, held) {
20
+ const declared = socket.rooms.declarations();
21
+ return [
22
+ ...declared.keys(),
23
+ ...[...held.keys()].filter((locator) => !declared.has(locator)),
24
+ ].filter((locator) => !store.fences.has(locator));
25
+ }
26
+ function selectionModel({ socket, builtIn }) {
27
+ return socket.session.now().refusal?.code === 'revoked-authorization'
28
+ ? { status: 'unavailable', reason: 'revoked' }
29
+ : builtIn;
30
+ }
31
+ function listedRoom(runtime, locator, stored) {
32
+ const declaration = declarationOf(runtime, locator, stored);
33
+ if (declaration === undefined)
34
+ return undefined;
35
+ const { room, available } = declaration;
36
+ const selection = room.typedSelection ?? null;
37
+ return {
38
+ name: room.name,
39
+ locator,
40
+ handle: room.handle,
41
+ operations: room.operations,
42
+ replica: room.replica,
43
+ model: modelTypes(modelIn(runtime, locator, stored)),
44
+ typedSelection: selection === null
45
+ ? null
46
+ : { roots: selection.roots, model: modelTypes(selectionModel(runtime)) },
47
+ providerOwnedPaths: room.providerOwnedPaths,
48
+ roomVersion: stored?.record.roomVersion ?? null,
49
+ synchronizationAvailable: available,
50
+ refusal: runtime.socket.rooms.standing(locator).refusal,
51
+ documents: stored?.documents ?? 0,
52
+ };
53
+ }
54
+ function listingOf(runtime, held) {
55
+ const listing = new Map();
56
+ for (const locator of listedLocators(runtime, held)) {
57
+ const room = listedRoom(runtime, locator, held.get(locator));
58
+ if (room !== undefined)
59
+ listing.set(locator, room);
60
+ }
61
+ return listing;
62
+ }
63
+ export async function patchedListing(runtime, changed) {
64
+ const { store } = runtime;
65
+ const { roomsShown } = store.device.now();
66
+ if (roomsShown === null)
67
+ return null;
68
+ const held = await store.rooms([...changed]);
69
+ const listing = new Map(roomsShown);
70
+ for (const locator of changed) {
71
+ const room = store.fences.has(locator)
72
+ ? undefined
73
+ : listedRoom(runtime, locator, held.get(locator));
74
+ if (room === undefined || !listing.has(locator))
75
+ return null;
76
+ listing.set(locator, room);
77
+ }
78
+ return listing;
79
+ }
80
+ export async function listingNow(runtime) {
81
+ return listingOf(runtime, await runtime.store.rooms());
82
+ }
83
+ function lockedIn({ socket }, listing, locator) {
84
+ return (listing.get(locator)?.replica.offline === 'locked' && !socket.rooms.standing(locator).confirmed);
85
+ }
86
+ export function shownRooms(runtime, listing) {
87
+ return structuredClone([...listing.values()].map(({ documents, ...room }) => lockedIn(runtime, listing, room.locator)
88
+ ? {
89
+ ...room,
90
+ model: modelTypes(NO_MODEL),
91
+ typedSelection: null,
92
+ documents: 0,
93
+ locked: true,
94
+ }
95
+ : { ...room, documents, locked: false }));
96
+ }
97
+ export async function roomFacts(runtime, reach = null) {
98
+ const { store, socket, builtIn } = runtime;
99
+ const held = await store.rooms();
100
+ const rooms = [...listingOf(runtime, held).values()]
101
+ .filter((room) => holds(reach, room.locator))
102
+ .map((room) => {
103
+ const governed = governs(reach, room);
104
+ const attached = [
105
+ ...(governed.collection ? [modelIn(runtime, room.locator, held.get(room.locator))] : []),
106
+ ...(governed.selection ? [builtIn] : []),
107
+ ];
108
+ return {
109
+ locator: room.locator,
110
+ available: attached.every((model) => model.status !== 'unavailable'),
111
+ types: attached.flatMap((model) => model.status === 'unavailable' ? [] : Object.values(model.types)),
112
+ };
113
+ });
114
+ return { listed: socket.session.now().roomsListed, rooms };
115
+ }
116
+ export function list({ store, socket }, room, synchronizationAvailable) {
117
+ if (store.fences.has(room.locator))
118
+ return;
119
+ socket.rooms.declare(room.locator, {
120
+ room: {
121
+ name: room.name,
122
+ locator: room.locator,
123
+ handle: room.handle,
124
+ operations: room.operations,
125
+ replica: room.replica,
126
+ typedSelection: room.typedSelection ?? null,
127
+ providerOwnedPaths: room.providerOwnedPaths,
128
+ },
129
+ available: synchronizationAvailable,
130
+ });
131
+ }
132
+ export function listHeld({ store, socket }, locator) {
133
+ if (store.fences.has(locator))
134
+ return;
135
+ socket.rooms.declare(locator, { room: null, available: false });
136
+ }
137
+ export function admitted({ socket }, room) {
138
+ return room.replica.admission === 'admitted' && !socket.rooms.standing(room.locator).unreadable;
139
+ }
140
+ export function readable(runtime, room) {
141
+ runtime.socket.rooms.stand(room.locator, { unreadable: false });
142
+ list(runtime, room, true);
143
+ }
144
+ export function usable(runtime, room) {
145
+ const { rooms } = runtime.socket;
146
+ rooms.stand(room.locator, { stale: false, unpreparable: false });
147
+ if (rooms.standing(room.locator).unreadable) {
148
+ rooms.stand(room.locator, { unreadable: false, refusal: null });
149
+ }
150
+ list(runtime, room, true);
151
+ }
152
+ export async function heldRooms({ store }, listed) {
153
+ const stored = await store.rooms(listed.map((room) => room.locator));
154
+ return listed.flatMap((room) => {
155
+ const record = stored.get(room.locator)?.record;
156
+ if (record === undefined) {
157
+ return room.replica.admission === 'admitted'
158
+ ? [{ locator: room.locator, roomVersion: null }]
159
+ : [];
160
+ }
161
+ if (record.replica.selection !== room.replica.selection)
162
+ return [];
163
+ return [{ locator: room.locator, roomVersion: record.roomVersion }];
164
+ });
165
+ }
166
+ export async function name(runtime, locator) {
167
+ const { socket } = runtime;
168
+ const room = socket.rooms.discovered(locator);
169
+ if (!socket.streamed || room === undefined || !socket.isOpen() || !socket.isHanded())
170
+ return;
171
+ const [held] = await heldRooms(runtime, [room]);
172
+ if (held === undefined || !socket.isOpen() || !socket.isHanded())
173
+ return;
174
+ socket.name(held);
175
+ }
package/dist/live.d.ts ADDED
@@ -0,0 +1,23 @@
1
+ import type { ChangeSet } from './change-set.js';
2
+ import { type KeyedResult, type QueryMessage } from './observation.js';
3
+ import type { PendingResult, Plan, QueryCoverage } from './query.js';
4
+ import type { Fail } from './reach.js';
5
+ import type { QueryRoom } from './tables.js';
6
+ export type Cover = {
7
+ coverage: QueryCoverage;
8
+ rooms: readonly QueryRoom[];
9
+ } | PendingResult;
10
+ export type Ran = KeyedResult & {
11
+ readonly current: () => boolean;
12
+ };
13
+ export type Run = (plan: Plan, cover: () => Promise<Cover>) => Promise<Ran>;
14
+ type Listener = (message: QueryMessage) => void;
15
+ export type LiveQueries<H> = {
16
+ touched(set: ChangeSet): void;
17
+ recover(): void;
18
+ watch(plan: Plan, identity: string, cover: (held: H) => Cover, deliver: Listener, failed: Fail): () => void;
19
+ close(): void;
20
+ };
21
+ export declare function createLiveQueries<H>(run: Run, holding: () => Promise<H>): LiveQueries<H>;
22
+ export {};
23
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC;AAE7F,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAE5E,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAchD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,EACzB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,IAAI,GACX,MAAM,IAAI,CAAC;IACd,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAmCF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CA4HxF"}