@agentshouse/mdruntime 0.1.0-cdf82f77fae68 → 0.1.0-ce06b735d6c6d

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 (383) 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 +187 -97
  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 +31 -11
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +311 -89
  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 -14
  29. package/dist/change-set.d.ts.map +1 -1
  30. package/dist/change-set.js +17 -63
  31. package/dist/change.d.ts +32 -1
  32. package/dist/change.d.ts.map +1 -1
  33. package/dist/change.js +14 -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 +48 -29
  38. package/dist/client.d.ts.map +1 -1
  39. package/dist/client.js +131 -28
  40. package/dist/collection.d.ts +31 -9
  41. package/dist/collection.d.ts.map +1 -1
  42. package/dist/collection.js +49 -80
  43. package/dist/compile.d.ts +18 -0
  44. package/dist/compile.d.ts.map +1 -0
  45. package/dist/compile.js +724 -0
  46. package/dist/connection.d.ts +8 -116
  47. package/dist/connection.d.ts.map +1 -1
  48. package/dist/connection.js +112 -2412
  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} +1 -4
  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 +35 -0
  56. package/dist/conversation-row.d.ts.map +1 -0
  57. package/dist/conversation-row.js +55 -0
  58. package/dist/conversation.d.ts +82 -45
  59. package/dist/conversation.d.ts.map +1 -1
  60. package/dist/conversation.js +1116 -584
  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 +23 -1
  71. package/dist/durability.d.ts.map +1 -1
  72. package/dist/durability.js +9 -0
  73. package/dist/entry.d.ts +20 -0
  74. package/dist/entry.d.ts.map +1 -0
  75. package/dist/entry.js +161 -0
  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 +29 -4
  92. package/dist/host.d.ts.map +1 -1
  93. package/dist/host.js +177 -27
  94. package/dist/index.d.ts +41 -13
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +19 -2
  97. package/dist/install.d.ts +60 -0
  98. package/dist/install.d.ts.map +1 -0
  99. package/dist/install.js +537 -0
  100. package/dist/lifecycle.d.ts +7 -0
  101. package/dist/lifecycle.d.ts.map +1 -0
  102. package/dist/lifecycle.js +278 -0
  103. package/dist/listing.d.ts +52 -0
  104. package/dist/listing.d.ts.map +1 -0
  105. package/dist/listing.js +152 -0
  106. package/dist/live.d.ts +25 -0
  107. package/dist/live.d.ts.map +1 -0
  108. package/dist/live.js +206 -0
  109. package/dist/locks.d.ts +7 -0
  110. package/dist/locks.d.ts.map +1 -0
  111. package/dist/locks.js +32 -0
  112. package/dist/lost.d.ts +5 -0
  113. package/dist/lost.d.ts.map +1 -0
  114. package/dist/lost.js +49 -0
  115. package/dist/media.d.ts +8 -0
  116. package/dist/media.d.ts.map +1 -0
  117. package/dist/media.js +215 -0
  118. package/dist/memory.d.ts +24 -6
  119. package/dist/memory.d.ts.map +1 -1
  120. package/dist/memory.js +291 -101
  121. package/dist/messages.d.ts +58 -0
  122. package/dist/messages.d.ts.map +1 -0
  123. package/dist/messages.js +162 -0
  124. package/dist/model.d.ts +11 -12
  125. package/dist/model.d.ts.map +1 -1
  126. package/dist/model.js +7 -15
  127. package/dist/models.d.ts +10 -0
  128. package/dist/models.d.ts.map +1 -0
  129. package/dist/models.js +153 -0
  130. package/dist/name.d.ts +4 -0
  131. package/dist/name.d.ts.map +1 -0
  132. package/dist/name.js +122 -0
  133. package/dist/observation.d.ts +42 -9
  134. package/dist/observation.d.ts.map +1 -1
  135. package/dist/observation.js +238 -33
  136. package/dist/opened.d.ts +22 -0
  137. package/dist/opened.d.ts.map +1 -0
  138. package/dist/opened.js +107 -0
  139. package/dist/opening.d.ts +4 -0
  140. package/dist/opening.d.ts.map +1 -0
  141. package/dist/opening.js +53 -0
  142. package/dist/outcome.d.ts +60 -8
  143. package/dist/outcome.d.ts.map +1 -1
  144. package/dist/outcome.js +64 -0
  145. package/dist/overlay.d.ts +8 -4
  146. package/dist/overlay.d.ts.map +1 -1
  147. package/dist/overlay.js +136 -192
  148. package/dist/page-metadata.d.ts +8 -0
  149. package/dist/page-metadata.d.ts.map +1 -0
  150. package/dist/page-metadata.js +19 -0
  151. package/dist/parts.d.ts +4 -0
  152. package/dist/parts.d.ts.map +1 -0
  153. package/dist/parts.js +13 -0
  154. package/dist/paths.d.ts +2 -0
  155. package/dist/paths.d.ts.map +1 -1
  156. package/dist/paths.js +26 -0
  157. package/dist/preparation.d.ts +41 -0
  158. package/dist/preparation.d.ts.map +1 -0
  159. package/dist/preparation.js +314 -0
  160. package/dist/presence.d.ts +58 -0
  161. package/dist/presence.d.ts.map +1 -0
  162. package/dist/presence.js +233 -0
  163. package/dist/queries.d.ts +16 -0
  164. package/dist/queries.d.ts.map +1 -0
  165. package/dist/queries.js +308 -0
  166. package/dist/query.d.ts +49 -183
  167. package/dist/query.d.ts.map +1 -1
  168. package/dist/query.js +3 -464
  169. package/dist/{chat/questions.d.ts → questions.d.ts} +5 -7
  170. package/dist/questions.d.ts.map +1 -0
  171. package/dist/{chat/questions.js → questions.js} +11 -7
  172. package/dist/queue.d.ts +40 -0
  173. package/dist/queue.d.ts.map +1 -0
  174. package/dist/queue.js +450 -0
  175. package/dist/reach.d.ts +20 -7
  176. package/dist/reach.d.ts.map +1 -1
  177. package/dist/reach.js +353 -98
  178. package/dist/react.d.ts +23 -7
  179. package/dist/react.d.ts.map +1 -1
  180. package/dist/react.js +40 -18
  181. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  182. package/dist/read.d.ts.map +1 -0
  183. package/dist/{chat/read.js → read.js} +4 -0
  184. package/dist/readiness.d.ts +55 -0
  185. package/dist/readiness.d.ts.map +1 -0
  186. package/dist/readiness.js +25 -0
  187. package/dist/reads.d.ts +39 -0
  188. package/dist/reads.d.ts.map +1 -0
  189. package/dist/reads.js +178 -0
  190. package/dist/recovery.d.ts +28 -0
  191. package/dist/recovery.d.ts.map +1 -0
  192. package/dist/recovery.js +254 -0
  193. package/dist/refresh.d.ts +17 -14
  194. package/dist/refresh.d.ts.map +1 -1
  195. package/dist/refresh.js +145 -53
  196. package/dist/refusal.d.ts +5 -0
  197. package/dist/refusal.d.ts.map +1 -0
  198. package/dist/refusal.js +55 -0
  199. package/dist/replica.d.ts +50 -33
  200. package/dist/replica.d.ts.map +1 -1
  201. package/dist/replica.js +339 -162
  202. package/dist/retried.d.ts +30 -0
  203. package/dist/retried.d.ts.map +1 -0
  204. package/dist/retried.js +72 -0
  205. package/dist/room-draft.d.ts +39 -10
  206. package/dist/room-draft.d.ts.map +1 -1
  207. package/dist/room-draft.js +196 -120
  208. package/dist/room-drafts.d.ts +24 -0
  209. package/dist/room-drafts.d.ts.map +1 -0
  210. package/dist/room-drafts.js +217 -0
  211. package/dist/rows.d.ts +31 -37
  212. package/dist/rows.d.ts.map +1 -1
  213. package/dist/rows.js +60 -128
  214. package/dist/runtime.d.ts +34 -0
  215. package/dist/runtime.d.ts.map +1 -0
  216. package/dist/runtime.js +1 -0
  217. package/dist/save.d.ts +42 -43
  218. package/dist/save.d.ts.map +1 -1
  219. package/dist/save.js +800 -259
  220. package/dist/saves.d.ts +32 -0
  221. package/dist/saves.d.ts.map +1 -0
  222. package/dist/saves.js +410 -0
  223. package/dist/search.d.ts +15 -55
  224. package/dist/search.d.ts.map +1 -1
  225. package/dist/search.js +10 -121
  226. package/dist/seed.d.ts +25 -0
  227. package/dist/seed.d.ts.map +1 -0
  228. package/dist/seed.js +145 -0
  229. package/dist/shared.d.ts +10 -0
  230. package/dist/shared.d.ts.map +1 -0
  231. package/dist/shared.js +339 -0
  232. package/dist/shown.d.ts +33 -0
  233. package/dist/shown.d.ts.map +1 -0
  234. package/dist/shown.js +309 -0
  235. package/dist/socket/admission.d.ts +7 -0
  236. package/dist/socket/admission.d.ts.map +1 -0
  237. package/dist/socket/admission.js +39 -0
  238. package/dist/socket/answers.d.ts +6 -0
  239. package/dist/socket/answers.d.ts.map +1 -0
  240. package/dist/socket/answers.js +20 -0
  241. package/dist/socket/lanes.d.ts +28 -0
  242. package/dist/socket/lanes.d.ts.map +1 -0
  243. package/dist/socket/lanes.js +103 -0
  244. package/dist/socket/reads.d.ts +10 -0
  245. package/dist/socket/reads.d.ts.map +1 -0
  246. package/dist/socket/reads.js +31 -0
  247. package/dist/socket/session.d.ts +38 -0
  248. package/dist/socket/session.d.ts.map +1 -0
  249. package/dist/socket/session.js +23 -0
  250. package/dist/socket.d.ts +67 -0
  251. package/dist/socket.d.ts.map +1 -0
  252. package/dist/socket.js +164 -0
  253. package/dist/source.d.ts +54 -0
  254. package/dist/source.d.ts.map +1 -0
  255. package/dist/source.js +82 -0
  256. package/dist/status.d.ts +5 -2
  257. package/dist/status.d.ts.map +1 -1
  258. package/dist/status.js +3 -7
  259. package/dist/store/installs.d.ts +30 -0
  260. package/dist/store/installs.d.ts.map +1 -0
  261. package/dist/store/installs.js +40 -0
  262. package/dist/store/readiness.d.ts +11 -0
  263. package/dist/store/readiness.d.ts.map +1 -0
  264. package/dist/store/readiness.js +68 -0
  265. package/dist/store/records.d.ts +217 -0
  266. package/dist/store/records.d.ts.map +1 -0
  267. package/dist/store/records.js +464 -0
  268. package/dist/store/room-held.d.ts +8 -0
  269. package/dist/store/room-held.d.ts.map +1 -0
  270. package/dist/store/room-held.js +17 -0
  271. package/dist/store/rooms-shown.d.ts +8 -0
  272. package/dist/store/rooms-shown.d.ts.map +1 -0
  273. package/dist/store/rooms-shown.js +13 -0
  274. package/dist/store/space.d.ts +11 -0
  275. package/dist/store/space.d.ts.map +1 -0
  276. package/dist/store/space.js +41 -0
  277. package/dist/store/watchers.d.ts +17 -0
  278. package/dist/store/watchers.d.ts.map +1 -0
  279. package/dist/store/watchers.js +56 -0
  280. package/dist/store/writes.d.ts +24 -0
  281. package/dist/store/writes.d.ts.map +1 -0
  282. package/dist/store/writes.js +125 -0
  283. package/dist/store.d.ts +112 -117
  284. package/dist/store.d.ts.map +1 -1
  285. package/dist/store.js +165 -488
  286. package/dist/stored.d.ts +167 -0
  287. package/dist/stored.d.ts.map +1 -0
  288. package/dist/stored.js +703 -0
  289. package/dist/surface.d.ts +89 -0
  290. package/dist/surface.d.ts.map +1 -0
  291. package/dist/surface.js +222 -0
  292. package/dist/sync.d.ts +19 -0
  293. package/dist/sync.d.ts.map +1 -0
  294. package/dist/sync.js +535 -0
  295. package/dist/tables.d.ts +419 -0
  296. package/dist/tables.d.ts.map +1 -0
  297. package/dist/tables.js +758 -0
  298. package/dist/tallies.d.ts +18 -0
  299. package/dist/tallies.d.ts.map +1 -0
  300. package/dist/tallies.js +128 -0
  301. package/dist/transfer.d.ts +0 -5
  302. package/dist/transfer.d.ts.map +1 -1
  303. package/dist/turn.d.ts +9 -0
  304. package/dist/turn.d.ts.map +1 -0
  305. package/dist/turn.js +75 -0
  306. package/dist/validation.d.ts +29 -0
  307. package/dist/validation.d.ts.map +1 -0
  308. package/dist/validation.js +104 -0
  309. package/dist/windows.d.ts +11 -0
  310. package/dist/windows.d.ts.map +1 -0
  311. package/dist/windows.js +16 -0
  312. package/dist/wire.d.ts +221 -36
  313. package/dist/wire.d.ts.map +1 -1
  314. package/dist/wire.js +74 -33
  315. package/package.json +28 -24
  316. package/AGENTS.md +0 -318
  317. package/dist/attempt.d.ts +0 -16
  318. package/dist/attempt.d.ts.map +0 -1
  319. package/dist/attempt.js +0 -57
  320. package/dist/chat/acts.d.ts +0 -34
  321. package/dist/chat/acts.d.ts.map +0 -1
  322. package/dist/chat/acts.js +0 -36
  323. package/dist/chat/context.d.ts +0 -3
  324. package/dist/chat/context.d.ts.map +0 -1
  325. package/dist/chat/input.d.ts +0 -9
  326. package/dist/chat/input.d.ts.map +0 -1
  327. package/dist/chat/input.js +0 -99
  328. package/dist/chat/kit.d.ts +0 -60
  329. package/dist/chat/kit.d.ts.map +0 -1
  330. package/dist/chat/kit.js +0 -123
  331. package/dist/chat/lasting.d.ts +0 -6
  332. package/dist/chat/lasting.d.ts.map +0 -1
  333. package/dist/chat/lasting.js +0 -19
  334. package/dist/chat/list.d.ts +0 -20
  335. package/dist/chat/list.d.ts.map +0 -1
  336. package/dist/chat/list.js +0 -59
  337. package/dist/chat/markdown.d.ts +0 -19
  338. package/dist/chat/markdown.d.ts.map +0 -1
  339. package/dist/chat/markdown.js +0 -187
  340. package/dist/chat/message.d.ts +0 -6
  341. package/dist/chat/message.d.ts.map +0 -1
  342. package/dist/chat/message.js +0 -192
  343. package/dist/chat/messages.d.ts +0 -21
  344. package/dist/chat/messages.d.ts.map +0 -1
  345. package/dist/chat/messages.js +0 -151
  346. package/dist/chat/name.d.ts +0 -6
  347. package/dist/chat/name.d.ts.map +0 -1
  348. package/dist/chat/name.js +0 -37
  349. package/dist/chat/opened.d.ts +0 -11
  350. package/dist/chat/opened.d.ts.map +0 -1
  351. package/dist/chat/opened.js +0 -17
  352. package/dist/chat/overlay.d.ts +0 -31
  353. package/dist/chat/overlay.d.ts.map +0 -1
  354. package/dist/chat/overlay.js +0 -97
  355. package/dist/chat/parts.d.ts +0 -57
  356. package/dist/chat/parts.d.ts.map +0 -1
  357. package/dist/chat/parts.js +0 -119
  358. package/dist/chat/process.d.ts +0 -20
  359. package/dist/chat/process.d.ts.map +0 -1
  360. package/dist/chat/process.js +0 -32
  361. package/dist/chat/provider.d.ts +0 -63
  362. package/dist/chat/provider.d.ts.map +0 -1
  363. package/dist/chat/provider.js +0 -645
  364. package/dist/chat/question.d.ts +0 -9
  365. package/dist/chat/question.d.ts.map +0 -1
  366. package/dist/chat/question.js +0 -80
  367. package/dist/chat/questions.d.ts.map +0 -1
  368. package/dist/chat/read.d.ts.map +0 -1
  369. package/dist/chat/ready.d.ts +0 -33
  370. package/dist/chat/ready.d.ts.map +0 -1
  371. package/dist/chat/ready.js +0 -91
  372. package/dist/chat/style.d.ts +0 -4
  373. package/dist/chat/style.d.ts.map +0 -1
  374. package/dist/chat/style.js +0 -302
  375. package/dist/chat.d.ts +0 -14
  376. package/dist/chat.d.ts.map +0 -1
  377. package/dist/chat.js +0 -8
  378. package/dist/log.d.ts +0 -5
  379. package/dist/log.d.ts.map +0 -1
  380. package/dist/log.js +0 -14
  381. package/dist/read-side.d.ts +0 -18
  382. package/dist/read-side.d.ts.map +0 -1
  383. package/dist/read-side.js +0 -440
@@ -0,0 +1,41 @@
1
+ import { type InstallShare } from './install.js';
2
+ import { type ReadinessChange } from './observation.js';
3
+ import { type PortReach } from './reach.js';
4
+ import { type CodeAvailability, type ConnectionAvailability, type Readiness, type RoomCoverage } from './readiness.js';
5
+ import type { Runtime } from './runtime.js';
6
+ export type ReadinessPort = {
7
+ readonly target: string;
8
+ readonly code: CodeAvailability;
9
+ };
10
+ export type ReadinessMessage = Readiness | ReadinessChange;
11
+ export type ReadinessWatch = {
12
+ readonly port: ReadinessPort;
13
+ readonly reach: PortReach | null;
14
+ readonly deliver: (readiness: ReadinessMessage) => void;
15
+ };
16
+ type Share = InstallShare & {
17
+ readonly coverage: RoomCoverage;
18
+ };
19
+ type Totals = {
20
+ installing: number;
21
+ downloading: number;
22
+ acquiring: number;
23
+ unsettled: number;
24
+ done: number;
25
+ total: number;
26
+ };
27
+ export type ReadinessShowing = {
28
+ readonly listing: number;
29
+ readonly roomsListed: boolean;
30
+ readonly named: ReadonlySet<string> | null;
31
+ readonly rooms: Map<string, Share>;
32
+ readonly totals: Totals;
33
+ shown: string;
34
+ };
35
+ export declare function prepare(runtime: Runtime, locators?: readonly string[]): void;
36
+ export declare function connectionNow(runtime: Runtime): Promise<ConnectionAvailability>;
37
+ export declare function deliverOwedReadiness(runtime: Runtime, owed: readonly ReadinessWatch[], touched: ReadonlySet<string> | null): Promise<void>;
38
+ export declare function watchReadiness({ store }: Runtime, port: ReadinessPort, reach: PortReach | null, deliver: (readiness: ReadinessMessage) => void): () => void;
39
+ export declare function filled(runtime: Runtime): void;
40
+ export {};
41
+ //# sourceMappingURL=preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../src/preparation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgC,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE/E,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEd,KAAK,YAAY,EAElB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,eAAe,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,KAAK,KAAK,GAAG,YAAY,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC;AAEhE,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAwCF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,QA4BzE;AAuDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrF;AAkMD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,SAAS,cAAc,EAAE,EAC/B,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,iBAKpC;AAED,wBAAgB,cAAc,CAC5B,EAAE,KAAK,EAAE,EAAE,OAAO,EAClB,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,SAAS,GAAG,IAAI,EACvB,OAAO,EAAE,CAAC,SAAS,EAAE,gBAAgB,KAAK,IAAI,GAC7C,MAAM,IAAI,CAQZ;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,QAKtC"}
@@ -0,0 +1,314 @@
1
+ import { changeSet } from './change-set.js';
2
+ import { uncaught } from './failure.js';
3
+ import { installationOf, installShare } from './install.js';
4
+ import { listedLocators, listedOrHeld } from './listing.js';
5
+ import { keyedAt, keyedChange, unchanged, } from './observation.js';
6
+ import { planReach } from './reach.js';
7
+ import { COMPLETE_ROOMS, readinessOf, } from './readiness.js';
8
+ import { roomsOfReach } from './rows.js';
9
+ import { recoverReads } from './shown.js';
10
+ import { yielded } from './turn.js';
11
+ async function prepareReplica(runtime, locator) {
12
+ const { store, socket } = runtime;
13
+ for (;;) {
14
+ const held = (await store.rooms([locator])).get(locator);
15
+ if (held === undefined || socket.closed() || held.indexed)
16
+ return;
17
+ const key = held.record.key;
18
+ const done = await store.exclusive(async () => {
19
+ const local = await store.open();
20
+ return store.rederive(local, key, store.composed(held.record));
21
+ });
22
+ if (!done.done)
23
+ continue;
24
+ if ((await store.rooms([locator])).get(locator)?.record.key !== key)
25
+ continue;
26
+ store.changed(changeSet(locator, { documents: null }));
27
+ recoverReads(runtime, [locator]);
28
+ store.readiness.queue([locator]);
29
+ return;
30
+ }
31
+ }
32
+ async function unprepared({ store }) {
33
+ const held = (await store.covering()).rooms;
34
+ const { unpreparedDemand, unpreparable } = store.device.now();
35
+ return [...unpreparedDemand, ...held.keys()].find((locator) => !(held.get(locator)?.indexed ?? false) && !unpreparable.has(locator));
36
+ }
37
+ function unpreparedBy({ store }, locator) {
38
+ const { unpreparable } = store.device.now();
39
+ store.device.set({ unpreparable: new Set([...unpreparable, locator]) });
40
+ store.readiness.queue([locator]);
41
+ }
42
+ export function prepare(runtime, locators = []) {
43
+ const { store, socket } = runtime;
44
+ const { device } = store;
45
+ if (locators.length > 0) {
46
+ device.set({ unpreparedDemand: new Set([...device.now().unpreparedDemand, ...locators]) });
47
+ }
48
+ if (device.now().preparing)
49
+ return;
50
+ device.set({ preparing: true });
51
+ void (async () => {
52
+ try {
53
+ for (let waiting = await unprepared(runtime); waiting !== undefined; waiting = await unprepared(runtime)) {
54
+ await yielded();
55
+ if (socket.closed())
56
+ return;
57
+ const demand = new Set(device.now().unpreparedDemand);
58
+ demand.delete(waiting);
59
+ device.set({ unpreparedDemand: demand });
60
+ await prepareReplica(runtime, waiting).catch(() => unpreparedBy(runtime, waiting));
61
+ }
62
+ }
63
+ catch (error) {
64
+ uncaught(error);
65
+ }
66
+ finally {
67
+ device.set({ preparing: false });
68
+ }
69
+ })();
70
+ }
71
+ function requires(runtime, named, held, room) {
72
+ const listed = listedOrHeld(runtime, held, room);
73
+ if (named === null)
74
+ return listed;
75
+ return named.has(room) && (!runtime.socket.session.now().roomsListed || listed);
76
+ }
77
+ function requiredRooms(runtime, named, held) {
78
+ return [...(named ?? listedLocators(runtime, held))]
79
+ .filter((room) => requires(runtime, named, held, room))
80
+ .sort();
81
+ }
82
+ function roomState({ socket, presence }, locator, held) {
83
+ if (socket.session.now().roomsListed &&
84
+ (presence.room(locator) === undefined || !presence.available(locator)))
85
+ return 'unadmitted';
86
+ const stored = held.get(locator);
87
+ if (stored === undefined)
88
+ return 'acquiring';
89
+ if (!stored.indexed)
90
+ return 'preparing';
91
+ return 'complete';
92
+ }
93
+ function conversationCoverage({ socket, conversations }, reach) {
94
+ const declaredConversations = reach === null || reach.conversations;
95
+ if (!declaredConversations || socket.conversations() === undefined)
96
+ return 'undeclared';
97
+ if (!conversations.known() || !conversations.current())
98
+ return 'acquiring';
99
+ return 'complete';
100
+ }
101
+ function connectionOf({ socket }, lastCompleted) {
102
+ if (socket.isOpen())
103
+ return 'connected';
104
+ if (socket.session.now().moving.providerUnreachable)
105
+ return 'unreachable';
106
+ return !socket.streamed && lastCompleted !== null ? 'connected' : 'connecting';
107
+ }
108
+ export async function connectionNow(runtime) {
109
+ const { store, socket } = runtime;
110
+ if (socket.isOpen() || socket.session.now().moving.providerUnreachable || socket.streamed) {
111
+ return connectionOf(runtime, null);
112
+ }
113
+ return connectionOf(runtime, (await (await store.open()).facts(['lastCompleted'])).lastCompleted);
114
+ }
115
+ async function readinessHeld({ store }) {
116
+ const local = await store.open();
117
+ const [held, facts] = await Promise.all([
118
+ store.covering(),
119
+ local.facts(['lastCompleted', 'targets']),
120
+ ]);
121
+ return { held: held.rooms, facts };
122
+ }
123
+ function shareOf(runtime, room, held) {
124
+ const coverage = Object.freeze({ room, state: roomState(runtime, room, held) });
125
+ return { ...installShare(runtime.store, coverage, held), coverage };
126
+ }
127
+ function sameState(was, now) {
128
+ return was.coverage.state === now.coverage.state;
129
+ }
130
+ function coverageOf(change) {
131
+ return {
132
+ ...change,
133
+ changed: change.changed.map(([room, share]) => [room, share.coverage]),
134
+ };
135
+ }
136
+ function counted(totals, share, sign) {
137
+ const { state } = share.coverage;
138
+ totals.installing += share.installing ? sign : 0;
139
+ totals.downloading += share.downloading ? sign : 0;
140
+ totals.acquiring += state === 'acquiring' ? sign : 0;
141
+ totals.unsettled += COMPLETE_ROOMS.has(state) ? 0 : sign;
142
+ totals.done += sign * share.bytes.done;
143
+ totals.total += sign * share.bytes.total;
144
+ }
145
+ function showingOf(runtime, reach, held) {
146
+ const planned = planReach(reach);
147
+ const named = planned === null ? null : roomsOfReach(planned);
148
+ const totals = { installing: 0, downloading: 0, acquiring: 0, unsettled: 0, done: 0, total: 0 };
149
+ const rooms = new Map();
150
+ for (const room of requiredRooms(runtime, named, held)) {
151
+ const share = shareOf(runtime, room, held);
152
+ rooms.set(room, share);
153
+ counted(totals, share, 1);
154
+ }
155
+ return {
156
+ listing: runtime.presence.listing(),
157
+ roomsListed: runtime.socket.session.now().roomsListed,
158
+ named,
159
+ rooms,
160
+ totals,
161
+ shown: '',
162
+ };
163
+ }
164
+ function moved(runtime, showing, held, touched) {
165
+ const at = new Map();
166
+ for (const room of touched) {
167
+ at.set(room, requires(runtime, showing.named, held, room) ? shareOf(runtime, room, held) : null);
168
+ }
169
+ const change = keyedAt(showing.rooms, at, sameState);
170
+ if (change === null || change.removed.length > 0)
171
+ return null;
172
+ for (const [room, share] of at) {
173
+ if (share === null)
174
+ continue;
175
+ counted(showing.totals, showing.rooms.get(room), -1);
176
+ counted(showing.totals, share, 1);
177
+ showing.rooms.set(room, share);
178
+ }
179
+ return change;
180
+ }
181
+ function preparingIn(runtime, showing, rooms) {
182
+ const { unpreparable } = runtime.store.device.now();
183
+ const preparing = [...rooms].filter((room) => showing.rooms.get(room)?.coverage.state === 'preparing' && !unpreparable.has(room));
184
+ if (preparing.length > 0)
185
+ prepare(runtime, preparing);
186
+ }
187
+ function shownOf(runtime, { port, reach }, { named, totals }, { facts }) {
188
+ const { store, socket, usableWhenHeld } = runtime;
189
+ const { persistence, storageLoss, heldWhenOpened } = store.device.now();
190
+ const { roomsListed } = socket.session.now();
191
+ return readinessOf({
192
+ code: port.code,
193
+ coverage: {
194
+ listed: named === null ? roomsListed : roomsListed || totals.acquiring === 0,
195
+ unsettled: totals.unsettled,
196
+ conversations: conversationCoverage(runtime, reach),
197
+ },
198
+ persistence,
199
+ connection: connectionOf(runtime, facts.lastCompleted),
200
+ house: socket.session.now().refusal !== null
201
+ ? 'refused'
202
+ : socket.writesHeld()
203
+ ? 'write-halted'
204
+ : 'open',
205
+ space: store.space.full() ? 'full' : null,
206
+ installation: installationOf(totals.installing, totals.downloading, {
207
+ done: totals.done,
208
+ total: totals.total,
209
+ }),
210
+ lost: storageLoss !== null,
211
+ established: facts.targets[port.target]?.established === true ||
212
+ (heldWhenOpened && usableWhenHeld.includes(port.target)),
213
+ });
214
+ }
215
+ function establish(runtime, name) {
216
+ const { store } = runtime;
217
+ const { device } = store;
218
+ if (device.now().establishing.has(name))
219
+ return;
220
+ device.set({ establishing: new Set([...device.now().establishing, name]) });
221
+ void store
222
+ .durably(async (local) => {
223
+ const { targets } = await local.facts(['targets']);
224
+ await local.fact('targets', { ...targets, [name]: { established: true } });
225
+ })
226
+ .then(() => {
227
+ store.readiness.queue([]);
228
+ void probeEachMinute(runtime);
229
+ }, uncaught)
230
+ .finally(() => {
231
+ const establishing = new Set(device.now().establishing);
232
+ establishing.delete(name);
233
+ device.set({ establishing });
234
+ });
235
+ }
236
+ function deliverReadiness(runtime, watch, held, touched) {
237
+ const { readiness } = runtime.store;
238
+ if (!readiness.held(watch))
239
+ return;
240
+ const kept = readiness.kept(watch);
241
+ const patched = kept === undefined ||
242
+ touched === null ||
243
+ kept.listing !== runtime.presence.listing() ||
244
+ kept.roomsListed !== runtime.socket.session.now().roomsListed
245
+ ? null
246
+ : moved(runtime, kept, held.held, touched);
247
+ const showing = patched === null ? showingOf(runtime, watch.reach, held.held) : kept;
248
+ preparingIn(runtime, showing, patched === null ? showing.rooms.keys() : touched);
249
+ const shown = shownOf(runtime, watch, showing, held);
250
+ if (shown.ready && held.facts.targets[watch.port.target]?.established !== true) {
251
+ establish(runtime, watch.port.target);
252
+ }
253
+ const text = JSON.stringify(shown);
254
+ const before = kept?.shown;
255
+ showing.shown = text;
256
+ readiness.keep(watch, showing);
257
+ if (kept === undefined) {
258
+ watch.deliver({
259
+ ...shown,
260
+ coverage: {
261
+ ...shown.coverage,
262
+ rooms: [...showing.rooms.values()].map(({ coverage }) => coverage),
263
+ },
264
+ });
265
+ return;
266
+ }
267
+ const rooms = coverageOf(patched ??
268
+ keyedChange(kept.rooms, [...showing.rooms.keys()], [...showing.rooms.values()], sameState));
269
+ if (text === before && unchanged(rooms))
270
+ return;
271
+ watch.deliver({ shown, rooms });
272
+ }
273
+ export async function deliverOwedReadiness(runtime, owed, touched) {
274
+ const held = await readinessHeld(runtime);
275
+ if (runtime.socket.closed())
276
+ return;
277
+ for (const watch of owed)
278
+ deliverReadiness(runtime, watch, held, touched);
279
+ }
280
+ export function watchReadiness({ store }, port, reach, deliver) {
281
+ const watch = { port, reach, deliver };
282
+ const stop = store.readiness.add(watch);
283
+ void store.open().then(() => store.readiness.owe([watch]), () => store.readiness.owe([watch]));
284
+ return stop;
285
+ }
286
+ export function filled(runtime) {
287
+ const { store, socket } = runtime;
288
+ if (socket.closed() || !store.space.fill())
289
+ return;
290
+ store.readiness.queue([]);
291
+ void probeEachMinute(runtime);
292
+ }
293
+ async function installedTarget({ store }) {
294
+ if (store.device.now().heldWhenOpened)
295
+ return true;
296
+ const { targets } = await (await store.open()).facts(['targets']);
297
+ return Object.values(targets).some((target) => target.established);
298
+ }
299
+ async function probeEachMinute(runtime) {
300
+ const { store, socket } = runtime;
301
+ const { space } = store;
302
+ const idle = () => !space.full() || space.probing() || socket.closed();
303
+ if (idle())
304
+ return;
305
+ const installed = await installedTarget(runtime).catch((error) => {
306
+ uncaught(error);
307
+ return false;
308
+ });
309
+ if (!installed)
310
+ return;
311
+ if (idle())
312
+ return;
313
+ space.probeEachMinute();
314
+ }
@@ -0,0 +1,58 @@
1
+ import type { DiscoveredRoom, ProviderRefusal, ScopedRefusal } from './adapter.js';
2
+ import type { ModelState } from './model.js';
3
+ type Repairable = {
4
+ readonly reset: string | undefined;
5
+ };
6
+ type Standing = {
7
+ readonly stale: boolean;
8
+ readonly repairable: Repairable | null;
9
+ readonly repairing: boolean;
10
+ readonly reloadDue: boolean;
11
+ };
12
+ export declare function lockingMode(mode: string | undefined): boolean;
13
+ type Listing = {
14
+ readonly whole: boolean;
15
+ readonly live: boolean;
16
+ };
17
+ export type Presence = {
18
+ list(found: readonly DiscoveredRoom[], how: Listing): readonly DiscoveredRoom[];
19
+ room(locator: string): DiscoveredRoom | undefined;
20
+ rooms(): readonly DiscoveredRoom[];
21
+ available(locator: string, selection?: string): boolean;
22
+ refusal(locator: string): ProviderRefusal | null;
23
+ unheldModel(locator: string): ModelState | null;
24
+ refused(locator: string, refusal: ScopedRefusal | null): void;
25
+ readable(locator: string): boolean;
26
+ modelled(locator: string, model: ModelState | null): void;
27
+ installed(locator: string, bootstrapped: boolean): void;
28
+ locked(locator: string, stored: () => Promise<string | null>): Promise<boolean>;
29
+ lockedAmong(stored: ReadonlyMap<string, {
30
+ readonly offline: string;
31
+ }>, locking: ReadonlySet<string>): readonly string[];
32
+ lockedAs(locator: string, mode: string | undefined): boolean;
33
+ connectionLost(lapsed: () => void): void;
34
+ connectionLive(): void;
35
+ lapse(): void;
36
+ stood(locator: string, stale: boolean, repairable?: Repairable | null): void;
37
+ repairing(locator: string, running: boolean): void;
38
+ reload(locator: string, due: boolean): void;
39
+ standing(locator: string): Standing;
40
+ settled(): boolean;
41
+ repairsOwed(): readonly string[];
42
+ askAgain(locator: string, ask: () => void): void;
43
+ stopAsking(locator?: string): void;
44
+ lose(locator: string, during: number): boolean;
45
+ writing(locator: string): boolean;
46
+ unwritten(locator: string): void;
47
+ lost(locator: string): boolean;
48
+ losing(): boolean;
49
+ listing(): number;
50
+ losses(): number;
51
+ lostSince(locator: string, losses: number): boolean;
52
+ liftable(locator: string, discovery: number): boolean;
53
+ lift(locator: string, discovery: number, unfenced: boolean): void;
54
+ close(): void;
55
+ };
56
+ export declare function createPresence(): Presence;
57
+ export {};
58
+ //# sourceMappingURL=presence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,KAAK,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEzD,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAUF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAE7D;AAgBD,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnE,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,SAAS,cAAc,EAAE,CAAC;IAChF,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;IAClD,KAAK,IAAI,SAAS,cAAc,EAAE,CAAC;IACnC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxD,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IACjD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,WAAW,CACT,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EACzD,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAC3B,SAAS,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAC7D,cAAc,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACzC,cAAc,IAAI,IAAI,CAAC;IACvB,KAAK,IAAI,IAAI,CAAC;IACd,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7E,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACnD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC;IACnB,WAAW,IAAI,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IACjD,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/B,MAAM,IAAI,OAAO,CAAC;IAClB,OAAO,IAAI,MAAM,CAAC;IAClB,MAAM,IAAI,MAAM,CAAC;IACjB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACpD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAClE,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAQF,wBAAgB,cAAc,IAAI,QAAQ,CAqNzC"}
@@ -0,0 +1,233 @@
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 the Provider answers not ready is asked again after these waits, the last repeating, so a chunk build that catches up within seconds installs at once and a long one is asked every 15 seconds.
16
+ const NOT_READY_MS = [1_000, 2_000, 3_000, 5_000, 8_000, 11_000, 15_000];
17
+ // 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.
18
+ const LOCK_GRACE_MS = 120_000;
19
+ export function createPresence() {
20
+ const listed = new Map();
21
+ const lockable = new Set();
22
+ let listings = 0;
23
+ const answered = new Map();
24
+ const marks = new Map();
25
+ const lastLost = new Map();
26
+ const unready = new Map();
27
+ let lossCount = 0;
28
+ let lockGrace = null;
29
+ function answer(locator) {
30
+ return answered.get(locator) ?? UNANSWERED;
31
+ }
32
+ function change(locator, next) {
33
+ answered.set(locator, { ...answer(locator), ...next });
34
+ }
35
+ function heard(locator, next) {
36
+ if (!marks.has(locator))
37
+ change(locator, next);
38
+ }
39
+ function readied(locator) {
40
+ const held = unready.get(locator);
41
+ if (held === undefined)
42
+ return;
43
+ if (held.timer !== null)
44
+ clearTimeout(held.timer);
45
+ unready.delete(locator);
46
+ }
47
+ function stopAsking(locator) {
48
+ for (const held of locator === undefined ? [...unready.keys()] : [locator])
49
+ readied(held);
50
+ }
51
+ function connectionLive() {
52
+ if (lockGrace !== null)
53
+ clearTimeout(lockGrace);
54
+ lockGrace = null;
55
+ }
56
+ function readable(locator) {
57
+ const { unreadable, unreading } = answer(locator);
58
+ if (!unreadable || marks.has(locator))
59
+ return false;
60
+ change(locator, {
61
+ unreadable: false,
62
+ ...(unreading ? { refusal: null, unreading: false } : {}),
63
+ });
64
+ return true;
65
+ }
66
+ function locks(locator, mode) {
67
+ return lockingMode(mode) && !answer(locator).confirmed && !marks.has(locator);
68
+ }
69
+ function liftable(locator, discovery) {
70
+ const mark = marks.get(locator);
71
+ return mark === undefined || mark.during < discovery;
72
+ }
73
+ return {
74
+ list(found, { whole, live }) {
75
+ listings += 1;
76
+ const kept = found.filter(({ locator }) => !marks.has(locator));
77
+ if (whole) {
78
+ listed.clear();
79
+ lockable.clear();
80
+ }
81
+ for (const room of kept) {
82
+ listed.set(room.locator, room);
83
+ if (lockingMode(room.replica.offline))
84
+ lockable.add(room.locator);
85
+ else
86
+ lockable.delete(room.locator);
87
+ change(room.locator, {
88
+ refusal: null,
89
+ unreading: false,
90
+ ...(live && room.replica.admission === 'admitted' ? { confirmed: true } : {}),
91
+ });
92
+ }
93
+ return kept;
94
+ },
95
+ room: (locator) => listed.get(locator),
96
+ rooms: () => [...listed.values()],
97
+ available(locator, selection) {
98
+ if (marks.has(locator))
99
+ return false;
100
+ const room = listed.get(locator);
101
+ if (room === undefined)
102
+ return true;
103
+ return ((selection === undefined || selection === room.replica.selection) &&
104
+ room.replica.admission === 'admitted' &&
105
+ !answer(locator).unreadable);
106
+ },
107
+ refusal: (locator) => answer(locator).refusal,
108
+ unheldModel: (locator) => answer(locator).unheldModel,
109
+ refused(locator, refusal) {
110
+ if (refusal === null) {
111
+ heard(locator, { unreadable: true });
112
+ return;
113
+ }
114
+ const unreading = refusal.scope !== 'operation' && refusal.scope !== 'model';
115
+ heard(locator, {
116
+ refusal: { code: refusal.code, fields: refusal.fields, retryable: refusal.retryable },
117
+ unreading,
118
+ ...(unreading ? { unreadable: true } : {}),
119
+ });
120
+ },
121
+ readable,
122
+ modelled(locator, model) {
123
+ heard(locator, { unheldModel: model });
124
+ },
125
+ installed(locator, bootstrapped) {
126
+ if (marks.has(locator))
127
+ return;
128
+ if (bootstrapped) {
129
+ readied(locator);
130
+ change(locator, { unheldModel: null });
131
+ }
132
+ change(locator, { stale: false });
133
+ readable(locator);
134
+ },
135
+ async locked(locator, stored) {
136
+ if (marks.has(locator) || answer(locator).confirmed)
137
+ return false;
138
+ return locks(locator, (await stored()) ?? listed.get(locator)?.replica.offline);
139
+ },
140
+ lockedAs: locks,
141
+ lockedAmong(stored, locking) {
142
+ return [...new Set([...lockable, ...locking])]
143
+ .filter((locator) => locks(locator, stored.get(locator)?.offline ?? listed.get(locator)?.replica.offline))
144
+ .sort();
145
+ },
146
+ connectionLost(lapsed) {
147
+ if (lockGrace !== null)
148
+ return;
149
+ lockGrace = setTimeout(() => {
150
+ lockGrace = null;
151
+ lapsed();
152
+ }, LOCK_GRACE_MS);
153
+ },
154
+ connectionLive,
155
+ lapse() {
156
+ for (const [locator, held] of answered) {
157
+ if (held.confirmed)
158
+ answered.set(locator, { ...held, confirmed: false });
159
+ }
160
+ },
161
+ stood(locator, stale, repairable) {
162
+ heard(locator, { stale, ...(repairable === undefined ? {} : { repairable }) });
163
+ },
164
+ repairing(locator, running) {
165
+ change(locator, { repairing: running });
166
+ },
167
+ reload(locator, due) {
168
+ change(locator, { reloadDue: due });
169
+ },
170
+ standing(locator) {
171
+ const { stale, repairable, repairing, reloadDue } = answer(locator);
172
+ return { stale, repairable, repairing, reloadDue };
173
+ },
174
+ settled: () => ![...answered].some(([locator, { stale }]) => stale && !marks.has(locator)),
175
+ repairsOwed: () => [...answered]
176
+ .filter(([locator, { stale, repairable }]) => stale && repairable !== null && !marks.has(locator))
177
+ .map(([locator]) => locator),
178
+ askAgain(locator, ask) {
179
+ const held = unready.get(locator) ?? { tries: 0, timer: null };
180
+ unready.set(locator, held);
181
+ if (held.timer !== null)
182
+ return;
183
+ const wait = NOT_READY_MS[Math.min(held.tries, NOT_READY_MS.length - 1)];
184
+ held.tries += 1;
185
+ held.timer = setTimeout(() => {
186
+ held.timer = null;
187
+ ask();
188
+ }, wait);
189
+ },
190
+ stopAsking,
191
+ lose(locator, during) {
192
+ if (marks.has(locator))
193
+ return false;
194
+ marks.set(locator, { during, written: false });
195
+ lastLost.set(locator, ++lossCount);
196
+ listings += 1;
197
+ listed.delete(locator);
198
+ lockable.delete(locator);
199
+ readied(locator);
200
+ const { repairing, reloadDue } = answer(locator);
201
+ answered.set(locator, { ...UNANSWERED, repairing, reloadDue });
202
+ return true;
203
+ },
204
+ writing(locator) {
205
+ const mark = marks.get(locator);
206
+ if (mark === undefined || mark.written)
207
+ return false;
208
+ marks.set(locator, { ...mark, written: true });
209
+ return true;
210
+ },
211
+ unwritten(locator) {
212
+ const mark = marks.get(locator);
213
+ if (mark !== undefined)
214
+ marks.set(locator, { ...mark, written: false });
215
+ },
216
+ lost: (locator) => marks.has(locator),
217
+ losing: () => marks.size > 0,
218
+ listing: () => listings,
219
+ losses: () => lossCount,
220
+ lostSince: (locator, losses) => marks.has(locator) || (lastLost.get(locator) ?? 0) > losses,
221
+ liftable,
222
+ lift(locator, discovery, unfenced) {
223
+ const mark = marks.get(locator);
224
+ if (mark !== undefined && liftable(locator, discovery) && (unfenced || !mark.written)) {
225
+ marks.delete(locator);
226
+ }
227
+ },
228
+ close() {
229
+ stopAsking();
230
+ connectionLive();
231
+ },
232
+ };
233
+ }
@@ -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"}