@assistant-ui/react 0.1.0 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. package/dist/{ModelConfigTypes-BF5HxVrH.d.mts → Thread-By2aBNAG.d.mts} +14 -2
  2. package/dist/{ModelConfigTypes-BF5HxVrH.d.ts → Thread-By2aBNAG.d.ts} +14 -2
  3. package/dist/{chunk-CY4TTHR7.mjs → chunk-SCWPIDP6.mjs} +8 -1
  4. package/dist/{chunk-CY4TTHR7.mjs.map → chunk-SCWPIDP6.mjs.map} +1 -1
  5. package/dist/experimental.d.mts +3 -38
  6. package/dist/experimental.d.ts +3 -38
  7. package/dist/experimental.js +17 -301
  8. package/dist/experimental.js.map +1 -1
  9. package/dist/experimental.mjs +1 -112
  10. package/dist/experimental.mjs.map +1 -1
  11. package/dist/index.d.mts +73 -5
  12. package/dist/index.d.ts +73 -5
  13. package/dist/index.js +297 -23
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +315 -13
  16. package/dist/index.mjs.map +1 -1
  17. package/package.json +5 -15
  18. package/dist/AssistantRuntime-BM_jVV3g.d.mts +0 -23
  19. package/dist/AssistantRuntime-CBMSAJqH.d.mts +0 -23
  20. package/dist/AssistantRuntime-C_BvM7ZT.d.ts +0 -23
  21. package/dist/AssistantRuntime-DELpXWfG.d.ts +0 -23
  22. package/dist/ModelConfigTypes-B9UY4zxv.d.mts +0 -55
  23. package/dist/ModelConfigTypes-B9UY4zxv.d.ts +0 -55
  24. package/dist/ModelConfigTypes-Cf3yjaDu.d.mts +0 -55
  25. package/dist/ModelConfigTypes-Cf3yjaDu.d.ts +0 -55
  26. package/dist/chunk-3XZUKECF.mjs +0 -207
  27. package/dist/chunk-3XZUKECF.mjs.map +0 -1
  28. package/dist/chunk-4DQ2CIAD.mjs +0 -69
  29. package/dist/chunk-4DQ2CIAD.mjs.map +0 -1
  30. package/dist/chunk-5YONSDN4.mjs +0 -200
  31. package/dist/chunk-5YONSDN4.mjs.map +0 -1
  32. package/dist/chunk-DKAWDNW5.mjs +0 -22
  33. package/dist/chunk-DKAWDNW5.mjs.map +0 -1
  34. package/dist/chunk-GQKH2ADD.mjs +0 -165
  35. package/dist/chunk-GQKH2ADD.mjs.map +0 -1
  36. package/dist/chunk-J5LGTIGS.mjs +0 -10
  37. package/dist/chunk-J5LGTIGS.mjs.map +0 -1
  38. package/dist/chunk-X4HBDEFP.mjs +0 -30
  39. package/dist/chunk-X4HBDEFP.mjs.map +0 -1
  40. package/dist/internal-dlLjX30u.d.mts +0 -75
  41. package/dist/internal-dlLjX30u.d.ts +0 -75
  42. package/dist/internal.d.mts +0 -25
  43. package/dist/internal.d.ts +0 -25
  44. package/dist/internal.js +0 -225
  45. package/dist/internal.js.map +0 -1
  46. package/dist/internal.mjs +0 -12
  47. package/dist/internal.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/experimental.ts","../src/runtime/local/useLocalRuntime.tsx","../src/utils/ModelConfigTypes.ts","../src/runtime/utils/idUtils.tsx","../src/runtime/utils/MessageRepository.tsx","../src/runtime/local/LocalRuntime.tsx","../src/context/AssistantContext.ts","../src/context/ThreadContext.ts","../src/context/ComposerContext.ts","../src/context/MessageContext.ts","../src/context/ContentPartContext.ts","../src/model-config/useAssistantInstructions.tsx"],"sourcesContent":["export type {\n ImageContentPart,\n ToolCallContentPart,\n UIContentPart,\n} from \"./utils/AssistantTypes\";\n\nexport type { ModelConfigProvider } from \"./utils/ModelConfigTypes\";\n\nexport { useLocalRuntime } from \"./runtime/local/useLocalRuntime\";\nexport type {\n ChatModelAdapter,\n ChatModelRunOptions,\n} from \"./runtime/local/ChatModelAdapter\";\n\nexport * from \"./context\";\nexport { useAssistantInstructions } from \"./model-config/useAssistantInstructions\";\n","\"use client\";\n\nimport { useInsertionEffect, useState } from \"react\";\nimport type { ChatModelAdapter } from \"./ChatModelAdapter\";\nimport { LocalRuntime } from \"./LocalRuntime\";\n\nexport const useLocalRuntime = (adapter: ChatModelAdapter) => {\n const [runtime] = useState(() => new LocalRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n\n return runtime;\n};\n","\"use client\";\nimport type { z } from \"zod\";\n\nexport type Tool<TArgs> = {\n description: string;\n parameters: z.ZodSchema<TArgs>;\n execute: (args: TArgs) => unknown; // TODO return type\n};\n\nexport type ModelConfig = {\n system?: string;\n // biome-ignore lint/suspicious/noExplicitAny: TODO\n tools?: Record<string, Tool<any>>;\n};\n\nexport type ModelConfigProvider = () => ModelConfig;\n\nexport const mergeModelConfigs = (configs: ModelConfig[]): ModelConfig => {\n return configs.reduce((acc, config) => {\n if (config.system) {\n if (acc.system) {\n // TODO should the separator be configurable?\n acc.system += `\\n\\n${config.system}`;\n } else {\n acc.system = config.system;\n }\n }\n if (config.tools) {\n acc.tools = { ...acc.tools, ...config.tools };\n }\n return acc;\n }, {} as ModelConfig);\n};\n","import { customAlphabet } from \"nanoid/non-secure\";\n\nexport const generateId = customAlphabet(\n \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\",\n 7,\n);\n\nconst optimisticPrefix = \"__optimistic__\";\nexport const generateOptimisticId = () => `${optimisticPrefix}${generateId()}`;\nexport const isOptimisticId = (id: string) => id.startsWith(optimisticPrefix);\n","import type { ThreadMessage } from \"../../utils/AssistantTypes\";\nimport { generateOptimisticId } from \"./idUtils\";\n\ntype RepositoryParent = {\n children: string[];\n};\n\ntype RepositoryMessage = RepositoryParent & {\n prev: RepositoryMessage | null;\n current: ThreadMessage;\n next: RepositoryMessage | null;\n level: number;\n};\n\nconst findHead = (message: RepositoryMessage): RepositoryMessage => {\n if (message.next) return findHead(message.next);\n return message;\n};\n\nexport class MessageRepository {\n private messages = new Map<string, RepositoryMessage>(); // message_id -> item\n private head: RepositoryMessage | null = null;\n private root: RepositoryParent = {\n children: [],\n };\n\n private performOp(\n newParent: RepositoryMessage | null,\n child: RepositoryMessage,\n operation: \"cut\" | \"link\" | \"relink\",\n ) {\n const parentOrRoot = child.prev ?? this.root;\n const newParentOrRoot = newParent ?? this.root;\n\n if (operation === \"relink\" && parentOrRoot === newParentOrRoot) return;\n\n // cut\n if (operation !== \"link\") {\n parentOrRoot.children = parentOrRoot.children.filter(\n (m) => m !== child.current.id,\n );\n\n if (child.prev?.next === child) {\n const fallbackId = child.prev.children.at(-1);\n const fallback = fallbackId ? this.messages.get(fallbackId) : null;\n if (fallback === undefined) {\n throw new Error(\n \"MessageRepository(performOp/cut): Fallback sibling message not found. This is likely an internal bug in assistant-ui.\",\n );\n }\n child.prev.next = fallback;\n }\n }\n\n // link\n if (operation !== \"cut\") {\n newParentOrRoot.children = [\n ...newParentOrRoot.children,\n child.current.id,\n ];\n\n if (\n newParent &&\n (findHead(child) === this.head || newParent.next === null)\n ) {\n newParent.next = child;\n }\n\n child.prev = newParent;\n }\n }\n getMessages() {\n const messages = new Array<ThreadMessage>(this.head?.level ?? 0);\n for (let current = this.head; current; current = current.prev) {\n messages[current.level] = current.current;\n }\n return messages;\n }\n\n addOrUpdateMessage(parentId: string | null, message: ThreadMessage) {\n const existingItem = this.messages.get(message.id);\n const prev = parentId ? this.messages.get(parentId) : null;\n if (prev === undefined)\n throw new Error(\n \"MessageRepository(addOrUpdateMessage): Parent message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n // update existing message\n if (existingItem) {\n existingItem.current = message;\n this.performOp(prev, existingItem, \"relink\");\n return;\n }\n\n // create a new message\n const newItem: RepositoryMessage = {\n prev,\n current: message,\n next: null,\n children: [],\n level: prev ? prev.level + 1 : 0,\n };\n\n this.messages.set(message.id, newItem);\n this.performOp(prev, newItem, \"link\");\n\n if (this.head === prev) {\n this.head = newItem;\n }\n }\n\n appendOptimisticMessage(\n parentId: string | null,\n message: Omit<ThreadMessage, \"id\" | \"createdAt\">,\n ) {\n let optimisticId: string;\n do {\n optimisticId = generateOptimisticId();\n } while (this.messages.has(optimisticId));\n\n this.addOrUpdateMessage(parentId, {\n ...message,\n id: optimisticId,\n createdAt: new Date(),\n ...(message.role === \"assistant\" ? { status: \"in_progress\" } : undefined),\n } as ThreadMessage);\n\n return optimisticId;\n }\n\n deleteMessage(messageId: string, replacementId?: string | null | undefined) {\n const message = this.messages.get(messageId);\n\n if (!message)\n throw new Error(\n \"MessageRepository(deleteMessage): Optimistic message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const replacement =\n replacementId === undefined\n ? message.prev // if no replacementId is provided, use the parent\n : replacementId === null\n ? null\n : this.messages.get(replacementId);\n if (replacement === undefined)\n throw new Error(\n \"MessageRepository(deleteMessage): Replacement not found. This is likely an internal bug in assistant-ui.\",\n );\n\n for (const child of message.children) {\n const childMessage = this.messages.get(child);\n if (!childMessage)\n throw new Error(\n \"MessageRepository(deleteMessage): Child message not found. This is likely an internal bug in assistant-ui.\",\n );\n this.performOp(replacement, childMessage, \"relink\");\n }\n\n this.performOp(null, message, \"cut\");\n this.messages.delete(messageId);\n\n if (this.head === message) {\n this.head = replacement ? findHead(replacement) : null;\n }\n }\n\n getBranches(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(getBranches): Message not found. This is likely an internal bug in assistant-ui.\",\n );\n\n const { children } = message.prev ?? this.root;\n return children;\n }\n\n switchToBranch(messageId: string) {\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(switchToBranch): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n if (message.prev) {\n message.prev.next = message;\n }\n\n this.head = findHead(message);\n }\n\n resetHead(messageId: string | null) {\n if (messageId === null) {\n this.head = null;\n return;\n }\n\n const message = this.messages.get(messageId);\n if (!message)\n throw new Error(\n \"MessageRepository(resetHead): Branch not found. This is likely an internal bug in assistant-ui.\",\n );\n\n this.head = message;\n for (\n let current: RepositoryMessage | null = message;\n current;\n current = current.prev\n ) {\n if (current.prev) {\n current.prev.next = current;\n }\n }\n }\n}\n","import type {\n AppendMessage,\n AssistantMessage,\n UserMessage,\n} from \"../../utils/AssistantTypes\";\nimport {\n type ModelConfigProvider,\n mergeModelConfigs,\n} from \"../../utils/ModelConfigTypes\";\nimport type { Unsubscribe } from \"../../utils/Unsubscribe\";\nimport type { AssistantRuntime } from \"../core/AssistantRuntime\";\nimport { MessageRepository } from \"../utils/MessageRepository\";\nimport { generateId } from \"../utils/idUtils\";\nimport type { ChatModelAdapter, ChatModelRunResult } from \"./ChatModelAdapter\";\n\nexport class LocalRuntime implements AssistantRuntime {\n private _subscriptions = new Set<() => void>();\n private _configProviders = new Set<ModelConfigProvider>();\n\n private abortController: AbortController | null = null;\n private repository = new MessageRepository();\n\n public get messages() {\n return this.repository.getMessages();\n }\n public get isRunning() {\n return this.abortController != null;\n }\n\n constructor(public adapter: ChatModelAdapter) {}\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.notifySubscribers();\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n const userMessageId = generateId();\n const userMessage: UserMessage = {\n id: userMessageId,\n role: \"user\",\n content: message.content,\n createdAt: new Date(),\n };\n this.repository.addOrUpdateMessage(message.parentId, userMessage);\n\n await this.startRun(userMessageId);\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const id = generateId();\n\n this.repository.resetHead(parentId);\n const messages = this.repository.getMessages();\n\n // add assistant message\n const message: AssistantMessage = {\n id,\n role: \"assistant\",\n status: \"in_progress\",\n content: [{ type: \"text\", text: \"\" }],\n createdAt: new Date(),\n };\n this.repository.addOrUpdateMessage(parentId, { ...message });\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n this.notifySubscribers();\n\n try {\n const updateHandler = ({ content }: ChatModelRunResult) => {\n message.content = content;\n this.repository.addOrUpdateMessage(parentId, { ...message });\n this.notifySubscribers();\n };\n const result = await this.adapter.run({\n messages,\n abortSignal: this.abortController.signal,\n config: mergeModelConfigs([...this._configProviders].map((p) => p())),\n onUpdate: updateHandler,\n });\n updateHandler(result);\n\n message.status = \"done\";\n this.repository.addOrUpdateMessage(parentId, { ...message });\n } catch (e) {\n message.status = \"error\";\n this.repository.addOrUpdateMessage(parentId, { ...message });\n console.error(e);\n } finally {\n this.abortController = null;\n this.notifySubscribers();\n }\n }\n\n cancelRun(): void {\n if (!this.abortController) return;\n\n this.abortController.abort();\n this.abortController = null;\n this.notifySubscribers();\n }\n\n private notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n registerModelConfigProvider(provider: ModelConfigProvider) {\n this._configProviders.add(provider);\n return () => this._configProviders.delete(provider);\n }\n}\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { AssistantModelConfigState } from \"./stores/AssistantModelConfig\";\n\nexport type AssistantContextValue = {\n useModelConfig: UseBoundStore<StoreApi<AssistantModelConfigState>>;\n};\n\nexport const AssistantContext = createContext<AssistantContextValue | null>(\n null,\n);\n\nexport const useAssistantContext = (): AssistantContextValue => {\n const context = useContext(AssistantContext);\n if (!context)\n throw new Error(\n \"This component must be used within an AssistantRuntimeProvider.\",\n );\n return context;\n};\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { ComposerState } from \"./stores/Composer\";\nimport type { ThreadState } from \"./stores/Thread\";\nimport type { ThreadViewportState } from \"./stores/ThreadViewport\";\n\nexport type ThreadContextValue = {\n useThread: UseBoundStore<StoreApi<ThreadState>>;\n useComposer: UseBoundStore<StoreApi<ComposerState>>;\n useViewport: UseBoundStore<StoreApi<ThreadViewportState>>;\n};\n\nexport const ThreadContext = createContext<ThreadContextValue | null>(null);\n\nexport const useThreadContext = (): ThreadContextValue => {\n const context = useContext(ThreadContext);\n if (!context)\n throw new Error(\"This component must be used within an AssistantRuntimeProvider.\");\n return context;\n};\n","import { useContext, useMemo } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport { MessageContext } from \"./MessageContext\";\nimport { useThreadContext } from \"./ThreadContext\";\nimport type { ComposerState } from \"./stores/Composer\";\nimport type { EditComposerState } from \"./stores/MessageComposer\";\n\nexport type ComposerContextValue = {\n useComposer: UseBoundStore<StoreApi<EditComposerState | ComposerState>>;\n type: \"edit\" | \"new\";\n};\n\nexport const useComposerContext = (): ComposerContextValue => {\n const { useComposer } = useThreadContext();\n const { useComposer: useEditComposer } = useContext(MessageContext) ?? {};\n return useMemo(\n () => ({\n useComposer: (useEditComposer ?? useComposer) as UseBoundStore<\n StoreApi<EditComposerState | ComposerState>\n >,\n type: useEditComposer ? (\"edit\" as const) : (\"new\" as const),\n }),\n [useEditComposer, useComposer],\n );\n};\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { MessageState } from \"./stores/Message\";\nimport type { EditComposerState } from \"./stores/MessageComposer\";\n\nexport type MessageContextValue = {\n useMessage: UseBoundStore<StoreApi<MessageState>>;\n useComposer: UseBoundStore<StoreApi<EditComposerState>>;\n};\n\nexport const MessageContext = createContext<MessageContextValue | null>(null);\n\nexport const useMessageContext = () => {\n const context = useContext(MessageContext);\n if (!context)\n throw new Error(\n \"This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />.\",\n );\n return context;\n};\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { ContentPartState } from \"./stores/ContentPart\";\n\nexport type ContentPartContextValue = {\n useContentPart: UseBoundStore<StoreApi<ContentPartState>>;\n};\n\nexport const ContentPartContext = createContext<ContentPartContextValue | null>(\n null,\n);\n\nexport const useContentPartContext = (): ContentPartContextValue => {\n const context = useContext(ContentPartContext);\n if (!context)\n throw new Error(\n \"This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >.\",\n );\n return context;\n};\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useAssistantContext } from \"../context/AssistantContext\";\n\nexport const useAssistantInstructions = (instruction: string) => {\n const { useModelConfig } = useAssistantContext();\n const addContextProvider = useModelConfig(\n (s) => s.registerModelConfigProvider,\n );\n useEffect(\n () =>\n addContextProvider(() => {\n return {\n system: instruction,\n };\n }),\n [addContextProvider, instruction],\n );\n};\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/experimental.ts","../src/context/AssistantContext.ts","../src/context/ThreadContext.ts","../src/context/ComposerContext.ts","../src/context/MessageContext.ts","../src/context/ContentPartContext.ts","../src/model-config/useAssistantInstructions.tsx"],"sourcesContent":["export type {\n ImageContentPart,\n ToolCallContentPart,\n UIContentPart,\n} from \"./utils/AssistantTypes\";\n\nexport type { ModelConfigProvider } from \"./utils/ModelConfigTypes\";\n\nexport * from \"./context\";\nexport { useAssistantInstructions } from \"./model-config/useAssistantInstructions\";\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { AssistantModelConfigState } from \"./stores/AssistantModelConfig\";\n\nexport type AssistantContextValue = {\n useModelConfig: UseBoundStore<StoreApi<AssistantModelConfigState>>;\n};\n\nexport const AssistantContext = createContext<AssistantContextValue | null>(\n null,\n);\n\nexport const useAssistantContext = (): AssistantContextValue => {\n const context = useContext(AssistantContext);\n if (!context)\n throw new Error(\n \"This component must be used within an AssistantRuntimeProvider.\",\n );\n return context;\n};\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { ComposerState } from \"./stores/Composer\";\nimport type { ThreadState } from \"./stores/Thread\";\nimport type { ThreadViewportState } from \"./stores/ThreadViewport\";\n\nexport type ThreadContextValue = {\n useThread: UseBoundStore<StoreApi<ThreadState>>;\n useComposer: UseBoundStore<StoreApi<ComposerState>>;\n useViewport: UseBoundStore<StoreApi<ThreadViewportState>>;\n};\n\nexport const ThreadContext = createContext<ThreadContextValue | null>(null);\n\nexport const useThreadContext = (): ThreadContextValue => {\n const context = useContext(ThreadContext);\n if (!context)\n throw new Error(\"This component must be used within an AssistantRuntimeProvider.\");\n return context;\n};\n","import { useContext, useMemo } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport { MessageContext } from \"./MessageContext\";\nimport { useThreadContext } from \"./ThreadContext\";\nimport type { ComposerState } from \"./stores/Composer\";\nimport type { EditComposerState } from \"./stores/MessageComposer\";\n\nexport type ComposerContextValue = {\n useComposer: UseBoundStore<StoreApi<EditComposerState | ComposerState>>;\n type: \"edit\" | \"new\";\n};\n\nexport const useComposerContext = (): ComposerContextValue => {\n const { useComposer } = useThreadContext();\n const { useComposer: useEditComposer } = useContext(MessageContext) ?? {};\n return useMemo(\n () => ({\n useComposer: (useEditComposer ?? useComposer) as UseBoundStore<\n StoreApi<EditComposerState | ComposerState>\n >,\n type: useEditComposer ? (\"edit\" as const) : (\"new\" as const),\n }),\n [useEditComposer, useComposer],\n );\n};\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { MessageState } from \"./stores/Message\";\nimport type { EditComposerState } from \"./stores/MessageComposer\";\n\nexport type MessageContextValue = {\n useMessage: UseBoundStore<StoreApi<MessageState>>;\n useComposer: UseBoundStore<StoreApi<EditComposerState>>;\n};\n\nexport const MessageContext = createContext<MessageContextValue | null>(null);\n\nexport const useMessageContext = () => {\n const context = useContext(MessageContext);\n if (!context)\n throw new Error(\n \"This component can only be used inside a component passed to <ThreadPrimitive.Messages components={...} />.\",\n );\n return context;\n};\n","import { createContext, useContext } from \"react\";\nimport type { StoreApi, UseBoundStore } from \"zustand\";\nimport type { ContentPartState } from \"./stores/ContentPart\";\n\nexport type ContentPartContextValue = {\n useContentPart: UseBoundStore<StoreApi<ContentPartState>>;\n};\n\nexport const ContentPartContext = createContext<ContentPartContextValue | null>(\n null,\n);\n\nexport const useContentPartContext = (): ContentPartContextValue => {\n const context = useContext(ContentPartContext);\n if (!context)\n throw new Error(\n \"This component can only be used inside a component passed to <MessagePrimitive.Content components={...} >.\",\n );\n return context;\n};\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useAssistantContext } from \"../context/AssistantContext\";\n\nexport const useAssistantInstructions = (instruction: string) => {\n const { useModelConfig } = useAssistantContext();\n const addContextProvider = useModelConfig(\n (s) => s.registerModelConfigProvider,\n );\n useEffect(\n () =>\n addContextProvider(() => {\n return {\n system: instruction,\n };\n }),\n [addContextProvider, instruction],\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA0C;AAQnC,IAAM,uBAAmB;AAAA,EAC9B;AACF;AAEO,IAAM,sBAAsB,MAA6B;AAC9D,QAAM,cAAU,yBAAW,gBAAgB;AAC3C,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO;AACT;;;ACnBA,IAAAA,gBAA0C;AAYnC,IAAM,oBAAgB,6BAAyC,IAAI;AAEnE,IAAM,mBAAmB,MAA0B;AACxD,QAAM,cAAU,0BAAW,aAAa;AACxC,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,iEAAiE;AACnF,SAAO;AACT;;;ACnBA,IAAAC,gBAAoC;;;ACApC,IAAAC,gBAA0C;AAUnC,IAAM,qBAAiB,6BAA0C,IAAI;AAErE,IAAM,oBAAoB,MAAM;AACrC,QAAM,cAAU,0BAAW,cAAc;AACzC,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO;AACT;;;ADPO,IAAM,qBAAqB,MAA4B;AAC5D,QAAM,EAAE,YAAY,IAAI,iBAAiB;AACzC,QAAM,EAAE,aAAa,gBAAgB,QAAI,0BAAW,cAAc,KAAK,CAAC;AACxE,aAAO;AAAA,IACL,OAAO;AAAA,MACL,aAAc,mBAAmB;AAAA,MAGjC,MAAM,kBAAmB,SAAoB;AAAA,IAC/C;AAAA,IACA,CAAC,iBAAiB,WAAW;AAAA,EAC/B;AACF;;;AExBA,IAAAC,gBAA0C;AAQnC,IAAM,yBAAqB;AAAA,EAChC;AACF;AAEO,IAAM,wBAAwB,MAA+B;AAClE,QAAM,cAAU,0BAAW,kBAAkB;AAC7C,MAAI,CAAC;AACH,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AACF,SAAO;AACT;;;ACjBA,IAAAC,gBAA0B;AAGnB,IAAM,2BAA2B,CAAC,gBAAwB;AAC/D,QAAM,EAAE,eAAe,IAAI,oBAAoB;AAC/C,QAAM,qBAAqB;AAAA,IACzB,CAAC,MAAM,EAAE;AAAA,EACX;AACA;AAAA,IACE,MACE,mBAAmB,MAAM;AACvB,aAAO;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH,CAAC,oBAAoB,WAAW;AAAA,EAClC;AACF;","names":["import_react","import_react","import_react","import_react","import_react"]}
@@ -4,117 +4,7 @@ import {
4
4
  useContentPartContext,
5
5
  useMessageContext,
6
6
  useThreadContext
7
- } from "./chunk-CY4TTHR7.mjs";
8
- import {
9
- MessageRepository,
10
- generateId
11
- } from "./chunk-GQKH2ADD.mjs";
12
- import {
13
- mergeModelConfigs
14
- } from "./chunk-X4HBDEFP.mjs";
15
-
16
- // src/runtime/local/useLocalRuntime.tsx
17
- import { useInsertionEffect, useState } from "react";
18
-
19
- // src/runtime/local/LocalRuntime.tsx
20
- var LocalRuntime = class {
21
- constructor(adapter) {
22
- this.adapter = adapter;
23
- }
24
- _subscriptions = /* @__PURE__ */ new Set();
25
- _configProviders = /* @__PURE__ */ new Set();
26
- abortController = null;
27
- repository = new MessageRepository();
28
- get messages() {
29
- return this.repository.getMessages();
30
- }
31
- get isRunning() {
32
- return this.abortController != null;
33
- }
34
- getBranches(messageId) {
35
- return this.repository.getBranches(messageId);
36
- }
37
- switchToBranch(branchId) {
38
- this.repository.switchToBranch(branchId);
39
- this.notifySubscribers();
40
- }
41
- async append(message) {
42
- const userMessageId = generateId();
43
- const userMessage = {
44
- id: userMessageId,
45
- role: "user",
46
- content: message.content,
47
- createdAt: /* @__PURE__ */ new Date()
48
- };
49
- this.repository.addOrUpdateMessage(message.parentId, userMessage);
50
- await this.startRun(userMessageId);
51
- }
52
- async startRun(parentId) {
53
- const id = generateId();
54
- this.repository.resetHead(parentId);
55
- const messages = this.repository.getMessages();
56
- const message = {
57
- id,
58
- role: "assistant",
59
- status: "in_progress",
60
- content: [{ type: "text", text: "" }],
61
- createdAt: /* @__PURE__ */ new Date()
62
- };
63
- this.repository.addOrUpdateMessage(parentId, { ...message });
64
- this.abortController?.abort();
65
- this.abortController = new AbortController();
66
- this.notifySubscribers();
67
- try {
68
- const updateHandler = ({ content }) => {
69
- message.content = content;
70
- this.repository.addOrUpdateMessage(parentId, { ...message });
71
- this.notifySubscribers();
72
- };
73
- const result = await this.adapter.run({
74
- messages,
75
- abortSignal: this.abortController.signal,
76
- config: mergeModelConfigs([...this._configProviders].map((p) => p())),
77
- onUpdate: updateHandler
78
- });
79
- updateHandler(result);
80
- message.status = "done";
81
- this.repository.addOrUpdateMessage(parentId, { ...message });
82
- } catch (e) {
83
- message.status = "error";
84
- this.repository.addOrUpdateMessage(parentId, { ...message });
85
- console.error(e);
86
- } finally {
87
- this.abortController = null;
88
- this.notifySubscribers();
89
- }
90
- }
91
- cancelRun() {
92
- if (!this.abortController) return;
93
- this.abortController.abort();
94
- this.abortController = null;
95
- this.notifySubscribers();
96
- }
97
- notifySubscribers() {
98
- for (const callback of this._subscriptions) callback();
99
- }
100
- subscribe(callback) {
101
- this._subscriptions.add(callback);
102
- return () => this._subscriptions.delete(callback);
103
- }
104
- registerModelConfigProvider(provider) {
105
- this._configProviders.add(provider);
106
- return () => this._configProviders.delete(provider);
107
- }
108
- };
109
-
110
- // src/runtime/local/useLocalRuntime.tsx
111
- var useLocalRuntime = (adapter) => {
112
- const [runtime] = useState(() => new LocalRuntime(adapter));
113
- useInsertionEffect(() => {
114
- runtime.adapter = adapter;
115
- });
116
- return runtime;
117
- };
7
+ } from "./chunk-SCWPIDP6.mjs";
118
8
 
119
9
  // src/model-config/useAssistantInstructions.tsx
120
10
  import { useEffect } from "react";
@@ -137,7 +27,6 @@ export {
137
27
  useAssistantInstructions,
138
28
  useComposerContext,
139
29
  useContentPartContext,
140
- useLocalRuntime,
141
30
  useMessageContext,
142
31
  useThreadContext
143
32
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/local/useLocalRuntime.tsx","../src/runtime/local/LocalRuntime.tsx","../src/model-config/useAssistantInstructions.tsx"],"sourcesContent":["\"use client\";\n\nimport { useInsertionEffect, useState } from \"react\";\nimport type { ChatModelAdapter } from \"./ChatModelAdapter\";\nimport { LocalRuntime } from \"./LocalRuntime\";\n\nexport const useLocalRuntime = (adapter: ChatModelAdapter) => {\n const [runtime] = useState(() => new LocalRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n\n return runtime;\n};\n","import type {\n AppendMessage,\n AssistantMessage,\n UserMessage,\n} from \"../../utils/AssistantTypes\";\nimport {\n type ModelConfigProvider,\n mergeModelConfigs,\n} from \"../../utils/ModelConfigTypes\";\nimport type { Unsubscribe } from \"../../utils/Unsubscribe\";\nimport type { AssistantRuntime } from \"../core/AssistantRuntime\";\nimport { MessageRepository } from \"../utils/MessageRepository\";\nimport { generateId } from \"../utils/idUtils\";\nimport type { ChatModelAdapter, ChatModelRunResult } from \"./ChatModelAdapter\";\n\nexport class LocalRuntime implements AssistantRuntime {\n private _subscriptions = new Set<() => void>();\n private _configProviders = new Set<ModelConfigProvider>();\n\n private abortController: AbortController | null = null;\n private repository = new MessageRepository();\n\n public get messages() {\n return this.repository.getMessages();\n }\n public get isRunning() {\n return this.abortController != null;\n }\n\n constructor(public adapter: ChatModelAdapter) {}\n\n public getBranches(messageId: string): string[] {\n return this.repository.getBranches(messageId);\n }\n\n public switchToBranch(branchId: string): void {\n this.repository.switchToBranch(branchId);\n this.notifySubscribers();\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n const userMessageId = generateId();\n const userMessage: UserMessage = {\n id: userMessageId,\n role: \"user\",\n content: message.content,\n createdAt: new Date(),\n };\n this.repository.addOrUpdateMessage(message.parentId, userMessage);\n\n await this.startRun(userMessageId);\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const id = generateId();\n\n this.repository.resetHead(parentId);\n const messages = this.repository.getMessages();\n\n // add assistant message\n const message: AssistantMessage = {\n id,\n role: \"assistant\",\n status: \"in_progress\",\n content: [{ type: \"text\", text: \"\" }],\n createdAt: new Date(),\n };\n this.repository.addOrUpdateMessage(parentId, { ...message });\n\n // abort existing run\n this.abortController?.abort();\n this.abortController = new AbortController();\n\n this.notifySubscribers();\n\n try {\n const updateHandler = ({ content }: ChatModelRunResult) => {\n message.content = content;\n this.repository.addOrUpdateMessage(parentId, { ...message });\n this.notifySubscribers();\n };\n const result = await this.adapter.run({\n messages,\n abortSignal: this.abortController.signal,\n config: mergeModelConfigs([...this._configProviders].map((p) => p())),\n onUpdate: updateHandler,\n });\n updateHandler(result);\n\n message.status = \"done\";\n this.repository.addOrUpdateMessage(parentId, { ...message });\n } catch (e) {\n message.status = \"error\";\n this.repository.addOrUpdateMessage(parentId, { ...message });\n console.error(e);\n } finally {\n this.abortController = null;\n this.notifySubscribers();\n }\n }\n\n cancelRun(): void {\n if (!this.abortController) return;\n\n this.abortController.abort();\n this.abortController = null;\n this.notifySubscribers();\n }\n\n private notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n registerModelConfigProvider(provider: ModelConfigProvider) {\n this._configProviders.add(provider);\n return () => this._configProviders.delete(provider);\n }\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useAssistantContext } from \"../context/AssistantContext\";\n\nexport const useAssistantInstructions = (instruction: string) => {\n const { useModelConfig } = useAssistantContext();\n const addContextProvider = useModelConfig(\n (s) => s.registerModelConfigProvider,\n );\n useEffect(\n () =>\n addContextProvider(() => {\n return {\n system: instruction,\n };\n }),\n [addContextProvider, instruction],\n );\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/model-config/useAssistantInstructions.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useAssistantContext } from \"../context/AssistantContext\";\n\nexport const useAssistantInstructions = (instruction: string) => {\n const { useModelConfig } = useAssistantContext();\n const addContextProvider = useModelConfig(\n (s) => s.registerModelConfigProvider,\n );\n useEffect(\n () =>\n addContextProvider(() => {\n return {\n system: instruction,\n };\n }),\n [addContextProvider, instruction],\n );\n};\n"],"mappings":";;;;;;;;;AAEA,SAAS,iBAAiB;AAGnB,IAAM,2BAA2B,CAAC,gBAAwB;AAC/D,QAAM,EAAE,eAAe,IAAI,oBAAoB;AAC/C,QAAM,qBAAqB;AAAA,IACzB,CAAC,MAAM,EAAE;AAAA,EACX;AACA;AAAA,IACE,MACE,mBAAmB,MAAM;AACvB,aAAO;AAAA,QACL,QAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,IACH,CAAC,oBAAoB,WAAW;AAAA,EAClC;AACF;","names":[]}
package/dist/index.d.mts CHANGED
@@ -1,10 +1,8 @@
1
1
  import * as react from 'react';
2
2
  import { FC, ReactNode, PropsWithChildren, ComponentType } from 'react';
3
3
  import { TextareaAutosizeProps } from 'react-textarea-autosize';
4
- import { T as TextContentPart, I as ImageContentPart, U as UIContentPart, a as ToolCallContentPart } from './ModelConfigTypes-B9UY4zxv.mjs';
5
- export { g as AppendContentPart, d as AppendMessage, e as AssistantContentPart, A as AssistantMessage, b as ThreadMessage, f as UserContentPart, c as UserMessage } from './ModelConfigTypes-B9UY4zxv.mjs';
6
- import { T as ThreadRuntime, A as AssistantRuntime } from './AssistantRuntime-CBMSAJqH.mjs';
7
- export { U as Unsubscribe } from './AssistantRuntime-CBMSAJqH.mjs';
4
+ import { T as TextContentPart, I as ImageContentPart, U as UIContentPart, a as ToolCallContentPart, b as ThreadState, c as Unsubscribe, M as ModelConfigProvider, d as ThreadMessage, e as ModelConfig, A as AssistantContentPart, f as AppendMessage } from './Thread-By2aBNAG.mjs';
5
+ export { j as AppendContentPart, g as AssistantMessage, i as UserContentPart, h as UserMessage } from './Thread-By2aBNAG.mjs';
8
6
  import 'zod';
9
7
 
10
8
  declare const useCopyMessage: ({ copiedDuration }: {
@@ -236,13 +234,83 @@ declare namespace index {
236
234
  export { ContentPartInProgressIndicator as InProgressIndicator };
237
235
  }
238
236
 
237
+ type ThreadRuntime = Readonly<ThreadState & {
238
+ subscribe: (callback: () => void) => Unsubscribe;
239
+ }>;
240
+
241
+ type AssistantRuntime = ThreadRuntime & {
242
+ registerModelConfigProvider: (provider: ModelConfigProvider) => Unsubscribe;
243
+ };
244
+
239
245
  type ReactThreadRuntime = ThreadRuntime & {
240
246
  unstable_synchronizer?: ComponentType;
241
247
  };
242
248
 
249
+ type ChatModelRunResult = {
250
+ content: AssistantContentPart[];
251
+ };
252
+ type ChatModelRunOptions = {
253
+ messages: ThreadMessage[];
254
+ abortSignal: AbortSignal;
255
+ config: ModelConfig;
256
+ onUpdate: (result: ChatModelRunResult) => void;
257
+ };
258
+ type ChatModelAdapter = {
259
+ run: (options: ChatModelRunOptions) => Promise<ChatModelRunResult>;
260
+ };
261
+
262
+ declare class LocalRuntime implements AssistantRuntime {
263
+ adapter: ChatModelAdapter;
264
+ private _subscriptions;
265
+ private _configProviders;
266
+ private abortController;
267
+ private repository;
268
+ get messages(): ThreadMessage[];
269
+ get isRunning(): boolean;
270
+ constructor(adapter: ChatModelAdapter);
271
+ getBranches(messageId: string): string[];
272
+ switchToBranch(branchId: string): void;
273
+ append(message: AppendMessage): Promise<void>;
274
+ startRun(parentId: string | null): Promise<void>;
275
+ cancelRun(): void;
276
+ private notifySubscribers;
277
+ subscribe(callback: () => void): Unsubscribe;
278
+ registerModelConfigProvider(provider: ModelConfigProvider): () => boolean;
279
+ }
280
+
281
+ declare const useLocalRuntime: (adapter: ChatModelAdapter) => LocalRuntime;
282
+
243
283
  type AssistantRuntimeProviderProps = {
244
284
  runtime: AssistantRuntime;
245
285
  };
246
286
  declare const AssistantRuntimeProvider: react.NamedExoticComponent<PropsWithChildren<AssistantRuntimeProviderProps>>;
247
287
 
248
- export { index$1 as ActionBarPrimitive, AssistantRuntime, AssistantRuntimeProvider, index$2 as BranchPickerPrimitive, index$4 as ComposerPrimitive, index as ContentPartPrimitive, index$3 as MessagePrimitive, type ReactThreadRuntime, TextContentPart, index$5 as ThreadPrimitive, ThreadRuntime, useBeginMessageEdit, useCopyMessage, useGoToNextBranch, useGoToPreviousBranch, useReloadMessage };
288
+ declare class ProxyConfigProvider {
289
+ private _providers;
290
+ getModelConfig(): ModelConfig;
291
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
292
+ }
293
+
294
+ declare class MessageRepository {
295
+ private messages;
296
+ private head;
297
+ private root;
298
+ private performOp;
299
+ getMessages(): ThreadMessage[];
300
+ addOrUpdateMessage(parentId: string | null, message: ThreadMessage): void;
301
+ appendOptimisticMessage(parentId: string | null, message: Omit<ThreadMessage, "id" | "createdAt">): string;
302
+ deleteMessage(messageId: string, replacementId?: string | null | undefined): void;
303
+ getBranches(messageId: string): string[];
304
+ switchToBranch(messageId: string): void;
305
+ resetHead(messageId: string | null): void;
306
+ }
307
+
308
+ type internal_MessageRepository = MessageRepository;
309
+ declare const internal_MessageRepository: typeof MessageRepository;
310
+ type internal_ProxyConfigProvider = ProxyConfigProvider;
311
+ declare const internal_ProxyConfigProvider: typeof ProxyConfigProvider;
312
+ declare namespace internal {
313
+ export { internal_MessageRepository as MessageRepository, internal_ProxyConfigProvider as ProxyConfigProvider };
314
+ }
315
+
316
+ export { index$1 as ActionBarPrimitive, AppendMessage, AssistantContentPart, type AssistantRuntime, AssistantRuntimeProvider, index$2 as BranchPickerPrimitive, type ChatModelAdapter, type ChatModelRunOptions, index$4 as ComposerPrimitive, index as ContentPartPrimitive, internal as INTERNAL, index$3 as MessagePrimitive, type ReactThreadRuntime, TextContentPart, ThreadMessage, index$5 as ThreadPrimitive, type ThreadRuntime, Unsubscribe, useBeginMessageEdit, useCopyMessage, useGoToNextBranch, useGoToPreviousBranch, useLocalRuntime, useReloadMessage };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,8 @@
1
1
  import * as react from 'react';
2
2
  import { FC, ReactNode, PropsWithChildren, ComponentType } from 'react';
3
3
  import { TextareaAutosizeProps } from 'react-textarea-autosize';
4
- import { T as TextContentPart, I as ImageContentPart, U as UIContentPart, a as ToolCallContentPart } from './ModelConfigTypes-B9UY4zxv.js';
5
- export { g as AppendContentPart, d as AppendMessage, e as AssistantContentPart, A as AssistantMessage, b as ThreadMessage, f as UserContentPart, c as UserMessage } from './ModelConfigTypes-B9UY4zxv.js';
6
- import { T as ThreadRuntime, A as AssistantRuntime } from './AssistantRuntime-C_BvM7ZT.js';
7
- export { U as Unsubscribe } from './AssistantRuntime-C_BvM7ZT.js';
4
+ import { T as TextContentPart, I as ImageContentPart, U as UIContentPart, a as ToolCallContentPart, b as ThreadState, c as Unsubscribe, M as ModelConfigProvider, d as ThreadMessage, e as ModelConfig, A as AssistantContentPart, f as AppendMessage } from './Thread-By2aBNAG.js';
5
+ export { j as AppendContentPart, g as AssistantMessage, i as UserContentPart, h as UserMessage } from './Thread-By2aBNAG.js';
8
6
  import 'zod';
9
7
 
10
8
  declare const useCopyMessage: ({ copiedDuration }: {
@@ -236,13 +234,83 @@ declare namespace index {
236
234
  export { ContentPartInProgressIndicator as InProgressIndicator };
237
235
  }
238
236
 
237
+ type ThreadRuntime = Readonly<ThreadState & {
238
+ subscribe: (callback: () => void) => Unsubscribe;
239
+ }>;
240
+
241
+ type AssistantRuntime = ThreadRuntime & {
242
+ registerModelConfigProvider: (provider: ModelConfigProvider) => Unsubscribe;
243
+ };
244
+
239
245
  type ReactThreadRuntime = ThreadRuntime & {
240
246
  unstable_synchronizer?: ComponentType;
241
247
  };
242
248
 
249
+ type ChatModelRunResult = {
250
+ content: AssistantContentPart[];
251
+ };
252
+ type ChatModelRunOptions = {
253
+ messages: ThreadMessage[];
254
+ abortSignal: AbortSignal;
255
+ config: ModelConfig;
256
+ onUpdate: (result: ChatModelRunResult) => void;
257
+ };
258
+ type ChatModelAdapter = {
259
+ run: (options: ChatModelRunOptions) => Promise<ChatModelRunResult>;
260
+ };
261
+
262
+ declare class LocalRuntime implements AssistantRuntime {
263
+ adapter: ChatModelAdapter;
264
+ private _subscriptions;
265
+ private _configProviders;
266
+ private abortController;
267
+ private repository;
268
+ get messages(): ThreadMessage[];
269
+ get isRunning(): boolean;
270
+ constructor(adapter: ChatModelAdapter);
271
+ getBranches(messageId: string): string[];
272
+ switchToBranch(branchId: string): void;
273
+ append(message: AppendMessage): Promise<void>;
274
+ startRun(parentId: string | null): Promise<void>;
275
+ cancelRun(): void;
276
+ private notifySubscribers;
277
+ subscribe(callback: () => void): Unsubscribe;
278
+ registerModelConfigProvider(provider: ModelConfigProvider): () => boolean;
279
+ }
280
+
281
+ declare const useLocalRuntime: (adapter: ChatModelAdapter) => LocalRuntime;
282
+
243
283
  type AssistantRuntimeProviderProps = {
244
284
  runtime: AssistantRuntime;
245
285
  };
246
286
  declare const AssistantRuntimeProvider: react.NamedExoticComponent<PropsWithChildren<AssistantRuntimeProviderProps>>;
247
287
 
248
- export { index$1 as ActionBarPrimitive, AssistantRuntime, AssistantRuntimeProvider, index$2 as BranchPickerPrimitive, index$4 as ComposerPrimitive, index as ContentPartPrimitive, index$3 as MessagePrimitive, type ReactThreadRuntime, TextContentPart, index$5 as ThreadPrimitive, ThreadRuntime, useBeginMessageEdit, useCopyMessage, useGoToNextBranch, useGoToPreviousBranch, useReloadMessage };
288
+ declare class ProxyConfigProvider {
289
+ private _providers;
290
+ getModelConfig(): ModelConfig;
291
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
292
+ }
293
+
294
+ declare class MessageRepository {
295
+ private messages;
296
+ private head;
297
+ private root;
298
+ private performOp;
299
+ getMessages(): ThreadMessage[];
300
+ addOrUpdateMessage(parentId: string | null, message: ThreadMessage): void;
301
+ appendOptimisticMessage(parentId: string | null, message: Omit<ThreadMessage, "id" | "createdAt">): string;
302
+ deleteMessage(messageId: string, replacementId?: string | null | undefined): void;
303
+ getBranches(messageId: string): string[];
304
+ switchToBranch(messageId: string): void;
305
+ resetHead(messageId: string | null): void;
306
+ }
307
+
308
+ type internal_MessageRepository = MessageRepository;
309
+ declare const internal_MessageRepository: typeof MessageRepository;
310
+ type internal_ProxyConfigProvider = ProxyConfigProvider;
311
+ declare const internal_ProxyConfigProvider: typeof ProxyConfigProvider;
312
+ declare namespace internal {
313
+ export { internal_MessageRepository as MessageRepository, internal_ProxyConfigProvider as ProxyConfigProvider };
314
+ }
315
+
316
+ export { index$1 as ActionBarPrimitive, AppendMessage, AssistantContentPart, type AssistantRuntime, AssistantRuntimeProvider, index$2 as BranchPickerPrimitive, type ChatModelAdapter, type ChatModelRunOptions, index$4 as ComposerPrimitive, index as ContentPartPrimitive, internal as INTERNAL, index$3 as MessagePrimitive, type ReactThreadRuntime, TextContentPart, ThreadMessage, index$5 as ThreadPrimitive, type ThreadRuntime, Unsubscribe, useBeginMessageEdit, useCopyMessage, useGoToNextBranch, useGoToPreviousBranch, useLocalRuntime, useReloadMessage };