@assistant-ui/react 0.8.12 → 0.8.14

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.
@@ -8,14 +8,14 @@ import { ThreadListItemRuntimePath, ThreadRuntimePath } from "./RuntimePathTypes
8
8
  import { ThreadListItemState } from "./ThreadListItemRuntime";
9
9
  import { RunConfig } from "../types/AssistantTypes";
10
10
  import { ModelContext } from "../model-context";
11
- import { ChatModelRunResult } from "../runtimes";
11
+ import { ChatModelRunOptions, ChatModelRunResult } from "../runtimes";
12
12
  export type CreateStartRunConfig = {
13
13
  parentId: string | null;
14
14
  sourceId?: string | null | undefined;
15
15
  runConfig?: RunConfig | undefined;
16
16
  };
17
17
  export type CreateResumeRunConfig = CreateStartRunConfig & {
18
- stream: AsyncGenerator<ChatModelRunResult, void, unknown>;
18
+ stream: (options: ChatModelRunOptions) => AsyncGenerator<ChatModelRunResult, void, unknown>;
19
19
  };
20
20
  export type CreateAppendMessage = string | {
21
21
  parentId?: string | null | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRuntime.d.ts","sourceRoot":"","sources":["../../src/api/ThreadRuntime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThreadRuntime.d.ts","sourceRoot":"","sources":["../../src/api/ThreadRuntime.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/ThreadRuntime.ts"],"sourcesContent":["import {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../runtimes/core/ThreadRuntimeCore\";\nimport { ExportedMessageRepository } from \"../runtimes/utils/MessageRepository\";\nimport { AppendMessage, ThreadMessage, Unsubscribe } from \"../types\";\nimport {\n MessageRuntime,\n MessageRuntimeImpl,\n MessageState,\n} from \"./MessageRuntime\";\nimport { NestedSubscriptionSubject } from \"./subscribable/NestedSubscriptionSubject\";\nimport { ShallowMemoizeSubject } from \"./subscribable/ShallowMemoizeSubject\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport {\n ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./ComposerRuntime\";\nimport { SKIP_UPDATE } from \"./subscribable/SKIP_UPDATE\";\nimport {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./RuntimePathTypes\";\nimport { ThreadListItemState } from \"./ThreadListItemRuntime\";\nimport { RunConfig } from \"../types/AssistantTypes\";\nimport { EventSubscriptionSubject } from \"./subscribable/EventSubscriptionSubject\";\nimport { symbolInnerMessage } from \"../runtimes/external-store/getExternalStoreMessage\";\nimport { ModelContext } from \"../model-context\";\nimport { ChatModelRunResult } from \"../runtimes\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream: AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n stream: message.stream,\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n };\n }\n\n if (message.role && message.parentId && message.attachments) {\n return message as AppendMessage;\n }\n\n return {\n ...message,\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n attachments: message.attachments ?? [],\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.8.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.8.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isRunning:\n lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\",\n messages: runtime.messages,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n /**\n * @deprecated pass an object with `parentId` instead. This will be removed in 0.8.0.\n */\n startRun(parentId: string | null): void;\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n unstable_resumeRun(config: CreateResumeRunConfig): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n /**\n * @deprecated This method was renamed to `getModelContext`.\n */\n getModelConfig(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n getMesssageByIndex(idx: number): MessageRuntime;\n getMesssageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking: () => void;\n\n unstable_on(event: ThreadRuntimeEventType, callback: () => void): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.getMesssageByIndex = this.getMesssageByIndex.bind(this);\n this.getMesssageById = this.getMesssageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getModelConfig = this.getModelConfig.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public getModelConfig() {\n return this.getModelContext();\n }\n\n public startRun(configOrParentId: string | null | CreateStartRunConfig) {\n const config =\n configOrParentId === null || typeof configOrParentId === \"string\"\n ? { parentId: configOrParentId }\n : configOrParentId;\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public unstable_resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public getMesssageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n };\n },\n );\n }\n\n public getMesssageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref:\n this.path.ref +\n `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined) return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n const submittedFeedback = thread.getSubmittedFeedback(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n\n submittedFeedback,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on(\n event: ThreadRuntimeEventType,\n callback: () => void,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject({\n event: event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback);\n }\n}\n"],"mappings":"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","names":["callback"]}
1
+ {"version":3,"sources":["../../src/api/ThreadRuntime.ts"],"sourcesContent":["import {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../runtimes/core/ThreadRuntimeCore\";\nimport { ExportedMessageRepository } from \"../runtimes/utils/MessageRepository\";\nimport { AppendMessage, ThreadMessage, Unsubscribe } from \"../types\";\nimport {\n MessageRuntime,\n MessageRuntimeImpl,\n MessageState,\n} from \"./MessageRuntime\";\nimport { NestedSubscriptionSubject } from \"./subscribable/NestedSubscriptionSubject\";\nimport { ShallowMemoizeSubject } from \"./subscribable/ShallowMemoizeSubject\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport {\n ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./ComposerRuntime\";\nimport { SKIP_UPDATE } from \"./subscribable/SKIP_UPDATE\";\nimport {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./RuntimePathTypes\";\nimport { ThreadListItemState } from \"./ThreadListItemRuntime\";\nimport { RunConfig } from \"../types/AssistantTypes\";\nimport { EventSubscriptionSubject } from \"./subscribable/EventSubscriptionSubject\";\nimport { symbolInnerMessage } from \"../runtimes/external-store/getExternalStoreMessage\";\nimport { ModelContext } from \"../model-context\";\nimport { ChatModelRunOptions, ChatModelRunResult } from \"../runtimes\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n stream: message.stream,\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n };\n }\n\n if (message.role && message.parentId && message.attachments) {\n return message as AppendMessage;\n }\n\n return {\n ...message,\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n attachments: message.attachments ?? [],\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.8.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.8.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isRunning:\n lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\",\n messages: runtime.messages,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n /**\n * @deprecated pass an object with `parentId` instead. This will be removed in 0.8.0.\n */\n startRun(parentId: string | null): void;\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n unstable_resumeRun(config: CreateResumeRunConfig): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n /**\n * @deprecated This method was renamed to `getModelContext`.\n */\n getModelConfig(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n getMesssageByIndex(idx: number): MessageRuntime;\n getMesssageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking: () => void;\n\n unstable_on(event: ThreadRuntimeEventType, callback: () => void): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.getMesssageByIndex = this.getMesssageByIndex.bind(this);\n this.getMesssageById = this.getMesssageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getModelConfig = this.getModelConfig.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public getModelConfig() {\n return this.getModelContext();\n }\n\n public startRun(configOrParentId: string | null | CreateStartRunConfig) {\n const config =\n configOrParentId === null || typeof configOrParentId === \"string\"\n ? { parentId: configOrParentId }\n : configOrParentId;\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public unstable_resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public getMesssageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n };\n },\n );\n }\n\n public getMesssageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref:\n this.path.ref +\n `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined) return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n const submittedFeedback = thread.getSubmittedFeedback(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n\n submittedFeedback,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on(\n event: ThreadRuntimeEventType,\n callback: () => void,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject({\n event: event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback);\n }\n}\n"],"mappings":"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","names":["callback"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/api/ThreadRuntime.ts"],"sourcesContent":["import {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../runtimes/core/ThreadRuntimeCore\";\nimport { ExportedMessageRepository } from \"../runtimes/utils/MessageRepository\";\nimport { AppendMessage, ThreadMessage, Unsubscribe } from \"../types\";\nimport {\n MessageRuntime,\n MessageRuntimeImpl,\n MessageState,\n} from \"./MessageRuntime\";\nimport { NestedSubscriptionSubject } from \"./subscribable/NestedSubscriptionSubject\";\nimport { ShallowMemoizeSubject } from \"./subscribable/ShallowMemoizeSubject\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport {\n ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./ComposerRuntime\";\nimport { SKIP_UPDATE } from \"./subscribable/SKIP_UPDATE\";\nimport {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./RuntimePathTypes\";\nimport { ThreadListItemState } from \"./ThreadListItemRuntime\";\nimport { RunConfig } from \"../types/AssistantTypes\";\nimport { EventSubscriptionSubject } from \"./subscribable/EventSubscriptionSubject\";\nimport { symbolInnerMessage } from \"../runtimes/external-store/getExternalStoreMessage\";\nimport { ModelContext } from \"../model-context\";\nimport { ChatModelRunResult } from \"../runtimes\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream: AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n stream: message.stream,\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n };\n }\n\n if (message.role && message.parentId && message.attachments) {\n return message as AppendMessage;\n }\n\n return {\n ...message,\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n attachments: message.attachments ?? [],\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.8.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.8.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isRunning:\n lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\",\n messages: runtime.messages,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n /**\n * @deprecated pass an object with `parentId` instead. This will be removed in 0.8.0.\n */\n startRun(parentId: string | null): void;\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n unstable_resumeRun(config: CreateResumeRunConfig): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n /**\n * @deprecated This method was renamed to `getModelContext`.\n */\n getModelConfig(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n getMesssageByIndex(idx: number): MessageRuntime;\n getMesssageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking: () => void;\n\n unstable_on(event: ThreadRuntimeEventType, callback: () => void): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.getMesssageByIndex = this.getMesssageByIndex.bind(this);\n this.getMesssageById = this.getMesssageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getModelConfig = this.getModelConfig.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public getModelConfig() {\n return this.getModelContext();\n }\n\n public startRun(configOrParentId: string | null | CreateStartRunConfig) {\n const config =\n configOrParentId === null || typeof configOrParentId === \"string\"\n ? { parentId: configOrParentId }\n : configOrParentId;\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public unstable_resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public getMesssageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n };\n },\n );\n }\n\n public getMesssageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref:\n this.path.ref +\n `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined) return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n const submittedFeedback = thread.getSubmittedFeedback(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n\n submittedFeedback,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on(\n event: ThreadRuntimeEventType,\n callback: () => void,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject({\n event: event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback);\n }\n}\n"],"mappings":";AAWA;AAAA,EAEE;AAAA,OAEK;AACP,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AAEtC;AAAA,EAEE;AAAA,OACK;AACP,SAAS,mBAAmB;AAQ5B,SAAS,gCAAgC;AACzC,SAAS,0BAA0B;AAcnC,IAAM,oBAAoB,CAAC,YAAoD;AAC7E,SAAO;AAAA,IACL,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY;AAAA,IAC9B,WAAW,QAAQ,aAAa,CAAC;AAAA,IACjC,QAAQ,QAAQ;AAAA,EAClB;AACF;AAEA,IAAM,mBAAmB,CAAC,YAAkD;AAC1E,SAAO;AAAA,IACL,UAAU,QAAQ,YAAY;AAAA,IAC9B,UAAU,QAAQ,YAAY;AAAA,IAC9B,WAAW,QAAQ,aAAa,CAAC;AAAA,EACnC;AACF;AAaA,IAAM,kBAAkB,CACtB,UACA,YACkB;AAClB,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,MACL,UAAU,SAAS,GAAG,EAAE,GAAG,MAAM;AAAA,MACjC,UAAU;AAAA,MACV,WAAW,CAAC;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACzC,aAAa,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,aAAa;AAC3D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,QAAQ,YAAY,SAAS,GAAG,EAAE,GAAG,MAAM;AAAA,IACrD,UAAU,QAAQ,YAAY;AAAA,IAC9B,MAAM,QAAQ,QAAQ;AAAA,IACtB,aAAa,QAAQ,eAAe,CAAC;AAAA,EACvC;AACF;AAgEO,IAAM,iBAAiB,CAC5B,SACA,wBACgB;AAChB,QAAM,cAAc,QAAQ,SAAS,GAAG,EAAE;AAC1C,SAAO,OAAO,OAAO;AAAA,IACnB,UAAU,oBAAoB;AAAA,IAC9B,UAAU;AAAA,IACV,cAAc,QAAQ;AAAA,IACtB,YAAY,QAAQ;AAAA,IACpB,WACE,aAAa,SAAS,cAClB,QACA,YAAY,OAAO,SAAS;AAAA,IAClC,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,IACrB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AA0EO,IAAM,oBAAN,MAAiD;AAAA,EACtD,IAAW,OAAO;AAChB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAW,2BAA2B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEiB;AAAA,EAIjB,YACE,eACA,uBACA;AACA,UAAM,eAAe,IAAI,sBAAsB;AAAA,MAC7C,MAAM,cAAc;AAAA,MACpB,UAAU,MACR;AAAA,QACE,cAAc,SAAS;AAAA,QACvB,sBAAsB,SAAS;AAAA,MACjC;AAAA,MACF,WAAW,CAAC,aAAa;AACvB,cAAM,OAAO,cAAc,UAAU,QAAQ;AAC7C,cAAM,OAAO,sBAAsB,UAAU,QAAQ;AACrD,eAAO,MAAM;AACX,eAAK;AACL,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,iBAAiB;AAAA,MACpB,MAAM,cAAc;AAAA,MACpB,UAAU,MAAM,cAAc,SAAS;AAAA,MACvC,eAAe,MAAM,aAAa,SAAS;AAAA,MAC3C,gBAAgB,CAAC,aAAa,cAAc,eAAe,QAAQ;AAAA,MACnE,WAAW,CAAC,aAAa,cAAc,UAAU,QAAQ;AAAA,IAC3D;AAEA,SAAK,WAAW,IAAI;AAAA,MAClB,IAAI,0BAA0B;AAAA,QAC5B,MAAM;AAAA,UACJ,GAAG,KAAK;AAAA,UACR,KAAK,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG;AAAA,UACrC,gBAAgB;AAAA,QAClB;AAAA,QACA,UAAU,MAAM,KAAK,eAAe,SAAS,EAAE;AAAA,QAC/C,WAAW,CAAC,aAAa,KAAK,eAAe,UAAU,QAAQ;AAAA,MACjE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEU,yBAAyB;AACjC,SAAK,SAAS,KAAK,OAAO,KAAK,IAAI;AACnC,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AACzC,SAAK,eAAe,KAAK,aAAa,KAAK,IAAI;AAC/C,SAAK,SAAS,KAAK,OAAO,KAAK,IAAI;AACnC,SAAK,SAAS,KAAK,OAAO,KAAK,IAAI;AACnC,SAAK,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAC3D,SAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;AACrD,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AACzC,SAAK,cAAc,KAAK,YAAY,KAAK,IAAI;AAC7C,SAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;AACrD,SAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACnD,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AAAA,EACzC;AAAA,EAEgB;AAAA,EAET,WAAW;AAChB,WAAO,KAAK,eAAe,cAAc;AAAA,EAC3C;AAAA,EAEO,OAAO,SAA8B;AAC1C,SAAK,eACF,SAAS,EACT;AAAA,MACC,gBAAgB,KAAK,eAAe,SAAS,EAAE,UAAU,OAAO;AAAA,IAClE;AAAA,EACJ;AAAA,EAEO,UAAU,UAAsB;AACrC,WAAO,KAAK,eAAe,UAAU,QAAQ;AAAA,EAC/C;AAAA,EAEO,kBAAkB;AACvB,WAAO,KAAK,eAAe,SAAS,EAAE,gBAAgB;AAAA,EACxD;AAAA,EAEO,iBAAiB;AACtB,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEO,SAAS,kBAAwD;AACtE,UAAM,SACJ,qBAAqB,QAAQ,OAAO,qBAAqB,WACrD,EAAE,UAAU,iBAAiB,IAC7B;AACN,WAAO,KAAK,eAAe,SAAS,EAAE,SAAS,iBAAiB,MAAM,CAAC;AAAA,EACzE;AAAA,EAEO,mBAAmB,QAA+B;AACvD,WAAO,KAAK,eAAe,SAAS,EAAE,UAAU,kBAAkB,MAAM,CAAC;AAAA,EAC3E;AAAA,EAEO,YAAY;AACjB,SAAK,eAAe,SAAS,EAAE,UAAU;AAAA,EAC3C;AAAA,EAEO,eAAe;AACpB,WAAO,KAAK,eAAe,SAAS,EAAE,aAAa;AAAA,EACrD;AAAA,EAEO,SAAS;AACd,WAAO,KAAK,eAAe,SAAS,EAAE,OAAO;AAAA,EAC/C;AAAA,EAEO,OAAO,MAAiC;AAC7C,SAAK,eAAe,SAAS,EAAE,OAAO,IAAI;AAAA,EAC5C;AAAA,EAEO,mBAAmB,KAAa;AACrC,QAAI,MAAM,EAAG,OAAM,IAAI,MAAM,4BAA4B;AAEzD,WAAO,KAAK;AAAA,MACV;AAAA,QACE,GAAG,KAAK;AAAA,QACR,KAAK,KAAK,KAAK,MAAM,GAAG,KAAK,KAAK,GAAG,aAAa,GAAG;AAAA,QACrD,iBAAiB,EAAE,MAAM,SAAS,OAAO,IAAI;AAAA,MAC/C;AAAA,MACA,MAAM;AACJ,cAAM,WAAW,KAAK,eAAe,SAAS,EAAE;AAChD,cAAM,UAAU,SAAS,GAAG;AAC5B,YAAI,CAAC,QAAS,QAAO;AACrB,eAAO;AAAA,UACL;AAAA,UACA,UAAU,SAAS,MAAM,CAAC,GAAG,MAAM;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,gBAAgB,WAAmB;AACxC,WAAO,KAAK;AAAA,MACV;AAAA,QACE,GAAG,KAAK;AAAA,QACR,KACE,KAAK,KAAK,MACV,GAAG,KAAK,KAAK,GAAG,uBAAuB,KAAK,UAAU,SAAS,CAAC;AAAA,QAClE,iBAAiB,EAAE,MAAM,aAAa,UAAqB;AAAA,MAC7D;AAAA,MACA,MAAM,KAAK,eAAe,SAAS,EAAE,eAAe,SAAS;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,mBACN,MACA,UAGA;AACA,WAAO,IAAI;AAAA,MACT,IAAI,sBAAsB;AAAA,QACxB;AAAA,QACA,UAAU,MAAM;AACd,gBAAM,EAAE,SAAS,SAAS,IAAI,SAAS,KAAK,CAAC;AAE7C,gBAAM,EAAE,UAAU,QAAQ,YAAY,IACpC,KAAK,eAAe,SAAS;AAE/B,cAAI,CAAC,WAAW,aAAa,OAAW,QAAO;AAE/C,gBAAM,SAAS,KAAK,eAAe,SAAS;AAE5C,gBAAM,WAAW,OAAO,YAAY,QAAQ,EAAE;AAC9C,gBAAM,oBAAoB,OAAO,qBAAqB,QAAQ,EAAE;AAEhE,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,GAAG,EAAE,CAAC,kBAAkB,GAAI,QAAgB,kBAAkB,EAAE;AAAA,YAEhE,QAAQ,SAAS,GAAG,EAAE,GAAG,OAAO,QAAQ;AAAA,YACxC;AAAA,YAEA,cAAc,SAAS,QAAQ,QAAQ,EAAE,IAAI;AAAA,YAC7C,aAAa,SAAS;AAAA,YAEtB,QACE,aAAa,cAAc,QAAQ,KAAK,cAAc;AAAA,YAExD;AAAA,UACF;AAAA,QACF;AAAA,QACA,WAAW,CAACA,cAAa,KAAK,eAAe,UAAUA,SAAQ;AAAA,MACjE,CAAC;AAAA,MACD,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,6BAA6B,oBAAI,IAGvC;AAAA,EAEK,YACL,OACA,UACa;AACb,QAAI,UAAU,KAAK,2BAA2B,IAAI,KAAK;AACvD,QAAI,CAAC,SAAS;AACZ,gBAAU,IAAI,yBAAyB;AAAA,QACrC;AAAA,QACA,SAAS,KAAK;AAAA,MAChB,CAAC;AACD,WAAK,2BAA2B,IAAI,OAAO,OAAO;AAAA,IACpD;AACA,WAAO,QAAQ,UAAU,QAAQ;AAAA,EACnC;AACF;","names":["callback"]}
1
+ {"version":3,"sources":["../../src/api/ThreadRuntime.ts"],"sourcesContent":["import {\n ThreadSuggestion,\n RuntimeCapabilities,\n ThreadRuntimeCore,\n SpeechState,\n ThreadRuntimeEventType,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../runtimes/core/ThreadRuntimeCore\";\nimport { ExportedMessageRepository } from \"../runtimes/utils/MessageRepository\";\nimport { AppendMessage, ThreadMessage, Unsubscribe } from \"../types\";\nimport {\n MessageRuntime,\n MessageRuntimeImpl,\n MessageState,\n} from \"./MessageRuntime\";\nimport { NestedSubscriptionSubject } from \"./subscribable/NestedSubscriptionSubject\";\nimport { ShallowMemoizeSubject } from \"./subscribable/ShallowMemoizeSubject\";\nimport { SubscribableWithState } from \"./subscribable/Subscribable\";\nimport {\n ThreadComposerRuntime,\n ThreadComposerRuntimeImpl,\n} from \"./ComposerRuntime\";\nimport { SKIP_UPDATE } from \"./subscribable/SKIP_UPDATE\";\nimport {\n MessageRuntimePath,\n ThreadListItemRuntimePath,\n ThreadRuntimePath,\n} from \"./RuntimePathTypes\";\nimport { ThreadListItemState } from \"./ThreadListItemRuntime\";\nimport { RunConfig } from \"../types/AssistantTypes\";\nimport { EventSubscriptionSubject } from \"./subscribable/EventSubscriptionSubject\";\nimport { symbolInnerMessage } from \"../runtimes/external-store/getExternalStoreMessage\";\nimport { ModelContext } from \"../model-context\";\nimport { ChatModelRunOptions, ChatModelRunResult } from \"../runtimes\";\n\nexport type CreateStartRunConfig = {\n parentId: string | null;\n sourceId?: string | null | undefined;\n runConfig?: RunConfig | undefined;\n};\n\nexport type CreateResumeRunConfig = CreateStartRunConfig & {\n stream: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nconst toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n stream: message.stream,\n };\n};\n\nconst toStartRunConfig = (message: CreateStartRunConfig): StartRunConfig => {\n return {\n parentId: message.parentId ?? null,\n sourceId: message.sourceId ?? null,\n runConfig: message.runConfig ?? {},\n };\n};\n\nexport type CreateAppendMessage =\n | string\n | {\n parentId?: string | null | undefined;\n sourceId?: string | null | undefined;\n role?: AppendMessage[\"role\"] | undefined;\n content: AppendMessage[\"content\"];\n attachments?: AppendMessage[\"attachments\"] | undefined;\n startRun?: boolean | undefined;\n };\n\nconst toAppendMessage = (\n messages: readonly ThreadMessage[],\n message: CreateAppendMessage,\n): AppendMessage => {\n if (typeof message === \"string\") {\n return {\n parentId: messages.at(-1)?.id ?? null,\n sourceId: null,\n runConfig: {},\n role: \"user\",\n content: [{ type: \"text\", text: message }],\n attachments: [],\n };\n }\n\n if (message.role && message.parentId && message.attachments) {\n return message as AppendMessage;\n }\n\n return {\n ...message,\n parentId: message.parentId ?? messages.at(-1)?.id ?? null,\n sourceId: message.sourceId ?? null,\n role: message.role ?? \"user\",\n attachments: message.attachments ?? [],\n } as AppendMessage;\n};\n\nexport type ThreadRuntimeCoreBinding = SubscribableWithState<\n ThreadRuntimeCore,\n ThreadRuntimePath\n> & {\n outerSubscribe(callback: () => void): Unsubscribe;\n};\n\nexport type ThreadListItemRuntimeBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport type ThreadState = {\n /**\n * The thread ID.\n * @deprecated This field is deprecated and will be removed in 0.8.0. Use `useThreadListItem().id` instead.\n */\n readonly threadId: string;\n\n /**\n * The thread metadata.\n *\n * @deprecated Use `useThreadListItem()` instead. This field is deprecated and will be removed in 0.8.0.\n */\n readonly metadata: ThreadListItemState;\n\n /**\n * Whether the thread is disabled. Disabled threads cannot receive new messages.\n */\n readonly isDisabled: boolean;\n\n /**\n * Whether the thread is running. A thread is considered running when there is an active stream connection to the backend.\n */\n readonly isRunning: boolean;\n\n /**\n * The capabilities of the thread, such as whether the thread supports editing, branch switching, etc.\n */\n readonly capabilities: RuntimeCapabilities;\n\n /**\n * The messages in the currently selected branch of the thread.\n */\n readonly messages: readonly ThreadMessage[];\n\n /**\n * Follow up message suggestions to show the user.\n */\n readonly suggestions: readonly ThreadSuggestion[];\n\n /**\n * Custom extra information provided by the runtime.\n */\n readonly extras: unknown;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n readonly speech: SpeechState | undefined;\n};\n\nexport const getThreadState = (\n runtime: ThreadRuntimeCore,\n threadListItemState: ThreadListItemState,\n): ThreadState => {\n const lastMessage = runtime.messages.at(-1);\n return Object.freeze({\n threadId: threadListItemState.id,\n metadata: threadListItemState,\n capabilities: runtime.capabilities,\n isDisabled: runtime.isDisabled,\n isRunning:\n lastMessage?.role !== \"assistant\"\n ? false\n : lastMessage.status.type === \"running\",\n messages: runtime.messages,\n suggestions: runtime.suggestions,\n extras: runtime.extras,\n speech: runtime.speech,\n });\n};\n\nexport type ThreadRuntime = {\n /**\n * The selector for the thread runtime.\n */\n readonly path: ThreadRuntimePath;\n\n /**\n * The thread composer runtime.\n */\n readonly composer: ThreadComposerRuntime;\n\n /**\n * Gets a snapshot of the thread state.\n */\n getState(): ThreadState;\n\n /**\n * Append a new message to the thread.\n *\n * @example ```ts\n * // append a new user message with the text \"Hello, world!\"\n * threadRuntime.append(\"Hello, world!\");\n * ```\n *\n * @example ```ts\n * // append a new assistant message with the text \"Hello, world!\"\n * threadRuntime.append({\n * role: \"assistant\",\n * content: [{ type: \"text\", text: \"Hello, world!\" }],\n * });\n * ```\n */\n append(message: CreateAppendMessage): void;\n\n /**\n * @deprecated pass an object with `parentId` instead. This will be removed in 0.8.0.\n */\n startRun(parentId: string | null): void;\n /**\n * Start a new run with the given configuration.\n * @param config The configuration for starting the run\n */\n startRun(config: CreateStartRunConfig): void;\n\n /**\n * Resume a run with the given configuration.\n * @param config The configuration for resuming the run\n **/\n unstable_resumeRun(config: CreateResumeRunConfig): void;\n\n subscribe(callback: () => void): Unsubscribe;\n cancelRun(): void;\n getModelContext(): ModelContext;\n\n /**\n * @deprecated This method was renamed to `getModelContext`.\n */\n getModelConfig(): ModelContext;\n\n export(): ExportedMessageRepository;\n import(repository: ExportedMessageRepository): void;\n getMesssageByIndex(idx: number): MessageRuntime;\n getMesssageById(messageId: string): MessageRuntime;\n\n /**\n * @deprecated This API is still under active development and might change without notice.\n */\n stopSpeaking: () => void;\n\n unstable_on(event: ThreadRuntimeEventType, callback: () => void): Unsubscribe;\n};\n\nexport class ThreadRuntimeImpl implements ThreadRuntime {\n public get path() {\n return this._threadBinding.path;\n }\n\n public get __internal_threadBinding() {\n return this._threadBinding;\n }\n\n private readonly _threadBinding: ThreadRuntimeCoreBinding & {\n getStateState(): ThreadState;\n };\n\n constructor(\n threadBinding: ThreadRuntimeCoreBinding,\n threadListItemBinding: ThreadListItemRuntimeBinding,\n ) {\n const stateBinding = new ShallowMemoizeSubject({\n path: threadBinding.path,\n getState: () =>\n getThreadState(\n threadBinding.getState(),\n threadListItemBinding.getState(),\n ),\n subscribe: (callback) => {\n const sub1 = threadBinding.subscribe(callback);\n const sub2 = threadListItemBinding.subscribe(callback);\n return () => {\n sub1();\n sub2();\n };\n },\n });\n\n this._threadBinding = {\n path: threadBinding.path,\n getState: () => threadBinding.getState(),\n getStateState: () => stateBinding.getState(),\n outerSubscribe: (callback) => threadBinding.outerSubscribe(callback),\n subscribe: (callback) => threadBinding.subscribe(callback),\n };\n\n this.composer = new ThreadComposerRuntimeImpl(\n new NestedSubscriptionSubject({\n path: {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.composer`,\n composerSource: \"thread\",\n },\n getState: () => this._threadBinding.getState().composer,\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n );\n }\n\n protected __internal_bindMethods() {\n this.append = this.append.bind(this);\n this.startRun = this.startRun.bind(this);\n this.cancelRun = this.cancelRun.bind(this);\n this.stopSpeaking = this.stopSpeaking.bind(this);\n this.export = this.export.bind(this);\n this.import = this.import.bind(this);\n this.getMesssageByIndex = this.getMesssageByIndex.bind(this);\n this.getMesssageById = this.getMesssageById.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getModelContext = this.getModelContext.bind(this);\n this.getModelConfig = this.getModelConfig.bind(this);\n this.getState = this.getState.bind(this);\n }\n\n public readonly composer;\n\n public getState() {\n return this._threadBinding.getStateState();\n }\n\n public append(message: CreateAppendMessage) {\n this._threadBinding\n .getState()\n .append(\n toAppendMessage(this._threadBinding.getState().messages, message),\n );\n }\n\n public subscribe(callback: () => void) {\n return this._threadBinding.subscribe(callback);\n }\n\n public getModelContext() {\n return this._threadBinding.getState().getModelContext();\n }\n\n public getModelConfig() {\n return this.getModelContext();\n }\n\n public startRun(configOrParentId: string | null | CreateStartRunConfig) {\n const config =\n configOrParentId === null || typeof configOrParentId === \"string\"\n ? { parentId: configOrParentId }\n : configOrParentId;\n return this._threadBinding.getState().startRun(toStartRunConfig(config));\n }\n\n public unstable_resumeRun(config: CreateResumeRunConfig) {\n return this._threadBinding.getState().resumeRun(toResumeRunConfig(config));\n }\n\n public cancelRun() {\n this._threadBinding.getState().cancelRun();\n }\n\n public stopSpeaking() {\n return this._threadBinding.getState().stopSpeaking();\n }\n\n public export() {\n return this._threadBinding.getState().export();\n }\n\n public import(data: ExportedMessageRepository) {\n this._threadBinding.getState().import(data);\n }\n\n public getMesssageByIndex(idx: number) {\n if (idx < 0) throw new Error(\"Message index must be >= 0\");\n\n return this._getMessageRuntime(\n {\n ...this.path,\n ref: this.path.ref + `${this.path.ref}.messages[${idx}]`,\n messageSelector: { type: \"index\", index: idx },\n },\n () => {\n const messages = this._threadBinding.getState().messages;\n const message = messages[idx];\n if (!message) return undefined;\n return {\n message,\n parentId: messages[idx - 1]?.id ?? null,\n };\n },\n );\n }\n\n public getMesssageById(messageId: string) {\n return this._getMessageRuntime(\n {\n ...this.path,\n ref:\n this.path.ref +\n `${this.path.ref}.messages[messageId=${JSON.stringify(messageId)}]`,\n messageSelector: { type: \"messageId\", messageId: messageId },\n },\n () => this._threadBinding.getState().getMessageById(messageId),\n );\n }\n\n private _getMessageRuntime(\n path: MessageRuntimePath,\n callback: () =>\n | { parentId: string | null; message: ThreadMessage }\n | undefined,\n ) {\n return new MessageRuntimeImpl(\n new ShallowMemoizeSubject({\n path,\n getState: () => {\n const { message, parentId } = callback() ?? {};\n\n const { messages, speech: speechState } =\n this._threadBinding.getState();\n\n if (!message || parentId === undefined) return SKIP_UPDATE;\n\n const thread = this._threadBinding.getState();\n\n const branches = thread.getBranches(message.id);\n const submittedFeedback = thread.getSubmittedFeedback(message.id);\n\n return {\n ...message,\n ...{ [symbolInnerMessage]: (message as any)[symbolInnerMessage] },\n\n isLast: messages.at(-1)?.id === message.id,\n parentId,\n\n branchNumber: branches.indexOf(message.id) + 1,\n branchCount: branches.length,\n\n speech:\n speechState?.messageId === message.id ? speechState : undefined,\n\n submittedFeedback,\n } satisfies MessageState;\n },\n subscribe: (callback) => this._threadBinding.subscribe(callback),\n }),\n this._threadBinding,\n );\n }\n\n private _eventSubscriptionSubjects = new Map<\n string,\n EventSubscriptionSubject<ThreadRuntimeEventType>\n >();\n\n public unstable_on(\n event: ThreadRuntimeEventType,\n callback: () => void,\n ): Unsubscribe {\n let subject = this._eventSubscriptionSubjects.get(event);\n if (!subject) {\n subject = new EventSubscriptionSubject({\n event: event,\n binding: this._threadBinding,\n });\n this._eventSubscriptionSubjects.set(event, subject);\n }\n return subject.subscribe(callback);\n }\n}\n"],"mappings":"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","names":["callback"]}
@@ -3,7 +3,7 @@ import { AppendMessage, ThreadMessage } from "../../types";
3
3
  import { RunConfig } from "../../types/AssistantTypes";
4
4
  import type { Unsubscribe } from "../../types/Unsubscribe";
5
5
  import { SpeechSynthesisAdapter } from "../adapters/speech/SpeechAdapterTypes";
6
- import { ChatModelRunResult } from "../local";
6
+ import { ChatModelRunOptions, ChatModelRunResult } from "../local";
7
7
  import { ExportedMessageRepository } from "../utils/MessageRepository";
8
8
  import { ComposerRuntimeCore, ThreadComposerRuntimeCore } from "./ComposerRuntimeCore";
9
9
  export type RuntimeCapabilities = {
@@ -43,7 +43,7 @@ export type StartRunConfig = {
43
43
  runConfig: RunConfig;
44
44
  };
45
45
  export type ResumeRunConfig = StartRunConfig & {
46
- stream: AsyncGenerator<ChatModelRunResult, void, unknown>;
46
+ stream: (options: ChatModelRunOptions) => AsyncGenerator<ChatModelRunResult, void, unknown>;
47
47
  };
48
48
  export type ThreadRuntimeCore = Readonly<{
49
49
  getMessageById: (messageId: string) => {
@@ -1 +1 @@
1
- {"version":3,"file":"ThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../../../src/runtimes/core/ThreadRuntimeCore.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ThreadRuntimeCore.d.ts","sourceRoot":"","sources":["../../../src/runtimes/core/ThreadRuntimeCore.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtimes/core/ThreadRuntimeCore.tsx"],"sourcesContent":["import { ModelContext } from \"../../model-context\";\nimport { AppendMessage, ThreadMessage } from \"../../types\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport type { Unsubscribe } from \"../../types/Unsubscribe\";\nimport { SpeechSynthesisAdapter } from \"../adapters/speech/SpeechAdapterTypes\";\nimport { ChatModelRunResult } from \"../local\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\nimport {\n ComposerRuntimeCore,\n ThreadComposerRuntimeCore,\n} from \"./ComposerRuntimeCore\";\n\nexport type RuntimeCapabilities = {\n readonly switchToBranch: boolean;\n readonly edit: boolean;\n readonly reload: boolean;\n readonly cancel: boolean;\n readonly unstable_copy: boolean;\n readonly speech: boolean;\n readonly attachments: boolean;\n readonly feedback: boolean;\n};\n\nexport type AddToolResultOptions = {\n messageId: string;\n toolName: string;\n toolCallId: string;\n result: any;\n};\n\nexport type SubmitFeedbackOptions = {\n messageId: string;\n type: \"negative\" | \"positive\";\n};\n\nexport type ThreadSuggestion = {\n prompt: string;\n};\n\nexport type SpeechState = {\n readonly messageId: string;\n readonly status: SpeechSynthesisAdapter.Status;\n};\n\nexport type SubmittedFeedback = {\n readonly type: \"negative\" | \"positive\";\n};\n\nexport type ThreadRuntimeEventType =\n | \"run-start\"\n | \"run-end\"\n | \"initialize\"\n | \"model-context-update\";\n\nexport type StartRunConfig = {\n parentId: string | null;\n sourceId: string | null;\n runConfig: RunConfig;\n};\n\nexport type ResumeRunConfig = StartRunConfig & {\n stream: AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nexport type ThreadRuntimeCore = Readonly<{\n getMessageById: (messageId: string) =>\n | {\n parentId: string | null;\n message: ThreadMessage;\n }\n | undefined;\n\n getBranches: (messageId: string) => readonly string[];\n switchToBranch: (branchId: string) => void;\n\n append: (message: AppendMessage) => void;\n startRun: (config: StartRunConfig) => void;\n resumeRun: (config: ResumeRunConfig) => void;\n cancelRun: () => void;\n\n addToolResult: (options: AddToolResultOptions) => void;\n\n speak: (messageId: string) => void;\n stopSpeaking: () => void;\n\n getSubmittedFeedback: (messageId: string) => SubmittedFeedback | undefined;\n submitFeedback: (feedback: SubmitFeedbackOptions) => void;\n\n getModelContext: () => ModelContext;\n\n composer: ThreadComposerRuntimeCore;\n getEditComposer: (messageId: string) => ComposerRuntimeCore | undefined;\n beginEdit: (messageId: string) => void;\n\n speech: SpeechState | undefined;\n\n capabilities: Readonly<RuntimeCapabilities>;\n isDisabled: boolean;\n messages: readonly ThreadMessage[];\n suggestions: readonly ThreadSuggestion[];\n\n // TODO deprecate for a more elegant solution\n // /**\n // * @deprecated This field is deprecated and will be removed in 0.8.0.\n // * Please migrate to using `AssistantRuntimeCore.Provider` instead.\n // */\n extras: unknown;\n\n subscribe: (callback: () => void) => Unsubscribe;\n\n import(repository: ExportedMessageRepository): void;\n export(): ExportedMessageRepository;\n\n unstable_on(event: ThreadRuntimeEventType, callback: () => void): Unsubscribe;\n}>;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
1
+ {"version":3,"sources":["../../../src/runtimes/core/ThreadRuntimeCore.tsx"],"sourcesContent":["import { ModelContext } from \"../../model-context\";\nimport { AppendMessage, ThreadMessage } from \"../../types\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport type { Unsubscribe } from \"../../types/Unsubscribe\";\nimport { SpeechSynthesisAdapter } from \"../adapters/speech/SpeechAdapterTypes\";\nimport { ChatModelRunOptions, ChatModelRunResult } from \"../local\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\nimport {\n ComposerRuntimeCore,\n ThreadComposerRuntimeCore,\n} from \"./ComposerRuntimeCore\";\n\nexport type RuntimeCapabilities = {\n readonly switchToBranch: boolean;\n readonly edit: boolean;\n readonly reload: boolean;\n readonly cancel: boolean;\n readonly unstable_copy: boolean;\n readonly speech: boolean;\n readonly attachments: boolean;\n readonly feedback: boolean;\n};\n\nexport type AddToolResultOptions = {\n messageId: string;\n toolName: string;\n toolCallId: string;\n result: any;\n};\n\nexport type SubmitFeedbackOptions = {\n messageId: string;\n type: \"negative\" | \"positive\";\n};\n\nexport type ThreadSuggestion = {\n prompt: string;\n};\n\nexport type SpeechState = {\n readonly messageId: string;\n readonly status: SpeechSynthesisAdapter.Status;\n};\n\nexport type SubmittedFeedback = {\n readonly type: \"negative\" | \"positive\";\n};\n\nexport type ThreadRuntimeEventType =\n | \"run-start\"\n | \"run-end\"\n | \"initialize\"\n | \"model-context-update\";\n\nexport type StartRunConfig = {\n parentId: string | null;\n sourceId: string | null;\n runConfig: RunConfig;\n};\n\nexport type ResumeRunConfig = StartRunConfig & {\n stream: (\n options: ChatModelRunOptions,\n ) => AsyncGenerator<ChatModelRunResult, void, unknown>;\n};\n\nexport type ThreadRuntimeCore = Readonly<{\n getMessageById: (messageId: string) =>\n | {\n parentId: string | null;\n message: ThreadMessage;\n }\n | undefined;\n\n getBranches: (messageId: string) => readonly string[];\n switchToBranch: (branchId: string) => void;\n\n append: (message: AppendMessage) => void;\n startRun: (config: StartRunConfig) => void;\n resumeRun: (config: ResumeRunConfig) => void;\n cancelRun: () => void;\n\n addToolResult: (options: AddToolResultOptions) => void;\n\n speak: (messageId: string) => void;\n stopSpeaking: () => void;\n\n getSubmittedFeedback: (messageId: string) => SubmittedFeedback | undefined;\n submitFeedback: (feedback: SubmitFeedbackOptions) => void;\n\n getModelContext: () => ModelContext;\n\n composer: ThreadComposerRuntimeCore;\n getEditComposer: (messageId: string) => ComposerRuntimeCore | undefined;\n beginEdit: (messageId: string) => void;\n\n speech: SpeechState | undefined;\n\n capabilities: Readonly<RuntimeCapabilities>;\n isDisabled: boolean;\n messages: readonly ThreadMessage[];\n suggestions: readonly ThreadSuggestion[];\n\n // TODO deprecate for a more elegant solution\n // /**\n // * @deprecated This field is deprecated and will be removed in 0.8.0.\n // * Please migrate to using `AssistantRuntimeCore.Provider` instead.\n // */\n extras: unknown;\n\n subscribe: (callback: () => void) => Unsubscribe;\n\n import(repository: ExportedMessageRepository): void;\n export(): ExportedMessageRepository;\n\n unstable_on(event: ThreadRuntimeEventType, callback: () => void): Unsubscribe;\n}>;\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
@@ -123,7 +123,7 @@ var LocalThreadRuntimeCore = class extends import_BaseThreadRuntimeCore.BaseThre
123
123
  }
124
124
  }
125
125
  resumeRun({ stream, ...startConfig }) {
126
- return this.startRun(startConfig, () => stream);
126
+ return this.startRun(startConfig, stream);
127
127
  }
128
128
  async startRun({ parentId, runConfig }, runCallback) {
129
129
  this.ensureInitialized();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelAdapter, ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n AddToolResultOptions,\n ThreadSuggestion,\n ThreadRuntimeCore,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n public readonly capabilities = {\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n unstable_copy: true,\n speech: false,\n attachments: false,\n feedback: false,\n };\n\n private abortController: AbortController | null = null;\n\n public readonly isDisabled = false;\n\n private _suggestions: readonly ThreadSuggestion[] = [];\n private _suggestionsController: AbortController | null = null;\n public get suggestions(): readonly ThreadSuggestion[] {\n return this._suggestions;\n }\n\n public get adapters() {\n return this._options.adapters;\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n options: LocalRuntimeOptionsBase,\n ) {\n super(contextProvider);\n this.__internal_setOptions(options);\n }\n\n private _options!: LocalRuntimeOptionsBase;\n\n private _lastRunConfig: RunConfig = {};\n\n public get extras() {\n return undefined;\n }\n\n public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n if (this._options === options) return;\n\n this._options = options;\n\n let hasUpdates = false;\n\n const canSpeak = options.adapters?.speech !== undefined;\n if (this.capabilities.speech !== canSpeak) {\n this.capabilities.speech = canSpeak;\n hasUpdates = true;\n }\n\n const canAttach = options.adapters?.attachments !== undefined;\n if (this.capabilities.attachments !== canAttach) {\n this.capabilities.attachments = canAttach;\n hasUpdates = true;\n }\n\n const canFeedback = options.adapters?.feedback !== undefined;\n if (this.capabilities.feedback !== canFeedback) {\n this.capabilities.feedback = canFeedback;\n hasUpdates = true;\n }\n\n if (hasUpdates) this._notifySubscribers();\n }\n\n private _loadPromise: Promise<void> | undefined;\n public __internal_load() {\n if (this._loadPromise) return this._loadPromise;\n\n const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n this._loadPromise = promise.then((repo) => {\n if (!repo) return;\n this.repository.import(repo);\n this._notifySubscribers();\n\n const resume = this.adapters.history?.resume?.bind(this.adapters.history);\n if (repo.unstable_resume && resume) {\n this.startRun(\n {\n parentId: this.repository.headId,\n sourceId: this.repository.headId,\n runConfig: this._lastRunConfig,\n },\n resume,\n );\n }\n });\n\n return this._loadPromise;\n }\n\n public async append(message: AppendMessage): Promise<void> {\n this.ensureInitialized();\n\n const newMessage = fromCoreMessage(message, {\n attachments: message.attachments,\n });\n this.repository.addOrUpdateMessage(message.parentId, newMessage);\n this._options.adapters.history?.append({\n parentId: message.parentId,\n message: newMessage,\n });\n\n const startRun = message.startRun ?? message.role === \"user\";\n if (startRun) {\n await this.startRun({\n parentId: newMessage.id,\n sourceId: message.sourceId,\n runConfig: message.runConfig ?? {},\n });\n } else {\n this.repository.resetHead(newMessage.id);\n this._notifySubscribers();\n }\n }\n\n public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {\n return this.startRun(startConfig, () => stream);\n }\n\n public async startRun(\n { parentId, runConfig }: StartRunConfig,\n runCallback?: ChatModelAdapter[\"run\"],\n ): Promise<void> {\n this.ensureInitialized();\n\n this.repository.resetHead(parentId);\n\n // add assistant message\n const id = generateId();\n let message: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n createdAt: new Date(),\n };\n\n this._notifyEventSubscribers(\"run-start\");\n\n try {\n this._suggestions = [];\n this._suggestionsController?.abort();\n this._suggestionsController = null;\n\n do {\n message = await this.performRoundtrip(\n parentId,\n message,\n runConfig,\n runCallback,\n );\n runCallback = undefined;\n } while (shouldContinue(message, this._options.unstable_humanToolNames));\n } finally {\n this._notifyEventSubscribers(\"run-end\");\n }\n\n this._suggestionsController = new AbortController();\n const signal = this._suggestionsController.signal;\n if (\n this.adapters.suggestion &&\n message.status?.type !== \"requires-action\"\n ) {\n const promiseOrGenerator = this.adapters.suggestion?.generate({\n messages: this.messages,\n });\n\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (signal.aborted) break;\n this._suggestions = r;\n }\n } else {\n const result = await promiseOrGenerator;\n if (signal.aborted) return;\n this._suggestions = result;\n }\n }\n }\n\n private async performRoundtrip(\n parentId: string | null,\n message: ThreadAssistantMessage,\n runConfig: RunConfig | undefined,\n runCallback?: ChatModelAdapter[\"run\"],\n ) {\n const messages = this.repository.getMessages();\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const initialContent = message.content;\n const initialAnnotations = message.metadata?.unstable_annotations;\n const initialData = message.metadata?.unstable_data;\n const initialSteps = message.metadata?.steps;\n const initalCustom = message.metadata?.custom;\n const updateMessage = (m: Partial<ChatModelRunResult>) => {\n const newSteps = m.metadata?.steps;\n const steps = newSteps\n ? [...(initialSteps ?? []), ...newSteps]\n : undefined;\n\n const newAnnotations = m.metadata?.unstable_annotations;\n const newData = m.metadata?.unstable_data;\n const annotations = newAnnotations\n ? [...(initialAnnotations ?? []), ...newAnnotations]\n : undefined;\n const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n message = {\n ...message,\n ...(m.content\n ? { content: [...initialContent, ...(m.content ?? [])] }\n : undefined),\n status: m.status ?? message.status,\n ...(m.metadata\n ? {\n metadata: {\n ...message.metadata,\n ...(annotations\n ? { unstable_annotations: annotations }\n : undefined),\n ...(data ? { unstable_data: data } : undefined),\n ...(steps ? { steps } : undefined),\n ...(m.metadata?.custom\n ? {\n custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n }\n : undefined),\n },\n }\n : undefined),\n };\n this.repository.addOrUpdateMessage(parentId, message);\n this._notifySubscribers();\n };\n\n const maxSteps = this._options.maxSteps ?? 2;\n\n const steps = message.metadata?.steps?.length ?? 0;\n if (steps >= maxSteps) {\n // reached max tool steps\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"tool-calls\",\n },\n });\n return message;\n } else {\n updateMessage({\n status: {\n type: \"running\",\n },\n });\n }\n\n try {\n this._lastRunConfig = runConfig ?? {};\n const context = this.getModelContext();\n\n runCallback =\n runCallback ??\n this.adapters.chatModel.run.bind(this.adapters.chatModel);\n\n const promiseOrGenerator = runCallback({\n messages,\n runConfig: this._lastRunConfig,\n abortSignal: this.abortController.signal,\n context,\n config: context,\n unstable_assistantMessageId: message.id,\n unstable_getMessage() {\n return message;\n },\n });\n\n // handle async iterator for streaming results\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n updateMessage(r);\n }\n } else {\n updateMessage(await promiseOrGenerator);\n }\n\n this.abortController = null;\n\n if (message.status.type === \"running\") {\n updateMessage({\n status: { type: \"complete\", reason: \"unknown\" },\n });\n }\n } catch (e) {\n this.abortController = null;\n\n // TODO this should be handled by the run result stream\n if (e instanceof Error && e.name === \"AbortError\") {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else {\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n e instanceof Error\n ? e.message\n : `[${typeof e}] ${new String(e).toString()}`,\n },\n });\n\n throw e;\n }\n } finally {\n if (\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\"\n ) {\n await this._options.adapters.history?.append({\n parentId,\n message: message,\n });\n }\n }\n return message;\n }\n\n public cancelRun() {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n public addToolResult({\n messageId,\n toolCallId,\n result,\n }: AddToolResultOptions) {\n const messageData = this.repository.getMessage(messageId);\n const { parentId } = messageData;\n let { message } = messageData;\n\n if (message.role !== \"assistant\")\n throw new Error(\"Tried to add tool result to non-assistant message\");\n\n let added = false;\n let found = false;\n const newContent = message.content.map((c) => {\n if (c.type !== \"tool-call\") return c;\n if (c.toolCallId !== toolCallId) return c;\n found = true;\n if (!c.result) added = true;\n return {\n ...c,\n result,\n };\n });\n\n if (!found)\n throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n message = {\n ...message,\n content: newContent,\n };\n this.repository.addOrUpdateMessage(parentId, message);\n\n if (\n added &&\n shouldContinue(message, this._options.unstable_humanToolNames)\n ) {\n this.performRoundtrip(parentId, message, this._lastRunConfig);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAE3B,kBAAgC;AAEhC,4BAA+B;AAS/B,mCAAsC;AAI/B,IAAM,yBAAN,cACG,mDAEV;AAAA,EACkB,eAAe;AAAA,IAC7B,gBAAgB;AAAA,IAChB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,UAAU;AAAA,EACZ;AAAA,EAEQ,kBAA0C;AAAA,EAElC,aAAa;AAAA,EAErB,eAA4C,CAAC;AAAA,EAC7C,yBAAiD;AAAA,EACzD,IAAW,cAA2C;AACpD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,WAAW;AACpB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,YACE,iBACA,SACA;AACA,UAAM,eAAe;AACrB,SAAK,sBAAsB,OAAO;AAAA,EACpC;AAAA,EAEQ;AAAA,EAEA,iBAA4B,CAAC;AAAA,EAErC,IAAW,SAAS;AAClB,WAAO;AAAA,EACT;AAAA,EAEO,sBAAsB,SAAkC;AAC7D,QAAI,KAAK,aAAa,QAAS;AAE/B,SAAK,WAAW;AAEhB,QAAI,aAAa;AAEjB,UAAM,WAAW,QAAQ,UAAU,WAAW;AAC9C,QAAI,KAAK,aAAa,WAAW,UAAU;AACzC,WAAK,aAAa,SAAS;AAC3B,mBAAa;AAAA,IACf;AAEA,UAAM,YAAY,QAAQ,UAAU,gBAAgB;AACpD,QAAI,KAAK,aAAa,gBAAgB,WAAW;AAC/C,WAAK,aAAa,cAAc;AAChC,mBAAa;AAAA,IACf;AAEA,UAAM,cAAc,QAAQ,UAAU,aAAa;AACnD,QAAI,KAAK,aAAa,aAAa,aAAa;AAC9C,WAAK,aAAa,WAAW;AAC7B,mBAAa;AAAA,IACf;AAEA,QAAI,WAAY,MAAK,mBAAmB;AAAA,EAC1C;AAAA,EAEQ;AAAA,EACD,kBAAkB;AACvB,QAAI,KAAK,aAAc,QAAO,KAAK;AAEnC,UAAM,UAAU,KAAK,SAAS,SAAS,KAAK,KAAK,QAAQ,QAAQ,IAAI;AAErE,SAAK,eAAe,QAAQ,KAAK,CAAC,SAAS;AACzC,UAAI,CAAC,KAAM;AACX,WAAK,WAAW,OAAO,IAAI;AAC3B,WAAK,mBAAmB;AAExB,YAAM,SAAS,KAAK,SAAS,SAAS,QAAQ,KAAK,KAAK,SAAS,OAAO;AACxE,UAAI,KAAK,mBAAmB,QAAQ;AAClC,aAAK;AAAA,UACH;AAAA,YACE,UAAU,KAAK,WAAW;AAAA,YAC1B,UAAU,KAAK,WAAW;AAAA,YAC1B,WAAW,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,OAAO,SAAuC;AACzD,SAAK,kBAAkB;AAEvB,UAAM,iBAAa,6BAAgB,SAAS;AAAA,MAC1C,aAAa,QAAQ;AAAA,IACvB,CAAC;AACD,SAAK,WAAW,mBAAmB,QAAQ,UAAU,UAAU;AAC/D,SAAK,SAAS,SAAS,SAAS,OAAO;AAAA,MACrC,UAAU,QAAQ;AAAA,MAClB,SAAS;AAAA,IACX,CAAC;AAED,UAAM,WAAW,QAAQ,YAAY,QAAQ,SAAS;AACtD,QAAI,UAAU;AACZ,YAAM,KAAK,SAAS;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,UAAU,QAAQ;AAAA,QAClB,WAAW,QAAQ,aAAa,CAAC;AAAA,MACnC,CAAC;AAAA,IACH,OAAO;AACL,WAAK,WAAW,UAAU,WAAW,EAAE;AACvC,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEO,UAAU,EAAE,QAAQ,GAAG,YAAY,GAAmC;AAC3E,WAAO,KAAK,SAAS,aAAa,MAAM,MAAM;AAAA,EAChD;AAAA,EAEA,MAAa,SACX,EAAE,UAAU,UAAU,GACtB,aACe;AACf,SAAK,kBAAkB;AAEvB,SAAK,WAAW,UAAU,QAAQ;AAGlC,UAAM,SAAK,4BAAW;AACtB,QAAI,UAAkC;AAAA,MACpC;AAAA,MACA,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,UAAU;AAAA,MAC1B,SAAS,CAAC;AAAA,MACV,UAAU;AAAA,QACR,sBAAsB,CAAC;AAAA,QACvB,eAAe,CAAC;AAAA,QAChB,OAAO,CAAC;AAAA,QACR,QAAQ,CAAC;AAAA,MACX;AAAA,MACA,WAAW,oBAAI,KAAK;AAAA,IACtB;AAEA,SAAK,wBAAwB,WAAW;AAExC,QAAI;AACF,WAAK,eAAe,CAAC;AACrB,WAAK,wBAAwB,MAAM;AACnC,WAAK,yBAAyB;AAE9B,SAAG;AACD,kBAAU,MAAM,KAAK;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,sBAAc;AAAA,MAChB,aAAS,sCAAe,SAAS,KAAK,SAAS,uBAAuB;AAAA,IACxE,UAAE;AACA,WAAK,wBAAwB,SAAS;AAAA,IACxC;AAEA,SAAK,yBAAyB,IAAI,gBAAgB;AAClD,UAAM,SAAS,KAAK,uBAAuB;AAC3C,QACE,KAAK,SAAS,cACd,QAAQ,QAAQ,SAAS,mBACzB;AACA,YAAM,qBAAqB,KAAK,SAAS,YAAY,SAAS;AAAA,QAC5D,UAAU,KAAK;AAAA,MACjB,CAAC;AAED,UAAI,OAAO,iBAAiB,oBAAoB;AAC9C,yBAAiB,KAAK,oBAAoB;AACxC,cAAI,OAAO,QAAS;AACpB,eAAK,eAAe;AAAA,QACtB;AAAA,MACF,OAAO;AACL,cAAM,SAAS,MAAM;AACrB,YAAI,OAAO,QAAS;AACpB,aAAK,eAAe;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBACZ,UACA,SACA,WACA,aACA;AACA,UAAM,WAAW,KAAK,WAAW,YAAY;AAG7C,SAAK,iBAAiB,MAAM;AAC5B,SAAK,kBAAkB,IAAI,gBAAgB;AAE3C,UAAM,iBAAiB,QAAQ;AAC/B,UAAM,qBAAqB,QAAQ,UAAU;AAC7C,UAAM,cAAc,QAAQ,UAAU;AACtC,UAAM,eAAe,QAAQ,UAAU;AACvC,UAAM,eAAe,QAAQ,UAAU;AACvC,UAAM,gBAAgB,CAAC,MAAmC;AACxD,YAAM,WAAW,EAAE,UAAU;AAC7B,YAAMA,SAAQ,WACV,CAAC,GAAI,gBAAgB,CAAC,GAAI,GAAG,QAAQ,IACrC;AAEJ,YAAM,iBAAiB,EAAE,UAAU;AACnC,YAAM,UAAU,EAAE,UAAU;AAC5B,YAAM,cAAc,iBAChB,CAAC,GAAI,sBAAsB,CAAC,GAAI,GAAG,cAAc,IACjD;AACJ,YAAM,OAAO,UAAU,CAAC,GAAI,eAAe,CAAC,GAAI,GAAG,OAAO,IAAI;AAE9D,gBAAU;AAAA,QACR,GAAG;AAAA,QACH,GAAI,EAAE,UACF,EAAE,SAAS,CAAC,GAAG,gBAAgB,GAAI,EAAE,WAAW,CAAC,CAAE,EAAE,IACrD;AAAA,QACJ,QAAQ,EAAE,UAAU,QAAQ;AAAA,QAC5B,GAAI,EAAE,WACF;AAAA,UACE,UAAU;AAAA,YACR,GAAG,QAAQ;AAAA,YACX,GAAI,cACA,EAAE,sBAAsB,YAAY,IACpC;AAAA,YACJ,GAAI,OAAO,EAAE,eAAe,KAAK,IAAI;AAAA,YACrC,GAAIA,SAAQ,EAAE,OAAAA,OAAM,IAAI;AAAA,YACxB,GAAI,EAAE,UAAU,SACZ;AAAA,cACE,QAAQ,EAAE,GAAI,gBAAgB,CAAC,GAAI,GAAG,EAAE,SAAS,OAAO;AAAA,YAC1D,IACA;AAAA,UACN;AAAA,QACF,IACA;AAAA,MACN;AACA,WAAK,WAAW,mBAAmB,UAAU,OAAO;AACpD,WAAK,mBAAmB;AAAA,IAC1B;AAEA,UAAM,WAAW,KAAK,SAAS,YAAY;AAE3C,UAAM,QAAQ,QAAQ,UAAU,OAAO,UAAU;AACjD,QAAI,SAAS,UAAU;AAErB,oBAAc;AAAA,QACZ,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT,OAAO;AACL,oBAAc;AAAA,QACZ,QAAQ;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI;AACF,WAAK,iBAAiB,aAAa,CAAC;AACpC,YAAM,UAAU,KAAK,gBAAgB;AAErC,oBACE,eACA,KAAK,SAAS,UAAU,IAAI,KAAK,KAAK,SAAS,SAAS;AAE1D,YAAM,qBAAqB,YAAY;AAAA,QACrC;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK,gBAAgB;AAAA,QAClC;AAAA,QACA,QAAQ;AAAA,QACR,6BAA6B,QAAQ;AAAA,QACrC,sBAAsB;AACpB,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAGD,UAAI,OAAO,iBAAiB,oBAAoB;AAC9C,yBAAiB,KAAK,oBAAoB;AACxC,wBAAc,CAAC;AAAA,QACjB;AAAA,MACF,OAAO;AACL,sBAAc,MAAM,kBAAkB;AAAA,MACxC;AAEA,WAAK,kBAAkB;AAEvB,UAAI,QAAQ,OAAO,SAAS,WAAW;AACrC,sBAAc;AAAA,UACZ,QAAQ,EAAE,MAAM,YAAY,QAAQ,UAAU;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF,SAAS,GAAG;AACV,WAAK,kBAAkB;AAGvB,UAAI,aAAa,SAAS,EAAE,SAAS,cAAc;AACjD,sBAAc;AAAA,UACZ,QAAQ,EAAE,MAAM,cAAc,QAAQ,YAAY;AAAA,QACpD,CAAC;AAAA,MACH,OAAO;AACL,sBAAc;AAAA,UACZ,QAAQ;AAAA,YACN,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,OACE,aAAa,QACT,EAAE,UACF,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,SAAS,CAAC;AAAA,UACjD;AAAA,QACF,CAAC;AAED,cAAM;AAAA,MACR;AAAA,IACF,UAAE;AACA,UACE,QAAQ,OAAO,SAAS,cACxB,QAAQ,OAAO,SAAS,cACxB;AACA,cAAM,KAAK,SAAS,SAAS,SAAS,OAAO;AAAA,UAC3C;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEO,YAAY;AACjB,SAAK,iBAAiB,MAAM;AAC5B,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEO,cAAc;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAyB;AACvB,UAAM,cAAc,KAAK,WAAW,WAAW,SAAS;AACxD,UAAM,EAAE,SAAS,IAAI;AACrB,QAAI,EAAE,QAAQ,IAAI;AAElB,QAAI,QAAQ,SAAS;AACnB,YAAM,IAAI,MAAM,mDAAmD;AAErE,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,UAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC5C,UAAI,EAAE,SAAS,YAAa,QAAO;AACnC,UAAI,EAAE,eAAe,WAAY,QAAO;AACxC,cAAQ;AACR,UAAI,CAAC,EAAE,OAAQ,SAAQ;AACvB,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,oDAAoD;AAEtE,cAAU;AAAA,MACR,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AACA,SAAK,WAAW,mBAAmB,UAAU,OAAO;AAEpD,QACE,aACA,sCAAe,SAAS,KAAK,SAAS,uBAAuB,GAC7D;AACA,WAAK,iBAAiB,UAAU,SAAS,KAAK,cAAc;AAAA,IAC9D;AAAA,EACF;AACF;","names":["steps"]}
1
+ {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelAdapter, ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n AddToolResultOptions,\n ThreadSuggestion,\n ThreadRuntimeCore,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n public readonly capabilities = {\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n unstable_copy: true,\n speech: false,\n attachments: false,\n feedback: false,\n };\n\n private abortController: AbortController | null = null;\n\n public readonly isDisabled = false;\n\n private _suggestions: readonly ThreadSuggestion[] = [];\n private _suggestionsController: AbortController | null = null;\n public get suggestions(): readonly ThreadSuggestion[] {\n return this._suggestions;\n }\n\n public get adapters() {\n return this._options.adapters;\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n options: LocalRuntimeOptionsBase,\n ) {\n super(contextProvider);\n this.__internal_setOptions(options);\n }\n\n private _options!: LocalRuntimeOptionsBase;\n\n private _lastRunConfig: RunConfig = {};\n\n public get extras() {\n return undefined;\n }\n\n public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n if (this._options === options) return;\n\n this._options = options;\n\n let hasUpdates = false;\n\n const canSpeak = options.adapters?.speech !== undefined;\n if (this.capabilities.speech !== canSpeak) {\n this.capabilities.speech = canSpeak;\n hasUpdates = true;\n }\n\n const canAttach = options.adapters?.attachments !== undefined;\n if (this.capabilities.attachments !== canAttach) {\n this.capabilities.attachments = canAttach;\n hasUpdates = true;\n }\n\n const canFeedback = options.adapters?.feedback !== undefined;\n if (this.capabilities.feedback !== canFeedback) {\n this.capabilities.feedback = canFeedback;\n hasUpdates = true;\n }\n\n if (hasUpdates) this._notifySubscribers();\n }\n\n private _loadPromise: Promise<void> | undefined;\n public __internal_load() {\n if (this._loadPromise) return this._loadPromise;\n\n const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n this._loadPromise = promise.then((repo) => {\n if (!repo) return;\n this.repository.import(repo);\n this._notifySubscribers();\n\n const resume = this.adapters.history?.resume?.bind(this.adapters.history);\n if (repo.unstable_resume && resume) {\n this.startRun(\n {\n parentId: this.repository.headId,\n sourceId: this.repository.headId,\n runConfig: this._lastRunConfig,\n },\n resume,\n );\n }\n });\n\n return this._loadPromise;\n }\n\n public async append(message: AppendMessage): Promise<void> {\n this.ensureInitialized();\n\n const newMessage = fromCoreMessage(message, {\n attachments: message.attachments,\n });\n this.repository.addOrUpdateMessage(message.parentId, newMessage);\n this._options.adapters.history?.append({\n parentId: message.parentId,\n message: newMessage,\n });\n\n const startRun = message.startRun ?? message.role === \"user\";\n if (startRun) {\n await this.startRun({\n parentId: newMessage.id,\n sourceId: message.sourceId,\n runConfig: message.runConfig ?? {},\n });\n } else {\n this.repository.resetHead(newMessage.id);\n this._notifySubscribers();\n }\n }\n\n public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {\n return this.startRun(startConfig, stream);\n }\n\n public async startRun(\n { parentId, runConfig }: StartRunConfig,\n runCallback?: ChatModelAdapter[\"run\"],\n ): Promise<void> {\n this.ensureInitialized();\n\n this.repository.resetHead(parentId);\n\n // add assistant message\n const id = generateId();\n let message: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n createdAt: new Date(),\n };\n\n this._notifyEventSubscribers(\"run-start\");\n\n try {\n this._suggestions = [];\n this._suggestionsController?.abort();\n this._suggestionsController = null;\n\n do {\n message = await this.performRoundtrip(\n parentId,\n message,\n runConfig,\n runCallback,\n );\n runCallback = undefined;\n } while (shouldContinue(message, this._options.unstable_humanToolNames));\n } finally {\n this._notifyEventSubscribers(\"run-end\");\n }\n\n this._suggestionsController = new AbortController();\n const signal = this._suggestionsController.signal;\n if (\n this.adapters.suggestion &&\n message.status?.type !== \"requires-action\"\n ) {\n const promiseOrGenerator = this.adapters.suggestion?.generate({\n messages: this.messages,\n });\n\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (signal.aborted) break;\n this._suggestions = r;\n }\n } else {\n const result = await promiseOrGenerator;\n if (signal.aborted) return;\n this._suggestions = result;\n }\n }\n }\n\n private async performRoundtrip(\n parentId: string | null,\n message: ThreadAssistantMessage,\n runConfig: RunConfig | undefined,\n runCallback?: ChatModelAdapter[\"run\"],\n ) {\n const messages = this.repository.getMessages();\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const initialContent = message.content;\n const initialAnnotations = message.metadata?.unstable_annotations;\n const initialData = message.metadata?.unstable_data;\n const initialSteps = message.metadata?.steps;\n const initalCustom = message.metadata?.custom;\n const updateMessage = (m: Partial<ChatModelRunResult>) => {\n const newSteps = m.metadata?.steps;\n const steps = newSteps\n ? [...(initialSteps ?? []), ...newSteps]\n : undefined;\n\n const newAnnotations = m.metadata?.unstable_annotations;\n const newData = m.metadata?.unstable_data;\n const annotations = newAnnotations\n ? [...(initialAnnotations ?? []), ...newAnnotations]\n : undefined;\n const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n message = {\n ...message,\n ...(m.content\n ? { content: [...initialContent, ...(m.content ?? [])] }\n : undefined),\n status: m.status ?? message.status,\n ...(m.metadata\n ? {\n metadata: {\n ...message.metadata,\n ...(annotations\n ? { unstable_annotations: annotations }\n : undefined),\n ...(data ? { unstable_data: data } : undefined),\n ...(steps ? { steps } : undefined),\n ...(m.metadata?.custom\n ? {\n custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n }\n : undefined),\n },\n }\n : undefined),\n };\n this.repository.addOrUpdateMessage(parentId, message);\n this._notifySubscribers();\n };\n\n const maxSteps = this._options.maxSteps ?? 2;\n\n const steps = message.metadata?.steps?.length ?? 0;\n if (steps >= maxSteps) {\n // reached max tool steps\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"tool-calls\",\n },\n });\n return message;\n } else {\n updateMessage({\n status: {\n type: \"running\",\n },\n });\n }\n\n try {\n this._lastRunConfig = runConfig ?? {};\n const context = this.getModelContext();\n\n runCallback =\n runCallback ??\n this.adapters.chatModel.run.bind(this.adapters.chatModel);\n\n const promiseOrGenerator = runCallback({\n messages,\n runConfig: this._lastRunConfig,\n abortSignal: this.abortController.signal,\n context,\n config: context,\n unstable_assistantMessageId: message.id,\n unstable_getMessage() {\n return message;\n },\n });\n\n // handle async iterator for streaming results\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n updateMessage(r);\n }\n } else {\n updateMessage(await promiseOrGenerator);\n }\n\n this.abortController = null;\n\n if (message.status.type === \"running\") {\n updateMessage({\n status: { type: \"complete\", reason: \"unknown\" },\n });\n }\n } catch (e) {\n this.abortController = null;\n\n // TODO this should be handled by the run result stream\n if (e instanceof Error && e.name === \"AbortError\") {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else {\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n e instanceof Error\n ? e.message\n : `[${typeof e}] ${new String(e).toString()}`,\n },\n });\n\n throw e;\n }\n } finally {\n if (\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\"\n ) {\n await this._options.adapters.history?.append({\n parentId,\n message: message,\n });\n }\n }\n return message;\n }\n\n public cancelRun() {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n public addToolResult({\n messageId,\n toolCallId,\n result,\n }: AddToolResultOptions) {\n const messageData = this.repository.getMessage(messageId);\n const { parentId } = messageData;\n let { message } = messageData;\n\n if (message.role !== \"assistant\")\n throw new Error(\"Tried to add tool result to non-assistant message\");\n\n let added = false;\n let found = false;\n const newContent = message.content.map((c) => {\n if (c.type !== \"tool-call\") return c;\n if (c.toolCallId !== toolCallId) return c;\n found = true;\n if (!c.result) added = true;\n return {\n ...c,\n result,\n };\n });\n\n if (!found)\n throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n message = {\n ...message,\n content: newContent,\n };\n this.repository.addOrUpdateMessage(parentId, message);\n\n if (\n added &&\n shouldContinue(message, this._options.unstable_humanToolNames)\n ) {\n this.performRoundtrip(parentId, message, this._lastRunConfig);\n }\n }\n}\n"],"mappings":"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","names":["steps"]}
@@ -99,7 +99,7 @@ var LocalThreadRuntimeCore = class extends BaseThreadRuntimeCore {
99
99
  }
100
100
  }
101
101
  resumeRun({ stream, ...startConfig }) {
102
- return this.startRun(startConfig, () => stream);
102
+ return this.startRun(startConfig, stream);
103
103
  }
104
104
  async startRun({ parentId, runConfig }, runCallback) {
105
105
  this.ensureInitialized();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelAdapter, ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n AddToolResultOptions,\n ThreadSuggestion,\n ThreadRuntimeCore,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n public readonly capabilities = {\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n unstable_copy: true,\n speech: false,\n attachments: false,\n feedback: false,\n };\n\n private abortController: AbortController | null = null;\n\n public readonly isDisabled = false;\n\n private _suggestions: readonly ThreadSuggestion[] = [];\n private _suggestionsController: AbortController | null = null;\n public get suggestions(): readonly ThreadSuggestion[] {\n return this._suggestions;\n }\n\n public get adapters() {\n return this._options.adapters;\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n options: LocalRuntimeOptionsBase,\n ) {\n super(contextProvider);\n this.__internal_setOptions(options);\n }\n\n private _options!: LocalRuntimeOptionsBase;\n\n private _lastRunConfig: RunConfig = {};\n\n public get extras() {\n return undefined;\n }\n\n public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n if (this._options === options) return;\n\n this._options = options;\n\n let hasUpdates = false;\n\n const canSpeak = options.adapters?.speech !== undefined;\n if (this.capabilities.speech !== canSpeak) {\n this.capabilities.speech = canSpeak;\n hasUpdates = true;\n }\n\n const canAttach = options.adapters?.attachments !== undefined;\n if (this.capabilities.attachments !== canAttach) {\n this.capabilities.attachments = canAttach;\n hasUpdates = true;\n }\n\n const canFeedback = options.adapters?.feedback !== undefined;\n if (this.capabilities.feedback !== canFeedback) {\n this.capabilities.feedback = canFeedback;\n hasUpdates = true;\n }\n\n if (hasUpdates) this._notifySubscribers();\n }\n\n private _loadPromise: Promise<void> | undefined;\n public __internal_load() {\n if (this._loadPromise) return this._loadPromise;\n\n const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n this._loadPromise = promise.then((repo) => {\n if (!repo) return;\n this.repository.import(repo);\n this._notifySubscribers();\n\n const resume = this.adapters.history?.resume?.bind(this.adapters.history);\n if (repo.unstable_resume && resume) {\n this.startRun(\n {\n parentId: this.repository.headId,\n sourceId: this.repository.headId,\n runConfig: this._lastRunConfig,\n },\n resume,\n );\n }\n });\n\n return this._loadPromise;\n }\n\n public async append(message: AppendMessage): Promise<void> {\n this.ensureInitialized();\n\n const newMessage = fromCoreMessage(message, {\n attachments: message.attachments,\n });\n this.repository.addOrUpdateMessage(message.parentId, newMessage);\n this._options.adapters.history?.append({\n parentId: message.parentId,\n message: newMessage,\n });\n\n const startRun = message.startRun ?? message.role === \"user\";\n if (startRun) {\n await this.startRun({\n parentId: newMessage.id,\n sourceId: message.sourceId,\n runConfig: message.runConfig ?? {},\n });\n } else {\n this.repository.resetHead(newMessage.id);\n this._notifySubscribers();\n }\n }\n\n public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {\n return this.startRun(startConfig, () => stream);\n }\n\n public async startRun(\n { parentId, runConfig }: StartRunConfig,\n runCallback?: ChatModelAdapter[\"run\"],\n ): Promise<void> {\n this.ensureInitialized();\n\n this.repository.resetHead(parentId);\n\n // add assistant message\n const id = generateId();\n let message: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n createdAt: new Date(),\n };\n\n this._notifyEventSubscribers(\"run-start\");\n\n try {\n this._suggestions = [];\n this._suggestionsController?.abort();\n this._suggestionsController = null;\n\n do {\n message = await this.performRoundtrip(\n parentId,\n message,\n runConfig,\n runCallback,\n );\n runCallback = undefined;\n } while (shouldContinue(message, this._options.unstable_humanToolNames));\n } finally {\n this._notifyEventSubscribers(\"run-end\");\n }\n\n this._suggestionsController = new AbortController();\n const signal = this._suggestionsController.signal;\n if (\n this.adapters.suggestion &&\n message.status?.type !== \"requires-action\"\n ) {\n const promiseOrGenerator = this.adapters.suggestion?.generate({\n messages: this.messages,\n });\n\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (signal.aborted) break;\n this._suggestions = r;\n }\n } else {\n const result = await promiseOrGenerator;\n if (signal.aborted) return;\n this._suggestions = result;\n }\n }\n }\n\n private async performRoundtrip(\n parentId: string | null,\n message: ThreadAssistantMessage,\n runConfig: RunConfig | undefined,\n runCallback?: ChatModelAdapter[\"run\"],\n ) {\n const messages = this.repository.getMessages();\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const initialContent = message.content;\n const initialAnnotations = message.metadata?.unstable_annotations;\n const initialData = message.metadata?.unstable_data;\n const initialSteps = message.metadata?.steps;\n const initalCustom = message.metadata?.custom;\n const updateMessage = (m: Partial<ChatModelRunResult>) => {\n const newSteps = m.metadata?.steps;\n const steps = newSteps\n ? [...(initialSteps ?? []), ...newSteps]\n : undefined;\n\n const newAnnotations = m.metadata?.unstable_annotations;\n const newData = m.metadata?.unstable_data;\n const annotations = newAnnotations\n ? [...(initialAnnotations ?? []), ...newAnnotations]\n : undefined;\n const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n message = {\n ...message,\n ...(m.content\n ? { content: [...initialContent, ...(m.content ?? [])] }\n : undefined),\n status: m.status ?? message.status,\n ...(m.metadata\n ? {\n metadata: {\n ...message.metadata,\n ...(annotations\n ? { unstable_annotations: annotations }\n : undefined),\n ...(data ? { unstable_data: data } : undefined),\n ...(steps ? { steps } : undefined),\n ...(m.metadata?.custom\n ? {\n custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n }\n : undefined),\n },\n }\n : undefined),\n };\n this.repository.addOrUpdateMessage(parentId, message);\n this._notifySubscribers();\n };\n\n const maxSteps = this._options.maxSteps ?? 2;\n\n const steps = message.metadata?.steps?.length ?? 0;\n if (steps >= maxSteps) {\n // reached max tool steps\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"tool-calls\",\n },\n });\n return message;\n } else {\n updateMessage({\n status: {\n type: \"running\",\n },\n });\n }\n\n try {\n this._lastRunConfig = runConfig ?? {};\n const context = this.getModelContext();\n\n runCallback =\n runCallback ??\n this.adapters.chatModel.run.bind(this.adapters.chatModel);\n\n const promiseOrGenerator = runCallback({\n messages,\n runConfig: this._lastRunConfig,\n abortSignal: this.abortController.signal,\n context,\n config: context,\n unstable_assistantMessageId: message.id,\n unstable_getMessage() {\n return message;\n },\n });\n\n // handle async iterator for streaming results\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n updateMessage(r);\n }\n } else {\n updateMessage(await promiseOrGenerator);\n }\n\n this.abortController = null;\n\n if (message.status.type === \"running\") {\n updateMessage({\n status: { type: \"complete\", reason: \"unknown\" },\n });\n }\n } catch (e) {\n this.abortController = null;\n\n // TODO this should be handled by the run result stream\n if (e instanceof Error && e.name === \"AbortError\") {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else {\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n e instanceof Error\n ? e.message\n : `[${typeof e}] ${new String(e).toString()}`,\n },\n });\n\n throw e;\n }\n } finally {\n if (\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\"\n ) {\n await this._options.adapters.history?.append({\n parentId,\n message: message,\n });\n }\n }\n return message;\n }\n\n public cancelRun() {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n public addToolResult({\n messageId,\n toolCallId,\n result,\n }: AddToolResultOptions) {\n const messageData = this.repository.getMessage(messageId);\n const { parentId } = messageData;\n let { message } = messageData;\n\n if (message.role !== \"assistant\")\n throw new Error(\"Tried to add tool result to non-assistant message\");\n\n let added = false;\n let found = false;\n const newContent = message.content.map((c) => {\n if (c.type !== \"tool-call\") return c;\n if (c.toolCallId !== toolCallId) return c;\n found = true;\n if (!c.result) added = true;\n return {\n ...c,\n result,\n };\n });\n\n if (!found)\n throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n message = {\n ...message,\n content: newContent,\n };\n this.repository.addOrUpdateMessage(parentId, message);\n\n if (\n added &&\n shouldContinue(message, this._options.unstable_humanToolNames)\n ) {\n this.performRoundtrip(parentId, message, this._lastRunConfig);\n }\n }\n}\n"],"mappings":"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","names":["steps"]}
1
+ {"version":3,"sources":["../../../src/runtimes/local/LocalThreadRuntimeCore.tsx"],"sourcesContent":["import { generateId } from \"../../internal\";\nimport type { AppendMessage, ThreadAssistantMessage } from \"../../types\";\nimport { fromCoreMessage } from \"../edge\";\nimport type { ChatModelAdapter, ChatModelRunResult } from \"./ChatModelAdapter\";\nimport { shouldContinue } from \"./shouldContinue\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport {\n AddToolResultOptions,\n ThreadSuggestion,\n ThreadRuntimeCore,\n StartRunConfig,\n ResumeRunConfig,\n} from \"../core/ThreadRuntimeCore\";\nimport { BaseThreadRuntimeCore } from \"../core/BaseThreadRuntimeCore\";\nimport { RunConfig } from \"../../types/AssistantTypes\";\nimport { ModelContextProvider } from \"../../model-context\";\n\nexport class LocalThreadRuntimeCore\n extends BaseThreadRuntimeCore\n implements ThreadRuntimeCore\n{\n public readonly capabilities = {\n switchToBranch: true,\n edit: true,\n reload: true,\n cancel: true,\n unstable_copy: true,\n speech: false,\n attachments: false,\n feedback: false,\n };\n\n private abortController: AbortController | null = null;\n\n public readonly isDisabled = false;\n\n private _suggestions: readonly ThreadSuggestion[] = [];\n private _suggestionsController: AbortController | null = null;\n public get suggestions(): readonly ThreadSuggestion[] {\n return this._suggestions;\n }\n\n public get adapters() {\n return this._options.adapters;\n }\n\n constructor(\n contextProvider: ModelContextProvider,\n options: LocalRuntimeOptionsBase,\n ) {\n super(contextProvider);\n this.__internal_setOptions(options);\n }\n\n private _options!: LocalRuntimeOptionsBase;\n\n private _lastRunConfig: RunConfig = {};\n\n public get extras() {\n return undefined;\n }\n\n public __internal_setOptions(options: LocalRuntimeOptionsBase) {\n if (this._options === options) return;\n\n this._options = options;\n\n let hasUpdates = false;\n\n const canSpeak = options.adapters?.speech !== undefined;\n if (this.capabilities.speech !== canSpeak) {\n this.capabilities.speech = canSpeak;\n hasUpdates = true;\n }\n\n const canAttach = options.adapters?.attachments !== undefined;\n if (this.capabilities.attachments !== canAttach) {\n this.capabilities.attachments = canAttach;\n hasUpdates = true;\n }\n\n const canFeedback = options.adapters?.feedback !== undefined;\n if (this.capabilities.feedback !== canFeedback) {\n this.capabilities.feedback = canFeedback;\n hasUpdates = true;\n }\n\n if (hasUpdates) this._notifySubscribers();\n }\n\n private _loadPromise: Promise<void> | undefined;\n public __internal_load() {\n if (this._loadPromise) return this._loadPromise;\n\n const promise = this.adapters.history?.load() ?? Promise.resolve(null);\n\n this._loadPromise = promise.then((repo) => {\n if (!repo) return;\n this.repository.import(repo);\n this._notifySubscribers();\n\n const resume = this.adapters.history?.resume?.bind(this.adapters.history);\n if (repo.unstable_resume && resume) {\n this.startRun(\n {\n parentId: this.repository.headId,\n sourceId: this.repository.headId,\n runConfig: this._lastRunConfig,\n },\n resume,\n );\n }\n });\n\n return this._loadPromise;\n }\n\n public async append(message: AppendMessage): Promise<void> {\n this.ensureInitialized();\n\n const newMessage = fromCoreMessage(message, {\n attachments: message.attachments,\n });\n this.repository.addOrUpdateMessage(message.parentId, newMessage);\n this._options.adapters.history?.append({\n parentId: message.parentId,\n message: newMessage,\n });\n\n const startRun = message.startRun ?? message.role === \"user\";\n if (startRun) {\n await this.startRun({\n parentId: newMessage.id,\n sourceId: message.sourceId,\n runConfig: message.runConfig ?? {},\n });\n } else {\n this.repository.resetHead(newMessage.id);\n this._notifySubscribers();\n }\n }\n\n public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {\n return this.startRun(startConfig, stream);\n }\n\n public async startRun(\n { parentId, runConfig }: StartRunConfig,\n runCallback?: ChatModelAdapter[\"run\"],\n ): Promise<void> {\n this.ensureInitialized();\n\n this.repository.resetHead(parentId);\n\n // add assistant message\n const id = generateId();\n let message: ThreadAssistantMessage = {\n id,\n role: \"assistant\",\n status: { type: \"running\" },\n content: [],\n metadata: {\n unstable_annotations: [],\n unstable_data: [],\n steps: [],\n custom: {},\n },\n createdAt: new Date(),\n };\n\n this._notifyEventSubscribers(\"run-start\");\n\n try {\n this._suggestions = [];\n this._suggestionsController?.abort();\n this._suggestionsController = null;\n\n do {\n message = await this.performRoundtrip(\n parentId,\n message,\n runConfig,\n runCallback,\n );\n runCallback = undefined;\n } while (shouldContinue(message, this._options.unstable_humanToolNames));\n } finally {\n this._notifyEventSubscribers(\"run-end\");\n }\n\n this._suggestionsController = new AbortController();\n const signal = this._suggestionsController.signal;\n if (\n this.adapters.suggestion &&\n message.status?.type !== \"requires-action\"\n ) {\n const promiseOrGenerator = this.adapters.suggestion?.generate({\n messages: this.messages,\n });\n\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n if (signal.aborted) break;\n this._suggestions = r;\n }\n } else {\n const result = await promiseOrGenerator;\n if (signal.aborted) return;\n this._suggestions = result;\n }\n }\n }\n\n private async performRoundtrip(\n parentId: string | null,\n message: ThreadAssistantMessage,\n runConfig: RunConfig | undefined,\n runCallback?: ChatModelAdapter[\"run\"],\n ) {\n const messages = this.repository.getMessages();\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n const initialContent = message.content;\n const initialAnnotations = message.metadata?.unstable_annotations;\n const initialData = message.metadata?.unstable_data;\n const initialSteps = message.metadata?.steps;\n const initalCustom = message.metadata?.custom;\n const updateMessage = (m: Partial<ChatModelRunResult>) => {\n const newSteps = m.metadata?.steps;\n const steps = newSteps\n ? [...(initialSteps ?? []), ...newSteps]\n : undefined;\n\n const newAnnotations = m.metadata?.unstable_annotations;\n const newData = m.metadata?.unstable_data;\n const annotations = newAnnotations\n ? [...(initialAnnotations ?? []), ...newAnnotations]\n : undefined;\n const data = newData ? [...(initialData ?? []), ...newData] : undefined;\n\n message = {\n ...message,\n ...(m.content\n ? { content: [...initialContent, ...(m.content ?? [])] }\n : undefined),\n status: m.status ?? message.status,\n ...(m.metadata\n ? {\n metadata: {\n ...message.metadata,\n ...(annotations\n ? { unstable_annotations: annotations }\n : undefined),\n ...(data ? { unstable_data: data } : undefined),\n ...(steps ? { steps } : undefined),\n ...(m.metadata?.custom\n ? {\n custom: { ...(initalCustom ?? {}), ...m.metadata.custom },\n }\n : undefined),\n },\n }\n : undefined),\n };\n this.repository.addOrUpdateMessage(parentId, message);\n this._notifySubscribers();\n };\n\n const maxSteps = this._options.maxSteps ?? 2;\n\n const steps = message.metadata?.steps?.length ?? 0;\n if (steps >= maxSteps) {\n // reached max tool steps\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"tool-calls\",\n },\n });\n return message;\n } else {\n updateMessage({\n status: {\n type: \"running\",\n },\n });\n }\n\n try {\n this._lastRunConfig = runConfig ?? {};\n const context = this.getModelContext();\n\n runCallback =\n runCallback ??\n this.adapters.chatModel.run.bind(this.adapters.chatModel);\n\n const promiseOrGenerator = runCallback({\n messages,\n runConfig: this._lastRunConfig,\n abortSignal: this.abortController.signal,\n context,\n config: context,\n unstable_assistantMessageId: message.id,\n unstable_getMessage() {\n return message;\n },\n });\n\n // handle async iterator for streaming results\n if (Symbol.asyncIterator in promiseOrGenerator) {\n for await (const r of promiseOrGenerator) {\n updateMessage(r);\n }\n } else {\n updateMessage(await promiseOrGenerator);\n }\n\n this.abortController = null;\n\n if (message.status.type === \"running\") {\n updateMessage({\n status: { type: \"complete\", reason: \"unknown\" },\n });\n }\n } catch (e) {\n this.abortController = null;\n\n // TODO this should be handled by the run result stream\n if (e instanceof Error && e.name === \"AbortError\") {\n updateMessage({\n status: { type: \"incomplete\", reason: \"cancelled\" },\n });\n } else {\n updateMessage({\n status: {\n type: \"incomplete\",\n reason: \"error\",\n error:\n e instanceof Error\n ? e.message\n : `[${typeof e}] ${new String(e).toString()}`,\n },\n });\n\n throw e;\n }\n } finally {\n if (\n message.status.type === \"complete\" ||\n message.status.type === \"incomplete\"\n ) {\n await this._options.adapters.history?.append({\n parentId,\n message: message,\n });\n }\n }\n return message;\n }\n\n public cancelRun() {\n this.abortController?.abort();\n this.abortController = null;\n }\n\n public addToolResult({\n messageId,\n toolCallId,\n result,\n }: AddToolResultOptions) {\n const messageData = this.repository.getMessage(messageId);\n const { parentId } = messageData;\n let { message } = messageData;\n\n if (message.role !== \"assistant\")\n throw new Error(\"Tried to add tool result to non-assistant message\");\n\n let added = false;\n let found = false;\n const newContent = message.content.map((c) => {\n if (c.type !== \"tool-call\") return c;\n if (c.toolCallId !== toolCallId) return c;\n found = true;\n if (!c.result) added = true;\n return {\n ...c,\n result,\n };\n });\n\n if (!found)\n throw new Error(\"Tried to add tool result to non-existing tool call\");\n\n message = {\n ...message,\n content: newContent,\n };\n this.repository.addOrUpdateMessage(parentId, message);\n\n if (\n added &&\n shouldContinue(message, this._options.unstable_humanToolNames)\n ) {\n this.performRoundtrip(parentId, message, this._lastRunConfig);\n }\n }\n}\n"],"mappings":"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","names":["steps"]}
package/package.json CHANGED
@@ -29,7 +29,7 @@
29
29
  "conversational-ui",
30
30
  "conversational-ai"
31
31
  ],
32
- "version": "0.8.12",
32
+ "version": "0.8.14",
33
33
  "license": "MIT",
34
34
  "exports": {
35
35
  ".": {
@@ -32,7 +32,7 @@ import { RunConfig } from "../types/AssistantTypes";
32
32
  import { EventSubscriptionSubject } from "./subscribable/EventSubscriptionSubject";
33
33
  import { symbolInnerMessage } from "../runtimes/external-store/getExternalStoreMessage";
34
34
  import { ModelContext } from "../model-context";
35
- import { ChatModelRunResult } from "../runtimes";
35
+ import { ChatModelRunOptions, ChatModelRunResult } from "../runtimes";
36
36
 
37
37
  export type CreateStartRunConfig = {
38
38
  parentId: string | null;
@@ -41,7 +41,9 @@ export type CreateStartRunConfig = {
41
41
  };
42
42
 
43
43
  export type CreateResumeRunConfig = CreateStartRunConfig & {
44
- stream: AsyncGenerator<ChatModelRunResult, void, unknown>;
44
+ stream: (
45
+ options: ChatModelRunOptions,
46
+ ) => AsyncGenerator<ChatModelRunResult, void, unknown>;
45
47
  };
46
48
 
47
49
  const toResumeRunConfig = (message: CreateResumeRunConfig): ResumeRunConfig => {
@@ -3,7 +3,7 @@ import { AppendMessage, ThreadMessage } from "../../types";
3
3
  import { RunConfig } from "../../types/AssistantTypes";
4
4
  import type { Unsubscribe } from "../../types/Unsubscribe";
5
5
  import { SpeechSynthesisAdapter } from "../adapters/speech/SpeechAdapterTypes";
6
- import { ChatModelRunResult } from "../local";
6
+ import { ChatModelRunOptions, ChatModelRunResult } from "../local";
7
7
  import { ExportedMessageRepository } from "../utils/MessageRepository";
8
8
  import {
9
9
  ComposerRuntimeCore,
@@ -59,7 +59,9 @@ export type StartRunConfig = {
59
59
  };
60
60
 
61
61
  export type ResumeRunConfig = StartRunConfig & {
62
- stream: AsyncGenerator<ChatModelRunResult, void, unknown>;
62
+ stream: (
63
+ options: ChatModelRunOptions,
64
+ ) => AsyncGenerator<ChatModelRunResult, void, unknown>;
63
65
  };
64
66
 
65
67
  export type ThreadRuntimeCore = Readonly<{
@@ -141,7 +141,7 @@ export class LocalThreadRuntimeCore
141
141
  }
142
142
 
143
143
  public resumeRun({ stream, ...startConfig }: ResumeRunConfig): Promise<void> {
144
- return this.startRun(startConfig, () => stream);
144
+ return this.startRun(startConfig, stream);
145
145
  }
146
146
 
147
147
  public async startRun(