@agentshouse/mdruntime 0.1.0-ca7c26c6bc27e → 0.1.0-ca9afacd5aebd
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.
- package/AGENTS.md +144 -41
- package/README.md +21 -11
- package/dist/adapter.d.ts +71 -20
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +1 -9
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +15 -2
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +57 -0
- package/dist/binary.d.ts +23 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +17 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +89 -38
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +19 -12
- package/dist/change.d.ts +15 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +26 -1
- package/dist/chat/acts.d.ts +34 -0
- package/dist/chat/acts.d.ts.map +1 -0
- package/dist/chat/acts.js +36 -0
- package/dist/chat/context.d.ts +3 -0
- package/dist/chat/context.d.ts.map +1 -0
- package/dist/chat/context.js +10 -0
- package/dist/chat/input.d.ts +9 -0
- package/dist/chat/input.d.ts.map +1 -0
- package/dist/chat/input.js +99 -0
- package/dist/chat/kit.d.ts +60 -0
- package/dist/chat/kit.d.ts.map +1 -0
- package/dist/chat/kit.js +123 -0
- package/dist/chat/lasting.d.ts +6 -0
- package/dist/chat/lasting.d.ts.map +1 -0
- package/dist/chat/lasting.js +19 -0
- package/dist/chat/list.d.ts +20 -0
- package/dist/chat/list.d.ts.map +1 -0
- package/dist/chat/list.js +59 -0
- package/dist/chat/markdown.d.ts +19 -0
- package/dist/chat/markdown.d.ts.map +1 -0
- package/dist/chat/markdown.js +187 -0
- package/dist/chat/message.d.ts +6 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +192 -0
- package/dist/chat/messages.d.ts +21 -0
- package/dist/chat/messages.d.ts.map +1 -0
- package/dist/chat/messages.js +151 -0
- package/dist/chat/name.d.ts +6 -0
- package/dist/chat/name.d.ts.map +1 -0
- package/dist/chat/name.js +37 -0
- package/dist/chat/opened.d.ts +11 -0
- package/dist/chat/opened.d.ts.map +1 -0
- package/dist/chat/opened.js +17 -0
- package/dist/chat/overlay.d.ts +31 -0
- package/dist/chat/overlay.d.ts.map +1 -0
- package/dist/chat/overlay.js +97 -0
- package/dist/chat/parts.d.ts +57 -0
- package/dist/chat/parts.d.ts.map +1 -0
- package/dist/chat/parts.js +119 -0
- package/dist/chat/process.d.ts +20 -0
- package/dist/chat/process.d.ts.map +1 -0
- package/dist/chat/process.js +32 -0
- package/dist/chat/provider.d.ts +63 -0
- package/dist/chat/provider.d.ts.map +1 -0
- package/dist/chat/provider.js +645 -0
- package/dist/chat/question.d.ts +9 -0
- package/dist/chat/question.d.ts.map +1 -0
- package/dist/chat/question.js +80 -0
- package/dist/chat/questions.d.ts +31 -0
- package/dist/chat/questions.d.ts.map +1 -0
- package/dist/chat/questions.js +111 -0
- package/dist/chat/read.d.ts +5 -0
- package/dist/chat/read.d.ts.map +1 -0
- package/dist/chat/read.js +13 -0
- package/dist/chat/ready.d.ts +33 -0
- package/dist/chat/ready.d.ts.map +1 -0
- package/dist/chat/ready.js +91 -0
- package/dist/chat/style.d.ts +4 -0
- package/dist/chat/style.d.ts.map +1 -0
- package/dist/chat/style.js +302 -0
- package/dist/chat.d.ts +14 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +8 -0
- package/dist/client.d.ts +17 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +68 -25
- package/dist/collection.d.ts +6 -11
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +56 -19
- package/dist/connection.d.ts +25 -12
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +492 -185
- package/dist/conversation.d.ts +27 -8
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +210 -81
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/host.d.ts +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +12 -19
- package/dist/identity.d.ts +3 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +13 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/memory.d.ts +5 -5
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +73 -27
- package/dist/model.d.ts +13 -8
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -3
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/outcome.d.ts +28 -3
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +41 -1
- package/dist/overlay.d.ts +14 -3
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +75 -37
- package/dist/paths.d.ts +0 -1
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +0 -16
- package/dist/query.d.ts +5 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +74 -33
- package/dist/reach.d.ts +2 -0
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +51 -34
- package/dist/react.d.ts +41 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +64 -0
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +111 -48
- package/dist/refresh.d.ts +10 -0
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +42 -38
- package/dist/replica.d.ts +9 -7
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +90 -64
- package/dist/room-draft.d.ts +26 -9
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +132 -23
- package/dist/rows.d.ts +7 -2
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +85 -40
- package/dist/save.d.ts +28 -3
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +429 -80
- package/dist/search.d.ts +3 -2
- package/dist/search.d.ts.map +1 -1
- package/dist/status.d.ts +2 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -8
- package/dist/store.d.ts +34 -9
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +273 -164
- package/dist/wire.d.ts +8 -15
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +16 -17
- package/package.json +23 -3
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
package/dist/conversation.d.ts
CHANGED
|
@@ -1,18 +1,33 @@
|
|
|
1
|
-
import type { ConversationAction,
|
|
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
|
|
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
|
-
|
|
12
|
-
|
|
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;
|
|
23
|
+
};
|
|
24
|
+
export type ConversationAgent = {
|
|
25
|
+
identity: string;
|
|
26
|
+
name: string;
|
|
13
27
|
};
|
|
14
28
|
export type RunningTurn = {
|
|
15
29
|
turn: string;
|
|
30
|
+
started: string | null;
|
|
16
31
|
parts: readonly unknown[];
|
|
17
32
|
context: TurnContext | null;
|
|
18
33
|
};
|
|
@@ -33,7 +48,9 @@ export type ConversationView = {
|
|
|
33
48
|
} | null;
|
|
34
49
|
commands: readonly ProcessCommand[];
|
|
35
50
|
options: readonly SessionOption[];
|
|
36
|
-
chatDraft: ChatDraft
|
|
51
|
+
chatDraft: (ChatDraft & {
|
|
52
|
+
readonly revision: string;
|
|
53
|
+
}) | null;
|
|
37
54
|
};
|
|
38
55
|
export type ConversationSurface = {
|
|
39
56
|
list(): Promise<readonly ConversationEntry[]>;
|
|
@@ -47,11 +64,11 @@ export type ConversationSurface = {
|
|
|
47
64
|
delete(conversation: string): Promise<CallResult>;
|
|
48
65
|
};
|
|
49
66
|
export type ChatDraftSurface = {
|
|
50
|
-
write(conversation: string, draft: ChatDraft): Promise<void>;
|
|
67
|
+
write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
|
|
51
68
|
discard(conversation: string): Promise<void>;
|
|
52
69
|
};
|
|
53
70
|
export type ConversationDependencies = {
|
|
54
|
-
|
|
71
|
+
agents(): ConversationAgents | undefined;
|
|
55
72
|
documents(locator: string): Promise<DocumentResult>;
|
|
56
73
|
call(name: ConversationAction, input: unknown): Promise<CallResult>;
|
|
57
74
|
durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;
|
|
@@ -68,8 +85,10 @@ export type ConversationStore = {
|
|
|
68
85
|
current(): boolean;
|
|
69
86
|
reconnected(): void;
|
|
70
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;
|
|
71
90
|
changed(set: ChangeSet): void;
|
|
72
|
-
receive(event: ConversationEvent):
|
|
91
|
+
receive(event: ConversationEvent): boolean;
|
|
73
92
|
messages(): readonly SearchedMessage[];
|
|
74
93
|
message(conversation: string, identity: string): SearchedMessage | null;
|
|
75
94
|
close(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
|
package/dist/conversation.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
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
6
|
turn: null,
|
|
5
7
|
questions: [],
|
|
@@ -20,11 +22,18 @@ export function unheldView(conversation) {
|
|
|
20
22
|
};
|
|
21
23
|
}
|
|
22
24
|
function startedTurn(turn, operation) {
|
|
25
|
+
if (operation.op === 'begin')
|
|
26
|
+
return { turn, started: operation.at, parts: [], context: null };
|
|
23
27
|
if (operation.op === 'context') {
|
|
24
|
-
return {
|
|
28
|
+
return {
|
|
29
|
+
turn,
|
|
30
|
+
started: null,
|
|
31
|
+
parts: [],
|
|
32
|
+
context: { used: operation.used, window: operation.window },
|
|
33
|
+
};
|
|
25
34
|
}
|
|
26
35
|
return operation.op === 'start' && operation.index === 0
|
|
27
|
-
? { turn, parts: [structuredClone(operation.part)], context: null }
|
|
36
|
+
? { turn, started: null, parts: [structuredClone(operation.part)], context: null }
|
|
28
37
|
: null;
|
|
29
38
|
}
|
|
30
39
|
function changedFields(part, operation) {
|
|
@@ -39,6 +48,8 @@ function changedFields(part, operation) {
|
|
|
39
48
|
return { entries: structuredClone(operation.entries) };
|
|
40
49
|
}
|
|
41
50
|
function appliedTurn(held, operation) {
|
|
51
|
+
if (operation.op === 'begin')
|
|
52
|
+
return { ...held, started: operation.at };
|
|
42
53
|
if (operation.op === 'context') {
|
|
43
54
|
return { ...held, context: { used: operation.used, window: operation.window } };
|
|
44
55
|
}
|
|
@@ -143,7 +154,7 @@ function limitOf(options) {
|
|
|
143
154
|
if (limit === undefined)
|
|
144
155
|
return undefined;
|
|
145
156
|
if (!Number.isInteger(limit) || limit < 0) {
|
|
146
|
-
throw
|
|
157
|
+
throw runtimeError('invalid-limit', `conversation limit must be a non-negative integer, got ${String(limit)}`);
|
|
147
158
|
}
|
|
148
159
|
return limit;
|
|
149
160
|
}
|
|
@@ -156,6 +167,13 @@ export function createConversationStore(deps) {
|
|
|
156
167
|
const gaps = new Map();
|
|
157
168
|
const lives = new Map();
|
|
158
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;
|
|
159
177
|
let replicated = new Set();
|
|
160
178
|
let handedReplicated;
|
|
161
179
|
function liveOf(conversation) {
|
|
@@ -184,7 +202,7 @@ export function createConversationStore(deps) {
|
|
|
184
202
|
options: structuredClone(facts.options),
|
|
185
203
|
chatDraft: draft === undefined || draft.turn !== null || sending.get(conversation)?.draft === draft
|
|
186
204
|
? null
|
|
187
|
-
: { text: draft.text, files: [...draft.files] },
|
|
205
|
+
: { text: draft.text, files: [...draft.files], revision: draft.revision },
|
|
188
206
|
};
|
|
189
207
|
}
|
|
190
208
|
function emit(conversation, messagesChanged = true) {
|
|
@@ -204,8 +222,94 @@ export function createConversationStore(deps) {
|
|
|
204
222
|
watcher.notify(value);
|
|
205
223
|
}
|
|
206
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
|
+
}
|
|
207
311
|
function live(conversation, change) {
|
|
208
|
-
|
|
312
|
+
setLive(conversation, { ...liveOf(conversation), ...change });
|
|
209
313
|
emit(conversation, false);
|
|
210
314
|
}
|
|
211
315
|
function relayed(conversation, turn, operation) {
|
|
@@ -218,7 +322,7 @@ export function createConversationStore(deps) {
|
|
|
218
322
|
const held = lives.get(conversation);
|
|
219
323
|
if (held?.turn == null || !turns.has(held.turn.turn))
|
|
220
324
|
return false;
|
|
221
|
-
|
|
325
|
+
setLive(conversation, { ...held, turn: null });
|
|
222
326
|
return true;
|
|
223
327
|
}
|
|
224
328
|
function handReplicated() {
|
|
@@ -232,27 +336,6 @@ export function createConversationStore(deps) {
|
|
|
232
336
|
handedReplicated = named;
|
|
233
337
|
stream.replicate(held);
|
|
234
338
|
}
|
|
235
|
-
async function documented() {
|
|
236
|
-
const declaration = deps.cards();
|
|
237
|
-
if (declaration === undefined)
|
|
238
|
-
return [];
|
|
239
|
-
const { documents } = await deps.documents(declaration.locator);
|
|
240
|
-
return documents.filter((document) => typeof document.type === 'string');
|
|
241
|
-
}
|
|
242
|
-
function carded(documents) {
|
|
243
|
-
const declaration = deps.cards();
|
|
244
|
-
if (declaration === undefined)
|
|
245
|
-
return [];
|
|
246
|
-
const cards = [];
|
|
247
|
-
for (const card of documents) {
|
|
248
|
-
if (card.type !== declaration.type)
|
|
249
|
-
continue;
|
|
250
|
-
const identity = card.fields[declaration.identity];
|
|
251
|
-
if (typeof identity === 'string')
|
|
252
|
-
cards.push({ conversation: identity, card });
|
|
253
|
-
}
|
|
254
|
-
return cards;
|
|
255
|
-
}
|
|
256
339
|
async function remove(leaving) {
|
|
257
340
|
await deps.durably(async (local) => {
|
|
258
341
|
await local.dropConversations(leaving);
|
|
@@ -269,7 +352,7 @@ export function createConversationStore(deps) {
|
|
|
269
352
|
reads.delete(conversation);
|
|
270
353
|
drafts.delete(conversation);
|
|
271
354
|
behind.delete(conversation);
|
|
272
|
-
|
|
355
|
+
setLive(conversation, null);
|
|
273
356
|
}
|
|
274
357
|
if (changed.length > 0)
|
|
275
358
|
deps.publish(conversationChangeSet(removed, changed));
|
|
@@ -365,6 +448,48 @@ export function createConversationStore(deps) {
|
|
|
365
448
|
}
|
|
366
449
|
});
|
|
367
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
|
+
}
|
|
368
493
|
function withDraft(conversation, next) {
|
|
369
494
|
return deps.durably(async (local) => {
|
|
370
495
|
const following = next(drafts.get(conversation));
|
|
@@ -386,17 +511,8 @@ export function createConversationStore(deps) {
|
|
|
386
511
|
}
|
|
387
512
|
const surface = {
|
|
388
513
|
async list() {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
return [];
|
|
392
|
-
const documents = await documented();
|
|
393
|
-
const entries = carded(documents).map(({ conversation, card }) => ({
|
|
394
|
-
conversation,
|
|
395
|
-
card,
|
|
396
|
-
agent: documents.find((document) => document.backlinks.some((backlink) => backlink.path === card.path && backlink.field === declaration.agent)) ?? null,
|
|
397
|
-
}));
|
|
398
|
-
entries.sort((left, right) => (left.conversation < right.conversation ? -1 : 1));
|
|
399
|
-
return entries;
|
|
514
|
+
await agentsReady();
|
|
515
|
+
return entries();
|
|
400
516
|
},
|
|
401
517
|
async read(conversation, options = {}) {
|
|
402
518
|
const limit = limitOf(options);
|
|
@@ -462,12 +578,13 @@ export function createConversationStore(deps) {
|
|
|
462
578
|
},
|
|
463
579
|
};
|
|
464
580
|
const chatDraft = {
|
|
465
|
-
write(conversation, draft) {
|
|
581
|
+
write(conversation, draft, revision = chatDraftRevision()) {
|
|
466
582
|
return withDraft(conversation, () => ({
|
|
467
583
|
conversation,
|
|
468
584
|
text: draft.text,
|
|
469
585
|
files: [...draft.files],
|
|
470
586
|
turn: null,
|
|
587
|
+
revision,
|
|
471
588
|
}));
|
|
472
589
|
},
|
|
473
590
|
discard(conversation) {
|
|
@@ -492,7 +609,9 @@ export function createConversationStore(deps) {
|
|
|
492
609
|
drafts.set(record.conversation, record);
|
|
493
610
|
},
|
|
494
611
|
async reconcile() {
|
|
495
|
-
|
|
612
|
+
if (!listKnown)
|
|
613
|
+
return;
|
|
614
|
+
const named = new Set(listing.keys());
|
|
496
615
|
const leaving = [
|
|
497
616
|
...new Set([...replicated, ...messages.keys(), ...reads.keys(), ...drafts.keys()]),
|
|
498
617
|
].filter((conversation) => !named.has(conversation));
|
|
@@ -550,53 +669,61 @@ export function createConversationStore(deps) {
|
|
|
550
669
|
views.delete(key);
|
|
551
670
|
};
|
|
552
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
|
+
},
|
|
553
692
|
changed(set) {
|
|
554
693
|
for (const conversation of set.conversations)
|
|
555
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
|
+
}
|
|
556
702
|
},
|
|
557
703
|
receive(event) {
|
|
558
704
|
if (deps.closed())
|
|
559
|
-
return;
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
}
|
|
579
|
-
if (event.kind === 'process') {
|
|
580
|
-
live(conversation, { process: { running: event.running } });
|
|
581
|
-
return;
|
|
582
|
-
}
|
|
583
|
-
if (event.kind === 'commands') {
|
|
584
|
-
live(conversation, { commands: structuredClone(event.commands) });
|
|
585
|
-
return;
|
|
586
|
-
}
|
|
587
|
-
if (event.kind === 'options') {
|
|
588
|
-
live(conversation, { options: structuredClone(event.options) });
|
|
589
|
-
return;
|
|
590
|
-
}
|
|
591
|
-
const arriving = acceptedMessage(event.message);
|
|
592
|
-
if (arriving === null)
|
|
593
|
-
return;
|
|
594
|
-
if (replicated.has(conversation)) {
|
|
595
|
-
void keep(conversation, arriving).catch(() => { });
|
|
596
|
-
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))));
|
|
597
724
|
}
|
|
598
|
-
|
|
599
|
-
|
|
725
|
+
heard(event);
|
|
726
|
+
return false;
|
|
600
727
|
},
|
|
601
728
|
messages() {
|
|
602
729
|
return [...messages].flatMap(([conversation, held]) => held.map(({ identity, text }) => ({ conversation, identity, text })));
|
|
@@ -608,6 +735,8 @@ export function createConversationStore(deps) {
|
|
|
608
735
|
close() {
|
|
609
736
|
views.clear();
|
|
610
737
|
lives.clear();
|
|
738
|
+
listWatchers.clear();
|
|
739
|
+
agentWatchers.clear();
|
|
611
740
|
},
|
|
612
741
|
};
|
|
613
742
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type ExpectedOf<E extends {
|
|
2
|
+
readonly key: string;
|
|
3
|
+
}> = E | readonly E[] | null;
|
|
4
|
+
export type Expecting<E extends {
|
|
5
|
+
readonly key: string;
|
|
6
|
+
}> = {
|
|
7
|
+
subscribe(listener: () => void): () => void;
|
|
8
|
+
version(): number;
|
|
9
|
+
begin(): number;
|
|
10
|
+
expect(act: number, expected: ExpectedOf<E>, settled?: (one: E) => boolean): void;
|
|
11
|
+
drop(act: number): void;
|
|
12
|
+
heard(shown: (one: E) => boolean): void;
|
|
13
|
+
drawn(): readonly E[];
|
|
14
|
+
};
|
|
15
|
+
export declare function expectedList<E extends {
|
|
16
|
+
readonly key: string;
|
|
17
|
+
}>(expected: ExpectedOf<E>): readonly E[];
|
|
18
|
+
export declare function expecting<E extends {
|
|
19
|
+
readonly key: string;
|
|
20
|
+
}>(): Expecting<E>;
|
|
21
|
+
//# sourceMappingURL=expectation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expectation.d.ts","sourceRoot":"","sources":["../src/expectation.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAAC;AAErF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,IAAI;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,OAAO,IAAI,MAAM,CAAC;IAClB,KAAK,IAAI,MAAM,CAAC;IAChB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAClF,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACxC,KAAK,IAAI,SAAS,CAAC,EAAE,CAAC;CACvB,CAAC;AAIF,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAC7D,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,GACtB,SAAS,CAAC,EAAE,CAGd;AAwBD,wBAAgB,SAAS,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CA4C5E"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
export function expectedList(expected) {
|
|
2
|
+
if (expected === null)
|
|
3
|
+
return [];
|
|
4
|
+
return 'key' in expected ? [expected] : expected;
|
|
5
|
+
}
|
|
6
|
+
function superseded(entries, at) {
|
|
7
|
+
const key = entries[at]?.expectation.key;
|
|
8
|
+
return entries.slice(at + 1).some((later) => later.expectation.key === key);
|
|
9
|
+
}
|
|
10
|
+
function unended(entries, ends) {
|
|
11
|
+
const ended = new Set();
|
|
12
|
+
const kept = [];
|
|
13
|
+
for (const one of [...entries].reverse()) {
|
|
14
|
+
if (ended.has(one.expectation.key))
|
|
15
|
+
continue;
|
|
16
|
+
if (ends(one.expectation))
|
|
17
|
+
ended.add(one.expectation.key);
|
|
18
|
+
else
|
|
19
|
+
kept.unshift(one);
|
|
20
|
+
}
|
|
21
|
+
return kept;
|
|
22
|
+
}
|
|
23
|
+
export function expecting() {
|
|
24
|
+
let entries = [];
|
|
25
|
+
let version = 0;
|
|
26
|
+
let acts = 0;
|
|
27
|
+
const listeners = new Set();
|
|
28
|
+
const set = (next) => {
|
|
29
|
+
if (next.length === entries.length && next.every((one, at) => one === entries[at]))
|
|
30
|
+
return;
|
|
31
|
+
entries = next;
|
|
32
|
+
version += 1;
|
|
33
|
+
for (const listener of listeners)
|
|
34
|
+
listener();
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
subscribe(listener) {
|
|
38
|
+
listeners.add(listener);
|
|
39
|
+
return () => {
|
|
40
|
+
listeners.delete(listener);
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
version: () => version,
|
|
44
|
+
begin() {
|
|
45
|
+
acts += 1;
|
|
46
|
+
return acts;
|
|
47
|
+
},
|
|
48
|
+
expect(act, expected, settled = () => false) {
|
|
49
|
+
const fresh = expectedList(expected);
|
|
50
|
+
if (fresh.length === 0)
|
|
51
|
+
return;
|
|
52
|
+
const keys = new Set(fresh.map((one) => one.key));
|
|
53
|
+
const kept = entries.filter((one) => one.act !== act || !keys.has(one.expectation.key));
|
|
54
|
+
const over = new Set(kept.map((one) => one.expectation.key));
|
|
55
|
+
set([
|
|
56
|
+
...kept,
|
|
57
|
+
...fresh
|
|
58
|
+
.filter((one) => over.has(one.key) || !settled(one))
|
|
59
|
+
.map((expectation) => ({ act, expectation })),
|
|
60
|
+
]);
|
|
61
|
+
},
|
|
62
|
+
drop(act) {
|
|
63
|
+
set(entries.filter((one) => one.act !== act));
|
|
64
|
+
},
|
|
65
|
+
heard(shown) {
|
|
66
|
+
set(unended(entries, shown));
|
|
67
|
+
},
|
|
68
|
+
drawn: () => entries.flatMap((one, at) => (superseded(entries, at) ? [] : [one.expectation])),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RuntimeError = Error & {
|
|
2
|
+
readonly code: string;
|
|
3
|
+
readonly retryable: boolean;
|
|
4
|
+
};
|
|
5
|
+
export type Described = {
|
|
6
|
+
message: string;
|
|
7
|
+
code: string;
|
|
8
|
+
retryable: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare function runtimeError(code: string, message?: string, retryable?: boolean): RuntimeError;
|
|
11
|
+
export declare function failed(error: unknown): RuntimeError;
|
|
12
|
+
export declare function described(error: unknown): Described;
|
|
13
|
+
//# sourceMappingURL=failure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure.d.ts","sourceRoot":"","sources":["../src/failure.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE1F,MAAM,MAAM,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9E,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,MAAa,EACtB,SAAS,UAAQ,GAChB,YAAY,CAEd;AAYD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAGnD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAGnD"}
|
package/dist/failure.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export function runtimeError(code, message = code, retryable = false) {
|
|
2
|
+
return Object.assign(new Error(message), { code, retryable });
|
|
3
|
+
}
|
|
4
|
+
function coded(error) {
|
|
5
|
+
return (error instanceof Error &&
|
|
6
|
+
'code' in error &&
|
|
7
|
+
typeof error.code === 'string' &&
|
|
8
|
+
'retryable' in error &&
|
|
9
|
+
typeof error.retryable === 'boolean');
|
|
10
|
+
}
|
|
11
|
+
export function failed(error) {
|
|
12
|
+
if (coded(error))
|
|
13
|
+
return error;
|
|
14
|
+
return runtimeError('runtime-failure', error instanceof Error ? error.message : String(error));
|
|
15
|
+
}
|
|
16
|
+
export function described(error) {
|
|
17
|
+
const { message, code, retryable } = failed(error);
|
|
18
|
+
return { message, code, retryable };
|
|
19
|
+
}
|
package/dist/host.d.ts
CHANGED
|
@@ -15,5 +15,6 @@ export type MdRuntimeHost = {
|
|
|
15
15
|
};
|
|
16
16
|
export declare function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost;
|
|
17
17
|
export type { PortReach, ReachedDocument } from './reach.js';
|
|
18
|
+
export { AUTHORED_SCHEMA, STORE_SCHEMA } from './store.js';
|
|
18
19
|
export type { RuntimePort } from './wire.js';
|
|
19
20
|
//# sourceMappingURL=host.d.ts.map
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"
|
|
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,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,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;CAChC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;IAC1F,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAsFF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAkH3E;AAED,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|