@agentshouse/mdruntime 0.1.0-cedb03eaa48b6 → 0.1.0-cedd665dffa4c

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 (395) hide show
  1. package/README.md +24 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +173 -125
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +6 -10
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +35 -41
  16. package/dist/binary.d.ts +0 -5
  17. package/dist/binary.d.ts.map +1 -1
  18. package/dist/binary.js +1 -1
  19. package/dist/bootstrap.d.ts +30 -11
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +309 -113
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/chain.d.ts +12 -0
  26. package/dist/chain.d.ts.map +1 -0
  27. package/dist/chain.js +64 -0
  28. package/dist/change-set.d.ts +13 -16
  29. package/dist/change-set.d.ts.map +1 -1
  30. package/dist/change-set.js +17 -89
  31. package/dist/change.d.ts +36 -1
  32. package/dist/change.d.ts.map +1 -1
  33. package/dist/change.js +17 -3
  34. package/dist/chat-types.d.ts +3 -0
  35. package/dist/chat-types.d.ts.map +1 -0
  36. package/dist/chat-types.js +11 -0
  37. package/dist/client.d.ts +37 -26
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +113 -23
  40. package/dist/collection.d.ts +32 -21
  41. package/dist/collection.d.ts.map +1 -1
  42. package/dist/collection.js +53 -318
  43. package/dist/compile.d.ts +18 -0
  44. package/dist/compile.d.ts.map +1 -0
  45. package/dist/compile.js +723 -0
  46. package/dist/connection.d.ts +7 -137
  47. package/dist/connection.d.ts.map +1 -1
  48. package/dist/connection.js +110 -3602
  49. package/dist/context.d.ts +2 -0
  50. package/dist/context.d.ts.map +1 -0
  51. package/dist/{chat/context.js → context.js} +2 -5
  52. package/dist/conversation-live.d.ts +150 -0
  53. package/dist/conversation-live.d.ts.map +1 -0
  54. package/dist/conversation-live.js +259 -0
  55. package/dist/conversation-row.d.ts +40 -0
  56. package/dist/conversation-row.d.ts.map +1 -0
  57. package/dist/conversation-row.js +66 -0
  58. package/dist/conversation.d.ts +75 -49
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +1029 -806
  61. package/dist/declaration.d.ts +10 -0
  62. package/dist/declaration.d.ts.map +1 -0
  63. package/dist/declaration.js +24 -0
  64. package/dist/digest.d.ts +7 -0
  65. package/dist/digest.d.ts.map +1 -0
  66. package/dist/digest.js +113 -0
  67. package/dist/discovery.d.ts +10 -0
  68. package/dist/discovery.d.ts.map +1 -0
  69. package/dist/discovery.js +150 -0
  70. package/dist/durability.d.ts +20 -4
  71. package/dist/durability.d.ts.map +1 -1
  72. package/dist/durability.js +9 -0
  73. package/dist/entry.d.ts +5 -2
  74. package/dist/entry.d.ts.map +1 -1
  75. package/dist/entry.js +33 -29
  76. package/dist/expectation.d.ts +26 -13
  77. package/dist/expectation.d.ts.map +1 -1
  78. package/dist/expectation.js +72 -19
  79. package/dist/failure.d.ts +3 -0
  80. package/dist/failure.d.ts.map +1 -1
  81. package/dist/failure.js +6 -0
  82. package/dist/figures.d.ts +49 -0
  83. package/dist/figures.d.ts.map +1 -0
  84. package/dist/figures.js +199 -0
  85. package/dist/file.d.ts +2 -19
  86. package/dist/file.d.ts.map +1 -1
  87. package/dist/file.js +8 -122
  88. package/dist/holdings.d.ts +29 -0
  89. package/dist/holdings.d.ts.map +1 -0
  90. package/dist/holdings.js +95 -0
  91. package/dist/host.d.ts +21 -8
  92. package/dist/host.d.ts.map +1 -1
  93. package/dist/host.js +119 -51
  94. package/dist/identity.d.ts +0 -2
  95. package/dist/identity.d.ts.map +1 -1
  96. package/dist/identity.js +0 -6
  97. package/dist/index.d.ts +41 -16
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +19 -4
  100. package/dist/install.d.ts +60 -0
  101. package/dist/install.d.ts.map +1 -0
  102. package/dist/install.js +537 -0
  103. package/dist/lifecycle.d.ts +7 -0
  104. package/dist/lifecycle.d.ts.map +1 -0
  105. package/dist/lifecycle.js +278 -0
  106. package/dist/listing.d.ts +52 -0
  107. package/dist/listing.d.ts.map +1 -0
  108. package/dist/listing.js +152 -0
  109. package/dist/live.d.ts +25 -0
  110. package/dist/live.d.ts.map +1 -0
  111. package/dist/live.js +206 -0
  112. package/dist/loaded.d.ts +5 -0
  113. package/dist/loaded.d.ts.map +1 -0
  114. package/dist/loaded.js +40 -0
  115. package/dist/locks.d.ts +7 -0
  116. package/dist/locks.d.ts.map +1 -0
  117. package/dist/locks.js +32 -0
  118. package/dist/lost.d.ts +5 -0
  119. package/dist/lost.d.ts.map +1 -0
  120. package/dist/lost.js +49 -0
  121. package/dist/media.d.ts +13 -0
  122. package/dist/media.d.ts.map +1 -0
  123. package/dist/media.js +269 -0
  124. package/dist/memory.d.ts +19 -7
  125. package/dist/memory.d.ts.map +1 -1
  126. package/dist/memory.js +281 -118
  127. package/dist/messages.d.ts +58 -0
  128. package/dist/messages.d.ts.map +1 -0
  129. package/dist/messages.js +162 -0
  130. package/dist/model.d.ts +8 -11
  131. package/dist/model.d.ts.map +1 -1
  132. package/dist/model.js +6 -23
  133. package/dist/models.d.ts +10 -0
  134. package/dist/models.d.ts.map +1 -0
  135. package/dist/models.js +153 -0
  136. package/dist/name.d.ts +4 -0
  137. package/dist/name.d.ts.map +1 -0
  138. package/dist/name.js +122 -0
  139. package/dist/observation.d.ts +38 -10
  140. package/dist/observation.d.ts.map +1 -1
  141. package/dist/observation.js +232 -44
  142. package/dist/opened.d.ts +22 -0
  143. package/dist/opened.d.ts.map +1 -0
  144. package/dist/opened.js +107 -0
  145. package/dist/opening.d.ts +4 -0
  146. package/dist/opening.d.ts.map +1 -0
  147. package/dist/opening.js +53 -0
  148. package/dist/outcome.d.ts +51 -9
  149. package/dist/outcome.d.ts.map +1 -1
  150. package/dist/outcome.js +62 -2
  151. package/dist/overlay.d.ts +8 -6
  152. package/dist/overlay.d.ts.map +1 -1
  153. package/dist/overlay.js +121 -182
  154. package/dist/page-metadata.d.ts +8 -0
  155. package/dist/page-metadata.d.ts.map +1 -0
  156. package/dist/page-metadata.js +19 -0
  157. package/dist/parts.d.ts +4 -0
  158. package/dist/parts.d.ts.map +1 -0
  159. package/dist/parts.js +13 -0
  160. package/dist/paths.d.ts +2 -0
  161. package/dist/paths.d.ts.map +1 -1
  162. package/dist/paths.js +26 -0
  163. package/dist/preparation.d.ts +41 -0
  164. package/dist/preparation.d.ts.map +1 -0
  165. package/dist/preparation.js +314 -0
  166. package/dist/presence.d.ts +58 -0
  167. package/dist/presence.d.ts.map +1 -0
  168. package/dist/presence.js +231 -0
  169. package/dist/queries.d.ts +16 -0
  170. package/dist/queries.d.ts.map +1 -0
  171. package/dist/queries.js +308 -0
  172. package/dist/query.d.ts +21 -207
  173. package/dist/query.d.ts.map +1 -1
  174. package/dist/query.js +3 -493
  175. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -7
  176. package/dist/questions.d.ts.map +1 -0
  177. package/dist/{chat/questions.js → questions.js} +11 -7
  178. package/dist/queue.d.ts +40 -0
  179. package/dist/queue.d.ts.map +1 -0
  180. package/dist/queue.js +480 -0
  181. package/dist/reach.d.ts +21 -11
  182. package/dist/reach.d.ts.map +1 -1
  183. package/dist/reach.js +342 -112
  184. package/dist/react.d.ts +17 -3
  185. package/dist/react.d.ts.map +1 -1
  186. package/dist/react.js +33 -1
  187. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  188. package/dist/read.d.ts.map +1 -0
  189. package/dist/{chat/read.js → read.js} +4 -0
  190. package/dist/readiness.d.ts +22 -20
  191. package/dist/readiness.d.ts.map +1 -1
  192. package/dist/readiness.js +5 -13
  193. package/dist/reads.d.ts +38 -10
  194. package/dist/reads.d.ts.map +1 -1
  195. package/dist/reads.js +163 -83
  196. package/dist/recovery.d.ts +5 -2
  197. package/dist/recovery.d.ts.map +1 -1
  198. package/dist/recovery.js +65 -8
  199. package/dist/refresh.d.ts +18 -15
  200. package/dist/refresh.d.ts.map +1 -1
  201. package/dist/refresh.js +145 -60
  202. package/dist/refusal.d.ts +5 -0
  203. package/dist/refusal.d.ts.map +1 -0
  204. package/dist/refusal.js +55 -0
  205. package/dist/replica.d.ts +49 -36
  206. package/dist/replica.d.ts.map +1 -1
  207. package/dist/replica.js +322 -198
  208. package/dist/retried.d.ts +30 -0
  209. package/dist/retried.d.ts.map +1 -0
  210. package/dist/retried.js +72 -0
  211. package/dist/room-draft.d.ts +55 -13
  212. package/dist/room-draft.d.ts.map +1 -1
  213. package/dist/room-draft.js +416 -122
  214. package/dist/room-drafts.d.ts +24 -0
  215. package/dist/room-drafts.d.ts.map +1 -0
  216. package/dist/room-drafts.js +220 -0
  217. package/dist/rows.d.ts +32 -31
  218. package/dist/rows.d.ts.map +1 -1
  219. package/dist/rows.js +59 -124
  220. package/dist/runtime.d.ts +34 -0
  221. package/dist/runtime.d.ts.map +1 -0
  222. package/dist/runtime.js +1 -0
  223. package/dist/save.d.ts +43 -49
  224. package/dist/save.d.ts.map +1 -1
  225. package/dist/save.js +736 -302
  226. package/dist/saves.d.ts +32 -0
  227. package/dist/saves.d.ts.map +1 -0
  228. package/dist/saves.js +426 -0
  229. package/dist/search.d.ts +12 -95
  230. package/dist/search.d.ts.map +1 -1
  231. package/dist/search.js +10 -266
  232. package/dist/seed.d.ts +11 -2
  233. package/dist/seed.d.ts.map +1 -1
  234. package/dist/seed.js +71 -1
  235. package/dist/shared.d.ts +6 -7
  236. package/dist/shared.d.ts.map +1 -1
  237. package/dist/shared.js +75 -104
  238. package/dist/shown.d.ts +33 -0
  239. package/dist/shown.d.ts.map +1 -0
  240. package/dist/shown.js +309 -0
  241. package/dist/socket/admission.d.ts +7 -0
  242. package/dist/socket/admission.d.ts.map +1 -0
  243. package/dist/socket/admission.js +39 -0
  244. package/dist/socket/answers.d.ts +6 -0
  245. package/dist/socket/answers.d.ts.map +1 -0
  246. package/dist/socket/answers.js +20 -0
  247. package/dist/socket/lanes.d.ts +28 -0
  248. package/dist/socket/lanes.d.ts.map +1 -0
  249. package/dist/socket/lanes.js +103 -0
  250. package/dist/socket/reads.d.ts +10 -0
  251. package/dist/socket/reads.d.ts.map +1 -0
  252. package/dist/socket/reads.js +31 -0
  253. package/dist/socket/session.d.ts +38 -0
  254. package/dist/socket/session.d.ts.map +1 -0
  255. package/dist/socket/session.js +23 -0
  256. package/dist/socket.d.ts +67 -0
  257. package/dist/socket.d.ts.map +1 -0
  258. package/dist/socket.js +164 -0
  259. package/dist/source.d.ts +59 -0
  260. package/dist/source.d.ts.map +1 -0
  261. package/dist/source.js +93 -0
  262. package/dist/status.d.ts +4 -5
  263. package/dist/status.d.ts.map +1 -1
  264. package/dist/status.js +3 -7
  265. package/dist/store/installs.d.ts +30 -0
  266. package/dist/store/installs.d.ts.map +1 -0
  267. package/dist/store/installs.js +40 -0
  268. package/dist/store/readiness.d.ts +11 -0
  269. package/dist/store/readiness.d.ts.map +1 -0
  270. package/dist/store/readiness.js +68 -0
  271. package/dist/store/records.d.ts +217 -0
  272. package/dist/store/records.d.ts.map +1 -0
  273. package/dist/store/records.js +464 -0
  274. package/dist/store/room-held.d.ts +8 -0
  275. package/dist/store/room-held.d.ts.map +1 -0
  276. package/dist/store/room-held.js +17 -0
  277. package/dist/store/rooms-shown.d.ts +8 -0
  278. package/dist/store/rooms-shown.d.ts.map +1 -0
  279. package/dist/store/rooms-shown.js +13 -0
  280. package/dist/store/space.d.ts +11 -0
  281. package/dist/store/space.d.ts.map +1 -0
  282. package/dist/store/space.js +41 -0
  283. package/dist/store/watchers.d.ts +17 -0
  284. package/dist/store/watchers.d.ts.map +1 -0
  285. package/dist/store/watchers.js +56 -0
  286. package/dist/store/writes.d.ts +24 -0
  287. package/dist/store/writes.d.ts.map +1 -0
  288. package/dist/store/writes.js +125 -0
  289. package/dist/store.d.ts +114 -163
  290. package/dist/store.d.ts.map +1 -1
  291. package/dist/store.js +163 -750
  292. package/dist/stored.d.ts +167 -0
  293. package/dist/stored.d.ts.map +1 -0
  294. package/dist/stored.js +703 -0
  295. package/dist/surface.d.ts +89 -0
  296. package/dist/surface.d.ts.map +1 -0
  297. package/dist/surface.js +222 -0
  298. package/dist/sync.d.ts +19 -0
  299. package/dist/sync.d.ts.map +1 -0
  300. package/dist/sync.js +535 -0
  301. package/dist/tables.d.ts +419 -0
  302. package/dist/tables.d.ts.map +1 -0
  303. package/dist/tables.js +758 -0
  304. package/dist/tallies.d.ts +18 -0
  305. package/dist/tallies.d.ts.map +1 -0
  306. package/dist/tallies.js +128 -0
  307. package/dist/transfer.d.ts +0 -5
  308. package/dist/transfer.d.ts.map +1 -1
  309. package/dist/turn.d.ts +4 -2
  310. package/dist/turn.d.ts.map +1 -1
  311. package/dist/turn.js +46 -22
  312. package/dist/validation.d.ts +29 -0
  313. package/dist/validation.d.ts.map +1 -0
  314. package/dist/validation.js +98 -0
  315. package/dist/windows.d.ts +1 -16
  316. package/dist/windows.d.ts.map +1 -1
  317. package/dist/windows.js +2 -79
  318. package/dist/wire.d.ts +74 -9
  319. package/dist/wire.d.ts.map +1 -1
  320. package/dist/wire.js +26 -6
  321. package/package.json +19 -19
  322. package/AGENTS.md +0 -305
  323. package/dist/attempt.d.ts +0 -16
  324. package/dist/attempt.d.ts.map +0 -1
  325. package/dist/attempt.js +0 -70
  326. package/dist/chat/acts.d.ts +0 -33
  327. package/dist/chat/acts.d.ts.map +0 -1
  328. package/dist/chat/acts.js +0 -36
  329. package/dist/chat/context.d.ts +0 -3
  330. package/dist/chat/context.d.ts.map +0 -1
  331. package/dist/chat/earlier.d.ts +0 -10
  332. package/dist/chat/earlier.d.ts.map +0 -1
  333. package/dist/chat/earlier.js +0 -54
  334. package/dist/chat/input.d.ts +0 -9
  335. package/dist/chat/input.d.ts.map +0 -1
  336. package/dist/chat/input.js +0 -99
  337. package/dist/chat/kit.d.ts +0 -61
  338. package/dist/chat/kit.d.ts.map +0 -1
  339. package/dist/chat/kit.js +0 -123
  340. package/dist/chat/lasting.d.ts +0 -6
  341. package/dist/chat/lasting.d.ts.map +0 -1
  342. package/dist/chat/lasting.js +0 -19
  343. package/dist/chat/list.d.ts +0 -27
  344. package/dist/chat/list.d.ts.map +0 -1
  345. package/dist/chat/list.js +0 -99
  346. package/dist/chat/markdown.d.ts +0 -20
  347. package/dist/chat/markdown.d.ts.map +0 -1
  348. package/dist/chat/markdown.js +0 -188
  349. package/dist/chat/message.d.ts +0 -6
  350. package/dist/chat/message.d.ts.map +0 -1
  351. package/dist/chat/message.js +0 -192
  352. package/dist/chat/messages.d.ts +0 -22
  353. package/dist/chat/messages.d.ts.map +0 -1
  354. package/dist/chat/messages.js +0 -155
  355. package/dist/chat/name.d.ts +0 -6
  356. package/dist/chat/name.d.ts.map +0 -1
  357. package/dist/chat/name.js +0 -37
  358. package/dist/chat/opened.d.ts +0 -11
  359. package/dist/chat/opened.d.ts.map +0 -1
  360. package/dist/chat/opened.js +0 -17
  361. package/dist/chat/overlay.d.ts +0 -31
  362. package/dist/chat/overlay.d.ts.map +0 -1
  363. package/dist/chat/overlay.js +0 -97
  364. package/dist/chat/parts.d.ts +0 -57
  365. package/dist/chat/parts.d.ts.map +0 -1
  366. package/dist/chat/parts.js +0 -119
  367. package/dist/chat/process.d.ts +0 -20
  368. package/dist/chat/process.d.ts.map +0 -1
  369. package/dist/chat/process.js +0 -32
  370. package/dist/chat/provider.d.ts +0 -63
  371. package/dist/chat/provider.d.ts.map +0 -1
  372. package/dist/chat/provider.js +0 -628
  373. package/dist/chat/question.d.ts +0 -9
  374. package/dist/chat/question.d.ts.map +0 -1
  375. package/dist/chat/question.js +0 -69
  376. package/dist/chat/questions.d.ts.map +0 -1
  377. package/dist/chat/read.d.ts.map +0 -1
  378. package/dist/chat/ready.d.ts +0 -34
  379. package/dist/chat/ready.d.ts.map +0 -1
  380. package/dist/chat/ready.js +0 -91
  381. package/dist/chat/style.d.ts +0 -4
  382. package/dist/chat/style.d.ts.map +0 -1
  383. package/dist/chat/style.js +0 -302
  384. package/dist/chat.d.ts +0 -14
  385. package/dist/chat.d.ts.map +0 -1
  386. package/dist/chat.js +0 -8
  387. package/dist/fence.d.ts +0 -6
  388. package/dist/fence.d.ts.map +0 -1
  389. package/dist/fence.js +0 -10
  390. package/dist/log.d.ts +0 -5
  391. package/dist/log.d.ts.map +0 -1
  392. package/dist/log.js +0 -14
  393. package/dist/read-side.d.ts +0 -27
  394. package/dist/read-side.d.ts.map +0 -1
  395. package/dist/read-side.js +0 -824
@@ -0,0 +1,231 @@
1
+ export function lockingMode(mode) {
2
+ return mode === 'locked';
3
+ }
4
+ const UNANSWERED = {
5
+ stale: false,
6
+ repairable: null,
7
+ repairing: false,
8
+ reloadDue: false,
9
+ refusal: null,
10
+ unreading: false,
11
+ unreadable: false,
12
+ unheldModel: null,
13
+ confirmed: false,
14
+ };
15
+ // A Room that locks offline stays readable this long after the connection drops, so a laptop waking or changing network keeps working while a disconnected device locks soon after.
16
+ const LOCK_GRACE_MS = 120_000;
17
+ export function createPresence(notReadyWaitMs) {
18
+ const listed = new Map();
19
+ const lockable = new Set();
20
+ let listings = 0;
21
+ const answered = new Map();
22
+ const marks = new Map();
23
+ const lastLost = new Map();
24
+ const unready = new Map();
25
+ let lossCount = 0;
26
+ let lockGrace = null;
27
+ function answer(locator) {
28
+ return answered.get(locator) ?? UNANSWERED;
29
+ }
30
+ function change(locator, next) {
31
+ answered.set(locator, { ...answer(locator), ...next });
32
+ }
33
+ function heard(locator, next) {
34
+ if (!marks.has(locator))
35
+ change(locator, next);
36
+ }
37
+ function readied(locator) {
38
+ const held = unready.get(locator);
39
+ if (held === undefined)
40
+ return;
41
+ if (held.timer !== null)
42
+ clearTimeout(held.timer);
43
+ unready.delete(locator);
44
+ }
45
+ function stopAsking(locator) {
46
+ for (const held of locator === undefined ? [...unready.keys()] : [locator])
47
+ readied(held);
48
+ }
49
+ function connectionLive() {
50
+ if (lockGrace !== null)
51
+ clearTimeout(lockGrace);
52
+ lockGrace = null;
53
+ }
54
+ function readable(locator) {
55
+ const { unreadable, unreading } = answer(locator);
56
+ if (!unreadable || marks.has(locator))
57
+ return false;
58
+ change(locator, {
59
+ unreadable: false,
60
+ ...(unreading ? { refusal: null, unreading: false } : {}),
61
+ });
62
+ return true;
63
+ }
64
+ function locks(locator, mode) {
65
+ return lockingMode(mode) && !answer(locator).confirmed && !marks.has(locator);
66
+ }
67
+ function liftable(locator, discovery) {
68
+ const mark = marks.get(locator);
69
+ return mark === undefined || mark.during < discovery;
70
+ }
71
+ return {
72
+ list(found, { whole, live }) {
73
+ listings += 1;
74
+ const kept = found.filter(({ locator }) => !marks.has(locator));
75
+ if (whole) {
76
+ listed.clear();
77
+ lockable.clear();
78
+ }
79
+ for (const room of kept) {
80
+ listed.set(room.locator, room);
81
+ if (lockingMode(room.replica.offline))
82
+ lockable.add(room.locator);
83
+ else
84
+ lockable.delete(room.locator);
85
+ change(room.locator, {
86
+ refusal: null,
87
+ unreading: false,
88
+ ...(live && room.replica.admission === 'admitted' ? { confirmed: true } : {}),
89
+ });
90
+ }
91
+ return kept;
92
+ },
93
+ room: (locator) => listed.get(locator),
94
+ rooms: () => [...listed.values()],
95
+ available(locator, selection) {
96
+ if (marks.has(locator))
97
+ return false;
98
+ const room = listed.get(locator);
99
+ if (room === undefined)
100
+ return true;
101
+ return ((selection === undefined || selection === room.replica.selection) &&
102
+ room.replica.admission === 'admitted' &&
103
+ !answer(locator).unreadable);
104
+ },
105
+ refusal: (locator) => answer(locator).refusal,
106
+ unheldModel: (locator) => answer(locator).unheldModel,
107
+ refused(locator, refusal) {
108
+ if (refusal === null) {
109
+ heard(locator, { unreadable: true });
110
+ return;
111
+ }
112
+ const unreading = refusal.scope !== 'operation' && refusal.scope !== 'model';
113
+ heard(locator, {
114
+ refusal: { code: refusal.code, fields: refusal.fields, retryable: refusal.retryable },
115
+ unreading,
116
+ ...(unreading ? { unreadable: true } : {}),
117
+ });
118
+ },
119
+ readable,
120
+ modelled(locator, model) {
121
+ heard(locator, { unheldModel: model });
122
+ },
123
+ installed(locator, bootstrapped) {
124
+ if (marks.has(locator))
125
+ return;
126
+ if (bootstrapped) {
127
+ readied(locator);
128
+ change(locator, { unheldModel: null });
129
+ }
130
+ change(locator, { stale: false });
131
+ readable(locator);
132
+ },
133
+ async locked(locator, stored) {
134
+ if (marks.has(locator) || answer(locator).confirmed)
135
+ return false;
136
+ return locks(locator, (await stored()) ?? listed.get(locator)?.replica.offline);
137
+ },
138
+ lockedAs: locks,
139
+ lockedAmong(stored, locking) {
140
+ return [...new Set([...lockable, ...locking])]
141
+ .filter((locator) => locks(locator, stored.get(locator)?.offline ?? listed.get(locator)?.replica.offline))
142
+ .sort();
143
+ },
144
+ connectionLost(lapsed) {
145
+ if (lockGrace !== null)
146
+ return;
147
+ lockGrace = setTimeout(() => {
148
+ lockGrace = null;
149
+ lapsed();
150
+ }, LOCK_GRACE_MS);
151
+ },
152
+ connectionLive,
153
+ lapse() {
154
+ for (const [locator, held] of answered) {
155
+ if (held.confirmed)
156
+ answered.set(locator, { ...held, confirmed: false });
157
+ }
158
+ },
159
+ stood(locator, stale, repairable) {
160
+ heard(locator, { stale, ...(repairable === undefined ? {} : { repairable }) });
161
+ },
162
+ repairing(locator, running) {
163
+ change(locator, { repairing: running });
164
+ },
165
+ reload(locator, due) {
166
+ change(locator, { reloadDue: due });
167
+ },
168
+ standing(locator) {
169
+ const { stale, repairable, repairing, reloadDue } = answer(locator);
170
+ return { stale, repairable, repairing, reloadDue };
171
+ },
172
+ settled: () => ![...answered].some(([locator, { stale }]) => stale && !marks.has(locator)),
173
+ repairsOwed: () => [...answered]
174
+ .filter(([locator, { stale, repairable }]) => stale && repairable !== null && !marks.has(locator))
175
+ .map(([locator]) => locator),
176
+ askAgain(locator, ask) {
177
+ const held = unready.get(locator) ?? { tries: 0, timer: null };
178
+ unready.set(locator, held);
179
+ if (held.timer !== null)
180
+ return;
181
+ const wait = notReadyWaitMs(held.tries);
182
+ held.tries += 1;
183
+ held.timer = setTimeout(() => {
184
+ held.timer = null;
185
+ ask();
186
+ }, wait);
187
+ },
188
+ stopAsking,
189
+ lose(locator, during) {
190
+ if (marks.has(locator))
191
+ return false;
192
+ marks.set(locator, { during, written: false });
193
+ lastLost.set(locator, ++lossCount);
194
+ listings += 1;
195
+ listed.delete(locator);
196
+ lockable.delete(locator);
197
+ readied(locator);
198
+ const { repairing, reloadDue } = answer(locator);
199
+ answered.set(locator, { ...UNANSWERED, repairing, reloadDue });
200
+ return true;
201
+ },
202
+ writing(locator) {
203
+ const mark = marks.get(locator);
204
+ if (mark === undefined || mark.written)
205
+ return false;
206
+ marks.set(locator, { ...mark, written: true });
207
+ return true;
208
+ },
209
+ unwritten(locator) {
210
+ const mark = marks.get(locator);
211
+ if (mark !== undefined)
212
+ marks.set(locator, { ...mark, written: false });
213
+ },
214
+ lost: (locator) => marks.has(locator),
215
+ losing: () => marks.size > 0,
216
+ listing: () => listings,
217
+ losses: () => lossCount,
218
+ lostSince: (locator, losses) => marks.has(locator) || (lastLost.get(locator) ?? 0) > losses,
219
+ liftable,
220
+ lift(locator, discovery, unfenced) {
221
+ const mark = marks.get(locator);
222
+ if (mark !== undefined && liftable(locator, discovery) && (unfenced || !mark.written)) {
223
+ marks.delete(locator);
224
+ }
225
+ },
226
+ close() {
227
+ stopAsking();
228
+ connectionLive();
229
+ },
230
+ };
231
+ }
@@ -0,0 +1,16 @@
1
+ import { type FiguresCover } from './figures.js';
2
+ import { type Cover, type Ran } from './live.js';
3
+ import { type Plan, type QueryResult } from './query.js';
4
+ import { type Deliver, type Fail, type PortReach } from './reach.js';
5
+ import type { Runtime } from './runtime.js';
6
+ import { type SearchResult } from './search.js';
7
+ import type { QueryRoom } from './store.js';
8
+ export declare function figuresCover(runtime: Runtime): Promise<FiguresCover>;
9
+ export declare function answeredPlan(runtime: Runtime, plan: Plan, cover: () => Promise<Cover>): Promise<Ran>;
10
+ export declare function rowsQuery(runtime: Runtime, plan: Plan): Promise<QueryResult>;
11
+ export declare function planned(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<Plan>;
12
+ export declare function roomTallies(runtime: Runtime, rooms: readonly QueryRoom[], since: string): Promise<readonly import("./tallies.ts").RoomTally[]>;
13
+ export declare function watchPlan(runtime: Runtime, plan: Plan, deliver: Deliver, fail: Fail): () => void;
14
+ export declare function watchPlanned(runtime: Runtime, planning: Promise<Plan>, deliver: Deliver, fail: Fail): () => void;
15
+ export declare function searched(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<SearchResult>;
16
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,EAAY,KAAK,KAAK,EAAE,KAAK,GAAG,EAAE,MAAM,WAAW,CAAC;AAK3D,OAAO,EAKL,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAa,SAAS,EAAgB,MAAM,YAAY,CAAC;AAiHrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AAoGD,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,GAAG,CAAC,CAQd;AAQD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAWlF;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,wDAO7F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAmBhG;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,IAAI,CAeZ;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
@@ -0,0 +1,308 @@
1
+ import { identityOf } from '@agentshouse/mdmodel';
2
+ import { ROOM_TOTALS } from './figures.js';
3
+ import { roomInFlight } from './install.js';
4
+ import { readerOf } from './live.js';
5
+ import { compositionFor, roomFacts } from './listing.js';
6
+ import { lockedRooms } from './locks.js';
7
+ import { OFFLINE, UNCERTAIN, failure } from './outcome.js';
8
+ import { connectionNow, prepare } from './preparation.js';
9
+ import { planWithin, } from './query.js';
10
+ import { planReach } from './reach.js';
11
+ import { refuse } from './refusal.js';
12
+ import { documentKey, roomsOfReach } from './rows.js';
13
+ import { searchPlanOf } from './search.js';
14
+ import { seedApplies, seededResult, watchSeeded } from './seed.js';
15
+ import { capped, MAXIMUM_WINDOW } from './windows.js';
16
+ const QUERY_BYTES = 1 << 20;
17
+ function everyRoom({ presence }, held) {
18
+ return [
19
+ ...new Set([
20
+ ...presence.rooms().map(({ locator }) => locator),
21
+ ...held.rooms.keys(),
22
+ ...held.queues.keys(),
23
+ ]),
24
+ ];
25
+ }
26
+ function anyHeld({ presence }, held, locator) {
27
+ return (presence.room(locator) !== undefined || held.rooms.has(locator) || held.queues.has(locator));
28
+ }
29
+ function anyRoom(plan) {
30
+ return plan.rooms === null && plan.reach === null;
31
+ }
32
+ function reaching(runtime, plan, reads, held) {
33
+ if (!anyRoom(plan))
34
+ return reads;
35
+ return (locator) => reads(locator) && anyHeld(runtime, held, locator);
36
+ }
37
+ function reachedRooms(runtime, plan, held) {
38
+ const named = plan.rooms ?? (plan.reach === null ? everyRoom(runtime, held) : roomsOfReach(plan.reach));
39
+ return [...new Set(named)].filter(reaching(runtime, plan, readerOf(plan), held)).sort();
40
+ }
41
+ function awaited({ socket, presence }, locator) {
42
+ return (!socket.session.now().roomsListed || presence.room(locator)?.replica.admission === 'admitted');
43
+ }
44
+ function awaitsOf(runtime, locator, held) {
45
+ const replica = held.rooms.get(locator);
46
+ if (replica === undefined)
47
+ return awaited(runtime, locator) ? 'acquisition' : null;
48
+ return replica.indexed ? null : 'preparation';
49
+ }
50
+ function coveredRooms(runtime, locators, whole, held) {
51
+ const { store, socket } = runtime;
52
+ if (locators.length === 0 && whole && !socket.session.now().roomsListed)
53
+ return { pending: [] };
54
+ const pending = [];
55
+ const coverage = [];
56
+ const overlay = [];
57
+ const read = [];
58
+ for (const locator of locators) {
59
+ const awaits = awaitsOf(runtime, locator, held);
60
+ if (awaits !== null)
61
+ pending.push({ room: locator, awaits });
62
+ const replica = held.rooms.get(locator);
63
+ if (awaits !== null || replica === undefined)
64
+ continue;
65
+ coverage.push({
66
+ room: locator,
67
+ generation: replica.transfer,
68
+ current: !roomInFlight(store, locator),
69
+ });
70
+ read.push({ locator, key: replica.key });
71
+ for (const id of held.queues.get(locator) ?? [])
72
+ overlay.push(id);
73
+ }
74
+ if (pending.length > 0)
75
+ return { pending };
76
+ return { coverage: { rooms: coverage, overlay }, rooms: read };
77
+ }
78
+ function covered(runtime, plan, held) {
79
+ return coveredRooms(runtime, reachedRooms(runtime, plan, held), anyRoom(plan), held);
80
+ }
81
+ function pendingAt(runtime, plan, reads, held, rooms) {
82
+ const reached = reaching(runtime, plan, reads, held);
83
+ const at = new Map();
84
+ for (const room of rooms) {
85
+ const awaits = reached(room) ? awaitsOf(runtime, room, held) : null;
86
+ at.set(room, awaits === null ? null : { room, awaits });
87
+ }
88
+ awaitPreparation(runtime, {
89
+ pending: [...at.values()].filter((room) => room !== null),
90
+ });
91
+ return at;
92
+ }
93
+ function awaitPreparation(runtime, cover) {
94
+ if (!('pending' in cover))
95
+ return;
96
+ const waiting = cover.pending.filter(({ awaits }) => awaits === 'preparation');
97
+ if (waiting.length > 0) {
98
+ prepare(runtime, waiting.map(({ room }) => room));
99
+ }
100
+ }
101
+ export async function figuresCover(runtime) {
102
+ const held = await runtime.store.covering();
103
+ const locked = await lockedRooms(runtime);
104
+ const cover = coveredRooms(runtime, everyRoom(runtime, held)
105
+ .filter((locator) => !locked.includes(locator))
106
+ .sort(), true, held);
107
+ awaitPreparation(runtime, cover);
108
+ return 'pending' in cover ? cover : { rooms: cover.rooms };
109
+ }
110
+ function sameCover(left, right) {
111
+ return JSON.stringify(left) === JSON.stringify(right);
112
+ }
113
+ async function windowRows(local, plan, rooms, unchanged) {
114
+ const first = await local.query(plan, rooms, QUERY_BYTES);
115
+ if (first.more === undefined || !('documents' in first)) {
116
+ const { more: _more, ...rows } = first;
117
+ return rows;
118
+ }
119
+ const documents = [...first.documents];
120
+ for (let more = first.more; more !== undefined;) {
121
+ if (!unchanged())
122
+ return null;
123
+ const page = await local.query({
124
+ ...plan,
125
+ after: { text: more, values: JSON.parse(more) },
126
+ limit: plan.limit === null ? null : plan.limit - documents.length,
127
+ total: false,
128
+ }, rooms, QUERY_BYTES);
129
+ if (!('documents' in page))
130
+ return null;
131
+ documents.push(...page.documents);
132
+ more = page.more;
133
+ if (more === undefined) {
134
+ return {
135
+ documents,
136
+ ...(page.next === undefined ? {} : { next: page.next }),
137
+ ...(first.total === undefined ? {} : { total: first.total }),
138
+ };
139
+ }
140
+ }
141
+ return null;
142
+ }
143
+ function freeTextAsked(plan) {
144
+ return plan.shape.kind === 'documents' && (plan.shape.sections !== null || plan.shape.preamble);
145
+ }
146
+ async function composedRooms(runtime, plan, rooms) {
147
+ if (!freeTextAsked(plan))
148
+ return rooms;
149
+ const held = await runtime.store.rooms(rooms.map(({ locator }) => locator));
150
+ return rooms.map((room) => {
151
+ const stored = held.get(room.locator);
152
+ return stored === undefined
153
+ ? room
154
+ : { ...room, composition: compositionFor(runtime, stored.record) };
155
+ });
156
+ }
157
+ async function coveredRows(runtime, plan, cover) {
158
+ const { store } = runtime;
159
+ for (;;) {
160
+ const before = await cover();
161
+ if ('pending' in before)
162
+ return { pending: before };
163
+ const local = await store.open();
164
+ const keys = before.rooms.map(({ key }) => key);
165
+ const changes = local.changes(keys);
166
+ const current = () => local.changes(keys) === changes;
167
+ const rows = await windowRows(local, plan, await composedRooms(runtime, plan, before.rooms), current);
168
+ const after = await cover();
169
+ if (rows !== null && sameCover(before, after))
170
+ return { rows, cover: before, current };
171
+ }
172
+ }
173
+ function keyedOf(rows, coverage) {
174
+ if ('groups' in rows) {
175
+ return {
176
+ result: { ...rows, coverage },
177
+ keys: rows.groups.map((group) => JSON.stringify(group.key)),
178
+ };
179
+ }
180
+ return {
181
+ result: { ...rows, coverage },
182
+ keys: rows.documents.map((document) => documentKey(document.room, document.path)),
183
+ };
184
+ }
185
+ export async function answeredPlan(runtime, plan, cover) {
186
+ const answered = await coveredRows(runtime, plan, cover);
187
+ if ('pending' in answered) {
188
+ const pending = answered.pending;
189
+ return { result: pending, keys: [], current: () => true };
190
+ }
191
+ const held = answered.cover;
192
+ return { ...keyedOf(answered.rows, held.coverage), current: answered.current };
193
+ }
194
+ async function coverNow(runtime, plan) {
195
+ const cover = covered(runtime, plan, await runtime.store.covering());
196
+ awaitPreparation(runtime, cover);
197
+ return cover;
198
+ }
199
+ export async function rowsQuery(runtime, plan) {
200
+ const held = await runtime.store.covering();
201
+ const before = covered(runtime, plan, held);
202
+ awaitPreparation(runtime, before);
203
+ const seeded = seedApplies(runtime, plan, held);
204
+ if (seeded !== null)
205
+ return seededResult(seeded).result;
206
+ if ('pending' in before)
207
+ return before;
208
+ const answered = await coveredRows(runtime, plan, () => coverNow(runtime, plan));
209
+ if ('pending' in answered)
210
+ return answered.pending;
211
+ const shownCover = answered.cover;
212
+ return { ...answered.rows, coverage: shownCover.coverage };
213
+ }
214
+ export async function planned(runtime, input, reach) {
215
+ const plan = planWithin(input, await roomFacts(runtime, reach), planReach(reach));
216
+ const named = plan.paths !== null &&
217
+ plan.rooms !== null &&
218
+ plan.paths.length * plan.rooms.length <= MAXIMUM_WINDOW;
219
+ return plan.limit === null && named ? plan : { ...plan, limit: capped(plan.limit) };
220
+ }
221
+ export async function roomTallies(runtime, rooms, since) {
222
+ return runtime.store.ask({
223
+ kind: 'replica.tallies',
224
+ totals: { ...(await planned(runtime, ROOM_TOTALS, null)), limit: null },
225
+ rooms,
226
+ since,
227
+ });
228
+ }
229
+ export function watchPlan(runtime, plan, deliver, fail) {
230
+ const reads = readerOf(plan);
231
+ return watchSeeded(runtime, plan, deliver, (behind, answered) => runtime.liveQueries.watch(plan, identityOf(plan), (held) => {
232
+ const cover = covered(runtime, plan, held);
233
+ awaitPreparation(runtime, cover);
234
+ return behind(cover, held);
235
+ }, (held, rooms) => runtime.store.seeds.of(plan.key) === undefined
236
+ ? pendingAt(runtime, plan, reads, held, rooms)
237
+ : null, answered, fail));
238
+ }
239
+ export function watchPlanned(runtime, planning, deliver, fail) {
240
+ let stop = null;
241
+ let stopped = false;
242
+ planning.then((plan) => {
243
+ if (!stopped)
244
+ stop = watchPlan(runtime, plan, deliver, fail);
245
+ }, (error) => {
246
+ if (!stopped)
247
+ fail(error);
248
+ });
249
+ return () => {
250
+ stopped = true;
251
+ stop?.();
252
+ };
253
+ }
254
+ export async function searched(runtime, input, reach) {
255
+ const { store, socket } = runtime;
256
+ const { session } = socket;
257
+ const asked = searchPlanOf(input);
258
+ await socket.ready;
259
+ const search = socket.search();
260
+ if (search === undefined) {
261
+ return {
262
+ kind: 'undeclared',
263
+ code: 'action-undeclared',
264
+ fields: { name: 'search' },
265
+ retryable: false,
266
+ };
267
+ }
268
+ if (socket.closed() ||
269
+ session.now().refusal !== null ||
270
+ (await connectionNow(runtime)) !== 'connected')
271
+ return OFFLINE;
272
+ const reached = reach === null ? null : new Set(reach.rooms);
273
+ const named = asked.rooms === null
274
+ ? reached === null
275
+ ? null
276
+ : [...reached]
277
+ : asked.rooms.filter((room) => reached === null || reached.has(room));
278
+ const held = named === null ? null : await store.rooms(named);
279
+ const rooms = named === null ? null : named.filter((room) => held.has(room)).sort();
280
+ if (rooms !== null && rooms.length === 0)
281
+ return { kind: 'found', documents: [] };
282
+ try {
283
+ await socket.authorize();
284
+ }
285
+ catch {
286
+ return UNCERTAIN;
287
+ }
288
+ const { closed, authorization, refusal } = session.now();
289
+ if (closed || authorization === undefined || refusal !== null)
290
+ return UNCERTAIN;
291
+ try {
292
+ const result = await search(authorization, { text: asked.text, rooms });
293
+ if (result.kind === 'revoked-authorization')
294
+ await refuse(runtime, 'revoked-authorization');
295
+ if (result.kind === 'rejected')
296
+ return result;
297
+ if (result.kind !== 'found')
298
+ return failure(result);
299
+ const kept = rooms === null ? null : new Set(rooms);
300
+ return {
301
+ kind: 'found',
302
+ documents: result.documents.filter((hit) => kept === null || kept.has(hit.room)),
303
+ };
304
+ }
305
+ catch {
306
+ return UNCERTAIN;
307
+ }
308
+ }