@agentshouse/mdruntime 0.1.0-alpha.38 → 0.1.0-alpha.39

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.
@@ -1,4 +1,4 @@
1
- import type { ConversationAction, ConversationCards, ConversationEvent, ConversationMessage, ConversationStream } from './adapter.js';
1
+ import type { ConversationAction, ConversationCards, ConversationEvent, ConversationMessage, ConversationStream, WorkingNote } from './adapter.js';
2
2
  import { type ChangeSet } from './change-set.js';
3
3
  import { type ChatDraftFile } from './file.js';
4
4
  import type { CallResult } from './outcome.js';
@@ -26,7 +26,14 @@ export type ConversationView = {
26
26
  conversation: string;
27
27
  messages: readonly ConversationMessage[];
28
28
  growingText: GrowingText | null;
29
- summary: unknown;
29
+ workingNote: WorkingNote | null;
30
+ plan: unknown;
31
+ questions: readonly unknown[];
32
+ process: {
33
+ running: boolean;
34
+ } | null;
35
+ commands: readonly unknown[];
36
+ options: readonly unknown[];
30
37
  chatDraft: ChatDraft | null;
31
38
  };
32
39
  export type ConversationSurface = {
@@ -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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"}
@@ -1,5 +1,14 @@
1
1
  import { conversationChangeSet } from './change-set.js';
2
2
  import { declaredFile } from './file.js';
3
+ const QUIET = {
4
+ growingText: null,
5
+ plan: null,
6
+ workingNote: null,
7
+ questions: [],
8
+ process: null,
9
+ commands: [],
10
+ options: []
11
+ };
3
12
  function ordered(left, right) {
4
13
  if (left.position !== right.position) return left.position < right.position ? -1 : 1;
5
14
  if (left.identity !== right.identity) return left.identity < right.identity ? -1 : 1;
@@ -71,16 +80,18 @@ export function createConversationStore(deps) {
71
80
  const sending = new Map();
72
81
  const behind = new Set();
73
82
  const gaps = new Map();
74
- const growing = new Map();
75
- const summaries = new Map();
83
+ const lives = new Map();
76
84
  const views = new Map();
77
85
  let replicated = new Set();
78
86
  let handedReplicated;
79
- let handedViewed;
87
+ function liveOf(conversation) {
88
+ return lives.get(conversation) ?? QUIET;
89
+ }
80
90
  function viewOf(conversation, limit) {
81
91
  const held = messages.get(conversation) ?? [];
82
92
  const shown = limit === undefined ? held : held.slice(Math.max(0, held.length - limit));
83
93
  const draft = drafts.get(conversation);
94
+ const facts = liveOf(conversation);
84
95
  return {
85
96
  conversation,
86
97
  messages: shown.map(({ identity, turn, text, message })=>({
@@ -89,8 +100,19 @@ export function createConversationStore(deps) {
89
100
  text,
90
101
  message: structuredClone(message)
91
102
  })),
92
- growingText: growing.get(conversation) ?? null,
93
- summary: structuredClone(summaries.get(conversation) ?? null),
103
+ growingText: facts.growingText === null ? null : {
104
+ ...facts.growingText
105
+ },
106
+ workingNote: facts.workingNote === null ? null : {
107
+ ...facts.workingNote
108
+ },
109
+ plan: structuredClone(facts.plan?.plan ?? null),
110
+ questions: structuredClone(facts.questions),
111
+ process: facts.process === null ? null : {
112
+ ...facts.process
113
+ },
114
+ commands: structuredClone(facts.commands),
115
+ options: structuredClone(facts.options),
94
116
  chatDraft: draft === undefined || draft.turn !== null || sending.get(conversation)?.draft === draft ? null : {
95
117
  text: draft.text,
96
118
  files: [
@@ -111,21 +133,25 @@ export function createConversationStore(deps) {
111
133
  for (const watcher of ready)watcher.notify(value);
112
134
  }
113
135
  }
114
- function viewed() {
115
- return [
116
- ...new Set([
117
- ...views.values()
118
- ].map((view)=>view.conversation))
119
- ].sort();
136
+ function live(conversation, change) {
137
+ lives.set(conversation, {
138
+ ...liveOf(conversation),
139
+ ...change
140
+ });
141
+ emit(conversation);
120
142
  }
121
- function handViewed() {
122
- const stream = deps.stream();
123
- if (stream === undefined) return;
124
- const open = viewed();
125
- const named = JSON.stringify(open);
126
- if (named === handedViewed) return;
127
- handedViewed = named;
128
- stream.view(open);
143
+ function sealTurns(conversation, turns) {
144
+ const held = lives.get(conversation);
145
+ if (held === undefined) return false;
146
+ const growingText = held.growingText !== null && turns.has(held.growingText.turn) ? null : held.growingText;
147
+ const plan = held.plan !== null && turns.has(held.plan.turn) ? null : held.plan;
148
+ if (growingText === held.growingText && plan === held.plan) return false;
149
+ lives.set(conversation, {
150
+ ...held,
151
+ growingText,
152
+ plan
153
+ });
154
+ return true;
129
155
  }
130
156
  function handReplicated() {
131
157
  const stream = deps.stream();
@@ -170,15 +196,14 @@ export function createConversationStore(deps) {
170
196
  identity: message.identity
171
197
  });
172
198
  }
173
- if (messages.has(conversation) || drafts.has(conversation) || growing.has(conversation) || summaries.has(conversation)) {
199
+ if (messages.has(conversation) || drafts.has(conversation) || lives.has(conversation)) {
174
200
  changed.push(conversation);
175
201
  }
176
202
  messages.delete(conversation);
177
203
  reads.delete(conversation);
178
204
  drafts.delete(conversation);
179
205
  behind.delete(conversation);
180
- growing.delete(conversation);
181
- summaries.delete(conversation);
206
+ lives.delete(conversation);
182
207
  }
183
208
  if (changed.length > 0) deps.publish(conversationChangeSet(removed, changed));
184
209
  });
@@ -208,7 +233,9 @@ export function createConversationStore(deps) {
208
233
  ]));
209
234
  if (advances) reads.set(conversation, message.position);
210
235
  if (sealed) drafts.delete(conversation);
211
- if (growing.get(conversation)?.turn === message.turn) growing.delete(conversation);
236
+ sealTurns(conversation, new Set([
237
+ message.turn
238
+ ]));
212
239
  deps.publish(conversationChangeSet([
213
240
  {
214
241
  conversation,
@@ -251,8 +278,7 @@ export function createConversationStore(deps) {
251
278
  messages.set(conversation, merged(messages.get(conversation) ?? [], arriving));
252
279
  reads.set(conversation, newest);
253
280
  if (sealed) drafts.delete(conversation);
254
- const growingTurn = growing.get(conversation)?.turn;
255
- if (arriving.some((message)=>message.turn === growingTurn)) growing.delete(conversation);
281
+ sealTurns(conversation, new Set(arriving.map((message)=>message.turn)));
256
282
  if ((gaps.get(conversation) ?? 0) === generation) behind.delete(conversation);
257
283
  if (arriving.length > 0 || sealed) {
258
284
  deps.publish(conversationChangeSet(arriving.map((message)=>({
@@ -456,7 +482,6 @@ export function createConversationStore(deps) {
456
482
  ready: false
457
483
  };
458
484
  view.watchers.add(watcher);
459
- handViewed();
460
485
  void deps.durably(()=>Promise.resolve()).then(()=>{
461
486
  if (deps.closed() || !view.watchers.has(watcher)) return;
462
487
  watcher.ready = true;
@@ -465,11 +490,6 @@ export function createConversationStore(deps) {
465
490
  return ()=>{
466
491
  if (!view.watchers.delete(watcher)) return;
467
492
  if (view.watchers.size === 0) views.delete(key);
468
- if (!viewed().includes(conversation)) {
469
- growing.delete(conversation);
470
- summaries.delete(conversation);
471
- }
472
- handViewed();
473
493
  };
474
494
  },
475
495
  changed (set) {
@@ -480,26 +500,71 @@ export function createConversationStore(deps) {
480
500
  const { conversation } = event;
481
501
  if (event.kind === 'gap') {
482
502
  if (replicated.has(conversation)) gap(conversation);
503
+ if (lives.delete(conversation)) emit(conversation);
483
504
  return;
484
505
  }
485
506
  if (event.kind === 'growing-text') {
486
- if (!viewed().includes(conversation)) return;
487
- growing.set(conversation, {
488
- turn: event.turn,
489
- text: event.text
507
+ live(conversation, {
508
+ growingText: {
509
+ turn: event.turn,
510
+ text: event.text
511
+ }
512
+ });
513
+ return;
514
+ }
515
+ if (event.kind === 'plan') {
516
+ live(conversation, {
517
+ plan: {
518
+ turn: event.turn,
519
+ plan: structuredClone(event.plan)
520
+ }
521
+ });
522
+ return;
523
+ }
524
+ if (event.kind === 'working-note') {
525
+ live(conversation, {
526
+ workingNote: event.note === null ? null : {
527
+ noteId: event.note.noteId,
528
+ text: event.note.text
529
+ }
530
+ });
531
+ return;
532
+ }
533
+ if (event.kind === 'questions') {
534
+ live(conversation, {
535
+ questions: structuredClone(event.questions)
490
536
  });
491
- emit(conversation);
492
537
  return;
493
538
  }
494
- if (event.kind === 'session-summary') {
495
- if (!viewed().includes(conversation)) return;
496
- summaries.set(conversation, structuredClone(event.summary));
497
- emit(conversation);
539
+ if (event.kind === 'process') {
540
+ live(conversation, {
541
+ process: {
542
+ running: event.running
543
+ }
544
+ });
545
+ return;
546
+ }
547
+ if (event.kind === 'commands') {
548
+ live(conversation, {
549
+ commands: structuredClone(event.commands)
550
+ });
551
+ return;
552
+ }
553
+ if (event.kind === 'options') {
554
+ live(conversation, {
555
+ options: structuredClone(event.options)
556
+ });
498
557
  return;
499
558
  }
500
559
  const arriving = acceptedMessage(event.message);
501
- if (arriving === null || !replicated.has(conversation)) return;
502
- void keep(conversation, arriving).catch(()=>{});
560
+ if (arriving === null) return;
561
+ if (replicated.has(conversation)) {
562
+ void keep(conversation, arriving).catch(()=>{});
563
+ return;
564
+ }
565
+ if (sealTurns(conversation, new Set([
566
+ arriving.turn
567
+ ]))) emit(conversation);
503
568
  },
504
569
  messages () {
505
570
  return [
@@ -520,8 +585,7 @@ export function createConversationStore(deps) {
520
585
  },
521
586
  close () {
522
587
  views.clear();
523
- growing.clear();
524
- summaries.clear();
588
+ lives.clear();
525
589
  }
526
590
  };
527
591
  }
@@ -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 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.filter(\n (document): document is Required<QueryDocument> => typeof document.type === 'string',\n );\n }\n\n function carded(\n documents: readonly Required<QueryDocument>[],\n ): readonly { conversation: string; card: Required<QueryDocument> }[] {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const cards: { conversation: string; card: Required<QueryDocument> }[] = [];\n for (const card of documents) {\n if (card.type !== declaration.type) continue;\n const identity = card.fields[declaration.identity];\n if (typeof identity === 'string') cards.push({ conversation: identity, card });\n }\n return cards;\n }\n\n async function remove(leaving: readonly string[]) {\n await deps.durably(async (local) => {\n await local.dropConversations(leaving);\n const removed: MessageChange[] = [];\n const changed: string[] = [];\n for (const conversation of leaving) {\n for (const message of messages.get(conversation) ?? []) {\n removed.push({ conversation, identity: message.identity });\n }\n if (\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","document","type","carded","card","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","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
+ {"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 WorkingNote,\n} from './adapter.js';\nimport { conversationChangeSet, type ChangeSet, type MessageChange } from './change-set.js';\nimport { declaredFile, type ChatDraftFile } from './file.js';\nimport type { CallResult } from './outcome.js';\nimport type { DocumentResult, QueryDocument } from './query.js';\nimport type { SearchedMessage } from './search.js';\nimport type { CycleProgress } from './status.js';\nimport type { ChatDraftRecord, HeldConversation, RuntimeStore } from './store.js';\n\nexport type ConversationEntry = {\n conversation: string;\n card: Required<QueryDocument>;\n agent: Required<QueryDocument> | null;\n};\n\nexport type GrowingText = { turn: string; text: string };\n\nexport type ChatDraft = {\n text: string;\n files: readonly ChatDraftFile[];\n};\n\nexport type ConversationOptions = { limit?: number };\n\nexport type ConversationView = {\n conversation: string;\n messages: readonly ConversationMessage[];\n growingText: GrowingText | null;\n workingNote: WorkingNote | null;\n plan: unknown;\n questions: readonly unknown[];\n process: { running: boolean } | null;\n commands: readonly unknown[];\n options: readonly 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 Live = {\n growingText: GrowingText | null;\n plan: { turn: string; plan: unknown } | null;\n workingNote: WorkingNote | null;\n questions: readonly unknown[];\n process: { running: boolean } | null;\n commands: readonly unknown[];\n options: readonly unknown[];\n};\n\nconst QUIET: Live = {\n growingText: null,\n plan: null,\n workingNote: null,\n questions: [],\n process: null,\n commands: [],\n options: [],\n};\n\ntype SharedView = {\n conversation: string;\n limit: number | undefined;\n watchers: Set<Watcher>;\n};\n\nfunction ordered(left: AcceptedMessage, right: AcceptedMessage): number {\n if (left.position !== right.position) return left.position < right.position ? -1 : 1;\n if (left.identity !== right.identity) return left.identity < right.identity ? -1 : 1;\n return 0;\n}\n\nfunction merged(\n held: readonly AcceptedMessage[],\n arriving: readonly AcceptedMessage[],\n): readonly AcceptedMessage[] {\n const byIdentity = new Map(held.map((message) => [message.identity, message]));\n for (const message of arriving) byIdentity.set(message.identity, message);\n return [...byIdentity.values()].sort(ordered);\n}\n\nfunction acceptedMessage(value: unknown): AcceptedMessage | null {\n if (typeof value !== 'object' || value === null) return null;\n const record = value as Partial<Record<keyof AcceptedMessage, unknown>>;\n if (\n typeof record.identity !== 'string' ||\n typeof record.turn !== 'string' ||\n typeof record.position !== 'string' ||\n typeof record.text !== 'string'\n ) {\n return null;\n }\n return {\n identity: record.identity,\n turn: record.turn,\n position: record.position,\n text: record.text,\n message: structuredClone(record.message),\n };\n}\n\nfunction historyPage(result: CallResult): ConversationHistoryPage | null {\n if (result.kind !== 'action') return null;\n const answer = result.result;\n if (typeof answer !== 'object' || answer === null) return null;\n const record = answer as { messages?: unknown; next?: unknown };\n if (!Array.isArray(record.messages)) return null;\n if (record.next !== undefined && typeof record.next !== 'string') return null;\n const messages: AcceptedMessage[] = [];\n for (const entry of record.messages) {\n const message = acceptedMessage(entry);\n if (message === null) return null;\n messages.push(message);\n }\n return { messages, ...(record.next === undefined ? {} : { next: record.next }) };\n}\n\nfunction turnOf(result: CallResult): string | null {\n if (result.kind !== 'action') return null;\n const answer = result.result;\n if (typeof answer !== 'object' || answer === null) return null;\n const record = answer as { turn?: unknown };\n return typeof record.turn === 'string' ? record.turn : null;\n}\n\nfunction limitOf(options: ConversationOptions): number | undefined {\n const { limit } = options;\n if (limit === undefined) return undefined;\n if (!Number.isInteger(limit) || limit < 0) {\n throw new Error(`conversation limit must be a non-negative integer, got ${String(limit)}`);\n }\n return limit;\n}\n\nexport function createConversationStore(deps: ConversationDependencies): ConversationStore {\n const messages = new Map<string, readonly AcceptedMessage[]>();\n const reads = new Map<string, string | null>();\n const drafts = new Map<string, ChatDraftRecord>();\n const sending = new Map<string, Sending>();\n const behind = new Set<string>();\n const gaps = new Map<string, number>();\n const lives = new Map<string, Live>();\n const views = new Map<string, SharedView>();\n let replicated: ReadonlySet<string> = new Set();\n let handedReplicated: string | undefined;\n\n function liveOf(conversation: string): Live {\n return lives.get(conversation) ?? QUIET;\n }\n\n function viewOf(conversation: string, limit: number | undefined): ConversationView {\n const held = messages.get(conversation) ?? [];\n const shown = limit === undefined ? held : held.slice(Math.max(0, held.length - limit));\n const draft = drafts.get(conversation);\n const facts = liveOf(conversation);\n return {\n conversation,\n messages: shown.map(({ identity, turn, text, message }) => ({\n identity,\n turn,\n text,\n message: structuredClone(message),\n })),\n growingText: facts.growingText === null ? null : { ...facts.growingText },\n workingNote: facts.workingNote === null ? null : { ...facts.workingNote },\n plan: structuredClone(facts.plan?.plan ?? null),\n questions: structuredClone(facts.questions),\n process: facts.process === null ? null : { ...facts.process },\n commands: structuredClone(facts.commands),\n options: structuredClone(facts.options),\n chatDraft:\n draft === undefined || draft.turn !== null || sending.get(conversation)?.draft === draft\n ? null\n : { text: draft.text, files: [...draft.files] },\n };\n }\n\n function emit(conversation: string) {\n if (deps.closed()) return;\n for (const view of views.values()) {\n if (view.conversation !== conversation) continue;\n const ready = [...view.watchers].filter((watcher) => watcher.ready);\n if (ready.length === 0) continue;\n const value = viewOf(conversation, view.limit);\n for (const watcher of ready) watcher.notify(value);\n }\n }\n\n function live(conversation: string, change: Partial<Live>) {\n lives.set(conversation, { ...liveOf(conversation), ...change });\n emit(conversation);\n }\n\n function sealTurns(conversation: string, turns: ReadonlySet<string>): boolean {\n const held = lives.get(conversation);\n if (held === undefined) return false;\n const growingText =\n held.growingText !== null && turns.has(held.growingText.turn) ? null : held.growingText;\n const plan = held.plan !== null && turns.has(held.plan.turn) ? null : held.plan;\n if (growingText === held.growingText && plan === held.plan) return false;\n lives.set(conversation, { ...held, growingText, plan });\n return true;\n }\n\n function handReplicated() {\n const stream = deps.stream();\n if (stream === undefined) return;\n const held = [...replicated].sort();\n const named = JSON.stringify(held);\n if (named === handedReplicated) return;\n handedReplicated = named;\n stream.replicate(held);\n }\n\n async function documented(): Promise<readonly Required<QueryDocument>[]> {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const { documents } = await deps.documents(declaration.locator);\n return documents.filter(\n (document): document is Required<QueryDocument> => typeof document.type === 'string',\n );\n }\n\n function carded(\n documents: readonly Required<QueryDocument>[],\n ): readonly { conversation: string; card: Required<QueryDocument> }[] {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const cards: { conversation: string; card: Required<QueryDocument> }[] = [];\n for (const card of documents) {\n if (card.type !== declaration.type) continue;\n const identity = card.fields[declaration.identity];\n if (typeof identity === 'string') cards.push({ conversation: identity, card });\n }\n return cards;\n }\n\n async function remove(leaving: readonly string[]) {\n await deps.durably(async (local) => {\n await local.dropConversations(leaving);\n const removed: MessageChange[] = [];\n const changed: string[] = [];\n for (const conversation of leaving) {\n for (const message of messages.get(conversation) ?? []) {\n removed.push({ conversation, identity: message.identity });\n }\n if (messages.has(conversation) || drafts.has(conversation) || lives.has(conversation)) {\n changed.push(conversation);\n }\n messages.delete(conversation);\n reads.delete(conversation);\n drafts.delete(conversation);\n behind.delete(conversation);\n lives.delete(conversation);\n }\n if (changed.length > 0) deps.publish(conversationChangeSet(removed, changed));\n });\n }\n\n function gap(conversation: string) {\n gaps.set(conversation, (gaps.get(conversation) ?? 0) + 1);\n behind.add(conversation);\n }\n\n function keep(conversation: string, message: AcceptedMessage) {\n return deps.durably(async (local) => {\n if (!replicated.has(conversation)) return;\n const read = reads.get(conversation);\n const advances =\n read !== undefined &&\n !behind.has(conversation) &&\n (read === null || message.position > read);\n const sealed = drafts.get(conversation)?.turn === message.turn;\n await local.keepMessages({\n conversation,\n messages: [message],\n ...(advances ? { read: message.position } : {}),\n sealed,\n });\n messages.set(conversation, merged(messages.get(conversation) ?? [], [message]));\n if (advances) reads.set(conversation, message.position);\n if (sealed) drafts.delete(conversation);\n sealTurns(conversation, new Set([message.turn]));\n deps.publish(\n conversationChangeSet([{ conversation, identity: message.identity }], [conversation]),\n );\n });\n }\n\n async function readHistory(conversation: string): Promise<CallResult | null> {\n const generation = gaps.get(conversation) ?? 0;\n const from = reads.get(conversation);\n const arriving: AcceptedMessage[] = [];\n let after = from ?? undefined;\n for (;;) {\n const result = await deps.call('conversation.history', {\n conversation,\n ...(after === undefined ? {} : { after }),\n });\n const page = historyPage(result);\n if (page === null) return result;\n arriving.push(...page.messages);\n if (page.next === undefined) break;\n after = page.next;\n }\n await deps.durably(async (local) => {\n if (!replicated.has(conversation)) return;\n const newest = arriving.reduce<string | null>(\n (top, message) => (top === null || message.position > top ? message.position : top),\n from ?? null,\n );\n const turn = drafts.get(conversation)?.turn;\n const sealed = arriving.some((message) => message.turn === turn);\n await local.keepMessages({ conversation, messages: arriving, read: newest, sealed });\n messages.set(conversation, merged(messages.get(conversation) ?? [], arriving));\n reads.set(conversation, newest);\n if (sealed) drafts.delete(conversation);\n sealTurns(conversation, new Set(arriving.map((message) => message.turn)));\n if ((gaps.get(conversation) ?? 0) === generation) behind.delete(conversation);\n if (arriving.length > 0 || sealed) {\n deps.publish(\n conversationChangeSet(\n arriving.map((message) => ({ conversation, identity: message.identity })),\n [conversation],\n ),\n );\n }\n });\n return null;\n }\n\n function withDraft(\n conversation: string,\n next: (draft: ChatDraftRecord | undefined) => ChatDraftRecord | null | undefined,\n ): Promise<void> {\n return deps.durably(async (local) => {\n const following = next(drafts.get(conversation));\n if (following === undefined) return;\n if (following === null) {\n await local.dropChatDraft(conversation);\n drafts.delete(conversation);\n } else {\n await local.keepChatDraft(following);\n drafts.set(conversation, following);\n }\n deps.publish(conversationChangeSet([], [conversation]));\n });\n }\n\n function invoke(\n name: ConversationAction,\n conversation: string,\n extra: Readonly<Record<string, unknown>> = {},\n ): Promise<CallResult> {\n return deps.call(name, { conversation, ...extra });\n }\n\n const surface: ConversationSurface = {\n async list() {\n const declaration = deps.cards();\n if (declaration === undefined) return [];\n const documents = await documented();\n const entries: ConversationEntry[] = carded(documents).map(({ conversation, card }) => ({\n conversation,\n card,\n agent:\n documents.find((document) =>\n document.backlinks.some(\n (backlink) => backlink.path === card.path && backlink.field === declaration.agent,\n ),\n ) ?? null,\n }));\n entries.sort((left, right) => (left.conversation < right.conversation ? -1 : 1));\n return entries;\n },\n async read(conversation: string, options: ConversationOptions = {}) {\n const limit = limitOf(options);\n return deps.durably(() => Promise.resolve(viewOf(conversation, limit)));\n },\n create(input: unknown) {\n return deps.call('conversation.create', input);\n },\n async send(conversation: string) {\n const draft = drafts.get(conversation);\n const pending: Sending | undefined = draft === undefined ? undefined : { draft };\n if (pending !== undefined) {\n sending.set(conversation, pending);\n deps.publish(conversationChangeSet([], [conversation]));\n }\n try {\n const files = await Promise.all(\n (draft?.files ?? []).map(async (file) => ({\n ...(await declaredFile(file)),\n blob: file.blob,\n })),\n );\n const result = await invoke('conversation.send', conversation, {\n text: draft?.text ?? '',\n files,\n });\n const turn = turnOf(result);\n if (turn === null || draft === undefined) return result;\n await withDraft(conversation, (current) => {\n if (current !== draft) return undefined;\n const sealed = (messages.get(conversation) ?? []).some(\n (message) => message.turn === turn,\n );\n return sealed ? null : { ...draft, turn };\n });\n return result;\n } finally {\n if (pending !== undefined && sending.get(conversation) === pending) {\n sending.delete(conversation);\n if (drafts.get(conversation) === draft) {\n deps.publish(conversationChangeSet([], [conversation]));\n }\n }\n }\n },\n answer(conversation: string, answer: unknown) {\n return invoke('conversation.answer', conversation, { answer });\n },\n interrupt(conversation: string) {\n return invoke('conversation.interrupt', conversation);\n },\n kill(conversation: string) {\n return invoke('conversation.kill', conversation);\n },\n async cancel(conversation: string, turn: string) {\n const result = await invoke('conversation.cancel', conversation, { turn });\n if (result.kind !== 'action') return result;\n await withDraft(conversation, (current) =>\n current === undefined || current.turn !== turn ? undefined : { ...current, turn: null },\n );\n return result;\n },\n delete(conversation: string) {\n return invoke('conversation.delete', conversation);\n },\n };\n\n const chatDraft: ChatDraftSurface = {\n write(conversation: string, draft: ChatDraft) {\n return withDraft(conversation, () => ({\n conversation,\n text: draft.text,\n files: [...draft.files],\n turn: null,\n }));\n },\n discard(conversation: string) {\n return withDraft(conversation, (current) => (current === undefined ? undefined : null));\n },\n };\n\n return {\n surface,\n chatDraft,\n hydrate(held, stored) {\n messages.clear();\n reads.clear();\n for (const entry of held) {\n messages.set(entry.conversation, [...entry.messages].sort(ordered));\n if (entry.read !== undefined) reads.set(entry.conversation, entry.read);\n }\n drafts.clear();\n for (const record of stored) drafts.set(record.conversation, record);\n },\n async reconcile() {\n const named = new Set(carded(await documented()).map((entry) => entry.conversation));\n const leaving = [\n ...new Set([...replicated, ...messages.keys(), ...reads.keys(), ...drafts.keys()]),\n ].filter((conversation) => !named.has(conversation));\n for (const conversation of named) {\n if (!replicated.has(conversation)) behind.add(conversation);\n }\n replicated = named;\n handReplicated();\n if (leaving.length > 0) await remove(leaving);\n },\n async catchUp(progress) {\n for (const conversation of [...behind].sort()) {\n if (deps.closed()) return;\n if (!replicated.has(conversation)) continue;\n const failed = await readHistory(conversation);\n if (failed?.kind === 'transport-uncertainty') progress.reachable = false;\n }\n if (behind.size > 0) progress.complete = false;\n },\n current() {\n return behind.size === 0;\n },\n reconnected() {\n for (const conversation of replicated) gap(conversation);\n },\n watch(conversation, options, deliver) {\n const limit = limitOf(options);\n const key = JSON.stringify([conversation, limit ?? null]);\n const view = views.get(key) ?? { conversation, limit, watchers: new Set<Watcher>() };\n views.set(key, view);\n const watcher: Watcher = { notify: deliver, ready: false };\n view.watchers.add(watcher);\n void deps\n .durably(() => Promise.resolve())\n .then(() => {\n if (deps.closed() || !view.watchers.has(watcher)) return;\n watcher.ready = true;\n watcher.notify(viewOf(conversation, limit));\n })\n .catch(() => {});\n return () => {\n if (!view.watchers.delete(watcher)) return;\n if (view.watchers.size === 0) views.delete(key);\n };\n },\n changed(set) {\n for (const conversation of set.conversations) emit(conversation);\n },\n receive(event) {\n if (deps.closed()) return;\n const { conversation } = event;\n if (event.kind === 'gap') {\n if (replicated.has(conversation)) gap(conversation);\n if (lives.delete(conversation)) emit(conversation);\n return;\n }\n if (event.kind === 'growing-text') {\n live(conversation, { growingText: { turn: event.turn, text: event.text } });\n return;\n }\n if (event.kind === 'plan') {\n live(conversation, { plan: { turn: event.turn, plan: structuredClone(event.plan) } });\n return;\n }\n if (event.kind === 'working-note') {\n live(conversation, {\n workingNote:\n event.note === null ? null : { noteId: event.note.noteId, text: event.note.text },\n });\n return;\n }\n if (event.kind === 'questions') {\n live(conversation, { questions: structuredClone(event.questions) });\n return;\n }\n if (event.kind === 'process') {\n live(conversation, { process: { running: event.running } });\n return;\n }\n if (event.kind === 'commands') {\n live(conversation, { commands: structuredClone(event.commands) });\n return;\n }\n if (event.kind === 'options') {\n live(conversation, { options: structuredClone(event.options) });\n return;\n }\n const arriving = acceptedMessage(event.message);\n if (arriving === null) return;\n if (replicated.has(conversation)) {\n void keep(conversation, arriving).catch(() => {});\n return;\n }\n if (sealTurns(conversation, new Set([arriving.turn]))) emit(conversation);\n },\n messages() {\n return [...messages].flatMap(([conversation, held]) =>\n held.map(({ identity, text }) => ({ conversation, identity, text })),\n );\n },\n message(conversation, identity) {\n const held = messages.get(conversation)?.find((message) => message.identity === identity);\n return held === undefined ? null : { conversation, identity, text: held.text };\n },\n close() {\n views.clear();\n lives.clear();\n },\n };\n}\n"],"names":["conversationChangeSet","declaredFile","QUIET","growingText","plan","workingNote","questions","process","commands","options","ordered","left","right","position","identity","merged","held","arriving","byIdentity","Map","map","message","set","values","sort","acceptedMessage","value","record","turn","text","structuredClone","historyPage","result","kind","answer","Array","isArray","messages","next","undefined","entry","push","turnOf","limitOf","limit","Number","isInteger","Error","String","createConversationStore","deps","reads","drafts","sending","behind","Set","gaps","lives","views","replicated","handedReplicated","liveOf","conversation","get","viewOf","shown","slice","Math","max","length","draft","facts","chatDraft","files","emit","closed","view","ready","watchers","filter","watcher","notify","live","change","sealTurns","turns","has","handReplicated","stream","named","JSON","stringify","replicate","documented","declaration","cards","documents","locator","document","type","carded","card","fields","remove","leaving","durably","local","dropConversations","removed","changed","delete","publish","gap","add","keep","read","advances","sealed","keepMessages","readHistory","generation","from","after","call","page","newest","reduce","top","some","withDraft","following","dropChatDraft","keepChatDraft","invoke","name","extra","surface","list","entries","agent","find","backlinks","backlink","path","field","Promise","resolve","create","input","send","pending","all","file","blob","current","interrupt","kill","cancel","write","discard","hydrate","stored","clear","reconcile","keys","catchUp","progress","failed","reachable","size","complete","reconnected","watch","deliver","key","then","catch","conversations","receive","event","note","noteId","running","flatMap","close"],"mappings":"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"}
@@ -1 +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,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;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAmFF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAwH3E;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;IAClC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAqFF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAwH3E;AAED,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
package/dist/host.js CHANGED
@@ -15,6 +15,8 @@ function answered(md, app, writtenBy, member, input, deploymentFacts) {
15
15
  return md.types(input[0]);
16
16
  case 'syncStatus':
17
17
  return md.syncStatus();
18
+ case 'serviceMode':
19
+ return md.serviceMode();
18
20
  case 'save':
19
21
  return md.save(input[0], input[1], writtenBy);
20
22
  case 'outcome':
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 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 stop(): 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 closing = new AbortController();\n const close = () => {\n closing.abort();\n };\n options.signal?.addEventListener('abort', close, { once: true });\n if (options.signal?.aborted === true) close();\n const runtime = composeRuntime({ ...options, signal: closing.signal });\n const { md, watch } = runtime;\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 close();\n await removeRuntimeStore();\n await options.shell.dropGeneration();\n },\n stop() {\n return runtime.stop();\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","closing","AbortController","close","abort","signal","addEventListener","once","aborted","runtime","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","stop"],"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 stop(): 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 'serviceMode':\n return md.serviceMode();\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 closing = new AbortController();\n const close = () => {\n closing.abort();\n };\n options.signal?.addEventListener('abort', close, { once: true });\n if (options.signal?.aborted === true) close();\n const runtime = composeRuntime({ ...options, signal: closing.signal });\n const { md, watch } = runtime;\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 close();\n await removeRuntimeStore();\n await options.shell.dropGeneration();\n },\n stop() {\n return runtime.stop();\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","serviceMode","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","closing","AbortController","close","abort","signal","addEventListener","once","aborted","runtime","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","stop"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ContractUnavailable, ConversationAction, ConversationCards, ConversationEvent, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, ModelRequest, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomNotReadable, RoomVersionNotification, SelectedRooms, TransportUncertainty, TypedSelection, } from './adapter.js';
1
+ export type { AcceptedMessage, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ContractUnavailable, ConversationAction, ConversationCards, ConversationEvent, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, MdModelIdentity, ModelRequest, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomNotReadable, RoomVersionNotification, SelectedRooms, ServiceMode, ServiceModeSignal, TransportUncertainty, TypedSelection, WorkingNote, } from './adapter.js';
2
2
  export type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';
3
3
  export type { ChatDraft, ChatDraftSurface, ConversationEntry, ConversationOptions, ConversationSurface, ConversationView, GrowingText, } from './conversation.js';
4
4
  export type { ChatDraftFile, FileDeclaration } from './file.js';
@@ -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,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,OAAO,EACP,cAAc,EACd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,0BAA0B,EAC1B,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EACX,cAAc,EACd,aAAa,EACb,SAAS,EACT,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,uBAAuB,EACvB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,YAAY,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAChE,YAAY,EACV,OAAO,EACP,OAAO,EACP,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,UAAU,EACV,UAAU,EACV,iBAAiB,GAClB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EACV,WAAW,EACX,YAAY,EACZ,UAAU,EACV,aAAa,EACb,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,EACb,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,GAAG,EACH,UAAU,EACV,YAAY,EACZ,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,OAAO,EACP,MAAM,EACN,KAAK,EACL,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,UAAU,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["/workspace/packages/mdruntime/src/index.ts"],"sourcesContent":["export type {\n AcceptedMessage,\n ActionDeclaration,\n ActionRequest,\n ActionResult,\n Adapter,\n AdapterFailure,\n Authorization,\n BootstrapPage,\n BootstrapRequest,\n BootstrapResult,\n Capability,\n 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"}
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 HistoryAuthor,\n HistoryRequest,\n HistoryResult,\n HistoryRetention,\n HistoryRevision,\n MdModelIdentity,\n ModelRequest,\n MutationRequest,\n MutationResult,\n PageToken,\n ProviderLimit,\n ProviderRefusal,\n RefreshPage,\n RefreshRequest,\n RefreshResult,\n Retention,\n RetryableRefusal,\n RevokedAuthorization,\n RoomNotReadable,\n RoomVersionNotification,\n SelectedRooms,\n ServiceMode,\n ServiceModeSignal,\n TransportUncertainty,\n TypedSelection,\n WorkingNote,\n} from './adapter.js';\nexport type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';\nexport type {\n ChatDraft,\n ChatDraftSurface,\n ConversationEntry,\n ConversationOptions,\n ConversationSurface,\n ConversationView,\n GrowingText,\n} from './conversation.js';\nexport type { ChatDraftFile, FileDeclaration } from './file.js';\nexport type {\n AppRoom,\n AppSlot,\n AppSlotEntry,\n AppTypedSelection,\n ConnectionRefusal,\n ConnectionRefusalReason,\n HistoryQuery,\n MdRuntime,\n MdRuntimeOptions,\n PresentationSurface,\n RoomDraftSurface,\n RoomTypes,\n SavedRoomDraft,\n SaveResult,\n} from './connection.js';\nexport type { Observation } from './observation.js';\nexport type {\n AcceptedOutcome,\n AffectedState,\n CallResult,\n QueueEntry,\n Submission,\n SubmissionOutcome,\n} from './outcome.js';\nexport type {\n ChangedPart,\n FieldValue,\n ReturnReason,\n RoomDraft,\n RoomDraftCreation,\n RoomDraftParts,\n RoomDraftWrite,\n} from './room-draft.js';\nexport type { SaveRefusal } from './save.js';\nexport type {\n DocumentHit,\n DocumentPart,\n MessageHit,\n SearchRequest,\n SearchResult,\n} from './search.js';\nexport { changeBatchIdentity } from './identity.js';\nexport { createMdRuntime } from './connection.js';\nexport type { RuntimeShell } from './durability.js';\nexport type { AttentionEntry, SyncStatus } from './status.js';\nexport type {\n Backlink,\n Direction,\n DocumentQuery,\n DocumentResult,\n Filter,\n GroupQuery,\n GroupResult,\n Key,\n LocalQuery,\n OrderOptions,\n Predicate,\n QueryDocument,\n QueryGroup,\n QueryResult,\n Related,\n Select,\n Value,\n Where,\n} from './query.js';\n\nexport type {\n MdType,\n ModelIdentity,\n ModelSnapshot,\n ModelState,\n ModelResult,\n TypesResult,\n ValidationReceipt,\n} from './model.js';\nexport type { OperationScopes, ReplicaAdmission, ScopedRefusal } from './adapter.js';\n"],"names":["changeBatchIdentity","createMdRuntime"],"mappings":"AAuGA,SAASA,mBAAmB,QAAQ,gBAAgB;AACpD,SAASC,eAAe,QAAQ,kBAAkB"}