@agentshouse/mdruntime 0.1.0-c3c7796382e28 → 0.1.0-c3faae279d4d2

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 (288) hide show
  1. package/README.md +2 -2
  2. package/dist/acceptance.d.ts +6 -0
  3. package/dist/acceptance.d.ts.map +1 -0
  4. package/dist/acceptance.js +385 -0
  5. package/dist/actions.d.ts +20 -0
  6. package/dist/actions.d.ts.map +1 -0
  7. package/dist/actions.js +251 -0
  8. package/dist/adapter.d.ts +90 -70
  9. package/dist/adapter.d.ts.map +1 -1
  10. package/dist/attached-model.d.ts +3 -10
  11. package/dist/attached-model.d.ts.map +1 -1
  12. package/dist/attached-model.js +29 -47
  13. package/dist/bootstrap.d.ts +14 -17
  14. package/dist/bootstrap.d.ts.map +1 -1
  15. package/dist/bootstrap.js +259 -152
  16. package/dist/cell.d.ts +6 -0
  17. package/dist/cell.d.ts.map +1 -0
  18. package/dist/cell.js +9 -0
  19. package/dist/chain.d.ts +2 -1
  20. package/dist/chain.d.ts.map +1 -1
  21. package/dist/change.d.ts +1 -0
  22. package/dist/change.d.ts.map +1 -1
  23. package/dist/change.js +4 -2
  24. package/dist/chat-types.d.ts +5 -0
  25. package/dist/chat-types.d.ts.map +1 -0
  26. package/dist/chat-types.js +13 -0
  27. package/dist/client.d.ts +21 -6
  28. package/dist/client.d.ts.map +1 -1
  29. package/dist/client.js +4 -2
  30. package/dist/collection.d.ts +2 -4
  31. package/dist/collection.d.ts.map +1 -1
  32. package/dist/collection.js +1 -17
  33. package/dist/compile.d.ts +6 -6
  34. package/dist/compile.d.ts.map +1 -1
  35. package/dist/compile.js +272 -326
  36. package/dist/connection.d.ts +5 -143
  37. package/dist/connection.d.ts.map +1 -1
  38. package/dist/connection.js +102 -5122
  39. package/dist/context.d.ts +2 -0
  40. package/dist/context.d.ts.map +1 -0
  41. package/dist/context.js +7 -0
  42. package/dist/conversation-live.d.ts +136 -0
  43. package/dist/conversation-live.d.ts.map +1 -0
  44. package/dist/conversation-live.js +248 -0
  45. package/dist/conversation-row.d.ts +33 -0
  46. package/dist/conversation-row.d.ts.map +1 -0
  47. package/dist/conversation-row.js +53 -0
  48. package/dist/conversation.d.ts +41 -43
  49. package/dist/conversation.d.ts.map +1 -1
  50. package/dist/conversation.js +870 -779
  51. package/dist/discovery.d.ts +10 -0
  52. package/dist/discovery.d.ts.map +1 -0
  53. package/dist/discovery.js +175 -0
  54. package/dist/durability.d.ts +15 -1
  55. package/dist/durability.d.ts.map +1 -1
  56. package/dist/entry.d.ts +3 -2
  57. package/dist/entry.d.ts.map +1 -1
  58. package/dist/entry.js +18 -8
  59. package/dist/figures.d.ts +49 -0
  60. package/dist/figures.d.ts.map +1 -0
  61. package/dist/figures.js +197 -0
  62. package/dist/holdings.d.ts +29 -0
  63. package/dist/holdings.d.ts.map +1 -0
  64. package/dist/holdings.js +95 -0
  65. package/dist/host.d.ts +4 -7
  66. package/dist/host.d.ts.map +1 -1
  67. package/dist/host.js +29 -31
  68. package/dist/identity.d.ts +0 -1
  69. package/dist/identity.d.ts.map +1 -1
  70. package/dist/identity.js +0 -3
  71. package/dist/index.d.ts +26 -8
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +8 -1
  74. package/dist/install.d.ts +56 -0
  75. package/dist/install.d.ts.map +1 -0
  76. package/dist/install.js +554 -0
  77. package/dist/job.d.ts +33 -0
  78. package/dist/job.d.ts.map +1 -0
  79. package/dist/job.js +54 -0
  80. package/dist/lifecycle.d.ts +7 -0
  81. package/dist/lifecycle.d.ts.map +1 -0
  82. package/dist/lifecycle.js +268 -0
  83. package/dist/listing.d.ts +53 -0
  84. package/dist/listing.d.ts.map +1 -0
  85. package/dist/listing.js +176 -0
  86. package/dist/live.d.ts +5 -4
  87. package/dist/live.d.ts.map +1 -1
  88. package/dist/live.js +62 -23
  89. package/dist/locks.d.ts +9 -0
  90. package/dist/locks.d.ts.map +1 -0
  91. package/dist/locks.js +61 -0
  92. package/dist/log.d.ts +1 -0
  93. package/dist/log.d.ts.map +1 -1
  94. package/dist/lost.d.ts +5 -0
  95. package/dist/lost.d.ts.map +1 -0
  96. package/dist/lost.js +61 -0
  97. package/dist/media.d.ts +2 -2
  98. package/dist/media.d.ts.map +1 -1
  99. package/dist/media.js +22 -12
  100. package/dist/memory.d.ts +12 -5
  101. package/dist/memory.d.ts.map +1 -1
  102. package/dist/memory.js +175 -83
  103. package/dist/messages.d.ts +27 -3
  104. package/dist/messages.d.ts.map +1 -1
  105. package/dist/messages.js +103 -31
  106. package/dist/model.d.ts +2 -10
  107. package/dist/model.d.ts.map +1 -1
  108. package/dist/model.js +0 -18
  109. package/dist/models.d.ts +14 -0
  110. package/dist/models.d.ts.map +1 -0
  111. package/dist/models.js +195 -0
  112. package/dist/observation.d.ts +2 -2
  113. package/dist/observation.d.ts.map +1 -1
  114. package/dist/observation.js +14 -14
  115. package/dist/opened.js +3 -3
  116. package/dist/opening.d.ts +4 -0
  117. package/dist/opening.d.ts.map +1 -0
  118. package/dist/opening.js +57 -0
  119. package/dist/outcome.d.ts +4 -4
  120. package/dist/outcome.d.ts.map +1 -1
  121. package/dist/outcome.js +3 -0
  122. package/dist/overlay.d.ts +1 -0
  123. package/dist/overlay.d.ts.map +1 -1
  124. package/dist/overlay.js +11 -0
  125. package/dist/parts.d.ts +60 -0
  126. package/dist/parts.d.ts.map +1 -0
  127. package/dist/parts.js +126 -0
  128. package/dist/paths.d.ts +2 -0
  129. package/dist/paths.d.ts.map +1 -1
  130. package/dist/paths.js +26 -0
  131. package/dist/preparation.d.ts +20 -0
  132. package/dist/preparation.d.ts.map +1 -0
  133. package/dist/preparation.js +226 -0
  134. package/dist/queries.d.ts +16 -0
  135. package/dist/queries.d.ts.map +1 -0
  136. package/dist/queries.js +272 -0
  137. package/dist/query.d.ts +14 -210
  138. package/dist/query.d.ts.map +1 -1
  139. package/dist/query.js +3 -505
  140. package/dist/questions.d.ts +34 -0
  141. package/dist/questions.d.ts.map +1 -0
  142. package/dist/questions.js +122 -0
  143. package/dist/reach.d.ts +15 -12
  144. package/dist/reach.d.ts.map +1 -1
  145. package/dist/reach.js +185 -139
  146. package/dist/react.d.ts +10 -2
  147. package/dist/react.d.ts.map +1 -1
  148. package/dist/read.d.ts +7 -0
  149. package/dist/read.d.ts.map +1 -0
  150. package/dist/read.js +17 -0
  151. package/dist/readiness.d.ts +3 -18
  152. package/dist/readiness.d.ts.map +1 -1
  153. package/dist/readiness.js +4 -10
  154. package/dist/reads.d.ts +36 -10
  155. package/dist/reads.d.ts.map +1 -1
  156. package/dist/reads.js +157 -86
  157. package/dist/recovery.d.ts +1 -0
  158. package/dist/recovery.d.ts.map +1 -1
  159. package/dist/recovery.js +35 -1
  160. package/dist/refresh.d.ts +7 -5
  161. package/dist/refresh.d.ts.map +1 -1
  162. package/dist/refresh.js +33 -5
  163. package/dist/refusal.d.ts +5 -0
  164. package/dist/refusal.d.ts.map +1 -0
  165. package/dist/refusal.js +55 -0
  166. package/dist/replica.d.ts +10 -10
  167. package/dist/replica.d.ts.map +1 -1
  168. package/dist/replica.js +53 -21
  169. package/dist/room-draft.d.ts +21 -7
  170. package/dist/room-draft.d.ts.map +1 -1
  171. package/dist/room-draft.js +101 -54
  172. package/dist/room-drafts.d.ts +24 -0
  173. package/dist/room-drafts.d.ts.map +1 -0
  174. package/dist/room-drafts.js +217 -0
  175. package/dist/rows.d.ts +14 -21
  176. package/dist/rows.d.ts.map +1 -1
  177. package/dist/rows.js +48 -184
  178. package/dist/runtime.d.ts +43 -0
  179. package/dist/runtime.d.ts.map +1 -0
  180. package/dist/runtime.js +1 -0
  181. package/dist/save.d.ts +7 -1
  182. package/dist/save.d.ts.map +1 -1
  183. package/dist/save.js +31 -24
  184. package/dist/saves.d.ts +70 -0
  185. package/dist/saves.d.ts.map +1 -0
  186. package/dist/saves.js +1005 -0
  187. package/dist/search.d.ts +12 -63
  188. package/dist/search.d.ts.map +1 -1
  189. package/dist/search.js +9 -52
  190. package/dist/seed.d.ts +11 -2
  191. package/dist/seed.d.ts.map +1 -1
  192. package/dist/seed.js +71 -1
  193. package/dist/shared.d.ts +1 -7
  194. package/dist/shared.d.ts.map +1 -1
  195. package/dist/shared.js +13 -105
  196. package/dist/shown.d.ts +31 -0
  197. package/dist/shown.d.ts.map +1 -0
  198. package/dist/shown.js +292 -0
  199. package/dist/socket/admission.d.ts +7 -0
  200. package/dist/socket/admission.d.ts.map +1 -0
  201. package/dist/socket/admission.js +39 -0
  202. package/dist/socket/answers.d.ts +6 -0
  203. package/dist/socket/answers.d.ts.map +1 -0
  204. package/dist/socket/answers.js +20 -0
  205. package/dist/socket/lanes.d.ts +20 -0
  206. package/dist/socket/lanes.d.ts.map +1 -0
  207. package/dist/socket/lanes.js +77 -0
  208. package/dist/socket/reads.d.ts +10 -0
  209. package/dist/socket/reads.d.ts.map +1 -0
  210. package/dist/socket/reads.js +31 -0
  211. package/dist/socket/rooms.d.ts +44 -0
  212. package/dist/socket/rooms.d.ts.map +1 -0
  213. package/dist/socket/rooms.js +90 -0
  214. package/dist/socket/session.d.ts +38 -0
  215. package/dist/socket/session.d.ts.map +1 -0
  216. package/dist/socket/session.js +23 -0
  217. package/dist/socket.d.ts +70 -0
  218. package/dist/socket.d.ts.map +1 -0
  219. package/dist/socket.js +175 -0
  220. package/dist/source.d.ts +61 -0
  221. package/dist/source.d.ts.map +1 -0
  222. package/dist/source.js +82 -0
  223. package/dist/status.d.ts +4 -5
  224. package/dist/status.d.ts.map +1 -1
  225. package/dist/status.js +3 -7
  226. package/dist/store/fences.d.ts +16 -0
  227. package/dist/store/fences.d.ts.map +1 -0
  228. package/dist/store/fences.js +26 -0
  229. package/dist/store/installs.d.ts +30 -0
  230. package/dist/store/installs.d.ts.map +1 -0
  231. package/dist/store/installs.js +34 -0
  232. package/dist/store/readiness.d.ts +10 -0
  233. package/dist/store/readiness.d.ts.map +1 -0
  234. package/dist/store/readiness.js +52 -0
  235. package/dist/store/records.d.ts +212 -0
  236. package/dist/store/records.d.ts.map +1 -0
  237. package/dist/store/records.js +431 -0
  238. package/dist/store/room-held.d.ts +8 -0
  239. package/dist/store/room-held.d.ts.map +1 -0
  240. package/dist/store/room-held.js +17 -0
  241. package/dist/store/space.d.ts +11 -0
  242. package/dist/store/space.d.ts.map +1 -0
  243. package/dist/store/space.js +41 -0
  244. package/dist/store/watchers.d.ts +17 -0
  245. package/dist/store/watchers.d.ts.map +1 -0
  246. package/dist/store/watchers.js +56 -0
  247. package/dist/store/writes.d.ts +24 -0
  248. package/dist/store/writes.d.ts.map +1 -0
  249. package/dist/store/writes.js +125 -0
  250. package/dist/store.d.ts +115 -171
  251. package/dist/store.d.ts.map +1 -1
  252. package/dist/store.js +143 -416
  253. package/dist/stored.d.ts +61 -57
  254. package/dist/stored.d.ts.map +1 -1
  255. package/dist/stored.js +311 -233
  256. package/dist/surface.d.ts +88 -0
  257. package/dist/surface.d.ts.map +1 -0
  258. package/dist/surface.js +223 -0
  259. package/dist/sync.d.ts +19 -0
  260. package/dist/sync.d.ts.map +1 -0
  261. package/dist/sync.js +532 -0
  262. package/dist/tables.d.ts +126 -64
  263. package/dist/tables.d.ts.map +1 -1
  264. package/dist/tables.js +221 -105
  265. package/dist/tallies.d.ts +18 -0
  266. package/dist/tallies.d.ts.map +1 -0
  267. package/dist/tallies.js +129 -0
  268. package/dist/transfer.d.ts +0 -5
  269. package/dist/transfer.d.ts.map +1 -1
  270. package/dist/validation.d.ts +3 -4
  271. package/dist/validation.d.ts.map +1 -1
  272. package/dist/validation.js +42 -100
  273. package/dist/windows.d.ts +1 -12
  274. package/dist/windows.d.ts.map +1 -1
  275. package/dist/windows.js +2 -75
  276. package/dist/wire.d.ts +17 -5
  277. package/dist/wire.d.ts.map +1 -1
  278. package/dist/wire.js +7 -1
  279. package/package.json +2 -2
  280. package/dist/fence.d.ts +0 -6
  281. package/dist/fence.d.ts.map +0 -1
  282. package/dist/fence.js +0 -10
  283. package/dist/fulltext.d.ts +0 -27
  284. package/dist/fulltext.d.ts.map +0 -1
  285. package/dist/fulltext.js +0 -368
  286. package/dist/words.d.ts +0 -19
  287. package/dist/words.d.ts.map +0 -1
  288. package/dist/words.js +0 -150
package/dist/bootstrap.js CHANGED
@@ -1,54 +1,32 @@
1
1
  import { transferIdentity } from './identity.js';
2
2
  import { advancement, pageEntries } from './refresh.js';
3
+ import { entriesIn } from './shared.js';
3
4
  import { unconfirmed } from './transfer.js';
4
- export const NOTHING_DONE = { parts: 0, bytes: 0 };
5
- const RESUMABLE = new Set([
6
- 'transport-uncertainty',
7
- 'retryable-refusal',
8
- 'unconfirmed',
9
- ]);
10
5
  const NOTHING_PRIOR = () => Promise.resolve(new Map());
11
- async function pageOf(page) {
6
+ const PARTS_IN_FLIGHT = 6;
7
+ function textOf(page) {
8
+ let text = 0;
9
+ for (const [, content] of entriesIn(page.documents))
10
+ text += content.length;
11
+ return text;
12
+ }
13
+ async function pageOf(page, part) {
12
14
  return {
13
15
  entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
14
16
  folders: page.folders ?? [],
17
+ ...(part === undefined ? {} : { part }),
15
18
  };
16
19
  }
17
- function heldTogether(first, second) {
18
- if (first === null)
19
- return second;
20
- return {
21
- async files(after, limit) {
22
- const [left, right] = await Promise.all([
23
- first.files(after, limit),
24
- second.files(after, limit),
25
- ]);
26
- const merged = new Map([...left, ...right].map((file) => [file.path, file]));
27
- return [...merged.values()]
28
- .sort((one, other) => (one.path < other.path ? -1 : one.path > other.path ? 1 : 0))
29
- .slice(0, limit);
30
- },
31
- async contents(paths) {
32
- const [left, right] = await Promise.all([first.contents(paths), second.contents(paths)]);
33
- return new Map([...left, ...right]);
34
- },
35
- };
36
- }
37
- const NO_CONTENT = {
38
- files: () => Promise.resolve([]),
39
- contents: () => Promise.resolve(new Map()),
40
- };
41
- export async function bootstrapRoom(adapter, authorization, room, held, builtIn, remodel, continuing, staging, reuse) {
42
- const kept = staging.held(room.locator);
43
- const resumed = kept !== null && kept.selection === room.replica.selection ? kept : null;
44
- if (kept !== null && resumed === null)
20
+ export async function bootstrapRoom(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
21
+ if (staging.held(room.locator) !== null)
45
22
  await staging.abandon(room.locator);
46
- const first = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, resumed, reuse);
23
+ const begun = () => started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging);
24
+ const first = await begun();
47
25
  if (first.kind !== 'expired')
48
26
  return first;
49
27
  await staging.setAside(room.locator);
50
28
  try {
51
- const replacement = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, null, heldTogether(reuse, first.held));
29
+ const replacement = await begun();
52
30
  if (replacement.kind !== 'expired')
53
31
  return replacement;
54
32
  await staging.abandon(room.locator);
@@ -59,107 +37,97 @@ export async function bootstrapRoom(adapter, authorization, room, held, builtIn,
59
37
  await staging.release(first.key);
60
38
  }
61
39
  }
62
- const UNASKED = { page: unconfirmed, reused: false };
63
- const NOTHING_KEPT = Promise.resolve();
64
40
  function dropped(ahead) {
65
41
  void ahead?.fetched.then(({ next, written }) => {
66
42
  written();
67
43
  dropped(next);
68
44
  }, () => { });
69
45
  }
70
- function compositionFor(room, models, builtIn) {
46
+ function compositionFor(room, models, builtIn, typedPaths) {
71
47
  return {
72
48
  model: models.collection,
73
49
  selection: room.typedSelection === undefined
74
50
  ? null
75
51
  : { roots: room.typedSelection.roots, model: builtIn },
52
+ typedPaths,
76
53
  };
77
54
  }
78
- async function bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, kept, pool) {
55
+ async function started(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging) {
56
+ const mode = { paged: false };
57
+ let outcome;
58
+ try {
59
+ outcome = await bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode);
60
+ }
61
+ catch (error) {
62
+ await stopped(staging, room.locator, mode).catch(() => { });
63
+ throw error;
64
+ }
65
+ if (outcome.kind !== 'staged' && outcome.kind !== 'expired') {
66
+ await stopped(staging, room.locator, mode);
67
+ }
68
+ return outcome;
69
+ }
70
+ function stopped(staging, locator, mode) {
71
+ return mode.paged ? staging.abandon(locator) : staging.setAside(locator);
72
+ }
73
+ async function bundle(adapter, authorization, room, held, builtIn, typedPaths, remodel, continuing, staging, mode) {
79
74
  const locator = room.locator;
80
75
  const selection = room.replica.selection;
81
- let transfer = kept;
82
- let looking = kept !== null;
83
- let stopped = false;
84
- let begin = () => { };
85
- const begun = kept === null
86
- ? new Promise((resolve) => {
87
- begin = resolve;
88
- })
89
- : NOTHING_KEPT;
76
+ const ending = new AbortController();
90
77
  const arriving = staging.arriving(locator);
91
- const asking = async (token) => {
92
- const received = token !== null && looking ? await staging.received(locator, token) : null;
93
- if (received === null)
94
- looking = false;
95
- const page = await adapter.bootstrap(authorization, {
96
- locator,
97
- selection,
98
- ...(token === null
99
- ? {}
100
- : { pageToken: token, arriving: (bytes) => arriving.at(token, bytes) }),
101
- ...(pool === null ? {} : { held: pool }),
102
- ...(received === null ? {} : { received }),
103
- });
104
- return { page, reused: received !== null };
105
- };
78
+ const downloaded = await staging.turn(locator, 'downloading');
79
+ const asking = (token) => adapter.bootstrap(authorization, {
80
+ locator,
81
+ selection,
82
+ signal: ending.signal,
83
+ ...(token === null
84
+ ? { arriving: (bytes) => arriving.at(bytes) }
85
+ : { pageToken: token }),
86
+ });
106
87
  const fetching = (token) => {
107
88
  const fetched = (async () => {
108
- const release = await staging.turn(locator, token === null ? 'listing' : 'downloading');
109
- let asked;
110
- try {
111
- asked = stopped || !continuing() ? UNASKED : await asking(token);
112
- }
113
- finally {
114
- release();
115
- }
116
- const { page, reused } = asked;
117
- if (page.kind !== 'bootstrap') {
118
- return { page, kept: NOTHING_KEPT, next: null, written: () => { } };
119
- }
120
- const received = page.received;
121
- const written = staging.queued(received?.byteLength ?? 0);
122
- let kept = NOTHING_KEPT;
123
- if (token !== null && received !== undefined && !reused) {
124
- kept = begun.then(() => staging.keep(locator, token, received));
125
- kept.catch(() => { });
126
- }
89
+ await staging.unqueued();
90
+ const page = continuing() ? await asking(token) : unconfirmed;
91
+ if (page.kind !== 'bootstrap')
92
+ return { page, next: null, written: () => { } };
93
+ const written = staging.queued(textOf(page));
127
94
  const later = page.pageToken;
128
- const next = later === undefined || stopped || !continuing() ? null : fetching(later);
129
- return { page, kept, next, written };
95
+ if (later === undefined && page.parts === undefined) {
96
+ downloaded();
97
+ arriving.end();
98
+ }
99
+ return { page, written, next: later === undefined || !continuing() ? null : fetching(later) };
130
100
  })();
131
101
  fetched.catch(() => { });
132
- return { token, fetched };
102
+ return { fetched };
133
103
  };
134
- let ahead = null;
104
+ let transfer = null;
105
+ let ahead = fetching(null);
135
106
  try {
136
- while (transfer === null || transfer.pageToken !== null) {
107
+ while (ahead !== null) {
137
108
  if (!continuing())
138
109
  return unconfirmed;
139
- const asked = transfer?.pageToken ?? null;
140
- const current = ahead !== null && ahead.token === asked ? ahead : fetching(asked);
141
- if (ahead !== current)
142
- dropped(ahead);
143
- ahead = null;
144
- const fetched = await current.fetched;
110
+ const fetched = await ahead.fetched;
145
111
  ahead = fetched.next;
146
112
  try {
147
113
  if (!continuing())
148
114
  return unconfirmed;
149
115
  const page = fetched.page;
150
- if (page.kind === 'beyond-horizon') {
151
- const key = transfer?.key ?? null;
152
- return { kind: 'expired', held: key === null ? NO_CONTENT : staging.content(key), key };
153
- }
154
- if (page.kind !== 'bootstrap') {
155
- if (!RESUMABLE.has(page.kind))
156
- await staging.abandon(locator);
116
+ if (page.kind === 'beyond-horizon')
117
+ return { kind: 'expired', key: transfer?.key ?? null };
118
+ if (page.kind !== 'bootstrap')
157
119
  return page;
120
+ if (transfer === null && page.parts !== undefined) {
121
+ const parted = await parts(page, page.parts);
122
+ if (parted.kind !== 'parted')
123
+ return parted;
124
+ transfer = parted.transfer;
125
+ continue;
158
126
  }
159
- await fetched.kept;
160
- const done = transfer?.done ?? NOTHING_DONE;
161
- const part = page.received?.byteLength;
162
- const next = {
127
+ if (transfer === null)
128
+ mode.paged = true;
129
+ const models = remodel(page.models, transfer?.models ?? held);
130
+ const staged = await staging.stage({
163
131
  locator,
164
132
  transfer: transfer?.transfer ?? transferIdentity(),
165
133
  selection,
@@ -169,17 +137,13 @@ async function bundle(adapter, authorization, room, held, builtIn, remodel, cont
169
137
  last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
170
138
  ? transfer.last
171
139
  : page.roomVersion,
172
- pageToken: page.pageToken ?? null,
173
- inventory: page.inventory ?? transfer?.inventory ?? null,
174
- done: part === undefined ? done : { parts: done.parts + 1, bytes: done.bytes + part },
175
- models: remodel(page.models, transfer?.models ?? held),
140
+ done: { bytes: (transfer?.done.bytes ?? 0) + (page.bytes ?? 0) },
141
+ models,
176
142
  key: transfer?.key ?? null,
177
- };
178
- const staged = await staging.stage(next, await pageOf(page), compositionFor(room, next.models, builtIn), part === undefined ? null : asked);
143
+ }, await pageOf(page), compositionFor(room, models, builtIn, typedPaths));
179
144
  if (staged === null)
180
145
  return unconfirmed;
181
146
  transfer = staged;
182
- begin();
183
147
  }
184
148
  finally {
185
149
  fetched.written();
@@ -187,49 +151,192 @@ async function bundle(adapter, authorization, room, held, builtIn, remodel, cont
187
151
  }
188
152
  }
189
153
  finally {
190
- stopped = true;
191
- dropped(ahead);
154
+ ending.abort();
155
+ downloaded();
192
156
  arriving.end();
157
+ dropped(ahead);
193
158
  }
194
- const composition = compositionFor(room, transfer.models, builtIn);
195
- if (!(await staging.derive(locator, transfer.key, composition)))
196
- return unconfirmed;
197
- await staging.turn(locator, 'replaying');
198
- if (!continuing())
159
+ if (transfer === null)
199
160
  return unconfirmed;
200
- const record = {
201
- locator,
202
- name: room.name,
203
- handle: room.handle,
204
- operations: room.operations,
205
- replica: room.replica,
206
- model: transfer.models.collection,
207
- typedSelection: room.typedSelection ?? null,
208
- providerOwnedPaths: room.providerOwnedPaths,
209
- roomVersion: transfer.from,
210
- transfer: transfer.transfer,
211
- inventory: transfer.inventory,
212
- key: transfer.key,
213
- };
214
- const due = [room.roomVersion, ...staging.announced(locator)];
215
- const last = transfer.last;
216
- const reconciled = last === transfer.from && due.every((version) => adapter.reached(locator, last, version))
217
- ? { kind: 'still-current' }
218
- : await advancement(adapter, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
219
- if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
220
- const refreshed = reconciled.kind === 'advanced';
221
- const result = refreshed ? reconciled.record : record;
222
- const refused = await staging.validate(result, refreshed ? 'refreshed' : 'confirmed');
223
- if (refused !== null) {
224
- await staging.abandon(locator);
225
- return refused;
161
+ return installed(transfer);
162
+ async function parts(head, listed) {
163
+ const models = remodel(head.models, held);
164
+ const composition = compositionFor(room, models, builtIn, typedPaths);
165
+ const resumed = await staging.resume({
166
+ locator,
167
+ transfer: transferIdentity(),
168
+ selection,
169
+ from: head.roomVersion,
170
+ last: head.roomVersion,
171
+ done: { bytes: 0 },
172
+ models,
173
+ key: null,
174
+ }, listed, composition);
175
+ if (resumed === null)
176
+ return unconfirmed;
177
+ let staged = resumed.record ?? {
178
+ locator,
179
+ transfer: transferIdentity(),
180
+ selection,
181
+ from: head.roomVersion,
182
+ last: head.roomVersion,
183
+ done: { bytes: 0 },
184
+ models,
185
+ key: null,
186
+ };
187
+ const wanted = listed.filter((part) => !resumed.staged.has(part.id));
188
+ let arrived = staged.done.bytes;
189
+ const partial = new Map();
190
+ const report = () => {
191
+ let bytes = arrived;
192
+ for (const held of partial.values())
193
+ bytes += held;
194
+ arriving.at(bytes);
195
+ };
196
+ report();
197
+ const arrivals = [];
198
+ let woken = null;
199
+ let next = 0;
200
+ let flying = 0;
201
+ let halted = false;
202
+ let stopped = false;
203
+ let admitted = Promise.resolve();
204
+ const fetched = () => {
205
+ if ((next < wanted.length && !halted) || flying > 0)
206
+ return;
207
+ downloaded();
208
+ arriving.end();
209
+ };
210
+ const landed = (one) => {
211
+ flying -= 1;
212
+ if (stopped)
213
+ one.written();
214
+ else
215
+ arrivals.push(one);
216
+ woken?.();
217
+ ask();
218
+ fetched();
219
+ };
220
+ const fetch = async (part) => {
221
+ let written = () => { };
222
+ const admission = admitted.then(async () => {
223
+ await staging.unqueued();
224
+ written = staging.queued(part.bytes);
225
+ });
226
+ admitted = admission;
227
+ await admission;
228
+ const page = continuing()
229
+ ? await adapter.bootstrap(authorization, {
230
+ locator,
231
+ selection,
232
+ signal: ending.signal,
233
+ pageToken: part.id,
234
+ arriving: (bytes) => {
235
+ partial.set(part.id, Math.min(bytes, part.bytes));
236
+ report();
237
+ },
238
+ })
239
+ : unconfirmed;
240
+ landed({ part, page, written });
241
+ };
242
+ const ask = () => {
243
+ while (!stopped && !halted && flying < PARTS_IN_FLIGHT && next < wanted.length) {
244
+ const part = wanted[next];
245
+ next += 1;
246
+ flying += 1;
247
+ fetch(part).catch((error) => landed({ part, page: unconfirmed, written: () => { }, error }));
248
+ }
249
+ };
250
+ let failed = null;
251
+ ask();
252
+ fetched();
253
+ try {
254
+ for (;;) {
255
+ while (arrivals.length === 0) {
256
+ if (flying === 0 && (halted || next >= wanted.length))
257
+ break;
258
+ await new Promise((wake) => (woken = wake));
259
+ woken = null;
260
+ }
261
+ const one = arrivals.shift();
262
+ if (one === undefined)
263
+ break;
264
+ const { part, page, written, error } = one;
265
+ try {
266
+ if (error !== undefined)
267
+ throw error;
268
+ if (!continuing())
269
+ return unconfirmed;
270
+ if (page.kind !== 'bootstrap') {
271
+ halted = true;
272
+ failed ??= page.kind === 'beyond-horizon' ? unconfirmed : page;
273
+ continue;
274
+ }
275
+ partial.delete(part.id);
276
+ arrived += part.bytes;
277
+ report();
278
+ const kept = await staging.stage({ ...staged, done: { bytes: staged.done.bytes + part.bytes } }, await pageOf({ ...page, roomVersion: head.roomVersion }, part.id), composition);
279
+ if (kept === null)
280
+ return unconfirmed;
281
+ staged = kept;
282
+ }
283
+ finally {
284
+ written();
285
+ }
286
+ }
226
287
  }
227
- return { kind: 'staged', record: result, refreshed };
288
+ finally {
289
+ stopped = true;
290
+ for (const one of arrivals.splice(0))
291
+ one.written();
292
+ }
293
+ if (failed !== null)
294
+ return failed;
295
+ if (staged.key === null) {
296
+ const empty = await staging.stage(staged, { entries: [], folders: [] }, composition);
297
+ if (empty === null)
298
+ return unconfirmed;
299
+ staged = empty;
300
+ }
301
+ return { kind: 'parted', transfer: staged };
228
302
  }
229
- if (reconciled.kind === 'beyond-horizon') {
230
- return { kind: 'expired', held: staging.content(record.key), key: record.key };
303
+ async function installed(transfer) {
304
+ const composition = compositionFor(room, transfer.models, builtIn, typedPaths);
305
+ if (!(await staging.derive(locator, transfer.key, composition)))
306
+ return unconfirmed;
307
+ await staging.turn(locator, 'replaying');
308
+ if (!continuing())
309
+ return unconfirmed;
310
+ const record = {
311
+ locator,
312
+ name: room.name,
313
+ handle: room.handle,
314
+ operations: room.operations,
315
+ replica: room.replica,
316
+ model: transfer.models.collection,
317
+ typedSelection: room.typedSelection ?? null,
318
+ providerOwnedPaths: room.providerOwnedPaths,
319
+ authoredPaths: room.authoredPaths,
320
+ roomVersion: transfer.from,
321
+ transfer: transfer.transfer,
322
+ inventory: transfer.done,
323
+ key: transfer.key,
324
+ };
325
+ const last = transfer.last;
326
+ const refresh = adapter.refresh;
327
+ const reconciled = last === transfer.from &&
328
+ (staging.streamed || adapter.reached(locator, last, room.roomVersion))
329
+ ? { kind: 'still-current' }
330
+ : refresh === undefined
331
+ ? unconfirmed
332
+ : await advancement(refresh, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
333
+ if (reconciled.kind === 'advanced') {
334
+ return { kind: 'staged', record: reconciled.record, refreshed: true };
335
+ }
336
+ if (reconciled.kind === 'still-current')
337
+ return { kind: 'staged', record, refreshed: false };
338
+ if (reconciled.kind === 'beyond-horizon')
339
+ return { kind: 'expired', key: record.key };
340
+ return reconciled;
231
341
  }
232
- if (!RESUMABLE.has(reconciled.kind))
233
- await staging.abandon(locator);
234
- return reconciled;
235
342
  }
package/dist/cell.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export type Cell<T> = {
2
+ now(): T;
3
+ set(change: Partial<T>): void;
4
+ };
5
+ export declare function createCell<T extends object>(first: T): Cell<T>;
6
+ //# sourceMappingURL=cell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../src/cell.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,CAAC,CAAC,IAAI;IACpB,GAAG,IAAI,CAAC,CAAC;IACT,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAQ9D"}
package/dist/cell.js ADDED
@@ -0,0 +1,9 @@
1
+ export function createCell(first) {
2
+ let held = first;
3
+ return {
4
+ now: () => held,
5
+ set(change) {
6
+ held = { ...held, ...change };
7
+ },
8
+ };
9
+ }
package/dist/chain.d.ts CHANGED
@@ -1,5 +1,6 @@
1
+ import type { DocumentQuery, GroupQuery } from '@agentshouse/mdmodel';
1
2
  import type { MdRuntimeClient } from './client.js';
2
- import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
3
+ import type { DocumentResult, GroupResult, PendingResult } from './query.js';
3
4
  type Rows = DocumentResult | GroupResult;
4
5
  export type WindowAnswer = Rows | PendingResult;
5
6
  export type WindowChain = {
@@ -1 +1 @@
1
- {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,WAAW,EACX,aAAa,EACd,MAAM,YAAY,CAAC;AAEpB,KAAK,IAAI,GAAG,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAaF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,aAAa,GAAG,UAAU,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAC7E,WAAW,CAkEb"}
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7E,KAAK,IAAI,GAAG,cAAc,GAAG,WAAW,CAAC;AAEzC,MAAM,MAAM,YAAY,GAAG,IAAI,GAAG,aAAa,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAaF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,aAAa,GAAG,UAAU,EACjC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAC7E,WAAW,CAkEb"}
package/dist/change.d.ts CHANGED
@@ -50,6 +50,7 @@ type Arriving = {
50
50
  readonly path: string;
51
51
  readonly revision?: string;
52
52
  readonly fileId?: string;
53
+ readonly created?: string;
53
54
  readonly change?: HeadChange;
54
55
  };
55
56
  export type RoomMove = {
@@ -1 +1 @@
1
- {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../src/change.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../src/change.ts"],"names":[],"mappings":"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"}
package/dist/change.js CHANGED
@@ -22,7 +22,8 @@ export function leaving(batch, locator) {
22
22
  }
23
23
  export function landing(changes, index, path) {
24
24
  let at = path;
25
- for (const change of changes.slice(index + 1)) {
25
+ for (let next = index + 1; next < changes.length; next += 1) {
26
+ const change = changes[next];
26
27
  if (change.path !== at)
27
28
  continue;
28
29
  if (change.kind === 'remove')
@@ -34,7 +35,8 @@ export function landing(changes, index, path) {
34
35
  }
35
36
  export function departure(changes, index) {
36
37
  let at = changes[index].path;
37
- for (const change of changes.slice(0, index).reverse()) {
38
+ for (let earlier = index - 1; earlier >= 0; earlier -= 1) {
39
+ const change = changes[earlier];
38
40
  if (change.kind === 'move' && change.to === at)
39
41
  at = change.path;
40
42
  }
@@ -0,0 +1,5 @@
1
+ export declare const CHAT_TYPE = "chat";
2
+ export declare const CHAT_MESSAGE_TYPE = "chat-message";
3
+ export declare function keptFile(line: string): string | null;
4
+ export declare function keptLines(body: string): string[];
5
+ //# sourceMappingURL=chat-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-types.d.ts","sourceRoot":"","sources":["../src/chat-types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,SAAS,CAAC;AAEhC,eAAO,MAAM,iBAAiB,iBAAiB,CAAC;AAMhD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAKhD"}
@@ -0,0 +1,13 @@
1
+ export const CHAT_TYPE = 'chat';
2
+ export const CHAT_MESSAGE_TYPE = 'chat-message';
3
+ const KEPT_LINE = /^\[([^\]\n]+)\]\(\1\)$/u;
4
+ const TOO_BIG_LINE = /^\[too big to keep: [^\n]*\]$/u;
5
+ export function keptFile(line) {
6
+ return KEPT_LINE.exec(line)?.[1] ?? null;
7
+ }
8
+ export function keptLines(body) {
9
+ const trimmed = body.replace(/\n+$/u, '');
10
+ const at = trimmed.lastIndexOf('\n\n');
11
+ const lines = (at === -1 ? trimmed : trimmed.slice(at + 2)).split('\n');
12
+ return lines.every((line) => keptFile(line) !== null || TOO_BIG_LINE.test(line)) ? lines : [];
13
+ }