@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
@@ -0,0 +1,19 @@
1
+ export function runtimeError(code, message = code, retryable = false) {
2
+ return Object.assign(new Error(message), { code, retryable });
3
+ }
4
+ function coded(error) {
5
+ return (error instanceof Error &&
6
+ 'code' in error &&
7
+ typeof error.code === 'string' &&
8
+ 'retryable' in error &&
9
+ typeof error.retryable === 'boolean');
10
+ }
11
+ export function failed(error) {
12
+ if (coded(error))
13
+ return error;
14
+ return runtimeError('runtime-failure', error instanceof Error ? error.message : String(error));
15
+ }
16
+ export function described(error) {
17
+ const { message, code, retryable } = failed(error);
18
+ return { message, code, retryable };
19
+ }
@@ -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"}
package/dist/file.js CHANGED
@@ -1,126 +1,11 @@
1
- const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
2
- const WEBP_SYNC = [0x9d, 0x01, 0x2a];
3
- const SHAPELESS_JPEG_MARKERS = new Set([0xc4, 0xc8, 0xcc]);
4
- const BMFF_CONTAINERS = new Set(['meta', 'iprp', 'ipco']);
5
- function starts(bytes, signature, at = 0) {
6
- return signature.every((value, index) => bytes[at + index] === value);
7
- }
8
- function text(bytes, at, length) {
9
- return String.fromCharCode(...bytes.subarray(at, at + length));
10
- }
11
- function bigEndian(bytes, at, length) {
12
- let value = 0;
13
- for (let index = 0; index < length; index += 1)
14
- value = value * 256 + (bytes[at + index] ?? 0);
15
- return value;
16
- }
17
- function littleEndian(bytes, at, length) {
18
- let value = 0;
19
- for (let index = length - 1; index >= 0; index -= 1)
20
- value = value * 256 + (bytes[at + index] ?? 0);
21
- return value;
22
- }
23
- function pngExtent(bytes) {
24
- if (bytes.length < 24 || !starts(bytes, PNG_SIGNATURE))
25
- return null;
26
- if (text(bytes, 12, 4) !== 'IHDR')
27
- return null;
28
- return { width: bigEndian(bytes, 16, 4), height: bigEndian(bytes, 20, 4) };
29
- }
30
- function gifExtent(bytes) {
31
- if (bytes.length < 10 || text(bytes, 0, 3) !== 'GIF')
32
- return null;
33
- return { width: littleEndian(bytes, 6, 2), height: littleEndian(bytes, 8, 2) };
34
- }
35
- function jpegExtent(bytes) {
36
- if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8)
37
- return null;
38
- let at = 2;
39
- while (at + 9 < bytes.length) {
40
- if (bytes[at] !== 0xff)
41
- return null;
42
- const marker = bytes[at + 1] ?? 0;
43
- if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {
44
- at += 2;
45
- continue;
46
- }
47
- const length = bigEndian(bytes, at + 2, 2);
48
- if (marker >= 0xc0 && marker <= 0xcf && !SHAPELESS_JPEG_MARKERS.has(marker)) {
49
- return { width: bigEndian(bytes, at + 7, 2), height: bigEndian(bytes, at + 5, 2) };
50
- }
51
- if (length < 2)
52
- return null;
53
- at += 2 + length;
54
- }
55
- return null;
56
- }
57
- function webpExtent(bytes) {
58
- if (bytes.length < 30 || text(bytes, 0, 4) !== 'RIFF' || text(bytes, 8, 4) !== 'WEBP')
59
- return null;
60
- const chunk = text(bytes, 12, 4);
61
- if (chunk === 'VP8X') {
62
- return {
63
- width: littleEndian(bytes, 24, 3) + 1,
64
- height: littleEndian(bytes, 27, 3) + 1,
65
- };
66
- }
67
- if (chunk === 'VP8 ' && starts(bytes, WEBP_SYNC, 23)) {
68
- return {
69
- width: littleEndian(bytes, 26, 2) & 0x3fff,
70
- height: littleEndian(bytes, 28, 2) & 0x3fff,
71
- };
72
- }
73
- if (chunk === 'VP8L' && bytes[20] === 0x2f) {
74
- const packed = littleEndian(bytes, 21, 4);
75
- return { width: (packed & 0x3fff) + 1, height: ((packed >>> 14) & 0x3fff) + 1 };
76
- }
77
- return null;
78
- }
79
- function spatialExtent(bytes, from, to) {
80
- let at = from;
81
- while (at + 8 <= to) {
82
- const size = bigEndian(bytes, at, 4);
83
- const name = text(bytes, at + 4, 4);
84
- const end = size === 0 ? to : at + size;
85
- if (size === 1 || end <= at || end > to)
86
- return null;
87
- if (name === 'ispe') {
88
- if (end < at + 20)
89
- return null;
90
- return { width: bigEndian(bytes, at + 12, 4), height: bigEndian(bytes, at + 16, 4) };
91
- }
92
- if (BMFF_CONTAINERS.has(name)) {
93
- const inner = spatialExtent(bytes, at + (name === 'meta' ? 12 : 8), end);
94
- if (inner !== null)
95
- return inner;
96
- }
97
- at = end;
98
- }
99
- return null;
100
- }
101
- function bmffExtent(bytes) {
102
- if (bytes.length < 16 || text(bytes, 4, 4) !== 'ftyp')
103
- return null;
104
- return spatialExtent(bytes, 0, bytes.length);
105
- }
106
- export function extentOf(bytes) {
107
- return (pngExtent(bytes) ??
108
- jpegExtent(bytes) ??
109
- gifExtent(bytes) ??
110
- webpExtent(bytes) ??
111
- bmffExtent(bytes));
112
- }
113
- export function hexDigest(digest) {
114
- return [...new Uint8Array(digest)].map((value) => value.toString(16).padStart(2, '0')).join('');
115
- }
116
- export async function declaredFile(file) {
117
- const bytes = new Uint8Array(await file.blob.arrayBuffer());
118
- const extent = file.blob.type.startsWith('image/') ? extentOf(bytes) : null;
1
+ import { sha256 } from './digest.js';
2
+ export async function attachedFile(locator, file) {
119
3
  return {
4
+ locator,
120
5
  name: file.name,
121
- mediaType: file.blob.type,
122
- byteLength: bytes.byteLength,
123
- contentHash: hexDigest(await crypto.subtle.digest('SHA-256', bytes)),
124
- ...(extent === null ? {} : extent),
6
+ mediaType: file.type,
7
+ byteLength: file.size,
8
+ sha256: await sha256(file),
9
+ blob: file,
125
10
  };
126
11
  }
package/dist/host.d.ts CHANGED
@@ -1,13 +1,29 @@
1
1
  import { type MdRuntimeOptions } from './connection.js';
2
+ import type { PortReach } from './reach.js';
3
+ import type { CodeAvailability, Persistence, Readiness } from './readiness.js';
4
+ import type { EntrySeed } from './seed.js';
2
5
  import { type RuntimePort } from './wire.js';
3
6
  export type MdRuntimeHostOptions = MdRuntimeOptions & {
4
7
  deploymentFacts?: unknown;
5
8
  };
9
+ export type AttachedPort = {
10
+ detach(): void;
11
+ narrow(reach: PortReach): void;
12
+ readiness(deliver: (readiness: Readiness) => void): () => void;
13
+ answered(queries: readonly unknown[], done: () => void): void;
14
+ };
6
15
  export type MdRuntimeHost = {
7
- attach(port: RuntimePort, app: string, release?: string): () => void;
8
- endAuthorization(): Promise<void>;
16
+ attach(port: RuntimePort, app: string, release?: string, reach?: PortReach, code?: CodeAvailability): AttachedPort;
17
+ present(app: string, members: Readonly<Record<string, unknown>>): Promise<void>;
18
+ seed(entry: EntrySeed): void;
19
+ persisted(answer: Persistence): void;
20
+ endAuthorization(holder?: string): Promise<void>;
9
21
  stop(): Promise<void>;
10
22
  };
11
23
  export declare function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost;
24
+ export { entrySeedOf, type EntrySeed } from './seed.js';
25
+ export type { PortReach, ReachedDocument } from './reach.js';
26
+ export type { CodeAvailability, Persistence, Space } from './readiness.js';
27
+ export { createRecovery, retryDelay, type Attempt, type Attempted, type AttemptOptions, type Recovery, type RecoveryOptions, } from './recovery.js';
12
28
  export type { RuntimePort } from './wire.js';
13
29
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAML,KAAK,WAAW,EAIjB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IACrE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AA0EF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAwG3E;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAIxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAG3C,OAAO,EAGL,KAAK,WAAW,EAOjB,MAAM,WAAW,CAAC;AAInB,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,gBAAgB,GACtB,YAAY,CAAC;IAChB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAsIF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAuL3E;AAED,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,UAAU,EACV,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}