@agentshouse/mdruntime 0.1.0-alpha.47 → 0.1.0-alpha.49
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 +6 -0
- package/dist/adapter.d.ts +17 -2
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/attachment.d.ts +3 -0
- package/dist/attachment.d.ts.map +1 -0
- package/dist/attachment.js +11 -0
- package/dist/attachment.js.map +1 -0
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +7 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/connection.d.ts +2 -1
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +2 -0
- package/dist/connection.js.map +1 -1
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +70 -28
- package/dist/conversation.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +2 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +31 -3
- package/dist/memory.js.map +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +5 -1
- package/dist/refresh.js.map +1 -1
- package/dist/store.d.ts +2 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +43 -6
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
|
package/dist/conversation.js
CHANGED
|
@@ -38,12 +38,10 @@ function acceptedMessage(value) {
|
|
|
38
38
|
message: structuredClone(record.message)
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
|
-
function historyPage(
|
|
42
|
-
if (
|
|
43
|
-
const
|
|
44
|
-
if (typeof
|
|
45
|
-
const record = answer;
|
|
46
|
-
if (!Array.isArray(record.messages)) return null;
|
|
41
|
+
function historyPage(value) {
|
|
42
|
+
if (typeof value !== 'object' || value === null) return null;
|
|
43
|
+
const record = value;
|
|
44
|
+
if (typeof record.conversation !== 'string' || !Array.isArray(record.messages)) return null;
|
|
47
45
|
if (record.next !== undefined && typeof record.next !== 'string') return null;
|
|
48
46
|
const messages = [];
|
|
49
47
|
for (const entry of record.messages){
|
|
@@ -52,12 +50,27 @@ function historyPage(result) {
|
|
|
52
50
|
messages.push(message);
|
|
53
51
|
}
|
|
54
52
|
return {
|
|
53
|
+
conversation: record.conversation,
|
|
55
54
|
messages,
|
|
56
55
|
...record.next === undefined ? {} : {
|
|
57
56
|
next: record.next
|
|
58
57
|
}
|
|
59
58
|
};
|
|
60
59
|
}
|
|
60
|
+
function historyPages(result) {
|
|
61
|
+
if (result.kind !== 'action') return null;
|
|
62
|
+
const answer = result.result;
|
|
63
|
+
if (typeof answer !== 'object' || answer === null) return null;
|
|
64
|
+
const { histories } = answer;
|
|
65
|
+
if (!Array.isArray(histories)) return null;
|
|
66
|
+
const pages = [];
|
|
67
|
+
for (const entry of histories){
|
|
68
|
+
const page = historyPage(entry);
|
|
69
|
+
if (page === null) return null;
|
|
70
|
+
pages.push(page);
|
|
71
|
+
}
|
|
72
|
+
return pages;
|
|
73
|
+
}
|
|
61
74
|
function turnOf(result) {
|
|
62
75
|
if (result.kind !== 'action') return null;
|
|
63
76
|
const answer = result.result;
|
|
@@ -246,25 +259,56 @@ export function createConversationStore(deps) {
|
|
|
246
259
|
]));
|
|
247
260
|
});
|
|
248
261
|
}
|
|
249
|
-
async function
|
|
250
|
-
const
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
262
|
+
async function readHistories(conversations) {
|
|
263
|
+
const generations = new Map(conversations.map((one)=>[
|
|
264
|
+
one,
|
|
265
|
+
gaps.get(one) ?? 0
|
|
266
|
+
]));
|
|
267
|
+
const starts = new Map(conversations.map((one)=>[
|
|
268
|
+
one,
|
|
269
|
+
reads.get(one)
|
|
270
|
+
]));
|
|
271
|
+
const arriving = new Map();
|
|
272
|
+
const complete = new Set();
|
|
273
|
+
let asking = conversations.map((conversation)=>({
|
|
256
274
|
conversation,
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
275
|
+
after: starts.get(conversation) ?? undefined
|
|
276
|
+
}));
|
|
277
|
+
while(asking.length > 0){
|
|
278
|
+
const result = await deps.call('conversation.history', {
|
|
279
|
+
conversations: asking.map(({ conversation, after })=>({
|
|
280
|
+
conversation,
|
|
281
|
+
...after === undefined ? {} : {
|
|
282
|
+
after
|
|
283
|
+
}
|
|
284
|
+
}))
|
|
260
285
|
});
|
|
261
|
-
const
|
|
262
|
-
if (
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
286
|
+
const pages = historyPages(result);
|
|
287
|
+
if (pages === null) return result;
|
|
288
|
+
const asked = new Set(asking.map(({ conversation })=>conversation));
|
|
289
|
+
const following = [];
|
|
290
|
+
for (const page of pages){
|
|
291
|
+
if (!asked.has(page.conversation)) continue;
|
|
292
|
+
arriving.set(page.conversation, [
|
|
293
|
+
...arriving.get(page.conversation) ?? [],
|
|
294
|
+
...page.messages
|
|
295
|
+
]);
|
|
296
|
+
if (page.next === undefined) complete.add(page.conversation);
|
|
297
|
+
else following.push({
|
|
298
|
+
conversation: page.conversation,
|
|
299
|
+
after: page.next
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
asking = following;
|
|
266
303
|
}
|
|
267
|
-
|
|
304
|
+
for (const [conversation, held] of arriving){
|
|
305
|
+
if (!complete.has(conversation)) continue;
|
|
306
|
+
await keepHistory(conversation, held, starts.get(conversation), generations.get(conversation) ?? 0);
|
|
307
|
+
}
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
function keepHistory(conversation, arriving, from, generation) {
|
|
311
|
+
return deps.durably(async (local)=>{
|
|
268
312
|
if (!replicated.has(conversation)) return;
|
|
269
313
|
const newest = arriving.reduce((top, message)=>top === null || message.position > top ? message.position : top, from ?? null);
|
|
270
314
|
const turn = drafts.get(conversation)?.turn;
|
|
@@ -289,7 +333,6 @@ export function createConversationStore(deps) {
|
|
|
289
333
|
]));
|
|
290
334
|
}
|
|
291
335
|
});
|
|
292
|
-
return null;
|
|
293
336
|
}
|
|
294
337
|
function withDraft(conversation, next) {
|
|
295
338
|
return deps.durably(async (local)=>{
|
|
@@ -449,12 +492,11 @@ export function createConversationStore(deps) {
|
|
|
449
492
|
if (leaving.length > 0) await remove(leaving);
|
|
450
493
|
},
|
|
451
494
|
async catchUp (progress) {
|
|
452
|
-
|
|
495
|
+
const reading = [
|
|
453
496
|
...behind
|
|
454
|
-
].sort()
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
const failed = await readHistory(conversation);
|
|
497
|
+
].filter((conversation)=>replicated.has(conversation)).sort();
|
|
498
|
+
if (reading.length > 0 && !deps.closed()) {
|
|
499
|
+
const failed = await readHistories(reading);
|
|
458
500
|
if (failed?.kind === 'transport-uncertainty') progress.reachable = false;
|
|
459
501
|
}
|
|
460
502
|
if (behind.size > 0) progress.complete = false;
|
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/conversation.ts"],"sourcesContent":["import type {\n AcceptedMessage,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationMessage,\n ConversationStream,\n PlanStep,\n ProcessCommand,\n SessionOption,\n WorkingNote,\n} from './adapter.js';\nimport { conversationChangeSet, type ChangeSet, type MessageChange } from './change-set.js';\nimport { declaredFile, type ChatDraftFile } from './file.js';\nimport type { CallResult } from './outcome.js';\nimport type { DocumentResult, QueryDocument } from './query.js';\nimport type { SearchedMessage } from './search.js';\nimport type { CycleProgress } from './status.js';\nimport type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';\n\nexport type ConversationEntry = {\n conversation: string;\n card: Required<QueryDocument>;\n agent: Required<QueryDocument> | null;\n};\n\nexport type GrowingText = { turn: string; text: string };\n\nexport type ChatDraft = {\n text: string;\n files: readonly ChatDraftFile[];\n};\n\nexport type ConversationOptions = { limit?: number };\n\nexport type ConversationView = {\n conversation: string;\n messages: readonly ConversationMessage[];\n growingText: GrowingText | null;\n workingNote: WorkingNote | null;\n plan: readonly PlanStep[] | null;\n questions: readonly unknown[];\n process: { running: boolean } | null;\n commands: readonly ProcessCommand[];\n options: readonly SessionOption[];\n chatDraft: ChatDraft | null;\n};\n\nexport type ConversationSurface = {\n list(): Promise<readonly ConversationEntry[]>;\n read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;\n create(input: unknown): Promise<CallResult>;\n send(conversation: string): Promise<CallResult>;\n answer(conversation: string, answer: unknown): Promise<CallResult>;\n interrupt(conversation: string): Promise<CallResult>;\n kill(conversation: string): Promise<CallResult>;\n cancel(conversation: string, turn: string): Promise<CallResult>;\n delete(conversation: string): Promise<CallResult>;\n};\n\nexport type ChatDraftSurface = {\n write(conversation: string, draft: ChatDraft): Promise<void>;\n discard(conversation: string): Promise<void>;\n};\n\nexport type ConversationDependencies = {\n cards(): ConversationCards | undefined;\n documents(locator: string): Promise<DocumentResult>;\n call(name: ConversationAction, input: unknown): Promise<CallResult>;\n durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;\n stream(): ConversationStream | undefined;\n publish(set: ChangeSet): void;\n closed(): boolean;\n};\n\nexport type ConversationStore = {\n surface: ConversationSurface;\n chatDraft: ChatDraftSurface;\n hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[]): void;\n reconcile(): Promise<void>;\n catchUp(progress: CycleProgress): Promise<void>;\n current(): boolean;\n reconnected(): void;\n watch(\n conversation: string,\n options: ConversationOptions,\n deliver: (view: ConversationView) => void,\n ): () => void;\n changed(set: ChangeSet): void;\n receive(event: ConversationEvent): void;\n messages(): readonly SearchedMessage[];\n message(conversation: string, identity: string): SearchedMessage | null;\n close(): void;\n};\n\ntype Watcher = {\n notify: (view: ConversationView) => void;\n ready: boolean;\n};\n\ntype Sending = { draft: ChatDraftRecord };\n\ntype Live = {\n growingText: GrowingText | null;\n plan: { turn: string; plan: readonly PlanStep[] } | null;\n workingNote: WorkingNote | null;\n questions: readonly unknown[];\n process: { running: boolean } | null;\n commands: readonly ProcessCommand[];\n options: readonly SessionOption[];\n};\n\nconst QUIET: Live = {\n growingText: null,\n plan: null,\n workingNote: null,\n questions: [],\n process: null,\n commands: [],\n options: [],\n};\n\ntype SharedView = {\n conversation: string;\n limit: number | undefined;\n watchers: Set<Watcher>;\n};\n\nfunction ordered(left: AcceptedMessage, right: AcceptedMessage): number {\n if (left.position !== right.position) return left.position < right.position ? -1 : 1;\n if (left.identity !== right.identity) return left.identity < right.identity ? -1 : 1;\n return 0;\n}\n\nfunction merged(\n held: readonly AcceptedMessage[],\n arriving: readonly AcceptedMessage[],\n): readonly AcceptedMessage[] {\n const byIdentity = new Map(held.map((message) => [message.identity, message]));\n for (const message of arriving) byIdentity.set(message.identity, message);\n return [...byIdentity.values()].sort(ordered);\n}\n\nfunction acceptedMessage(value: unknown): AcceptedMessage | null {\n if (typeof value !== 'object' || value === null) return null;\n const record = value as Partial<Record<keyof AcceptedMessage, unknown>>;\n if (\n typeof record.identity !== 'string' ||\n typeof record.turn !== 'string' ||\n typeof record.position !== 'string' ||\n typeof record.text !== 'string'\n ) {\n return null;\n }\n return {\n identity: record.identity,\n turn: record.turn,\n position: record.position,\n text: record.text,\n message: structuredClone(record.message),\n };\n}\n\nfunction historyPage(result: CallResult): ConversationHistoryPage | null {\n if (result.kind !== 'action') return null;\n const answer = result.result;\n if (typeof answer !== 'object' || answer === null) return null;\n const record = answer as { messages?: unknown; next?: unknown };\n if (!Array.isArray(record.messages)) return null;\n if (record.next !== undefined && typeof record.next !== 'string') return null;\n const messages: AcceptedMessage[] = [];\n for (const entry of record.messages) {\n const message = acceptedMessage(entry);\n if (message === null) return null;\n messages.push(message);\n }\n return { messages, ...(record.next === undefined ? {} : { next: record.next }) };\n}\n\nfunction turnOf(result: CallResult): string | null {\n if (result.kind !== 'action') return null;\n const answer = result.result;\n if (typeof answer !== 'object' || answer === null) return null;\n const record = answer as { turn?: unknown };\n return typeof record.turn === 'string' ? record.turn : null;\n}\n\nfunction limitOf(options: ConversationOptions): number | undefined {\n const { limit } = options;\n if (limit === undefined) return undefined;\n if (!Number.isInteger(limit) || limit < 0) {\n throw new Error(`conversation limit must be a non-negative integer, got ${String(limit)}`);\n }\n return limit;\n}\n\nexport function createConversationStore(deps: ConversationDependencies): ConversationStore {\n const messages = new Map<string, readonly AcceptedMessage[]>();\n const reads = new Map<string, string | null>();\n const drafts = new Map<string, ChatDraftRecord>();\n const sending = new Map<string, Sending>();\n const behind = new Set<string>();\n const gaps = new Map<string, number>();\n const lives = new Map<string, Live>();\n const views = new Map<string, SharedView>();\n let replicated: ReadonlySet<string> = new Set();\n let handedReplicated: string | undefined;\n\n function liveOf(conversation: string): Live {\n return lives.get(conversation) ?? QUIET;\n }\n\n function viewOf(conversation: string, limit: number | undefined): ConversationView {\n const held = messages.get(conversation) ?? [];\n const shown = limit === undefined ? held : held.slice(Math.max(0, held.length - limit));\n const draft = drafts.get(conversation);\n const facts = liveOf(conversation);\n return {\n conversation,\n messages: shown.map(({ identity, turn, text, message }) => ({\n identity,\n turn,\n text,\n message: structuredClone(message),\n })),\n growingText: facts.growingText === null ? null : { ...facts.growingText },\n workingNote: facts.workingNote === null ? null : { ...facts.workingNote },\n plan: structuredClone(facts.plan?.plan ?? null),\n questions: structuredClone(facts.questions),\n process: facts.process === null ? null : { ...facts.process },\n commands: structuredClone(facts.commands),\n options: structuredClone(facts.options),\n chatDraft:\n draft === undefined || draft.turn !== null || sending.get(conversation)?.draft === draft\n ? null\n : { text: draft.text, files: [...draft.files] },\n };\n }\n\n function emit(conversation: string) {\n if (deps.closed()) return;\n for (const view of views.values()) {\n if (view.conversation !== conversation) continue;\n const ready = [...view.watchers].filter((watcher) => watcher.ready);\n if (ready.length === 0) continue;\n const value = viewOf(conversation, view.limit);\n for (const watcher of ready) watcher.notify(value);\n }\n }\n\n function live(conversation: string, change: Partial<Live>) {\n lives.set(conversation, { ...liveOf(conversation), ...change });\n emit(conversation);\n }\n\n function sealTurns(conversation: string, turns: ReadonlySet<string>): boolean {\n const held = lives.get(conversation);\n if (held === undefined) return false;\n const growingText =\n held.growingText !== null && turns.has(held.growingText.turn) ? null : held.growingText;\n const plan = held.plan !== null && turns.has(held.plan.turn) ? null : held.plan;\n if (growingText === held.growingText && plan === held.plan) return false;\n lives.set(conversation, { ...held, growingText, plan });\n return true;\n }\n\n function handReplicated() {\n const stream = deps.stream();\n if (stream === undefined) return;\n const held = [...replicated].sort();\n const named = JSON.stringify(held);\n if (named === handedReplicated) return;\n handedReplicated = named;\n stream.replicate(held);\n }\n\n async function documented(): Promise<readonly Required<QueryDocument>[]> {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const { documents } = await deps.documents(declaration.locator);\n return documents.filter(\n (document): document is Required<QueryDocument> => typeof document.type === 'string',\n );\n }\n\n function carded(\n documents: readonly Required<QueryDocument>[],\n ): readonly { conversation: string; card: Required<QueryDocument> }[] {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const cards: { conversation: string; card: Required<QueryDocument> }[] = [];\n for (const card of documents) {\n if (card.type !== declaration.type) continue;\n const identity = card.fields[declaration.identity];\n if (typeof identity === 'string') cards.push({ conversation: identity, card });\n }\n return cards;\n }\n\n async function remove(leaving: readonly string[]) {\n await deps.durably(async (local) => {\n await local.dropConversations(leaving);\n const removed: MessageChange[] = [];\n const changed: string[] = [];\n for (const conversation of leaving) {\n for (const message of messages.get(conversation) ?? []) {\n removed.push({ conversation, identity: message.identity });\n }\n if (messages.has(conversation) || drafts.has(conversation) || lives.has(conversation)) {\n changed.push(conversation);\n }\n messages.delete(conversation);\n reads.delete(conversation);\n drafts.delete(conversation);\n behind.delete(conversation);\n lives.delete(conversation);\n }\n if (changed.length > 0) deps.publish(conversationChangeSet(removed, changed));\n });\n }\n\n function gap(conversation: string) {\n gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);\n behind.add(conversation);\n }\n\n function keep(conversation: string, message: AcceptedMessage) {\n return deps.durably(async (local) => {\n if (!replicated.has(conversation)) return;\n const read = reads.get(conversation);\n const advances =\n read !== undefined &&\n !behind.has(conversation) &&\n (read === null || message.position > read);\n const sealed = drafts.get(conversation)?.turn === message.turn;\n await local.keepMessages({\n conversation,\n messages: [message],\n ...(advances ? { read: message.position } : {}),\n sealed,\n });\n messages.set(conversation, merged(messages.get(conversation) ?? [], [message]));\n if (advances) reads.set(conversation, message.position);\n if (sealed) drafts.delete(conversation);\n sealTurns(conversation, new Set([message.turn]));\n deps.publish(\n conversationChangeSet([{ conversation, identity: message.identity }], [conversation]),\n );\n });\n }\n\n async function readHistory(conversation: string): Promise<CallResult | null> {\n const generation = gaps.get(conversation) ?? 0;\n const from = reads.get(conversation);\n const arriving: AcceptedMessage[] = [];\n let after = from ?? undefined;\n for (;;) {\n const result = await deps.call('conversation.history', {\n conversation,\n ...(after === undefined ? {} : { after }),\n });\n const page = historyPage(result);\n if (page === null) return result;\n arriving.push(...page.messages);\n if (page.next === undefined) break;\n after = page.next;\n }\n await deps.durably(async (local) => {\n if (!replicated.has(conversation)) return;\n const newest = arriving.reduce<string | null>(\n (top, message) => (top === null || message.position > top ? message.position : top),\n from ?? null,\n );\n const turn = drafts.get(conversation)?.turn;\n const sealed = arriving.some((message) => message.turn === turn);\n await local.keepMessages({ conversation, messages: arriving, read: newest, sealed });\n messages.set(conversation, merged(messages.get(conversation) ?? [], arriving));\n reads.set(conversation, newest);\n if (sealed) drafts.delete(conversation);\n sealTurns(conversation, new Set(arriving.map((message) => message.turn)));\n if ((gaps.get(conversation) ?? 0) === generation) behind.delete(conversation);\n if (arriving.length > 0 || sealed) {\n deps.publish(\n conversationChangeSet(\n arriving.map((message) => ({ conversation, identity: message.identity })),\n [conversation],\n ),\n );\n }\n });\n return null;\n }\n\n function withDraft(\n conversation: string,\n next: (draft: ChatDraftRecord | undefined) => ChatDraftRecord | null | undefined,\n ): Promise<void> {\n return deps.durably(async (local) => {\n const following = next(drafts.get(conversation));\n if (following === undefined) return;\n if (following === null) {\n await local.dropChatDraft(conversation);\n drafts.delete(conversation);\n } else {\n await local.keepChatDraft(following);\n drafts.set(conversation, following);\n }\n deps.publish(conversationChangeSet([], [conversation]));\n });\n }\n\n function invoke(\n name: ConversationAction,\n conversation: string,\n extra: Readonly<Record<string, unknown>> = {},\n ): Promise<CallResult> {\n return deps.call(name, { conversation, ...extra });\n }\n\n const surface: ConversationSurface = {\n async list() {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const documents = await documented();\n const entries: ConversationEntry[] = carded(documents).map(({ conversation, card }) => ({\n conversation,\n card,\n agent:\n documents.find((document) =>\n document.backlinks.some(\n (backlink) => backlink.path === card.path && backlink.field === declaration.agent,\n ),\n ) ?? null,\n }));\n entries.sort((left, right) => (left.conversation < right.conversation ? -1 : 1));\n return entries;\n },\n async read(conversation: string, options: ConversationOptions = {}) {\n const limit = limitOf(options);\n return deps.durably(() => Promise.resolve(viewOf(conversation, limit)));\n },\n create(input: unknown) {\n return deps.call('conversation.create', input);\n },\n async send(conversation: string) {\n const draft = drafts.get(conversation);\n const pending: Sending | undefined = draft === undefined ? undefined : { draft };\n if (pending !== undefined) {\n sending.set(conversation, pending);\n deps.publish(conversationChangeSet([], [conversation]));\n }\n try {\n const files = await Promise.all(\n (draft?.files ?? []).map(async (file) => ({\n ...(await declaredFile(file)),\n blob: file.blob,\n })),\n );\n const result = await invoke('conversation.send', conversation, {\n text: draft?.text ?? '',\n files,\n });\n const turn = turnOf(result);\n if (turn === null || draft === undefined) return result;\n await withDraft(conversation, (current) => {\n if (current !== draft) return undefined;\n const sealed = (messages.get(conversation) ?? []).some(\n (message) => message.turn === turn,\n );\n return sealed ? null : { ...draft, turn };\n });\n return result;\n } finally {\n if (pending !== undefined && sending.get(conversation) === pending) {\n sending.delete(conversation);\n if (drafts.get(conversation) === draft) {\n deps.publish(conversationChangeSet([], [conversation]));\n }\n }\n }\n },\n answer(conversation: string, answer: unknown) {\n return invoke('conversation.answer', conversation, { answer });\n },\n interrupt(conversation: string) {\n return invoke('conversation.interrupt', conversation);\n },\n kill(conversation: string) {\n return invoke('conversation.kill', conversation);\n },\n async cancel(conversation: string, turn: string) {\n const result = await invoke('conversation.cancel', conversation, { turn });\n if (result.kind !== 'action') return result;\n await withDraft(conversation, (current) =>\n current === undefined || current.turn !== turn ? undefined : { ...current, turn: null },\n );\n return result;\n },\n delete(conversation: string) {\n return invoke('conversation.delete', conversation);\n },\n };\n\n const chatDraft: ChatDraftSurface = {\n write(conversation: string, draft: ChatDraft) {\n return withDraft(conversation, () => ({\n conversation,\n text: draft.text,\n files: [...draft.files],\n turn: null,\n }));\n },\n discard(conversation: string) {\n return withDraft(conversation, (current) => (current === undefined ? undefined : null));\n },\n };\n\n return {\n surface,\n chatDraft,\n hydrate(held, stored) {\n messages.clear();\n reads.clear();\n for (const entry of held) {\n messages.set(entry.conversation, [...entry.messages].sort(ordered));\n if (entry.read !== undefined) reads.set(entry.conversation, entry.read);\n }\n drafts.clear();\n for (const record of stored) drafts.set(record.conversation, record);\n },\n async reconcile() {\n const named = new Set(carded(await documented()).map((entry) => entry.conversation));\n const leaving = [\n ...new Set([...replicated, ...messages.keys(), ...reads.keys(), ...drafts.keys()]),\n ].filter((conversation) => !named.has(conversation));\n for (const conversation of named) {\n if (!replicated.has(conversation)) behind.add(conversation);\n }\n replicated = named;\n handReplicated();\n if (leaving.length > 0) await remove(leaving);\n },\n async catchUp(progress) {\n for (const conversation of [...behind].sort()) {\n if (deps.closed()) return;\n if (!replicated.has(conversation)) continue;\n const failed = await readHistory(conversation);\n if (failed?.kind === 'transport-uncertainty') progress.reachable = false;\n }\n if (behind.size > 0) progress.complete = false;\n },\n current() {\n return behind.size === 0;\n },\n reconnected() {\n for (const conversation of replicated) gap(conversation);\n },\n watch(conversation, options, deliver) {\n const limit = limitOf(options);\n const key = JSON.stringify([conversation, limit ?? null]);\n const view = views.get(key) ?? { conversation, limit, watchers: new Set<Watcher>() };\n views.set(key, view);\n const watcher: Watcher = { notify: deliver, ready: false };\n view.watchers.add(watcher);\n void deps\n .durably(() => Promise.resolve())\n .then(() => {\n if (deps.closed() || !view.watchers.has(watcher)) return;\n watcher.ready = true;\n watcher.notify(viewOf(conversation, limit));\n })\n .catch(() => {});\n return () => {\n if (!view.watchers.delete(watcher)) return;\n if (view.watchers.size === 0) views.delete(key);\n };\n },\n changed(set) {\n for (const conversation of set.conversations) emit(conversation);\n },\n receive(event) {\n if (deps.closed()) return;\n const { conversation } = event;\n if (event.kind === 'gap') {\n if (replicated.has(conversation)) gap(conversation);\n if (lives.delete(conversation)) emit(conversation);\n return;\n }\n if (event.kind === 'growing-text') {\n live(conversation, { growingText: { turn: event.turn, text: event.text } });\n return;\n }\n if (event.kind === 'plan') {\n live(conversation, { plan: { turn: event.turn, plan: structuredClone(event.plan) } });\n return;\n }\n if (event.kind === 'working-note') {\n live(conversation, {\n workingNote:\n event.note === null ? null : { noteId: event.note.noteId, text: event.note.text },\n });\n return;\n }\n if (event.kind === 'questions') {\n live(conversation, { questions: structuredClone(event.questions) });\n return;\n }\n if (event.kind === 'process') {\n live(conversation, { process: { running: event.running } });\n return;\n }\n if (event.kind === 'commands') {\n live(conversation, { commands: structuredClone(event.commands) });\n return;\n }\n if (event.kind === 'options') {\n live(conversation, { options: structuredClone(event.options) });\n return;\n }\n const arriving = acceptedMessage(event.message);\n if (arriving === null) return;\n if (replicated.has(conversation)) {\n void keep(conversation, arriving).catch(() => {});\n return;\n }\n if (sealTurns(conversation, new Set([arriving.turn]))) emit(conversation);\n },\n messages() {\n return [...messages].flatMap(([conversation, held]) =>\n held.map(({ identity, text }) => ({ conversation, identity, text })),\n );\n },\n message(conversation, identity) {\n const held = messages.get(conversation)?.find((message) => message.identity === identity);\n return held === undefined ? null : { conversation, identity, text: held.text };\n },\n close() {\n views.clear();\n lives.clear();\n },\n };\n}\n"],"names":["conversationChangeSet","declaredFile","QUIET","growingText","plan","workingNote","questions","process","commands","options","ordered","left","right","position","identity","merged","held","arriving","byIdentity","Map","map","message","set","values","sort","acceptedMessage","value","record","turn","text","structuredClone","historyPage","result","kind","answer","Array","isArray","messages","next","undefined","entry","push","turnOf","limitOf","limit","Number","isInteger","Error","String","createConversationStore","deps","reads","drafts","sending","behind","Set","gaps","lives","views","replicated","handedReplicated","liveOf","conversation","get","viewOf","shown","slice","Math","max","length","draft","facts","chatDraft","files","emit","closed","view","ready","watchers","filter","watcher","notify","live","change","sealTurns","turns","has","handReplicated","stream","named","JSON","stringify","replicate","documented","declaration","cards","documents","locator","document","type","carded","card","fields","remove","leaving","durably","local","dropConversations","removed","changed","delete","publish","gap","add","keep","read","advances","sealed","keepMessages","readHistory","generation","from","after","call","page","newest","reduce","top","some","withDraft","following","dropChatDraft","keepChatDraft","invoke","name","extra","surface","list","entries","agent","find","backlinks","backlink","path","field","Promise","resolve","create","input","send","pending","all","file","blob","current","interrupt","kill","cancel","write","discard","hydrate","stored","clear","reconcile","keys","catchUp","progress","failed","reachable","size","complete","reconnected","watch","deliver","key","then","catch","conversations","receive","event","note","noteId","running","flatMap","close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/conversation.ts"],"sourcesContent":["import type {\n AcceptedMessage,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationMessage,\n ConversationStream,\n PlanStep,\n ProcessCommand,\n SessionOption,\n WorkingNote,\n} from './adapter.js';\nimport { conversationChangeSet, type ChangeSet, type MessageChange } from './change-set.js';\nimport { declaredFile, type ChatDraftFile } from './file.js';\nimport type { CallResult } from './outcome.js';\nimport type { DocumentResult, QueryDocument } from './query.js';\nimport type { SearchedMessage } from './search.js';\nimport type { CycleProgress } from './status.js';\nimport type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';\n\nexport type ConversationEntry = {\n conversation: string;\n card: Required<QueryDocument>;\n agent: Required<QueryDocument> | null;\n};\n\nexport type GrowingText = { turn: string; text: string };\n\nexport type ChatDraft = {\n text: string;\n files: readonly ChatDraftFile[];\n};\n\nexport type ConversationOptions = { limit?: number };\n\nexport type ConversationView = {\n conversation: string;\n messages: readonly ConversationMessage[];\n growingText: GrowingText | null;\n workingNote: WorkingNote | null;\n plan: readonly PlanStep[] | null;\n questions: readonly unknown[];\n process: { running: boolean } | null;\n commands: readonly ProcessCommand[];\n options: readonly SessionOption[];\n chatDraft: ChatDraft | null;\n};\n\nexport type ConversationSurface = {\n list(): Promise<readonly ConversationEntry[]>;\n read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;\n create(input: unknown): Promise<CallResult>;\n send(conversation: string): Promise<CallResult>;\n answer(conversation: string, answer: unknown): Promise<CallResult>;\n interrupt(conversation: string): Promise<CallResult>;\n kill(conversation: string): Promise<CallResult>;\n cancel(conversation: string, turn: string): Promise<CallResult>;\n delete(conversation: string): Promise<CallResult>;\n};\n\nexport type ChatDraftSurface = {\n write(conversation: string, draft: ChatDraft): Promise<void>;\n discard(conversation: string): Promise<void>;\n};\n\nexport type ConversationDependencies = {\n cards(): ConversationCards | undefined;\n documents(locator: string): Promise<DocumentResult>;\n call(name: ConversationAction, input: unknown): Promise<CallResult>;\n durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;\n stream(): ConversationStream | undefined;\n publish(set: ChangeSet): void;\n closed(): boolean;\n};\n\nexport type ConversationStore = {\n surface: ConversationSurface;\n chatDraft: ChatDraftSurface;\n hydrate(held: readonly HeldConversation[], drafts: readonly ChatDraftRecord[]): void;\n reconcile(): Promise<void>;\n catchUp(progress: CycleProgress): Promise<void>;\n current(): boolean;\n reconnected(): void;\n watch(\n conversation: string,\n options: ConversationOptions,\n deliver: (view: ConversationView) => void,\n ): () => void;\n changed(set: ChangeSet): void;\n receive(event: ConversationEvent): void;\n messages(): readonly SearchedMessage[];\n message(conversation: string, identity: string): SearchedMessage | null;\n close(): void;\n};\n\ntype Watcher = {\n notify: (view: ConversationView) => void;\n ready: boolean;\n};\n\ntype Sending = { draft: ChatDraftRecord };\n\ntype Live = {\n growingText: GrowingText | null;\n plan: { turn: string; plan: readonly PlanStep[] } | null;\n workingNote: WorkingNote | null;\n questions: readonly unknown[];\n process: { running: boolean } | null;\n commands: readonly ProcessCommand[];\n options: readonly SessionOption[];\n};\n\nconst QUIET: Live = {\n growingText: null,\n plan: null,\n workingNote: null,\n questions: [],\n process: null,\n commands: [],\n options: [],\n};\n\ntype SharedView = {\n conversation: string;\n limit: number | undefined;\n watchers: Set<Watcher>;\n};\n\nfunction ordered(left: AcceptedMessage, right: AcceptedMessage): number {\n if (left.position !== right.position) return left.position < right.position ? -1 : 1;\n if (left.identity !== right.identity) return left.identity < right.identity ? -1 : 1;\n return 0;\n}\n\nfunction merged(\n held: readonly AcceptedMessage[],\n arriving: readonly AcceptedMessage[],\n): readonly AcceptedMessage[] {\n const byIdentity = new Map(held.map((message) => [message.identity, message]));\n for (const message of arriving) byIdentity.set(message.identity, message);\n return [...byIdentity.values()].sort(ordered);\n}\n\nfunction acceptedMessage(value: unknown): AcceptedMessage | null {\n if (typeof value !== 'object' || value === null) return null;\n const record = value as Partial<Record<keyof AcceptedMessage, unknown>>;\n if (\n typeof record.identity !== 'string' ||\n typeof record.turn !== 'string' ||\n typeof record.position !== 'string' ||\n typeof record.text !== 'string'\n ) {\n return null;\n }\n return {\n identity: record.identity,\n turn: record.turn,\n position: record.position,\n text: record.text,\n message: structuredClone(record.message),\n };\n}\n\nfunction historyPage(value: unknown): ConversationHistoryPage | null {\n if (typeof value !== 'object' || value === null) return null;\n const record = value as { conversation?: unknown; messages?: unknown; next?: unknown };\n if (typeof record.conversation !== 'string' || !Array.isArray(record.messages)) return null;\n if (record.next !== undefined && typeof record.next !== 'string') return null;\n const messages: AcceptedMessage[] = [];\n for (const entry of record.messages) {\n const message = acceptedMessage(entry);\n if (message === null) return null;\n messages.push(message);\n }\n return {\n conversation: record.conversation,\n messages,\n ...(record.next === undefined ? {} : { next: record.next }),\n };\n}\n\nfunction historyPages(result: CallResult): readonly ConversationHistoryPage[] | null {\n if (result.kind !== 'action') return null;\n const answer = result.result;\n if (typeof answer !== 'object' || answer === null) return null;\n const { histories } = answer as { histories?: unknown };\n if (!Array.isArray(histories)) return null;\n const pages: ConversationHistoryPage[] = [];\n for (const entry of histories) {\n const page = historyPage(entry);\n if (page === null) return null;\n pages.push(page);\n }\n return pages;\n}\n\nfunction turnOf(result: CallResult): string | null {\n if (result.kind !== 'action') return null;\n const answer = result.result;\n if (typeof answer !== 'object' || answer === null) return null;\n const record = answer as { turn?: unknown };\n return typeof record.turn === 'string' ? record.turn : null;\n}\n\nfunction limitOf(options: ConversationOptions): number | undefined {\n const { limit } = options;\n if (limit === undefined) return undefined;\n if (!Number.isInteger(limit) || limit < 0) {\n throw new Error(`conversation limit must be a non-negative integer, got ${String(limit)}`);\n }\n return limit;\n}\n\nexport function createConversationStore(deps: ConversationDependencies): ConversationStore {\n const messages = new Map<string, readonly AcceptedMessage[]>();\n const reads = new Map<string, string | null>();\n const drafts = new Map<string, ChatDraftRecord>();\n const sending = new Map<string, Sending>();\n const behind = new Set<string>();\n const gaps = new Map<string, number>();\n const lives = new Map<string, Live>();\n const views = new Map<string, SharedView>();\n let replicated: ReadonlySet<string> = new Set();\n let handedReplicated: string | undefined;\n\n function liveOf(conversation: string): Live {\n return lives.get(conversation) ?? QUIET;\n }\n\n function viewOf(conversation: string, limit: number | undefined): ConversationView {\n const held = messages.get(conversation) ?? [];\n const shown = limit === undefined ? held : held.slice(Math.max(0, held.length - limit));\n const draft = drafts.get(conversation);\n const facts = liveOf(conversation);\n return {\n conversation,\n messages: shown.map(({ identity, turn, text, message }) => ({\n identity,\n turn,\n text,\n message: structuredClone(message),\n })),\n growingText: facts.growingText === null ? null : { ...facts.growingText },\n workingNote: facts.workingNote === null ? null : { ...facts.workingNote },\n plan: structuredClone(facts.plan?.plan ?? null),\n questions: structuredClone(facts.questions),\n process: facts.process === null ? null : { ...facts.process },\n commands: structuredClone(facts.commands),\n options: structuredClone(facts.options),\n chatDraft:\n draft === undefined || draft.turn !== null || sending.get(conversation)?.draft === draft\n ? null\n : { text: draft.text, files: [...draft.files] },\n };\n }\n\n function emit(conversation: string) {\n if (deps.closed()) return;\n for (const view of views.values()) {\n if (view.conversation !== conversation) continue;\n const ready = [...view.watchers].filter((watcher) => watcher.ready);\n if (ready.length === 0) continue;\n const value = viewOf(conversation, view.limit);\n for (const watcher of ready) watcher.notify(value);\n }\n }\n\n function live(conversation: string, change: Partial<Live>) {\n lives.set(conversation, { ...liveOf(conversation), ...change });\n emit(conversation);\n }\n\n function sealTurns(conversation: string, turns: ReadonlySet<string>): boolean {\n const held = lives.get(conversation);\n if (held === undefined) return false;\n const growingText =\n held.growingText !== null && turns.has(held.growingText.turn) ? null : held.growingText;\n const plan = held.plan !== null && turns.has(held.plan.turn) ? null : held.plan;\n if (growingText === held.growingText && plan === held.plan) return false;\n lives.set(conversation, { ...held, growingText, plan });\n return true;\n }\n\n function handReplicated() {\n const stream = deps.stream();\n if (stream === undefined) return;\n const held = [...replicated].sort();\n const named = JSON.stringify(held);\n if (named === handedReplicated) return;\n handedReplicated = named;\n stream.replicate(held);\n }\n\n async function documented(): Promise<readonly Required<QueryDocument>[]> {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const { documents } = await deps.documents(declaration.locator);\n return documents.filter(\n (document): document is Required<QueryDocument> => typeof document.type === 'string',\n );\n }\n\n function carded(\n documents: readonly Required<QueryDocument>[],\n ): readonly { conversation: string; card: Required<QueryDocument> }[] {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const cards: { conversation: string; card: Required<QueryDocument> }[] = [];\n for (const card of documents) {\n if (card.type !== declaration.type) continue;\n const identity = card.fields[declaration.identity];\n if (typeof identity === 'string') cards.push({ conversation: identity, card });\n }\n return cards;\n }\n\n async function remove(leaving: readonly string[]) {\n await deps.durably(async (local) => {\n await local.dropConversations(leaving);\n const removed: MessageChange[] = [];\n const changed: string[] = [];\n for (const conversation of leaving) {\n for (const message of messages.get(conversation) ?? []) {\n removed.push({ conversation, identity: message.identity });\n }\n if (messages.has(conversation) || drafts.has(conversation) || lives.has(conversation)) {\n changed.push(conversation);\n }\n messages.delete(conversation);\n reads.delete(conversation);\n drafts.delete(conversation);\n behind.delete(conversation);\n lives.delete(conversation);\n }\n if (changed.length > 0) deps.publish(conversationChangeSet(removed, changed));\n });\n }\n\n function gap(conversation: string) {\n gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);\n behind.add(conversation);\n }\n\n function keep(conversation: string, message: AcceptedMessage) {\n return deps.durably(async (local) => {\n if (!replicated.has(conversation)) return;\n const read = reads.get(conversation);\n const advances =\n read !== undefined &&\n !behind.has(conversation) &&\n (read === null || message.position > read);\n const sealed = drafts.get(conversation)?.turn === message.turn;\n await local.keepMessages({\n conversation,\n messages: [message],\n ...(advances ? { read: message.position } : {}),\n sealed,\n });\n messages.set(conversation, merged(messages.get(conversation) ?? [], [message]));\n if (advances) reads.set(conversation, message.position);\n if (sealed) drafts.delete(conversation);\n sealTurns(conversation, new Set([message.turn]));\n deps.publish(\n conversationChangeSet([{ conversation, identity: message.identity }], [conversation]),\n );\n });\n }\n\n async function readHistories(conversations: readonly string[]): Promise<CallResult | null> {\n const generations = new Map(conversations.map((one) => [one, gaps.get(one) ?? 0]));\n const starts = new Map(conversations.map((one) => [one, reads.get(one)]));\n const arriving = new Map<string, AcceptedMessage[]>();\n const complete = new Set<string>();\n let asking = conversations.map((conversation) => ({\n conversation,\n after: starts.get(conversation) ?? undefined,\n }));\n while (asking.length > 0) {\n const result = await deps.call('conversation.history', {\n conversations: asking.map(({ conversation, after }) => ({\n conversation,\n ...(after === undefined ? {} : { after }),\n })),\n });\n const pages = historyPages(result);\n if (pages === null) return result;\n const asked = new Set(asking.map(({ conversation }) => conversation));\n const following: { conversation: string; after: string | undefined }[] = [];\n for (const page of pages) {\n if (!asked.has(page.conversation)) continue;\n arriving.set(page.conversation, [\n ...(arriving.get(page.conversation) ?? []),\n ...page.messages,\n ]);\n if (page.next === undefined) complete.add(page.conversation);\n else following.push({ conversation: page.conversation, after: page.next });\n }\n asking = following;\n }\n for (const [conversation, held] of arriving) {\n if (!complete.has(conversation)) continue;\n await keepHistory(\n conversation,\n held,\n starts.get(conversation),\n generations.get(conversation) ?? 0,\n );\n }\n return null;\n }\n\n function keepHistory(\n conversation: string,\n arriving: readonly AcceptedMessage[],\n from: string | null | undefined,\n generation: number,\n ): Promise<void> {\n return deps.durably(async (local) => {\n if (!replicated.has(conversation)) return;\n const newest = arriving.reduce<string | null>(\n (top, message) => (top === null || message.position > top ? message.position : top),\n from ?? null,\n );\n const turn = drafts.get(conversation)?.turn;\n const sealed = arriving.some((message) => message.turn === turn);\n await local.keepMessages({ conversation, messages: arriving, read: newest, sealed });\n messages.set(conversation, merged(messages.get(conversation) ?? [], arriving));\n reads.set(conversation, newest);\n if (sealed) drafts.delete(conversation);\n sealTurns(conversation, new Set(arriving.map((message) => message.turn)));\n if ((gaps.get(conversation) ?? 0) === generation) behind.delete(conversation);\n if (arriving.length > 0 || sealed) {\n deps.publish(\n conversationChangeSet(\n arriving.map((message) => ({ conversation, identity: message.identity })),\n [conversation],\n ),\n );\n }\n });\n }\n\n function withDraft(\n conversation: string,\n next: (draft: ChatDraftRecord | undefined) => ChatDraftRecord | null | undefined,\n ): Promise<void> {\n return deps.durably(async (local) => {\n const following = next(drafts.get(conversation));\n if (following === undefined) return;\n if (following === null) {\n await local.dropChatDraft(conversation);\n drafts.delete(conversation);\n } else {\n await local.keepChatDraft(following);\n drafts.set(conversation, following);\n }\n deps.publish(conversationChangeSet([], [conversation]));\n });\n }\n\n function invoke(\n name: ConversationAction,\n conversation: string,\n extra: Readonly<Record<string, unknown>> = {},\n ): Promise<CallResult> {\n return deps.call(name, { conversation, ...extra });\n }\n\n const surface: ConversationSurface = {\n async list() {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const documents = await documented();\n const entries: ConversationEntry[] = carded(documents).map(({ conversation, card }) => ({\n conversation,\n card,\n agent:\n documents.find((document) =>\n document.backlinks.some(\n (backlink) => backlink.path === card.path && backlink.field === declaration.agent,\n ),\n ) ?? null,\n }));\n entries.sort((left, right) => (left.conversation < right.conversation ? -1 : 1));\n return entries;\n },\n async read(conversation: string, options: ConversationOptions = {}) {\n const limit = limitOf(options);\n return deps.durably(() => Promise.resolve(viewOf(conversation, limit)));\n },\n create(input: unknown) {\n return deps.call('conversation.create', input);\n },\n async send(conversation: string) {\n const draft = drafts.get(conversation);\n const pending: Sending | undefined = draft === undefined ? undefined : { draft };\n if (pending !== undefined) {\n sending.set(conversation, pending);\n deps.publish(conversationChangeSet([], [conversation]));\n }\n try {\n const files = await Promise.all(\n (draft?.files ?? []).map(async (file) => ({\n ...(await declaredFile(file)),\n blob: file.blob,\n })),\n );\n const result = await invoke('conversation.send', conversation, {\n text: draft?.text ?? '',\n files,\n });\n const turn = turnOf(result);\n if (turn === null || draft === undefined) return result;\n await withDraft(conversation, (current) => {\n if (current !== draft) return undefined;\n const sealed = (messages.get(conversation) ?? []).some(\n (message) => message.turn === turn,\n );\n return sealed ? null : { ...draft, turn };\n });\n return result;\n } finally {\n if (pending !== undefined && sending.get(conversation) === pending) {\n sending.delete(conversation);\n if (drafts.get(conversation) === draft) {\n deps.publish(conversationChangeSet([], [conversation]));\n }\n }\n }\n },\n answer(conversation: string, answer: unknown) {\n return invoke('conversation.answer', conversation, { answer });\n },\n interrupt(conversation: string) {\n return invoke('conversation.interrupt', conversation);\n },\n kill(conversation: string) {\n return invoke('conversation.kill', conversation);\n },\n async cancel(conversation: string, turn: string) {\n const result = await invoke('conversation.cancel', conversation, { turn });\n if (result.kind !== 'action') return result;\n await withDraft(conversation, (current) =>\n current === undefined || current.turn !== turn ? undefined : { ...current, turn: null },\n );\n return result;\n },\n delete(conversation: string) {\n return invoke('conversation.delete', conversation);\n },\n };\n\n const chatDraft: ChatDraftSurface = {\n write(conversation: string, draft: ChatDraft) {\n return withDraft(conversation, () => ({\n conversation,\n text: draft.text,\n files: [...draft.files],\n turn: null,\n }));\n },\n discard(conversation: string) {\n return withDraft(conversation, (current) => (current === undefined ? undefined : null));\n },\n };\n\n return {\n surface,\n chatDraft,\n hydrate(held, stored) {\n messages.clear();\n reads.clear();\n for (const entry of held) {\n messages.set(entry.conversation, [...entry.messages].sort(ordered));\n if (entry.read !== undefined) reads.set(entry.conversation, entry.read);\n }\n drafts.clear();\n for (const record of stored) drafts.set(record.conversation, record);\n },\n async reconcile() {\n const named = new Set(carded(await documented()).map((entry) => entry.conversation));\n const leaving = [\n ...new Set([...replicated, ...messages.keys(), ...reads.keys(), ...drafts.keys()]),\n ].filter((conversation) => !named.has(conversation));\n for (const conversation of named) {\n if (!replicated.has(conversation)) behind.add(conversation);\n }\n replicated = named;\n handReplicated();\n if (leaving.length > 0) await remove(leaving);\n },\n async catchUp(progress) {\n const reading = [...behind].filter((conversation) => replicated.has(conversation)).sort();\n if (reading.length > 0 && !deps.closed()) {\n const failed = await readHistories(reading);\n if (failed?.kind === 'transport-uncertainty') progress.reachable = false;\n }\n if (behind.size > 0) progress.complete = false;\n },\n current() {\n return behind.size === 0;\n },\n reconnected() {\n for (const conversation of replicated) gap(conversation);\n },\n watch(conversation, options, deliver) {\n const limit = limitOf(options);\n const key = JSON.stringify([conversation, limit ?? null]);\n const view = views.get(key) ?? { conversation, limit, watchers: new Set<Watcher>() };\n views.set(key, view);\n const watcher: Watcher = { notify: deliver, ready: false };\n view.watchers.add(watcher);\n void deps\n .durably(() => Promise.resolve())\n .then(() => {\n if (deps.closed() || !view.watchers.has(watcher)) return;\n watcher.ready = true;\n watcher.notify(viewOf(conversation, limit));\n })\n .catch(() => {});\n return () => {\n if (!view.watchers.delete(watcher)) return;\n if (view.watchers.size === 0) views.delete(key);\n };\n },\n changed(set) {\n for (const conversation of set.conversations) emit(conversation);\n },\n receive(event) {\n if (deps.closed()) return;\n const { conversation } = event;\n if (event.kind === 'gap') {\n if (replicated.has(conversation)) gap(conversation);\n if (lives.delete(conversation)) emit(conversation);\n return;\n }\n if (event.kind === 'growing-text') {\n live(conversation, { growingText: { turn: event.turn, text: event.text } });\n return;\n }\n if (event.kind === 'plan') {\n live(conversation, { plan: { turn: event.turn, plan: structuredClone(event.plan) } });\n return;\n }\n if (event.kind === 'working-note') {\n live(conversation, {\n workingNote:\n event.note === null ? null : { noteId: event.note.noteId, text: event.note.text },\n });\n return;\n }\n if (event.kind === 'questions') {\n live(conversation, { questions: structuredClone(event.questions) });\n return;\n }\n if (event.kind === 'process') {\n live(conversation, { process: { running: event.running } });\n return;\n }\n if (event.kind === 'commands') {\n live(conversation, { commands: structuredClone(event.commands) });\n return;\n }\n if (event.kind === 'options') {\n live(conversation, { options: structuredClone(event.options) });\n return;\n }\n const arriving = acceptedMessage(event.message);\n if (arriving === null) return;\n if (replicated.has(conversation)) {\n void keep(conversation, arriving).catch(() => {});\n return;\n }\n if (sealTurns(conversation, new Set([arriving.turn]))) emit(conversation);\n },\n messages() {\n return [...messages].flatMap(([conversation, held]) =>\n held.map(({ identity, text }) => ({ conversation, identity, text })),\n );\n },\n message(conversation, identity) {\n const held = messages.get(conversation)?.find((message) => message.identity === identity);\n return held === undefined ? null : { conversation, identity, text: held.text };\n },\n close() {\n views.clear();\n lives.clear();\n },\n };\n}\n"],"names":["conversationChangeSet","declaredFile","QUIET","growingText","plan","workingNote","questions","process","commands","options","ordered","left","right","position","identity","merged","held","arriving","byIdentity","Map","map","message","set","values","sort","acceptedMessage","value","record","turn","text","structuredClone","historyPage","conversation","Array","isArray","messages","next","undefined","entry","push","historyPages","result","kind","answer","histories","pages","page","turnOf","limitOf","limit","Number","isInteger","Error","String","createConversationStore","deps","reads","drafts","sending","behind","Set","gaps","lives","views","replicated","handedReplicated","liveOf","get","viewOf","shown","slice","Math","max","length","draft","facts","chatDraft","files","emit","closed","view","ready","watchers","filter","watcher","notify","live","change","sealTurns","turns","has","handReplicated","stream","named","JSON","stringify","replicate","documented","declaration","cards","documents","locator","document","type","carded","card","fields","remove","leaving","durably","local","dropConversations","removed","changed","delete","publish","gap","add","keep","read","advances","sealed","keepMessages","readHistories","conversations","generations","one","starts","complete","asking","after","call","asked","following","keepHistory","from","generation","newest","reduce","top","some","withDraft","dropChatDraft","keepChatDraft","invoke","name","extra","surface","list","entries","agent","find","backlinks","backlink","path","field","Promise","resolve","create","input","send","pending","all","file","blob","current","interrupt","kill","cancel","write","discard","hydrate","stored","clear","reconcile","keys","catchUp","progress","reading","failed","reachable","size","reconnected","watch","deliver","key","then","catch","receive","event","note","noteId","running","flatMap","close"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction, ConversationCards, ConversationEvent, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, ModelRequest, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomNotReadable, RoomVersionAt, RoomVersionNotification, SelectedRooms, ServiceMode, ServiceModeSignal, TransportUncertainty, TypedSelection, WorkingNote, } from './adapter.js';
|
|
1
|
+
export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction, ConversationCards, ConversationEvent, ConversationHistories, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, ModelRequest, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomAttachment, RoomNotReadable, RoomVersionAt, RoomVersionNotification, SelectedRooms, ServiceMode, ServiceModeSignal, TransportUncertainty, TypedSelection, WorkingNote, } from './adapter.js';
|
|
2
2
|
export type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';
|
|
3
3
|
export type { ChatDraft, ChatDraftSurface, ConversationEntry, ConversationOptions, ConversationSurface, ConversationView, GrowingText, } from './conversation.js';
|
|
4
4
|
export type { ChatDraftFile, FileDeclaration } from './file.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EACV,OAAO,EACP,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EACV,OAAO,EACP,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/index.ts"],"sourcesContent":["export type {\n AcceptedMessage,\n ActionDeclaration,\n ActionRequest,\n ActionResult,\n Adapter,\n AdapterFailure,\n Authorization,\n BootstrapPage,\n BootstrapRequest,\n BootstrapResult,\n Capability,\n ChangeAuthor,\n ContractUnavailable,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationHistoryRequest,\n ConversationMessage,\n ConversationStream,\n DiscoverResult,\n DiscoveredRoom,\n Discovery,\n HistoryAuthor,\n HistoryRequest,\n HistoryResult,\n HistoryRetention,\n HistoryRevision,\n MdModelIdentity,\n ModelRequest,\n MutationRequest,\n MutationResult,\n PageToken,\n ProviderLimit,\n ProviderRefusal,\n RefreshPage,\n RefreshRequest,\n RefreshResult,\n Retention,\n RetryableRefusal,\n RevokedAuthorization,\n RoomNotReadable,\n RoomVersionAt,\n RoomVersionNotification,\n SelectedRooms,\n ServiceMode,\n ServiceModeSignal,\n TransportUncertainty,\n TypedSelection,\n WorkingNote,\n} from './adapter.js';\nexport type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';\nexport type {\n ChatDraft,\n ChatDraftSurface,\n ConversationEntry,\n ConversationOptions,\n ConversationSurface,\n ConversationView,\n GrowingText,\n} from './conversation.js';\nexport type { ChatDraftFile, FileDeclaration } from './file.js';\nexport type {\n AppRoom,\n AppSlot,\n AppSlotEntry,\n AppTypedSelection,\n ConnectionRefusal,\n ConnectionRefusalReason,\n HistoryQuery,\n MdRuntime,\n MdRuntimeOptions,\n PresentationSurface,\n RoomDraftSurface,\n RoomTypes,\n SavedRoomDraft,\n SaveResult,\n} from './connection.js';\nexport type { Observation } from './observation.js';\nexport type {\n AcceptedOutcome,\n AffectedState,\n CallResult,\n QueueEntry,\n Submission,\n SubmissionOutcome,\n} from './outcome.js';\nexport type {\n ChangedPart,\n FieldValue,\n ReturnReason,\n RoomDraft,\n RoomDraftCreation,\n RoomDraftParts,\n RoomDraftWrite,\n} from './room-draft.js';\nexport type { SaveRefusal } from './save.js';\nexport type {\n DocumentHit,\n DocumentPart,\n MessageHit,\n SearchRequest,\n SearchResult,\n} from './search.js';\nexport { changeBatchIdentity } from './identity.js';\nexport { createMdRuntime } from './connection.js';\nexport type { RuntimeShell } from './durability.js';\nexport type { AttentionEntry, SyncStatus } from './status.js';\nexport type {\n Backlink,\n Direction,\n DocumentQuery,\n DocumentResult,\n Filter,\n GroupQuery,\n GroupResult,\n Key,\n LocalQuery,\n OrderOptions,\n Predicate,\n QueryDocument,\n QueryGroup,\n QueryResult,\n Related,\n Select,\n Value,\n Where,\n} from './query.js';\n\nexport type {\n MdType,\n ModelIdentity,\n ModelSnapshot,\n ModelState,\n ModelResult,\n TypesResult,\n ValidationReceipt,\n} from './model.js';\nexport type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';\n"],"names":["changeBatchIdentity","createMdRuntime"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/index.ts"],"sourcesContent":["export type {\n AcceptedMessage,\n ActionDeclaration,\n ActionRequest,\n ActionResult,\n Adapter,\n AdapterFailure,\n Authorization,\n BootstrapPage,\n BootstrapRequest,\n BootstrapResult,\n Capability,\n ChangeAuthor,\n ContractUnavailable,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistories,\n ConversationHistoryPage,\n ConversationHistoryRequest,\n ConversationMessage,\n ConversationStream,\n DiscoverResult,\n DiscoveredRoom,\n Discovery,\n HistoryAuthor,\n HistoryRequest,\n HistoryResult,\n HistoryRetention,\n HistoryRevision,\n MdModelIdentity,\n ModelRequest,\n MutationRequest,\n MutationResult,\n PageToken,\n ProviderLimit,\n ProviderRefusal,\n RefreshPage,\n RefreshRequest,\n RefreshResult,\n Retention,\n RetryableRefusal,\n RevokedAuthorization,\n RoomAttachment,\n RoomNotReadable,\n RoomVersionAt,\n RoomVersionNotification,\n SelectedRooms,\n ServiceMode,\n ServiceModeSignal,\n TransportUncertainty,\n TypedSelection,\n WorkingNote,\n} from './adapter.js';\nexport type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';\nexport type {\n ChatDraft,\n ChatDraftSurface,\n ConversationEntry,\n ConversationOptions,\n ConversationSurface,\n ConversationView,\n GrowingText,\n} from './conversation.js';\nexport type { ChatDraftFile, FileDeclaration } from './file.js';\nexport type {\n AppRoom,\n AppSlot,\n AppSlotEntry,\n AppTypedSelection,\n ConnectionRefusal,\n ConnectionRefusalReason,\n HistoryQuery,\n MdRuntime,\n MdRuntimeOptions,\n PresentationSurface,\n RoomDraftSurface,\n RoomTypes,\n SavedRoomDraft,\n SaveResult,\n} from './connection.js';\nexport type { Observation } from './observation.js';\nexport type {\n AcceptedOutcome,\n AffectedState,\n CallResult,\n QueueEntry,\n Submission,\n SubmissionOutcome,\n} from './outcome.js';\nexport type {\n ChangedPart,\n FieldValue,\n ReturnReason,\n RoomDraft,\n RoomDraftCreation,\n RoomDraftParts,\n RoomDraftWrite,\n} from './room-draft.js';\nexport type { SaveRefusal } from './save.js';\nexport type {\n DocumentHit,\n DocumentPart,\n MessageHit,\n SearchRequest,\n SearchResult,\n} from './search.js';\nexport { changeBatchIdentity } from './identity.js';\nexport { createMdRuntime } from './connection.js';\nexport type { RuntimeShell } from './durability.js';\nexport type { AttentionEntry, SyncStatus } from './status.js';\nexport type {\n Backlink,\n Direction,\n DocumentQuery,\n DocumentResult,\n Filter,\n GroupQuery,\n GroupResult,\n Key,\n LocalQuery,\n OrderOptions,\n Predicate,\n QueryDocument,\n QueryGroup,\n QueryResult,\n Related,\n Select,\n Value,\n Where,\n} from './query.js';\n\nexport type {\n MdType,\n ModelIdentity,\n ModelSnapshot,\n ModelState,\n ModelResult,\n TypesResult,\n ValidationReceipt,\n} from './model.js';\nexport type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';\n"],"names":["changeBatchIdentity","createMdRuntime"],"mappings":"AA2GA,SAASA,mBAAmB,QAAQ,gBAAgB;AACpD,SAASC,eAAe,QAAQ,kBAAkB"}
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ModelResult } from './model.js';
|
|
2
|
-
import { type AcceptedMessage, type ActionResult, type Adapter, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type HeadChange, type MdModelIdentity, type ProviderLimit, type Retention, type RoomVersionNotification, type ServiceMode } from './adapter.js';
|
|
2
|
+
import { type AcceptedMessage, type ActionResult, type Adapter, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type HeadChange, type MdModelIdentity, type ProviderLimit, type Retention, type RoomAttachment, type RoomVersionNotification, type ServiceMode } from './adapter.js';
|
|
3
3
|
export type MemoryRoom = DiscoveredRoom & {
|
|
4
4
|
model?: ModelResult;
|
|
5
5
|
selectionModel?: ModelResult;
|
|
@@ -7,6 +7,7 @@ export type MemoryRoom = DiscoveredRoom & {
|
|
|
7
7
|
revisions?: Readonly<Record<string, string>>;
|
|
8
8
|
changes?: Readonly<Record<string, HeadChange>>;
|
|
9
9
|
binaryTargets?: readonly string[];
|
|
10
|
+
attachments?: readonly RoomAttachment[];
|
|
10
11
|
};
|
|
11
12
|
export type MemoryConversation = {
|
|
12
13
|
conversation: string;
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAEL,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAItB,KAAK,cAAc,EACnB,KAAK,UAAU,EAGf,KAAK,eAAe,EAGpB,KAAK,aAAa,EAGlB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAmBtB,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC,CAAC;CAC9D,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAC7C,gBAAgB,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAAC;IACrE,MAAM,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,iBAAiB,CAAC,YAAY,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC/D,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnD,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,aAAa,IAAI,SAAS,MAAM,EAAE,CAAC;IACnC,uBAAuB,IAAI,SAAS,MAAM,EAAE,CAAC;CAC9C,CAAC;AA+BF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAkZrF"}
|
package/dist/memory.js
CHANGED
|
@@ -117,6 +117,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
117
117
|
...targets
|
|
118
118
|
]),
|
|
119
119
|
binaryTargets: targets,
|
|
120
|
+
...from === 0 && room.attachments !== undefined ? {
|
|
121
|
+
attachments: room.attachments
|
|
122
|
+
} : {},
|
|
120
123
|
...next < paths.length ? {
|
|
121
124
|
pageToken: String(next)
|
|
122
125
|
} : {}
|
|
@@ -142,6 +145,8 @@ export function createMemoryAdapter(options = {}) {
|
|
|
142
145
|
const targets = opening ? [
|
|
143
146
|
...currentTargets
|
|
144
147
|
].filter((target)=>!previousTargets.has(target) || headMoved(target)) : [];
|
|
148
|
+
const attachments = room.attachments ?? [];
|
|
149
|
+
const declared = opening && JSON.stringify(attachments) !== JSON.stringify(from.attachments ?? []);
|
|
145
150
|
return {
|
|
146
151
|
kind: 'net-advancement',
|
|
147
152
|
roomVersion: room.roomVersion,
|
|
@@ -158,23 +163,46 @@ export function createMemoryAdapter(options = {}) {
|
|
|
158
163
|
...previousTargets
|
|
159
164
|
].filter((target)=>!currentTargets.has(target) && !(target in current))
|
|
160
165
|
].sort() : [],
|
|
166
|
+
...declared ? {
|
|
167
|
+
attachments
|
|
168
|
+
} : {},
|
|
161
169
|
...pageToken === undefined ? {} : {
|
|
162
170
|
pageToken
|
|
163
171
|
}
|
|
164
172
|
};
|
|
165
173
|
}
|
|
166
|
-
function
|
|
174
|
+
function pageOf(conversation, after) {
|
|
167
175
|
const messages = conversation.messages ?? [];
|
|
168
176
|
const first = typeof after === 'string' ? messages.findIndex((message)=>message.position > after) : 0;
|
|
169
177
|
const from = first === -1 ? messages.length : first;
|
|
170
178
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
171
179
|
const last = page.at(-1);
|
|
172
|
-
|
|
180
|
+
return {
|
|
181
|
+
conversation: conversation.conversation,
|
|
173
182
|
messages: page,
|
|
174
183
|
...last !== undefined && from + page.length < messages.length ? {
|
|
175
184
|
next: last.position
|
|
176
185
|
} : {}
|
|
177
186
|
};
|
|
187
|
+
}
|
|
188
|
+
function historiesOf(input) {
|
|
189
|
+
const asked = input?.conversations;
|
|
190
|
+
if (!Array.isArray(asked)) return {
|
|
191
|
+
kind: 'rejected',
|
|
192
|
+
code: 'invalid_request',
|
|
193
|
+
fields: {}
|
|
194
|
+
};
|
|
195
|
+
const histories = [];
|
|
196
|
+
for (const entry of asked){
|
|
197
|
+
const conversation = typeof entry.conversation === 'string' ? scripted.get(entry.conversation) : undefined;
|
|
198
|
+
if (conversation === undefined) continue;
|
|
199
|
+
const outcome = conversation.outcomes?.['conversation.history'];
|
|
200
|
+
if (outcome !== undefined) return outcome;
|
|
201
|
+
histories.push(pageOf(conversation, entry.after));
|
|
202
|
+
}
|
|
203
|
+
const result = {
|
|
204
|
+
histories
|
|
205
|
+
};
|
|
178
206
|
return {
|
|
179
207
|
kind: 'action',
|
|
180
208
|
result
|
|
@@ -183,6 +211,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
183
211
|
function conversationAction(request) {
|
|
184
212
|
const name = request.name;
|
|
185
213
|
const input = request.input ?? {};
|
|
214
|
+
if (name === 'conversation.history') return historiesOf(request.input);
|
|
186
215
|
if (name === 'conversation.create') {
|
|
187
216
|
issued += 1;
|
|
188
217
|
const conversation = `conversation-${issued}`;
|
|
@@ -209,7 +238,6 @@ export function createMemoryAdapter(options = {}) {
|
|
|
209
238
|
}
|
|
210
239
|
const outcome = conversation.outcomes?.[name];
|
|
211
240
|
if (outcome !== undefined) return outcome;
|
|
212
|
-
if (name === 'conversation.history') return historyOf(conversation, input.after);
|
|
213
241
|
if (name === 'conversation.send') {
|
|
214
242
|
issued += 1;
|
|
215
243
|
const turn = `turn-${issued}`;
|