@agentshouse/mdruntime 0.1.0-c03e7b79830dd → 0.1.0-c069136dcb4e8

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 (214) hide show
  1. package/README.md +10 -8
  2. package/dist/adapter.d.ts +47 -48
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +2 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +28 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +16 -8
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +142 -94
  13. package/dist/change-set.d.ts +1 -7
  14. package/dist/change-set.d.ts.map +1 -1
  15. package/dist/change-set.js +1 -4
  16. package/dist/client.d.ts +6 -7
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +54 -7
  19. package/dist/collection.d.ts +5 -3
  20. package/dist/collection.d.ts.map +1 -1
  21. package/dist/collection.js +24 -19
  22. package/dist/compile.d.ts +6 -1
  23. package/dist/compile.d.ts.map +1 -1
  24. package/dist/compile.js +94 -33
  25. package/dist/connection.d.ts +8 -7
  26. package/dist/connection.d.ts.map +1 -1
  27. package/dist/connection.js +1160 -1174
  28. package/dist/conversation.d.ts +6 -9
  29. package/dist/conversation.d.ts.map +1 -1
  30. package/dist/conversation.js +191 -121
  31. package/dist/durability.d.ts +1 -5
  32. package/dist/durability.d.ts.map +1 -1
  33. package/dist/durability.js +5 -0
  34. package/dist/entry.d.ts +1 -0
  35. package/dist/entry.d.ts.map +1 -1
  36. package/dist/entry.js +1 -1
  37. package/dist/file.d.ts +2 -11
  38. package/dist/file.d.ts.map +1 -1
  39. package/dist/file.js +6 -4
  40. package/dist/fulltext.d.ts +27 -0
  41. package/dist/fulltext.d.ts.map +1 -0
  42. package/dist/fulltext.js +370 -0
  43. package/dist/host.d.ts +3 -4
  44. package/dist/host.d.ts.map +1 -1
  45. package/dist/host.js +42 -18
  46. package/dist/identity.d.ts +0 -1
  47. package/dist/identity.d.ts.map +1 -1
  48. package/dist/identity.js +0 -3
  49. package/dist/index.d.ts +10 -10
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +4 -3
  52. package/dist/live.d.ts.map +1 -1
  53. package/dist/live.js +2 -1
  54. package/dist/media.d.ts +8 -0
  55. package/dist/media.d.ts.map +1 -0
  56. package/dist/media.js +218 -0
  57. package/dist/memory.d.ts +5 -3
  58. package/dist/memory.d.ts.map +1 -1
  59. package/dist/memory.js +96 -38
  60. package/dist/messages.d.ts +28 -0
  61. package/dist/messages.d.ts.map +1 -0
  62. package/dist/messages.js +90 -0
  63. package/dist/model.d.ts +6 -1
  64. package/dist/model.d.ts.map +1 -1
  65. package/dist/model.js +7 -10
  66. package/dist/observation.d.ts +1 -0
  67. package/dist/observation.d.ts.map +1 -1
  68. package/dist/observation.js +1 -1
  69. package/dist/outcome.d.ts +13 -6
  70. package/dist/outcome.d.ts.map +1 -1
  71. package/dist/outcome.js +16 -5
  72. package/dist/overlay.js +1 -1
  73. package/dist/paths.d.ts +1 -0
  74. package/dist/paths.d.ts.map +1 -1
  75. package/dist/paths.js +4 -0
  76. package/dist/query.d.ts +10 -1
  77. package/dist/query.d.ts.map +1 -1
  78. package/dist/query.js +12 -1
  79. package/dist/reach.d.ts +8 -3
  80. package/dist/reach.d.ts.map +1 -1
  81. package/dist/reach.js +69 -46
  82. package/dist/readiness.d.ts +14 -15
  83. package/dist/readiness.d.ts.map +1 -1
  84. package/dist/readiness.js +2 -8
  85. package/dist/recovery.d.ts +1 -0
  86. package/dist/recovery.d.ts.map +1 -1
  87. package/dist/recovery.js +26 -0
  88. package/dist/refresh.d.ts +9 -4
  89. package/dist/refresh.d.ts.map +1 -1
  90. package/dist/refresh.js +64 -30
  91. package/dist/replica.d.ts +5 -5
  92. package/dist/replica.d.ts.map +1 -1
  93. package/dist/replica.js +4 -7
  94. package/dist/room-draft.d.ts +18 -2
  95. package/dist/room-draft.d.ts.map +1 -1
  96. package/dist/room-draft.js +73 -6
  97. package/dist/rows.d.ts +15 -6
  98. package/dist/rows.d.ts.map +1 -1
  99. package/dist/rows.js +102 -74
  100. package/dist/save.d.ts +2 -0
  101. package/dist/save.d.ts.map +1 -1
  102. package/dist/save.js +13 -7
  103. package/dist/search.d.ts +11 -43
  104. package/dist/search.d.ts.map +1 -1
  105. package/dist/search.js +0 -296
  106. package/dist/shared.d.ts +0 -1
  107. package/dist/shared.d.ts.map +1 -1
  108. package/dist/shared.js +0 -10
  109. package/dist/status.d.ts +4 -3
  110. package/dist/status.d.ts.map +1 -1
  111. package/dist/status.js +3 -1
  112. package/dist/store.d.ts +23 -58
  113. package/dist/store.d.ts.map +1 -1
  114. package/dist/store.js +37 -272
  115. package/dist/stored.d.ts +10 -23
  116. package/dist/stored.d.ts.map +1 -1
  117. package/dist/stored.js +217 -218
  118. package/dist/tables.d.ts +51 -46
  119. package/dist/tables.d.ts.map +1 -1
  120. package/dist/tables.js +94 -53
  121. package/dist/transfer.d.ts +0 -5
  122. package/dist/transfer.d.ts.map +1 -1
  123. package/dist/validation.d.ts +3 -4
  124. package/dist/validation.d.ts.map +1 -1
  125. package/dist/validation.js +35 -96
  126. package/dist/wire.d.ts +5 -5
  127. package/dist/wire.d.ts.map +1 -1
  128. package/dist/wire.js +2 -2
  129. package/dist/words.d.ts +19 -0
  130. package/dist/words.d.ts.map +1 -0
  131. package/dist/words.js +156 -0
  132. package/package.json +11 -19
  133. package/AGENTS.md +0 -312
  134. package/dist/chat/acts.d.ts +0 -33
  135. package/dist/chat/acts.d.ts.map +0 -1
  136. package/dist/chat/acts.js +0 -36
  137. package/dist/chat/context.d.ts +0 -3
  138. package/dist/chat/context.d.ts.map +0 -1
  139. package/dist/chat/context.js +0 -10
  140. package/dist/chat/earlier.d.ts +0 -10
  141. package/dist/chat/earlier.d.ts.map +0 -1
  142. package/dist/chat/earlier.js +0 -54
  143. package/dist/chat/house.d.ts +0 -25
  144. package/dist/chat/house.d.ts.map +0 -1
  145. package/dist/chat/house.js +0 -38
  146. package/dist/chat/input.d.ts +0 -11
  147. package/dist/chat/input.d.ts.map +0 -1
  148. package/dist/chat/input.js +0 -92
  149. package/dist/chat/kit.d.ts +0 -61
  150. package/dist/chat/kit.d.ts.map +0 -1
  151. package/dist/chat/kit.js +0 -123
  152. package/dist/chat/lasting.d.ts +0 -6
  153. package/dist/chat/lasting.d.ts.map +0 -1
  154. package/dist/chat/lasting.js +0 -19
  155. package/dist/chat/list.d.ts +0 -28
  156. package/dist/chat/list.d.ts.map +0 -1
  157. package/dist/chat/list.js +0 -103
  158. package/dist/chat/markdown.d.ts +0 -21
  159. package/dist/chat/markdown.d.ts.map +0 -1
  160. package/dist/chat/markdown.js +0 -246
  161. package/dist/chat/message.d.ts +0 -7
  162. package/dist/chat/message.d.ts.map +0 -1
  163. package/dist/chat/message.js +0 -244
  164. package/dist/chat/messages.d.ts +0 -30
  165. package/dist/chat/messages.d.ts.map +0 -1
  166. package/dist/chat/messages.js +0 -198
  167. package/dist/chat/name.d.ts +0 -7
  168. package/dist/chat/name.d.ts.map +0 -1
  169. package/dist/chat/name.js +0 -37
  170. package/dist/chat/opened.d.ts +0 -12
  171. package/dist/chat/opened.d.ts.map +0 -1
  172. package/dist/chat/opened.js +0 -19
  173. package/dist/chat/overlay.d.ts +0 -32
  174. package/dist/chat/overlay.d.ts.map +0 -1
  175. package/dist/chat/overlay.js +0 -103
  176. package/dist/chat/parts.d.ts +0 -58
  177. package/dist/chat/parts.d.ts.map +0 -1
  178. package/dist/chat/parts.js +0 -120
  179. package/dist/chat/pieces.d.ts +0 -62
  180. package/dist/chat/pieces.d.ts.map +0 -1
  181. package/dist/chat/pieces.js +0 -1110
  182. package/dist/chat/process.d.ts +0 -20
  183. package/dist/chat/process.d.ts.map +0 -1
  184. package/dist/chat/process.js +0 -32
  185. package/dist/chat/provider.d.ts +0 -70
  186. package/dist/chat/provider.d.ts.map +0 -1
  187. package/dist/chat/provider.js +0 -635
  188. package/dist/chat/question.d.ts +0 -9
  189. package/dist/chat/question.d.ts.map +0 -1
  190. package/dist/chat/question.js +0 -69
  191. package/dist/chat/questions.d.ts +0 -31
  192. package/dist/chat/questions.d.ts.map +0 -1
  193. package/dist/chat/questions.js +0 -111
  194. package/dist/chat/read.d.ts +0 -5
  195. package/dist/chat/read.d.ts.map +0 -1
  196. package/dist/chat/read.js +0 -13
  197. package/dist/chat/ready.d.ts +0 -37
  198. package/dist/chat/ready.d.ts.map +0 -1
  199. package/dist/chat/ready.js +0 -93
  200. package/dist/chat/room-file.d.ts +0 -8
  201. package/dist/chat/room-file.d.ts.map +0 -1
  202. package/dist/chat/room-file.js +0 -72
  203. package/dist/chat/steady.d.ts +0 -3
  204. package/dist/chat/steady.d.ts.map +0 -1
  205. package/dist/chat/steady.js +0 -26
  206. package/dist/chat/style.d.ts +0 -4
  207. package/dist/chat/style.d.ts.map +0 -1
  208. package/dist/chat/style.js +0 -306
  209. package/dist/chat.d.ts +0 -15
  210. package/dist/chat.d.ts.map +0 -1
  211. package/dist/chat.js +0 -8
  212. package/dist/reads.d.ts +0 -11
  213. package/dist/reads.d.ts.map +0 -1
  214. package/dist/reads.js +0 -98
@@ -1,9 +1,7 @@
1
- import type { ConversationAction, ConversationAgents, ConversationEvent, ConversationMessage, ConversationStream, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
1
+ import type { ConversationAction, ConversationEvent, ConversationMessage, ConversationStream, ListedConversation, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
2
2
  import { type ChangeSet } from './change-set.js';
3
- import { type ChosenFile } from './file.js';
4
3
  import type { Open } from './open.js';
5
4
  import { type CallResult, type Offline } from './outcome.js';
6
- import type { DocumentResult, PendingResult } from './query.js';
7
5
  import type { CycleProgress } from './status.js';
8
6
  import type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';
9
7
  export type ConversationState = Open<'working' | 'asking' | 'idle'>;
@@ -11,7 +9,7 @@ export type ConversationEntry = {
11
9
  conversation: string;
12
10
  agent: {
13
11
  identity: string;
14
- name: string | null;
12
+ name: string;
15
13
  };
16
14
  name: string;
17
15
  created: string;
@@ -65,7 +63,6 @@ export type ConversationSurface = {
65
63
  read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;
66
64
  create(input: unknown): Promise<CallResult>;
67
65
  send(conversation: string, operation?: string, draft?: ChatDraft): Promise<CallResult | Offline>;
68
- attach(room: string, file: ChosenFile): Promise<CallResult | Offline>;
69
66
  answer(conversation: string, answer: unknown): Promise<CallResult>;
70
67
  interrupt(conversation: string): Promise<CallResult>;
71
68
  kill(conversation: string): Promise<CallResult>;
@@ -78,13 +75,12 @@ export type ChatDraftSurface = {
78
75
  discard(conversation: string): Promise<void>;
79
76
  };
80
77
  export type ConversationDependencies = {
81
- agents(): ConversationAgents | undefined;
82
- documents(agents: ConversationAgents, after: string | undefined): Promise<DocumentResult | PendingResult>;
83
78
  call(name: ConversationAction, input: unknown): Promise<CallResult>;
84
79
  durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;
85
80
  stream(): ConversationStream | undefined;
86
81
  publish(set: ChangeSet): void;
87
82
  online(): boolean;
83
+ full(): boolean;
88
84
  closed(): boolean;
89
85
  unanswered(): void;
90
86
  expired(operation: string): boolean;
@@ -92,13 +88,13 @@ export type ConversationDependencies = {
92
88
  export type ConversationStore = {
93
89
  surface: ConversationSurface;
94
90
  chatDraft: ChatDraftSurface;
95
- hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[]): void;
91
+ hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[], list: readonly ListedConversation[] | null): void;
96
92
  reconcile(): Promise<void>;
97
93
  catchUp(progress: CycleProgress): Promise<void>;
98
94
  resend(progress: CycleProgress): Promise<void>;
99
95
  current(): boolean;
100
96
  known(): boolean;
101
- reconnected(): void;
97
+ learned(): void;
102
98
  reopened(): void;
103
99
  lost(): void;
104
100
  watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
@@ -112,6 +108,7 @@ export type ConversationStore = {
112
108
  };
113
109
  export declare function unheldView(conversation: string): ConversationView;
114
110
  export declare const SESSION_STARTED = "Session started";
111
+ export declare const HISTORY_CONVERSATIONS = 64;
115
112
  export declare function newChat(agent: string): string;
116
113
  export declare function createConversationStore(deps: ConversationDependencies): ConversationStore;
117
114
  //# sourceMappingURL=conversation.d.ts.map
@@ -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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"}
@@ -1,8 +1,9 @@
1
1
  import { conversationChangeSet } from './change-set.js';
2
2
  import { runtimeError } from './failure.js';
3
- import { declaredFile } from './file.js';
3
+ import { refusedForSpace } from './durability.js';
4
4
  import { changeBatchIdentity, chatDraftRevision } from './identity.js';
5
5
  import { OFFLINE } from './outcome.js';
6
+ import { untilAnswered } from './recovery.js';
6
7
  import { capped, cursorOf, decodedCursor, FROM_START, messageOrder, precedes } from './windows.js';
7
8
  const QUIET = {
8
9
  turn: null,
@@ -40,6 +41,7 @@ export function unheldView(conversation) {
40
41
  }
41
42
  export const SESSION_STARTED = 'Session started';
42
43
  const NEW_CHAT = 'new:';
44
+ export const HISTORY_CONVERSATIONS = 64;
43
45
  export function newChat(agent) {
44
46
  return `${NEW_CHAT}${agent}`;
45
47
  }
@@ -209,6 +211,12 @@ function askedOf(options) {
209
211
  return { limit: capped(limit), after, before: beforeOf(after), total: total === true };
210
212
  }
211
213
  const EXPIRED = { kind: 'rejected', code: 'expired', fields: {}, retryable: false };
214
+ const DURABLE_WRITE = {
215
+ kind: 'rejected',
216
+ code: 'durable-write',
217
+ fields: {},
218
+ retryable: true,
219
+ };
212
220
  function unwritten(draft) {
213
221
  return draft.text === '';
214
222
  }
@@ -250,11 +258,15 @@ export function createConversationStore(deps) {
250
258
  const listing = new Map();
251
259
  const creations = new Set();
252
260
  const listWatchers = new Set();
261
+ const unlisted = new Set();
253
262
  let listKnown = false;
263
+ let listHeld = false;
264
+ let listKept = false;
254
265
  const agentWatchers = new Set();
255
- let agentNames = new Map();
256
- let retiredAgents = new Set();
257
- let agentsRead = null;
266
+ const unnamed = new Set();
267
+ let agentsShown = null;
268
+ let listedAgents = null;
269
+ let agentsReading = false;
258
270
  let replicated = new Set();
259
271
  let handedReplicated;
260
272
  function liveOf(conversation) {
@@ -324,9 +336,6 @@ export function createConversationStore(deps) {
324
336
  }
325
337
  }
326
338
  }
327
- function changesOf(conversation, arriving) {
328
- return arriving.map(({ identity, text }) => ({ conversation, identity, text }));
329
- }
330
339
  function stateOf(conversation) {
331
340
  const facts = liveOf(conversation);
332
341
  if (facts.questions.length > 0)
@@ -336,7 +345,7 @@ export function createConversationStore(deps) {
336
345
  function entries() {
337
346
  return [...listing.values()].map((entry) => ({
338
347
  conversation: entry.conversation,
339
- agent: { identity: entry.agent, name: agentNames.get(entry.agent) ?? null },
348
+ agent: { identity: entry.agent, name: entry.agentName },
340
349
  name: entry.name,
341
350
  created: entry.created,
342
351
  finished: entry.finished,
@@ -346,25 +355,90 @@ export function createConversationStore(deps) {
346
355
  started: lives.get(entry.conversation)?.turn?.started ?? null,
347
356
  }));
348
357
  }
358
+ function keepList() {
359
+ if (!listKnown || listKept)
360
+ return;
361
+ listKept = true;
362
+ queueMicrotask(() => {
363
+ listKept = false;
364
+ if (deps.closed())
365
+ return;
366
+ const entries = [...listing.values()];
367
+ void deps.durably((local) => local.fact('conversationList', entries)).catch(() => { });
368
+ });
369
+ }
349
370
  function emitList() {
350
- if (deps.closed() || listWatchers.size === 0)
371
+ if (deps.closed())
351
372
  return;
352
- const value = entries();
353
- for (const watcher of listWatchers)
354
- watcher(value);
373
+ if (listWatchers.size > 0) {
374
+ const value = entries();
375
+ for (const watcher of listWatchers)
376
+ watcher(value);
377
+ }
378
+ emitAgents();
379
+ learned();
380
+ }
381
+ function learned() {
382
+ if (deps.closed())
383
+ return;
384
+ if (!listKnown && !listHeld && deps.stream() !== undefined && deps.online())
385
+ return;
386
+ if (unlisted.size > 0) {
387
+ const value = entries();
388
+ for (const watcher of [...unlisted]) {
389
+ unlisted.delete(watcher);
390
+ listWatchers.add(watcher);
391
+ watcher(value);
392
+ }
393
+ }
394
+ if (unnamed.size > 0) {
395
+ const value = agents();
396
+ for (const watcher of [...unnamed]) {
397
+ unnamed.delete(watcher);
398
+ agentWatchers.add(watcher);
399
+ watcher(value);
400
+ }
401
+ }
355
402
  }
356
403
  function agents() {
357
- return [...agentNames]
358
- .filter(([identity]) => !retiredAgents.has(identity))
359
- .map(([identity, name]) => ({ identity, name }))
404
+ const named = new Map();
405
+ for (const agent of listedAgents ?? [])
406
+ named.set(agent.agent, agent);
407
+ for (const entry of listing.values()) {
408
+ named.set(entry.agent, { name: entry.agentName, retired: entry.agentRetired });
409
+ }
410
+ return [...named]
411
+ .filter(([, agent]) => !agent.retired)
412
+ .map(([identity, agent]) => ({ identity, name: agent.name }))
360
413
  .sort((left, right) => left.name === right.name
361
414
  ? left.identity.localeCompare(right.identity)
362
415
  : left.name.localeCompare(right.name));
363
416
  }
417
+ function readAgents() {
418
+ const stream = deps.stream();
419
+ if (stream?.agents === undefined || !deps.online() || agentsReading)
420
+ return;
421
+ agentsReading = true;
422
+ void stream
423
+ .agents()
424
+ .then((read) => {
425
+ if (read === null)
426
+ return;
427
+ listedAgents = read;
428
+ emitAgents();
429
+ }, () => { })
430
+ .finally(() => {
431
+ agentsReading = false;
432
+ });
433
+ }
364
434
  function emitAgents() {
365
435
  if (deps.closed() || agentWatchers.size === 0)
366
436
  return;
367
437
  const value = agents();
438
+ const shown = JSON.stringify(value);
439
+ if (shown === agentsShown)
440
+ return;
441
+ agentsShown = shown;
368
442
  for (const watcher of agentWatchers)
369
443
  watcher(value);
370
444
  }
@@ -380,55 +454,11 @@ export function createConversationStore(deps) {
380
454
  if (stateOf(conversation) !== before || next?.turn?.started !== began)
381
455
  emitList();
382
456
  }
383
- async function readAgents() {
384
- const declaration = deps.agents();
385
- if (declaration === undefined)
386
- return;
387
- const names = new Map();
388
- const retired = new Set();
389
- let covered = null;
390
- for (let after;;) {
391
- const read = await deps.documents(declaration, after);
392
- if ('pending' in read)
393
- return;
394
- const coverage = JSON.stringify(read.coverage);
395
- if (covered !== null && coverage !== covered)
396
- return readAgents();
397
- covered = coverage;
398
- for (const document of read.documents) {
399
- const identity = document.fields?.[declaration.identity];
400
- const name = document.fields?.[declaration.name];
401
- if (typeof identity !== 'string' || typeof name !== 'string')
402
- continue;
403
- names.set(identity, name);
404
- const ended = declaration.retired === undefined ? null : document.fields?.[declaration.retired];
405
- if (ended !== undefined && ended !== null)
406
- retired.add(identity);
407
- }
408
- if (read.next === undefined)
409
- break;
410
- after = read.next;
411
- }
412
- const named = JSON.stringify([...names]) !== JSON.stringify([...agentNames]);
413
- if (!named && JSON.stringify([...retired]) === JSON.stringify([...retiredAgents]))
414
- return;
415
- agentNames = names;
416
- retiredAgents = retired;
417
- if (named)
418
- emitList();
419
- emitAgents();
420
- const ended = [...drafts.keys()].filter(retiredChat);
421
- if (ended.length > 0)
422
- await remove(ended);
423
- }
424
457
  function retiredChat(conversation) {
425
- return (conversation.startsWith(NEW_CHAT) && retiredAgents.has(conversation.slice(NEW_CHAT.length)));
426
- }
427
- function agentsReady() {
428
- agentsRead ??= readAgents().catch(() => {
429
- agentsRead = null;
430
- });
431
- return agentsRead;
458
+ if (!conversation.startsWith(NEW_CHAT))
459
+ return false;
460
+ const agent = conversation.slice(NEW_CHAT.length);
461
+ return [...listing.values()].some((entry) => entry.agent === agent && entry.agentRetired);
432
462
  }
433
463
  function live(conversation, change) {
434
464
  const owed = unsent.get(conversation);
@@ -485,12 +515,6 @@ export function createConversationStore(deps) {
485
515
  }
486
516
  async function remove(leaving) {
487
517
  await deps.durably(async (local) => {
488
- const removed = [];
489
- for (const conversation of leaving) {
490
- for (const identity of await local.messageIdentities(conversation)) {
491
- removed.push({ conversation, identity, text: null });
492
- }
493
- }
494
518
  await local.dropConversations(leaving);
495
519
  const changed = [];
496
520
  for (const conversation of leaving) {
@@ -507,9 +531,23 @@ export function createConversationStore(deps) {
507
531
  await slide(local, conversation, null);
508
532
  }
509
533
  if (changed.length > 0)
510
- deps.publish(conversationChangeSet(removed, changed));
534
+ deps.publish(conversationChangeSet(changed));
511
535
  });
512
536
  }
537
+ function missed(conversation) {
538
+ const read = reads.get(conversation);
539
+ const newest = listing.get(conversation)?.newest;
540
+ return (read === undefined ||
541
+ newest === undefined ||
542
+ partials.has(conversation) ||
543
+ (newest !== null && (read === null || newest > read)));
544
+ }
545
+ function noted(conversation, message) {
546
+ const entry = listing.get(conversation);
547
+ if (entry === undefined || (entry.newest !== null && entry.newest >= message.position))
548
+ return;
549
+ listing.set(conversation, { ...entry, newest: message.position });
550
+ }
513
551
  function gap(conversation) {
514
552
  gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);
515
553
  behind.add(conversation);
@@ -533,16 +571,17 @@ export function createConversationStore(deps) {
533
571
  reads.set(conversation, message.position);
534
572
  sealTurns(conversation, new Set([message.turn]));
535
573
  await slide(local, conversation, [message]);
536
- deps.publish(conversationChangeSet(changesOf(conversation, [message]), [conversation]));
574
+ deps.publish(conversationChangeSet([conversation]));
537
575
  });
538
576
  }
539
577
  async function readHistories(conversations, ended) {
540
578
  const generations = new Map(conversations.map((one) => [one, gaps.get(one) ?? 0]));
541
- let asking = conversations.map((conversation) => ({
579
+ let waiting = conversations.map((conversation) => ({
542
580
  conversation,
543
581
  after: reads.get(conversation) ?? undefined,
544
582
  }));
545
- while (asking.length > 0) {
583
+ while (waiting.length > 0) {
584
+ const asking = waiting.slice(0, HISTORY_CONVERSATIONS);
546
585
  const result = await deps.call('conversation.history', {
547
586
  conversations: asking.map(({ conversation, after }) => ({
548
587
  conversation,
@@ -566,7 +605,7 @@ export function createConversationStore(deps) {
566
605
  if (!following.some((next) => next.conversation === conversation))
567
606
  ended(conversation);
568
607
  }
569
- asking = following;
608
+ waiting = [...waiting.slice(HISTORY_CONVERSATIONS), ...following];
570
609
  }
571
610
  return null;
572
611
  }
@@ -609,7 +648,7 @@ export function createConversationStore(deps) {
609
648
  behind.delete(conversation);
610
649
  await slide(local, conversation, arriving);
611
650
  if (arriving.length > 0 || sealing || whole) {
612
- deps.publish(conversationChangeSet(changesOf(conversation, arriving), [conversation]));
651
+ deps.publish(conversationChangeSet([conversation]));
613
652
  }
614
653
  });
615
654
  }
@@ -657,8 +696,16 @@ export function createConversationStore(deps) {
657
696
  const arriving = acceptedMessage(event.message);
658
697
  if (arriving === null)
659
698
  return;
699
+ noted(conversation, arriving);
660
700
  if (replicated.has(conversation)) {
661
- void keep(conversation, arriving).catch(() => { });
701
+ if (deps.full()) {
702
+ gap(conversation);
703
+ return;
704
+ }
705
+ void keep(conversation, arriving).catch((error) => {
706
+ if (refusedForSpace(error))
707
+ gap(conversation);
708
+ });
662
709
  return;
663
710
  }
664
711
  if (sealTurns(conversation, new Set([arriving.turn])))
@@ -702,7 +749,7 @@ export function createConversationStore(deps) {
702
749
  drafts.set(from, left);
703
750
  for (const one of taken)
704
751
  drafts.set(to, one);
705
- deps.publish(conversationChangeSet([], [from, to]));
752
+ deps.publish(conversationChangeSet([from, to]));
706
753
  });
707
754
  }
708
755
  function withDraft(conversation, next) {
@@ -711,7 +758,7 @@ export function createConversationStore(deps) {
711
758
  if (following === undefined)
712
759
  return;
713
760
  await kept(local, conversation, following);
714
- deps.publish(conversationChangeSet([], [conversation]));
761
+ deps.publish(conversationChangeSet([conversation]));
715
762
  });
716
763
  }
717
764
  async function submitted(conversation, operation, draft) {
@@ -743,13 +790,14 @@ export function createConversationStore(deps) {
743
790
  });
744
791
  }
745
792
  async function dispatched(conversation, submission) {
746
- const dispatch = {};
793
+ const dispatch = { answered: false };
747
794
  sending.set(submission.operation, dispatch);
748
795
  try {
749
796
  const result = await invoke('conversation.send', conversation, {
750
797
  text: submission.text,
751
798
  operation_id: submission.operation,
752
799
  });
800
+ dispatch.answered = result.kind !== 'transport-uncertainty';
753
801
  if (result.kind === 'revoked-authorization')
754
802
  return result;
755
803
  if (result.kind !== 'action' && result.retryable) {
@@ -780,9 +828,16 @@ export function createConversationStore(deps) {
780
828
  return deps.call(name, { conversation, ...extra });
781
829
  }
782
830
  const surface = {
783
- async list() {
784
- await agentsReady();
785
- return entries();
831
+ list() {
832
+ return new Promise((settle) => {
833
+ const answer = (listed) => {
834
+ unlisted.delete(answer);
835
+ listWatchers.delete(answer);
836
+ settle(listed);
837
+ };
838
+ unlisted.add(answer);
839
+ learned();
840
+ });
786
841
  },
787
842
  async read(conversation, options = {}) {
788
843
  const asked = askedOf(options);
@@ -805,8 +860,17 @@ export function createConversationStore(deps) {
805
860
  return result;
806
861
  },
807
862
  async send(conversation, operation = changeBatchIdentity(), draft) {
863
+ if (deps.full())
864
+ return DURABLE_WRITE;
808
865
  if (deps.online()) {
809
- const { submission, earlier } = await submitted(conversation, operation, draft);
866
+ const held = await submitted(conversation, operation, draft).catch((error) => {
867
+ if (refusedForSpace(error))
868
+ return null;
869
+ throw error;
870
+ });
871
+ if (held === null)
872
+ return DURABLE_WRITE;
873
+ const { submission, earlier } = held;
810
874
  if (!earlier || !deps.expired(operation))
811
875
  return dispatched(conversation, submission);
812
876
  await forgotten(conversation, submission);
@@ -819,15 +883,6 @@ export function createConversationStore(deps) {
819
883
  }
820
884
  return OFFLINE;
821
885
  },
822
- async attach(room, file) {
823
- if (!deps.online())
824
- return OFFLINE;
825
- return deps.call('conversation.attach', {
826
- room,
827
- ...(await declaredFile(file)),
828
- blob: file.blob,
829
- });
830
- },
831
886
  answer(conversation, answer) {
832
887
  return invoke('conversation.answer', conversation, { answer });
833
888
  },
@@ -879,7 +934,13 @@ export function createConversationStore(deps) {
879
934
  return {
880
935
  surface,
881
936
  chatDraft,
882
- hydrate(held, kept) {
937
+ hydrate(held, kept, list) {
938
+ if (list !== null && !listKnown) {
939
+ listing.clear();
940
+ for (const entry of list)
941
+ listing.set(entry.conversation, { ...entry });
942
+ listHeld = true;
943
+ }
883
944
  stored.clear();
884
945
  reads.clear();
885
946
  partials.clear();
@@ -893,6 +954,8 @@ export function createConversationStore(deps) {
893
954
  drafts.clear();
894
955
  for (const record of kept)
895
956
  drafts.set(record.conversation, record);
957
+ if (listHeld)
958
+ learned();
896
959
  },
897
960
  async reconcile() {
898
961
  if (!listKnown)
@@ -904,7 +967,7 @@ export function createConversationStore(deps) {
904
967
  !creations.has(conversation) &&
905
968
  (!conversation.startsWith(NEW_CHAT) || retiredChat(conversation)));
906
969
  for (const conversation of named) {
907
- if (!replicated.has(conversation))
970
+ if (!replicated.has(conversation) && missed(conversation))
908
971
  behind.add(conversation);
909
972
  }
910
973
  replicated = named;
@@ -913,6 +976,11 @@ export function createConversationStore(deps) {
913
976
  await remove(leaving);
914
977
  },
915
978
  async catchUp(progress) {
979
+ if (deps.full()) {
980
+ if (behind.size > 0)
981
+ progress.complete = false;
982
+ return;
983
+ }
916
984
  const owed = (conversation) => behind.has(conversation) && replicated.has(conversation);
917
985
  const read = async (conversations) => {
918
986
  if (conversations.length === 0 || deps.closed())
@@ -961,12 +1029,10 @@ export function createConversationStore(deps) {
961
1029
  known() {
962
1030
  return listKnown;
963
1031
  },
964
- reconnected() {
965
- for (const conversation of replicated)
966
- gap(conversation);
967
- },
968
1032
  reopened() {
969
- sending.clear();
1033
+ for (const [operation, dispatch] of sending)
1034
+ if (!dispatch.answered)
1035
+ sending.delete(operation);
970
1036
  },
971
1037
  lost() {
972
1038
  catching.clear();
@@ -985,15 +1051,15 @@ export function createConversationStore(deps) {
985
1051
  views.set(key, view);
986
1052
  const watcher = { notify: deliver, ready: false };
987
1053
  view.watchers.add(watcher);
988
- void deps
989
- .durably(async (local) => {
1054
+ const reading = new AbortController();
1055
+ void untilAnswered(() => deps.durably(async (local) => {
990
1056
  if (view.window !== null)
991
1057
  return;
992
1058
  const { messages, more } = await local.messageWindow(conversation, asked.limit, asked.before);
993
1059
  view.window = messages;
994
1060
  view.more = more;
995
1061
  view.total = asked.total ? await local.messageCount(conversation) : null;
996
- })
1062
+ }), reading.signal)
997
1063
  .then(() => {
998
1064
  if (deps.closed() || !view.watchers.has(watcher))
999
1065
  return;
@@ -1003,6 +1069,7 @@ export function createConversationStore(deps) {
1003
1069
  })
1004
1070
  .catch(() => { });
1005
1071
  return () => {
1072
+ reading.abort();
1006
1073
  if (!view.watchers.delete(watcher))
1007
1074
  return;
1008
1075
  if (view.watchers.size === 0)
@@ -1010,35 +1077,26 @@ export function createConversationStore(deps) {
1010
1077
  };
1011
1078
  },
1012
1079
  watchList(deliver) {
1013
- listWatchers.add(deliver);
1014
- void agentsReady().then(() => {
1015
- if (!deps.closed() && listWatchers.has(deliver))
1016
- deliver(entries());
1017
- });
1080
+ unlisted.add(deliver);
1081
+ learned();
1018
1082
  return () => {
1083
+ unlisted.delete(deliver);
1019
1084
  listWatchers.delete(deliver);
1020
1085
  };
1021
1086
  },
1022
1087
  watchAgents(deliver) {
1023
- agentWatchers.add(deliver);
1024
- void agentsReady().then(() => {
1025
- if (!deps.closed() && agentWatchers.has(deliver))
1026
- deliver(agents());
1027
- });
1088
+ unnamed.add(deliver);
1089
+ learned();
1090
+ readAgents();
1028
1091
  return () => {
1092
+ unnamed.delete(deliver);
1029
1093
  agentWatchers.delete(deliver);
1030
1094
  };
1031
1095
  },
1096
+ learned,
1032
1097
  changed(set) {
1033
1098
  for (const conversation of set.conversations)
1034
1099
  emit(conversation);
1035
- const declaration = deps.agents();
1036
- if (declaration !== undefined &&
1037
- set.documents.some((change) => change.locator === declaration.locator)) {
1038
- agentsRead = readAgents().catch(() => {
1039
- agentsRead = null;
1040
- });
1041
- }
1042
1100
  },
1043
1101
  receive(event) {
1044
1102
  if (deps.closed())
@@ -1051,6 +1109,14 @@ export function createConversationStore(deps) {
1051
1109
  creations.delete(entry.conversation);
1052
1110
  }
1053
1111
  listKnown = true;
1112
+ for (const conversation of replicated) {
1113
+ if (!listing.has(conversation))
1114
+ continue;
1115
+ if (!missed(conversation))
1116
+ behind.delete(conversation);
1117
+ else if (!behind.has(conversation))
1118
+ gap(conversation);
1119
+ }
1054
1120
  openingEnded();
1055
1121
  }
1056
1122
  else if (event.kind === 'listed') {
@@ -1060,11 +1126,13 @@ export function createConversationStore(deps) {
1060
1126
  else {
1061
1127
  listing.delete(event.conversation);
1062
1128
  }
1129
+ keepList();
1063
1130
  emitList();
1064
- return (event.kind !== 'list' &&
1131
+ return ((event.kind !== 'list' &&
1065
1132
  listKnown &&
1066
1133
  (listing.size !== replicated.size ||
1067
- [...listing.keys()].some((conversation) => !replicated.has(conversation))));
1134
+ [...listing.keys()].some((conversation) => !replicated.has(conversation)))) ||
1135
+ (listKnown && [...drafts.keys()].some(retiredChat)));
1068
1136
  }
1069
1137
  heard(event);
1070
1138
  return false;
@@ -1080,7 +1148,9 @@ export function createConversationStore(deps) {
1080
1148
  lives.clear();
1081
1149
  unsent.clear();
1082
1150
  listWatchers.clear();
1151
+ unlisted.clear();
1083
1152
  agentWatchers.clear();
1153
+ unnamed.clear();
1084
1154
  },
1085
1155
  };
1086
1156
  }