@agentshouse/mdruntime 0.1.0-alpha.26 → 0.1.0-alpha.27

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.
@@ -61,7 +61,7 @@ export type ConversationStore = {
61
61
  catchUp(progress: CycleProgress): Promise<void>;
62
62
  current(): boolean;
63
63
  reconnected(): void;
64
- observe(conversation: string, options: ConversationOptions, notify: (view: ConversationView) => void): () => void;
64
+ watch(conversation: string, options: ConversationOptions, deliver: (view: ConversationView) => void): () => void;
65
65
  changed(set: ChangeSet): void;
66
66
  receive(event: ConversationEvent): void;
67
67
  messages(): readonly SearchedMessage[];
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/conversation.ts"],"names":[],"mappings":"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"}
@@ -439,7 +439,7 @@ export function createConversationStore(deps) {
439
439
  reconnected () {
440
440
  for (const conversation of replicated)gap(conversation);
441
441
  },
442
- observe (conversation, options, notify) {
442
+ watch (conversation, options, deliver) {
443
443
  const limit = limitOf(options);
444
444
  const key = JSON.stringify([
445
445
  conversation,
@@ -452,7 +452,7 @@ export function createConversationStore(deps) {
452
452
  };
453
453
  views.set(key, view);
454
454
  const watcher = {
455
- notify,
455
+ notify: deliver,
456
456
  ready: false
457
457
  };
458
458
  view.watchers.add(watcher);
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/conversation.ts"],"sourcesContent":["import type {\n AcceptedMessage,\n ConversationAction,\n ConversationCards,\n ConversationEvent,\n ConversationHistoryPage,\n ConversationMessage,\n ConversationStream,\n} 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":"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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 watch(\n conversation: string,\n options: ConversationOptions,\n deliver: (view: ConversationView) => void,\n ): () => void;\n changed(set: ChangeSet): void;\n receive(event: ConversationEvent): void;\n messages(): readonly SearchedMessage[];\n message(conversation: string, identity: string): SearchedMessage | null;\n close(): void;\n};\n\ntype Watcher = {\n notify: (view: ConversationView) => void;\n ready: boolean;\n};\n\ntype Sending = { draft: ChatDraftRecord };\n\ntype 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 watch(conversation, options, deliver) {\n const limit = limitOf(options);\n const key = JSON.stringify([conversation, limit ?? null]);\n const view = views.get(key) ?? { conversation, limit, watchers: new Set<Watcher>() };\n views.set(key, view);\n const watcher: Watcher = { notify: deliver, ready: false };\n view.watchers.add(watcher);\n 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","watch","deliver","key","then","catch","includes","conversations","receive","event","flatMap","close"],"mappings":"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"}
@@ -1 +1 @@
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"}
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,EAIjB,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;AAmFF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAoH3E;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/dist/host.js CHANGED
@@ -1,4 +1,4 @@
1
- import { createMdRuntime } from './connection.js';
1
+ import { composeRuntime } from './connection.js';
2
2
  import { removeRuntimeStore } from './store.js';
3
3
  import { AUTHORIZATION_ENDED, carried, envelope, PROTOCOL_MISMATCH, request } from './wire.js';
4
4
  function answered(md, app, writtenBy, member, input, deploymentFacts) {
@@ -69,28 +69,6 @@ function answered(md, app, writtenBy, member, input, deploymentFacts) {
69
69
  return md.chatDraft.discard(input[0]);
70
70
  }
71
71
  }
72
- function subscribed(md, app, topic, input, deliver) {
73
- switch(topic){
74
- case 'rooms':
75
- return md.observe('rooms', deliver);
76
- case 'connection-refusal':
77
- return md.observe('connection-refusal', deliver);
78
- case 'storage-loss':
79
- return md.observe('storage-loss', deliver);
80
- case 'sync-status':
81
- return md.observe('sync-status', deliver);
82
- case 'room-drafts':
83
- return md.observe('room-drafts', deliver);
84
- case 'queue':
85
- return md.observe('queue', input[0], deliver);
86
- case 'query':
87
- return md.observe('query', input[0], deliver);
88
- case 'presentation':
89
- return md.observe('presentation', app, deliver);
90
- case 'conversation':
91
- return md.observe('conversation', input[0], input[1], deliver);
92
- }
93
- }
94
72
  export function serveMdRuntime(options) {
95
73
  let deploymentFacts = structuredClone(options.deploymentFacts);
96
74
  const stopping = new AbortController();
@@ -101,14 +79,14 @@ export function serveMdRuntime(options) {
101
79
  once: true
102
80
  });
103
81
  if (options.signal?.aborted === true) stop();
104
- const md = createMdRuntime({
82
+ const { md, watch } = composeRuntime({
105
83
  ...options,
106
84
  signal: stopping.signal
107
85
  });
108
86
  const attachments = new Map();
109
87
  let authorized = true;
110
88
  const factsObservers = new Set();
111
- const observeFacts = (deliver)=>{
89
+ const watchFacts = (deliver)=>{
112
90
  factsObservers.add(deliver);
113
91
  deliver(structuredClone(deploymentFacts));
114
92
  return ()=>{
@@ -143,24 +121,24 @@ export function serveMdRuntime(options) {
143
121
  try {
144
122
  if (message.kind !== 'observe' || message.topic !== 'room-drafts') await md.loaded();
145
123
  if (message.kind === 'observe') {
146
- subscriptions.set(message.id, message.topic === 'deployment-facts' ? observeFacts((value)=>{
147
- if (serving) send({
124
+ const { id, topic } = message;
125
+ let resolved = false;
126
+ const deliver = (value)=>{
127
+ if (!serving) return;
128
+ send(resolved ? {
148
129
  kind: 'event',
149
- id: message.id,
130
+ id,
150
131
  value
151
- });
152
- }) : subscribed(md, app, message.topic, message.input, (value)=>{
153
- if (serving) send({
154
- kind: 'event',
155
- id: message.id,
132
+ } : {
133
+ kind: 'result',
134
+ id,
156
135
  value
157
136
  });
158
- }));
159
- if (serving) send({
160
- kind: 'result',
161
- id: message.id,
162
- value: null
163
- });
137
+ resolved = true;
138
+ };
139
+ subscriptions.set(id, topic === 'deployment-facts' ? watchFacts(deliver) : watch(topic, topic === 'presentation' ? [
140
+ app
141
+ ] : message.input, deliver));
164
142
  return;
165
143
  }
166
144
  const value = await answered(md, app, writtenBy, message.member, message.input, deploymentFacts);
package/dist/host.js.map CHANGED
@@ -1 +1 @@
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":"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"}
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/host.ts"],"sourcesContent":["import type { WrittenBy } from './change.js';\nimport {\n composeRuntime,\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} 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\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, watch } = composeRuntime({ ...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 watchFacts = (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 const { id, topic } = message;\n let resolved = false;\n const deliver = (value: unknown) => {\n if (!serving) return;\n send(resolved ? { kind: 'event', id, value } : { kind: 'result', id, value });\n resolved = true;\n };\n subscriptions.set(\n id,\n topic === 'deployment-facts'\n ? watchFacts(deliver)\n : watch(topic, topic === 'presentation' ? [app] : message.input, deliver),\n );\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":["composeRuntime","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","serveMdRuntime","options","stopping","AbortController","stop","abort","signal","addEventListener","once","aborted","watch","attachments","Map","authorized","factsObservers","Set","watchFacts","deliver","add","attach","port","release","Error","undefined","subscriptions","serving","message","postMessage","detach","end","values","clear","serve","kind","get","id","topic","loaded","resolved","value","set","error","String","event","wire","data","matching","refusal","start","replaceDeploymentFacts","endAuthorization","shell","dropGeneration"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';
3
3
  export type { ChatDraft, ChatDraftSurface, ConversationEntry, ConversationOptions, ConversationSurface, ConversationView, GrowingText, } from './conversation.js';
4
4
  export type { ChatDraftFile, FileDeclaration } from './file.js';
5
5
  export type { AppRoom, AppSlot, AppSlotEntry, AppTypedSelection, ConnectionRefusal, ConnectionRefusalReason, HistoryQuery, MdRuntime, MdRuntimeOptions, PresentationSurface, RoomDraftSurface, RoomTypes, SavedRoomDraft, SaveResult, } from './connection.js';
6
+ export type { Observation } from './observation.js';
6
7
  export type { AcceptedOutcome, AffectedState, CallResult, QueueEntry, Submission, SubmissionOutcome, } from './outcome.js';
7
8
  export type { ChangedPart, FieldValue, ReturnReason, RoomDraft, RoomDraftCreation, RoomDraftParts, RoomDraftWrite, } from './room-draft.js';
8
9
  export type { SaveRefusal } from './save.js';
@@ -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,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,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,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/index.ts"],"sourcesContent":["export type {\n AcceptedMessage,\n ActionDeclaration,\n ActionRequest,\n ActionResult,\n Adapter,\n AdapterFailure,\n Authorization,\n BootstrapPage,\n BootstrapRequest,\n BootstrapResult,\n Capability,\n 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"}
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 { Observation } from './observation.js';\nexport type {\n AcceptedOutcome,\n AffectedState,\n CallResult,\n QueueEntry,\n Submission,\n SubmissionOutcome,\n} from './outcome.js';\nexport type {\n ChangedPart,\n FieldValue,\n ReturnReason,\n RoomDraft,\n RoomDraftCreation,\n RoomDraftParts,\n RoomDraftWrite,\n} from './room-draft.js';\nexport type { SaveRefusal } from './save.js';\nexport type {\n DocumentHit,\n DocumentPart,\n MessageHit,\n SearchRequest,\n SearchResult,\n} from './search.js';\nexport { changeBatchIdentity } from './identity.js';\nexport { createMdRuntime } from './connection.js';\nexport type { RuntimeShell } from './durability.js';\nexport type { AttentionEntry, SyncStatus } from './status.js';\nexport type {\n Backlink,\n Direction,\n DocumentQuery,\n DocumentResult,\n Filter,\n GroupQuery,\n GroupResult,\n Key,\n LocalQuery,\n OrderOptions,\n Predicate,\n QueryDocument,\n QueryGroup,\n QueryResult,\n Related,\n Select,\n Value,\n Where,\n} from './query.js';\n\nexport type {\n MdType,\n ModelIdentity,\n ModelSnapshot,\n ModelState,\n ModelResult,\n TypesResult,\n ValidationReceipt,\n} from './model.js';\nexport type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';\n"],"names":["changeBatchIdentity","createMdRuntime"],"mappings":"AAmGA,SAASA,mBAAmB,QAAQ,gBAAgB;AACpD,SAASC,eAAe,QAAQ,kBAAkB"}
@@ -0,0 +1,25 @@
1
+ import type { QueryDocument, QueryGroup, QueryResult } from './query.js';
2
+ export type Observation<T> = {
3
+ current(): T;
4
+ subscribe(listener: (value: T) => void): () => void;
5
+ close(): void;
6
+ };
7
+ export type RowKey = string | number;
8
+ export type KeyedResult = {
9
+ result: QueryResult;
10
+ keys: readonly RowKey[];
11
+ };
12
+ export type QueryChange = {
13
+ changed: readonly (readonly [RowKey, QueryDocument | QueryGroup])[];
14
+ removed: readonly RowKey[];
15
+ order: readonly RowKey[] | null;
16
+ };
17
+ export type Observed = {
18
+ observation: Observation<unknown>;
19
+ receive(message: unknown): void;
20
+ end(): void;
21
+ };
22
+ export declare function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[];
23
+ export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
24
+ export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
25
+ //# sourceMappingURL=observation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAEnF;AA0BD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B"}
@@ -0,0 +1,92 @@
1
+ export function rowsOf(result) {
2
+ return 'groups' in result ? result.groups : result.documents;
3
+ }
4
+ function keyedResult(first) {
5
+ const grouped = 'groups' in first.result;
6
+ const rows = rowsOf(first.result);
7
+ const byKey = new Map(first.keys.map((key, index)=>[
8
+ key,
9
+ rows[index]
10
+ ]));
11
+ let keys = first.keys;
12
+ return {
13
+ value: first.result,
14
+ next (message) {
15
+ const change = message;
16
+ for (const key of change.removed)byKey.delete(key);
17
+ for (const [key, row] of change.changed)byKey.set(key, row);
18
+ keys = change.order ?? keys.filter((key)=>byKey.has(key));
19
+ const next = keys.map((key)=>byKey.get(key));
20
+ return grouped ? {
21
+ groups: next
22
+ } : {
23
+ documents: next
24
+ };
25
+ }
26
+ };
27
+ }
28
+ function whole(first) {
29
+ return {
30
+ value: first,
31
+ next: (message)=>message
32
+ };
33
+ }
34
+ export function observed(first, stop, keyed) {
35
+ const reducer = keyed ? keyedResult(first) : whole(first);
36
+ let value = reducer.value;
37
+ let open = true;
38
+ const listeners = new Set();
39
+ const end = ()=>{
40
+ open = false;
41
+ listeners.clear();
42
+ };
43
+ return {
44
+ observation: {
45
+ current: ()=>value,
46
+ subscribe (listener) {
47
+ const entry = {
48
+ hear: listener
49
+ };
50
+ if (open) listeners.add(entry);
51
+ return ()=>{
52
+ listeners.delete(entry);
53
+ };
54
+ },
55
+ close () {
56
+ if (!open) return;
57
+ end();
58
+ stop();
59
+ }
60
+ },
61
+ receive (message) {
62
+ if (!open) return;
63
+ value = reducer.next(message);
64
+ for (const entry of [
65
+ ...listeners
66
+ ]){
67
+ if (listeners.has(entry)) entry.hear(value);
68
+ }
69
+ },
70
+ end
71
+ };
72
+ }
73
+ export function opened(watch, keyed) {
74
+ return new Promise((resolve, reject)=>{
75
+ let handle;
76
+ let stop = ()=>{};
77
+ try {
78
+ stop = watch((message)=>{
79
+ if (handle !== undefined) {
80
+ handle.receive(message);
81
+ return;
82
+ }
83
+ handle = observed(message, ()=>stop(), keyed);
84
+ resolve(handle.observation);
85
+ });
86
+ } catch (error) {
87
+ reject(error);
88
+ }
89
+ });
90
+ }
91
+
92
+ //# sourceMappingURL=observation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/observation.ts"],"sourcesContent":["import type { QueryDocument, QueryGroup, QueryResult } from './query.js';\n\nexport type Observation<T> = {\n current(): T;\n subscribe(listener: (value: T) => void): () => void;\n close(): void;\n};\n\nexport type RowKey = string | number;\n\nexport type KeyedResult = { result: QueryResult; keys: readonly RowKey[] };\n\nexport type QueryChange = {\n changed: readonly (readonly [RowKey, QueryDocument | QueryGroup])[];\n removed: readonly RowKey[];\n order: readonly RowKey[] | null;\n};\n\nexport type Observed = {\n observation: Observation<unknown>;\n receive(message: unknown): void;\n end(): void;\n};\n\nexport function rowsOf(result: QueryResult): readonly (QueryDocument | QueryGroup)[] {\n return 'groups' in result ? result.groups : result.documents;\n}\n\nfunction keyedResult(first: KeyedResult) {\n const grouped = 'groups' in first.result;\n const rows = rowsOf(first.result);\n const byKey = new Map(first.keys.map((key, index) => [key, rows[index]]));\n let keys = first.keys;\n return {\n value: first.result,\n next(message: unknown): QueryResult {\n const change = message as QueryChange;\n for (const key of change.removed) byKey.delete(key);\n for (const [key, row] of change.changed) byKey.set(key, row);\n keys = change.order ?? keys.filter((key) => byKey.has(key));\n const next = keys.map((key) => byKey.get(key) as QueryDocument | QueryGroup);\n return grouped\n ? { groups: next as readonly QueryGroup[] }\n : { documents: next as readonly QueryDocument[] };\n },\n };\n}\n\nfunction whole(first: unknown) {\n return { value: first, next: (message: unknown) => message };\n}\n\nexport function observed(first: unknown, stop: () => void, keyed: boolean): Observed {\n const reducer = keyed ? keyedResult(first as KeyedResult) : whole(first);\n let value = reducer.value;\n let open = true;\n const listeners = new Set<{ hear: (value: unknown) => void }>();\n const end = () => {\n open = false;\n listeners.clear();\n };\n return {\n observation: {\n current: () => value,\n subscribe(listener) {\n const entry = { hear: listener };\n if (open) listeners.add(entry);\n return () => {\n listeners.delete(entry);\n };\n },\n close() {\n if (!open) return;\n end();\n stop();\n },\n },\n receive(message) {\n if (!open) return;\n value = reducer.next(message);\n for (const entry of [...listeners]) {\n if (listeners.has(entry)) entry.hear(value);\n }\n },\n end,\n };\n}\n\nexport function opened(\n watch: (deliver: (message: unknown) => void) => () => void,\n keyed: boolean,\n): Promise<Observation<unknown>> {\n return new Promise((resolve, reject) => {\n let handle: Observed | undefined;\n let stop = () => {};\n try {\n stop = watch((message) => {\n if (handle !== undefined) {\n handle.receive(message);\n return;\n }\n handle = observed(message, () => stop(), keyed);\n resolve(handle.observation);\n });\n } catch (error) {\n reject(error);\n }\n });\n}\n"],"names":["rowsOf","result","groups","documents","keyedResult","first","grouped","rows","byKey","Map","keys","map","key","index","value","next","message","change","removed","delete","row","changed","set","order","filter","has","get","whole","observed","stop","keyed","reducer","open","listeners","Set","end","clear","observation","current","subscribe","listener","entry","hear","add","close","receive","opened","watch","Promise","resolve","reject","handle","undefined","error"],"mappings":"AAwBA,OAAO,SAASA,OAAOC,MAAmB;IACxC,OAAO,YAAYA,SAASA,OAAOC,MAAM,GAAGD,OAAOE,SAAS;AAC9D;AAEA,SAASC,YAAYC,KAAkB;IACrC,MAAMC,UAAU,YAAYD,MAAMJ,MAAM;IACxC,MAAMM,OAAOP,OAAOK,MAAMJ,MAAM;IAChC,MAAMO,QAAQ,IAAIC,IAAIJ,MAAMK,IAAI,CAACC,GAAG,CAAC,CAACC,KAAKC,QAAU;YAACD;YAAKL,IAAI,CAACM,MAAM;SAAC;IACvE,IAAIH,OAAOL,MAAMK,IAAI;IACrB,OAAO;QACLI,OAAOT,MAAMJ,MAAM;QACnBc,MAAKC,OAAgB;YACnB,MAAMC,SAASD;YACf,KAAK,MAAMJ,OAAOK,OAAOC,OAAO,CAAEV,MAAMW,MAAM,CAACP;YAC/C,KAAK,MAAM,CAACA,KAAKQ,IAAI,IAAIH,OAAOI,OAAO,CAAEb,MAAMc,GAAG,CAACV,KAAKQ;YACxDV,OAAOO,OAAOM,KAAK,IAAIb,KAAKc,MAAM,CAAC,CAACZ,MAAQJ,MAAMiB,GAAG,CAACb;YACtD,MAAMG,OAAOL,KAAKC,GAAG,CAAC,CAACC,MAAQJ,MAAMkB,GAAG,CAACd;YACzC,OAAON,UACH;gBAAEJ,QAAQa;YAA8B,IACxC;gBAAEZ,WAAWY;YAAiC;QACpD;IACF;AACF;AAEA,SAASY,MAAMtB,KAAc;IAC3B,OAAO;QAAES,OAAOT;QAAOU,MAAM,CAACC,UAAqBA;IAAQ;AAC7D;AAEA,OAAO,SAASY,SAASvB,KAAc,EAAEwB,IAAgB,EAAEC,KAAc;IACvE,MAAMC,UAAUD,QAAQ1B,YAAYC,SAAwBsB,MAAMtB;IAClE,IAAIS,QAAQiB,QAAQjB,KAAK;IACzB,IAAIkB,OAAO;IACX,MAAMC,YAAY,IAAIC;IACtB,MAAMC,MAAM;QACVH,OAAO;QACPC,UAAUG,KAAK;IACjB;IACA,OAAO;QACLC,aAAa;YACXC,SAAS,IAAMxB;YACfyB,WAAUC,QAAQ;gBAChB,MAAMC,QAAQ;oBAAEC,MAAMF;gBAAS;gBAC/B,IAAIR,MAAMC,UAAUU,GAAG,CAACF;gBACxB,OAAO;oBACLR,UAAUd,MAAM,CAACsB;gBACnB;YACF;YACAG;gBACE,IAAI,CAACZ,MAAM;gBACXG;gBACAN;YACF;QACF;QACAgB,SAAQ7B,OAAO;YACb,IAAI,CAACgB,MAAM;YACXlB,QAAQiB,QAAQhB,IAAI,CAACC;YACrB,KAAK,MAAMyB,SAAS;mBAAIR;aAAU,CAAE;gBAClC,IAAIA,UAAUR,GAAG,CAACgB,QAAQA,MAAMC,IAAI,CAAC5B;YACvC;QACF;QACAqB;IACF;AACF;AAEA,OAAO,SAASW,OACdC,KAA0D,EAC1DjB,KAAc;IAEd,OAAO,IAAIkB,QAAQ,CAACC,SAASC;QAC3B,IAAIC;QACJ,IAAItB,OAAO,KAAO;QAClB,IAAI;YACFA,OAAOkB,MAAM,CAAC/B;gBACZ,IAAImC,WAAWC,WAAW;oBACxBD,OAAON,OAAO,CAAC7B;oBACf;gBACF;gBACAmC,SAASvB,SAASZ,SAAS,IAAMa,QAAQC;gBACzCmB,QAAQE,OAAOd,WAAW;YAC5B;QACF,EAAE,OAAOgB,OAAO;YACdH,OAAOG;QACT;IACF;AACF"}
@@ -1,10 +1,11 @@
1
1
  import type { ChangeSet } from './change-set.js';
2
+ import { type KeyedResult, type QueryChange } from './observation.js';
2
3
  import type { Plan, QueryResult } from './query.js';
3
4
  import type { SearchedDocument } from './search.js';
4
5
  export type ReadSide = {
5
6
  apply(set: ChangeSet): void;
6
7
  query(plan: Plan): Promise<QueryResult>;
7
- observe(plan: Plan, identity: string, listener: (result: QueryResult) => void): () => void;
8
+ watch(plan: Plan, identity: string, deliver: (message: KeyedResult | QueryChange) => void): () => void;
8
9
  documents(): readonly SearchedDocument[];
9
10
  document(room: string, path: string): SearchedDocument | null;
10
11
  close(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAOV,IAAI,EAEJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC3F,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAqPF,wBAAgB,cAAc,IAAI,QAAQ,CAmHzC"}
1
+ {"version":3,"file":"read-side.d.ts","sourceRoot":"","sources":["../src/read-side.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAU,KAAK,WAAW,EAAE,KAAK,WAAW,EAAe,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAOV,IAAI,EAGJ,WAAW,EAIZ,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAoDpD,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACxC,KAAK,CACH,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,KAAK,IAAI,GACpD,MAAM,IAAI,CAAC;IACd,SAAS,IAAI,SAAS,gBAAgB,EAAE,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAC9D,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AA+RF,wBAAgB,cAAc,IAAI,QAAQ,CAuHzC"}