@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.
- package/README.md +10 -8
- package/dist/adapter.d.ts +47 -48
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +2 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +28 -4
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +16 -8
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +142 -94
- package/dist/change-set.d.ts +1 -7
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +1 -4
- package/dist/client.d.ts +6 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +54 -7
- package/dist/collection.d.ts +5 -3
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +24 -19
- package/dist/compile.d.ts +6 -1
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +94 -33
- package/dist/connection.d.ts +8 -7
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1160 -1174
- package/dist/conversation.d.ts +6 -9
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +191 -121
- package/dist/durability.d.ts +1 -5
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +1 -0
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +1 -1
- package/dist/file.d.ts +2 -11
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +6 -4
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +370 -0
- package/dist/host.d.ts +3 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +42 -18
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +2 -1
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +218 -0
- package/dist/memory.d.ts +5 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +96 -38
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/model.d.ts +6 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +7 -10
- package/dist/observation.d.ts +1 -0
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +1 -1
- package/dist/outcome.d.ts +13 -6
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +16 -5
- package/dist/overlay.js +1 -1
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/query.d.ts +10 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +12 -1
- package/dist/reach.d.ts +8 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +69 -46
- package/dist/readiness.d.ts +14 -15
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +2 -8
- package/dist/recovery.d.ts +1 -0
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +26 -0
- package/dist/refresh.d.ts +9 -4
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +64 -30
- package/dist/replica.d.ts +5 -5
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +4 -7
- package/dist/room-draft.d.ts +18 -2
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +73 -6
- package/dist/rows.d.ts +15 -6
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +102 -74
- package/dist/save.d.ts +2 -0
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +13 -7
- package/dist/search.d.ts +11 -43
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +0 -296
- package/dist/shared.d.ts +0 -1
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +0 -10
- package/dist/status.d.ts +4 -3
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -1
- package/dist/store.d.ts +23 -58
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +37 -272
- package/dist/stored.d.ts +10 -23
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +217 -218
- package/dist/tables.d.ts +51 -46
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +94 -53
- package/dist/transfer.d.ts +0 -5
- package/dist/transfer.d.ts.map +1 -1
- package/dist/validation.d.ts +3 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +35 -96
- package/dist/wire.d.ts +5 -5
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +2 -2
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +156 -0
- package/package.json +11 -19
- package/AGENTS.md +0 -312
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/context.js +0 -10
- package/dist/chat/earlier.d.ts +0 -10
- package/dist/chat/earlier.d.ts.map +0 -1
- package/dist/chat/earlier.js +0 -54
- package/dist/chat/house.d.ts +0 -25
- package/dist/chat/house.d.ts.map +0 -1
- package/dist/chat/house.js +0 -38
- package/dist/chat/input.d.ts +0 -11
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -92
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -28
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -103
- package/dist/chat/markdown.d.ts +0 -21
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -246
- package/dist/chat/message.d.ts +0 -7
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -244
- package/dist/chat/messages.d.ts +0 -30
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -198
- package/dist/chat/name.d.ts +0 -7
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -12
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -19
- package/dist/chat/overlay.d.ts +0 -32
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -103
- package/dist/chat/parts.d.ts +0 -58
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -120
- package/dist/chat/pieces.d.ts +0 -62
- package/dist/chat/pieces.d.ts.map +0 -1
- package/dist/chat/pieces.js +0 -1110
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -70
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -635
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -69
- package/dist/chat/questions.d.ts +0 -31
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/questions.js +0 -111
- package/dist/chat/read.d.ts +0 -5
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/read.js +0 -13
- package/dist/chat/ready.d.ts +0 -37
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -93
- package/dist/chat/room-file.d.ts +0 -8
- package/dist/chat/room-file.d.ts.map +0 -1
- package/dist/chat/room-file.js +0 -72
- package/dist/chat/steady.d.ts +0 -3
- package/dist/chat/steady.d.ts.map +0 -1
- package/dist/chat/steady.js +0 -26
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -306
- package/dist/chat.d.ts +0 -15
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/reads.d.ts +0 -11
- package/dist/reads.d.ts.map +0 -1
- package/dist/reads.js +0 -98
package/dist/conversation.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import type { ConversationAction,
|
|
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
|
|
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
|
-
|
|
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":"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,8 +1,9 @@
|
|
|
1
1
|
import { conversationChangeSet } from './change-set.js';
|
|
2
2
|
import { runtimeError } from './failure.js';
|
|
3
|
-
import {
|
|
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
|
-
|
|
256
|
-
let
|
|
257
|
-
let
|
|
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:
|
|
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()
|
|
371
|
+
if (deps.closed())
|
|
351
372
|
return;
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
watcher
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
.
|
|
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
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
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(
|
|
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(
|
|
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
|
|
579
|
+
let waiting = conversations.map((conversation) => ({
|
|
542
580
|
conversation,
|
|
543
581
|
after: reads.get(conversation) ?? undefined,
|
|
544
582
|
}));
|
|
545
|
-
while (
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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([
|
|
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([
|
|
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
|
-
|
|
784
|
-
|
|
785
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
989
|
-
|
|
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
|
-
|
|
1014
|
-
|
|
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
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
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
|
}
|