@agentshouse/mdruntime 0.1.0-cf890bb538119 → 0.1.0-cf9a84afc6def
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 +59 -59
- 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/client.d.ts +8 -10
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +54 -8
- 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.map +1 -1
- package/dist/compile.js +95 -30
- package/dist/connection.d.ts +8 -8
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1242 -1064
- package/dist/conversation.d.ts +12 -11
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +201 -131
- 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.map +1 -1
- package/dist/fulltext.js +8 -6
- package/dist/host.d.ts +3 -4
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +40 -20
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- 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 +8 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +165 -96
- 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 +6 -0
- package/dist/query.d.ts.map +1 -1
- package/dist/reach.d.ts +8 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +66 -50
- package/dist/readiness.d.ts +13 -14
- 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/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 +19 -26
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +26 -51
- package/dist/stored.d.ts +10 -18
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +209 -193
- package/dist/tables.d.ts +28 -35
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +58 -50
- 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 -9
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +2 -3
- package/dist/words.d.ts.map +1 -1
- package/dist/words.js +8 -2
- package/package.json +11 -18
- package/AGENTS.md +0 -319
- 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 -254
- package/dist/chat/messages.d.ts +0 -35
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -210
- 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 -307
- 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, ConversationHistoryRequest, 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,26 +63,28 @@ 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
|
-
|
|
69
|
-
answer(conversation: string, answer: unknown): Promise<CallResult>;
|
|
66
|
+
answer(conversation: string, answer: ConversationAnswer): Promise<CallResult>;
|
|
70
67
|
interrupt(conversation: string): Promise<CallResult>;
|
|
71
68
|
kill(conversation: string): Promise<CallResult>;
|
|
72
|
-
cancel(conversation: string, turn: string): Promise<CallResult>;
|
|
73
69
|
delete(conversation: string): Promise<CallResult>;
|
|
74
70
|
};
|
|
71
|
+
export type ConversationAnswer = {
|
|
72
|
+
interaction_id: string;
|
|
73
|
+
response: unknown;
|
|
74
|
+
};
|
|
75
75
|
export type ChatDraftSurface = {
|
|
76
76
|
write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
|
|
77
77
|
prepend(conversation: string, draft: ChatDraft): Promise<void>;
|
|
78
78
|
discard(conversation: string): Promise<void>;
|
|
79
79
|
};
|
|
80
80
|
export type ConversationDependencies = {
|
|
81
|
-
agents(): ConversationAgents | undefined;
|
|
82
|
-
documents(agents: ConversationAgents, after: string | undefined): Promise<DocumentResult | PendingResult>;
|
|
83
81
|
call(name: ConversationAction, input: unknown): Promise<CallResult>;
|
|
82
|
+
history(request: ConversationHistoryRequest): Promise<CallResult>;
|
|
84
83
|
durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;
|
|
85
84
|
stream(): ConversationStream | undefined;
|
|
86
85
|
publish(set: ChangeSet): void;
|
|
87
86
|
online(): boolean;
|
|
87
|
+
full(): boolean;
|
|
88
88
|
closed(): boolean;
|
|
89
89
|
unanswered(): void;
|
|
90
90
|
expired(operation: string): boolean;
|
|
@@ -92,13 +92,13 @@ export type ConversationDependencies = {
|
|
|
92
92
|
export type ConversationStore = {
|
|
93
93
|
surface: ConversationSurface;
|
|
94
94
|
chatDraft: ChatDraftSurface;
|
|
95
|
-
hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[]): void;
|
|
95
|
+
hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[], list: readonly ListedConversation[] | null): void;
|
|
96
96
|
reconcile(): Promise<void>;
|
|
97
97
|
catchUp(progress: CycleProgress): Promise<void>;
|
|
98
98
|
resend(progress: CycleProgress): Promise<void>;
|
|
99
99
|
current(): boolean;
|
|
100
100
|
known(): boolean;
|
|
101
|
-
|
|
101
|
+
learned(): void;
|
|
102
102
|
reopened(): void;
|
|
103
103
|
lost(): void;
|
|
104
104
|
watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
|
|
@@ -112,6 +112,7 @@ export type ConversationStore = {
|
|
|
112
112
|
};
|
|
113
113
|
export declare function unheldView(conversation: string): ConversationView;
|
|
114
114
|
export declare const SESSION_STARTED = "Session started";
|
|
115
|
+
export declare const HISTORY_CONVERSATIONS = 64;
|
|
115
116
|
export declare function newChat(agent: string): string;
|
|
116
117
|
export declare function createConversationStore(deps: ConversationDependencies): ConversationStore;
|
|
117
118
|
//# 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) {
|
|
@@ -333,7 +345,7 @@ export function createConversationStore(deps) {
|
|
|
333
345
|
function entries() {
|
|
334
346
|
return [...listing.values()].map((entry) => ({
|
|
335
347
|
conversation: entry.conversation,
|
|
336
|
-
agent: { identity: entry.agent, name:
|
|
348
|
+
agent: { identity: entry.agent, name: entry.agentName },
|
|
337
349
|
name: entry.name,
|
|
338
350
|
created: entry.created,
|
|
339
351
|
finished: entry.finished,
|
|
@@ -343,25 +355,90 @@ export function createConversationStore(deps) {
|
|
|
343
355
|
started: lives.get(entry.conversation)?.turn?.started ?? null,
|
|
344
356
|
}));
|
|
345
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
|
+
}
|
|
346
370
|
function emitList() {
|
|
347
|
-
if (deps.closed()
|
|
371
|
+
if (deps.closed())
|
|
348
372
|
return;
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
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
|
+
}
|
|
352
402
|
}
|
|
353
403
|
function agents() {
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
.
|
|
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 }))
|
|
357
413
|
.sort((left, right) => left.name === right.name
|
|
358
414
|
? left.identity.localeCompare(right.identity)
|
|
359
415
|
: left.name.localeCompare(right.name));
|
|
360
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
|
+
}
|
|
361
434
|
function emitAgents() {
|
|
362
435
|
if (deps.closed() || agentWatchers.size === 0)
|
|
363
436
|
return;
|
|
364
437
|
const value = agents();
|
|
438
|
+
const shown = JSON.stringify(value);
|
|
439
|
+
if (shown === agentsShown)
|
|
440
|
+
return;
|
|
441
|
+
agentsShown = shown;
|
|
365
442
|
for (const watcher of agentWatchers)
|
|
366
443
|
watcher(value);
|
|
367
444
|
}
|
|
@@ -377,55 +454,11 @@ export function createConversationStore(deps) {
|
|
|
377
454
|
if (stateOf(conversation) !== before || next?.turn?.started !== began)
|
|
378
455
|
emitList();
|
|
379
456
|
}
|
|
380
|
-
async function readAgents() {
|
|
381
|
-
const declaration = deps.agents();
|
|
382
|
-
if (declaration === undefined)
|
|
383
|
-
return;
|
|
384
|
-
const names = new Map();
|
|
385
|
-
const retired = new Set();
|
|
386
|
-
let covered = null;
|
|
387
|
-
for (let after;;) {
|
|
388
|
-
const read = await deps.documents(declaration, after);
|
|
389
|
-
if ('pending' in read)
|
|
390
|
-
return;
|
|
391
|
-
const coverage = JSON.stringify(read.coverage);
|
|
392
|
-
if (covered !== null && coverage !== covered)
|
|
393
|
-
return readAgents();
|
|
394
|
-
covered = coverage;
|
|
395
|
-
for (const document of read.documents) {
|
|
396
|
-
const identity = document.fields?.[declaration.identity];
|
|
397
|
-
const name = document.fields?.[declaration.name];
|
|
398
|
-
if (typeof identity !== 'string' || typeof name !== 'string')
|
|
399
|
-
continue;
|
|
400
|
-
names.set(identity, name);
|
|
401
|
-
const ended = declaration.retired === undefined ? null : document.fields?.[declaration.retired];
|
|
402
|
-
if (ended !== undefined && ended !== null)
|
|
403
|
-
retired.add(identity);
|
|
404
|
-
}
|
|
405
|
-
if (read.next === undefined)
|
|
406
|
-
break;
|
|
407
|
-
after = read.next;
|
|
408
|
-
}
|
|
409
|
-
const named = JSON.stringify([...names]) !== JSON.stringify([...agentNames]);
|
|
410
|
-
if (!named && JSON.stringify([...retired]) === JSON.stringify([...retiredAgents]))
|
|
411
|
-
return;
|
|
412
|
-
agentNames = names;
|
|
413
|
-
retiredAgents = retired;
|
|
414
|
-
if (named)
|
|
415
|
-
emitList();
|
|
416
|
-
emitAgents();
|
|
417
|
-
const ended = [...drafts.keys()].filter(retiredChat);
|
|
418
|
-
if (ended.length > 0)
|
|
419
|
-
await remove(ended);
|
|
420
|
-
}
|
|
421
457
|
function retiredChat(conversation) {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
agentsRead = null;
|
|
427
|
-
});
|
|
428
|
-
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);
|
|
429
462
|
}
|
|
430
463
|
function live(conversation, change) {
|
|
431
464
|
const owed = unsent.get(conversation);
|
|
@@ -501,6 +534,20 @@ export function createConversationStore(deps) {
|
|
|
501
534
|
deps.publish(conversationChangeSet(changed));
|
|
502
535
|
});
|
|
503
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
|
+
}
|
|
504
551
|
function gap(conversation) {
|
|
505
552
|
gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);
|
|
506
553
|
behind.add(conversation);
|
|
@@ -529,12 +576,13 @@ export function createConversationStore(deps) {
|
|
|
529
576
|
}
|
|
530
577
|
async function readHistories(conversations, ended) {
|
|
531
578
|
const generations = new Map(conversations.map((one) => [one, gaps.get(one) ?? 0]));
|
|
532
|
-
let
|
|
579
|
+
let waiting = conversations.map((conversation) => ({
|
|
533
580
|
conversation,
|
|
534
581
|
after: reads.get(conversation) ?? undefined,
|
|
535
582
|
}));
|
|
536
|
-
while (
|
|
537
|
-
const
|
|
583
|
+
while (waiting.length > 0) {
|
|
584
|
+
const asking = waiting.slice(0, HISTORY_CONVERSATIONS);
|
|
585
|
+
const result = await deps.history({
|
|
538
586
|
conversations: asking.map(({ conversation, after }) => ({
|
|
539
587
|
conversation,
|
|
540
588
|
...(after === undefined ? {} : { after }),
|
|
@@ -557,7 +605,7 @@ export function createConversationStore(deps) {
|
|
|
557
605
|
if (!following.some((next) => next.conversation === conversation))
|
|
558
606
|
ended(conversation);
|
|
559
607
|
}
|
|
560
|
-
|
|
608
|
+
waiting = [...waiting.slice(HISTORY_CONVERSATIONS), ...following];
|
|
561
609
|
}
|
|
562
610
|
return null;
|
|
563
611
|
}
|
|
@@ -648,8 +696,16 @@ export function createConversationStore(deps) {
|
|
|
648
696
|
const arriving = acceptedMessage(event.message);
|
|
649
697
|
if (arriving === null)
|
|
650
698
|
return;
|
|
699
|
+
noted(conversation, arriving);
|
|
651
700
|
if (replicated.has(conversation)) {
|
|
652
|
-
|
|
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
|
+
});
|
|
653
709
|
return;
|
|
654
710
|
}
|
|
655
711
|
if (sealTurns(conversation, new Set([arriving.turn])))
|
|
@@ -734,20 +790,21 @@ export function createConversationStore(deps) {
|
|
|
734
790
|
});
|
|
735
791
|
}
|
|
736
792
|
async function dispatched(conversation, submission) {
|
|
737
|
-
const dispatch = {};
|
|
793
|
+
const dispatch = { answered: false };
|
|
738
794
|
sending.set(submission.operation, dispatch);
|
|
739
795
|
try {
|
|
740
|
-
const result = await invoke('
|
|
741
|
-
text: submission.text,
|
|
796
|
+
const result = await invoke('conversations/send', conversation, {
|
|
742
797
|
operation_id: submission.operation,
|
|
798
|
+
text: submission.text,
|
|
743
799
|
});
|
|
800
|
+
dispatch.answered = result.kind !== 'transport-uncertainty';
|
|
744
801
|
if (result.kind === 'revoked-authorization')
|
|
745
802
|
return result;
|
|
746
803
|
if (result.kind !== 'action' && result.retryable) {
|
|
747
804
|
deps.unanswered();
|
|
748
805
|
return result;
|
|
749
806
|
}
|
|
750
|
-
const turn = answered(result, '
|
|
807
|
+
const turn = answered(result, 'message_id');
|
|
751
808
|
await withDraft(conversation, async (current, local) => {
|
|
752
809
|
const held = current?.submitted?.find((one) => one.operation === submission.operation);
|
|
753
810
|
if (current === undefined || held === undefined || held.turn !== null)
|
|
@@ -767,13 +824,20 @@ export function createConversationStore(deps) {
|
|
|
767
824
|
sending.delete(submission.operation);
|
|
768
825
|
}
|
|
769
826
|
}
|
|
770
|
-
function invoke(name, conversation, extra = {}) {
|
|
771
|
-
return deps.call(name, { conversation, ...extra });
|
|
827
|
+
function invoke(name, conversation, extra = { operation_id: changeBatchIdentity() }) {
|
|
828
|
+
return deps.call(name, { conversation_id: conversation, ...extra });
|
|
772
829
|
}
|
|
773
830
|
const surface = {
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
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
|
+
});
|
|
777
841
|
},
|
|
778
842
|
async read(conversation, options = {}) {
|
|
779
843
|
const asked = askedOf(options);
|
|
@@ -784,8 +848,8 @@ export function createConversationStore(deps) {
|
|
|
784
848
|
});
|
|
785
849
|
},
|
|
786
850
|
async create(input) {
|
|
787
|
-
const result = await deps.call('
|
|
788
|
-
const conversation = answered(result, '
|
|
851
|
+
const result = await deps.call('conversations/create', input);
|
|
852
|
+
const conversation = answered(result, 'conversation_id');
|
|
789
853
|
if (conversation === null)
|
|
790
854
|
return result;
|
|
791
855
|
if (!listing.has(conversation))
|
|
@@ -796,8 +860,17 @@ export function createConversationStore(deps) {
|
|
|
796
860
|
return result;
|
|
797
861
|
},
|
|
798
862
|
async send(conversation, operation = changeBatchIdentity(), draft) {
|
|
863
|
+
if (deps.full())
|
|
864
|
+
return DURABLE_WRITE;
|
|
799
865
|
if (deps.online()) {
|
|
800
|
-
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;
|
|
801
874
|
if (!earlier || !deps.expired(operation))
|
|
802
875
|
return dispatched(conversation, submission);
|
|
803
876
|
await forgotten(conversation, submission);
|
|
@@ -810,38 +883,20 @@ export function createConversationStore(deps) {
|
|
|
810
883
|
}
|
|
811
884
|
return OFFLINE;
|
|
812
885
|
},
|
|
813
|
-
async attach(room, file) {
|
|
814
|
-
if (!deps.online())
|
|
815
|
-
return OFFLINE;
|
|
816
|
-
return deps.call('conversation.attach', {
|
|
817
|
-
room,
|
|
818
|
-
...(await declaredFile(file)),
|
|
819
|
-
blob: file.blob,
|
|
820
|
-
});
|
|
821
|
-
},
|
|
822
886
|
answer(conversation, answer) {
|
|
823
|
-
return invoke('
|
|
887
|
+
return invoke('conversations/interaction/answer', conversation, {
|
|
888
|
+
operation_id: changeBatchIdentity(),
|
|
889
|
+
...answer,
|
|
890
|
+
});
|
|
824
891
|
},
|
|
825
892
|
interrupt(conversation) {
|
|
826
|
-
return invoke('
|
|
893
|
+
return invoke('conversations/interrupt', conversation);
|
|
827
894
|
},
|
|
828
895
|
kill(conversation) {
|
|
829
|
-
return invoke('
|
|
830
|
-
},
|
|
831
|
-
async cancel(conversation, turn) {
|
|
832
|
-
const result = await invoke('conversation.cancel', conversation, { turn });
|
|
833
|
-
if (result.kind !== 'action')
|
|
834
|
-
return result;
|
|
835
|
-
await withDraft(conversation, (current) => {
|
|
836
|
-
const held = current?.submitted?.find((one) => one.turn === turn);
|
|
837
|
-
if (current === undefined || held === undefined)
|
|
838
|
-
return undefined;
|
|
839
|
-
return returned(current, held, current.submitted.filter((one) => one !== held));
|
|
840
|
-
});
|
|
841
|
-
return result;
|
|
896
|
+
return invoke('conversations/kill', conversation);
|
|
842
897
|
},
|
|
843
898
|
delete(conversation) {
|
|
844
|
-
return invoke('
|
|
899
|
+
return invoke('conversations/delete', conversation);
|
|
845
900
|
},
|
|
846
901
|
};
|
|
847
902
|
const chatDraft = {
|
|
@@ -870,7 +925,13 @@ export function createConversationStore(deps) {
|
|
|
870
925
|
return {
|
|
871
926
|
surface,
|
|
872
927
|
chatDraft,
|
|
873
|
-
hydrate(held, kept) {
|
|
928
|
+
hydrate(held, kept, list) {
|
|
929
|
+
if (list !== null && !listKnown) {
|
|
930
|
+
listing.clear();
|
|
931
|
+
for (const entry of list)
|
|
932
|
+
listing.set(entry.conversation, { ...entry });
|
|
933
|
+
listHeld = true;
|
|
934
|
+
}
|
|
874
935
|
stored.clear();
|
|
875
936
|
reads.clear();
|
|
876
937
|
partials.clear();
|
|
@@ -884,6 +945,8 @@ export function createConversationStore(deps) {
|
|
|
884
945
|
drafts.clear();
|
|
885
946
|
for (const record of kept)
|
|
886
947
|
drafts.set(record.conversation, record);
|
|
948
|
+
if (listHeld)
|
|
949
|
+
learned();
|
|
887
950
|
},
|
|
888
951
|
async reconcile() {
|
|
889
952
|
if (!listKnown)
|
|
@@ -895,7 +958,7 @@ export function createConversationStore(deps) {
|
|
|
895
958
|
!creations.has(conversation) &&
|
|
896
959
|
(!conversation.startsWith(NEW_CHAT) || retiredChat(conversation)));
|
|
897
960
|
for (const conversation of named) {
|
|
898
|
-
if (!replicated.has(conversation))
|
|
961
|
+
if (!replicated.has(conversation) && missed(conversation))
|
|
899
962
|
behind.add(conversation);
|
|
900
963
|
}
|
|
901
964
|
replicated = named;
|
|
@@ -904,6 +967,11 @@ export function createConversationStore(deps) {
|
|
|
904
967
|
await remove(leaving);
|
|
905
968
|
},
|
|
906
969
|
async catchUp(progress) {
|
|
970
|
+
if (deps.full()) {
|
|
971
|
+
if (behind.size > 0)
|
|
972
|
+
progress.complete = false;
|
|
973
|
+
return;
|
|
974
|
+
}
|
|
907
975
|
const owed = (conversation) => behind.has(conversation) && replicated.has(conversation);
|
|
908
976
|
const read = async (conversations) => {
|
|
909
977
|
if (conversations.length === 0 || deps.closed())
|
|
@@ -952,12 +1020,10 @@ export function createConversationStore(deps) {
|
|
|
952
1020
|
known() {
|
|
953
1021
|
return listKnown;
|
|
954
1022
|
},
|
|
955
|
-
reconnected() {
|
|
956
|
-
for (const conversation of replicated)
|
|
957
|
-
gap(conversation);
|
|
958
|
-
},
|
|
959
1023
|
reopened() {
|
|
960
|
-
sending
|
|
1024
|
+
for (const [operation, dispatch] of sending)
|
|
1025
|
+
if (!dispatch.answered)
|
|
1026
|
+
sending.delete(operation);
|
|
961
1027
|
},
|
|
962
1028
|
lost() {
|
|
963
1029
|
catching.clear();
|
|
@@ -976,15 +1042,15 @@ export function createConversationStore(deps) {
|
|
|
976
1042
|
views.set(key, view);
|
|
977
1043
|
const watcher = { notify: deliver, ready: false };
|
|
978
1044
|
view.watchers.add(watcher);
|
|
979
|
-
|
|
980
|
-
|
|
1045
|
+
const reading = new AbortController();
|
|
1046
|
+
void untilAnswered(() => deps.durably(async (local) => {
|
|
981
1047
|
if (view.window !== null)
|
|
982
1048
|
return;
|
|
983
1049
|
const { messages, more } = await local.messageWindow(conversation, asked.limit, asked.before);
|
|
984
1050
|
view.window = messages;
|
|
985
1051
|
view.more = more;
|
|
986
1052
|
view.total = asked.total ? await local.messageCount(conversation) : null;
|
|
987
|
-
})
|
|
1053
|
+
}), reading.signal)
|
|
988
1054
|
.then(() => {
|
|
989
1055
|
if (deps.closed() || !view.watchers.has(watcher))
|
|
990
1056
|
return;
|
|
@@ -994,6 +1060,7 @@ export function createConversationStore(deps) {
|
|
|
994
1060
|
})
|
|
995
1061
|
.catch(() => { });
|
|
996
1062
|
return () => {
|
|
1063
|
+
reading.abort();
|
|
997
1064
|
if (!view.watchers.delete(watcher))
|
|
998
1065
|
return;
|
|
999
1066
|
if (view.watchers.size === 0)
|
|
@@ -1001,35 +1068,26 @@ export function createConversationStore(deps) {
|
|
|
1001
1068
|
};
|
|
1002
1069
|
},
|
|
1003
1070
|
watchList(deliver) {
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
if (!deps.closed() && listWatchers.has(deliver))
|
|
1007
|
-
deliver(entries());
|
|
1008
|
-
});
|
|
1071
|
+
unlisted.add(deliver);
|
|
1072
|
+
learned();
|
|
1009
1073
|
return () => {
|
|
1074
|
+
unlisted.delete(deliver);
|
|
1010
1075
|
listWatchers.delete(deliver);
|
|
1011
1076
|
};
|
|
1012
1077
|
},
|
|
1013
1078
|
watchAgents(deliver) {
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
deliver(agents());
|
|
1018
|
-
});
|
|
1079
|
+
unnamed.add(deliver);
|
|
1080
|
+
learned();
|
|
1081
|
+
readAgents();
|
|
1019
1082
|
return () => {
|
|
1083
|
+
unnamed.delete(deliver);
|
|
1020
1084
|
agentWatchers.delete(deliver);
|
|
1021
1085
|
};
|
|
1022
1086
|
},
|
|
1087
|
+
learned,
|
|
1023
1088
|
changed(set) {
|
|
1024
1089
|
for (const conversation of set.conversations)
|
|
1025
1090
|
emit(conversation);
|
|
1026
|
-
const declaration = deps.agents();
|
|
1027
|
-
if (declaration !== undefined &&
|
|
1028
|
-
set.documents.some((change) => change.locator === declaration.locator)) {
|
|
1029
|
-
agentsRead = readAgents().catch(() => {
|
|
1030
|
-
agentsRead = null;
|
|
1031
|
-
});
|
|
1032
|
-
}
|
|
1033
1091
|
},
|
|
1034
1092
|
receive(event) {
|
|
1035
1093
|
if (deps.closed())
|
|
@@ -1042,6 +1100,14 @@ export function createConversationStore(deps) {
|
|
|
1042
1100
|
creations.delete(entry.conversation);
|
|
1043
1101
|
}
|
|
1044
1102
|
listKnown = true;
|
|
1103
|
+
for (const conversation of replicated) {
|
|
1104
|
+
if (!listing.has(conversation))
|
|
1105
|
+
continue;
|
|
1106
|
+
if (!missed(conversation))
|
|
1107
|
+
behind.delete(conversation);
|
|
1108
|
+
else if (!behind.has(conversation))
|
|
1109
|
+
gap(conversation);
|
|
1110
|
+
}
|
|
1045
1111
|
openingEnded();
|
|
1046
1112
|
}
|
|
1047
1113
|
else if (event.kind === 'listed') {
|
|
@@ -1051,11 +1117,13 @@ export function createConversationStore(deps) {
|
|
|
1051
1117
|
else {
|
|
1052
1118
|
listing.delete(event.conversation);
|
|
1053
1119
|
}
|
|
1120
|
+
keepList();
|
|
1054
1121
|
emitList();
|
|
1055
|
-
return (event.kind !== 'list' &&
|
|
1122
|
+
return ((event.kind !== 'list' &&
|
|
1056
1123
|
listKnown &&
|
|
1057
1124
|
(listing.size !== replicated.size ||
|
|
1058
|
-
[...listing.keys()].some((conversation) => !replicated.has(conversation))))
|
|
1125
|
+
[...listing.keys()].some((conversation) => !replicated.has(conversation)))) ||
|
|
1126
|
+
(listKnown && [...drafts.keys()].some(retiredChat)));
|
|
1059
1127
|
}
|
|
1060
1128
|
heard(event);
|
|
1061
1129
|
return false;
|
|
@@ -1071,7 +1139,9 @@ export function createConversationStore(deps) {
|
|
|
1071
1139
|
lives.clear();
|
|
1072
1140
|
unsent.clear();
|
|
1073
1141
|
listWatchers.clear();
|
|
1142
|
+
unlisted.clear();
|
|
1074
1143
|
agentWatchers.clear();
|
|
1144
|
+
unnamed.clear();
|
|
1075
1145
|
},
|
|
1076
1146
|
};
|
|
1077
1147
|
}
|