@agentshouse/mdruntime 0.1.0-alpha.24 → 0.1.0-alpha.26
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 +61 -4
- package/dist/change-set.d.ts +4 -11
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +8 -16
- package/dist/change-set.js.map +1 -1
- package/dist/client.d.ts +9 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -2
- package/dist/client.js.map +1 -1
- package/dist/collection.d.ts +0 -2
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +0 -5
- package/dist/collection.js.map +1 -1
- package/dist/connection.d.ts +9 -5
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +67 -67
- package/dist/connection.js.map +1 -1
- package/dist/conversation.d.ts +7 -4
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +29 -6
- package/dist/conversation.js.map +1 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +2 -0
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +8 -0
- package/dist/paths.js.map +1 -1
- package/dist/query.d.ts +206 -10
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +463 -14
- package/dist/query.js.map +1 -1
- package/dist/read-side.d.ts +13 -0
- package/dist/read-side.d.ts.map +1 -0
- package/dist/read-side.js +393 -0
- package/dist/read-side.js.map +1 -0
- package/dist/rows.d.ts +39 -0
- package/dist/rows.d.ts.map +1 -0
- package/dist/rows.js +85 -0
- package/dist/rows.js.map +1 -0
- package/dist/search.d.ts +61 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +155 -0
- package/dist/search.js.map +1 -0
- package/dist/wire.d.ts +2 -2
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +2 -1
- package/dist/wire.js.map +1 -1
- package/package.json +3 -2
package/dist/conversation.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import type { QueryDocument } from '@agentshouse/query';
|
|
2
1
|
import type { ConversationAction, ConversationCards, ConversationEvent, ConversationMessage, ConversationStream } from './adapter.js';
|
|
3
2
|
import { type ChangeSet } from './change-set.js';
|
|
4
3
|
import { type ChatDraftFile } from './file.js';
|
|
5
4
|
import type { CallResult } from './outcome.js';
|
|
5
|
+
import type { DocumentResult, QueryDocument } from './query.js';
|
|
6
|
+
import type { SearchedMessage } from './search.js';
|
|
6
7
|
import type { CycleProgress } from './status.js';
|
|
7
8
|
import type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';
|
|
8
9
|
export type ConversationEntry = {
|
|
9
10
|
conversation: string;
|
|
10
|
-
card: QueryDocument
|
|
11
|
-
agent: QueryDocument | null;
|
|
11
|
+
card: Required<QueryDocument>;
|
|
12
|
+
agent: Required<QueryDocument> | null;
|
|
12
13
|
};
|
|
13
14
|
export type GrowingText = {
|
|
14
15
|
turn: string;
|
|
@@ -45,7 +46,7 @@ export type ChatDraftSurface = {
|
|
|
45
46
|
};
|
|
46
47
|
export type ConversationDependencies = {
|
|
47
48
|
cards(): ConversationCards | undefined;
|
|
48
|
-
documents():
|
|
49
|
+
documents(locator: string): Promise<DocumentResult>;
|
|
49
50
|
call(name: ConversationAction, input: unknown): Promise<CallResult>;
|
|
50
51
|
durably<T>(work: (local: RuntimeStore) => Promise<T>): Promise<T>;
|
|
51
52
|
stream(): ConversationStream | undefined;
|
|
@@ -63,6 +64,8 @@ export type ConversationStore = {
|
|
|
63
64
|
observe(conversation: string, options: ConversationOptions, notify: (view: ConversationView) => void): () => void;
|
|
64
65
|
changed(set: ChangeSet): void;
|
|
65
66
|
receive(event: ConversationEvent): void;
|
|
67
|
+
messages(): readonly SearchedMessage[];
|
|
68
|
+
message(conversation: string, identity: string): SearchedMessage | null;
|
|
66
69
|
close(): void;
|
|
67
70
|
};
|
|
68
71
|
export declare function createConversationStore(deps: ConversationDependencies): ConversationStore;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EAEjB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAyB,KAAK,SAAS,EAAsB,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC9B,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACzC,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,IAAI,OAAO,CAAC,SAAS,iBAAiB,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrF,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnE,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,KAAK,IAAI,iBAAiB,GAAG,SAAS,CAAC;IACvC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,kBAAkB,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,MAAM,IAAI,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,EAAE,mBAAmB,CAAC;IAC7B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,OAAO,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,EAAE,MAAM,EAAE,SAAS,eAAe,EAAE,GAAG,IAAI,CAAC;IACrF,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO,IAAI,OAAO,CAAC;IACnB,WAAW,IAAI,IAAI,CAAC;IACpB,OAAO,CACL,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GACvC,MAAM,IAAI,CAAC;IACd,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,QAAQ,IAAI,SAAS,eAAe,EAAE,CAAC;IACvC,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;IACxE,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAmFF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CAuazF"}
|
package/dist/conversation.js
CHANGED
|
@@ -138,12 +138,18 @@ export function createConversationStore(deps) {
|
|
|
138
138
|
handedReplicated = named;
|
|
139
139
|
stream.replicate(held);
|
|
140
140
|
}
|
|
141
|
+
async function documented() {
|
|
142
|
+
const declaration = deps.cards();
|
|
143
|
+
if (declaration === undefined) return [];
|
|
144
|
+
const { documents } = await deps.documents(declaration.locator);
|
|
145
|
+
return documents;
|
|
146
|
+
}
|
|
141
147
|
function carded(documents) {
|
|
142
148
|
const declaration = deps.cards();
|
|
143
149
|
if (declaration === undefined) return [];
|
|
144
150
|
const cards = [];
|
|
145
151
|
for (const card of documents){
|
|
146
|
-
if (card.
|
|
152
|
+
if (card.type !== declaration.type) continue;
|
|
147
153
|
const identity = card.fields[declaration.identity];
|
|
148
154
|
if (typeof identity === 'string') cards.push({
|
|
149
155
|
conversation: identity,
|
|
@@ -282,17 +288,17 @@ export function createConversationStore(deps) {
|
|
|
282
288
|
});
|
|
283
289
|
}
|
|
284
290
|
const surface = {
|
|
285
|
-
list () {
|
|
291
|
+
async list () {
|
|
286
292
|
const declaration = deps.cards();
|
|
287
|
-
if (declaration === undefined) return
|
|
288
|
-
const documents =
|
|
293
|
+
if (declaration === undefined) return [];
|
|
294
|
+
const documents = await documented();
|
|
289
295
|
const entries = carded(documents).map(({ conversation, card })=>({
|
|
290
296
|
conversation,
|
|
291
297
|
card,
|
|
292
298
|
agent: documents.find((document)=>document.backlinks.some((backlink)=>backlink.path === card.path && backlink.field === declaration.agent)) ?? null
|
|
293
299
|
}));
|
|
294
300
|
entries.sort((left, right)=>left.conversation < right.conversation ? -1 : 1);
|
|
295
|
-
return
|
|
301
|
+
return entries;
|
|
296
302
|
},
|
|
297
303
|
async read (conversation, options = {}) {
|
|
298
304
|
const limit = limitOf(options);
|
|
@@ -400,7 +406,7 @@ export function createConversationStore(deps) {
|
|
|
400
406
|
for (const record of stored)drafts.set(record.conversation, record);
|
|
401
407
|
},
|
|
402
408
|
async reconcile () {
|
|
403
|
-
const named = new Set(carded(
|
|
409
|
+
const named = new Set(carded(await documented()).map((entry)=>entry.conversation));
|
|
404
410
|
const leaving = [
|
|
405
411
|
...new Set([
|
|
406
412
|
...replicated,
|
|
@@ -495,6 +501,23 @@ export function createConversationStore(deps) {
|
|
|
495
501
|
if (arriving === null || !replicated.has(conversation)) return;
|
|
496
502
|
void keep(conversation, arriving).catch(()=>{});
|
|
497
503
|
},
|
|
504
|
+
messages () {
|
|
505
|
+
return [
|
|
506
|
+
...messages
|
|
507
|
+
].flatMap(([conversation, held])=>held.map(({ identity, text })=>({
|
|
508
|
+
conversation,
|
|
509
|
+
identity,
|
|
510
|
+
text
|
|
511
|
+
})));
|
|
512
|
+
},
|
|
513
|
+
message (conversation, identity) {
|
|
514
|
+
const held = messages.get(conversation)?.find((message)=>message.identity === identity);
|
|
515
|
+
return held === undefined ? null : {
|
|
516
|
+
conversation,
|
|
517
|
+
identity,
|
|
518
|
+
text: held.text
|
|
519
|
+
};
|
|
520
|
+
},
|
|
498
521
|
close () {
|
|
499
522
|
views.clear();
|
|
500
523
|
growing.clear();
|
package/dist/conversation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/conversation.ts"],"sourcesContent":["import type { QueryDocument } from '@agentshouse/query';\nimport type {\n AcceptedMessage,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationMessage,\n ConversationStream,\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 { CycleProgress } from './status.js';\nimport type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';\n\nexport type ConversationEntry = {\n conversation: string;\n card: QueryDocument;\n agent: 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 summary: unknown;\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(): readonly QueryDocument[];\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 observe(\n conversation: string,\n options: ConversationOptions,\n notify: (view: ConversationView) => void,\n ): () => void;\n changed(set: ChangeSet): void;\n receive(event: ConversationEvent): void;\n close(): void;\n};\n\ntype Watcher = {\n notify: (view: ConversationView) => void;\n ready: boolean;\n};\n\ntype Sending = { draft: ChatDraftRecord };\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 growing = new Map<string, GrowingText>();\n const summaries = new Map<string, unknown>();\n const views = new Map<string, SharedView>();\n let replicated: ReadonlySet<string> = new Set();\n let handedReplicated: string | undefined;\n let handedViewed: string | undefined;\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 return {\n conversation,\n messages: shown.map(({ identity, turn, text, message }) => ({\n identity,\n turn,\n text,\n message: structuredClone(message),\n })),\n growingText: growing.get(conversation) ?? null,\n summary: structuredClone(summaries.get(conversation) ?? null),\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 viewed(): readonly string[] {\n return [...new Set([...views.values()].map((view) => view.conversation))].sort();\n }\n\n function handViewed() {\n const stream = deps.stream();\n if (stream === undefined) return;\n const open = viewed();\n const named = JSON.stringify(open);\n if (named === handedViewed) return;\n handedViewed = named;\n stream.view(open);\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 function carded(\n documents: readonly QueryDocument[],\n ): readonly { conversation: string; card: QueryDocument }[] {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const cards: { conversation: string; card: QueryDocument }[] = [];\n for (const card of documents) {\n if (card.room !== declaration.locator || 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 (\n messages.has(conversation) ||\n drafts.has(conversation) ||\n growing.has(conversation) ||\n summaries.has(conversation)\n ) {\n changed.push(conversation);\n }\n messages.delete(conversation);\n reads.delete(conversation);\n drafts.delete(conversation);\n behind.delete(conversation);\n growing.delete(conversation);\n summaries.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 if (growing.get(conversation)?.turn === message.turn) growing.delete(conversation);\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 const growingTurn = growing.get(conversation)?.turn;\n if (arriving.some((message) => message.turn === growingTurn)) growing.delete(conversation);\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 list() {\n const declaration = deps.cards();\n if (declaration === undefined) return Promise.resolve([]);\n const documents = deps\n .documents()\n .filter((document) => document.room === declaration.locator);\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 Promise.resolve(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(deps.documents()).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 observe(conversation, options, notify) {\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, ready: false };\n view.watchers.add(watcher);\n handViewed();\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 if (!viewed().includes(conversation)) {\n growing.delete(conversation);\n summaries.delete(conversation);\n }\n handViewed();\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 return;\n }\n if (event.kind === 'growing-text') {\n if (!viewed().includes(conversation)) return;\n growing.set(conversation, { turn: event.turn, text: event.text });\n emit(conversation);\n return;\n }\n if (event.kind === 'session-summary') {\n if (!viewed().includes(conversation)) return;\n summaries.set(conversation, structuredClone(event.summary));\n emit(conversation);\n return;\n }\n const arriving = acceptedMessage(event.message);\n if (arriving === null || !replicated.has(conversation)) return;\n void keep(conversation, arriving).catch(() => {});\n },\n close() {\n views.clear();\n growing.clear();\n summaries.clear();\n },\n };\n}\n"],"names":["conversationChangeSet","declaredFile","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","options","limit","Number","isInteger","Error","String","createConversationStore","deps","reads","drafts","sending","behind","Set","gaps","growing","summaries","views","replicated","handedReplicated","handedViewed","viewOf","conversation","get","shown","slice","Math","max","length","draft","growingText","summary","chatDraft","files","emit","closed","view","ready","watchers","filter","watcher","notify","viewed","handViewed","stream","open","named","JSON","stringify","handReplicated","replicate","carded","documents","declaration","cards","card","room","locator","type","fields","remove","leaving","durably","local","dropConversations","removed","changed","has","delete","publish","gap","add","keep","read","advances","sealed","keepMessages","readHistory","generation","from","after","call","page","newest","reduce","top","some","growingTurn","withDraft","following","dropChatDraft","keepChatDraft","invoke","name","extra","surface","list","Promise","resolve","document","entries","agent","find","backlinks","backlink","path","field","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","observe","key","then","catch","includes","conversations","receive","event","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} 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 summary: unknown;\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 observe(\n conversation: string,\n options: ConversationOptions,\n notify: (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 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 growing = new Map<string, GrowingText>();\n const summaries = new Map<string, unknown>();\n const views = new Map<string, SharedView>();\n let replicated: ReadonlySet<string> = new Set();\n let handedReplicated: string | undefined;\n let handedViewed: string | undefined;\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 return {\n conversation,\n messages: shown.map(({ identity, turn, text, message }) => ({\n identity,\n turn,\n text,\n message: structuredClone(message),\n })),\n growingText: growing.get(conversation) ?? null,\n summary: structuredClone(summaries.get(conversation) ?? null),\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 viewed(): readonly string[] {\n return [...new Set([...views.values()].map((view) => view.conversation))].sort();\n }\n\n function handViewed() {\n const stream = deps.stream();\n if (stream === undefined) return;\n const open = viewed();\n const named = JSON.stringify(open);\n if (named === handedViewed) return;\n handedViewed = named;\n stream.view(open);\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 as readonly Required<QueryDocument>[];\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 (\n messages.has(conversation) ||\n drafts.has(conversation) ||\n growing.has(conversation) ||\n summaries.has(conversation)\n ) {\n changed.push(conversation);\n }\n messages.delete(conversation);\n reads.delete(conversation);\n drafts.delete(conversation);\n behind.delete(conversation);\n growing.delete(conversation);\n summaries.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 if (growing.get(conversation)?.turn === message.turn) growing.delete(conversation);\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 const growingTurn = growing.get(conversation)?.turn;\n if (arriving.some((message) => message.turn === growingTurn)) growing.delete(conversation);\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 observe(conversation, options, notify) {\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, ready: false };\n view.watchers.add(watcher);\n handViewed();\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 if (!viewed().includes(conversation)) {\n growing.delete(conversation);\n summaries.delete(conversation);\n }\n handViewed();\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 return;\n }\n if (event.kind === 'growing-text') {\n if (!viewed().includes(conversation)) return;\n growing.set(conversation, { turn: event.turn, text: event.text });\n emit(conversation);\n return;\n }\n if (event.kind === 'session-summary') {\n if (!viewed().includes(conversation)) return;\n summaries.set(conversation, structuredClone(event.summary));\n emit(conversation);\n return;\n }\n const arriving = acceptedMessage(event.message);\n if (arriving === null || !replicated.has(conversation)) return;\n void keep(conversation, arriving).catch(() => {});\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 growing.clear();\n summaries.clear();\n },\n };\n}\n"],"names":["conversationChangeSet","declaredFile","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","options","limit","Number","isInteger","Error","String","createConversationStore","deps","reads","drafts","sending","behind","Set","gaps","growing","summaries","views","replicated","handedReplicated","handedViewed","viewOf","conversation","get","shown","slice","Math","max","length","draft","growingText","summary","chatDraft","files","emit","closed","view","ready","watchers","filter","watcher","notify","viewed","handViewed","stream","open","named","JSON","stringify","handReplicated","replicate","documented","declaration","cards","documents","locator","carded","card","type","fields","remove","leaving","durably","local","dropConversations","removed","changed","has","delete","publish","gap","add","keep","read","advances","sealed","keepMessages","readHistory","generation","from","after","call","page","newest","reduce","top","some","growingTurn","withDraft","following","dropChatDraft","keepChatDraft","invoke","name","extra","surface","list","entries","agent","find","document","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","observe","key","then","catch","includes","conversations","receive","event","flatMap","close"],"mappings":"AASA,SAASA,qBAAqB,QAA4C,kBAAkB;AAC5F,SAASC,YAAY,QAA4B,YAAY;AA0F7D,SAASC,QAAQC,IAAqB,EAAEC,KAAsB;IAC5D,IAAID,KAAKE,QAAQ,KAAKD,MAAMC,QAAQ,EAAE,OAAOF,KAAKE,QAAQ,GAAGD,MAAMC,QAAQ,GAAG,CAAC,IAAI;IACnF,IAAIF,KAAKG,QAAQ,KAAKF,MAAME,QAAQ,EAAE,OAAOH,KAAKG,QAAQ,GAAGF,MAAME,QAAQ,GAAG,CAAC,IAAI;IACnF,OAAO;AACT;AAEA,SAASC,OACPC,IAAgC,EAChCC,QAAoC;IAEpC,MAAMC,aAAa,IAAIC,IAAIH,KAAKI,GAAG,CAAC,CAACC,UAAY;YAACA,QAAQP,QAAQ;YAAEO;SAAQ;IAC5E,KAAK,MAAMA,WAAWJ,SAAUC,WAAWI,GAAG,CAACD,QAAQP,QAAQ,EAAEO;IACjE,OAAO;WAAIH,WAAWK,MAAM;KAAG,CAACC,IAAI,CAACd;AACvC;AAEA,SAASe,gBAAgBC,KAAc;IACrC,IAAI,OAAOA,UAAU,YAAYA,UAAU,MAAM,OAAO;IACxD,MAAMC,SAASD;IACf,IACE,OAAOC,OAAOb,QAAQ,KAAK,YAC3B,OAAOa,OAAOC,IAAI,KAAK,YACvB,OAAOD,OAAOd,QAAQ,KAAK,YAC3B,OAAOc,OAAOE,IAAI,KAAK,UACvB;QACA,OAAO;IACT;IACA,OAAO;QACLf,UAAUa,OAAOb,QAAQ;QACzBc,MAAMD,OAAOC,IAAI;QACjBf,UAAUc,OAAOd,QAAQ;QACzBgB,MAAMF,OAAOE,IAAI;QACjBR,SAASS,gBAAgBH,OAAON,OAAO;IACzC;AACF;AAEA,SAASU,YAAYC,MAAkB;IACrC,IAAIA,OAAOC,IAAI,KAAK,UAAU,OAAO;IACrC,MAAMC,SAASF,OAAOA,MAAM;IAC5B,IAAI,OAAOE,WAAW,YAAYA,WAAW,MAAM,OAAO;IAC1D,MAAMP,SAASO;IACf,IAAI,CAACC,MAAMC,OAAO,CAACT,OAAOU,QAAQ,GAAG,OAAO;IAC5C,IAAIV,OAAOW,IAAI,KAAKC,aAAa,OAAOZ,OAAOW,IAAI,KAAK,UAAU,OAAO;IACzE,MAAMD,WAA8B,EAAE;IACtC,KAAK,MAAMG,SAASb,OAAOU,QAAQ,CAAE;QACnC,MAAMhB,UAAUI,gBAAgBe;QAChC,IAAInB,YAAY,MAAM,OAAO;QAC7BgB,SAASI,IAAI,CAACpB;IAChB;IACA,OAAO;QAAEgB;QAAU,GAAIV,OAAOW,IAAI,KAAKC,YAAY,CAAC,IAAI;YAAED,MAAMX,OAAOW,IAAI;QAAC,CAAC;IAAE;AACjF;AAEA,SAASI,OAAOV,MAAkB;IAChC,IAAIA,OAAOC,IAAI,KAAK,UAAU,OAAO;IACrC,MAAMC,SAASF,OAAOA,MAAM;IAC5B,IAAI,OAAOE,WAAW,YAAYA,WAAW,MAAM,OAAO;IAC1D,MAAMP,SAASO;IACf,OAAO,OAAOP,OAAOC,IAAI,KAAK,WAAWD,OAAOC,IAAI,GAAG;AACzD;AAEA,SAASe,QAAQC,OAA4B;IAC3C,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,IAAIC,UAAUN,WAAW,OAAOA;IAChC,IAAI,CAACO,OAAOC,SAAS,CAACF,UAAUA,QAAQ,GAAG;QACzC,MAAM,IAAIG,MAAM,CAAC,uDAAuD,EAAEC,OAAOJ,QAAQ;IAC3F;IACA,OAAOA;AACT;AAEA,OAAO,SAASK,wBAAwBC,IAA8B;IACpE,MAAMd,WAAW,IAAIlB;IACrB,MAAMiC,QAAQ,IAAIjC;IAClB,MAAMkC,SAAS,IAAIlC;IACnB,MAAMmC,UAAU,IAAInC;IACpB,MAAMoC,SAAS,IAAIC;IACnB,MAAMC,OAAO,IAAItC;IACjB,MAAMuC,UAAU,IAAIvC;IACpB,MAAMwC,YAAY,IAAIxC;IACtB,MAAMyC,QAAQ,IAAIzC;IAClB,IAAI0C,aAAkC,IAAIL;IAC1C,IAAIM;IACJ,IAAIC;IAEJ,SAASC,OAAOC,YAAoB,EAAEpB,KAAyB;QAC7D,MAAM7B,OAAOqB,SAAS6B,GAAG,CAACD,iBAAiB,EAAE;QAC7C,MAAME,QAAQtB,UAAUN,YAAYvB,OAAOA,KAAKoD,KAAK,CAACC,KAAKC,GAAG,CAAC,GAAGtD,KAAKuD,MAAM,GAAG1B;QAChF,MAAM2B,QAAQnB,OAAOa,GAAG,CAACD;QACzB,OAAO;YACLA;YACA5B,UAAU8B,MAAM/C,GAAG,CAAC,CAAC,EAAEN,QAAQ,EAAEc,IAAI,EAAEC,IAAI,EAAER,OAAO,EAAE,GAAM,CAAA;oBAC1DP;oBACAc;oBACAC;oBACAR,SAASS,gBAAgBT;gBAC3B,CAAA;YACAoD,aAAaf,QAAQQ,GAAG,CAACD,iBAAiB;YAC1CS,SAAS5C,gBAAgB6B,UAAUO,GAAG,CAACD,iBAAiB;YACxDU,WACEH,UAAUjC,aAAaiC,MAAM5C,IAAI,KAAK,QAAQ0B,QAAQY,GAAG,CAACD,eAAeO,UAAUA,QAC/E,OACA;gBAAE3C,MAAM2C,MAAM3C,IAAI;gBAAE+C,OAAO;uBAAIJ,MAAMI,KAAK;iBAAC;YAAC;QACpD;IACF;IAEA,SAASC,KAAKZ,YAAoB;QAChC,IAAId,KAAK2B,MAAM,IAAI;QACnB,KAAK,MAAMC,QAAQnB,MAAMrC,MAAM,GAAI;YACjC,IAAIwD,KAAKd,YAAY,KAAKA,cAAc;YACxC,MAAMe,QAAQ;mBAAID,KAAKE,QAAQ;aAAC,CAACC,MAAM,CAAC,CAACC,UAAYA,QAAQH,KAAK;YAClE,IAAIA,MAAMT,MAAM,KAAK,GAAG;YACxB,MAAM7C,QAAQsC,OAAOC,cAAcc,KAAKlC,KAAK;YAC7C,KAAK,MAAMsC,WAAWH,MAAOG,QAAQC,MAAM,CAAC1D;QAC9C;IACF;IAEA,SAAS2D;QACP,OAAO;eAAI,IAAI7B,IAAI;mBAAII,MAAMrC,MAAM;aAAG,CAACH,GAAG,CAAC,CAAC2D,OAASA,KAAKd,YAAY;SAAG,CAACzC,IAAI;IAChF;IAEA,SAAS8D;QACP,MAAMC,SAASpC,KAAKoC,MAAM;QAC1B,IAAIA,WAAWhD,WAAW;QAC1B,MAAMiD,OAAOH;QACb,MAAMI,QAAQC,KAAKC,SAAS,CAACH;QAC7B,IAAIC,UAAU1B,cAAc;QAC5BA,eAAe0B;QACfF,OAAOR,IAAI,CAACS;IACd;IAEA,SAASI;QACP,MAAML,SAASpC,KAAKoC,MAAM;QAC1B,IAAIA,WAAWhD,WAAW;QAC1B,MAAMvB,OAAO;eAAI6C;SAAW,CAACrC,IAAI;QACjC,MAAMiE,QAAQC,KAAKC,SAAS,CAAC3E;QAC7B,IAAIyE,UAAU3B,kBAAkB;QAChCA,mBAAmB2B;QACnBF,OAAOM,SAAS,CAAC7E;IACnB;IAEA,eAAe8E;QACb,MAAMC,cAAc5C,KAAK6C,KAAK;QAC9B,IAAID,gBAAgBxD,WAAW,OAAO,EAAE;QACxC,MAAM,EAAE0D,SAAS,EAAE,GAAG,MAAM9C,KAAK8C,SAAS,CAACF,YAAYG,OAAO;QAC9D,OAAOD;IACT;IAEA,SAASE,OACPF,SAA6C;QAE7C,MAAMF,cAAc5C,KAAK6C,KAAK;QAC9B,IAAID,gBAAgBxD,WAAW,OAAO,EAAE;QACxC,MAAMyD,QAAmE,EAAE;QAC3E,KAAK,MAAMI,QAAQH,UAAW;YAC5B,IAAIG,KAAKC,IAAI,KAAKN,YAAYM,IAAI,EAAE;YACpC,MAAMvF,WAAWsF,KAAKE,MAAM,CAACP,YAAYjF,QAAQ,CAAC;YAClD,IAAI,OAAOA,aAAa,UAAUkF,MAAMvD,IAAI,CAAC;gBAAEwB,cAAcnD;gBAAUsF;YAAK;QAC9E;QACA,OAAOJ;IACT;IAEA,eAAeO,OAAOC,OAA0B;QAC9C,MAAMrD,KAAKsD,OAAO,CAAC,OAAOC;YACxB,MAAMA,MAAMC,iBAAiB,CAACH;YAC9B,MAAMI,UAA2B,EAAE;YACnC,MAAMC,UAAoB,EAAE;YAC5B,KAAK,MAAM5C,gBAAgBuC,QAAS;gBAClC,KAAK,MAAMnF,WAAWgB,SAAS6B,GAAG,CAACD,iBAAiB,EAAE,CAAE;oBACtD2C,QAAQnE,IAAI,CAAC;wBAAEwB;wBAAcnD,UAAUO,QAAQP,QAAQ;oBAAC;gBAC1D;gBACA,IACEuB,SAASyE,GAAG,CAAC7C,iBACbZ,OAAOyD,GAAG,CAAC7C,iBACXP,QAAQoD,GAAG,CAAC7C,iBACZN,UAAUmD,GAAG,CAAC7C,eACd;oBACA4C,QAAQpE,IAAI,CAACwB;gBACf;gBACA5B,SAAS0E,MAAM,CAAC9C;gBAChBb,MAAM2D,MAAM,CAAC9C;gBACbZ,OAAO0D,MAAM,CAAC9C;gBACdV,OAAOwD,MAAM,CAAC9C;gBACdP,QAAQqD,MAAM,CAAC9C;gBACfN,UAAUoD,MAAM,CAAC9C;YACnB;YACA,IAAI4C,QAAQtC,MAAM,GAAG,GAAGpB,KAAK6D,OAAO,CAACxG,sBAAsBoG,SAASC;QACtE;IACF;IAEA,SAASI,IAAIhD,YAAoB;QAC/BR,KAAKnC,GAAG,CAAC2C,cAAc,AAACR,CAAAA,KAAKS,GAAG,CAACD,iBAAiB,CAAA,IAAK;QACvDV,OAAO2D,GAAG,CAACjD;IACb;IAEA,SAASkD,KAAKlD,YAAoB,EAAE5C,OAAwB;QAC1D,OAAO8B,KAAKsD,OAAO,CAAC,OAAOC;YACzB,IAAI,CAAC7C,WAAWiD,GAAG,CAAC7C,eAAe;YACnC,MAAMmD,OAAOhE,MAAMc,GAAG,CAACD;YACvB,MAAMoD,WACJD,SAAS7E,aACT,CAACgB,OAAOuD,GAAG,CAAC7C,iBACXmD,CAAAA,SAAS,QAAQ/F,QAAQR,QAAQ,GAAGuG,IAAG;YAC1C,MAAME,SAASjE,OAAOa,GAAG,CAACD,eAAerC,SAASP,QAAQO,IAAI;YAC9D,MAAM8E,MAAMa,YAAY,CAAC;gBACvBtD;gBACA5B,UAAU;oBAAChB;iBAAQ;gBACnB,GAAIgG,WAAW;oBAAED,MAAM/F,QAAQR,QAAQ;gBAAC,IAAI,CAAC,CAAC;gBAC9CyG;YACF;YACAjF,SAASf,GAAG,CAAC2C,cAAclD,OAAOsB,SAAS6B,GAAG,CAACD,iBAAiB,EAAE,EAAE;gBAAC5C;aAAQ;YAC7E,IAAIgG,UAAUjE,MAAM9B,GAAG,CAAC2C,cAAc5C,QAAQR,QAAQ;YACtD,IAAIyG,QAAQjE,OAAO0D,MAAM,CAAC9C;YAC1B,IAAIP,QAAQQ,GAAG,CAACD,eAAerC,SAASP,QAAQO,IAAI,EAAE8B,QAAQqD,MAAM,CAAC9C;YACrEd,KAAK6D,OAAO,CACVxG,sBAAsB;gBAAC;oBAAEyD;oBAAcnD,UAAUO,QAAQP,QAAQ;gBAAC;aAAE,EAAE;gBAACmD;aAAa;QAExF;IACF;IAEA,eAAeuD,YAAYvD,YAAoB;QAC7C,MAAMwD,aAAahE,KAAKS,GAAG,CAACD,iBAAiB;QAC7C,MAAMyD,OAAOtE,MAAMc,GAAG,CAACD;QACvB,MAAMhD,WAA8B,EAAE;QACtC,IAAI0G,QAAQD,QAAQnF;QACpB,OAAS;YACP,MAAMP,SAAS,MAAMmB,KAAKyE,IAAI,CAAC,wBAAwB;gBACrD3D;gBACA,GAAI0D,UAAUpF,YAAY,CAAC,IAAI;oBAAEoF;gBAAM,CAAC;YAC1C;YACA,MAAME,OAAO9F,YAAYC;YACzB,IAAI6F,SAAS,MAAM,OAAO7F;YAC1Bf,SAASwB,IAAI,IAAIoF,KAAKxF,QAAQ;YAC9B,IAAIwF,KAAKvF,IAAI,KAAKC,WAAW;YAC7BoF,QAAQE,KAAKvF,IAAI;QACnB;QACA,MAAMa,KAAKsD,OAAO,CAAC,OAAOC;YACxB,IAAI,CAAC7C,WAAWiD,GAAG,CAAC7C,eAAe;YACnC,MAAM6D,SAAS7G,SAAS8G,MAAM,CAC5B,CAACC,KAAK3G,UAAa2G,QAAQ,QAAQ3G,QAAQR,QAAQ,GAAGmH,MAAM3G,QAAQR,QAAQ,GAAGmH,KAC/EN,QAAQ;YAEV,MAAM9F,OAAOyB,OAAOa,GAAG,CAACD,eAAerC;YACvC,MAAM0F,SAASrG,SAASgH,IAAI,CAAC,CAAC5G,UAAYA,QAAQO,IAAI,KAAKA;YAC3D,MAAM8E,MAAMa,YAAY,CAAC;gBAAEtD;gBAAc5B,UAAUpB;gBAAUmG,MAAMU;gBAAQR;YAAO;YAClFjF,SAASf,GAAG,CAAC2C,cAAclD,OAAOsB,SAAS6B,GAAG,CAACD,iBAAiB,EAAE,EAAEhD;YACpEmC,MAAM9B,GAAG,CAAC2C,cAAc6D;YACxB,IAAIR,QAAQjE,OAAO0D,MAAM,CAAC9C;YAC1B,MAAMiE,cAAcxE,QAAQQ,GAAG,CAACD,eAAerC;YAC/C,IAAIX,SAASgH,IAAI,CAAC,CAAC5G,UAAYA,QAAQO,IAAI,KAAKsG,cAAcxE,QAAQqD,MAAM,CAAC9C;YAC7E,IAAI,AAACR,CAAAA,KAAKS,GAAG,CAACD,iBAAiB,CAAA,MAAOwD,YAAYlE,OAAOwD,MAAM,CAAC9C;YAChE,IAAIhD,SAASsD,MAAM,GAAG,KAAK+C,QAAQ;gBACjCnE,KAAK6D,OAAO,CACVxG,sBACES,SAASG,GAAG,CAAC,CAACC,UAAa,CAAA;wBAAE4C;wBAAcnD,UAAUO,QAAQP,QAAQ;oBAAC,CAAA,IACtE;oBAACmD;iBAAa;YAGpB;QACF;QACA,OAAO;IACT;IAEA,SAASkE,UACPlE,YAAoB,EACpB3B,IAAgF;QAEhF,OAAOa,KAAKsD,OAAO,CAAC,OAAOC;YACzB,MAAM0B,YAAY9F,KAAKe,OAAOa,GAAG,CAACD;YAClC,IAAImE,cAAc7F,WAAW;YAC7B,IAAI6F,cAAc,MAAM;gBACtB,MAAM1B,MAAM2B,aAAa,CAACpE;gBAC1BZ,OAAO0D,MAAM,CAAC9C;YAChB,OAAO;gBACL,MAAMyC,MAAM4B,aAAa,CAACF;gBAC1B/E,OAAO/B,GAAG,CAAC2C,cAAcmE;YAC3B;YACAjF,KAAK6D,OAAO,CAACxG,sBAAsB,EAAE,EAAE;gBAACyD;aAAa;QACvD;IACF;IAEA,SAASsE,OACPC,IAAwB,EACxBvE,YAAoB,EACpBwE,QAA2C,CAAC,CAAC;QAE7C,OAAOtF,KAAKyE,IAAI,CAACY,MAAM;YAAEvE;YAAc,GAAGwE,KAAK;QAAC;IAClD;IAEA,MAAMC,UAA+B;QACnC,MAAMC;YACJ,MAAM5C,cAAc5C,KAAK6C,KAAK;YAC9B,IAAID,gBAAgBxD,WAAW,OAAO,EAAE;YACxC,MAAM0D,YAAY,MAAMH;YACxB,MAAM8C,UAA+BzC,OAAOF,WAAW7E,GAAG,CAAC,CAAC,EAAE6C,YAAY,EAAEmC,IAAI,EAAE,GAAM,CAAA;oBACtFnC;oBACAmC;oBACAyC,OACE5C,UAAU6C,IAAI,CAAC,CAACC,WACdA,SAASC,SAAS,CAACf,IAAI,CACrB,CAACgB,WAAaA,SAASC,IAAI,KAAK9C,KAAK8C,IAAI,IAAID,SAASE,KAAK,KAAKpD,YAAY8C,KAAK,MAEhF;gBACT,CAAA;YACAD,QAAQpH,IAAI,CAAC,CAACb,MAAMC,QAAWD,KAAKsD,YAAY,GAAGrD,MAAMqD,YAAY,GAAG,CAAC,IAAI;YAC7E,OAAO2E;QACT;QACA,MAAMxB,MAAKnD,YAAoB,EAAErB,UAA+B,CAAC,CAAC;YAChE,MAAMC,QAAQF,QAAQC;YACtB,OAAOO,KAAKsD,OAAO,CAAC,IAAM2C,QAAQC,OAAO,CAACrF,OAAOC,cAAcpB;QACjE;QACAyG,QAAOC,KAAc;YACnB,OAAOpG,KAAKyE,IAAI,CAAC,uBAAuB2B;QAC1C;QACA,MAAMC,MAAKvF,YAAoB;YAC7B,MAAMO,QAAQnB,OAAOa,GAAG,CAACD;YACzB,MAAMwF,UAA+BjF,UAAUjC,YAAYA,YAAY;gBAAEiC;YAAM;YAC/E,IAAIiF,YAAYlH,WAAW;gBACzBe,QAAQhC,GAAG,CAAC2C,cAAcwF;gBAC1BtG,KAAK6D,OAAO,CAACxG,sBAAsB,EAAE,EAAE;oBAACyD;iBAAa;YACvD;YACA,IAAI;gBACF,MAAMW,QAAQ,MAAMwE,QAAQM,GAAG,CAC7B,AAAClF,CAAAA,OAAOI,SAAS,EAAE,AAAD,EAAGxD,GAAG,CAAC,OAAOuI,OAAU,CAAA;wBACxC,GAAI,MAAMlJ,aAAakJ,KAAK;wBAC5BC,MAAMD,KAAKC,IAAI;oBACjB,CAAA;gBAEF,MAAM5H,SAAS,MAAMuG,OAAO,qBAAqBtE,cAAc;oBAC7DpC,MAAM2C,OAAO3C,QAAQ;oBACrB+C;gBACF;gBACA,MAAMhD,OAAOc,OAAOV;gBACpB,IAAIJ,SAAS,QAAQ4C,UAAUjC,WAAW,OAAOP;gBACjD,MAAMmG,UAAUlE,cAAc,CAAC4F;oBAC7B,IAAIA,YAAYrF,OAAO,OAAOjC;oBAC9B,MAAM+E,SAAS,AAACjF,CAAAA,SAAS6B,GAAG,CAACD,iBAAiB,EAAE,AAAD,EAAGgE,IAAI,CACpD,CAAC5G,UAAYA,QAAQO,IAAI,KAAKA;oBAEhC,OAAO0F,SAAS,OAAO;wBAAE,GAAG9C,KAAK;wBAAE5C;oBAAK;gBAC1C;gBACA,OAAOI;YACT,SAAU;gBACR,IAAIyH,YAAYlH,aAAae,QAAQY,GAAG,CAACD,kBAAkBwF,SAAS;oBAClEnG,QAAQyD,MAAM,CAAC9C;oBACf,IAAIZ,OAAOa,GAAG,CAACD,kBAAkBO,OAAO;wBACtCrB,KAAK6D,OAAO,CAACxG,sBAAsB,EAAE,EAAE;4BAACyD;yBAAa;oBACvD;gBACF;YACF;QACF;QACA/B,QAAO+B,YAAoB,EAAE/B,MAAe;YAC1C,OAAOqG,OAAO,uBAAuBtE,cAAc;gBAAE/B;YAAO;QAC9D;QACA4H,WAAU7F,YAAoB;YAC5B,OAAOsE,OAAO,0BAA0BtE;QAC1C;QACA8F,MAAK9F,YAAoB;YACvB,OAAOsE,OAAO,qBAAqBtE;QACrC;QACA,MAAM+F,QAAO/F,YAAoB,EAAErC,IAAY;YAC7C,MAAMI,SAAS,MAAMuG,OAAO,uBAAuBtE,cAAc;gBAAErC;YAAK;YACxE,IAAII,OAAOC,IAAI,KAAK,UAAU,OAAOD;YACrC,MAAMmG,UAAUlE,cAAc,CAAC4F,UAC7BA,YAAYtH,aAAasH,QAAQjI,IAAI,KAAKA,OAAOW,YAAY;oBAAE,GAAGsH,OAAO;oBAAEjI,MAAM;gBAAK;YAExF,OAAOI;QACT;QACA+E,QAAO9C,YAAoB;YACzB,OAAOsE,OAAO,uBAAuBtE;QACvC;IACF;IAEA,MAAMU,YAA8B;QAClCsF,OAAMhG,YAAoB,EAAEO,KAAgB;YAC1C,OAAO2D,UAAUlE,cAAc,IAAO,CAAA;oBACpCA;oBACApC,MAAM2C,MAAM3C,IAAI;oBAChB+C,OAAO;2BAAIJ,MAAMI,KAAK;qBAAC;oBACvBhD,MAAM;gBACR,CAAA;QACF;QACAsI,SAAQjG,YAAoB;YAC1B,OAAOkE,UAAUlE,cAAc,CAAC4F,UAAaA,YAAYtH,YAAYA,YAAY;QACnF;IACF;IAEA,OAAO;QACLmG;QACA/D;QACAwF,SAAQnJ,IAAI,EAAEoJ,MAAM;YAClB/H,SAASgI,KAAK;YACdjH,MAAMiH,KAAK;YACX,KAAK,MAAM7H,SAASxB,KAAM;gBACxBqB,SAASf,GAAG,CAACkB,MAAMyB,YAAY,EAAE;uBAAIzB,MAAMH,QAAQ;iBAAC,CAACb,IAAI,CAACd;gBAC1D,IAAI8B,MAAM4E,IAAI,KAAK7E,WAAWa,MAAM9B,GAAG,CAACkB,MAAMyB,YAAY,EAAEzB,MAAM4E,IAAI;YACxE;YACA/D,OAAOgH,KAAK;YACZ,KAAK,MAAM1I,UAAUyI,OAAQ/G,OAAO/B,GAAG,CAACK,OAAOsC,YAAY,EAAEtC;QAC/D;QACA,MAAM2I;YACJ,MAAM7E,QAAQ,IAAIjC,IAAI2C,OAAO,MAAML,cAAc1E,GAAG,CAAC,CAACoB,QAAUA,MAAMyB,YAAY;YAClF,MAAMuC,UAAU;mBACX,IAAIhD,IAAI;uBAAIK;uBAAexB,SAASkI,IAAI;uBAAOnH,MAAMmH,IAAI;uBAAOlH,OAAOkH,IAAI;iBAAG;aAClF,CAACrF,MAAM,CAAC,CAACjB,eAAiB,CAACwB,MAAMqB,GAAG,CAAC7C;YACtC,KAAK,MAAMA,gBAAgBwB,MAAO;gBAChC,IAAI,CAAC5B,WAAWiD,GAAG,CAAC7C,eAAeV,OAAO2D,GAAG,CAACjD;YAChD;YACAJ,aAAa4B;YACbG;YACA,IAAIY,QAAQjC,MAAM,GAAG,GAAG,MAAMgC,OAAOC;QACvC;QACA,MAAMgE,SAAQC,QAAQ;YACpB,KAAK,MAAMxG,gBAAgB;mBAAIV;aAAO,CAAC/B,IAAI,GAAI;gBAC7C,IAAI2B,KAAK2B,MAAM,IAAI;gBACnB,IAAI,CAACjB,WAAWiD,GAAG,CAAC7C,eAAe;gBACnC,MAAMyG,SAAS,MAAMlD,YAAYvD;gBACjC,IAAIyG,QAAQzI,SAAS,yBAAyBwI,SAASE,SAAS,GAAG;YACrE;YACA,IAAIpH,OAAOqH,IAAI,GAAG,GAAGH,SAASI,QAAQ,GAAG;QAC3C;QACAhB;YACE,OAAOtG,OAAOqH,IAAI,KAAK;QACzB;QACAE;YACE,KAAK,MAAM7G,gBAAgBJ,WAAYoD,IAAIhD;QAC7C;QACA8G,SAAQ9G,YAAY,EAAErB,OAAO,EAAEwC,MAAM;YACnC,MAAMvC,QAAQF,QAAQC;YACtB,MAAMoI,MAAMtF,KAAKC,SAAS,CAAC;gBAAC1B;gBAAcpB,SAAS;aAAK;YACxD,MAAMkC,OAAOnB,MAAMM,GAAG,CAAC8G,QAAQ;gBAAE/G;gBAAcpB;gBAAOoC,UAAU,IAAIzB;YAAe;YACnFI,MAAMtC,GAAG,CAAC0J,KAAKjG;YACf,MAAMI,UAAmB;gBAAEC;gBAAQJ,OAAO;YAAM;YAChDD,KAAKE,QAAQ,CAACiC,GAAG,CAAC/B;YAClBG;YACA,KAAKnC,KACFsD,OAAO,CAAC,IAAM2C,QAAQC,OAAO,IAC7B4B,IAAI,CAAC;gBACJ,IAAI9H,KAAK2B,MAAM,MAAM,CAACC,KAAKE,QAAQ,CAAC6B,GAAG,CAAC3B,UAAU;gBAClDA,QAAQH,KAAK,GAAG;gBAChBG,QAAQC,MAAM,CAACpB,OAAOC,cAAcpB;YACtC,GACCqI,KAAK,CAAC,KAAO;YAChB,OAAO;gBACL,IAAI,CAACnG,KAAKE,QAAQ,CAAC8B,MAAM,CAAC5B,UAAU;gBACpC,IAAIJ,KAAKE,QAAQ,CAAC2F,IAAI,KAAK,GAAGhH,MAAMmD,MAAM,CAACiE;gBAC3C,IAAI,CAAC3F,SAAS8F,QAAQ,CAAClH,eAAe;oBACpCP,QAAQqD,MAAM,CAAC9C;oBACfN,UAAUoD,MAAM,CAAC9C;gBACnB;gBACAqB;YACF;QACF;QACAuB,SAAQvF,GAAG;YACT,KAAK,MAAM2C,gBAAgB3C,IAAI8J,aAAa,CAAEvG,KAAKZ;QACrD;QACAoH,SAAQC,KAAK;YACX,IAAInI,KAAK2B,MAAM,IAAI;YACnB,MAAM,EAAEb,YAAY,EAAE,GAAGqH;YACzB,IAAIA,MAAMrJ,IAAI,KAAK,OAAO;gBACxB,IAAI4B,WAAWiD,GAAG,CAAC7C,eAAegD,IAAIhD;gBACtC;YACF;YACA,IAAIqH,MAAMrJ,IAAI,KAAK,gBAAgB;gBACjC,IAAI,CAACoD,SAAS8F,QAAQ,CAAClH,eAAe;gBACtCP,QAAQpC,GAAG,CAAC2C,cAAc;oBAAErC,MAAM0J,MAAM1J,IAAI;oBAAEC,MAAMyJ,MAAMzJ,IAAI;gBAAC;gBAC/DgD,KAAKZ;gBACL;YACF;YACA,IAAIqH,MAAMrJ,IAAI,KAAK,mBAAmB;gBACpC,IAAI,CAACoD,SAAS8F,QAAQ,CAAClH,eAAe;gBACtCN,UAAUrC,GAAG,CAAC2C,cAAcnC,gBAAgBwJ,MAAM5G,OAAO;gBACzDG,KAAKZ;gBACL;YACF;YACA,MAAMhD,WAAWQ,gBAAgB6J,MAAMjK,OAAO;YAC9C,IAAIJ,aAAa,QAAQ,CAAC4C,WAAWiD,GAAG,CAAC7C,eAAe;YACxD,KAAKkD,KAAKlD,cAAchD,UAAUiK,KAAK,CAAC,KAAO;QACjD;QACA7I;YACE,OAAO;mBAAIA;aAAS,CAACkJ,OAAO,CAAC,CAAC,CAACtH,cAAcjD,KAAK,GAChDA,KAAKI,GAAG,CAAC,CAAC,EAAEN,QAAQ,EAAEe,IAAI,EAAE,GAAM,CAAA;wBAAEoC;wBAAcnD;wBAAUe;oBAAK,CAAA;QAErE;QACAR,SAAQ4C,YAAY,EAAEnD,QAAQ;YAC5B,MAAME,OAAOqB,SAAS6B,GAAG,CAACD,eAAe6E,KAAK,CAACzH,UAAYA,QAAQP,QAAQ,KAAKA;YAChF,OAAOE,SAASuB,YAAY,OAAO;gBAAE0B;gBAAcnD;gBAAUe,MAAMb,KAAKa,IAAI;YAAC;QAC/E;QACA2J;YACE5H,MAAMyG,KAAK;YACX3G,QAAQ2G,KAAK;YACb1G,UAAU0G,KAAK;QACjB;IACF;AACF"}
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAML,KAAK,WAAW,EAKjB,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,aAAa,GAAG;IAC1B,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IACrE,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC,CAAC;AAqHF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAkH3E;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/host.js
CHANGED
package/dist/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/host.ts"],"sourcesContent":["import type { QueryOptions } from '@agentshouse/query';\nimport type { WrittenBy } from './change.js';\nimport {\n createMdRuntime,\n type HistoryQuery,\n type MdRuntime,\n type MdRuntimeOptions,\n type SavedRoomDraft,\n} from './connection.js';\nimport type { ChatDraft, ConversationOptions } from './conversation.js';\nimport { removeRuntimeStore } from './store.js';\nimport {\n AUTHORIZATION_ENDED,\n carried,\n envelope,\n PROTOCOL_MISMATCH,\n request,\n type RuntimePort,\n type WireAnswer,\n type WireMember,\n type WireRequest,\n type WireTopic,\n} from './wire.js';\n\nexport type MdRuntimeHostOptions = MdRuntimeOptions & { deploymentFacts?: unknown };\n\nexport type MdRuntimeHost = {\n replaceDeploymentFacts(value: unknown): void;\n attach(port: RuntimePort, app: string, release?: string): () => void;\n endAuthorization(): Promise<void>;\n};\n\nfunction answered(\n md: MdRuntime,\n app: string,\n writtenBy: WrittenBy | undefined,\n member: WireMember,\n input: readonly unknown[],\n deploymentFacts: unknown,\n): unknown {\n switch (member) {\n case 'rooms':\n return md.rooms();\n case 'slots':\n return md.slots();\n case 'query':\n return md.query(input[0] as QueryOptions | undefined);\n case 'types':\n return md.types(input[0] as string);\n case 'syncStatus':\n return md.syncStatus();\n case 'save':\n return md.save(input[0] as string, input[1] as readonly SavedRoomDraft[], writtenBy);\n case 'outcome':\n return md.outcome(input[0] as string);\n case 'history':\n return md.history(input[0] as string, input[1] as string, input[2] as HistoryQuery);\n case 'call':\n return md.call(input[0] as string, input[1]);\n case 'log':\n return md.log();\n case 'storageLoss':\n return md.storageLoss();\n case 'deploymentFacts':\n return structuredClone(deploymentFacts);\n case 'persistence':\n return md.persistence();\n case 'reauthorize':\n return md.reauthorize();\n case 'roomDraft.list':\n return md.roomDraft.list();\n case 'roomDraft.read':\n return md.roomDraft.read(input[0] as string, input[1] as string);\n case 'roomDraft.write':\n return md.roomDraft.write(\n input[0] as string,\n input[1] as string,\n input[2] as string | null,\n input[3],\n );\n case 'roomDraft.discard':\n return md.roomDraft.discard(input[0] as string, input[1] as string, input[2] as string);\n case 'presentation.read':\n return md.presentation.read(app);\n case 'presentation.write':\n return md.presentation.write(app, input[0]);\n case 'conversation.list':\n return md.conversation.list();\n case 'conversation.read':\n return md.conversation.read(input[0] as string, input[1] as ConversationOptions | undefined);\n case 'conversation.create':\n return md.conversation.create(input[0]);\n case 'conversation.send':\n return md.conversation.send(input[0] as string);\n case 'conversation.answer':\n return md.conversation.answer(input[0] as string, input[1]);\n case 'conversation.interrupt':\n return md.conversation.interrupt(input[0] as string);\n case 'conversation.kill':\n return md.conversation.kill(input[0] as string);\n case 'conversation.cancel':\n return md.conversation.cancel(input[0] as string, input[1] as string);\n case 'conversation.delete':\n return md.conversation.delete(input[0] as string);\n case 'chatDraft.write':\n return md.chatDraft.write(input[0] as string, input[1] as ChatDraft);\n case 'chatDraft.discard':\n return md.chatDraft.discard(input[0] as string);\n }\n}\n\nfunction subscribed(\n md: MdRuntime,\n app: string,\n topic: Exclude<WireTopic, 'deployment-facts'>,\n input: readonly unknown[],\n deliver: (value: unknown) => void,\n): () => void {\n switch (topic) {\n case 'rooms':\n return md.observe('rooms', deliver);\n case 'connection-refusal':\n return md.observe('connection-refusal', deliver);\n case 'storage-loss':\n return md.observe('storage-loss', deliver);\n case 'sync-status':\n return md.observe('sync-status', deliver);\n case 'room-drafts':\n return md.observe('room-drafts', deliver);\n case 'queue':\n return md.observe('queue', input[0] as string, deliver);\n case 'query':\n return md.observe('query', input[0] as QueryOptions, deliver);\n case 'presentation':\n return md.observe('presentation', app, deliver);\n case 'conversation':\n return md.observe(\n 'conversation',\n input[0] as string,\n input[1] as ConversationOptions,\n deliver,\n );\n }\n}\n\nexport function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost {\n let deploymentFacts = structuredClone(options.deploymentFacts);\n const stopping = new AbortController();\n const stop = () => {\n stopping.abort();\n };\n options.signal?.addEventListener('abort', stop, { once: true });\n if (options.signal?.aborted === true) stop();\n const md = createMdRuntime({ ...options, signal: stopping.signal });\n const attachments = new Map<() => void, (message: WireAnswer) => void>();\n let authorized = true;\n const factsObservers = new Set<(value: unknown) => void>();\n const observeFacts = (deliver: (value: unknown) => void) => {\n factsObservers.add(deliver);\n deliver(structuredClone(deploymentFacts));\n return () => {\n factsObservers.delete(deliver);\n };\n };\n\n function attach(port: RuntimePort, app: string, release?: string): () => void {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n const writtenBy = release === undefined ? undefined : { app, release };\n const subscriptions = new Map<number, () => void>();\n let serving = true;\n const send = (message: WireAnswer) => {\n port.postMessage(envelope(message));\n };\n const detach = () => {\n if (!serving) return;\n serving = false;\n for (const end of subscriptions.values()) end();\n subscriptions.clear();\n attachments.delete(detach);\n };\n const serve = async (message: WireRequest) => {\n if (message.kind === 'hello') return;\n if (message.kind === 'stop') {\n subscriptions.get(message.id)?.();\n subscriptions.delete(message.id);\n return;\n }\n try {\n if (message.kind !== 'observe' || message.topic !== 'room-drafts') await md.loaded();\n if (message.kind === 'observe') {\n subscriptions.set(\n message.id,\n message.topic === 'deployment-facts'\n ? observeFacts((value) => {\n if (serving) send({ kind: 'event', id: message.id, value });\n })\n : subscribed(md, app, message.topic, message.input, (value) => {\n if (serving) send({ kind: 'event', id: message.id, value });\n }),\n );\n if (serving) send({ kind: 'result', id: message.id, value: null });\n return;\n }\n const value = await answered(\n md,\n app,\n writtenBy,\n message.member,\n message.input,\n deploymentFacts,\n );\n if (serving) send({ kind: 'result', id: message.id, value });\n } catch (error) {\n if (serving) {\n send({\n kind: 'failure',\n id: message.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n port.addEventListener('message', (event) => {\n if (!serving) return;\n const wire = carried(event.data);\n if (wire === null) return;\n if (!wire.matching) {\n send({ kind: 'refusal', refusal: PROTOCOL_MISMATCH });\n detach();\n return;\n }\n const message = request(wire.message);\n if (message === null) return;\n void serve(message);\n });\n port.addEventListener('close', detach);\n port.start();\n attachments.set(detach, send);\n return detach;\n }\n\n return {\n attach,\n replaceDeploymentFacts(value) {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n deploymentFacts = structuredClone(value);\n for (const deliver of factsObservers) deliver(structuredClone(deploymentFacts));\n },\n async endAuthorization() {\n authorized = false;\n for (const [detach, send] of [...attachments]) {\n send({ kind: 'ended' });\n detach();\n }\n stop();\n await removeRuntimeStore();\n await options.shell.dropGeneration();\n },\n };\n}\n\nexport type { RuntimePort } from './wire.js';\n"],"names":["createMdRuntime","removeRuntimeStore","AUTHORIZATION_ENDED","carried","envelope","PROTOCOL_MISMATCH","request","answered","md","app","writtenBy","member","input","deploymentFacts","rooms","slots","query","types","syncStatus","save","outcome","history","call","log","storageLoss","structuredClone","persistence","reauthorize","roomDraft","list","read","write","discard","presentation","conversation","create","send","answer","interrupt","kill","cancel","delete","chatDraft","subscribed","topic","deliver","observe","serveMdRuntime","options","stopping","AbortController","stop","abort","signal","addEventListener","once","aborted","attachments","Map","authorized","factsObservers","Set","observeFacts","add","attach","port","release","Error","undefined","subscriptions","serving","message","postMessage","detach","end","values","clear","serve","kind","get","id","loaded","set","value","error","String","event","wire","data","matching","refusal","start","replaceDeploymentFacts","endAuthorization","shell","dropGeneration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/host.ts"],"sourcesContent":["import type { WrittenBy } from './change.js';\nimport {\n createMdRuntime,\n type HistoryQuery,\n type MdRuntime,\n type MdRuntimeOptions,\n type SavedRoomDraft,\n} from './connection.js';\nimport type { ChatDraft, ConversationOptions } from './conversation.js';\nimport type { DocumentQuery } from './query.js';\nimport type { SearchRequest } from './search.js';\nimport { removeRuntimeStore } from './store.js';\nimport {\n AUTHORIZATION_ENDED,\n carried,\n envelope,\n PROTOCOL_MISMATCH,\n request,\n type RuntimePort,\n type WireAnswer,\n type WireMember,\n type WireRequest,\n type WireTopic,\n} from './wire.js';\n\nexport type MdRuntimeHostOptions = MdRuntimeOptions & { deploymentFacts?: unknown };\n\nexport type MdRuntimeHost = {\n replaceDeploymentFacts(value: unknown): void;\n attach(port: RuntimePort, app: string, release?: string): () => void;\n endAuthorization(): Promise<void>;\n};\n\nfunction answered(\n md: MdRuntime,\n app: string,\n writtenBy: WrittenBy | undefined,\n member: WireMember,\n input: readonly unknown[],\n deploymentFacts: unknown,\n): unknown {\n switch (member) {\n case 'rooms':\n return md.rooms();\n case 'slots':\n return md.slots();\n case 'query':\n return md.query(input[0] as DocumentQuery);\n case 'search':\n return md.search(input[0] as SearchRequest);\n case 'types':\n return md.types(input[0] as string);\n case 'syncStatus':\n return md.syncStatus();\n case 'save':\n return md.save(input[0] as string, input[1] as readonly SavedRoomDraft[], writtenBy);\n case 'outcome':\n return md.outcome(input[0] as string);\n case 'history':\n return md.history(input[0] as string, input[1] as string, input[2] as HistoryQuery);\n case 'call':\n return md.call(input[0] as string, input[1]);\n case 'log':\n return md.log();\n case 'storageLoss':\n return md.storageLoss();\n case 'deploymentFacts':\n return structuredClone(deploymentFacts);\n case 'persistence':\n return md.persistence();\n case 'reauthorize':\n return md.reauthorize();\n case 'roomDraft.list':\n return md.roomDraft.list();\n case 'roomDraft.read':\n return md.roomDraft.read(input[0] as string, input[1] as string);\n case 'roomDraft.write':\n return md.roomDraft.write(\n input[0] as string,\n input[1] as string,\n input[2] as string | null,\n input[3],\n );\n case 'roomDraft.discard':\n return md.roomDraft.discard(input[0] as string, input[1] as string, input[2] as string);\n case 'presentation.read':\n return md.presentation.read(app);\n case 'presentation.write':\n return md.presentation.write(app, input[0]);\n case 'conversation.list':\n return md.conversation.list();\n case 'conversation.read':\n return md.conversation.read(input[0] as string, input[1] as ConversationOptions | undefined);\n case 'conversation.create':\n return md.conversation.create(input[0]);\n case 'conversation.send':\n return md.conversation.send(input[0] as string);\n case 'conversation.answer':\n return md.conversation.answer(input[0] as string, input[1]);\n case 'conversation.interrupt':\n return md.conversation.interrupt(input[0] as string);\n case 'conversation.kill':\n return md.conversation.kill(input[0] as string);\n case 'conversation.cancel':\n return md.conversation.cancel(input[0] as string, input[1] as string);\n case 'conversation.delete':\n return md.conversation.delete(input[0] as string);\n case 'chatDraft.write':\n return md.chatDraft.write(input[0] as string, input[1] as ChatDraft);\n case 'chatDraft.discard':\n return md.chatDraft.discard(input[0] as string);\n }\n}\n\nfunction subscribed(\n md: MdRuntime,\n app: string,\n topic: Exclude<WireTopic, 'deployment-facts'>,\n input: readonly unknown[],\n deliver: (value: unknown) => void,\n): () => void {\n switch (topic) {\n case 'rooms':\n return md.observe('rooms', deliver);\n case 'connection-refusal':\n return md.observe('connection-refusal', deliver);\n case 'storage-loss':\n return md.observe('storage-loss', deliver);\n case 'sync-status':\n return md.observe('sync-status', deliver);\n case 'room-drafts':\n return md.observe('room-drafts', deliver);\n case 'queue':\n return md.observe('queue', input[0] as string, deliver);\n case 'query':\n return md.observe('query', input[0] as DocumentQuery, deliver);\n case 'presentation':\n return md.observe('presentation', app, deliver);\n case 'conversation':\n return md.observe(\n 'conversation',\n input[0] as string,\n input[1] as ConversationOptions,\n deliver,\n );\n }\n}\n\nexport function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost {\n let deploymentFacts = structuredClone(options.deploymentFacts);\n const stopping = new AbortController();\n const stop = () => {\n stopping.abort();\n };\n options.signal?.addEventListener('abort', stop, { once: true });\n if (options.signal?.aborted === true) stop();\n const md = createMdRuntime({ ...options, signal: stopping.signal });\n const attachments = new Map<() => void, (message: WireAnswer) => void>();\n let authorized = true;\n const factsObservers = new Set<(value: unknown) => void>();\n const observeFacts = (deliver: (value: unknown) => void) => {\n factsObservers.add(deliver);\n deliver(structuredClone(deploymentFacts));\n return () => {\n factsObservers.delete(deliver);\n };\n };\n\n function attach(port: RuntimePort, app: string, release?: string): () => void {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n const writtenBy = release === undefined ? undefined : { app, release };\n const subscriptions = new Map<number, () => void>();\n let serving = true;\n const send = (message: WireAnswer) => {\n port.postMessage(envelope(message));\n };\n const detach = () => {\n if (!serving) return;\n serving = false;\n for (const end of subscriptions.values()) end();\n subscriptions.clear();\n attachments.delete(detach);\n };\n const serve = async (message: WireRequest) => {\n if (message.kind === 'hello') return;\n if (message.kind === 'stop') {\n subscriptions.get(message.id)?.();\n subscriptions.delete(message.id);\n return;\n }\n try {\n if (message.kind !== 'observe' || message.topic !== 'room-drafts') await md.loaded();\n if (message.kind === 'observe') {\n subscriptions.set(\n message.id,\n message.topic === 'deployment-facts'\n ? observeFacts((value) => {\n if (serving) send({ kind: 'event', id: message.id, value });\n })\n : subscribed(md, app, message.topic, message.input, (value) => {\n if (serving) send({ kind: 'event', id: message.id, value });\n }),\n );\n if (serving) send({ kind: 'result', id: message.id, value: null });\n return;\n }\n const value = await answered(\n md,\n app,\n writtenBy,\n message.member,\n message.input,\n deploymentFacts,\n );\n if (serving) send({ kind: 'result', id: message.id, value });\n } catch (error) {\n if (serving) {\n send({\n kind: 'failure',\n id: message.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n };\n port.addEventListener('message', (event) => {\n if (!serving) return;\n const wire = carried(event.data);\n if (wire === null) return;\n if (!wire.matching) {\n send({ kind: 'refusal', refusal: PROTOCOL_MISMATCH });\n detach();\n return;\n }\n const message = request(wire.message);\n if (message === null) return;\n void serve(message);\n });\n port.addEventListener('close', detach);\n port.start();\n attachments.set(detach, send);\n return detach;\n }\n\n return {\n attach,\n replaceDeploymentFacts(value) {\n if (!authorized) throw new Error(AUTHORIZATION_ENDED);\n deploymentFacts = structuredClone(value);\n for (const deliver of factsObservers) deliver(structuredClone(deploymentFacts));\n },\n async endAuthorization() {\n authorized = false;\n for (const [detach, send] of [...attachments]) {\n send({ kind: 'ended' });\n detach();\n }\n stop();\n await removeRuntimeStore();\n await options.shell.dropGeneration();\n },\n };\n}\n\nexport type { RuntimePort } from './wire.js';\n"],"names":["createMdRuntime","removeRuntimeStore","AUTHORIZATION_ENDED","carried","envelope","PROTOCOL_MISMATCH","request","answered","md","app","writtenBy","member","input","deploymentFacts","rooms","slots","query","search","types","syncStatus","save","outcome","history","call","log","storageLoss","structuredClone","persistence","reauthorize","roomDraft","list","read","write","discard","presentation","conversation","create","send","answer","interrupt","kill","cancel","delete","chatDraft","subscribed","topic","deliver","observe","serveMdRuntime","options","stopping","AbortController","stop","abort","signal","addEventListener","once","aborted","attachments","Map","authorized","factsObservers","Set","observeFacts","add","attach","port","release","Error","undefined","subscriptions","serving","message","postMessage","detach","end","values","clear","serve","kind","get","id","loaded","set","value","error","String","event","wire","data","matching","refusal","start","replaceDeploymentFacts","endAuthorization","shell","dropGeneration"],"mappings":"AACA,SACEA,eAAe,QAKV,kBAAkB;AAIzB,SAASC,kBAAkB,QAAQ,aAAa;AAChD,SACEC,mBAAmB,EACnBC,OAAO,EACPC,QAAQ,EACRC,iBAAiB,EACjBC,OAAO,QAMF,YAAY;AAUnB,SAASC,SACPC,EAAa,EACbC,GAAW,EACXC,SAAgC,EAChCC,MAAkB,EAClBC,KAAyB,EACzBC,eAAwB;IAExB,OAAQF;QACN,KAAK;YACH,OAAOH,GAAGM,KAAK;QACjB,KAAK;YACH,OAAON,GAAGO,KAAK;QACjB,KAAK;YACH,OAAOP,GAAGQ,KAAK,CAACJ,KAAK,CAAC,EAAE;QAC1B,KAAK;YACH,OAAOJ,GAAGS,MAAM,CAACL,KAAK,CAAC,EAAE;QAC3B,KAAK;YACH,OAAOJ,GAAGU,KAAK,CAACN,KAAK,CAAC,EAAE;QAC1B,KAAK;YACH,OAAOJ,GAAGW,UAAU;QACtB,KAAK;YACH,OAAOX,GAAGY,IAAI,CAACR,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE,EAA+BF;QAC5E,KAAK;YACH,OAAOF,GAAGa,OAAO,CAACT,KAAK,CAAC,EAAE;QAC5B,KAAK;YACH,OAAOJ,GAAGc,OAAO,CAACV,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QACpE,KAAK;YACH,OAAOJ,GAAGe,IAAI,CAACX,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC7C,KAAK;YACH,OAAOJ,GAAGgB,GAAG;QACf,KAAK;YACH,OAAOhB,GAAGiB,WAAW;QACvB,KAAK;YACH,OAAOC,gBAAgBb;QACzB,KAAK;YACH,OAAOL,GAAGmB,WAAW;QACvB,KAAK;YACH,OAAOnB,GAAGoB,WAAW;QACvB,KAAK;YACH,OAAOpB,GAAGqB,SAAS,CAACC,IAAI;QAC1B,KAAK;YACH,OAAOtB,GAAGqB,SAAS,CAACE,IAAI,CAACnB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QACvD,KAAK;YACH,OAAOJ,GAAGqB,SAAS,CAACG,KAAK,CACvBpB,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE;QAEZ,KAAK;YACH,OAAOJ,GAAGqB,SAAS,CAACI,OAAO,CAACrB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC9E,KAAK;YACH,OAAOJ,GAAG0B,YAAY,CAACH,IAAI,CAACtB;QAC9B,KAAK;YACH,OAAOD,GAAG0B,YAAY,CAACF,KAAK,CAACvB,KAAKG,KAAK,CAAC,EAAE;QAC5C,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACL,IAAI;QAC7B,KAAK;YACH,OAAOtB,GAAG2B,YAAY,CAACJ,IAAI,CAACnB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC1D,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACC,MAAM,CAACxB,KAAK,CAAC,EAAE;QACxC,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACE,IAAI,CAACzB,KAAK,CAAC,EAAE;QACtC,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACG,MAAM,CAAC1B,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC5D,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACI,SAAS,CAAC3B,KAAK,CAAC,EAAE;QAC3C,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACK,IAAI,CAAC5B,KAAK,CAAC,EAAE;QACtC,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACM,MAAM,CAAC7B,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QAC5D,KAAK;YACH,OAAOJ,GAAG2B,YAAY,CAACO,MAAM,CAAC9B,KAAK,CAAC,EAAE;QACxC,KAAK;YACH,OAAOJ,GAAGmC,SAAS,CAACX,KAAK,CAACpB,KAAK,CAAC,EAAE,EAAYA,KAAK,CAAC,EAAE;QACxD,KAAK;YACH,OAAOJ,GAAGmC,SAAS,CAACV,OAAO,CAACrB,KAAK,CAAC,EAAE;IACxC;AACF;AAEA,SAASgC,WACPpC,EAAa,EACbC,GAAW,EACXoC,KAA6C,EAC7CjC,KAAyB,EACzBkC,OAAiC;IAEjC,OAAQD;QACN,KAAK;YACH,OAAOrC,GAAGuC,OAAO,CAAC,SAASD;QAC7B,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,sBAAsBD;QAC1C,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,gBAAgBD;QACpC,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,eAAeD;QACnC,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,eAAeD;QACnC,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,SAASnC,KAAK,CAAC,EAAE,EAAYkC;QACjD,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,SAASnC,KAAK,CAAC,EAAE,EAAmBkC;QACxD,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CAAC,gBAAgBtC,KAAKqC;QACzC,KAAK;YACH,OAAOtC,GAAGuC,OAAO,CACf,gBACAnC,KAAK,CAAC,EAAE,EACRA,KAAK,CAAC,EAAE,EACRkC;IAEN;AACF;AAEA,OAAO,SAASE,eAAeC,OAA6B;IAC1D,IAAIpC,kBAAkBa,gBAAgBuB,QAAQpC,eAAe;IAC7D,MAAMqC,WAAW,IAAIC;IACrB,MAAMC,OAAO;QACXF,SAASG,KAAK;IAChB;IACAJ,QAAQK,MAAM,EAAEC,iBAAiB,SAASH,MAAM;QAAEI,MAAM;IAAK;IAC7D,IAAIP,QAAQK,MAAM,EAAEG,YAAY,MAAML;IACtC,MAAM5C,KAAKR,gBAAgB;QAAE,GAAGiD,OAAO;QAAEK,QAAQJ,SAASI,MAAM;IAAC;IACjE,MAAMI,cAAc,IAAIC;IACxB,IAAIC,aAAa;IACjB,MAAMC,iBAAiB,IAAIC;IAC3B,MAAMC,eAAe,CAACjB;QACpBe,eAAeG,GAAG,CAAClB;QACnBA,QAAQpB,gBAAgBb;QACxB,OAAO;YACLgD,eAAenB,MAAM,CAACI;QACxB;IACF;IAEA,SAASmB,OAAOC,IAAiB,EAAEzD,GAAW,EAAE0D,OAAgB;QAC9D,IAAI,CAACP,YAAY,MAAM,IAAIQ,MAAMlE;QACjC,MAAMQ,YAAYyD,YAAYE,YAAYA,YAAY;YAAE5D;YAAK0D;QAAQ;QACrE,MAAMG,gBAAgB,IAAIX;QAC1B,IAAIY,UAAU;QACd,MAAMlC,OAAO,CAACmC;YACZN,KAAKO,WAAW,CAACrE,SAASoE;QAC5B;QACA,MAAME,SAAS;YACb,IAAI,CAACH,SAAS;YACdA,UAAU;YACV,KAAK,MAAMI,OAAOL,cAAcM,MAAM,GAAID;YAC1CL,cAAcO,KAAK;YACnBnB,YAAYhB,MAAM,CAACgC;QACrB;QACA,MAAMI,QAAQ,OAAON;YACnB,IAAIA,QAAQO,IAAI,KAAK,SAAS;YAC9B,IAAIP,QAAQO,IAAI,KAAK,QAAQ;gBAC3BT,cAAcU,GAAG,CAACR,QAAQS,EAAE;gBAC5BX,cAAc5B,MAAM,CAAC8B,QAAQS,EAAE;gBAC/B;YACF;YACA,IAAI;gBACF,IAAIT,QAAQO,IAAI,KAAK,aAAaP,QAAQ3B,KAAK,KAAK,eAAe,MAAMrC,GAAG0E,MAAM;gBAClF,IAAIV,QAAQO,IAAI,KAAK,WAAW;oBAC9BT,cAAca,GAAG,CACfX,QAAQS,EAAE,EACVT,QAAQ3B,KAAK,KAAK,qBACdkB,aAAa,CAACqB;wBACZ,IAAIb,SAASlC,KAAK;4BAAE0C,MAAM;4BAASE,IAAIT,QAAQS,EAAE;4BAAEG;wBAAM;oBAC3D,KACAxC,WAAWpC,IAAIC,KAAK+D,QAAQ3B,KAAK,EAAE2B,QAAQ5D,KAAK,EAAE,CAACwE;wBACjD,IAAIb,SAASlC,KAAK;4BAAE0C,MAAM;4BAASE,IAAIT,QAAQS,EAAE;4BAAEG;wBAAM;oBAC3D;oBAEN,IAAIb,SAASlC,KAAK;wBAAE0C,MAAM;wBAAUE,IAAIT,QAAQS,EAAE;wBAAEG,OAAO;oBAAK;oBAChE;gBACF;gBACA,MAAMA,QAAQ,MAAM7E,SAClBC,IACAC,KACAC,WACA8D,QAAQ7D,MAAM,EACd6D,QAAQ5D,KAAK,EACbC;gBAEF,IAAI0D,SAASlC,KAAK;oBAAE0C,MAAM;oBAAUE,IAAIT,QAAQS,EAAE;oBAAEG;gBAAM;YAC5D,EAAE,OAAOC,OAAO;gBACd,IAAId,SAAS;oBACXlC,KAAK;wBACH0C,MAAM;wBACNE,IAAIT,QAAQS,EAAE;wBACdT,SAASa,iBAAiBjB,QAAQiB,MAAMb,OAAO,GAAGc,OAAOD;oBAC3D;gBACF;YACF;QACF;QACAnB,KAAKX,gBAAgB,CAAC,WAAW,CAACgC;YAChC,IAAI,CAAChB,SAAS;YACd,MAAMiB,OAAOrF,QAAQoF,MAAME,IAAI;YAC/B,IAAID,SAAS,MAAM;YACnB,IAAI,CAACA,KAAKE,QAAQ,EAAE;gBAClBrD,KAAK;oBAAE0C,MAAM;oBAAWY,SAAStF;gBAAkB;gBACnDqE;gBACA;YACF;YACA,MAAMF,UAAUlE,QAAQkF,KAAKhB,OAAO;YACpC,IAAIA,YAAY,MAAM;YACtB,KAAKM,MAAMN;QACb;QACAN,KAAKX,gBAAgB,CAAC,SAASmB;QAC/BR,KAAK0B,KAAK;QACVlC,YAAYyB,GAAG,CAACT,QAAQrC;QACxB,OAAOqC;IACT;IAEA,OAAO;QACLT;QACA4B,wBAAuBT,KAAK;YAC1B,IAAI,CAACxB,YAAY,MAAM,IAAIQ,MAAMlE;YACjCW,kBAAkBa,gBAAgB0D;YAClC,KAAK,MAAMtC,WAAWe,eAAgBf,QAAQpB,gBAAgBb;QAChE;QACA,MAAMiF;YACJlC,aAAa;YACb,KAAK,MAAM,CAACc,QAAQrC,KAAK,IAAI;mBAAIqB;aAAY,CAAE;gBAC7CrB,KAAK;oBAAE0C,MAAM;gBAAQ;gBACrBL;YACF;YACAtB;YACA,MAAMnD;YACN,MAAMgD,QAAQ8C,KAAK,CAACC,cAAc;QACpC;IACF;AACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,12 +6,12 @@ export type { AppRoom, AppSlot, AppSlotEntry, AppTypedSelection, ConnectionRefus
|
|
|
6
6
|
export type { AcceptedOutcome, AffectedState, CallResult, QueueEntry, Submission, SubmissionOutcome, } from './outcome.js';
|
|
7
7
|
export type { ChangedPart, FieldValue, ReturnReason, RoomDraft, RoomDraftCreation, RoomDraftParts, RoomDraftWrite, } from './room-draft.js';
|
|
8
8
|
export type { SaveRefusal } from './save.js';
|
|
9
|
+
export type { DocumentHit, DocumentPart, MessageHit, SearchRequest, SearchResult, } from './search.js';
|
|
9
10
|
export { changeBatchIdentity } from './identity.js';
|
|
10
11
|
export { createMdRuntime } from './connection.js';
|
|
11
12
|
export type { RuntimeShell } from './durability.js';
|
|
12
13
|
export type { AttentionEntry, SyncStatus } from './status.js';
|
|
13
|
-
export type { Backlink, QueryDocument, QueryGroup,
|
|
14
|
+
export type { Backlink, Direction, DocumentQuery, DocumentResult, Filter, GroupQuery, GroupResult, Key, LocalQuery, OrderOptions, Predicate, QueryDocument, QueryGroup, QueryResult, Related, Select, Value, Where, } from './query.js';
|
|
14
15
|
export type { MdType, ModelIdentity, ModelSnapshot, ModelState, ModelResult, TypesResult, ValidationReceipt, } from './model.js';
|
|
15
16
|
export type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';
|
|
16
|
-
export type { QueryBinding, QueryInput } from './query.js';
|
|
17
17
|
//# sourceMappingURL=index.d.ts.map
|
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,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,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,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,cAAc,GACf,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,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,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,aAAa,EACb,UAAU,EACV,YAAY,EACZ,WAAW,EACX,
|
|
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,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,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,uBAAuB,EACvB,aAAa,EACb,oBAAoB,EACpB,cAAc,GACf,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,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 ContractUnavailable,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationHistoryRequest,\n ConversationMessage,\n ConversationStream,\n DiscoverResult,\n DiscoveredRoom,\n Discovery,\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 RoomVersionNotification,\n SelectedRooms,\n TransportUncertainty,\n TypedSelection,\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 {\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 { 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 QueryDocument,\n QueryGroup,\n
|
|
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 ContractUnavailable,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationHistoryRequest,\n ConversationMessage,\n ConversationStream,\n DiscoverResult,\n DiscoveredRoom,\n Discovery,\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 RoomVersionNotification,\n SelectedRooms,\n TransportUncertainty,\n TypedSelection,\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 {\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":"AAkGA,SAASA,mBAAmB,QAAQ,gBAAgB;AACpD,SAASC,eAAe,QAAQ,kBAAkB"}
|
package/dist/paths.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export declare function normalize(path: string): string | null;
|
|
2
2
|
export declare function resolve(from: string, reference: string): string | null;
|
|
3
|
+
export declare function target(from: string, href: string): string | null;
|
|
3
4
|
export declare function relative(from: string, target: string): string;
|
|
4
5
|
export declare function beneath(prefix: string, path: string): boolean;
|
|
5
6
|
export declare function covered(prefixes: readonly string[], path: string): boolean;
|
package/dist/paths.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOhE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
|
package/dist/paths.js
CHANGED
|
@@ -19,6 +19,14 @@ export function resolve(from, reference) {
|
|
|
19
19
|
const base = dirname(from);
|
|
20
20
|
return normalize(base === '' ? reference : `${base}/${reference}`);
|
|
21
21
|
}
|
|
22
|
+
export function target(from, href) {
|
|
23
|
+
const trimmed = href.trim();
|
|
24
|
+
if (trimmed.startsWith('/') || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return null;
|
|
25
|
+
const bare = trimmed.replace(/[?#].*$/, '');
|
|
26
|
+
if (bare === '') return null;
|
|
27
|
+
const resolved = resolve(from, bare);
|
|
28
|
+
return resolved === '' ? null : resolved;
|
|
29
|
+
}
|
|
22
30
|
export function relative(from, target) {
|
|
23
31
|
const base = dirname(from).split('/').filter((part)=>part !== '');
|
|
24
32
|
const parts = target.split('/');
|
package/dist/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/paths.ts"],"sourcesContent":["function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function resolve(from: string, reference: string): string | null {\n const base = dirname(from);\n return normalize(base === '' ? reference : `${base}/${reference}`);\n}\n\nexport function relative(from: string, target: string): string {\n const base = dirname(from)\n .split('/')\n .filter((part) => part !== '');\n const parts = target.split('/');\n let shared = 0;\n while (shared < base.length && shared + 1 < parts.length && base[shared] === parts[shared]) {\n shared += 1;\n }\n const up = Array.from({ length: base.length - shared }, () => '..');\n return [...up, ...parts.slice(shared)].join('/');\n}\n\nexport function beneath(prefix: string, path: string): boolean {\n return path === prefix || path.startsWith(`${prefix}/`);\n}\n\nexport function covered(prefixes: readonly string[], path: string): boolean {\n return prefixes.some((prefix) => {\n const normalized = normalize(prefix);\n return normalized !== null && (normalized === '' || beneath(normalized, path));\n });\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","normalize","parts","part","split","length","pop","push","join","resolve","from","reference","base","
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/paths.ts"],"sourcesContent":["function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function resolve(from: string, reference: string): string | null {\n const base = dirname(from);\n return normalize(base === '' ? reference : `${base}/${reference}`);\n}\n\nexport function target(from: string, href: string): string | null {\n const trimmed = href.trim();\n if (trimmed.startsWith('/') || /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(trimmed)) return null;\n const bare = trimmed.replace(/[?#].*$/, '');\n if (bare === '') return null;\n const resolved = resolve(from, bare);\n return resolved === '' ? null : resolved;\n}\n\nexport function relative(from: string, target: string): string {\n const base = dirname(from)\n .split('/')\n .filter((part) => part !== '');\n const parts = target.split('/');\n let shared = 0;\n while (shared < base.length && shared + 1 < parts.length && base[shared] === parts[shared]) {\n shared += 1;\n }\n const up = Array.from({ length: base.length - shared }, () => '..');\n return [...up, ...parts.slice(shared)].join('/');\n}\n\nexport function beneath(prefix: string, path: string): boolean {\n return path === prefix || path.startsWith(`${prefix}/`);\n}\n\nexport function covered(prefixes: readonly string[], path: string): boolean {\n return prefixes.some((prefix) => {\n const normalized = normalize(prefix);\n return normalized !== null && (normalized === '' || beneath(normalized, path));\n });\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","normalize","parts","part","split","length","pop","push","join","resolve","from","reference","base","target","href","trimmed","trim","startsWith","test","bare","replace","resolved","relative","filter","shared","up","Array","beneath","prefix","covered","prefixes","some","normalized"],"mappings":"AAAA,SAASA,QAAQC,IAAY;IAC3B,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,UAAUJ,IAAY;IACpC,MAAMK,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQN,KAAKO,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMM,IAAI,CAAC;AACpB;AAEA,OAAO,SAASC,QAAQC,IAAY,EAAEC,SAAiB;IACrD,MAAMC,OAAOhB,QAAQc;IACrB,OAAOT,UAAUW,SAAS,KAAKD,YAAY,GAAGC,KAAK,CAAC,EAAED,WAAW;AACnE;AAEA,OAAO,SAASE,OAAOH,IAAY,EAAEI,IAAY;IAC/C,MAAMC,UAAUD,KAAKE,IAAI;IACzB,IAAID,QAAQE,UAAU,CAAC,QAAQ,4BAA4BC,IAAI,CAACH,UAAU,OAAO;IACjF,MAAMI,OAAOJ,QAAQK,OAAO,CAAC,WAAW;IACxC,IAAID,SAAS,IAAI,OAAO;IACxB,MAAME,WAAWZ,QAAQC,MAAMS;IAC/B,OAAOE,aAAa,KAAK,OAAOA;AAClC;AAEA,OAAO,SAASC,SAASZ,IAAY,EAAEG,MAAc;IACnD,MAAMD,OAAOhB,QAAQc,MAClBN,KAAK,CAAC,KACNmB,MAAM,CAAC,CAACpB,OAASA,SAAS;IAC7B,MAAMD,QAAQW,OAAOT,KAAK,CAAC;IAC3B,IAAIoB,SAAS;IACb,MAAOA,SAASZ,KAAKP,MAAM,IAAImB,SAAS,IAAItB,MAAMG,MAAM,IAAIO,IAAI,CAACY,OAAO,KAAKtB,KAAK,CAACsB,OAAO,CAAE;QAC1FA,UAAU;IACZ;IACA,MAAMC,KAAKC,MAAMhB,IAAI,CAAC;QAAEL,QAAQO,KAAKP,MAAM,GAAGmB;IAAO,GAAG,IAAM;IAC9D,OAAO;WAAIC;WAAOvB,MAAMF,KAAK,CAACwB;KAAQ,CAAChB,IAAI,CAAC;AAC9C;AAEA,OAAO,SAASmB,QAAQC,MAAc,EAAE/B,IAAY;IAClD,OAAOA,SAAS+B,UAAU/B,KAAKoB,UAAU,CAAC,GAAGW,OAAO,CAAC,CAAC;AACxD;AAEA,OAAO,SAASC,QAAQC,QAA2B,EAAEjC,IAAY;IAC/D,OAAOiC,SAASC,IAAI,CAAC,CAACH;QACpB,MAAMI,aAAa/B,UAAU2B;QAC7B,OAAOI,eAAe,QAASA,CAAAA,eAAe,MAAML,QAAQK,YAAYnC,KAAI;IAC9E;AACF"}
|