@agentshouse/mdruntime 0.1.0-c009335e08279 → 0.1.0-c0136de3edfbe

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 (316) hide show
  1. package/README.md +25 -12
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +389 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +248 -0
  8. package/dist/adapter.d.ts +246 -80
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/adapter.js +1 -9
  11. package/dist/attached-model.d.ts +8 -0
  12. package/dist/attached-model.d.ts.map +1 -0
  13. package/dist/attached-model.js +46 -0
  14. package/dist/attempt.d.ts +16 -0
  15. package/dist/attempt.d.ts.map +1 -0
  16. package/dist/attempt.js +70 -0
  17. package/dist/binary.d.ts +18 -0
  18. package/dist/binary.d.ts.map +1 -0
  19. package/dist/binary.js +8 -0
  20. package/dist/bootstrap.d.ts +40 -6
  21. package/dist/bootstrap.d.ts.map +1 -1
  22. package/dist/bootstrap.js +336 -51
  23. package/dist/cell.d.ts +6 -0
  24. package/dist/cell.d.ts.map +1 -0
  25. package/dist/cell.js +9 -0
  26. package/dist/chain.d.ts +12 -0
  27. package/dist/chain.d.ts.map +1 -0
  28. package/dist/chain.js +64 -0
  29. package/dist/change-set.d.ts +9 -14
  30. package/dist/change-set.d.ts.map +1 -1
  31. package/dist/change-set.js +11 -56
  32. package/dist/change.d.ts +46 -0
  33. package/dist/change.d.ts.map +1 -1
  34. package/dist/change.js +34 -0
  35. package/dist/chat-types.d.ts +3 -0
  36. package/dist/chat-types.d.ts.map +1 -0
  37. package/dist/chat-types.js +2 -0
  38. package/dist/client.d.ts +53 -18
  39. package/dist/client.d.ts.map +1 -1
  40. package/dist/client.js +162 -30
  41. package/dist/collection.d.ts +13 -14
  42. package/dist/collection.d.ts.map +1 -1
  43. package/dist/collection.js +52 -56
  44. package/dist/compile.d.ts +16 -0
  45. package/dist/compile.d.ts.map +1 -0
  46. package/dist/compile.js +717 -0
  47. package/dist/connection.d.ts +8 -106
  48. package/dist/connection.d.ts.map +1 -1
  49. package/dist/connection.js +102 -2094
  50. package/dist/context.d.ts +2 -0
  51. package/dist/context.d.ts.map +1 -0
  52. package/dist/context.js +7 -0
  53. package/dist/conversation-row.d.ts +33 -0
  54. package/dist/conversation-row.d.ts.map +1 -0
  55. package/dist/conversation-row.js +47 -0
  56. package/dist/conversation.d.ts +76 -27
  57. package/dist/conversation.d.ts.map +1 -1
  58. package/dist/conversation.js +1052 -273
  59. package/dist/digest.d.ts +7 -0
  60. package/dist/digest.d.ts.map +1 -0
  61. package/dist/digest.js +113 -0
  62. package/dist/discovery.d.ts +10 -0
  63. package/dist/discovery.d.ts.map +1 -0
  64. package/dist/discovery.js +175 -0
  65. package/dist/durability.d.ts +10 -1
  66. package/dist/durability.d.ts.map +1 -1
  67. package/dist/durability.js +5 -0
  68. package/dist/entry.d.ts +20 -0
  69. package/dist/entry.d.ts.map +1 -0
  70. package/dist/entry.js +161 -0
  71. package/dist/expectation.d.ts +21 -0
  72. package/dist/expectation.d.ts.map +1 -0
  73. package/dist/expectation.js +70 -0
  74. package/dist/failure.d.ts +13 -0
  75. package/dist/failure.d.ts.map +1 -0
  76. package/dist/failure.js +19 -0
  77. package/dist/figures.d.ts +48 -0
  78. package/dist/figures.d.ts.map +1 -0
  79. package/dist/figures.js +197 -0
  80. package/dist/file.d.ts +2 -19
  81. package/dist/file.d.ts.map +1 -1
  82. package/dist/file.js +7 -122
  83. package/dist/host.d.ts +18 -2
  84. package/dist/host.d.ts.map +1 -1
  85. package/dist/host.js +165 -51
  86. package/dist/identity.d.ts +3 -0
  87. package/dist/identity.d.ts.map +1 -1
  88. package/dist/identity.js +13 -1
  89. package/dist/index.d.ts +35 -10
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +13 -0
  92. package/dist/install.d.ts +56 -0
  93. package/dist/install.d.ts.map +1 -0
  94. package/dist/install.js +560 -0
  95. package/dist/job.d.ts +33 -0
  96. package/dist/job.d.ts.map +1 -0
  97. package/dist/job.js +54 -0
  98. package/dist/lifecycle.d.ts +7 -0
  99. package/dist/lifecycle.d.ts.map +1 -0
  100. package/dist/lifecycle.js +267 -0
  101. package/dist/listing.d.ts +53 -0
  102. package/dist/listing.d.ts.map +1 -0
  103. package/dist/listing.js +175 -0
  104. package/dist/live.d.ts +23 -0
  105. package/dist/live.d.ts.map +1 -0
  106. package/dist/live.js +165 -0
  107. package/dist/locks.d.ts +9 -0
  108. package/dist/locks.d.ts.map +1 -0
  109. package/dist/locks.js +61 -0
  110. package/dist/log.d.ts +1 -0
  111. package/dist/log.d.ts.map +1 -1
  112. package/dist/lost.d.ts +5 -0
  113. package/dist/lost.d.ts.map +1 -0
  114. package/dist/lost.js +61 -0
  115. package/dist/media.d.ts +8 -0
  116. package/dist/media.d.ts.map +1 -0
  117. package/dist/media.js +218 -0
  118. package/dist/memory.d.ts +30 -9
  119. package/dist/memory.d.ts.map +1 -1
  120. package/dist/memory.js +337 -86
  121. package/dist/messages.d.ts +52 -0
  122. package/dist/messages.d.ts.map +1 -0
  123. package/dist/messages.js +168 -0
  124. package/dist/model.d.ts +17 -16
  125. package/dist/model.d.ts.map +1 -1
  126. package/dist/model.js +9 -9
  127. package/dist/models.d.ts +14 -0
  128. package/dist/models.d.ts.map +1 -0
  129. package/dist/models.js +193 -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 +22 -2
  134. package/dist/observation.d.ts.map +1 -1
  135. package/dist/observation.js +133 -17
  136. package/dist/open.d.ts +2 -0
  137. package/dist/open.d.ts.map +1 -0
  138. package/dist/open.js +1 -0
  139. package/dist/opened.d.ts +22 -0
  140. package/dist/opened.d.ts.map +1 -0
  141. package/dist/opened.js +107 -0
  142. package/dist/opening.d.ts +4 -0
  143. package/dist/opening.d.ts.map +1 -0
  144. package/dist/opening.js +56 -0
  145. package/dist/outcome.d.ts +73 -5
  146. package/dist/outcome.d.ts.map +1 -1
  147. package/dist/outcome.js +84 -1
  148. package/dist/overlay.d.ts +16 -5
  149. package/dist/overlay.d.ts.map +1 -1
  150. package/dist/overlay.js +147 -180
  151. package/dist/parts.d.ts +59 -0
  152. package/dist/parts.d.ts.map +1 -0
  153. package/dist/parts.js +118 -0
  154. package/dist/paths.d.ts +1 -1
  155. package/dist/paths.d.ts.map +1 -1
  156. package/dist/paths.js +4 -16
  157. package/dist/preparation.d.ts +20 -0
  158. package/dist/preparation.d.ts.map +1 -0
  159. package/dist/preparation.js +226 -0
  160. package/dist/queries.d.ts +16 -0
  161. package/dist/queries.d.ts.map +1 -0
  162. package/dist/queries.js +272 -0
  163. package/dist/query.d.ts +56 -180
  164. package/dist/query.d.ts.map +1 -1
  165. package/dist/query.js +3 -422
  166. package/dist/questions.d.ts +32 -0
  167. package/dist/questions.d.ts.map +1 -0
  168. package/dist/questions.js +118 -0
  169. package/dist/reach.d.ts +56 -0
  170. package/dist/reach.d.ts.map +1 -0
  171. package/dist/reach.js +494 -0
  172. package/dist/react.d.ts +47 -0
  173. package/dist/react.d.ts.map +1 -0
  174. package/dist/react.js +54 -0
  175. package/dist/read.d.ts +7 -0
  176. package/dist/read.d.ts.map +1 -0
  177. package/dist/read.js +17 -0
  178. package/dist/readiness.d.ts +50 -0
  179. package/dist/readiness.d.ts.map +1 -0
  180. package/dist/readiness.js +27 -0
  181. package/dist/reads.d.ts +36 -0
  182. package/dist/reads.d.ts.map +1 -0
  183. package/dist/reads.js +136 -0
  184. package/dist/recovery.d.ts +26 -0
  185. package/dist/recovery.d.ts.map +1 -0
  186. package/dist/recovery.js +232 -0
  187. package/dist/refresh.d.ts +21 -7
  188. package/dist/refresh.d.ts.map +1 -1
  189. package/dist/refresh.js +155 -55
  190. package/dist/refusal.d.ts +5 -0
  191. package/dist/refusal.d.ts.map +1 -0
  192. package/dist/refusal.js +56 -0
  193. package/dist/replica.d.ts +58 -33
  194. package/dist/replica.d.ts.map +1 -1
  195. package/dist/replica.js +355 -158
  196. package/dist/room-draft.d.ts +62 -11
  197. package/dist/room-draft.d.ts.map +1 -1
  198. package/dist/room-draft.js +281 -83
  199. package/dist/room-drafts.d.ts +24 -0
  200. package/dist/room-drafts.d.ts.map +1 -0
  201. package/dist/room-drafts.js +216 -0
  202. package/dist/rows.d.ts +32 -34
  203. package/dist/rows.d.ts.map +1 -1
  204. package/dist/rows.js +65 -87
  205. package/dist/runtime.d.ts +42 -0
  206. package/dist/runtime.d.ts.map +1 -0
  207. package/dist/runtime.js +1 -0
  208. package/dist/save.d.ts +74 -6
  209. package/dist/save.d.ts.map +1 -1
  210. package/dist/save.js +902 -182
  211. package/dist/saves.d.ts +70 -0
  212. package/dist/saves.d.ts.map +1 -0
  213. package/dist/saves.js +1004 -0
  214. package/dist/search.d.ts +15 -54
  215. package/dist/search.d.ts.map +1 -1
  216. package/dist/search.js +10 -121
  217. package/dist/seed.d.ts +25 -0
  218. package/dist/seed.d.ts.map +1 -0
  219. package/dist/seed.js +146 -0
  220. package/dist/shared.d.ts +15 -0
  221. package/dist/shared.d.ts.map +1 -0
  222. package/dist/shared.js +421 -0
  223. package/dist/shown.d.ts +31 -0
  224. package/dist/shown.d.ts.map +1 -0
  225. package/dist/shown.js +294 -0
  226. package/dist/socket/admission.d.ts +7 -0
  227. package/dist/socket/admission.d.ts.map +1 -0
  228. package/dist/socket/admission.js +39 -0
  229. package/dist/socket/answers.d.ts +6 -0
  230. package/dist/socket/answers.d.ts.map +1 -0
  231. package/dist/socket/answers.js +20 -0
  232. package/dist/socket/lanes.d.ts +20 -0
  233. package/dist/socket/lanes.d.ts.map +1 -0
  234. package/dist/socket/lanes.js +77 -0
  235. package/dist/socket/reads.d.ts +10 -0
  236. package/dist/socket/reads.d.ts.map +1 -0
  237. package/dist/socket/reads.js +31 -0
  238. package/dist/socket/rooms.d.ts +43 -0
  239. package/dist/socket/rooms.d.ts.map +1 -0
  240. package/dist/socket/rooms.js +90 -0
  241. package/dist/socket/session.d.ts +39 -0
  242. package/dist/socket/session.d.ts.map +1 -0
  243. package/dist/socket/session.js +23 -0
  244. package/dist/socket.d.ts +70 -0
  245. package/dist/socket.d.ts.map +1 -0
  246. package/dist/socket.js +175 -0
  247. package/dist/source.d.ts +61 -0
  248. package/dist/source.d.ts.map +1 -0
  249. package/dist/source.js +81 -0
  250. package/dist/status.d.ts +7 -4
  251. package/dist/status.d.ts.map +1 -1
  252. package/dist/status.js +3 -15
  253. package/dist/store/fences.d.ts +16 -0
  254. package/dist/store/fences.d.ts.map +1 -0
  255. package/dist/store/fences.js +26 -0
  256. package/dist/store/installs.d.ts +30 -0
  257. package/dist/store/installs.d.ts.map +1 -0
  258. package/dist/store/installs.js +34 -0
  259. package/dist/store/readiness.d.ts +10 -0
  260. package/dist/store/readiness.d.ts.map +1 -0
  261. package/dist/store/readiness.js +52 -0
  262. package/dist/store/records.d.ts +212 -0
  263. package/dist/store/records.d.ts.map +1 -0
  264. package/dist/store/records.js +408 -0
  265. package/dist/store/room-held.d.ts +8 -0
  266. package/dist/store/room-held.d.ts.map +1 -0
  267. package/dist/store/room-held.js +17 -0
  268. package/dist/store/space.d.ts +11 -0
  269. package/dist/store/space.d.ts.map +1 -0
  270. package/dist/store/space.js +43 -0
  271. package/dist/store/watchers.d.ts +17 -0
  272. package/dist/store/watchers.d.ts.map +1 -0
  273. package/dist/store/watchers.js +57 -0
  274. package/dist/store/writes.d.ts +24 -0
  275. package/dist/store/writes.d.ts.map +1 -0
  276. package/dist/store/writes.js +125 -0
  277. package/dist/store.d.ts +106 -93
  278. package/dist/store.d.ts.map +1 -1
  279. package/dist/store.js +142 -385
  280. package/dist/stored.d.ts +156 -0
  281. package/dist/stored.d.ts.map +1 -0
  282. package/dist/stored.js +637 -0
  283. package/dist/surface.d.ts +86 -0
  284. package/dist/surface.d.ts.map +1 -0
  285. package/dist/surface.js +217 -0
  286. package/dist/sync.d.ts +20 -0
  287. package/dist/sync.d.ts.map +1 -0
  288. package/dist/sync.js +531 -0
  289. package/dist/tables.d.ts +407 -0
  290. package/dist/tables.d.ts.map +1 -0
  291. package/dist/tables.js +724 -0
  292. package/dist/tallies.d.ts +18 -0
  293. package/dist/tallies.d.ts.map +1 -0
  294. package/dist/tallies.js +129 -0
  295. package/dist/transfer.d.ts +0 -5
  296. package/dist/transfer.d.ts.map +1 -1
  297. package/dist/turn.d.ts +9 -0
  298. package/dist/turn.d.ts.map +1 -0
  299. package/dist/turn.js +75 -0
  300. package/dist/validation.d.ts +29 -0
  301. package/dist/validation.d.ts.map +1 -0
  302. package/dist/validation.js +104 -0
  303. package/dist/windows.d.ts +11 -0
  304. package/dist/windows.d.ts.map +1 -0
  305. package/dist/windows.js +16 -0
  306. package/dist/wire.d.ts +206 -20
  307. package/dist/wire.d.ts.map +1 -1
  308. package/dist/wire.js +95 -61
  309. package/package.json +33 -10
  310. package/AGENTS.md +0 -208
  311. package/dist/attachment.d.ts +0 -3
  312. package/dist/attachment.d.ts.map +0 -1
  313. package/dist/attachment.js +0 -8
  314. package/dist/read-side.d.ts +0 -14
  315. package/dist/read-side.d.ts.map +0 -1
  316. package/dist/read-side.js +0 -371
package/dist/parts.js ADDED
@@ -0,0 +1,118 @@
1
+ import { closeLast, markerMoved, openJobs } from './job.js';
2
+ import { excerpt, list, record, text } from './read.js';
3
+ const MARKERS = ['mode', 'compaction', 'retry', 'model', 'job'];
4
+ function partOf(raw) {
5
+ const part = record(raw);
6
+ switch (text(part, 'type')) {
7
+ case 'text':
8
+ case 'reasoning': {
9
+ const said = text(part, 'text');
10
+ return said === null ? null : { type: part.type, text: said };
11
+ }
12
+ case 'commands':
13
+ return typeof part.count === 'number' ? { type: 'commands', count: part.count } : null;
14
+ case 'subagent':
15
+ return {
16
+ type: 'subagent',
17
+ description: text(part, 'description') ?? '',
18
+ done: part.status === 'done',
19
+ result: text(part, 'result'),
20
+ };
21
+ case 'message': {
22
+ const command = text(part, 'command');
23
+ return command === null ? null : { type: 'message', command, target: text(part, 'target') };
24
+ }
25
+ case 'image': {
26
+ const path = text(part, 'file');
27
+ const name = text(part, 'name');
28
+ return path === null || name === null
29
+ ? null
30
+ : { type: 'image', path, name, mediaType: text(part, 'media_type') ?? '' };
31
+ }
32
+ case 'marker': {
33
+ const marker = text(part, 'marker');
34
+ return marker === null || !MARKERS.includes(marker)
35
+ ? null
36
+ : { type: 'marker', marker: marker, text: text(part, 'text') ?? '' };
37
+ }
38
+ case 'plan':
39
+ return {
40
+ type: 'plan',
41
+ steps: list(part, 'entries').flatMap((entry) => {
42
+ const step = record(entry);
43
+ const content = text(step, 'content');
44
+ return content === null ? [] : [{ content, status: text(step, 'status') ?? '' }];
45
+ }),
46
+ };
47
+ default:
48
+ return null;
49
+ }
50
+ }
51
+ export function partsOf(raw) {
52
+ return raw.flatMap((one) => partOf(one) ?? []);
53
+ }
54
+ export function contextIn(raw) {
55
+ const held = record(raw);
56
+ return typeof held.used === 'number' && typeof held.window === 'number' && held.window > 0
57
+ ? { used: held.used, window: held.window }
58
+ : null;
59
+ }
60
+ export function counted(count) {
61
+ return count === 1 ? '1 command' : `${count} commands`;
62
+ }
63
+ export function runningLine(raw) {
64
+ const parts = partsOf(raw);
65
+ const note = [...parts].reverse().find((part) => part.type === 'text' && part.text.trim() !== '');
66
+ if (note?.type === 'text')
67
+ return excerpt(note.text);
68
+ const commands = parts.reduce((sum, part) => (part.type === 'commands' ? sum + part.count : sum), 0);
69
+ return commands === 0 ? null : counted(commands);
70
+ }
71
+ export function jobsOf(markers, turn) {
72
+ const running = (turn === null ? [] : partsOf(turn.parts)).flatMap((part) => part.type === 'marker' && part.marker === 'job'
73
+ ? [{ said: part.text, at: turn?.started ?? null }]
74
+ : []);
75
+ return openJobs([...markers, ...running]);
76
+ }
77
+ export function stillRunning(turns, subagents) {
78
+ const open = [];
79
+ for (const { turn, parts, ended } of turns) {
80
+ for (const part of parts) {
81
+ if (part.type === 'subagent') {
82
+ const key = `subagent\u0000${part.description}`;
83
+ if (part.done)
84
+ closeLast(open, key);
85
+ else if (ended) {
86
+ open.push({
87
+ turn,
88
+ key,
89
+ work: { kind: 'subagent', title: part.description, next: null, activity: null },
90
+ });
91
+ }
92
+ continue;
93
+ }
94
+ if (part.type !== 'marker' || part.marker !== 'job')
95
+ continue;
96
+ markerMoved(open, part.text, (job, key) => ended
97
+ ? {
98
+ turn,
99
+ key,
100
+ work: {
101
+ kind: job.kind === 'started' ? 'job' : 'schedule',
102
+ title: job.label,
103
+ next: job.next,
104
+ activity: null,
105
+ },
106
+ }
107
+ : null);
108
+ }
109
+ }
110
+ const doing = [...subagents];
111
+ const under = new Map();
112
+ for (const { turn, work } of open) {
113
+ const at = work.kind === 'subagent' ? doing.findIndex((one) => one.description === work.title) : -1;
114
+ const shown = at === -1 ? work : { ...work, activity: doing.splice(at, 1)[0].activity };
115
+ under.set(turn, [...(under.get(turn) ?? []), shown]);
116
+ }
117
+ return under;
118
+ }
package/dist/paths.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare function normalize(path: string): string | null;
2
- export declare function relative(from: string, target: string): string;
3
2
  export declare function beneath(prefix: string, path: string): boolean;
4
3
  export declare function covered(prefixes: readonly string[], path: string): boolean;
4
+ export declare function ancestors(path: string): readonly string[];
5
5
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAGzD"}
package/dist/paths.js CHANGED
@@ -1,7 +1,3 @@
1
- function dirname(path) {
2
- const index = path.lastIndexOf('/');
3
- return index === -1 ? '' : path.slice(0, index);
4
- }
5
1
  export function normalize(path) {
6
2
  const parts = [];
7
3
  for (const part of path.split('/')) {
@@ -17,18 +13,6 @@ export function normalize(path) {
17
13
  }
18
14
  return parts.join('/');
19
15
  }
20
- export function relative(from, target) {
21
- const base = dirname(from)
22
- .split('/')
23
- .filter((part) => part !== '');
24
- const parts = target.split('/');
25
- let shared = 0;
26
- while (shared < base.length && shared + 1 < parts.length && base[shared] === parts[shared]) {
27
- shared += 1;
28
- }
29
- const up = Array.from({ length: base.length - shared }, () => '..');
30
- return [...up, ...parts.slice(shared)].join('/');
31
- }
32
16
  export function beneath(prefix, path) {
33
17
  return path === prefix || path.startsWith(`${prefix}/`);
34
18
  }
@@ -38,3 +22,7 @@ export function covered(prefixes, path) {
38
22
  return normalized !== null && (normalized === '' || beneath(normalized, path));
39
23
  });
40
24
  }
25
+ export function ancestors(path) {
26
+ const parts = path.split('/');
27
+ return parts.slice(1).map((_, at) => parts.slice(0, at + 1).join('/'));
28
+ }
@@ -0,0 +1,20 @@
1
+ import type { PlanReach } from './query.js';
2
+ import { type PortReach } from './reach.js';
3
+ import { type CodeAvailability, type ConnectionAvailability, type Readiness } from './readiness.js';
4
+ import type { Runtime } from './runtime.js';
5
+ export type ReadinessPort = {
6
+ readonly target: string;
7
+ readonly code: CodeAvailability;
8
+ };
9
+ export type ReadinessWatch = {
10
+ readonly port: ReadinessPort;
11
+ readonly reach: PortReach | null;
12
+ readonly deliver: (readiness: Readiness) => void;
13
+ };
14
+ export declare function prepare(runtime: Runtime, locators?: readonly string[]): void;
15
+ export declare function roomsOfReach(reach: PlanReach): ReadonlySet<string>;
16
+ export declare function connectionNow(runtime: Runtime): Promise<ConnectionAvailability>;
17
+ export declare function deliverOwedReadiness(runtime: Runtime, owed: readonly ReadinessWatch[]): Promise<void>;
18
+ export declare function watchReadiness({ store }: Runtime, port: ReadinessPort, reach: PortReach | null, deliver: (readiness: Readiness) => void): () => void;
19
+ export declare function filled(runtime: Runtime): void;
20
+ //# sourceMappingURL=preparation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preparation.d.ts","sourceRoot":"","sources":["../src/preparation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,SAAS,EAEf,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,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,SAAS,KAAK,IAAI,CAAC;CAClD,CAAC;AAuCF,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,GAAE,SAAS,MAAM,EAAO,QA8BzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAElE;AAmDD,wBAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMrF;AAkFD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,cAAc,EAAE,iBAI3F;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,SAAS,KAAK,IAAI,GACtC,MAAM,IAAI,CAQZ;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,OAAO,QAMtC"}
@@ -0,0 +1,226 @@
1
+ import { changeSet } from './change-set.js';
2
+ import { installationOf } from './install.js';
3
+ import { listedLocators } from './listing.js';
4
+ import { planReach } from './reach.js';
5
+ import { readinessOf, } from './readiness.js';
6
+ import { roomOfKey } from './rows.js';
7
+ import { recoverReads } from './shown.js';
8
+ import { yielded } from './turn.js';
9
+ async function prepareReplica(runtime, locator) {
10
+ const { store, socket } = runtime;
11
+ for (;;) {
12
+ const held = (await store.rooms([locator])).get(locator);
13
+ if (held === undefined || socket.closed() || held.indexed)
14
+ return;
15
+ const key = held.record.key;
16
+ const done = await store.exclusive(async () => {
17
+ const local = await store.open();
18
+ return store.rederive(local, key, store.composed(held.record));
19
+ });
20
+ if (!done.done)
21
+ continue;
22
+ if ((await store.rooms([locator])).get(locator)?.record.key !== key)
23
+ continue;
24
+ store.changed(changeSet(locator, { documents: null }));
25
+ recoverReads(runtime);
26
+ store.readiness.queue();
27
+ return;
28
+ }
29
+ }
30
+ async function unprepared({ store, socket }) {
31
+ const held = (await store.covering()).rooms;
32
+ return [...store.device.now().unpreparedDemand, ...held.keys()].find((locator) => !(held.get(locator)?.indexed ?? false) && !socket.rooms.standing(locator).unpreparable);
33
+ }
34
+ function unpreparedBy({ store, socket, journal }, locator, error) {
35
+ socket.rooms.stand(locator, { unpreparable: true });
36
+ journal.record(`preparation failed ${locator} ${error instanceof Error ? error.name : 'unknown'}`);
37
+ store.readiness.queue();
38
+ }
39
+ export function prepare(runtime, locators = []) {
40
+ const { store, socket, journal } = runtime;
41
+ const { device } = store;
42
+ if (locators.length > 0) {
43
+ device.set({ unpreparedDemand: new Set([...device.now().unpreparedDemand, ...locators]) });
44
+ }
45
+ if (device.now().preparing)
46
+ return;
47
+ device.set({ preparing: true });
48
+ void (async () => {
49
+ try {
50
+ for (let waiting = await unprepared(runtime); waiting !== undefined; waiting = await unprepared(runtime)) {
51
+ await yielded();
52
+ if (socket.closed())
53
+ return;
54
+ const demand = new Set(device.now().unpreparedDemand);
55
+ demand.delete(waiting);
56
+ device.set({ unpreparedDemand: demand });
57
+ await prepareReplica(runtime, waiting).catch((error) => unpreparedBy(runtime, waiting, error));
58
+ }
59
+ }
60
+ catch {
61
+ journal.record('preparation failed');
62
+ }
63
+ finally {
64
+ device.set({ preparing: false });
65
+ }
66
+ })();
67
+ }
68
+ export function roomsOfReach(reach) {
69
+ return new Set([...reach.rooms, ...reach.documents.map(roomOfKey)]);
70
+ }
71
+ function requiredRooms(runtime, given, held) {
72
+ const { roomsListed } = runtime.socket.session.now();
73
+ const reach = planReach(given);
74
+ const listed = new Set(listedLocators(runtime, held));
75
+ if (reach === null)
76
+ return { listed: roomsListed, rooms: [...listed].sort() };
77
+ const named = [...roomsOfReach(reach)].sort();
78
+ if (roomsListed)
79
+ return { listed: true, rooms: named.filter((room) => listed.has(room)) };
80
+ return { listed: named.every((room) => held.has(room)), rooms: named };
81
+ }
82
+ function roomState({ socket }, locator, held) {
83
+ const listedRoom = socket.rooms.discovered(locator);
84
+ if (socket.session.now().roomsListed &&
85
+ (listedRoom === undefined ||
86
+ listedRoom.replica.admission !== 'admitted' ||
87
+ socket.rooms.standing(locator).unreadable))
88
+ return 'unadmitted';
89
+ const stored = held.get(locator);
90
+ if (stored === undefined)
91
+ return 'acquiring';
92
+ if (!stored.indexed)
93
+ return 'preparing';
94
+ return 'complete';
95
+ }
96
+ function conversationCoverage({ socket, conversations }, reach) {
97
+ const declaredConversations = reach === null || reach.conversations;
98
+ if (!declaredConversations || socket.conversations() === undefined)
99
+ return 'undeclared';
100
+ if (!conversations.known() || !conversations.current())
101
+ return 'acquiring';
102
+ return 'complete';
103
+ }
104
+ function connectionOf({ socket }, lastCompleted) {
105
+ if (socket.isOpen())
106
+ return 'connected';
107
+ if (socket.session.now().moving.providerUnreachable)
108
+ return 'unreachable';
109
+ return !socket.streamed && lastCompleted !== null ? 'connected' : 'connecting';
110
+ }
111
+ export async function connectionNow(runtime) {
112
+ const { store, socket } = runtime;
113
+ if (socket.isOpen() || socket.session.now().moving.providerUnreachable || socket.streamed) {
114
+ return connectionOf(runtime, null);
115
+ }
116
+ return connectionOf(runtime, (await (await store.open()).facts()).lastCompleted);
117
+ }
118
+ async function readinessHeld({ store }) {
119
+ const local = await store.open();
120
+ const [held, facts] = await Promise.all([store.covering(), local.facts()]);
121
+ return { held: held.rooms, facts };
122
+ }
123
+ function readinessFor(runtime, port, reach, { held, facts }) {
124
+ const { store, socket, usableWhenHeld } = runtime;
125
+ const required = requiredRooms(runtime, reach, held);
126
+ const coverage = required.rooms.map((room) => ({ room, state: roomState(runtime, room, held) }));
127
+ const preparing = coverage
128
+ .filter((room) => room.state === 'preparing' && !socket.rooms.standing(room.room).unpreparable)
129
+ .map(({ room }) => room);
130
+ if (preparing.length > 0)
131
+ prepare(runtime, preparing);
132
+ const { persistence, storageLoss, heldWhenOpened } = store.device.now();
133
+ return readinessOf({
134
+ code: port.code,
135
+ coverage: {
136
+ listed: required.listed,
137
+ rooms: coverage,
138
+ conversations: conversationCoverage(runtime, reach),
139
+ },
140
+ persistence,
141
+ connection: connectionOf(runtime, facts.lastCompleted),
142
+ house: socket.session.now().refusal !== null
143
+ ? 'refused'
144
+ : socket.writesHeld()
145
+ ? 'write-halted'
146
+ : 'open',
147
+ space: store.space.full() ? 'full' : null,
148
+ installation: installationOf(store, coverage, held),
149
+ lost: storageLoss !== null,
150
+ established: facts.targets[port.target]?.established === true ||
151
+ (heldWhenOpened && usableWhenHeld.includes(port.target)),
152
+ });
153
+ }
154
+ function establish(runtime, name) {
155
+ const { store, journal } = runtime;
156
+ const { device } = store;
157
+ if (device.now().establishing.has(name))
158
+ return;
159
+ device.set({ establishing: new Set([...device.now().establishing, name]) });
160
+ void store
161
+ .durably(async (local) => {
162
+ const { targets } = await local.facts();
163
+ await local.fact('targets', { ...targets, [name]: { established: true } });
164
+ })
165
+ .then(() => {
166
+ store.readiness.queue();
167
+ void probeEachMinute(runtime);
168
+ }, () => {
169
+ journal.record(`target record failed ${name}`);
170
+ })
171
+ .finally(() => {
172
+ const establishing = new Set(device.now().establishing);
173
+ establishing.delete(name);
174
+ device.set({ establishing });
175
+ });
176
+ }
177
+ function deliverReadiness(runtime, watch, held) {
178
+ if (!runtime.store.readiness.held(watch))
179
+ return;
180
+ const readiness = readinessFor(runtime, watch.port, watch.reach, held);
181
+ if (readiness.ready && held.facts.targets[watch.port.target]?.established !== true) {
182
+ establish(runtime, watch.port.target);
183
+ }
184
+ if (!runtime.store.readiness.changed(watch, JSON.stringify(readiness)))
185
+ return;
186
+ watch.deliver(structuredClone(readiness));
187
+ }
188
+ export async function deliverOwedReadiness(runtime, owed) {
189
+ const held = await readinessHeld(runtime);
190
+ if (runtime.socket.closed())
191
+ return;
192
+ for (const watch of owed)
193
+ deliverReadiness(runtime, watch, held);
194
+ }
195
+ export function watchReadiness({ store }, port, reach, deliver) {
196
+ const watch = { port, reach, deliver };
197
+ const stop = store.readiness.add(watch);
198
+ void store.open().then(() => store.readiness.owe([watch]), () => store.readiness.owe([watch]));
199
+ return stop;
200
+ }
201
+ export function filled(runtime) {
202
+ const { store, socket, journal } = runtime;
203
+ if (socket.closed() || !store.space.fill())
204
+ return;
205
+ journal.record('space full');
206
+ store.readiness.queue();
207
+ void probeEachMinute(runtime);
208
+ }
209
+ async function installedTarget({ store, usableWhenHeld }) {
210
+ if (store.device.now().heldWhenOpened && usableWhenHeld.length > 0)
211
+ return true;
212
+ const { targets } = await (await store.open()).facts();
213
+ return Object.values(targets).some((target) => target.established);
214
+ }
215
+ async function probeEachMinute(runtime) {
216
+ const { store, socket } = runtime;
217
+ const { space } = store;
218
+ const idle = () => !space.full() || space.probing() || socket.closed();
219
+ if (idle())
220
+ return;
221
+ if (!(await installedTarget(runtime).catch(() => false)))
222
+ return;
223
+ if (idle())
224
+ return;
225
+ space.probeEachMinute();
226
+ }
@@ -0,0 +1,16 @@
1
+ import { type FiguresCover } from './figures.js';
2
+ import type { Cover, 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.js").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,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,EAIL,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;AAuFrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AA2ED,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,CAchG;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,CAqDvB"}