@agentshouse/mdruntime 0.1.0-c5fe3b2cddda7 → 0.1.0-c6197367d5fad

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 (332) hide show
  1. package/README.md +21 -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 +156 -89
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -11
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +20 -60
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/bootstrap.d.ts +9 -5
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +204 -85
  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 +2 -1
  26. package/dist/chain.d.ts.map +1 -1
  27. package/dist/change-set.d.ts +4 -0
  28. package/dist/change-set.d.ts.map +1 -1
  29. package/dist/change-set.js +6 -0
  30. package/dist/change.d.ts +5 -0
  31. package/dist/change.d.ts.map +1 -1
  32. package/dist/change.js +7 -2
  33. package/dist/chat-types.d.ts +3 -0
  34. package/dist/chat-types.d.ts.map +1 -0
  35. package/dist/chat-types.js +11 -0
  36. package/dist/client.d.ts +33 -23
  37. package/dist/client.d.ts.map +1 -1
  38. package/dist/client.js +43 -56
  39. package/dist/collection.d.ts +26 -4
  40. package/dist/collection.d.ts.map +1 -1
  41. package/dist/collection.js +19 -2
  42. package/dist/column.d.ts +5 -0
  43. package/dist/column.d.ts.map +1 -0
  44. package/dist/column.js +9 -0
  45. package/dist/compile.d.ts +8 -6
  46. package/dist/compile.d.ts.map +1 -1
  47. package/dist/compile.js +286 -336
  48. package/dist/connection.d.ts +5 -142
  49. package/dist/connection.d.ts.map +1 -1
  50. package/dist/connection.js +111 -4993
  51. package/dist/context.d.ts +2 -0
  52. package/dist/context.d.ts.map +1 -0
  53. package/dist/context.js +7 -0
  54. package/dist/conversation-live.d.ts +150 -0
  55. package/dist/conversation-live.d.ts.map +1 -0
  56. package/dist/conversation-live.js +259 -0
  57. package/dist/conversation-row.d.ts +40 -0
  58. package/dist/conversation-row.d.ts.map +1 -0
  59. package/dist/conversation-row.js +66 -0
  60. package/dist/conversation.d.ts +72 -51
  61. package/dist/conversation.d.ts.map +1 -1
  62. package/dist/conversation.js +1001 -926
  63. package/dist/declaration.d.ts +10 -0
  64. package/dist/declaration.d.ts.map +1 -0
  65. package/dist/declaration.js +24 -0
  66. package/dist/discovery.d.ts +11 -0
  67. package/dist/discovery.d.ts.map +1 -0
  68. package/dist/discovery.js +157 -0
  69. package/dist/download.d.ts +6 -0
  70. package/dist/download.d.ts.map +1 -0
  71. package/dist/download.js +42 -0
  72. package/dist/durability.d.ts +20 -0
  73. package/dist/durability.d.ts.map +1 -1
  74. package/dist/durability.js +7 -0
  75. package/dist/entry.d.ts +2 -2
  76. package/dist/entry.d.ts.map +1 -1
  77. package/dist/entry.js +18 -8
  78. package/dist/expectation.d.ts +26 -13
  79. package/dist/expectation.d.ts.map +1 -1
  80. package/dist/expectation.js +72 -19
  81. package/dist/failure.d.ts +3 -0
  82. package/dist/failure.d.ts.map +1 -1
  83. package/dist/failure.js +6 -0
  84. package/dist/figures.d.ts +49 -0
  85. package/dist/figures.d.ts.map +1 -0
  86. package/dist/figures.js +199 -0
  87. package/dist/file.d.ts +1 -1
  88. package/dist/file.d.ts.map +1 -1
  89. package/dist/file.js +3 -2
  90. package/dist/holdings.d.ts +29 -0
  91. package/dist/holdings.d.ts.map +1 -0
  92. package/dist/holdings.js +95 -0
  93. package/dist/host.d.ts +21 -7
  94. package/dist/host.d.ts.map +1 -1
  95. package/dist/host.js +83 -41
  96. package/dist/identity.d.ts +0 -1
  97. package/dist/identity.d.ts.map +1 -1
  98. package/dist/identity.js +0 -3
  99. package/dist/index.d.ts +37 -14
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +17 -5
  102. package/dist/install.d.ts +60 -0
  103. package/dist/install.d.ts.map +1 -0
  104. package/dist/install.js +537 -0
  105. package/dist/lifecycle.d.ts +7 -0
  106. package/dist/lifecycle.d.ts.map +1 -0
  107. package/dist/lifecycle.js +282 -0
  108. package/dist/listing.d.ts +52 -0
  109. package/dist/listing.d.ts.map +1 -0
  110. package/dist/listing.js +152 -0
  111. package/dist/live.d.ts +9 -6
  112. package/dist/live.d.ts.map +1 -1
  113. package/dist/live.js +118 -36
  114. package/dist/loaded.d.ts +5 -0
  115. package/dist/loaded.d.ts.map +1 -0
  116. package/dist/loaded.js +40 -0
  117. package/dist/locks.d.ts +7 -0
  118. package/dist/locks.d.ts.map +1 -0
  119. package/dist/locks.js +32 -0
  120. package/dist/lost.d.ts +5 -0
  121. package/dist/lost.d.ts.map +1 -0
  122. package/dist/lost.js +49 -0
  123. package/dist/media.d.ts +19 -2
  124. package/dist/media.d.ts.map +1 -1
  125. package/dist/media.js +105 -27
  126. package/dist/memory.d.ts +18 -6
  127. package/dist/memory.d.ts.map +1 -1
  128. package/dist/memory.js +214 -91
  129. package/dist/messages.d.ts +35 -5
  130. package/dist/messages.d.ts.map +1 -1
  131. package/dist/messages.js +109 -39
  132. package/dist/model.d.ts +2 -10
  133. package/dist/model.d.ts.map +1 -1
  134. package/dist/model.js +0 -14
  135. package/dist/models.d.ts +10 -0
  136. package/dist/models.d.ts.map +1 -0
  137. package/dist/models.js +153 -0
  138. package/dist/observation.d.ts +28 -13
  139. package/dist/observation.d.ts.map +1 -1
  140. package/dist/observation.js +185 -81
  141. package/dist/opened.d.ts +1 -1
  142. package/dist/opened.d.ts.map +1 -1
  143. package/dist/opened.js +5 -5
  144. package/dist/opening.d.ts +4 -0
  145. package/dist/opening.d.ts.map +1 -0
  146. package/dist/opening.js +53 -0
  147. package/dist/outcome.d.ts +17 -2
  148. package/dist/outcome.d.ts.map +1 -1
  149. package/dist/outcome.js +35 -2
  150. package/dist/overlay.d.ts +7 -2
  151. package/dist/overlay.d.ts.map +1 -1
  152. package/dist/overlay.js +48 -24
  153. package/dist/page-metadata.d.ts +8 -0
  154. package/dist/page-metadata.d.ts.map +1 -0
  155. package/dist/page-metadata.js +19 -0
  156. package/dist/parts.d.ts +4 -0
  157. package/dist/parts.d.ts.map +1 -0
  158. package/dist/parts.js +13 -0
  159. package/dist/paths.d.ts +1 -0
  160. package/dist/paths.d.ts.map +1 -1
  161. package/dist/paths.js +22 -0
  162. package/dist/preparation.d.ts +41 -0
  163. package/dist/preparation.d.ts.map +1 -0
  164. package/dist/preparation.js +314 -0
  165. package/dist/presence.d.ts +58 -0
  166. package/dist/presence.d.ts.map +1 -0
  167. package/dist/presence.js +231 -0
  168. package/dist/queries.d.ts +16 -0
  169. package/dist/queries.d.ts.map +1 -0
  170. package/dist/queries.js +308 -0
  171. package/dist/query.d.ts +14 -210
  172. package/dist/query.d.ts.map +1 -1
  173. package/dist/query.js +3 -505
  174. package/dist/questions.d.ts +30 -0
  175. package/dist/questions.d.ts.map +1 -0
  176. package/dist/questions.js +116 -0
  177. package/dist/queue.d.ts +40 -0
  178. package/dist/queue.d.ts.map +1 -0
  179. package/dist/queue.js +480 -0
  180. package/dist/reach.d.ts +16 -15
  181. package/dist/reach.d.ts.map +1 -1
  182. package/dist/reach.js +257 -148
  183. package/dist/react.d.ts +19 -3
  184. package/dist/react.d.ts.map +1 -1
  185. package/dist/react.js +33 -1
  186. package/dist/read.d.ts +7 -0
  187. package/dist/read.d.ts.map +1 -0
  188. package/dist/read.js +17 -0
  189. package/dist/readiness.d.ts +9 -6
  190. package/dist/readiness.d.ts.map +1 -1
  191. package/dist/readiness.js +3 -5
  192. package/dist/reads.d.ts +39 -0
  193. package/dist/reads.d.ts.map +1 -0
  194. package/dist/reads.js +178 -0
  195. package/dist/recovery.d.ts +3 -1
  196. package/dist/recovery.d.ts.map +1 -1
  197. package/dist/recovery.js +38 -8
  198. package/dist/refresh.d.ts +2 -1
  199. package/dist/refresh.d.ts.map +1 -1
  200. package/dist/refresh.js +31 -3
  201. package/dist/refusal.d.ts +5 -0
  202. package/dist/refusal.d.ts.map +1 -0
  203. package/dist/refusal.js +55 -0
  204. package/dist/replica.d.ts +11 -16
  205. package/dist/replica.d.ts.map +1 -1
  206. package/dist/replica.js +66 -32
  207. package/dist/retried.d.ts +30 -0
  208. package/dist/retried.d.ts.map +1 -0
  209. package/dist/retried.js +72 -0
  210. package/dist/room-draft.d.ts +34 -10
  211. package/dist/room-draft.d.ts.map +1 -1
  212. package/dist/room-draft.js +331 -111
  213. package/dist/room-drafts.d.ts +24 -0
  214. package/dist/room-drafts.d.ts.map +1 -0
  215. package/dist/room-drafts.js +220 -0
  216. package/dist/room-list.d.ts +10 -0
  217. package/dist/room-list.d.ts.map +1 -0
  218. package/dist/room-list.js +45 -0
  219. package/dist/rows.d.ts +16 -22
  220. package/dist/rows.d.ts.map +1 -1
  221. package/dist/rows.js +49 -186
  222. package/dist/runtime.d.ts +34 -0
  223. package/dist/runtime.d.ts.map +1 -0
  224. package/dist/runtime.js +1 -0
  225. package/dist/save.d.ts +42 -86
  226. package/dist/save.d.ts.map +1 -1
  227. package/dist/save.js +332 -228
  228. package/dist/saves.d.ts +34 -0
  229. package/dist/saves.d.ts.map +1 -0
  230. package/dist/saves.js +437 -0
  231. package/dist/search.d.ts +12 -63
  232. package/dist/search.d.ts.map +1 -1
  233. package/dist/search.js +9 -52
  234. package/dist/seed.d.ts +11 -2
  235. package/dist/seed.d.ts.map +1 -1
  236. package/dist/seed.js +71 -1
  237. package/dist/shared.d.ts +1 -6
  238. package/dist/shared.d.ts.map +1 -1
  239. package/dist/shared.js +13 -95
  240. package/dist/shown.d.ts +35 -0
  241. package/dist/shown.d.ts.map +1 -0
  242. package/dist/shown.js +313 -0
  243. package/dist/socket/admission.d.ts +7 -0
  244. package/dist/socket/admission.d.ts.map +1 -0
  245. package/dist/socket/admission.js +39 -0
  246. package/dist/socket/answers.d.ts +6 -0
  247. package/dist/socket/answers.d.ts.map +1 -0
  248. package/dist/socket/answers.js +20 -0
  249. package/dist/socket/lanes.d.ts +28 -0
  250. package/dist/socket/lanes.d.ts.map +1 -0
  251. package/dist/socket/lanes.js +103 -0
  252. package/dist/socket/reads.d.ts +10 -0
  253. package/dist/socket/reads.d.ts.map +1 -0
  254. package/dist/socket/reads.js +31 -0
  255. package/dist/socket/session.d.ts +38 -0
  256. package/dist/socket/session.d.ts.map +1 -0
  257. package/dist/socket/session.js +23 -0
  258. package/dist/socket.d.ts +67 -0
  259. package/dist/socket.d.ts.map +1 -0
  260. package/dist/socket.js +164 -0
  261. package/dist/source.d.ts +59 -0
  262. package/dist/source.d.ts.map +1 -0
  263. package/dist/source.js +93 -0
  264. package/dist/status.d.ts +0 -2
  265. package/dist/status.d.ts.map +1 -1
  266. package/dist/status.js +0 -6
  267. package/dist/store/installs.d.ts +30 -0
  268. package/dist/store/installs.d.ts.map +1 -0
  269. package/dist/store/installs.js +40 -0
  270. package/dist/store/readiness.d.ts +11 -0
  271. package/dist/store/readiness.d.ts.map +1 -0
  272. package/dist/store/readiness.js +68 -0
  273. package/dist/store/records.d.ts +224 -0
  274. package/dist/store/records.d.ts.map +1 -0
  275. package/dist/store/records.js +466 -0
  276. package/dist/store/room-held.d.ts +8 -0
  277. package/dist/store/room-held.d.ts.map +1 -0
  278. package/dist/store/room-held.js +17 -0
  279. package/dist/store/rooms-shown.d.ts +8 -0
  280. package/dist/store/rooms-shown.d.ts.map +1 -0
  281. package/dist/store/rooms-shown.js +13 -0
  282. package/dist/store/space.d.ts +11 -0
  283. package/dist/store/space.d.ts.map +1 -0
  284. package/dist/store/space.js +41 -0
  285. package/dist/store/watchers.d.ts +17 -0
  286. package/dist/store/watchers.d.ts.map +1 -0
  287. package/dist/store/watchers.js +56 -0
  288. package/dist/store/writes.d.ts +24 -0
  289. package/dist/store/writes.d.ts.map +1 -0
  290. package/dist/store/writes.js +125 -0
  291. package/dist/store.d.ts +115 -143
  292. package/dist/store.d.ts.map +1 -1
  293. package/dist/store.js +171 -364
  294. package/dist/stored.d.ts +72 -35
  295. package/dist/stored.d.ts.map +1 -1
  296. package/dist/stored.js +337 -197
  297. package/dist/surface.d.ts +92 -0
  298. package/dist/surface.d.ts.map +1 -0
  299. package/dist/surface.js +251 -0
  300. package/dist/sync.d.ts +19 -0
  301. package/dist/sync.d.ts.map +1 -0
  302. package/dist/sync.js +538 -0
  303. package/dist/tables.d.ts +118 -67
  304. package/dist/tables.d.ts.map +1 -1
  305. package/dist/tables.js +199 -278
  306. package/dist/tallies.d.ts +18 -0
  307. package/dist/tallies.d.ts.map +1 -0
  308. package/dist/tallies.js +128 -0
  309. package/dist/validation.d.ts.map +1 -1
  310. package/dist/validation.js +9 -12
  311. package/dist/windows.d.ts +1 -12
  312. package/dist/windows.d.ts.map +1 -1
  313. package/dist/windows.js +2 -75
  314. package/dist/wire.d.ts +72 -9
  315. package/dist/wire.d.ts.map +1 -1
  316. package/dist/wire.js +26 -5
  317. package/package.json +3 -2
  318. package/dist/attempt.d.ts +0 -16
  319. package/dist/attempt.d.ts.map +0 -1
  320. package/dist/attempt.js +0 -70
  321. package/dist/fence.d.ts +0 -6
  322. package/dist/fence.d.ts.map +0 -1
  323. package/dist/fence.js +0 -10
  324. package/dist/fulltext.d.ts +0 -27
  325. package/dist/fulltext.d.ts.map +0 -1
  326. package/dist/fulltext.js +0 -370
  327. package/dist/log.d.ts +0 -5
  328. package/dist/log.d.ts.map +0 -1
  329. package/dist/log.js +0 -14
  330. package/dist/words.d.ts +0 -19
  331. package/dist/words.d.ts.map +0 -1
  332. package/dist/words.js +0 -156
@@ -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(notReadyWaitMs: (asked: number) => number): 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":"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"}
@@ -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
+ }