@agentshouse/mdruntime 0.1.0-c3903a68dcbbf → 0.1.0-c56daf494ecb4

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 (178) hide show
  1. package/AGENTS.md +184 -92
  2. package/README.md +22 -12
  3. package/dist/adapter.d.ts +125 -63
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/adapter.js +1 -9
  6. package/dist/attached-model.d.ts +11 -0
  7. package/dist/attached-model.d.ts.map +1 -0
  8. package/dist/attached-model.js +47 -0
  9. package/dist/attempt.d.ts +16 -0
  10. package/dist/attempt.d.ts.map +1 -0
  11. package/dist/attempt.js +70 -0
  12. package/dist/binary.d.ts +23 -0
  13. package/dist/binary.d.ts.map +1 -0
  14. package/dist/binary.js +8 -0
  15. package/dist/bootstrap.d.ts +20 -6
  16. package/dist/bootstrap.d.ts.map +1 -1
  17. package/dist/bootstrap.js +93 -39
  18. package/dist/change-set.d.ts.map +1 -1
  19. package/dist/change-set.js +20 -17
  20. package/dist/change.d.ts +15 -0
  21. package/dist/change.d.ts.map +1 -1
  22. package/dist/change.js +26 -1
  23. package/dist/chat/acts.d.ts +34 -0
  24. package/dist/chat/acts.d.ts.map +1 -0
  25. package/dist/chat/acts.js +36 -0
  26. package/dist/chat/context.d.ts +3 -0
  27. package/dist/chat/context.d.ts.map +1 -0
  28. package/dist/chat/context.js +10 -0
  29. package/dist/chat/input.d.ts +9 -0
  30. package/dist/chat/input.d.ts.map +1 -0
  31. package/dist/chat/input.js +99 -0
  32. package/dist/chat/kit.d.ts +60 -0
  33. package/dist/chat/kit.d.ts.map +1 -0
  34. package/dist/chat/kit.js +123 -0
  35. package/dist/chat/lasting.d.ts +6 -0
  36. package/dist/chat/lasting.d.ts.map +1 -0
  37. package/dist/chat/lasting.js +19 -0
  38. package/dist/chat/list.d.ts +26 -0
  39. package/dist/chat/list.d.ts.map +1 -0
  40. package/dist/chat/list.js +62 -0
  41. package/dist/chat/markdown.d.ts +20 -0
  42. package/dist/chat/markdown.d.ts.map +1 -0
  43. package/dist/chat/markdown.js +188 -0
  44. package/dist/chat/message.d.ts +6 -0
  45. package/dist/chat/message.d.ts.map +1 -0
  46. package/dist/chat/message.js +192 -0
  47. package/dist/chat/messages.d.ts +21 -0
  48. package/dist/chat/messages.d.ts.map +1 -0
  49. package/dist/chat/messages.js +151 -0
  50. package/dist/chat/name.d.ts +6 -0
  51. package/dist/chat/name.d.ts.map +1 -0
  52. package/dist/chat/name.js +37 -0
  53. package/dist/chat/opened.d.ts +11 -0
  54. package/dist/chat/opened.d.ts.map +1 -0
  55. package/dist/chat/opened.js +17 -0
  56. package/dist/chat/overlay.d.ts +31 -0
  57. package/dist/chat/overlay.d.ts.map +1 -0
  58. package/dist/chat/overlay.js +97 -0
  59. package/dist/chat/parts.d.ts +57 -0
  60. package/dist/chat/parts.d.ts.map +1 -0
  61. package/dist/chat/parts.js +119 -0
  62. package/dist/chat/process.d.ts +20 -0
  63. package/dist/chat/process.d.ts.map +1 -0
  64. package/dist/chat/process.js +32 -0
  65. package/dist/chat/provider.d.ts +63 -0
  66. package/dist/chat/provider.d.ts.map +1 -0
  67. package/dist/chat/provider.js +645 -0
  68. package/dist/chat/question.d.ts +9 -0
  69. package/dist/chat/question.d.ts.map +1 -0
  70. package/dist/chat/question.js +80 -0
  71. package/dist/chat/questions.d.ts +31 -0
  72. package/dist/chat/questions.d.ts.map +1 -0
  73. package/dist/chat/questions.js +111 -0
  74. package/dist/chat/read.d.ts +5 -0
  75. package/dist/chat/read.d.ts.map +1 -0
  76. package/dist/chat/read.js +13 -0
  77. package/dist/chat/ready.d.ts +33 -0
  78. package/dist/chat/ready.d.ts.map +1 -0
  79. package/dist/chat/ready.js +91 -0
  80. package/dist/chat/style.d.ts +4 -0
  81. package/dist/chat/style.d.ts.map +1 -0
  82. package/dist/chat/style.js +302 -0
  83. package/dist/chat.d.ts +14 -0
  84. package/dist/chat.d.ts.map +1 -0
  85. package/dist/chat.js +8 -0
  86. package/dist/client.d.ts +17 -13
  87. package/dist/client.d.ts.map +1 -1
  88. package/dist/client.js +68 -31
  89. package/dist/collection.d.ts +6 -13
  90. package/dist/collection.d.ts.map +1 -1
  91. package/dist/collection.js +56 -29
  92. package/dist/connection.d.ts +28 -33
  93. package/dist/connection.d.ts.map +1 -1
  94. package/dist/connection.js +951 -745
  95. package/dist/conversation.d.ts +32 -13
  96. package/dist/conversation.d.ts.map +1 -1
  97. package/dist/conversation.js +293 -108
  98. package/dist/entry.d.ts +17 -0
  99. package/dist/entry.d.ts.map +1 -0
  100. package/dist/entry.js +156 -0
  101. package/dist/expectation.d.ts +21 -0
  102. package/dist/expectation.d.ts.map +1 -0
  103. package/dist/expectation.js +70 -0
  104. package/dist/failure.d.ts +13 -0
  105. package/dist/failure.d.ts.map +1 -0
  106. package/dist/failure.js +19 -0
  107. package/dist/host.d.ts +9 -3
  108. package/dist/host.d.ts.map +1 -1
  109. package/dist/host.js +49 -68
  110. package/dist/identity.d.ts +3 -0
  111. package/dist/identity.d.ts.map +1 -1
  112. package/dist/identity.js +13 -1
  113. package/dist/index.d.ts +9 -5
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.js +3 -1
  116. package/dist/memory.d.ts +14 -7
  117. package/dist/memory.d.ts.map +1 -1
  118. package/dist/memory.js +137 -46
  119. package/dist/model.d.ts +13 -12
  120. package/dist/model.d.ts.map +1 -1
  121. package/dist/model.js +6 -3
  122. package/dist/observation.d.ts +2 -0
  123. package/dist/observation.d.ts.map +1 -1
  124. package/dist/observation.js +24 -14
  125. package/dist/open.d.ts +2 -0
  126. package/dist/open.d.ts.map +1 -0
  127. package/dist/open.js +1 -0
  128. package/dist/outcome.d.ts +32 -23
  129. package/dist/outcome.d.ts.map +1 -1
  130. package/dist/outcome.js +41 -1
  131. package/dist/overlay.d.ts +14 -3
  132. package/dist/overlay.d.ts.map +1 -1
  133. package/dist/overlay.js +75 -37
  134. package/dist/paths.d.ts +0 -1
  135. package/dist/paths.d.ts.map +1 -1
  136. package/dist/paths.js +0 -16
  137. package/dist/query.d.ts +12 -3
  138. package/dist/query.d.ts.map +1 -1
  139. package/dist/query.js +78 -36
  140. package/dist/reach.d.ts +42 -0
  141. package/dist/reach.d.ts.map +1 -0
  142. package/dist/reach.js +294 -0
  143. package/dist/react.d.ts +41 -0
  144. package/dist/react.d.ts.map +1 -0
  145. package/dist/react.js +64 -0
  146. package/dist/read-side.d.ts +4 -0
  147. package/dist/read-side.d.ts.map +1 -1
  148. package/dist/read-side.js +125 -56
  149. package/dist/refresh.d.ts +12 -1
  150. package/dist/refresh.d.ts.map +1 -1
  151. package/dist/refresh.js +44 -36
  152. package/dist/replica.d.ts +9 -6
  153. package/dist/replica.d.ts.map +1 -1
  154. package/dist/replica.js +83 -68
  155. package/dist/room-draft.d.ts +29 -9
  156. package/dist/room-draft.d.ts.map +1 -1
  157. package/dist/room-draft.js +137 -26
  158. package/dist/rows.d.ts +7 -2
  159. package/dist/rows.d.ts.map +1 -1
  160. package/dist/rows.js +85 -40
  161. package/dist/save.d.ts +27 -3
  162. package/dist/save.d.ts.map +1 -1
  163. package/dist/save.js +435 -86
  164. package/dist/search.d.ts +3 -2
  165. package/dist/search.d.ts.map +1 -1
  166. package/dist/status.d.ts +2 -2
  167. package/dist/status.d.ts.map +1 -1
  168. package/dist/status.js +0 -8
  169. package/dist/store.d.ts +41 -25
  170. package/dist/store.d.ts.map +1 -1
  171. package/dist/store.js +315 -191
  172. package/dist/wire.d.ts +58 -19
  173. package/dist/wire.d.ts.map +1 -1
  174. package/dist/wire.js +65 -67
  175. package/package.json +31 -7
  176. package/dist/attachment.d.ts +0 -3
  177. package/dist/attachment.d.ts.map +0 -1
  178. package/dist/attachment.js +0 -8
@@ -1,19 +1,35 @@
1
- import type { ConversationAction, ConversationCards, ConversationEvent, ConversationMessage, ConversationStream, PlanStep, ProcessCommand, SessionOption, WorkingNote } from './adapter.js';
1
+ import type { ConversationAction, ConversationAgents, ConversationEvent, ConversationMessage, ConversationStream, ProcessCommand, SessionOption, TurnContext } from './adapter.js';
2
2
  import { type ChangeSet } from './change-set.js';
3
3
  import { type ChatDraftFile } from './file.js';
4
+ import type { Open } from './open.js';
4
5
  import type { CallResult } from './outcome.js';
5
- import type { DocumentResult, QueryDocument } from './query.js';
6
+ import type { DocumentResult } from './query.js';
6
7
  import type { SearchedMessage } from './search.js';
7
8
  import type { CycleProgress } from './status.js';
8
9
  import type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';
10
+ export type ConversationState = Open<'working' | 'asking' | 'idle'>;
9
11
  export type ConversationEntry = {
10
12
  conversation: string;
11
- card: Required<QueryDocument>;
12
- agent: Required<QueryDocument> | null;
13
+ agent: {
14
+ identity: string;
15
+ name: string | null;
16
+ };
17
+ name: string;
18
+ created: string;
19
+ finished: string | null;
20
+ outcome: string | null;
21
+ state: ConversationState;
22
+ started: string | null;
13
23
  };
14
- export type GrowingText = {
24
+ export type ConversationAgent = {
25
+ identity: string;
26
+ name: string;
27
+ };
28
+ export type RunningTurn = {
15
29
  turn: string;
16
- text: string;
30
+ started: string | null;
31
+ parts: readonly unknown[];
32
+ context: TurnContext | null;
17
33
  };
18
34
  export type ChatDraft = {
19
35
  text: string;
@@ -25,16 +41,16 @@ export type ConversationOptions = {
25
41
  export type ConversationView = {
26
42
  conversation: string;
27
43
  messages: readonly ConversationMessage[];
28
- growingText: GrowingText | null;
29
- workingNote: WorkingNote | null;
30
- plan: readonly PlanStep[] | null;
44
+ turn: RunningTurn | null;
31
45
  questions: readonly unknown[];
32
46
  process: {
33
47
  running: boolean;
34
48
  } | null;
35
49
  commands: readonly ProcessCommand[];
36
50
  options: readonly SessionOption[];
37
- chatDraft: ChatDraft | null;
51
+ chatDraft: (ChatDraft & {
52
+ readonly revision: string;
53
+ }) | null;
38
54
  };
39
55
  export type ConversationSurface = {
40
56
  list(): Promise<readonly ConversationEntry[]>;
@@ -48,11 +64,11 @@ export type ConversationSurface = {
48
64
  delete(conversation: string): Promise<CallResult>;
49
65
  };
50
66
  export type ChatDraftSurface = {
51
- write(conversation: string, draft: ChatDraft): Promise<void>;
67
+ write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
52
68
  discard(conversation: string): Promise<void>;
53
69
  };
54
70
  export type ConversationDependencies = {
55
- cards(): ConversationCards | undefined;
71
+ agents(): ConversationAgents | undefined;
56
72
  documents(locator: string): Promise<DocumentResult>;
57
73
  call(name: ConversationAction, input: unknown): Promise<CallResult>;
58
74
  durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;
@@ -69,11 +85,14 @@ export type ConversationStore = {
69
85
  current(): boolean;
70
86
  reconnected(): void;
71
87
  watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
88
+ watchList(deliver: (entries: readonly ConversationEntry[]) => void): () => void;
89
+ watchAgents(deliver: (agents: readonly ConversationAgent[]) => void): () => void;
72
90
  changed(set: ChangeSet): void;
73
- receive(event: ConversationEvent): void;
91
+ receive(event: ConversationEvent): boolean;
74
92
  messages(): readonly SearchedMessage[];
75
93
  message(conversation: string, identity: string): SearchedMessage | null;
76
94
  close(): void;
77
95
  };
96
+ export declare function unheldView(conversation: string): ConversationView;
78
97
  export declare function createConversationStore(deps: ConversationDependencies): ConversationStore;
79
98
  //# 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,14 +1,75 @@
1
1
  import { conversationChangeSet } from './change-set.js';
2
+ import { runtimeError } from './failure.js';
2
3
  import { declaredFile } from './file.js';
4
+ import { chatDraftRevision } from './identity.js';
3
5
  const QUIET = {
4
- growingText: null,
5
- plan: null,
6
- workingNote: null,
6
+ turn: null,
7
7
  questions: [],
8
8
  process: null,
9
9
  commands: [],
10
10
  options: [],
11
11
  };
12
+ export function unheldView(conversation) {
13
+ return {
14
+ conversation,
15
+ messages: [],
16
+ turn: null,
17
+ questions: [],
18
+ process: null,
19
+ commands: [],
20
+ options: [],
21
+ chatDraft: null,
22
+ };
23
+ }
24
+ function startedTurn(turn, operation) {
25
+ if (operation.op === 'begin')
26
+ return { turn, started: operation.at, parts: [], context: null };
27
+ if (operation.op === 'context') {
28
+ return {
29
+ turn,
30
+ started: null,
31
+ parts: [],
32
+ context: { used: operation.used, window: operation.window },
33
+ };
34
+ }
35
+ return operation.op === 'start' && operation.index === 0
36
+ ? { turn, started: null, parts: [structuredClone(operation.part)], context: null }
37
+ : null;
38
+ }
39
+ function changedFields(part, operation) {
40
+ if (operation.op === 'append') {
41
+ return { text: `${String(part.text ?? '')}${operation.text}` };
42
+ }
43
+ if (operation.op === 'status') {
44
+ return { status: operation.status, result: structuredClone(operation.result) };
45
+ }
46
+ if (operation.op === 'count')
47
+ return { count: operation.count };
48
+ return { entries: structuredClone(operation.entries) };
49
+ }
50
+ function appliedTurn(held, operation) {
51
+ if (operation.op === 'begin')
52
+ return { ...held, started: operation.at };
53
+ if (operation.op === 'context') {
54
+ return { ...held, context: { used: operation.used, window: operation.window } };
55
+ }
56
+ if (operation.op === 'start') {
57
+ if (operation.index !== 0 && operation.index !== held.parts.length)
58
+ return null;
59
+ return {
60
+ ...held,
61
+ parts: [...held.parts.slice(0, operation.index), structuredClone(operation.part)],
62
+ };
63
+ }
64
+ const part = held.parts[operation.index];
65
+ if (typeof part !== 'object' || part === null)
66
+ return null;
67
+ const changed = { ...part, ...changedFields(part, operation) };
68
+ return {
69
+ ...held,
70
+ parts: held.parts.map((kept, at) => (at === operation.index ? changed : kept)),
71
+ };
72
+ }
12
73
  function ordered(left, right) {
13
74
  if (left.position !== right.position)
14
75
  return left.position < right.position ? -1 : 1;
@@ -93,7 +154,7 @@ function limitOf(options) {
93
154
  if (limit === undefined)
94
155
  return undefined;
95
156
  if (!Number.isInteger(limit) || limit < 0) {
96
- throw new Error(`conversation limit must be a non-negative integer, got ${String(limit)}`);
157
+ throw runtimeError('invalid-limit', `conversation limit must be a non-negative integer, got ${String(limit)}`);
97
158
  }
98
159
  return limit;
99
160
  }
@@ -106,63 +167,162 @@ export function createConversationStore(deps) {
106
167
  const gaps = new Map();
107
168
  const lives = new Map();
108
169
  const views = new Map();
170
+ const listing = new Map();
171
+ const listWatchers = new Set();
172
+ let listKnown = false;
173
+ const agentWatchers = new Set();
174
+ let agentNames = new Map();
175
+ let retiredAgents = new Set();
176
+ let agentsRead = null;
109
177
  let replicated = new Set();
110
178
  let handedReplicated;
111
179
  function liveOf(conversation) {
112
180
  return lives.get(conversation) ?? QUIET;
113
181
  }
114
- function viewOf(conversation, limit) {
182
+ function shownMessages(conversation, limit) {
115
183
  const held = messages.get(conversation) ?? [];
116
184
  const shown = limit === undefined ? held : held.slice(Math.max(0, held.length - limit));
185
+ return shown.map(({ identity, turn, text, message }) => ({
186
+ identity,
187
+ turn,
188
+ text,
189
+ message: structuredClone(message),
190
+ }));
191
+ }
192
+ function viewOf(conversation, limit, shown = shownMessages(conversation, limit)) {
117
193
  const draft = drafts.get(conversation);
118
194
  const facts = liveOf(conversation);
119
195
  return {
120
196
  conversation,
121
- messages: shown.map(({ identity, turn, text, message }) => ({
122
- identity,
123
- turn,
124
- text,
125
- message: structuredClone(message),
126
- })),
127
- growingText: facts.growingText === null ? null : { ...facts.growingText },
128
- workingNote: facts.workingNote === null ? null : { ...facts.workingNote },
129
- plan: structuredClone(facts.plan?.plan ?? null),
197
+ messages: shown,
198
+ turn: structuredClone(facts.turn),
130
199
  questions: structuredClone(facts.questions),
131
200
  process: facts.process === null ? null : { ...facts.process },
132
201
  commands: structuredClone(facts.commands),
133
202
  options: structuredClone(facts.options),
134
203
  chatDraft: draft === undefined || draft.turn !== null || sending.get(conversation)?.draft === draft
135
204
  ? null
136
- : { text: draft.text, files: [...draft.files] },
205
+ : { text: draft.text, files: [...draft.files], revision: draft.revision },
137
206
  };
138
207
  }
139
- function emit(conversation) {
208
+ function emit(conversation, messagesChanged = true) {
140
209
  if (deps.closed())
141
210
  return;
142
211
  for (const view of views.values()) {
143
212
  if (view.conversation !== conversation)
144
213
  continue;
214
+ if (messagesChanged)
215
+ view.messages = null;
145
216
  const ready = [...view.watchers].filter((watcher) => watcher.ready);
146
217
  if (ready.length === 0)
147
218
  continue;
148
- const value = viewOf(conversation, view.limit);
219
+ view.messages ??= shownMessages(conversation, view.limit);
220
+ const value = viewOf(conversation, view.limit, view.messages);
149
221
  for (const watcher of ready)
150
222
  watcher.notify(value);
151
223
  }
152
224
  }
225
+ function stateOf(conversation) {
226
+ const facts = liveOf(conversation);
227
+ if (facts.questions.length > 0)
228
+ return 'asking';
229
+ return facts.turn === null ? 'idle' : 'working';
230
+ }
231
+ function entries() {
232
+ return [...listing.values()].map((entry) => ({
233
+ conversation: entry.conversation,
234
+ agent: { identity: entry.agent, name: agentNames.get(entry.agent) ?? null },
235
+ name: entry.name,
236
+ created: entry.created,
237
+ finished: entry.finished,
238
+ outcome: entry.outcome,
239
+ state: stateOf(entry.conversation),
240
+ started: lives.get(entry.conversation)?.turn?.started ?? null,
241
+ }));
242
+ }
243
+ function emitList() {
244
+ if (deps.closed() || listWatchers.size === 0)
245
+ return;
246
+ const value = entries();
247
+ for (const watcher of listWatchers)
248
+ watcher(value);
249
+ }
250
+ function agents() {
251
+ return [...agentNames]
252
+ .filter(([identity]) => !retiredAgents.has(identity))
253
+ .map(([identity, name]) => ({ identity, name }))
254
+ .sort((left, right) => left.name === right.name
255
+ ? left.identity.localeCompare(right.identity)
256
+ : left.name.localeCompare(right.name));
257
+ }
258
+ function emitAgents() {
259
+ if (deps.closed() || agentWatchers.size === 0)
260
+ return;
261
+ const value = agents();
262
+ for (const watcher of agentWatchers)
263
+ watcher(value);
264
+ }
265
+ function setLive(conversation, next) {
266
+ const before = stateOf(conversation);
267
+ const began = lives.get(conversation)?.turn?.started;
268
+ if (next === null)
269
+ lives.delete(conversation);
270
+ else
271
+ lives.set(conversation, next);
272
+ if (!listing.has(conversation))
273
+ return;
274
+ if (stateOf(conversation) !== before || next?.turn?.started !== began)
275
+ emitList();
276
+ }
277
+ async function readAgents() {
278
+ const declaration = deps.agents();
279
+ if (declaration === undefined)
280
+ return;
281
+ const { documents } = await deps.documents(declaration.locator);
282
+ const names = new Map();
283
+ const retired = new Set();
284
+ for (const document of documents) {
285
+ if (document.type !== declaration.type)
286
+ continue;
287
+ const identity = document.fields?.[declaration.identity];
288
+ const name = document.fields?.[declaration.name];
289
+ if (typeof identity !== 'string' || typeof name !== 'string')
290
+ continue;
291
+ names.set(identity, name);
292
+ const ended = declaration.retired === undefined ? null : document.fields?.[declaration.retired];
293
+ if (ended !== undefined && ended !== null)
294
+ retired.add(identity);
295
+ }
296
+ const named = JSON.stringify([...names]) !== JSON.stringify([...agentNames]);
297
+ if (!named && JSON.stringify([...retired]) === JSON.stringify([...retiredAgents]))
298
+ return;
299
+ agentNames = names;
300
+ retiredAgents = retired;
301
+ if (named)
302
+ emitList();
303
+ emitAgents();
304
+ }
305
+ function agentsReady() {
306
+ agentsRead ??= readAgents().catch(() => {
307
+ agentsRead = null;
308
+ });
309
+ return agentsRead;
310
+ }
153
311
  function live(conversation, change) {
154
- lives.set(conversation, { ...liveOf(conversation), ...change });
155
- emit(conversation);
312
+ setLive(conversation, { ...liveOf(conversation), ...change });
313
+ emit(conversation, false);
314
+ }
315
+ function relayed(conversation, turn, operation) {
316
+ const held = liveOf(conversation).turn;
317
+ const next = held?.turn === turn ? appliedTurn(held, operation) : startedTurn(turn, operation);
318
+ if (next !== null)
319
+ live(conversation, { turn: next });
156
320
  }
157
321
  function sealTurns(conversation, turns) {
158
322
  const held = lives.get(conversation);
159
- if (held === undefined)
160
- return false;
161
- const growingText = held.growingText !== null && turns.has(held.growingText.turn) ? null : held.growingText;
162
- const plan = held.plan !== null && turns.has(held.plan.turn) ? null : held.plan;
163
- if (growingText === held.growingText && plan === held.plan)
323
+ if (held?.turn == null || !turns.has(held.turn.turn))
164
324
  return false;
165
- lives.set(conversation, { ...held, growingText, plan });
325
+ setLive(conversation, { ...held, turn: null });
166
326
  return true;
167
327
  }
168
328
  function handReplicated() {
@@ -176,27 +336,6 @@ export function createConversationStore(deps) {
176
336
  handedReplicated = named;
177
337
  stream.replicate(held);
178
338
  }
179
- async function documented() {
180
- const declaration = deps.cards();
181
- if (declaration === undefined)
182
- return [];
183
- const { documents } = await deps.documents(declaration.locator);
184
- return documents.filter((document) => typeof document.type === 'string');
185
- }
186
- function carded(documents) {
187
- const declaration = deps.cards();
188
- if (declaration === undefined)
189
- return [];
190
- const cards = [];
191
- for (const card of documents) {
192
- if (card.type !== declaration.type)
193
- continue;
194
- const identity = card.fields[declaration.identity];
195
- if (typeof identity === 'string')
196
- cards.push({ conversation: identity, card });
197
- }
198
- return cards;
199
- }
200
339
  async function remove(leaving) {
201
340
  await deps.durably(async (local) => {
202
341
  await local.dropConversations(leaving);
@@ -213,7 +352,7 @@ export function createConversationStore(deps) {
213
352
  reads.delete(conversation);
214
353
  drafts.delete(conversation);
215
354
  behind.delete(conversation);
216
- lives.delete(conversation);
355
+ setLive(conversation, null);
217
356
  }
218
357
  if (changed.length > 0)
219
358
  deps.publish(conversationChangeSet(removed, changed));
@@ -309,6 +448,48 @@ export function createConversationStore(deps) {
309
448
  }
310
449
  });
311
450
  }
451
+ function heard(event) {
452
+ const { conversation } = event;
453
+ if (event.kind === 'gap') {
454
+ if (replicated.has(conversation))
455
+ gap(conversation);
456
+ const held = lives.get(conversation);
457
+ if (held === undefined)
458
+ return;
459
+ setLive(conversation, { ...QUIET, turn: held.turn });
460
+ emit(conversation, false);
461
+ return;
462
+ }
463
+ if (event.kind === 'turn') {
464
+ relayed(conversation, event.turn, event.operation);
465
+ return;
466
+ }
467
+ if (event.kind === 'questions') {
468
+ live(conversation, { questions: structuredClone(event.questions) });
469
+ return;
470
+ }
471
+ if (event.kind === 'process') {
472
+ live(conversation, { process: { running: event.running } });
473
+ return;
474
+ }
475
+ if (event.kind === 'commands') {
476
+ live(conversation, { commands: structuredClone(event.commands) });
477
+ return;
478
+ }
479
+ if (event.kind === 'options') {
480
+ live(conversation, { options: structuredClone(event.options) });
481
+ return;
482
+ }
483
+ const arriving = acceptedMessage(event.message);
484
+ if (arriving === null)
485
+ return;
486
+ if (replicated.has(conversation)) {
487
+ void keep(conversation, arriving).catch(() => { });
488
+ return;
489
+ }
490
+ if (sealTurns(conversation, new Set([arriving.turn])))
491
+ emit(conversation);
492
+ }
312
493
  function withDraft(conversation, next) {
313
494
  return deps.durably(async (local) => {
314
495
  const following = next(drafts.get(conversation));
@@ -330,17 +511,8 @@ export function createConversationStore(deps) {
330
511
  }
331
512
  const surface = {
332
513
  async list() {
333
- const declaration = deps.cards();
334
- if (declaration === undefined)
335
- return [];
336
- const documents = await documented();
337
- const entries = carded(documents).map(({ conversation, card }) => ({
338
- conversation,
339
- card,
340
- agent: documents.find((document) => document.backlinks.some((backlink) => backlink.path === card.path && backlink.field === declaration.agent)) ?? null,
341
- }));
342
- entries.sort((left, right) => (left.conversation < right.conversation ? -1 : 1));
343
- return entries;
514
+ await agentsReady();
515
+ return entries();
344
516
  },
345
517
  async read(conversation, options = {}) {
346
518
  const limit = limitOf(options);
@@ -406,12 +578,13 @@ export function createConversationStore(deps) {
406
578
  },
407
579
  };
408
580
  const chatDraft = {
409
- write(conversation, draft) {
581
+ write(conversation, draft, revision = chatDraftRevision()) {
410
582
  return withDraft(conversation, () => ({
411
583
  conversation,
412
584
  text: draft.text,
413
585
  files: [...draft.files],
414
586
  turn: null,
587
+ revision,
415
588
  }));
416
589
  },
417
590
  discard(conversation) {
@@ -424,6 +597,8 @@ export function createConversationStore(deps) {
424
597
  hydrate(held, stored) {
425
598
  messages.clear();
426
599
  reads.clear();
600
+ for (const view of views.values())
601
+ view.messages = null;
427
602
  for (const entry of held) {
428
603
  messages.set(entry.conversation, [...entry.messages].sort(ordered));
429
604
  if (entry.read !== undefined)
@@ -434,7 +609,9 @@ export function createConversationStore(deps) {
434
609
  drafts.set(record.conversation, record);
435
610
  },
436
611
  async reconcile() {
437
- const named = new Set(carded(await documented()).map((entry) => entry.conversation));
612
+ if (!listKnown)
613
+ return;
614
+ const named = new Set(listing.keys());
438
615
  const leaving = [
439
616
  ...new Set([...replicated, ...messages.keys(), ...reads.keys(), ...drafts.keys()]),
440
617
  ].filter((conversation) => !named.has(conversation));
@@ -467,7 +644,12 @@ export function createConversationStore(deps) {
467
644
  watch(conversation, options, deliver) {
468
645
  const limit = limitOf(options);
469
646
  const key = JSON.stringify([conversation, limit ?? null]);
470
- const view = views.get(key) ?? { conversation, limit, watchers: new Set() };
647
+ const view = views.get(key) ?? {
648
+ conversation,
649
+ limit,
650
+ watchers: new Set(),
651
+ messages: null,
652
+ };
471
653
  views.set(key, view);
472
654
  const watcher = { notify: deliver, ready: false };
473
655
  view.watchers.add(watcher);
@@ -487,60 +669,61 @@ export function createConversationStore(deps) {
487
669
  views.delete(key);
488
670
  };
489
671
  },
672
+ watchList(deliver) {
673
+ listWatchers.add(deliver);
674
+ void agentsReady().then(() => {
675
+ if (!deps.closed() && listWatchers.has(deliver))
676
+ deliver(entries());
677
+ });
678
+ return () => {
679
+ listWatchers.delete(deliver);
680
+ };
681
+ },
682
+ watchAgents(deliver) {
683
+ agentWatchers.add(deliver);
684
+ void agentsReady().then(() => {
685
+ if (!deps.closed() && agentWatchers.has(deliver))
686
+ deliver(agents());
687
+ });
688
+ return () => {
689
+ agentWatchers.delete(deliver);
690
+ };
691
+ },
490
692
  changed(set) {
491
693
  for (const conversation of set.conversations)
492
694
  emit(conversation);
695
+ const declaration = deps.agents();
696
+ if (declaration !== undefined &&
697
+ set.documents.some((change) => change.locator === declaration.locator)) {
698
+ agentsRead = readAgents().catch(() => {
699
+ agentsRead = null;
700
+ });
701
+ }
493
702
  },
494
703
  receive(event) {
495
704
  if (deps.closed())
496
- return;
497
- const { conversation } = event;
498
- if (event.kind === 'gap') {
499
- if (replicated.has(conversation))
500
- gap(conversation);
501
- if (lives.delete(conversation))
502
- emit(conversation);
503
- return;
504
- }
505
- if (event.kind === 'growing-text') {
506
- live(conversation, { growingText: { turn: event.turn, text: event.text } });
507
- return;
508
- }
509
- if (event.kind === 'plan') {
510
- live(conversation, { plan: { turn: event.turn, plan: structuredClone(event.plan) } });
511
- return;
512
- }
513
- if (event.kind === 'working-note') {
514
- live(conversation, {
515
- workingNote: event.note === null ? null : { noteId: event.note.noteId, text: event.note.text },
516
- });
517
- return;
518
- }
519
- if (event.kind === 'questions') {
520
- live(conversation, { questions: structuredClone(event.questions) });
521
- return;
522
- }
523
- if (event.kind === 'process') {
524
- live(conversation, { process: { running: event.running } });
525
- return;
526
- }
527
- if (event.kind === 'commands') {
528
- live(conversation, { commands: structuredClone(event.commands) });
529
- return;
530
- }
531
- if (event.kind === 'options') {
532
- live(conversation, { options: structuredClone(event.options) });
533
- return;
534
- }
535
- const arriving = acceptedMessage(event.message);
536
- if (arriving === null)
537
- return;
538
- if (replicated.has(conversation)) {
539
- void keep(conversation, arriving).catch(() => { });
540
- return;
705
+ return false;
706
+ if (event.kind === 'list' || event.kind === 'listed' || event.kind === 'unlisted') {
707
+ if (event.kind === 'list') {
708
+ listing.clear();
709
+ for (const entry of event.entries)
710
+ listing.set(entry.conversation, { ...entry });
711
+ listKnown = true;
712
+ }
713
+ else if (event.kind === 'listed') {
714
+ listing.set(event.entry.conversation, { ...event.entry });
715
+ }
716
+ else {
717
+ listing.delete(event.conversation);
718
+ }
719
+ emitList();
720
+ return (event.kind !== 'list' &&
721
+ listKnown &&
722
+ (listing.size !== replicated.size ||
723
+ [...listing.keys()].some((conversation) => !replicated.has(conversation))));
541
724
  }
542
- if (sealTurns(conversation, new Set([arriving.turn])))
543
- emit(conversation);
725
+ heard(event);
726
+ return false;
544
727
  },
545
728
  messages() {
546
729
  return [...messages].flatMap(([conversation, held]) => held.map(({ identity, text }) => ({ conversation, identity, text })));
@@ -552,6 +735,8 @@ export function createConversationStore(deps) {
552
735
  close() {
553
736
  views.clear();
554
737
  lives.clear();
738
+ listWatchers.clear();
739
+ agentWatchers.clear();
555
740
  },
556
741
  };
557
742
  }
@@ -0,0 +1,17 @@
1
+ import { type QueryResult } from './query.js';
2
+ export { QueryError } from './query.js';
3
+ export type EntryRoom = {
4
+ locator: string;
5
+ schema: string | null;
6
+ documents: Readonly<Record<string, string>>;
7
+ };
8
+ export type EntryArguments = Readonly<Record<string, string>>;
9
+ export type EntryParameterKind = 'string' | 'integer' | 'number' | 'boolean';
10
+ export declare function boundQuery(template: unknown, args: EntryArguments): unknown;
11
+ export declare function entryParameters(template: unknown): readonly string[];
12
+ export declare function entryRefusal(template: unknown): string | null;
13
+ export type EntryScope = {
14
+ results(queries: Readonly<Record<string, unknown>>): Promise<Record<string, QueryResult>>;
15
+ };
16
+ export declare function entryScope(rooms: readonly EntryRoom[]): EntryScope;
17
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../src/entry.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,WAAW,EAEjB,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,WAAW,CAAC,CAAC,CAAC;CAC3F,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,UAAU,CAqDlE"}