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