@agentshouse/mdruntime 0.1.0-c97456d63baba → 0.1.0-c9b1e59e5baeb

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 (133) hide show
  1. package/AGENTS.md +221 -221
  2. package/README.md +8 -8
  3. package/dist/adapter.d.ts +35 -6
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/bootstrap.d.ts +2 -1
  6. package/dist/bootstrap.d.ts.map +1 -1
  7. package/dist/bootstrap.js +5 -1
  8. package/dist/change-set.d.ts +5 -2
  9. package/dist/change-set.d.ts.map +1 -1
  10. package/dist/change-set.js +8 -2
  11. package/dist/chat/earlier.d.ts +10 -0
  12. package/dist/chat/earlier.d.ts.map +1 -0
  13. package/dist/chat/earlier.js +54 -0
  14. package/dist/chat/kit.js +1 -1
  15. package/dist/chat/list.d.ts +2 -1
  16. package/dist/chat/list.d.ts.map +1 -1
  17. package/dist/chat/list.js +40 -4
  18. package/dist/chat/markdown.d.ts +1 -0
  19. package/dist/chat/markdown.d.ts.map +1 -1
  20. package/dist/chat/markdown.js +78 -20
  21. package/dist/chat/message.d.ts.map +1 -1
  22. package/dist/chat/message.js +9 -2
  23. package/dist/chat/messages.d.ts.map +1 -1
  24. package/dist/chat/messages.js +36 -16
  25. package/dist/chat/overlay.d.ts +1 -0
  26. package/dist/chat/overlay.d.ts.map +1 -1
  27. package/dist/chat/overlay.js +10 -0
  28. package/dist/chat/pieces.d.ts +62 -0
  29. package/dist/chat/pieces.d.ts.map +1 -0
  30. package/dist/chat/pieces.js +1110 -0
  31. package/dist/chat/provider.d.ts +1 -0
  32. package/dist/chat/provider.d.ts.map +1 -1
  33. package/dist/chat/provider.js +22 -14
  34. package/dist/chat/question.d.ts +1 -1
  35. package/dist/chat/question.d.ts.map +1 -1
  36. package/dist/chat/question.js +7 -18
  37. package/dist/chat/ready.d.ts +1 -1
  38. package/dist/chat/ready.d.ts.map +1 -1
  39. package/dist/chat/ready.js +1 -1
  40. package/dist/chat/steady.d.ts +3 -0
  41. package/dist/chat/steady.d.ts.map +1 -0
  42. package/dist/chat/steady.js +26 -0
  43. package/dist/chat/style.js +1 -1
  44. package/dist/chat.d.ts +2 -2
  45. package/dist/chat.d.ts.map +1 -1
  46. package/dist/chat.js +2 -2
  47. package/dist/client.d.ts +6 -2
  48. package/dist/client.d.ts.map +1 -1
  49. package/dist/client.js +16 -5
  50. package/dist/collection.d.ts +4 -3
  51. package/dist/collection.d.ts.map +1 -1
  52. package/dist/collection.js +128 -63
  53. package/dist/connection.d.ts +13 -5
  54. package/dist/connection.d.ts.map +1 -1
  55. package/dist/connection.js +506 -228
  56. package/dist/conversation.d.ts +11 -0
  57. package/dist/conversation.d.ts.map +1 -1
  58. package/dist/conversation.js +195 -41
  59. package/dist/entry.d.ts.map +1 -1
  60. package/dist/entry.js +3 -2
  61. package/dist/host.d.ts +9 -7
  62. package/dist/host.d.ts.map +1 -1
  63. package/dist/host.js +58 -9
  64. package/dist/index.d.ts +6 -5
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -0
  67. package/dist/memory.d.ts +7 -3
  68. package/dist/memory.d.ts.map +1 -1
  69. package/dist/memory.js +24 -11
  70. package/dist/observation.d.ts +2 -0
  71. package/dist/observation.d.ts.map +1 -1
  72. package/dist/observation.js +9 -3
  73. package/dist/outcome.d.ts +8 -2
  74. package/dist/outcome.d.ts.map +1 -1
  75. package/dist/outcome.js +3 -0
  76. package/dist/overlay.d.ts +5 -4
  77. package/dist/overlay.d.ts.map +1 -1
  78. package/dist/overlay.js +197 -132
  79. package/dist/query.d.ts +27 -1
  80. package/dist/query.d.ts.map +1 -1
  81. package/dist/query.js +36 -7
  82. package/dist/reach.d.ts +1 -2
  83. package/dist/reach.d.ts.map +1 -1
  84. package/dist/reach.js +17 -4
  85. package/dist/react.d.ts +3 -3
  86. package/dist/react.d.ts.map +1 -1
  87. package/dist/react.js +7 -17
  88. package/dist/read-side.d.ts +3 -1
  89. package/dist/read-side.d.ts.map +1 -1
  90. package/dist/read-side.js +256 -69
  91. package/dist/reads.d.ts +11 -0
  92. package/dist/reads.d.ts.map +1 -0
  93. package/dist/reads.js +98 -0
  94. package/dist/refresh.d.ts +4 -4
  95. package/dist/refresh.d.ts.map +1 -1
  96. package/dist/refresh.js +39 -14
  97. package/dist/replica.d.ts +11 -5
  98. package/dist/replica.d.ts.map +1 -1
  99. package/dist/replica.js +79 -41
  100. package/dist/room-draft.d.ts +12 -0
  101. package/dist/room-draft.d.ts.map +1 -1
  102. package/dist/room-draft.js +11 -12
  103. package/dist/rows.d.ts +3 -1
  104. package/dist/rows.d.ts.map +1 -1
  105. package/dist/rows.js +8 -1
  106. package/dist/save.d.ts +4 -2
  107. package/dist/save.d.ts.map +1 -1
  108. package/dist/save.js +195 -111
  109. package/dist/search.d.ts +27 -6
  110. package/dist/search.d.ts.map +1 -1
  111. package/dist/search.js +89 -7
  112. package/dist/seed.d.ts +16 -0
  113. package/dist/seed.d.ts.map +1 -0
  114. package/dist/seed.js +75 -0
  115. package/dist/shared.d.ts +4 -0
  116. package/dist/shared.d.ts.map +1 -1
  117. package/dist/shared.js +63 -33
  118. package/dist/store.d.ts +20 -4
  119. package/dist/store.d.ts.map +1 -1
  120. package/dist/store.js +404 -317
  121. package/dist/turn.d.ts +5 -3
  122. package/dist/turn.d.ts.map +1 -1
  123. package/dist/turn.js +26 -7
  124. package/dist/windows.d.ts +26 -0
  125. package/dist/windows.d.ts.map +1 -0
  126. package/dist/windows.js +93 -0
  127. package/dist/wire.d.ts +16 -0
  128. package/dist/wire.d.ts.map +1 -1
  129. package/dist/wire.js +4 -0
  130. package/package.json +2 -2
  131. package/dist/acquisition.d.ts +0 -14
  132. package/dist/acquisition.d.ts.map +0 -1
  133. package/dist/acquisition.js +0 -24
@@ -36,10 +36,14 @@ export type ChatDraft = {
36
36
  };
37
37
  export type ConversationOptions = {
38
38
  limit?: number;
39
+ after?: string;
40
+ total?: true;
39
41
  };
40
42
  export type ConversationView = {
41
43
  conversation: string;
42
44
  messages: readonly ConversationMessage[];
45
+ next?: string;
46
+ total?: number;
43
47
  turn: RunningTurn | null;
44
48
  questions: readonly unknown[];
45
49
  process: {
@@ -47,6 +51,11 @@ export type ConversationView = {
47
51
  } | null;
48
52
  commands: readonly ProcessCommand[];
49
53
  options: readonly SessionOption[];
54
+ starting: string | null;
55
+ link: {
56
+ connected: boolean;
57
+ } | null;
58
+ deliveryUnknown: readonly string[];
50
59
  chatDraft: (ChatDraft & {
51
60
  readonly revision: string;
52
61
  }) | null;
@@ -64,6 +73,7 @@ export type ConversationSurface = {
64
73
  };
65
74
  export type ChatDraftSurface = {
66
75
  write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
76
+ prepend(conversation: string, draft: ChatDraft): Promise<void>;
67
77
  discard(conversation: string): Promise<void>;
68
78
  };
69
79
  export type ConversationDependencies = {
@@ -89,6 +99,7 @@ export type ConversationStore = {
89
99
  known(): boolean;
90
100
  reconnected(): void;
91
101
  reopened(): void;
102
+ lost(): void;
92
103
  watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
93
104
  watchList(deliver: (entries: readonly ConversationEntry[]) => void): () => void;
94
105
  watchAgents(deliver: (agents: readonly ConversationAgent[]) => void): () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
@@ -3,13 +3,26 @@ import { runtimeError } from './failure.js';
3
3
  import { declaredFile } from './file.js';
4
4
  import { changeBatchIdentity, chatDraftRevision } from './identity.js';
5
5
  import { OFFLINE } from './outcome.js';
6
+ import { capped, cursorOf, decodedCursor, FROM_START, messageOrder, precedes } from './windows.js';
6
7
  const QUIET = {
7
8
  turn: null,
8
9
  questions: [],
9
10
  process: null,
10
11
  commands: [],
11
12
  options: [],
13
+ starting: null,
14
+ link: null,
15
+ deliveryUnknown: [],
12
16
  };
17
+ const FACTS = [
18
+ 'questions',
19
+ 'process',
20
+ 'commands',
21
+ 'options',
22
+ 'starting',
23
+ 'link',
24
+ 'deliveryUnknown',
25
+ ];
13
26
  export function unheldView(conversation) {
14
27
  return {
15
28
  conversation,
@@ -19,6 +32,9 @@ export function unheldView(conversation) {
19
32
  process: null,
20
33
  commands: [],
21
34
  options: [],
35
+ starting: null,
36
+ link: null,
37
+ deliveryUnknown: [],
22
38
  chatDraft: null,
23
39
  };
24
40
  }
@@ -82,19 +98,25 @@ function appliedTurn(held, operation) {
82
98
  parts: held.parts.map((kept, at) => (at === operation.index ? changed : kept)),
83
99
  };
84
100
  }
85
- function ordered(left, right) {
86
- if (left.position !== right.position)
87
- return left.position < right.position ? -1 : 1;
88
- if (left.identity !== right.identity)
89
- return left.identity < right.identity ? -1 : 1;
90
- return 0;
91
- }
92
101
  function windowOf(held, arriving, limit) {
93
102
  const byIdentity = new Map(held.map((message) => [message.identity, message]));
94
103
  for (const message of arriving)
95
104
  byIdentity.set(message.identity, message);
96
- const next = [...byIdentity.values()].sort(ordered);
97
- return limit === undefined ? next : next.slice(Math.max(0, next.length - limit));
105
+ const next = [...byIdentity.values()].sort(messageOrder);
106
+ const start = Math.max(0, next.length - limit);
107
+ return { messages: next.slice(start), dropped: start > 0 };
108
+ }
109
+ function frameOf(asked, messages, more, total) {
110
+ const oldest = messages[0];
111
+ const next = !more
112
+ ? undefined
113
+ : oldest === undefined
114
+ ? (asked.after ?? FROM_START)
115
+ : cursorOf([oldest.position, oldest.identity]);
116
+ return {
117
+ ...(next === undefined ? {} : { next }),
118
+ ...(total === null ? {} : { total }),
119
+ };
98
120
  }
99
121
  function newestOf(arriving, from) {
100
122
  return arriving.reduce((top, message) => (top === null || message.position > top ? message.position : top), from);
@@ -165,14 +187,24 @@ function answered(result, field) {
165
187
  const value = answer[field];
166
188
  return typeof value === 'string' ? value : null;
167
189
  }
168
- function limitOf(options) {
169
- const { limit } = options;
170
- if (limit === undefined)
171
- return undefined;
172
- if (!Number.isInteger(limit) || limit < 0) {
190
+ function beforeOf(after) {
191
+ if (after === undefined)
192
+ return null;
193
+ const decoded = typeof after === 'string' ? decodedCursor(after) : null;
194
+ if (decoded?.length === 0)
195
+ return null;
196
+ const [position, identity] = decoded ?? [];
197
+ if (decoded?.length !== 2 || typeof position !== 'string' || typeof identity !== 'string') {
198
+ throw runtimeError('invalid-after', `conversation after must be the next an earlier view returned, got ${String(after)}`);
199
+ }
200
+ return [position, identity];
201
+ }
202
+ function askedOf(options) {
203
+ const { limit, after, total } = options;
204
+ if (limit !== undefined && (!Number.isInteger(limit) || limit < 0)) {
173
205
  throw runtimeError('invalid-limit', `conversation limit must be a non-negative integer, got ${String(limit)}`);
174
206
  }
175
- return limit;
207
+ return { limit: capped(limit), after, before: beforeOf(after), total: total === true };
176
208
  }
177
209
  const EXPIRED = { kind: 'rejected', code: 'expired', fields: {}, retryable: false };
178
210
  function unwritten(draft) {
@@ -191,11 +223,16 @@ function withSubmitted(draft, submitted) {
191
223
  const { submitted: _held, ...unsent } = draft;
192
224
  return submitted.length === 0 ? unsent : { ...unsent, submitted };
193
225
  }
226
+ function prepended(draft, said) {
227
+ return {
228
+ text: [said.text, draft.text].filter((one) => one !== '').join('\n'),
229
+ files: [...said.files, ...draft.files],
230
+ };
231
+ }
194
232
  function returned(draft, submission, others) {
195
233
  return withSubmitted({
196
234
  conversation: draft.conversation,
197
- text: [submission.text, draft.text].filter((one) => one !== '').join('\n'),
198
- files: [...submission.files, ...draft.files],
235
+ ...prepended(draft, submission),
199
236
  revision: chatDraftRevision(),
200
237
  }, others);
201
238
  }
@@ -206,8 +243,10 @@ export function createConversationStore(deps) {
206
243
  const drafts = new Map();
207
244
  const sending = new Map();
208
245
  const behind = new Set();
246
+ const catching = new Map();
209
247
  const gaps = new Map();
210
248
  const lives = new Map();
249
+ const unsent = new Map();
211
250
  const views = new Map();
212
251
  const listing = new Map();
213
252
  const creations = new Set();
@@ -222,7 +261,7 @@ export function createConversationStore(deps) {
222
261
  function liveOf(conversation) {
223
262
  return lives.get(conversation) ?? QUIET;
224
263
  }
225
- function viewOf(conversation, held) {
264
+ function viewOf(conversation, held, frame) {
226
265
  const draft = drafts.get(conversation);
227
266
  const facts = liveOf(conversation);
228
267
  return {
@@ -233,11 +272,15 @@ export function createConversationStore(deps) {
233
272
  text,
234
273
  message,
235
274
  })),
275
+ ...frame,
236
276
  turn: structuredClone(facts.turn),
237
277
  questions: structuredClone(facts.questions),
238
278
  process: facts.process === null ? null : { ...facts.process },
239
279
  commands: structuredClone(facts.commands),
240
280
  options: structuredClone(facts.options),
281
+ starting: facts.starting,
282
+ link: facts.link === null ? null : { ...facts.link },
283
+ deliveryUnknown: [...facts.deliveryUnknown],
241
284
  chatDraft: draft === undefined || unwritten(draft)
242
285
  ? null
243
286
  : { text: draft.text, files: [...draft.files], revision: draft.revision },
@@ -252,16 +295,34 @@ export function createConversationStore(deps) {
252
295
  const ready = [...view.watchers].filter((watcher) => watcher.ready);
253
296
  if (ready.length === 0)
254
297
  continue;
255
- const value = viewOf(conversation, view.window);
298
+ const value = viewOf(conversation, view.window, sharedFrame(view, view.window));
256
299
  for (const watcher of ready)
257
300
  watcher.notify(value);
258
301
  }
259
302
  }
260
- function slide(conversation, arriving) {
303
+ function sharedFrame(view, window) {
304
+ return frameOf(view.asked, window, view.more, view.total);
305
+ }
306
+ async function slide(local, conversation, arriving) {
307
+ let count;
261
308
  for (const view of views.values()) {
262
309
  if (view.conversation !== conversation || view.window === null)
263
310
  continue;
264
- view.window = arriving === null ? [] : windowOf(view.window, arriving, view.limit);
311
+ if (arriving === null) {
312
+ view.window = [];
313
+ view.more = false;
314
+ if (view.total !== null)
315
+ view.total = 0;
316
+ continue;
317
+ }
318
+ const joining = arriving.filter((message) => precedes(message, view.asked.before));
319
+ const next = windowOf(view.window, joining, view.asked.limit);
320
+ view.window = next.messages;
321
+ view.more ||= next.dropped;
322
+ if (view.total !== null && arriving.length > 0) {
323
+ count ??= await local.messageCount(conversation);
324
+ view.total = count;
325
+ }
265
326
  }
266
327
  }
267
328
  function changesOf(conversation, arriving) {
@@ -363,9 +424,34 @@ export function createConversationStore(deps) {
363
424
  return agentsRead;
364
425
  }
365
426
  function live(conversation, change) {
427
+ const owed = unsent.get(conversation);
428
+ for (const fact of FACTS.filter((one) => one in change))
429
+ owed?.delete(fact);
366
430
  setLive(conversation, { ...liveOf(conversation), ...change });
367
431
  emit(conversation);
368
432
  }
433
+ function openingEnded() {
434
+ const owed = [...unsent];
435
+ unsent.clear();
436
+ for (const [conversation, facts] of owed) {
437
+ const held = lives.get(conversation);
438
+ if (held === undefined || facts.size === 0)
439
+ continue;
440
+ setLive(conversation, {
441
+ turn: held.turn,
442
+ questions: facts.has('questions') ? QUIET.questions : held.questions,
443
+ process: facts.has('process') ? QUIET.process : held.process,
444
+ commands: facts.has('commands') ? QUIET.commands : held.commands,
445
+ options: facts.has('options') ? QUIET.options : held.options,
446
+ starting: facts.has('starting') ? QUIET.starting : held.starting,
447
+ link: facts.has('link') ? QUIET.link : held.link,
448
+ deliveryUnknown: facts.has('deliveryUnknown')
449
+ ? QUIET.deliveryUnknown
450
+ : held.deliveryUnknown,
451
+ });
452
+ emit(conversation);
453
+ }
454
+ }
369
455
  function relayed(conversation, turn, operation) {
370
456
  const held = liveOf(conversation).turn;
371
457
  const next = held?.turn === turn ? appliedTurn(held, operation) : startedTurn(turn, operation);
@@ -409,8 +495,9 @@ export function createConversationStore(deps) {
409
495
  partials.delete(conversation);
410
496
  drafts.delete(conversation);
411
497
  behind.delete(conversation);
498
+ unsent.delete(conversation);
412
499
  setLive(conversation, null);
413
- slide(conversation, null);
500
+ await slide(local, conversation, null);
414
501
  }
415
502
  if (changed.length > 0)
416
503
  deps.publish(conversationChangeSet(removed, changed));
@@ -438,11 +525,11 @@ export function createConversationStore(deps) {
438
525
  if (advances)
439
526
  reads.set(conversation, message.position);
440
527
  sealTurns(conversation, new Set([message.turn]));
441
- slide(conversation, [message]);
528
+ await slide(local, conversation, [message]);
442
529
  deps.publish(conversationChangeSet(changesOf(conversation, [message]), [conversation]));
443
530
  });
444
531
  }
445
- async function readHistories(conversations) {
532
+ async function readHistories(conversations, ended) {
446
533
  const generations = new Map(conversations.map((one) => [one, gaps.get(one) ?? 0]));
447
534
  let asking = conversations.map((conversation) => ({
448
535
  conversation,
@@ -468,10 +555,33 @@ export function createConversationStore(deps) {
468
555
  following.push({ conversation: page.conversation, after: page.next });
469
556
  }
470
557
  }
558
+ for (const { conversation } of asking) {
559
+ if (!following.some((next) => next.conversation === conversation))
560
+ ended(conversation);
561
+ }
471
562
  asking = following;
472
563
  }
473
564
  return null;
474
565
  }
566
+ function caughtUp(conversations) {
567
+ const ends = new Map();
568
+ for (const conversation of conversations) {
569
+ const held = new Promise((end) => ends.set(conversation, end));
570
+ catching.set(conversation, held);
571
+ void held.then(() => {
572
+ if (catching.get(conversation) === held)
573
+ catching.delete(conversation);
574
+ });
575
+ }
576
+ const ended = (conversation) => ends.get(conversation)?.();
577
+ const read = readHistories(conversations, ended);
578
+ const endAll = () => {
579
+ for (const conversation of conversations)
580
+ ended(conversation);
581
+ };
582
+ read.then(endAll, endAll);
583
+ return read;
584
+ }
475
585
  function keepPage(conversation, arriving, from, next, generation) {
476
586
  return deps.durably(async (local) => {
477
587
  if (!replicated.has(conversation))
@@ -490,7 +600,7 @@ export function createConversationStore(deps) {
490
600
  sealTurns(conversation, new Set(arriving.map((message) => message.turn)));
491
601
  if (whole && (gaps.get(conversation) ?? 0) === generation)
492
602
  behind.delete(conversation);
493
- slide(conversation, arriving);
603
+ await slide(local, conversation, arriving);
494
604
  if (arriving.length > 0 || sealing || whole) {
495
605
  deps.publish(conversationChangeSet(changesOf(conversation, arriving), [conversation]));
496
606
  }
@@ -501,11 +611,8 @@ export function createConversationStore(deps) {
501
611
  if (event.kind === 'gap') {
502
612
  if (replicated.has(conversation))
503
613
  gap(conversation);
504
- const held = lives.get(conversation);
505
- if (held === undefined)
506
- return;
507
- setLive(conversation, { ...QUIET, turn: held.turn });
508
- emit(conversation);
614
+ if (lives.has(conversation))
615
+ unsent.set(conversation, new Set(FACTS));
509
616
  return;
510
617
  }
511
618
  if (event.kind === 'turn') {
@@ -528,6 +635,18 @@ export function createConversationStore(deps) {
528
635
  live(conversation, { options: structuredClone(event.options) });
529
636
  return;
530
637
  }
638
+ if (event.kind === 'starting') {
639
+ live(conversation, { starting: event.step });
640
+ return;
641
+ }
642
+ if (event.kind === 'link') {
643
+ live(conversation, { link: { connected: event.connected } });
644
+ return;
645
+ }
646
+ if (event.kind === 'deliveries') {
647
+ live(conversation, { deliveryUnknown: [...event.unknown] });
648
+ return;
649
+ }
531
650
  const arriving = acceptedMessage(event.message);
532
651
  if (arriving === null)
533
652
  return;
@@ -667,8 +786,12 @@ export function createConversationStore(deps) {
667
786
  return entries();
668
787
  },
669
788
  async read(conversation, options = {}) {
670
- const limit = limitOf(options);
671
- return deps.durably(async (local) => structuredClone(viewOf(conversation, await local.messageWindow(conversation, limit))));
789
+ const asked = askedOf(options);
790
+ return deps.durably(async (local) => {
791
+ const { messages, more } = await local.messageWindow(conversation, asked.limit, asked.before);
792
+ const total = asked.total ? await local.messageCount(conversation) : null;
793
+ return structuredClone(viewOf(conversation, messages, frameOf(asked, messages, more, total)));
794
+ });
672
795
  },
673
796
  async create(input) {
674
797
  const result = await deps.call('conversation.create', input);
@@ -732,6 +855,16 @@ export function createConversationStore(deps) {
732
855
  ...(current === undefined ? {} : pending(current)),
733
856
  }));
734
857
  },
858
+ prepend(conversation, draft) {
859
+ return withDraft(conversation, (current) => ({
860
+ conversation,
861
+ ...(current === undefined
862
+ ? { text: draft.text, files: [...draft.files] }
863
+ : prepended(current, draft)),
864
+ revision: chatDraftRevision(),
865
+ ...(current === undefined ? {} : pending(current)),
866
+ }));
867
+ },
735
868
  discard(conversation) {
736
869
  return withDraft(conversation, (current) => current === undefined
737
870
  ? undefined
@@ -781,12 +914,20 @@ export function createConversationStore(deps) {
781
914
  await remove(leaving);
782
915
  },
783
916
  async catchUp(progress) {
784
- const reading = [...behind].filter((conversation) => replicated.has(conversation)).sort();
785
- if (reading.length > 0 && !deps.closed()) {
786
- const failed = await readHistories(reading);
917
+ const owed = (conversation) => behind.has(conversation) && replicated.has(conversation);
918
+ const read = async (conversations) => {
919
+ if (conversations.length === 0 || deps.closed())
920
+ return;
921
+ const failed = await caughtUp(conversations);
787
922
  if (failed?.kind === 'transport-uncertainty')
788
923
  progress.reachable = false;
789
- }
924
+ };
925
+ const asking = [...behind].filter(owed).sort();
926
+ const awaited = asking.filter((conversation) => catching.has(conversation));
927
+ await Promise.all([
928
+ read(asking.filter((conversation) => !catching.has(conversation))),
929
+ Promise.all(awaited.map((conversation) => catching.get(conversation))).then(() => read(awaited.filter((conversation) => owed(conversation) && !catching.has(conversation)))),
930
+ ]);
790
931
  if (behind.size > 0)
791
932
  progress.complete = false;
792
933
  },
@@ -828,27 +969,38 @@ export function createConversationStore(deps) {
828
969
  reopened() {
829
970
  sending.clear();
830
971
  },
972
+ lost() {
973
+ catching.clear();
974
+ },
831
975
  watch(conversation, options, deliver) {
832
- const limit = limitOf(options);
833
- const key = JSON.stringify([conversation, limit ?? null]);
976
+ const asked = askedOf(options);
977
+ const key = JSON.stringify([conversation, asked.limit, asked.after ?? null, asked.total]);
834
978
  const view = views.get(key) ?? {
835
979
  conversation,
836
- limit,
980
+ asked,
837
981
  watchers: new Set(),
838
982
  window: null,
983
+ more: false,
984
+ total: null,
839
985
  };
840
986
  views.set(key, view);
841
987
  const watcher = { notify: deliver, ready: false };
842
988
  view.watchers.add(watcher);
843
989
  void deps
844
990
  .durably(async (local) => {
845
- view.window ??= await local.messageWindow(conversation, limit);
991
+ if (view.window !== null)
992
+ return;
993
+ const { messages, more } = await local.messageWindow(conversation, asked.limit, asked.before);
994
+ view.window = messages;
995
+ view.more = more;
996
+ view.total = asked.total ? await local.messageCount(conversation) : null;
846
997
  })
847
998
  .then(() => {
848
999
  if (deps.closed() || !view.watchers.has(watcher))
849
1000
  return;
850
1001
  watcher.ready = true;
851
- watcher.notify(viewOf(conversation, view.window ?? []));
1002
+ const window = view.window ?? [];
1003
+ watcher.notify(viewOf(conversation, window, sharedFrame(view, window)));
852
1004
  })
853
1005
  .catch(() => { });
854
1006
  return () => {
@@ -900,6 +1052,7 @@ export function createConversationStore(deps) {
900
1052
  creations.delete(entry.conversation);
901
1053
  }
902
1054
  listKnown = true;
1055
+ openingEnded();
903
1056
  }
904
1057
  else if (event.kind === 'listed') {
905
1058
  listing.set(event.entry.conversation, { ...event.entry });
@@ -926,6 +1079,7 @@ export function createConversationStore(deps) {
926
1079
  close() {
927
1080
  views.clear();
928
1081
  lives.clear();
1082
+ unsent.clear();
929
1083
  listWatchers.clear();
930
1084
  agentWatchers.clear();
931
1085
  },
@@ -1 +1 @@
1
- {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,SAAS,EAEf,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AA0D7E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMpE;AAkCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACzF,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,CAqDlE"}
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,SAAS,EAEf,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AA0D7E,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAE3E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,SAAS,MAAM,EAAE,CAMpE;AAkCD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAQ7D;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;CACzF,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,CAuDlE"}
package/dist/entry.js CHANGED
@@ -131,10 +131,10 @@ export function entryScope(rooms) {
131
131
  locator: room.locator,
132
132
  path,
133
133
  before: [],
134
- after: rowsOf(room.locator, path, passingFrontmatter(collection, path) ?? null, composition, null, null),
134
+ after: rowsOf(room.locator, path, passingFrontmatter(collection, path) ?? null, composition, null, null, null),
135
135
  }));
136
136
  });
137
- readSide.apply({
137
+ const seeded = readSide.apply({
138
138
  documents,
139
139
  drafts: [],
140
140
  rooms: [],
@@ -146,6 +146,7 @@ export function entryScope(rooms) {
146
146
  const planned = { listed: true, rooms: held };
147
147
  return {
148
148
  async results(queries) {
149
+ await seeded;
149
150
  const results = {};
150
151
  for (const [name, query] of Object.entries(queries)) {
151
152
  results[name] = (await readSide.query(planOf(query, planned), () => null)).rows;
package/dist/host.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { type MdRuntimeOptions } from './connection.js';
2
- import type { RuntimeDemand } from './acquisition.js';
3
2
  import type { PortReach } from './reach.js';
4
- import type { CapacityCause, CodeAvailability, Persistence, Readiness } from './readiness.js';
3
+ import type { CapacityCause, CodeAvailability, Persistence, Readiness, SearchObligation } from './readiness.js';
4
+ import type { EntrySeed } from './seed.js';
5
5
  import { type RuntimePort } from './wire.js';
6
6
  export type MdRuntimeHostOptions = MdRuntimeOptions & {
7
7
  deploymentFacts?: unknown;
@@ -10,21 +10,23 @@ export type AttachedPort = {
10
10
  detach(): void;
11
11
  narrow(reach: PortReach): void;
12
12
  readiness(deliver: (readiness: Readiness) => void): () => void;
13
+ answered(queries: readonly unknown[], done: () => void): void;
13
14
  code(code: CodeAvailability, capacity: CapacityCause | null): void;
15
+ search(search: SearchObligation): void;
14
16
  };
15
17
  export type MdRuntimeHost = {
16
- attach(port: RuntimePort, app: string, release?: string, reach?: PortReach, code?: CodeAvailability): AttachedPort;
17
- acquire(demand: RuntimeDemand): void;
18
+ attach(port: RuntimePort, app: string, release?: string, reach?: PortReach, code?: CodeAvailability, search?: SearchObligation): AttachedPort;
19
+ seed(entry: EntrySeed): void;
18
20
  persisted(answer: Persistence): void;
19
21
  endAuthorization(holder?: string): Promise<void>;
20
22
  lose(locators: readonly string[]): Promise<void>;
21
23
  stop(): Promise<void>;
22
24
  };
23
25
  export declare function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost;
24
- export type { RuntimeDemand } from './acquisition.js';
26
+ export { entrySeedOf, type EntrySeed } from './seed.js';
25
27
  export type { PortReach, ReachedDocument } from './reach.js';
26
- export type { CapacityCause, CodeAvailability, Persistence } from './readiness.js';
28
+ export type { CapacityCause, CodeAvailability, Persistence, SearchObligation, } from './readiness.js';
27
29
  export { createRecovery, retryDelay, type Attempt, type Attempted, type AttemptOptions, type Recovery, type RecoveryOptions, } from './recovery.js';
28
- export { AUTHORED_SCHEMA, authoredBinding, authoredBy, authoredHolder, bindAuthored, openDatabase, STORE_SCHEMA, } from './store.js';
30
+ export { AUTHORED_SCHEMA, authoredBinding, authoredBy, authoredHolder, bindAuthored, openDatabase, STORE_SCHEMA, transacted, } from './store.js';
29
31
  export type { RuntimePort } from './wire.js';
30
32
  //# sourceMappingURL=host.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI9F,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,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;CACpE,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,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IACrC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AA4FF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA4I3E;AAED,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACnF,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,OAAO,EACL,eAAe,EACf,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,gBAAgB,EAItB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,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;IAC9D,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;IACnE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACxC,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,EACvB,MAAM,CAAC,EAAE,gBAAgB,GACxB,YAAY,CAAC;IAChB,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,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAiHF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAsK3E;AAED,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,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,OAAO,EACL,eAAe,EACf,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}