@agentshouse/mdruntime 0.1.0-c56daf494ecb4 → 0.1.0-c59a5a6bd2f31

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 (290) hide show
  1. package/README.md +19 -16
  2. package/dist/acceptance.d.ts +26 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +384 -0
  5. package/dist/adapter.d.ts +152 -57
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/attached-model.d.ts +7 -10
  8. package/dist/attached-model.d.ts.map +1 -1
  9. package/dist/attached-model.js +40 -41
  10. package/dist/binary.d.ts +0 -5
  11. package/dist/binary.d.ts.map +1 -1
  12. package/dist/binary.js +1 -1
  13. package/dist/bootstrap.d.ts +31 -11
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +323 -93
  16. package/dist/chain.d.ts +12 -0
  17. package/dist/chain.d.ts.map +1 -0
  18. package/dist/chain.js +64 -0
  19. package/dist/change-set.d.ts +9 -14
  20. package/dist/change-set.d.ts.map +1 -1
  21. package/dist/change-set.js +11 -63
  22. package/dist/change.d.ts +32 -1
  23. package/dist/change.d.ts.map +1 -1
  24. package/dist/change.js +10 -1
  25. package/dist/chat-types.d.ts +3 -0
  26. package/dist/chat-types.d.ts.map +1 -0
  27. package/dist/chat-types.js +2 -0
  28. package/dist/client.d.ts +38 -16
  29. package/dist/client.d.ts.map +1 -1
  30. package/dist/client.js +101 -12
  31. package/dist/collection.d.ts +11 -7
  32. package/dist/collection.d.ts.map +1 -1
  33. package/dist/collection.js +38 -79
  34. package/dist/compile.d.ts +16 -0
  35. package/dist/compile.d.ts.map +1 -0
  36. package/dist/compile.js +717 -0
  37. package/dist/connection.d.ts +44 -39
  38. package/dist/connection.d.ts.map +1 -1
  39. package/dist/connection.js +2307 -1712
  40. package/dist/context.d.ts +2 -0
  41. package/dist/context.d.ts.map +1 -0
  42. package/dist/{chat/context.js → context.js} +1 -4
  43. package/dist/conversation-row.d.ts +33 -0
  44. package/dist/conversation-row.d.ts.map +1 -0
  45. package/dist/conversation-row.js +47 -0
  46. package/dist/conversation.d.ts +50 -20
  47. package/dist/conversation.d.ts.map +1 -1
  48. package/dist/conversation.js +897 -303
  49. package/dist/digest.d.ts +7 -0
  50. package/dist/digest.d.ts.map +1 -0
  51. package/dist/digest.js +113 -0
  52. package/dist/durability.d.ts +10 -1
  53. package/dist/durability.d.ts.map +1 -1
  54. package/dist/durability.js +5 -0
  55. package/dist/entry.d.ts +7 -4
  56. package/dist/entry.d.ts.map +1 -1
  57. package/dist/entry.js +33 -28
  58. package/dist/figures.d.ts +48 -0
  59. package/dist/figures.d.ts.map +1 -0
  60. package/dist/figures.js +197 -0
  61. package/dist/file.d.ts +2 -19
  62. package/dist/file.d.ts.map +1 -1
  63. package/dist/file.js +7 -122
  64. package/dist/host.d.ts +11 -2
  65. package/dist/host.d.ts.map +1 -1
  66. package/dist/host.js +127 -17
  67. package/dist/index.d.ts +27 -11
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +10 -0
  70. package/dist/install.d.ts +86 -0
  71. package/dist/install.d.ts.map +1 -0
  72. package/dist/install.js +537 -0
  73. package/dist/job.d.ts +33 -0
  74. package/dist/job.d.ts.map +1 -0
  75. package/dist/job.js +54 -0
  76. package/dist/live.d.ts +23 -0
  77. package/dist/live.d.ts.map +1 -0
  78. package/dist/live.js +165 -0
  79. package/dist/log.d.ts +1 -0
  80. package/dist/log.d.ts.map +1 -1
  81. package/dist/media.d.ts +8 -0
  82. package/dist/media.d.ts.map +1 -0
  83. package/dist/media.js +218 -0
  84. package/dist/memory.d.ts +19 -5
  85. package/dist/memory.d.ts.map +1 -1
  86. package/dist/memory.js +253 -94
  87. package/dist/messages.d.ts +52 -0
  88. package/dist/messages.d.ts.map +1 -0
  89. package/dist/messages.js +168 -0
  90. package/dist/model.d.ts +11 -11
  91. package/dist/model.d.ts.map +1 -1
  92. package/dist/model.js +7 -10
  93. package/dist/name.d.ts +4 -0
  94. package/dist/name.d.ts.map +1 -0
  95. package/dist/name.js +122 -0
  96. package/dist/observation.d.ts +22 -4
  97. package/dist/observation.d.ts.map +1 -1
  98. package/dist/observation.js +120 -14
  99. package/dist/opened.d.ts +22 -0
  100. package/dist/opened.d.ts.map +1 -0
  101. package/dist/opened.js +107 -0
  102. package/dist/outcome.d.ts +50 -7
  103. package/dist/outcome.d.ts.map +1 -1
  104. package/dist/outcome.js +43 -0
  105. package/dist/overlay.d.ts +4 -4
  106. package/dist/overlay.d.ts.map +1 -1
  107. package/dist/overlay.js +111 -182
  108. package/dist/{chat/parts.d.ts → parts.d.ts} +11 -9
  109. package/dist/parts.d.ts.map +1 -0
  110. package/dist/{chat/parts.js → parts.js} +45 -46
  111. package/dist/paths.d.ts +1 -0
  112. package/dist/paths.d.ts.map +1 -1
  113. package/dist/paths.js +4 -0
  114. package/dist/query.d.ts +50 -183
  115. package/dist/query.d.ts.map +1 -1
  116. package/dist/query.js +3 -464
  117. package/dist/{chat/questions.d.ts → questions.d.ts} +3 -2
  118. package/dist/questions.d.ts.map +1 -0
  119. package/dist/{chat/questions.js → questions.js} +8 -1
  120. package/dist/reach.d.ts +19 -7
  121. package/dist/reach.d.ts.map +1 -1
  122. package/dist/reach.js +289 -89
  123. package/dist/react.d.ts +11 -6
  124. package/dist/react.d.ts.map +1 -1
  125. package/dist/react.js +7 -17
  126. package/dist/{chat/read.d.ts → read.d.ts} +2 -0
  127. package/dist/read.d.ts.map +1 -0
  128. package/dist/{chat/read.js → read.js} +4 -0
  129. package/dist/readiness.d.ts +50 -0
  130. package/dist/readiness.d.ts.map +1 -0
  131. package/dist/readiness.js +27 -0
  132. package/dist/reads.d.ts +35 -0
  133. package/dist/reads.d.ts.map +1 -0
  134. package/dist/reads.js +128 -0
  135. package/dist/recovery.d.ts +26 -0
  136. package/dist/recovery.d.ts.map +1 -0
  137. package/dist/recovery.js +232 -0
  138. package/dist/refresh.d.ts +17 -14
  139. package/dist/refresh.d.ts.map +1 -1
  140. package/dist/refresh.js +143 -51
  141. package/dist/replica.d.ts +55 -33
  142. package/dist/replica.d.ts.map +1 -1
  143. package/dist/replica.js +332 -154
  144. package/dist/room-draft.d.ts +37 -6
  145. package/dist/room-draft.d.ts.map +1 -1
  146. package/dist/room-draft.js +161 -74
  147. package/dist/room-drafts.d.ts +29 -0
  148. package/dist/room-drafts.d.ts.map +1 -0
  149. package/dist/room-drafts.js +216 -0
  150. package/dist/rows.d.ts +30 -37
  151. package/dist/rows.d.ts.map +1 -1
  152. package/dist/rows.js +59 -126
  153. package/dist/save.d.ts +53 -9
  154. package/dist/save.d.ts.map +1 -1
  155. package/dist/save.js +542 -172
  156. package/dist/saves.d.ts +96 -0
  157. package/dist/saves.d.ts.map +1 -0
  158. package/dist/saves.js +999 -0
  159. package/dist/search.d.ts +15 -55
  160. package/dist/search.d.ts.map +1 -1
  161. package/dist/search.js +10 -121
  162. package/dist/seed.d.ts +30 -0
  163. package/dist/seed.d.ts.map +1 -0
  164. package/dist/seed.js +141 -0
  165. package/dist/shared.d.ts +15 -0
  166. package/dist/shared.d.ts.map +1 -0
  167. package/dist/shared.js +421 -0
  168. package/dist/socket/admission.d.ts +7 -0
  169. package/dist/socket/admission.d.ts.map +1 -0
  170. package/dist/socket/admission.js +39 -0
  171. package/dist/socket/answers.d.ts +6 -0
  172. package/dist/socket/answers.d.ts.map +1 -0
  173. package/dist/socket/answers.js +20 -0
  174. package/dist/socket/reads.d.ts +10 -0
  175. package/dist/socket/reads.d.ts.map +1 -0
  176. package/dist/socket/reads.js +31 -0
  177. package/dist/socket.d.ts +43 -0
  178. package/dist/socket.d.ts.map +1 -0
  179. package/dist/socket.js +96 -0
  180. package/dist/source.d.ts +61 -0
  181. package/dist/source.d.ts.map +1 -0
  182. package/dist/source.js +81 -0
  183. package/dist/status.d.ts +5 -2
  184. package/dist/status.d.ts.map +1 -1
  185. package/dist/status.js +3 -7
  186. package/dist/store/fences.d.ts +16 -0
  187. package/dist/store/fences.d.ts.map +1 -0
  188. package/dist/store/fences.js +26 -0
  189. package/dist/store/installs.d.ts +30 -0
  190. package/dist/store/installs.d.ts.map +1 -0
  191. package/dist/store/installs.js +34 -0
  192. package/dist/store/records.d.ts +212 -0
  193. package/dist/store/records.d.ts.map +1 -0
  194. package/dist/store/records.js +408 -0
  195. package/dist/store/room-held.d.ts +8 -0
  196. package/dist/store/room-held.d.ts.map +1 -0
  197. package/dist/store/room-held.js +17 -0
  198. package/dist/store/watchers.d.ts +15 -0
  199. package/dist/store/watchers.d.ts.map +1 -0
  200. package/dist/store/watchers.js +36 -0
  201. package/dist/store/writes.d.ts +24 -0
  202. package/dist/store/writes.d.ts.map +1 -0
  203. package/dist/store/writes.js +125 -0
  204. package/dist/store.d.ts +77 -120
  205. package/dist/store.d.ts.map +1 -1
  206. package/dist/store.js +112 -529
  207. package/dist/stored.d.ts +156 -0
  208. package/dist/stored.d.ts.map +1 -0
  209. package/dist/stored.js +637 -0
  210. package/dist/tables.d.ts +407 -0
  211. package/dist/tables.d.ts.map +1 -0
  212. package/dist/tables.js +724 -0
  213. package/dist/tallies.d.ts +18 -0
  214. package/dist/tallies.d.ts.map +1 -0
  215. package/dist/tallies.js +129 -0
  216. package/dist/transfer.d.ts +0 -5
  217. package/dist/transfer.d.ts.map +1 -1
  218. package/dist/turn.d.ts +9 -0
  219. package/dist/turn.d.ts.map +1 -0
  220. package/dist/turn.js +75 -0
  221. package/dist/validation.d.ts +29 -0
  222. package/dist/validation.d.ts.map +1 -0
  223. package/dist/validation.js +104 -0
  224. package/dist/windows.d.ts +11 -0
  225. package/dist/windows.d.ts.map +1 -0
  226. package/dist/windows.js +16 -0
  227. package/dist/wire.d.ts +179 -32
  228. package/dist/wire.d.ts.map +1 -1
  229. package/dist/wire.js +61 -31
  230. package/package.json +18 -19
  231. package/AGENTS.md +0 -302
  232. package/dist/chat/acts.d.ts +0 -34
  233. package/dist/chat/acts.d.ts.map +0 -1
  234. package/dist/chat/acts.js +0 -36
  235. package/dist/chat/context.d.ts +0 -3
  236. package/dist/chat/context.d.ts.map +0 -1
  237. package/dist/chat/input.d.ts +0 -9
  238. package/dist/chat/input.d.ts.map +0 -1
  239. package/dist/chat/input.js +0 -99
  240. package/dist/chat/kit.d.ts +0 -60
  241. package/dist/chat/kit.d.ts.map +0 -1
  242. package/dist/chat/kit.js +0 -123
  243. package/dist/chat/lasting.d.ts +0 -6
  244. package/dist/chat/lasting.d.ts.map +0 -1
  245. package/dist/chat/lasting.js +0 -19
  246. package/dist/chat/list.d.ts +0 -26
  247. package/dist/chat/list.d.ts.map +0 -1
  248. package/dist/chat/list.js +0 -62
  249. package/dist/chat/markdown.d.ts +0 -20
  250. package/dist/chat/markdown.d.ts.map +0 -1
  251. package/dist/chat/markdown.js +0 -188
  252. package/dist/chat/message.d.ts +0 -6
  253. package/dist/chat/message.d.ts.map +0 -1
  254. package/dist/chat/message.js +0 -192
  255. package/dist/chat/messages.d.ts +0 -21
  256. package/dist/chat/messages.d.ts.map +0 -1
  257. package/dist/chat/messages.js +0 -151
  258. package/dist/chat/name.d.ts +0 -6
  259. package/dist/chat/name.d.ts.map +0 -1
  260. package/dist/chat/name.js +0 -37
  261. package/dist/chat/opened.d.ts +0 -11
  262. package/dist/chat/opened.d.ts.map +0 -1
  263. package/dist/chat/opened.js +0 -17
  264. package/dist/chat/overlay.d.ts +0 -31
  265. package/dist/chat/overlay.d.ts.map +0 -1
  266. package/dist/chat/overlay.js +0 -97
  267. package/dist/chat/parts.d.ts.map +0 -1
  268. package/dist/chat/process.d.ts +0 -20
  269. package/dist/chat/process.d.ts.map +0 -1
  270. package/dist/chat/process.js +0 -32
  271. package/dist/chat/provider.d.ts +0 -63
  272. package/dist/chat/provider.d.ts.map +0 -1
  273. package/dist/chat/provider.js +0 -645
  274. package/dist/chat/question.d.ts +0 -9
  275. package/dist/chat/question.d.ts.map +0 -1
  276. package/dist/chat/question.js +0 -80
  277. package/dist/chat/questions.d.ts.map +0 -1
  278. package/dist/chat/read.d.ts.map +0 -1
  279. package/dist/chat/ready.d.ts +0 -33
  280. package/dist/chat/ready.d.ts.map +0 -1
  281. package/dist/chat/ready.js +0 -91
  282. package/dist/chat/style.d.ts +0 -4
  283. package/dist/chat/style.d.ts.map +0 -1
  284. package/dist/chat/style.js +0 -302
  285. package/dist/chat.d.ts +0 -14
  286. package/dist/chat.d.ts.map +0 -1
  287. package/dist/chat.js +0 -8
  288. package/dist/read-side.d.ts +0 -18
  289. package/dist/read-side.d.ts.map +0 -1
  290. package/dist/read-side.js +0 -440
@@ -0,0 +1,7 @@
1
+ export type Digest = {
2
+ update(bytes: Uint8Array): void;
3
+ hex(): string;
4
+ };
5
+ export declare function digest(): Digest;
6
+ export declare function sha256(blob: Blob): Promise<string>;
7
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AA0EA,MAAM,MAAM,MAAM,GAAG;IACnB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,MAAM,CAAC;CACf,CAAC;AAEF,wBAAgB,MAAM,IAAI,MAAM,CAoC/B;AAED,wBAAsB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAMxD"}
package/dist/digest.js ADDED
@@ -0,0 +1,113 @@
1
+ import { FILE_PART_BYTES } from './tables.js';
2
+ const ROUNDS = new Uint32Array([
3
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
4
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
5
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
6
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
7
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
8
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
9
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
10
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
11
+ ]);
12
+ const INITIAL = [
13
+ 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
14
+ ];
15
+ const BLOCK = 64;
16
+ function rotated(value, by) {
17
+ return (value >>> by) | (value << (32 - by));
18
+ }
19
+ function compressed(state, words, bytes, at) {
20
+ for (let index = 0; index < 16; index += 1) {
21
+ const from = at + index * 4;
22
+ words[index] =
23
+ (bytes[from] << 24) | (bytes[from + 1] << 16) | (bytes[from + 2] << 8) | bytes[from + 3];
24
+ }
25
+ for (let index = 16; index < 64; index += 1) {
26
+ const early = words[index - 15];
27
+ const late = words[index - 2];
28
+ const lower = rotated(early, 7) ^ rotated(early, 18) ^ (early >>> 3);
29
+ const upper = rotated(late, 17) ^ rotated(late, 19) ^ (late >>> 10);
30
+ words[index] = (words[index - 16] + lower + words[index - 7] + upper) | 0;
31
+ }
32
+ let a = state[0];
33
+ let b = state[1];
34
+ let c = state[2];
35
+ let d = state[3];
36
+ let e = state[4];
37
+ let f = state[5];
38
+ let g = state[6];
39
+ let h = state[7];
40
+ for (let index = 0; index < 64; index += 1) {
41
+ const chosen = (e & f) ^ (~e & g);
42
+ const first = (h +
43
+ (rotated(e, 6) ^ rotated(e, 11) ^ rotated(e, 25)) +
44
+ chosen +
45
+ ROUNDS[index] +
46
+ words[index]) |
47
+ 0;
48
+ const second = ((rotated(a, 2) ^ rotated(a, 13) ^ rotated(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) | 0;
49
+ h = g;
50
+ g = f;
51
+ f = e;
52
+ e = (d + first) | 0;
53
+ d = c;
54
+ c = b;
55
+ b = a;
56
+ a = (first + second) | 0;
57
+ }
58
+ state[0] += a;
59
+ state[1] += b;
60
+ state[2] += c;
61
+ state[3] += d;
62
+ state[4] += e;
63
+ state[5] += f;
64
+ state[6] += g;
65
+ state[7] += h;
66
+ }
67
+ export function digest() {
68
+ const state = new Uint32Array(INITIAL);
69
+ const words = new Uint32Array(64);
70
+ const pending = new Uint8Array(BLOCK);
71
+ let held = 0;
72
+ let size = 0;
73
+ return {
74
+ update(bytes) {
75
+ size += bytes.length;
76
+ let from = 0;
77
+ if (held > 0) {
78
+ const taken = Math.min(BLOCK - held, bytes.length);
79
+ pending.set(bytes.subarray(0, taken), held);
80
+ held += taken;
81
+ from = taken;
82
+ if (held < BLOCK)
83
+ return;
84
+ compressed(state, words, pending, 0);
85
+ held = 0;
86
+ }
87
+ for (; from + BLOCK <= bytes.length; from += BLOCK)
88
+ compressed(state, words, bytes, from);
89
+ pending.set(bytes.subarray(from), 0);
90
+ held = bytes.length - from;
91
+ },
92
+ hex() {
93
+ const bits = size * 8;
94
+ const tail = new Uint8Array(held < 56 ? BLOCK : BLOCK * 2);
95
+ tail.set(pending.subarray(0, held));
96
+ tail[held] = 0x80;
97
+ const length = new DataView(tail.buffer, tail.length - 8);
98
+ length.setUint32(0, Math.floor(bits / 0x1_0000_0000));
99
+ length.setUint32(4, bits >>> 0);
100
+ const final = new Uint32Array(state);
101
+ for (let from = 0; from < tail.length; from += BLOCK)
102
+ compressed(final, words, tail, from);
103
+ return [...final].map((word) => word.toString(16).padStart(8, '0')).join('');
104
+ },
105
+ };
106
+ }
107
+ export async function sha256(blob) {
108
+ const hashed = digest();
109
+ for (let at = 0; at < blob.size; at += FILE_PART_BYTES) {
110
+ hashed.update(new Uint8Array(await blob.slice(at, at + FILE_PART_BYTES).arrayBuffer()));
111
+ }
112
+ return hashed.hex();
113
+ }
@@ -1,9 +1,18 @@
1
+ import type { Persistence } from './readiness.js';
2
+ export type UnsentKind = 'pending-change' | 'call' | 'room-draft' | 'chat-draft';
3
+ export type UnsentWork = {
4
+ readonly kind: UnsentKind;
5
+ readonly count: number;
6
+ };
1
7
  export type RuntimeShell = {
2
- persistentStorage: boolean;
8
+ persistence: Persistence;
3
9
  generation: string | null;
4
10
  keepGeneration(value: string): void | Promise<void>;
5
11
  dropGeneration(): void | Promise<void>;
12
+ cleanUp?(): Promise<number>;
13
+ reset(): Promise<void>;
6
14
  };
15
+ export declare function refusedForSpace(error: unknown): boolean;
7
16
  export declare function detectStorageLoss(stored: string | null, reported: string | null): string | null;
8
17
  export declare function nextGeneration(stored: string | null, reported: string | null): string;
9
18
  //# sourceMappingURL=durability.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"durability.d.ts","sourceRoot":"","sources":["../src/durability.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,cAAc,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGrF"}
1
+ {"version":3,"file":"durability.d.ts","sourceRoot":"","sources":["../src/durability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAIlD,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,CAAC;AAEjF,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,MAAM,YAAY,GAAG;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,cAAc,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMvD;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/F;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAGrF"}
@@ -1,4 +1,9 @@
1
1
  const STORAGE_LOSS_CODE = 'storage-loss';
2
+ export function refusedForSpace(error) {
3
+ return (typeof error === 'object' &&
4
+ error !== null &&
5
+ error.name === 'QuotaExceededError');
6
+ }
2
7
  export function detectStorageLoss(stored, reported) {
3
8
  if (reported === null || reported === stored)
4
9
  return null;
package/dist/entry.d.ts CHANGED
@@ -1,9 +1,12 @@
1
- import { type QueryResult } from './query.js';
2
- export { QueryError } from './query.js';
1
+ import { type VerifiedModel } from '@agentshouse/mdmodel';
2
+ import { type QueryRows } from './query.js';
3
+ import type { Connection } from './tables.js';
4
+ export { QueryError } from '@agentshouse/mdmodel';
3
5
  export type EntryRoom = {
4
6
  locator: string;
5
7
  schema: string | null;
6
8
  documents: Readonly<Record<string, string>>;
9
+ revisions?: Readonly<Record<string, string>>;
7
10
  };
8
11
  export type EntryArguments = Readonly<Record<string, string>>;
9
12
  export type EntryParameterKind = 'string' | 'integer' | 'number' | 'boolean';
@@ -11,7 +14,7 @@ export declare function boundQuery(template: unknown, args: EntryArguments): unk
11
14
  export declare function entryParameters(template: unknown): readonly string[];
12
15
  export declare function entryRefusal(template: unknown): string | null;
13
16
  export type EntryScope = {
14
- results(queries: Readonly<Record<string, unknown>>): Promise<Record<string, QueryResult>>;
17
+ results(queries: Readonly<Record<string, unknown>>): Promise<Record<string, QueryRows>>;
15
18
  };
16
- export declare function entryScope(rooms: readonly EntryRoom[]): EntryScope;
19
+ export declare function entryScope(rooms: readonly EntryRoom[], roomTypes: VerifiedModel, connection: Connection): EntryScope;
17
20
  //# sourceMappingURL=entry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AA0D7E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMpE;AAkCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;CAC3F,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,CAqDlE"}
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAyB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AA0D7E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMpE;AAyCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACzF,CAAC;AAEF,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,UAAU,GACrB,UAAU,CAoDZ"}
package/dist/entry.js CHANGED
@@ -1,10 +1,10 @@
1
+ import { invalid, plain, QueryError, } from '@agentshouse/mdmodel';
1
2
  import { attachedModel } from './attached-model.js';
2
- import { collectionOf, passingDocument } from './collection.js';
3
- import { NO_MODEL } from './model.js';
4
- import { invalid, planOf, plain, QueryError, } from './query.js';
5
- import { createReadSide } from './read-side.js';
6
- import { rowsOf } from './rows.js';
7
- export { QueryError } from './query.js';
3
+ import { answerQuery } from './compile.js';
4
+ import { planWithin } from './query.js';
5
+ import { writtenFacts } from './rows.js';
6
+ import { entered, REPLICA_TABLES } from './stored.js';
7
+ export { QueryError } from '@agentshouse/mdmodel';
8
8
  const PARAMETER = '$param';
9
9
  const KIND = 'as';
10
10
  const INTEGER = /^-?(?:0|[1-9][0-9]*)$/u;
@@ -84,6 +84,7 @@ const SAMPLED = {
84
84
  $all: 'entry',
85
85
  $size: 0,
86
86
  $exists: true,
87
+ $prefix: 'entry',
87
88
  $gt: 0,
88
89
  $gte: 0,
89
90
  $lt: 0,
@@ -99,9 +100,15 @@ function sampled(template, key) {
99
100
  }
100
101
  return template;
101
102
  }
103
+ function entryPlan(query, facts) {
104
+ const plan = planWithin(query, facts);
105
+ if (plan.fileIds !== null)
106
+ invalid('fileIds', 'an entry Room holds no file IDs');
107
+ return plan;
108
+ }
102
109
  export function entryRefusal(template) {
103
110
  try {
104
- planOf(sampled(template, ''), { listed: false, rooms: [] });
111
+ entryPlan(sampled(template, ''), { listed: false, rooms: [] });
105
112
  return null;
106
113
  }
107
114
  catch (error) {
@@ -110,45 +117,43 @@ export function entryRefusal(template) {
110
117
  throw error;
111
118
  }
112
119
  }
113
- export function entryScope(rooms) {
114
- const readSide = createReadSide();
120
+ export function entryScope(rooms, roomTypes, connection) {
121
+ for (const table of REPLICA_TABLES)
122
+ connection.run(table);
115
123
  const held = [];
116
- const documents = rooms.flatMap((room) => {
124
+ const keys = rooms.map((room) => {
117
125
  const model = attachedModel({
118
126
  kind: 'model',
119
127
  snapshot: { identity: room.locator, version: '', schema: room.schema, revision: null },
120
- }, NO_MODEL).state;
128
+ }, roomTypes);
121
129
  held.push({
122
130
  locator: room.locator,
123
131
  available: model.status !== 'unavailable',
124
132
  types: model.status === 'unavailable' ? [] : Object.values(model.types),
125
133
  });
126
- const composition = { model, selection: null };
127
- const collection = collectionOf(room.documents, composition);
128
- return Object.keys(room.documents)
134
+ const composition = { model, selection: null, typedPaths: [] };
135
+ const key = entered(connection, room.locator, composition, Object.keys(room.documents)
129
136
  .sort()
130
137
  .map((path) => ({
131
- locator: room.locator,
132
138
  path,
133
- before: [],
134
- after: rowsOf(room.locator, path, passingDocument(collection, path) ?? null, composition, null, null),
135
- }));
136
- });
137
- readSide.apply({
138
- documents,
139
- drafts: [],
140
- rooms: [],
141
- queues: [],
142
- presentations: [],
143
- messages: [],
144
- conversations: [],
139
+ content: room.documents[path],
140
+ facts: writtenFacts(path, room.documents[path], composition),
141
+ binary: null,
142
+ revision: room.revisions?.[path] ?? null,
143
+ fileId: null,
144
+ created: null,
145
+ change: null,
146
+ written: null,
147
+ })));
148
+ return { locator: room.locator, key };
145
149
  });
146
150
  const planned = { listed: true, rooms: held };
147
151
  return {
148
152
  async results(queries) {
149
153
  const results = {};
150
154
  for (const [name, query] of Object.entries(queries)) {
151
- results[name] = await readSide.query(planOf(query, planned));
155
+ const plan = entryPlan(query, planned);
156
+ results[name] = answerQuery(connection, plan, keys.filter(({ locator }) => plan.rooms === null || plan.rooms.includes(locator)));
152
157
  }
153
158
  return results;
154
159
  },
@@ -0,0 +1,48 @@
1
+ import type { ChangeSet } from './change-set.js';
2
+ import type { GroupTotal, PendingResult } from './query.js';
3
+ import type { Deliver, Fail } from './reach.js';
4
+ import type { ConversationTally, RoomTally } from './tallies.js';
5
+ import type { QueryRoom } from './tables.js';
6
+ export declare const HOUSE_DIRECTORY = "house";
7
+ export declare const ROOM_TOTALS: {
8
+ readonly outside: readonly ["house"];
9
+ readonly groupBy: readonly ["room"];
10
+ readonly select: {
11
+ readonly size: true;
12
+ };
13
+ };
14
+ export type DayFigures = {
15
+ readonly created: number;
16
+ readonly changed: number;
17
+ readonly chats: number;
18
+ readonly messages: number;
19
+ };
20
+ export type RoomFigures = {
21
+ readonly room: string;
22
+ readonly day: DayFigures;
23
+ readonly total: {
24
+ readonly documents: GroupTotal;
25
+ readonly files: GroupTotal;
26
+ };
27
+ };
28
+ export type Figures = {
29
+ readonly rooms: readonly RoomFigures[];
30
+ readonly agentMessages: number;
31
+ };
32
+ export type FiguresResult = Figures | PendingResult;
33
+ export type FiguresCover = PendingResult | {
34
+ readonly rooms: readonly QueryRoom[];
35
+ };
36
+ export type FiguresSources = {
37
+ cover(): Promise<FiguresCover>;
38
+ rooms(rooms: readonly QueryRoom[], since: string): Promise<readonly RoomTally[]>;
39
+ conversations(conversations: readonly string[] | null, since: string): Promise<readonly ConversationTally[]>;
40
+ };
41
+ export type FiguresRead = {
42
+ watch(deliver: Deliver, fail: Fail): () => void;
43
+ touched(set: ChangeSet): void;
44
+ recover(): void;
45
+ close(): void;
46
+ };
47
+ export declare function createFigures(sources: FiguresSources): FiguresRead;
48
+ //# sourceMappingURL=figures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"figures.d.ts","sourceRoot":"","sources":["../src/figures.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC,eAAO,MAAM,WAAW;;;;iBAGZ,IAAI;;CACe,CAAC;AAWhC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC;CAChF,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjG,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,aAAa,CAAC;AAEpD,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,KAAK,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACjF,aAAa,CACX,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,EACvC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAAC;IAChD,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAgDF,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAsIlE"}
@@ -0,0 +1,197 @@
1
+ import { instantKey } from '@agentshouse/mdmodel';
2
+ export const HOUSE_DIRECTORY = 'house';
3
+ export const ROOM_TOTALS = {
4
+ outside: [HOUSE_DIRECTORY],
5
+ groupBy: ['room'],
6
+ select: { size: true },
7
+ };
8
+ // Today's Last 24 hours is the day that ends as the read answers.
9
+ const DAY_MS = 86_400_000;
10
+ // An install or a catch-up commits many times a second, so the figures answer again once changes rest this long, never per commit.
11
+ const SETTLED_MS = 1_000;
12
+ // Changes that never rest, such as an Agent writing all afternoon, still reach the figures this long after the first of them.
13
+ const LONGEST_UNSETTLED_MS = 5_000;
14
+ function dayOf(tally, since) {
15
+ const after = (at) => at !== null && at >= since;
16
+ return {
17
+ created: tally.documentTimes.filter(([created]) => after(created)).length,
18
+ changed: tally.documentTimes.filter(([created, changed]) => !after(created) && after(changed))
19
+ .length,
20
+ chats: tally.chatTimes.filter(after).length,
21
+ messages: tally.messageTimes.filter(after).length,
22
+ };
23
+ }
24
+ function figuresOf(rooms, held, since) {
25
+ return {
26
+ rooms: rooms.map(({ locator }) => {
27
+ const tally = held.rooms.get(locator);
28
+ return {
29
+ room: locator,
30
+ day: dayOf(tally, since),
31
+ total: { documents: tally.documents, files: tally.files },
32
+ };
33
+ }),
34
+ agentMessages: [...held.said.values()].reduce((sum, said) => sum + said.filter((at) => at >= since).length, 0),
35
+ };
36
+ }
37
+ function unheld() {
38
+ return {
39
+ rooms: new Map(),
40
+ said: new Map(),
41
+ staleRooms: new Set(),
42
+ staleConversations: new Set(),
43
+ everyConversation: true,
44
+ };
45
+ }
46
+ export function createFigures(sources) {
47
+ const listeners = new Map();
48
+ const answered = new Set();
49
+ let held = unheld();
50
+ let shown = null;
51
+ let running = false;
52
+ let again = false;
53
+ let quiet = null;
54
+ let longest = null;
55
+ let closed = false;
56
+ function unscheduled() {
57
+ if (quiet !== null)
58
+ clearTimeout(quiet);
59
+ if (longest !== null)
60
+ clearTimeout(longest);
61
+ quiet = null;
62
+ longest = null;
63
+ }
64
+ function deliver(answer) {
65
+ const text = JSON.stringify(answer);
66
+ const changed = text !== shown;
67
+ shown = text;
68
+ for (const listener of listeners.keys()) {
69
+ if (changed || !answered.has(listener))
70
+ listener(structuredClone(answer));
71
+ answered.add(listener);
72
+ }
73
+ }
74
+ async function tallied(rooms, since) {
75
+ for (const locator of held.rooms.keys()) {
76
+ if (!rooms.some((room) => room.locator === locator))
77
+ held.rooms.delete(locator);
78
+ }
79
+ const asked = rooms.filter(({ locator, key }) => held.staleRooms.has(locator) || held.rooms.get(locator)?.key !== key);
80
+ for (const { locator } of asked)
81
+ held.staleRooms.delete(locator);
82
+ const every = held.everyConversation;
83
+ const conversations = every ? null : [...held.staleConversations];
84
+ held.everyConversation = false;
85
+ held.staleConversations.clear();
86
+ const kept = held;
87
+ const [roomTallies, said] = await Promise.all([
88
+ asked.length === 0 ? [] : sources.rooms(asked, since),
89
+ conversations?.length === 0 ? [] : sources.conversations(conversations, since),
90
+ ]);
91
+ if (kept !== held)
92
+ return false;
93
+ for (const tally of roomTallies) {
94
+ const room = asked.find(({ key }) => key === tally.key);
95
+ if (room !== undefined)
96
+ held.rooms.set(room.locator, tally);
97
+ }
98
+ if (every)
99
+ held.said.clear();
100
+ for (const { conversation, said: times } of said) {
101
+ if (times.length === 0)
102
+ held.said.delete(conversation);
103
+ else
104
+ held.said.set(conversation, times);
105
+ }
106
+ return true;
107
+ }
108
+ async function answer() {
109
+ const window = new Date(Date.now() - DAY_MS).toISOString();
110
+ const cover = await sources.cover();
111
+ if ('pending' in cover)
112
+ return cover;
113
+ if (!(await tallied(cover.rooms, window)))
114
+ return null;
115
+ return figuresOf(cover.rooms, held, instantKey(window));
116
+ }
117
+ async function run() {
118
+ if (running) {
119
+ again = true;
120
+ return;
121
+ }
122
+ running = true;
123
+ try {
124
+ do {
125
+ again = false;
126
+ const result = await answer();
127
+ if (closed || listeners.size === 0)
128
+ return;
129
+ if (result === null)
130
+ again = true;
131
+ else
132
+ deliver(result);
133
+ } while (again && !closed && listeners.size > 0);
134
+ }
135
+ catch (error) {
136
+ for (const [listener, failed] of listeners) {
137
+ if (!answered.has(listener))
138
+ failed(error);
139
+ }
140
+ }
141
+ finally {
142
+ running = false;
143
+ }
144
+ }
145
+ function stop(listener) {
146
+ return () => {
147
+ listeners.delete(listener);
148
+ answered.delete(listener);
149
+ if (listeners.size > 0)
150
+ return;
151
+ unscheduled();
152
+ held = unheld();
153
+ shown = null;
154
+ };
155
+ }
156
+ function settle() {
157
+ if (closed || listeners.size === 0)
158
+ return;
159
+ const now = () => {
160
+ unscheduled();
161
+ void run();
162
+ };
163
+ if (quiet !== null)
164
+ clearTimeout(quiet);
165
+ quiet = setTimeout(now, SETTLED_MS);
166
+ longest ??= setTimeout(now, LONGEST_UNSETTLED_MS);
167
+ }
168
+ return {
169
+ watch(listener, failed) {
170
+ listeners.set(listener, failed);
171
+ void run();
172
+ return stop(listener);
173
+ },
174
+ touched(set) {
175
+ if (listeners.size === 0)
176
+ return;
177
+ for (const { locator } of set.documents)
178
+ held.staleRooms.add(locator);
179
+ for (const locator of set.rooms)
180
+ held.staleRooms.add(locator);
181
+ for (const conversation of set.conversations)
182
+ held.staleConversations.add(conversation);
183
+ if (set.documents.length + set.rooms.length + set.conversations.length > 0)
184
+ settle();
185
+ },
186
+ recover() {
187
+ if (listeners.size > 0)
188
+ settle();
189
+ },
190
+ close() {
191
+ closed = true;
192
+ unscheduled();
193
+ listeners.clear();
194
+ answered.clear();
195
+ },
196
+ };
197
+ }
package/dist/file.d.ts CHANGED
@@ -1,20 +1,3 @@
1
- export type ChatDraftFile = {
2
- name: string;
3
- blob: Blob;
4
- };
5
- export type FileDeclaration = {
6
- name: string;
7
- mediaType: string;
8
- byteLength: number;
9
- contentHash: string;
10
- width?: number;
11
- height?: number;
12
- };
13
- export type Extent = {
14
- width: number;
15
- height: number;
16
- };
17
- export declare function extentOf(bytes: Uint8Array): Extent | null;
18
- export declare function hexDigest(digest: ArrayBuffer): string;
19
- export declare function declaredFile(file: ChatDraftFile): Promise<FileDeclaration>;
1
+ import type { AttachRequest } from './adapter.js';
2
+ export declare function attachedFile(locator: string, file: File): Promise<AttachRequest>;
20
3
  //# sourceMappingURL=file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AA2GvD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAQzD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAErD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAUhF"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAStF"}