@agentshouse/mdruntime 0.1.0-cb1f56e16291b → 0.1.0-cb3bb3b233fa1

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 (327) hide show
  1. package/README.md +21 -19
  2. package/dist/acceptance.d.ts +3 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +299 -0
  5. package/dist/act-lanes.d.ts +30 -0
  6. package/dist/act-lanes.d.ts.map +1 -0
  7. package/dist/act-lanes.js +225 -0
  8. package/dist/actions.d.ts +26 -0
  9. package/dist/actions.d.ts.map +1 -0
  10. package/dist/actions.js +302 -0
  11. package/dist/adapter.d.ts +113 -81
  12. package/dist/adapter.d.ts.map +1 -1
  13. package/dist/attached-model.d.ts +3 -11
  14. package/dist/attached-model.d.ts.map +1 -1
  15. package/dist/attached-model.js +20 -60
  16. package/dist/authored.d.ts +88 -0
  17. package/dist/authored.d.ts.map +1 -0
  18. package/dist/authored.js +345 -0
  19. package/dist/bootstrap.d.ts +9 -5
  20. package/dist/bootstrap.d.ts.map +1 -1
  21. package/dist/bootstrap.js +204 -85
  22. package/dist/cell.d.ts +6 -0
  23. package/dist/cell.d.ts.map +1 -0
  24. package/dist/cell.js +9 -0
  25. package/dist/chain.d.ts +2 -1
  26. package/dist/chain.d.ts.map +1 -1
  27. package/dist/change-set.d.ts +4 -0
  28. package/dist/change-set.d.ts.map +1 -1
  29. package/dist/change-set.js +6 -0
  30. package/dist/change.d.ts +5 -0
  31. package/dist/change.d.ts.map +1 -1
  32. package/dist/change.js +7 -2
  33. package/dist/chat-types.d.ts +3 -0
  34. package/dist/chat-types.d.ts.map +1 -0
  35. package/dist/chat-types.js +11 -0
  36. package/dist/client.d.ts +30 -22
  37. package/dist/client.d.ts.map +1 -1
  38. package/dist/client.js +39 -20
  39. package/dist/collection.d.ts +26 -4
  40. package/dist/collection.d.ts.map +1 -1
  41. package/dist/collection.js +19 -2
  42. package/dist/column.d.ts +5 -0
  43. package/dist/column.d.ts.map +1 -0
  44. package/dist/column.js +9 -0
  45. package/dist/compile.d.ts +9 -7
  46. package/dist/compile.d.ts.map +1 -1
  47. package/dist/compile.js +252 -318
  48. package/dist/connection.d.ts +5 -141
  49. package/dist/connection.d.ts.map +1 -1
  50. package/dist/connection.js +111 -5282
  51. package/dist/context.d.ts.map +1 -1
  52. package/dist/context.js +1 -1
  53. package/dist/conversation-live.d.ts +150 -0
  54. package/dist/conversation-live.d.ts.map +1 -0
  55. package/dist/conversation-live.js +259 -0
  56. package/dist/conversation-row.d.ts +40 -0
  57. package/dist/conversation-row.d.ts.map +1 -0
  58. package/dist/conversation-row.js +66 -0
  59. package/dist/conversation.d.ts +62 -43
  60. package/dist/conversation.d.ts.map +1 -1
  61. package/dist/conversation.js +987 -902
  62. package/dist/declaration.d.ts +10 -0
  63. package/dist/declaration.d.ts.map +1 -0
  64. package/dist/declaration.js +24 -0
  65. package/dist/discovery.d.ts +10 -0
  66. package/dist/discovery.d.ts.map +1 -0
  67. package/dist/discovery.js +150 -0
  68. package/dist/durability.d.ts +19 -0
  69. package/dist/durability.d.ts.map +1 -1
  70. package/dist/durability.js +4 -0
  71. package/dist/entry.d.ts +2 -2
  72. package/dist/entry.d.ts.map +1 -1
  73. package/dist/entry.js +18 -9
  74. package/dist/expectation.d.ts +26 -13
  75. package/dist/expectation.d.ts.map +1 -1
  76. package/dist/expectation.js +72 -19
  77. package/dist/failure.d.ts +3 -0
  78. package/dist/failure.d.ts.map +1 -1
  79. package/dist/failure.js +6 -0
  80. package/dist/figures.d.ts +49 -0
  81. package/dist/figures.d.ts.map +1 -0
  82. package/dist/figures.js +199 -0
  83. package/dist/file.d.ts +1 -1
  84. package/dist/file.d.ts.map +1 -1
  85. package/dist/file.js +3 -2
  86. package/dist/holdings.d.ts +29 -0
  87. package/dist/holdings.d.ts.map +1 -0
  88. package/dist/holdings.js +95 -0
  89. package/dist/host.d.ts +20 -4
  90. package/dist/host.d.ts.map +1 -1
  91. package/dist/host.js +72 -28
  92. package/dist/identity.d.ts +0 -1
  93. package/dist/identity.d.ts.map +1 -1
  94. package/dist/identity.js +0 -3
  95. package/dist/index.d.ts +32 -12
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +14 -5
  98. package/dist/install.d.ts +60 -0
  99. package/dist/install.d.ts.map +1 -0
  100. package/dist/install.js +537 -0
  101. package/dist/lifecycle.d.ts +7 -0
  102. package/dist/lifecycle.d.ts.map +1 -0
  103. package/dist/lifecycle.js +282 -0
  104. package/dist/listing.d.ts +52 -0
  105. package/dist/listing.d.ts.map +1 -0
  106. package/dist/listing.js +152 -0
  107. package/dist/live.d.ts +8 -6
  108. package/dist/live.d.ts.map +1 -1
  109. package/dist/live.js +110 -31
  110. package/dist/loaded.d.ts +5 -0
  111. package/dist/loaded.d.ts.map +1 -0
  112. package/dist/loaded.js +40 -0
  113. package/dist/locks.d.ts +7 -0
  114. package/dist/locks.d.ts.map +1 -0
  115. package/dist/locks.js +32 -0
  116. package/dist/lost.d.ts +5 -0
  117. package/dist/lost.d.ts.map +1 -0
  118. package/dist/lost.js +49 -0
  119. package/dist/media.d.ts +6 -1
  120. package/dist/media.d.ts.map +1 -1
  121. package/dist/media.js +68 -17
  122. package/dist/memory.d.ts +11 -3
  123. package/dist/memory.d.ts.map +1 -1
  124. package/dist/memory.js +132 -33
  125. package/dist/messages.d.ts +33 -3
  126. package/dist/messages.d.ts.map +1 -1
  127. package/dist/messages.js +98 -27
  128. package/dist/model.d.ts +2 -10
  129. package/dist/model.d.ts.map +1 -1
  130. package/dist/model.js +0 -14
  131. package/dist/models.d.ts +10 -0
  132. package/dist/models.d.ts.map +1 -0
  133. package/dist/models.js +153 -0
  134. package/dist/observation.d.ts +27 -12
  135. package/dist/observation.d.ts.map +1 -1
  136. package/dist/observation.js +184 -85
  137. package/dist/opened.d.ts +1 -1
  138. package/dist/opened.d.ts.map +1 -1
  139. package/dist/opened.js +5 -5
  140. package/dist/opening.d.ts +4 -0
  141. package/dist/opening.d.ts.map +1 -0
  142. package/dist/opening.js +53 -0
  143. package/dist/outcome.d.ts +17 -2
  144. package/dist/outcome.d.ts.map +1 -1
  145. package/dist/outcome.js +35 -2
  146. package/dist/overlay.d.ts +7 -2
  147. package/dist/overlay.d.ts.map +1 -1
  148. package/dist/overlay.js +48 -24
  149. package/dist/page-metadata.d.ts +8 -0
  150. package/dist/page-metadata.d.ts.map +1 -0
  151. package/dist/page-metadata.js +19 -0
  152. package/dist/parts.d.ts +4 -0
  153. package/dist/parts.d.ts.map +1 -0
  154. package/dist/parts.js +13 -0
  155. package/dist/paths.d.ts +1 -0
  156. package/dist/paths.d.ts.map +1 -1
  157. package/dist/paths.js +22 -0
  158. package/dist/preparation.d.ts +41 -0
  159. package/dist/preparation.d.ts.map +1 -0
  160. package/dist/preparation.js +314 -0
  161. package/dist/presence.d.ts +58 -0
  162. package/dist/presence.d.ts.map +1 -0
  163. package/dist/presence.js +231 -0
  164. package/dist/queries.d.ts +16 -0
  165. package/dist/queries.d.ts.map +1 -0
  166. package/dist/queries.js +308 -0
  167. package/dist/query.d.ts +13 -213
  168. package/dist/query.d.ts.map +1 -1
  169. package/dist/query.js +3 -524
  170. package/dist/questions.d.ts +30 -0
  171. package/dist/questions.d.ts.map +1 -0
  172. package/dist/questions.js +116 -0
  173. package/dist/queue.d.ts +40 -0
  174. package/dist/queue.d.ts.map +1 -0
  175. package/dist/queue.js +480 -0
  176. package/dist/reach.d.ts +10 -10
  177. package/dist/reach.d.ts.map +1 -1
  178. package/dist/reach.js +235 -120
  179. package/dist/react.d.ts +17 -3
  180. package/dist/react.d.ts.map +1 -1
  181. package/dist/react.js +33 -1
  182. package/dist/read.d.ts +7 -0
  183. package/dist/read.d.ts.map +1 -0
  184. package/dist/read.js +17 -0
  185. package/dist/readiness.d.ts +9 -4
  186. package/dist/readiness.d.ts.map +1 -1
  187. package/dist/readiness.js +3 -5
  188. package/dist/reads.d.ts +39 -0
  189. package/dist/reads.d.ts.map +1 -0
  190. package/dist/reads.js +178 -0
  191. package/dist/recovery.d.ts +3 -1
  192. package/dist/recovery.d.ts.map +1 -1
  193. package/dist/recovery.js +38 -8
  194. package/dist/refresh.d.ts +1 -1
  195. package/dist/refresh.d.ts.map +1 -1
  196. package/dist/refresh.js +10 -22
  197. package/dist/refusal.d.ts +5 -0
  198. package/dist/refusal.d.ts.map +1 -0
  199. package/dist/refusal.js +55 -0
  200. package/dist/replica.d.ts +11 -16
  201. package/dist/replica.d.ts.map +1 -1
  202. package/dist/replica.js +66 -35
  203. package/dist/retried.d.ts +30 -0
  204. package/dist/retried.d.ts.map +1 -0
  205. package/dist/retried.js +72 -0
  206. package/dist/room-draft.d.ts +32 -9
  207. package/dist/room-draft.d.ts.map +1 -1
  208. package/dist/room-draft.js +273 -66
  209. package/dist/room-drafts.d.ts +24 -0
  210. package/dist/room-drafts.d.ts.map +1 -0
  211. package/dist/room-drafts.js +220 -0
  212. package/dist/room-list.d.ts +10 -0
  213. package/dist/room-list.d.ts.map +1 -0
  214. package/dist/room-list.js +45 -0
  215. package/dist/rows.d.ts +16 -23
  216. package/dist/rows.d.ts.map +1 -1
  217. package/dist/rows.js +49 -191
  218. package/dist/runtime.d.ts +34 -0
  219. package/dist/runtime.d.ts.map +1 -0
  220. package/dist/runtime.js +1 -0
  221. package/dist/save.d.ts +42 -86
  222. package/dist/save.d.ts.map +1 -1
  223. package/dist/save.js +332 -228
  224. package/dist/saves.d.ts +34 -0
  225. package/dist/saves.d.ts.map +1 -0
  226. package/dist/saves.js +437 -0
  227. package/dist/search.d.ts.map +1 -1
  228. package/dist/search.js +1 -1
  229. package/dist/seed.d.ts +11 -2
  230. package/dist/seed.d.ts.map +1 -1
  231. package/dist/seed.js +71 -1
  232. package/dist/shared.d.ts +1 -6
  233. package/dist/shared.d.ts.map +1 -1
  234. package/dist/shared.js +13 -95
  235. package/dist/shown.d.ts +33 -0
  236. package/dist/shown.d.ts.map +1 -0
  237. package/dist/shown.js +309 -0
  238. package/dist/socket/admission.d.ts +7 -0
  239. package/dist/socket/admission.d.ts.map +1 -0
  240. package/dist/socket/admission.js +39 -0
  241. package/dist/socket/answers.d.ts +6 -0
  242. package/dist/socket/answers.d.ts.map +1 -0
  243. package/dist/socket/answers.js +20 -0
  244. package/dist/socket/lanes.d.ts +28 -0
  245. package/dist/socket/lanes.d.ts.map +1 -0
  246. package/dist/socket/lanes.js +103 -0
  247. package/dist/socket/reads.d.ts +10 -0
  248. package/dist/socket/reads.d.ts.map +1 -0
  249. package/dist/socket/reads.js +31 -0
  250. package/dist/socket/session.d.ts +38 -0
  251. package/dist/socket/session.d.ts.map +1 -0
  252. package/dist/socket/session.js +23 -0
  253. package/dist/socket.d.ts +67 -0
  254. package/dist/socket.d.ts.map +1 -0
  255. package/dist/socket.js +164 -0
  256. package/dist/source.d.ts +59 -0
  257. package/dist/source.d.ts.map +1 -0
  258. package/dist/source.js +93 -0
  259. package/dist/status.d.ts +0 -2
  260. package/dist/status.d.ts.map +1 -1
  261. package/dist/status.js +0 -6
  262. package/dist/store/installs.d.ts +30 -0
  263. package/dist/store/installs.d.ts.map +1 -0
  264. package/dist/store/installs.js +40 -0
  265. package/dist/store/readiness.d.ts +11 -0
  266. package/dist/store/readiness.d.ts.map +1 -0
  267. package/dist/store/readiness.js +68 -0
  268. package/dist/store/records.d.ts +223 -0
  269. package/dist/store/records.d.ts.map +1 -0
  270. package/dist/store/records.js +465 -0
  271. package/dist/store/room-held.d.ts +8 -0
  272. package/dist/store/room-held.d.ts.map +1 -0
  273. package/dist/store/room-held.js +17 -0
  274. package/dist/store/rooms-shown.d.ts +8 -0
  275. package/dist/store/rooms-shown.d.ts.map +1 -0
  276. package/dist/store/rooms-shown.js +13 -0
  277. package/dist/store/space.d.ts +11 -0
  278. package/dist/store/space.d.ts.map +1 -0
  279. package/dist/store/space.js +41 -0
  280. package/dist/store/watchers.d.ts +17 -0
  281. package/dist/store/watchers.d.ts.map +1 -0
  282. package/dist/store/watchers.js +56 -0
  283. package/dist/store/writes.d.ts +24 -0
  284. package/dist/store/writes.d.ts.map +1 -0
  285. package/dist/store/writes.js +125 -0
  286. package/dist/store.d.ts +115 -152
  287. package/dist/store.d.ts.map +1 -1
  288. package/dist/store.js +171 -395
  289. package/dist/stored.d.ts +72 -67
  290. package/dist/stored.d.ts.map +1 -1
  291. package/dist/stored.js +317 -166
  292. package/dist/surface.d.ts +90 -0
  293. package/dist/surface.d.ts.map +1 -0
  294. package/dist/surface.js +225 -0
  295. package/dist/sync.d.ts +19 -0
  296. package/dist/sync.d.ts.map +1 -0
  297. package/dist/sync.js +536 -0
  298. package/dist/tables.d.ts +112 -89
  299. package/dist/tables.d.ts.map +1 -1
  300. package/dist/tables.js +197 -283
  301. package/dist/tallies.d.ts +18 -0
  302. package/dist/tallies.d.ts.map +1 -0
  303. package/dist/tallies.js +128 -0
  304. package/dist/validation.d.ts.map +1 -1
  305. package/dist/validation.js +9 -12
  306. package/dist/windows.d.ts +1 -12
  307. package/dist/windows.d.ts.map +1 -1
  308. package/dist/windows.js +2 -75
  309. package/dist/wire.d.ts +68 -7
  310. package/dist/wire.d.ts.map +1 -1
  311. package/dist/wire.js +23 -4
  312. package/package.json +3 -2
  313. package/dist/attempt.d.ts +0 -16
  314. package/dist/attempt.d.ts.map +0 -1
  315. package/dist/attempt.js +0 -70
  316. package/dist/fence.d.ts +0 -6
  317. package/dist/fence.d.ts.map +0 -1
  318. package/dist/fence.js +0 -10
  319. package/dist/job.d.ts +0 -14
  320. package/dist/job.d.ts.map +0 -1
  321. package/dist/job.js +0 -28
  322. package/dist/log.d.ts +0 -5
  323. package/dist/log.d.ts.map +0 -1
  324. package/dist/log.js +0 -14
  325. package/dist/phrase.d.ts +0 -3
  326. package/dist/phrase.d.ts.map +0 -1
  327. package/dist/phrase.js +0 -8
@@ -0,0 +1,34 @@
1
+ import { type ChangeBatch, type WrittenBy } from './change.js';
2
+ import type { ConversationFiles } from './conversation.js';
3
+ import { type AttachAnswer, type BinaryLinkAnswer, type HeldBinaryAnswer, type HeldShownAnswer } from './outcome.js';
4
+ import { type RoomDraftParts } from './room-draft.js';
5
+ import type { Runtime } from './runtime.js';
6
+ import { type SaveRefusal } from './save.js';
7
+ import type { Store } from './store.js';
8
+ export type SaveResult = {
9
+ outcome: 'saved';
10
+ identifier: string;
11
+ } | ({
12
+ outcome: 'refused';
13
+ } & SaveRefusal);
14
+ export type SavedRoomDraft = {
15
+ readonly path: string;
16
+ readonly revision: string;
17
+ };
18
+ export type SavedParts = {
19
+ readonly path: string;
20
+ readonly parts: RoomDraftParts;
21
+ };
22
+ export type BinaryFileSurface = {
23
+ read(room: string, path: string, revision?: string): Promise<HeldBinaryAnswer>;
24
+ link(room: string, path: string, revision?: string): Promise<BinaryLinkAnswer>;
25
+ show(room: string, path: string, revision?: string): Promise<HeldShownAnswer>;
26
+ attach(room: string, file: File): Promise<AttachAnswer>;
27
+ part(file: string, part: number): Promise<Uint8Array | null>;
28
+ };
29
+ export declare function saveRoomDrafts(runtime: Runtime, locator: string, named: readonly SavedRoomDraft[], writtenBy: WrittenBy | undefined): Promise<SaveResult>;
30
+ export declare function saveParts(runtime: Runtime, locator: string, named: readonly SavedParts[], writtenBy: WrittenBy | undefined): Promise<SaveResult>;
31
+ export declare function batchFile(store: Store, batch: ChangeBatch): (localId: string) => Promise<Blob>;
32
+ export declare function conversationFiles(runtime: Runtime): ConversationFiles;
33
+ export declare function binaryFileSurface(runtime: Runtime): BinaryFileSurface;
34
+ //# sourceMappingURL=saves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"saves.d.ts","sourceRoot":"","sources":["../src/saves.ts"],"names":[],"mappings":"AAUA,OAAO,EAA2B,KAAK,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EASL,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAGrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAatB,OAAO,EAQL,KAAK,cAAc,EAGpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAGL,KAAK,WAAW,EAGjB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAsB,KAAK,EAAoB,MAAM,YAAY,CAAC;AAK9E,MAAM,MAAM,UAAU,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACxC,CAAC;IAAE,OAAO,EAAE,SAAS,CAAA;CAAE,GAAG,WAAW,CAAC,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAElF,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC/E,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9E,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;CAC9D,CAAC;AAYF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,cAAc,EAAE,EAChC,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,OAAO,CAAC,UAAU,CAAC,CAsCrB;AAuBD,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,SAAS,EAAE,SAAS,GAAG,SAAS,GAC/B,OAAO,CAAC,UAAU,CAAC,CAyBrB;AAgOD,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAK9F;AA+PD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAKrE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAQrE"}
package/dist/saves.js ADDED
@@ -0,0 +1,437 @@
1
+ import { isImageType, parse } from '@agentshouse/mdmodel';
2
+ import { binaryRecord } from './binary.js';
3
+ import { changeSet } from './change-set.js';
4
+ import { queuedFile } from './change.js';
5
+ import { available, textType } from './collection.js';
6
+ import { runtimeError } from './failure.js';
7
+ import { attachedFile } from './file.js';
8
+ import { roomDraftRevision } from './identity.js';
9
+ import { compositionFor } from './listing.js';
10
+ import { scoped } from './models.js';
11
+ import { absentBinary, attachAnswer, binaryAnswer, binaryLinkAnswer, failure, linkedAnswer, OFFLINE, UNCERTAIN, } from './outcome.js';
12
+ import { sameBinary } from './overlay.js';
13
+ import { ancestors } from './paths.js';
14
+ import { connectionNow } from './preparation.js';
15
+ import { append, sliceAt, withdrawable } from './queue.js';
16
+ import { entryAt, replaying, slicing, } from './replica.js';
17
+ import { binaryBase, changesOf, held, heldFile, joinedOver, moveTarget, readSavedParts, } from './room-draft.js';
18
+ import { refuse } from './refusal.js';
19
+ import { visibleOf } from './room-drafts.js';
20
+ import { destination, planSave, } from './save.js';
21
+ import { pendingShown } from './shown.js';
22
+ import { paced, ROW_WEIGHT, stepped } from './turn.js';
23
+ import { validatedNeighbourhood } from './validation.js';
24
+ const FULL = { outcome: 'refused', code: 'durable-write', retryable: true };
25
+ async function savedRoom({ store, presence }, locator) {
26
+ const replica = await store.replica(locator);
27
+ if (replica === undefined || presence.lost(locator)) {
28
+ throw runtimeError('unknown-room', `Unknown Room ${locator}`);
29
+ }
30
+ return replica;
31
+ }
32
+ export function saveRoomDrafts(runtime, locator, named, writtenBy) {
33
+ const { store } = runtime;
34
+ return store.exclusive(async () => {
35
+ if (store.space.full())
36
+ return FULL;
37
+ const replica = await savedRoom(runtime, locator);
38
+ const drafts = new Map((await store.drafts(locator, named.map(({ path }) => path))).map((record) => [record.path, record]));
39
+ const saved = [];
40
+ for (const { path, revision } of named) {
41
+ const record = drafts.get(path);
42
+ if (record === undefined || record.revision !== revision) {
43
+ return { outcome: 'refused', code: 'stale', retryable: false, file: path };
44
+ }
45
+ if (!saved.some((draft) => draft.path === path))
46
+ saved.push({ path, parts: record.parts });
47
+ }
48
+ const result = await loaded(runtime, locator, replica, saved, new Set(saved.map(({ path }) => path)), [], writtenBy);
49
+ if (result.outcome !== 'refused' || result.code !== 'changed-underneath')
50
+ return result;
51
+ return joinedUnderneath(runtime, locator, saved.map(({ path }) => drafts.get(path)), result);
52
+ });
53
+ }
54
+ async function joinedUnderneath({ store }, locator, records, refused) {
55
+ const visible = (await visibleOf(store, locator, records.map(({ path }) => path)));
56
+ const joined = records.flatMap((record) => {
57
+ const join = joinedOver(record.parts, record.marks, record.path, visible);
58
+ return join === null ? [] : [{ ...record, ...join, revision: roomDraftRevision() }];
59
+ });
60
+ if (joined.length === 0)
61
+ return refused;
62
+ await (await store.open()).commit({ rooms: [], writes: [{ locator, roomDrafts: joined }] });
63
+ await store.changed(changeSet(locator, { drafts: joined.map(({ path }) => path) }));
64
+ return refused;
65
+ }
66
+ export function saveParts(runtime, locator, named, writtenBy) {
67
+ const { store } = runtime;
68
+ return store.exclusive(async () => {
69
+ const read = readSavedParts(named);
70
+ if (store.space.full())
71
+ return FULL;
72
+ const replica = await savedRoom(runtime, locator);
73
+ const saved = [];
74
+ const files = [];
75
+ const filed = read.filter(({ parts }) => parts.file !== undefined).map(({ path }) => path);
76
+ const visible = filed.length === 0 ? undefined : await visibleOf(store, locator, filed);
77
+ for (const { path, parts } of read) {
78
+ const file = parts.file === undefined
79
+ ? undefined
80
+ : await heldFile(parts.file.blob, parts.file.base === undefined ? binaryBase(visible, path) : parts.file.base);
81
+ if (parts.file !== undefined && file !== undefined) {
82
+ files.push({ key: file.localId, blob: parts.file.blob });
83
+ }
84
+ saved.push({ path, parts: held(undefined, parts, file) });
85
+ }
86
+ return loaded(runtime, locator, replica, saved, new Set(), files, writtenBy);
87
+ });
88
+ }
89
+ async function unmodeledIn(runtime, record) {
90
+ const composition = compositionFor(runtime, record);
91
+ if (available(composition))
92
+ return false;
93
+ const local = await runtime.store.open();
94
+ const roots = record.declaration.typedSelection?.roots ?? [];
95
+ return local.typedWithin(record.key, 'visible', roots, false);
96
+ }
97
+ async function savingRoom(runtime, replica, changes, extra, drafted) {
98
+ const { store } = runtime;
99
+ const { record, queue, states } = replica;
100
+ const local = await store.open();
101
+ const paths = [
102
+ ...extra,
103
+ ...changes.flatMap((change) => change.kind === 'move' ? [change.path, change.to] : [change.path]),
104
+ ];
105
+ const moved = changes.flatMap((change) => (change.kind === 'move' ? [change.path] : []));
106
+ const removed = changes.flatMap((change) => (change.kind === 'remove' ? [change.path] : []));
107
+ const referring = removed.length === 0
108
+ ? []
109
+ : (await local.referrers(record.key, 'confirmed', removed)).map(({ path }) => path);
110
+ const confirmed = await sliceAt(store, record, 'confirmed', queue, [...paths, ...paths.flatMap(ancestors), ...referring], moved);
111
+ const composition = store.composed(record);
112
+ const changeable = withdrawable(states);
113
+ return {
114
+ held: { replica, confirmed },
115
+ room: {
116
+ record,
117
+ rule: runtime.writeRule(record.declaration),
118
+ composition: compositionFor(runtime, record),
119
+ queue,
120
+ changeable: new Set(queue.filter(changeable).map(({ id }) => id)),
121
+ saved: new Map([...states].map(([id, state]) => [id, state.drafts])),
122
+ *replay(over) {
123
+ return (yield* replaying(confirmed, over, record.locator, composition)).visible;
124
+ },
125
+ folders: new Set(await local.folders(record.key, paths)),
126
+ modelled: !(await unmodeledIn(runtime, record)),
127
+ drafts: new Map(drafted.length === 0
128
+ ? []
129
+ : (await store.drafts(record.locator, drafted)).map((held) => [held.path, held])),
130
+ validate: validatorOf(runtime, record, confirmed),
131
+ },
132
+ };
133
+ }
134
+ function targetsOf(saved) {
135
+ return saved.flatMap(({ parts }) => (parts.move === undefined ? [] : [moveTarget(parts.move)]));
136
+ }
137
+ async function loaded(runtime, locator, replica, saved, consumed, files, writtenBy) {
138
+ const { store, localSaves } = runtime;
139
+ const into = destination(locator, saved);
140
+ const target = into === null ? undefined : await savedRoom(runtime, into);
141
+ const paths = saved.map(({ path }) => path);
142
+ const targets = targetsOf(saved);
143
+ const parts = saved.map(({ path, parts: held }) => changesOf(path, held));
144
+ const source = target === undefined
145
+ ? await savingRoom(runtime, replica, parts.flatMap(({ changes }) => changes), [...paths, ...parts.flatMap(({ bases }) => bases.map(({ path }) => path))], targets.length === 0 ? [] : [...paths, ...targets])
146
+ : await savingRoom(runtime, replica, paths.map((path) => ({ kind: 'remove', path })), paths, paths);
147
+ const arriving = target === undefined ? undefined : await savingRoom(runtime, target, [], targets, targets);
148
+ const { providerLimits } = await (await store.open()).facts();
149
+ const plan = await planSave({ saved, consumed, writtenBy, local: localSaves, providerLimits }, source.room, arriving?.room);
150
+ return append(runtime, {
151
+ plan,
152
+ files,
153
+ held: new Map([source, ...(arriving === undefined ? [] : [arriving])].map(({ room, held }) => [
154
+ room.record.locator,
155
+ held,
156
+ ])),
157
+ after: () => pendingShown(runtime),
158
+ });
159
+ }
160
+ function textDiffers(left, right) {
161
+ return ((left?.content ?? undefined) !== (right?.content ?? undefined) ||
162
+ !sameBinary(left?.binary ?? undefined, right?.binary ?? undefined));
163
+ }
164
+ function textOf(entry) {
165
+ if (entry === null)
166
+ return undefined;
167
+ return entry.binary !== null ? null : entry.content;
168
+ }
169
+ function lookupOf(local, key, view) {
170
+ return async (paths) => {
171
+ if (paths.length === 0)
172
+ return new Map();
173
+ return new Map((await local.typed(key, view, paths)).map(({ path, type, binary }) => [
174
+ path,
175
+ { type: type ?? undefined, binary },
176
+ ]));
177
+ };
178
+ }
179
+ function declaredOf(entry) {
180
+ if (entry.binary !== null)
181
+ return { type: undefined, binary: true };
182
+ return { type: textType(parse(entry.content ?? '')), binary: false };
183
+ }
184
+ function overriddenLookup(lookup, overrides) {
185
+ return async (paths) => {
186
+ const known = new Map(await lookup(paths.filter((path) => !overrides.has(path))));
187
+ for (const path of paths) {
188
+ const entry = overrides.get(path);
189
+ if (entry === undefined)
190
+ continue;
191
+ if (entry === null)
192
+ known.delete(path);
193
+ else
194
+ known.set(path, declaredOf(entry));
195
+ }
196
+ return known;
197
+ };
198
+ }
199
+ function validatorOf(runtime, record, confirmedLayer) {
200
+ return async (resulting, touched) => {
201
+ const local = await runtime.store.open();
202
+ const changes = [];
203
+ const overrides = new Map();
204
+ const pace = paced();
205
+ for (const path of new Set([...confirmedLayer.held, ...touched])) {
206
+ await pace(ROW_WEIGHT);
207
+ const was = entryAt(confirmedLayer, path);
208
+ const now = entryAt(resulting, path);
209
+ if (!textDiffers(was, now))
210
+ continue;
211
+ overrides.set(path, now);
212
+ if (textOf(was) !== textOf(now))
213
+ changes.push({ path, was: textOf(was), now: textOf(now) });
214
+ }
215
+ return validatedNeighbourhood(changes, compositionFor(runtime, record), {
216
+ lookup: overriddenLookup(lookupOf(local, record.key, 'confirmed'), overrides),
217
+ texts: textsOf(local, record.key, 'confirmed'),
218
+ referrers: referrersOf(local, record.key, 'confirmed'),
219
+ });
220
+ };
221
+ }
222
+ function textsOf(local, key, view) {
223
+ return async (paths) => new Map((await local.entries(key, view, paths)).map(({ path, content, binary }) => [
224
+ path,
225
+ binary !== null ? null : content,
226
+ ]));
227
+ }
228
+ function referrersOf(local, key, view) {
229
+ return async (targets) => [
230
+ ...new Set((await local.referrers(key, view, targets)).map(({ path }) => path)),
231
+ ];
232
+ }
233
+ async function queuedFacts(store, locator, path, localId) {
234
+ for (const batch of (await store.replica(locator))?.queue ?? []) {
235
+ const change = batch.changes[queuedFile(batch, path, localId)];
236
+ if (change?.kind === 'binary')
237
+ return change;
238
+ }
239
+ const drafted = (await store.draft(locator, path))?.parts.file;
240
+ return drafted?.localId === localId ? drafted : null;
241
+ }
242
+ export function batchFile(store, batch) {
243
+ return async (localId) => {
244
+ const change = batch.changes.find((held) => held.kind === 'binary' && held.localId === localId);
245
+ return (await store.open()).file(localId, change?.kind === 'binary' ? change.mediaType : '');
246
+ };
247
+ }
248
+ async function transferBinary(runtime, request, transfer, answer) {
249
+ const { store, socket, presence } = runtime;
250
+ const { session } = socket;
251
+ if (socket.closed() || session.now().refusal !== null)
252
+ return UNCERTAIN;
253
+ await socket.firstDiscovery;
254
+ if (!session.now().roomsNamed)
255
+ return UNCERTAIN;
256
+ try {
257
+ await socket.authorize();
258
+ }
259
+ catch {
260
+ return UNCERTAIN;
261
+ }
262
+ const { closed, authorization, refusal } = session.now();
263
+ if (closed || authorization === undefined || refusal !== null)
264
+ return UNCERTAIN;
265
+ const since = presence.losses();
266
+ try {
267
+ const result = await transfer(authorization);
268
+ const settled = result;
269
+ if (request.locator !== null && presence.lostSince(request.locator, since))
270
+ return failure({ kind: 'room-not-readable', locator: request.locator });
271
+ if (settled.kind === 'scoped-refusal') {
272
+ const room = await store.record(settled.locator);
273
+ if (room !== undefined)
274
+ await scoped(runtime, settled, room.locator, room.declaration);
275
+ }
276
+ if (settled.kind === 'revoked-authorization')
277
+ await refuse(runtime, 'revoked-authorization');
278
+ return answer(result);
279
+ }
280
+ catch {
281
+ return UNCERTAIN;
282
+ }
283
+ }
284
+ function fetchBinary(runtime, request, name) {
285
+ const { store, socket } = runtime;
286
+ return transferBinary(runtime, request, (authorization) => store.opened.fetch(name, () => socket.binary(authorization, request)), binaryAnswer);
287
+ }
288
+ async function readBinary(runtime, request, name) {
289
+ if (runtime.socket.closed())
290
+ return UNCERTAIN;
291
+ const held = await runtime.store.opened.find(name);
292
+ if (held !== null)
293
+ return held;
294
+ return fetchBinary(runtime, request, name);
295
+ }
296
+ async function binaryPath(store, locator, path, revision) {
297
+ if (revision !== undefined)
298
+ return { kind: 'path', locator, path, revision };
299
+ const replica = await store.replica(locator);
300
+ const local = await store.open();
301
+ const [held] = replica === undefined ? [] : await local.entries(replica.record.key, 'visible', [path]);
302
+ const attached = held === undefined ? store.attached.of(locator, path) : undefined;
303
+ if (attached !== undefined)
304
+ return { kind: 'path', locator, path, revision: attached.revision };
305
+ if (replica === undefined || held?.binary === undefined || held.binary === null)
306
+ return null;
307
+ if (held.binary.state === 'pending')
308
+ return { kind: 'pending', localId: held.binary.localId };
309
+ const record = binaryRecord(path, held.binary, held.revision ?? undefined);
310
+ if (record.state !== 'accepted')
311
+ return null;
312
+ const queued = replica.queue.flatMap((batch) => batch.changes);
313
+ const sources = queued.flatMap((change) => (change.kind === 'move' ? [change.path] : []));
314
+ const confirmedLayer = await stepped(slicing(await local.entries(replica.record.key, 'confirmed', [path, ...sources]), [
315
+ path,
316
+ ...sources,
317
+ ]));
318
+ const holds = (at) => {
319
+ const kept = confirmedLayer.binaries[at];
320
+ return (kept?.state === 'accepted' &&
321
+ kept.sha256 === record.sha256 &&
322
+ confirmedLayer.revisions[at] === record.revision);
323
+ };
324
+ let confirmedAt = path;
325
+ for (let index = queued.length - 1; index >= 0 && !holds(confirmedAt); index -= 1) {
326
+ const change = queued[index];
327
+ if (change.kind === 'move' && change.to === confirmedAt)
328
+ confirmedAt = change.path;
329
+ }
330
+ return {
331
+ kind: 'path',
332
+ locator,
333
+ path: confirmedAt,
334
+ revision: record.revision,
335
+ };
336
+ }
337
+ async function askedBinary({ store, socket }, locator, path, revision) {
338
+ await socket.ready;
339
+ const drafted = (await store.draft(locator, path))?.parts.file;
340
+ return drafted !== undefined && drafted.localId === revision
341
+ ? { kind: 'pending', localId: revision }
342
+ : binaryPath(store, locator, path, revision);
343
+ }
344
+ async function pendingBinary(store, locator, path, localId) {
345
+ const facts = await queuedFacts(store, locator, path, localId);
346
+ return facts === null
347
+ ? absentBinary(path)
348
+ : {
349
+ kind: 'binary',
350
+ file: localId,
351
+ byteLength: facts.byteLength,
352
+ mediaType: facts.mediaType,
353
+ };
354
+ }
355
+ async function readBinaryPath(runtime, locator, path, revision) {
356
+ const asked = await askedBinary(runtime, locator, path, revision);
357
+ if (asked === null)
358
+ return absentBinary(path);
359
+ if (asked.kind === 'pending')
360
+ return pendingBinary(runtime.store, locator, path, asked.localId);
361
+ return readBinary(runtime, asked, { locator, path: asked.path, revision: asked.revision });
362
+ }
363
+ async function heldMediaType(store, locator, path) {
364
+ const replica = await store.record(locator);
365
+ const [held] = replica === undefined ? [] : await (await store.open()).entries(replica.key, 'visible', [path]);
366
+ return held === undefined ? store.attached.of(locator, path)?.mediaType : held.binary?.mediaType;
367
+ }
368
+ function linkOf(runtime, asked, held) {
369
+ return transferBinary(runtime, asked, (authorization) => runtime.socket.link(authorization, asked), (result) => binaryLinkAnswer(result, held));
370
+ }
371
+ async function linkBinaryPath(runtime, locator, path, revision) {
372
+ const { store, socket } = runtime;
373
+ await socket.ready;
374
+ const asked = await binaryPath(store, locator, path, revision);
375
+ if (asked === null || asked.kind === 'pending')
376
+ return absentBinary(path);
377
+ return linkOf(runtime, asked, revision === undefined ? await heldMediaType(store, locator, path) : undefined);
378
+ }
379
+ async function showBinaryPath(runtime, locator, path, revision) {
380
+ const { store } = runtime;
381
+ const asked = await askedBinary(runtime, locator, path, revision);
382
+ if (asked === null)
383
+ return absentBinary(path);
384
+ if (asked.kind === 'pending')
385
+ return pendingBinary(store, locator, path, asked.localId);
386
+ if (runtime.socket.closed())
387
+ return UNCERTAIN;
388
+ const name = { locator, path: asked.path, revision: asked.revision };
389
+ const kept = await store.opened.find(name);
390
+ if (kept !== null)
391
+ return kept;
392
+ const mediaType = await heldMediaType(store, locator, path);
393
+ if (mediaType !== undefined && isImageType(mediaType))
394
+ return fetchBinary(runtime, asked, name);
395
+ return linkOf(runtime, asked, revision === undefined ? mediaType : undefined);
396
+ }
397
+ async function attachFile(runtime, locator, file, answer) {
398
+ const { store, socket } = runtime;
399
+ await socket.ready;
400
+ await socket.firstDiscovery;
401
+ if (socket.closed() ||
402
+ !socket.session.now().roomsNamed ||
403
+ (await connectionNow(runtime)) === 'unreachable' ||
404
+ socket.session.now().refusal !== null)
405
+ return OFFLINE;
406
+ const request = await attachedFile(locator, file);
407
+ return transferBinary(runtime, { locator }, async (held) => {
408
+ const result = await socket.attach(held, request);
409
+ if (result.kind === 'attached' && locator !== null) {
410
+ store.attached.hold(locator, result.path, {
411
+ revision: result.revision,
412
+ mediaType: request.mediaType,
413
+ });
414
+ }
415
+ return result;
416
+ }, answer);
417
+ }
418
+ async function keyedAttachment(runtime, link) {
419
+ await runtime.socket.ready;
420
+ const asked = { kind: 'key', link };
421
+ return transferBinary(runtime, { locator: null }, (authorization) => runtime.socket.link(authorization, asked), (result) => binaryLinkAnswer(result));
422
+ }
423
+ export function conversationFiles(runtime) {
424
+ return {
425
+ attach: (file) => attachFile(runtime, null, file, linkedAnswer),
426
+ attachment: (link) => keyedAttachment(runtime, link),
427
+ };
428
+ }
429
+ export function binaryFileSurface(runtime) {
430
+ return {
431
+ part: runtime.store.part,
432
+ read: (room, path, revision) => readBinaryPath(runtime, room, path, revision),
433
+ link: (room, path, revision) => linkBinaryPath(runtime, room, path, revision),
434
+ show: (room, path, revision) => showBinaryPath(runtime, room, path, revision),
435
+ attach: (room, file) => attachFile(runtime, room, file, attachAnswer),
436
+ };
437
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGrD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,OAAO,GACP,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACxC,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,GAC1C,OAAO,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAYvD"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,OAAO,GACP,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACxC,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,GAC1C,OAAO,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAYvD"}
package/dist/search.js CHANGED
@@ -1,4 +1,4 @@
1
- import { invalid, known, plain } from './query.js';
1
+ import { invalid, known, plain } from '@agentshouse/mdmodel';
2
2
  export function searchPlanOf(input) {
3
3
  if (!plain(input))
4
4
  invalid('search', 'expects a search object');
package/dist/seed.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- import type { KeyedResult } from './observation.js';
2
- import type { QueryRows } from './query.js';
1
+ import type { Cover } from './live.js';
2
+ import { type KeyedResult } from './observation.js';
3
+ import type { Plan, QueryRows } from './query.js';
4
+ import type { Deliver } from './reach.js';
5
+ import type { Runtime } from './runtime.js';
6
+ import type { HeldCover, Store } from './store.js';
3
7
  export type EntrySeed = {
4
8
  readonly at: Readonly<Record<string, string>>;
5
9
  readonly queries: readonly {
@@ -11,6 +15,11 @@ export type Seeded = {
11
15
  readonly rows: QueryRows;
12
16
  readonly at: Readonly<Record<string, string>>;
13
17
  };
18
+ type SeededWatch = (coverOf: (cover: Cover, held: HeldCover) => Cover, deliver: (message: unknown) => void) => () => void;
14
19
  export declare function entrySeedOf(value: unknown): EntrySeed | null;
15
20
  export declare function seededResult(seed: Seeded): KeyedResult;
21
+ export declare function seedApplies(runtime: Runtime, plan: Plan, held: HeldCover): Seeded | null;
22
+ export declare function keepEntrySeed(store: Store, entry: EntrySeed): void;
23
+ export declare function watchSeeded(runtime: Runtime, plan: Plan, deliver: Deliver, watch: SeededWatch): () => void;
24
+ export {};
16
25
  //# sourceMappingURL=seed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAA4C,SAAS,EAAE,MAAM,YAAY,CAAC;AAGtF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACpF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAwCjG,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAoBtD"}
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAwB,KAAK,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAC7F,OAAO,KAAK,EAAE,IAAI,EAA4C,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACpF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAEjG,KAAK,WAAW,GAAG,CACjB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,KAAK,KAAK,EACjD,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,CAAC;AA0ChB,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAmBtD;AA+BD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAOxF;AAYD,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAMlE;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,GACjB,MAAM,IAAI,CA4BZ"}
package/dist/seed.js CHANGED
@@ -1,4 +1,7 @@
1
+ import { queryKey } from '@agentshouse/mdmodel';
2
+ import { pendingChange, whole } from './observation.js';
1
3
  import { documentKey } from './rows.js';
4
+ const seedTopic = (key) => `seed\u0000${key}`;
2
5
  function plain(value) {
3
6
  return typeof value === 'object' && value !== null && !Array.isArray(value);
4
7
  }
@@ -59,7 +62,6 @@ export function seededResult(seed) {
59
62
  generation,
60
63
  current: false,
61
64
  })),
62
- indexes: [],
63
65
  overlay: [],
64
66
  };
65
67
  if ('groups' in seed.rows) {
@@ -73,3 +75,71 @@ export function seededResult(seed) {
73
75
  keys: seed.rows.documents.map((document) => documentKey(document.room, document.path)),
74
76
  };
75
77
  }
78
+ function seedRoomHeld({ socket }, room, version, held) {
79
+ const stored = held.rooms.get(room);
80
+ return (stored !== undefined &&
81
+ stored.indexed &&
82
+ socket.reads.reached(room, stored.roomVersion, version));
83
+ }
84
+ function seedHeld(runtime, at, held) {
85
+ const { socket, presence } = runtime;
86
+ return Object.entries(at).every(([room, version]) => (socket.session.now().roomsListed &&
87
+ presence.room(room) === undefined &&
88
+ !held.rooms.has(room)) ||
89
+ seedRoomHeld(runtime, room, version, held));
90
+ }
91
+ export function seedApplies(runtime, plan, held) {
92
+ const { seeds } = runtime.store;
93
+ const seed = seeds.of(plan.key);
94
+ if (seed === undefined)
95
+ return null;
96
+ if (!seedHeld(runtime, seed.at, held))
97
+ return seed;
98
+ seeds.drop(plan.key);
99
+ return null;
100
+ }
101
+ function seedBehind(runtime, plan, cover, held) {
102
+ const seed = seedApplies(runtime, plan, held);
103
+ if (seed === null || 'pending' in cover)
104
+ return cover;
105
+ return {
106
+ pending: Object.entries(seed.at)
107
+ .filter(([room, version]) => !seedRoomHeld(runtime, room, version, held))
108
+ .map(([room]) => ({ room, awaits: 'acquisition' })),
109
+ };
110
+ }
111
+ export function keepEntrySeed(store, entry) {
112
+ for (const { query, rows } of entry.queries) {
113
+ const key = queryKey(query);
114
+ store.seeds.keep(key, { rows, at: entry.at });
115
+ for (const watcher of store.watching(seedTopic(key)))
116
+ watcher.answer(null);
117
+ }
118
+ }
119
+ export function watchSeeded(runtime, plan, deliver, watch) {
120
+ const { store } = runtime;
121
+ let seeded = false;
122
+ let pending = true;
123
+ const shown = () => {
124
+ const seed = store.seeds.of(plan.key);
125
+ if (seed === undefined || seeded || !pending)
126
+ return;
127
+ seeded = true;
128
+ deliver(seededResult(seed));
129
+ };
130
+ const watcher = store.watch(seedTopic(plan.key), shown);
131
+ const stop = watch((cover, held) => seedBehind(runtime, plan, cover, held), (message) => {
132
+ const answered = message;
133
+ pending = whole(answered) ? 'pending' in answered.result : pendingChange(answered);
134
+ if (pending && store.seeds.of(plan.key) !== undefined) {
135
+ shown();
136
+ return;
137
+ }
138
+ seeded = false;
139
+ deliver(message);
140
+ });
141
+ return () => {
142
+ watcher.stop();
143
+ stop();
144
+ };
145
+ }
package/dist/shared.d.ts CHANGED
@@ -1,14 +1,9 @@
1
1
  export type Paths<V> = Readonly<Record<string, V>>;
2
+ export declare function guarding<V>(values: Paths<V>, handler: ProxyHandler<Paths<V>>): Paths<V>;
2
3
  export declare function entriesIn<V>(map: Paths<V>): Generator<readonly [string, V]>;
3
4
  export declare function sortedKeys(map: Paths<unknown>): Generator<number, readonly string[], void>;
4
5
  export declare function sorting(keys: Iterable<string>): Generator<number, readonly string[], void>;
5
- export declare function sharing<V>(map: Paths<V>): Generator<number, Paths<V>, void>;
6
- export declare function shared<V>(map: Paths<V>): Paths<V>;
7
- export declare function patched<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Paths<V>;
8
6
  export declare function patching<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Generator<number, Paths<V>, void>;
9
- export declare function sizeOf<V>(map: Paths<V>): number;
10
- export declare function differences<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): Generator<number, ReadonlySet<string>, void>;
11
- export declare function differing<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): ReadonlySet<string>;
12
7
  export declare function drafted<V>(base: Paths<V>): Record<string, V>;
13
8
  export declare function settled<V>(draft: Record<string, V>): Paths<V>;
14
9
  export declare function settling<V>(draft: Record<string, V>): Generator<number, Paths<V>, void>;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AA+LnD,wBAAiB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAO5E;AAuCD,wBAAiB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAE3F;AAED,wBAAiB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAoB3F;AAED,wBAAiB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAE5E;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAEjD;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC7B,KAAK,CAAC,CAAC,CAAC,CAEV;AAED,wBAAiB,QAAQ,CAAC,CAAC,EACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC7B,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAoBnC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAE/C;AA8CD,wBAAiB,WAAW,CAAC,CAAC,EAC5B,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAmB,GAC/C,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAkB9C;AAED,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAmB,GAC/C,WAAW,CAAC,MAAM,CAAC,CAErB;AAMD,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAiD5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAE7D;AAED,wBAAiB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAUxF"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AA8LnD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAIvF;AAED,wBAAiB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAQ5E;AAqCD,wBAAiB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAE3F;AAED,wBAAiB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAoB3F;AAED,wBAAiB,QAAQ,CAAC,CAAC,EACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC7B,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAgBnC;AAMD,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAiD5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAE7D;AAED,wBAAiB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAUxF"}