@assistant-ui/react 0.0.29 → 0.1.0

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/AssistantRuntime-BM_jVV3g.d.mts +23 -0
  2. package/dist/AssistantRuntime-CBMSAJqH.d.mts +23 -0
  3. package/dist/AssistantRuntime-C_BvM7ZT.d.ts +23 -0
  4. package/dist/AssistantRuntime-DELpXWfG.d.ts +23 -0
  5. package/dist/ModelConfigTypes-B9UY4zxv.d.mts +55 -0
  6. package/dist/ModelConfigTypes-B9UY4zxv.d.ts +55 -0
  7. package/dist/ModelConfigTypes-BF5HxVrH.d.mts +55 -0
  8. package/dist/ModelConfigTypes-BF5HxVrH.d.ts +55 -0
  9. package/dist/ModelConfigTypes-Cf3yjaDu.d.mts +55 -0
  10. package/dist/ModelConfigTypes-Cf3yjaDu.d.ts +55 -0
  11. package/dist/chunk-3XZUKECF.mjs +207 -0
  12. package/dist/chunk-3XZUKECF.mjs.map +1 -0
  13. package/dist/chunk-4DQ2CIAD.mjs +69 -0
  14. package/dist/chunk-4DQ2CIAD.mjs.map +1 -0
  15. package/dist/chunk-5YONSDN4.mjs +200 -0
  16. package/dist/chunk-5YONSDN4.mjs.map +1 -0
  17. package/dist/chunk-CY4TTHR7.mjs +76 -0
  18. package/dist/chunk-CY4TTHR7.mjs.map +1 -0
  19. package/dist/chunk-DKAWDNW5.mjs +22 -0
  20. package/dist/chunk-DKAWDNW5.mjs.map +1 -0
  21. package/dist/chunk-GQKH2ADD.mjs +165 -0
  22. package/dist/chunk-GQKH2ADD.mjs.map +1 -0
  23. package/dist/chunk-J5LGTIGS.mjs +10 -0
  24. package/dist/chunk-J5LGTIGS.mjs.map +1 -0
  25. package/dist/chunk-X4HBDEFP.mjs +30 -0
  26. package/dist/chunk-X4HBDEFP.mjs.map +1 -0
  27. package/dist/experimental.d.mts +120 -0
  28. package/dist/experimental.d.ts +120 -0
  29. package/dist/experimental.js +407 -0
  30. package/dist/experimental.js.map +1 -0
  31. package/dist/experimental.mjs +144 -0
  32. package/dist/experimental.mjs.map +1 -0
  33. package/dist/index.d.mts +6 -266
  34. package/dist/index.d.ts +6 -266
  35. package/dist/index.js +77 -730
  36. package/dist/index.js.map +1 -1
  37. package/dist/index.mjs +62 -786
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/internal-dlLjX30u.d.mts +75 -0
  40. package/dist/internal-dlLjX30u.d.ts +75 -0
  41. package/dist/internal.d.mts +25 -0
  42. package/dist/internal.d.ts +25 -0
  43. package/dist/internal.js +225 -0
  44. package/dist/internal.js.map +1 -0
  45. package/dist/internal.mjs +12 -0
  46. package/dist/internal.mjs.map +1 -0
  47. package/package.json +23 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/actions/useCopyMessage.tsx","../src/context/MessageContext.ts","../src/utils/combined/useCombinedStore.ts","../src/utils/combined/createCombinedStore.ts","../src/utils/getMessageText.tsx","../src/actions/useReloadMessage.tsx","../src/context/ThreadContext.ts","../src/actions/useBeginMessageEdit.tsx","../src/actions/useGoToNextBranch.tsx","../src/actions/useGoToPreviousBranch.tsx","../src/primitives/thread/index.ts","../src/primitives/thread/ThreadRoot.tsx","../src/primitives/thread/ThreadIf.tsx","../src/primitives/thread/ThreadEmpty.tsx","../src/primitives/thread/ThreadViewport.tsx","../src/utils/hooks/useOnResizeContent.tsx","../src/utils/hooks/useOnScrollToBottom.tsx","../src/context/providers/MessageProvider.tsx","../src/context/stores/MessageComposer.ts","../src/context/stores/BaseComposer.ts","../src/context/ComposerContext.ts","../src/primitives/composer/ComposerIf.tsx","../src/primitives/message/MessageIf.tsx","../src/primitives/thread/ThreadMessages.tsx","../src/primitives/thread/ThreadScrollToBottom.tsx","../src/primitives/thread/ThreadSuggestion.tsx","../src/primitives/composer/index.ts","../src/primitives/composer/ComposerRoot.tsx","../src/primitives/composer/ComposerInput.tsx","../src/primitives/composer/ComposerSend.tsx","../src/primitives/composer/ComposerCancel.tsx","../src/primitives/message/index.ts","../src/primitives/message/MessageRoot.tsx","../src/context/providers/ContentPartProvider.tsx","../src/context/ContentPartContext.ts","../src/primitives/contentPart/ContentPartInProgressIndicator.tsx","../src/primitives/message/MessageContent.tsx","../src/primitives/message/MessageInProgress.tsx","../src/primitives/branchPicker/index.ts","../src/utils/createActionButton.tsx","../src/primitives/branchPicker/BranchPickerNext.tsx","../src/primitives/branchPicker/BranchPickerPrevious.tsx","../src/primitives/branchPicker/BranchPickerCount.tsx","../src/primitives/branchPicker/BranchPickerNumber.tsx","../src/primitives/branchPicker/BranchPickerRoot.tsx","../src/primitives/actionBar/index.ts","../src/primitives/actionBar/ActionBarRoot.tsx","../src/primitives/actionBar/ActionBarCopy.tsx","../src/primitives/actionBar/ActionBarReload.tsx","../src/primitives/actionBar/ActionBarEdit.tsx","../src/primitives/contentPart/index.ts","../../react-ai-sdk/src/rsc/useVercelRSCRuntime.tsx","../../react-ai-sdk/src/rsc/VercelRSCRuntime.tsx","../../react-ai-sdk/src/rsc/useVercelRSCSync.tsx","../../react-ai-sdk/src/utils/ThreadMessageConverter.ts","../../react-ai-sdk/src/rsc/getVercelRSCMessage.tsx","../../react-ai-sdk/src/ui/use-chat/useVercelUseChatRuntime.tsx","../../react-ai-sdk/src/ui/VercelAIRuntime.tsx","../../react-ai-sdk/src/ui/getVercelAIMessage.tsx","../../react-ai-sdk/src/ui/utils/sliceMessagesUntil.tsx","../../react-ai-sdk/src/ui/utils/useVercelAIComposerSync.tsx","../../react-ai-sdk/src/ui/utils/useVercelAIThreadSync.tsx","../../react-ai-sdk/src/ui/use-assistant/useVercelUseAssistantRuntime.tsx","../src/runtime/utils/idUtils.tsx","../src/runtime/utils/MessageRepository.tsx","../src/context/providers/AssistantRuntimeProvider.tsx","../src/context/providers/ThreadProvider.tsx","../src/context/stores/Composer.ts","../src/context/stores/Thread.ts","../src/context/stores/ThreadViewport.tsx","../src/runtime/vercel-deprecated/VercelAIAssistantProvider.tsx","../src/runtime/vercel-deprecated/VercelRSCAssistantProvider.tsx","../src/runtime/local/useLocalRuntime.tsx","../src/runtime/local/LocalRuntime.tsx"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\nimport { getMessageText } from \"../utils/getMessageText\";\n\nexport const useCopyMessage = ({ copiedDuration = 3000 }) => {\n const { useMessage, useComposer } = useMessageContext();\n\n const hasCopyableContent = useCombinedStore(\n [useMessage, useComposer],\n (m, c) => {\n return c.isEditing || m.message.content.some((c) => c.type === \"text\");\n },\n );\n\n const callback = useCallback(() => {\n const { isEditing, value: composerValue } = useComposer.getState();\n const { message, setIsCopied } = useMessage.getState();\n\n const valueToCopy = isEditing ? composerValue : getMessageText(message);\n\n navigator.clipboard.writeText(valueToCopy);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n }, [useComposer, useMessage, copiedDuration]);\n\n if (!hasCopyableContent) return null;\n return callback;\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","\"use client\";\nimport { useMemo } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport {\n type CombinedSelector,\n createCombinedStore,\n} from \"./createCombinedStore\";\n\nexport const useCombinedStore = <T extends Array<unknown>, R>(\n stores: { [K in keyof T]: StoreApi<T[K]> },\n selector: CombinedSelector<T, R>,\n): R => {\n // biome-ignore lint/correctness/useExhaustiveDependencies: shallow-compare the store array\n const useCombined = useMemo(() => createCombinedStore<T, R>(stores), stores);\n return useCombined(selector);\n};\n","import { useSyncExternalStore } from \"react\";\nimport type { StoreApi } from \"zustand\";\n\nexport type CombinedSelector<T extends Array<unknown>, R> = (...args: T) => R;\n\nexport const createCombinedStore = <T extends Array<unknown>, R>(\n stores: { [K in keyof T]: StoreApi<T[K]> },\n) => {\n const subscribe = (callback: () => void): (() => void) => {\n const unsubscribes = stores.map((store) => store.subscribe(callback));\n return () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n };\n\n return (selector: CombinedSelector<T, R>): R => {\n const getSnapshot = (): R =>\n selector(...(stores.map((store) => store.getState()) as T));\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n };\n};\n","\"use client\";\nimport type { TextContentPart, ThreadMessage } from \"./AssistantTypes\";\n\nexport const getMessageText = (message: ThreadMessage) => {\n const textParts = message.content.filter(\n (part) => part.type === \"text\",\n ) as TextContentPart[];\n\n return textParts.map((part) => part.text).join(\"\\n\\n\");\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useThreadContext } from \"../context/ThreadContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useReloadMessage = () => {\n const { useThread, useViewport } = useThreadContext();\n const { useMessage } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useThread, useMessage],\n (t, m) => t.isRunning || m.message.role !== \"assistant\",\n );\n\n const callback = useCallback(() => {\n const { parentId } = useMessage.getState();\n useThread.getState().startRun(parentId);\n useViewport.getState().scrollToBottom();\n }, [useMessage, useThread, useViewport]);\n\n if (disabled) return null;\n return callback;\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 AssistantProvider.\");\n return context;\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useBeginMessageEdit = () => {\n const { useMessage, useComposer } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useMessage, useComposer],\n (m, c) => m.message.role !== \"user\" || c.isEditing,\n );\n\n const callback = useCallback(() => {\n const { edit } = useComposer.getState();\n edit();\n }, [useComposer]);\n\n if (disabled) return null;\n return callback;\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useThreadContext } from \"../context/ThreadContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useGoToNextBranch = () => {\n const { useThread } = useThreadContext();\n const { useMessage, useComposer } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useMessage, useComposer],\n (m, c) =>\n c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length,\n );\n\n const callback = useCallback(() => {\n const { message, branches } = useMessage.getState();\n useThread\n .getState()\n .switchToBranch(branches[branches.indexOf(message.id) + 1]!);\n }, [useMessage, useThread]);\n\n if (disabled) return null;\n return callback;\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useThreadContext } from \"../context/ThreadContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useGoToPreviousBranch = () => {\n const { useThread } = useThreadContext();\n const { useMessage, useComposer } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useMessage, useComposer],\n (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0,\n );\n\n const callback = useCallback(() => {\n const { message, branches } = useMessage.getState();\n useThread\n .getState()\n .switchToBranch(branches[branches.indexOf(message.id) - 1]!);\n }, [useMessage, useThread]);\n\n if (disabled) return null;\n return callback;\n};\n","export { ThreadRoot as Root } from \"./ThreadRoot\";\nexport { ThreadEmpty as Empty } from \"./ThreadEmpty\";\nexport { ThreadIf as If } from \"./ThreadIf\";\nexport { ThreadViewport as Viewport } from \"./ThreadViewport\";\nexport { ThreadMessages as Messages } from \"./ThreadMessages\";\nexport { ThreadScrollToBottom as ScrollToBottom } from \"./ThreadScrollToBottom\";\nexport { ThreadSuggestion as Suggestion } from \"./ThreadSuggestion\";\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\n\ntype ThreadRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype ThreadRootProps = PrimitiveDivProps;\n\nexport const ThreadRoot = forwardRef<ThreadRootElement, ThreadRootProps>(\n (props, ref) => {\n return <Primitive.div {...props} ref={ref} />;\n },\n);\n","\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport type { RequireAtLeastOne } from \"../../utils/RequireAtLeastOne\";\n\ntype ThreadIfFilters = {\n empty: boolean | undefined;\n running: boolean | undefined;\n};\n\ntype ThreadIfProps = PropsWithChildren<RequireAtLeastOne<ThreadIfFilters>>;\n\nconst useThreadIf = (props: RequireAtLeastOne<ThreadIfFilters>) => {\n const { useThread } = useThreadContext();\n return useThread((thread) => {\n if (props.empty === true && thread.messages.length !== 0) return false;\n if (props.empty === false && thread.messages.length === 0) return false;\n if (props.running === true && !thread.isRunning) return false;\n if (props.running === false && thread.isRunning) return false;\n\n return true;\n });\n};\n\nexport const ThreadIf: FC<ThreadIfProps> = ({ children, ...query }) => {\n const result = useThreadIf(query);\n return result ? children : null;\n};\n","\"use client\";\n\nimport type { FC, ReactNode } from \"react\";\nimport { ThreadIf } from \"./ThreadIf\";\n\ntype ThreadEmptyProps = {\n children: ReactNode;\n};\n\nexport const ThreadEmpty: FC<ThreadEmptyProps> = ({ children }) => {\n return <ThreadIf empty>{children}</ThreadIf>;\n};\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef, useRef } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { useOnResizeContent } from \"../../utils/hooks/useOnResizeContent\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\n\ntype ThreadViewportElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype ThreadViewportProps = PrimitiveDivProps & {\n autoScroll?: boolean;\n};\n\nexport const ThreadViewport = forwardRef<\n ThreadViewportElement,\n ThreadViewportProps\n>(({ autoScroll = true, onScroll, children, ...rest }, forwardedRef) => {\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const divRef = useRef<HTMLDivElement>(null);\n const ref = useComposedRefs(forwardedRef, divRef);\n\n const { useViewport } = useThreadContext();\n\n // TODO find a more elegant implementation for this\n\n const firstRenderRef = useRef(true);\n const isScrollingToBottomRef = useRef(false);\n const lastScrollTop = useRef<number>(0);\n\n const scrollToBottom = () => {\n const div = messagesEndRef.current;\n if (!div || !autoScroll) return;\n\n const behavior = firstRenderRef.current ? \"instant\" : \"auto\";\n firstRenderRef.current = false;\n\n isScrollingToBottomRef.current = true;\n div.scrollIntoView({ behavior });\n };\n\n useOnResizeContent(divRef, () => {\n if (!isScrollingToBottomRef.current && !useViewport.getState().isAtBottom) {\n handleScroll();\n } else {\n scrollToBottom();\n }\n });\n\n useOnScrollToBottom(() => {\n scrollToBottom();\n });\n\n const handleScroll = () => {\n const div = divRef.current;\n if (!div) return;\n\n const isAtBottom = useViewport.getState().isAtBottom;\n const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight;\n\n if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {\n // ignore scroll down\n } else if (newIsAtBottom !== isAtBottom) {\n isScrollingToBottomRef.current = false;\n useViewport.setState({ isAtBottom: newIsAtBottom });\n }\n\n lastScrollTop.current = div.scrollTop;\n };\n\n return (\n <Primitive.div\n {...rest}\n onScroll={composeEventHandlers(onScroll, handleScroll)}\n ref={ref}\n >\n {children}\n <div ref={messagesEndRef} />\n </Primitive.div>\n );\n});\n","\"use client\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { type MutableRefObject, useEffect } from \"react\";\n\nexport const useOnResizeContent = (\n ref: MutableRefObject<HTMLElement | null>,\n callback: () => void,\n) => {\n const callbackRef = useCallbackRef(callback);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const resizeObserver = new ResizeObserver(() => {\n callbackRef();\n });\n\n const mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof Element) {\n resizeObserver.observe(node);\n }\n }\n\n for (const node of mutation.removedNodes) {\n if (node instanceof Element) {\n resizeObserver.unobserve(node);\n }\n }\n }\n\n callbackRef();\n });\n\n resizeObserver.observe(el);\n mutationObserver.observe(el, { childList: true });\n\n // Observe existing children\n for (const child of el.children) {\n resizeObserver.observe(child);\n }\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [ref.current, callbackRef]);\n};\n","\"use client\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useEffect } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\nexport const useOnScrollToBottom = (callback: () => void) => {\n const callbackRef = useCallbackRef(callback);\n\n const { useViewport } = useThreadContext();\n useEffect(() => {\n return useViewport.getState().onScrollToBottom(() => {\n callbackRef();\n });\n }, [useViewport, callbackRef]);\n};\n","\"use client\";\n\nimport { type FC, type PropsWithChildren, useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport type {\n AppendContentPart,\n ThreadMessage,\n} from \"../../utils/AssistantTypes\";\nimport { getMessageText } from \"../../utils/getMessageText\";\nimport { MessageContext } from \"../MessageContext\";\nimport type { MessageContextValue } from \"../MessageContext\";\nimport { useThreadContext } from \"../ThreadContext\";\nimport type { MessageState } from \"../stores/Message\";\nimport { makeEditComposerStore } from \"../stores/MessageComposer\";\nimport type { ThreadState } from \"../stores/Thread\";\n\ntype MessageProviderProps = PropsWithChildren<{\n messageIndex: number;\n}>;\n\nconst getIsLast = (thread: ThreadState, message: ThreadMessage) => {\n return thread.messages[thread.messages.length - 1]?.id === message.id;\n};\n\nconst syncMessage = (\n thread: ThreadState,\n useMessage: MessageContextValue[\"useMessage\"],\n messageIndex: number,\n) => {\n const parentId = thread.messages[messageIndex - 1]?.id ?? null;\n const message = thread.messages[messageIndex];\n\n // TODO check if this can happen\n if (!message) return;\n\n const isLast = getIsLast(thread, message);\n const branches = thread.getBranches(message.id);\n\n // if the message is the same, don't update\n const currentState = useMessage.getState();\n if (\n currentState.message === message &&\n currentState.parentId === parentId &&\n currentState.branches === branches &&\n currentState.isLast === isLast\n )\n return;\n\n // sync useMessage\n useMessage.setState({\n message,\n parentId,\n branches,\n isLast,\n });\n};\n\nconst useMessageContext = (messageIndex: number) => {\n const { useThread } = useThreadContext();\n\n const [context] = useState<MessageContextValue>(() => {\n const useMessage = create<MessageState>((set) => ({\n message: null as unknown as ThreadMessage,\n parentId: null,\n branches: [],\n isLast: false,\n inProgressIndicator: null,\n isCopied: false,\n isHovering: false,\n setInProgressIndicator: (value) => {\n set({ inProgressIndicator: value });\n },\n setIsCopied: (value) => {\n set({ isCopied: value });\n },\n setIsHovering: (value) => {\n set({ isHovering: value });\n },\n }));\n\n const useComposer = makeEditComposerStore({\n onEdit: () => {\n const message = useMessage.getState().message;\n if (message.role !== \"user\")\n throw new Error(\n \"Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui.\",\n );\n\n const text = getMessageText(message);\n\n return text;\n },\n onSend: (text) => {\n const { message, parentId } = useMessage.getState();\n if (message.role !== \"user\")\n throw new Error(\n \"Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui.\",\n );\n\n const nonTextParts = message.content.filter(\n (part): part is AppendContentPart =>\n part.type !== \"text\" && part.type !== \"ui\",\n );\n useThread.getState().append({\n parentId,\n content: [{ type: \"text\", text }, ...nonTextParts],\n });\n },\n });\n\n syncMessage(useThread.getState(), useMessage, messageIndex);\n\n return { useMessage, useComposer };\n });\n\n useEffect(() => {\n return useThread.subscribe((thread) => {\n syncMessage(thread, context.useMessage, messageIndex);\n });\n }, [context, useThread, messageIndex]);\n\n return context;\n};\n\nexport const MessageProvider: FC<MessageProviderProps> = ({\n messageIndex,\n children,\n}) => {\n const context = useMessageContext(messageIndex);\n\n return (\n <MessageContext.Provider value={context}>\n {children}\n </MessageContext.Provider>\n );\n};\n","import { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { type BaseComposerState, makeBaseComposer } from \"./BaseComposer\";\n\nexport type EditComposerState = BaseComposerState &\n Readonly<{\n isEditing: boolean;\n\n edit: () => void;\n send: () => void;\n cancel: () => boolean;\n }>;\n\nexport const makeEditComposerStore = ({\n onEdit,\n onSend,\n}: {\n onEdit: () => string;\n onSend: (value: string) => void;\n}): UseBoundStore<StoreApi<EditComposerState>> =>\n create<EditComposerState>()((set, get, store) => ({\n ...makeBaseComposer(set, get, store),\n\n isEditing: false,\n\n edit: () => {\n const value = onEdit();\n set({ isEditing: true, value });\n },\n send: () => {\n const value = get().value;\n set({ isEditing: false });\n onSend(value);\n },\n cancel: () => {\n if (!get().isEditing) return false;\n set({ isEditing: false });\n return true;\n },\n }));\n","import type { StateCreator } from \"zustand\";\n\nexport type BaseComposerState = Readonly<{\n value: string;\n setValue: (value: string) => void;\n}>;\n\nexport const makeBaseComposer: StateCreator<\n BaseComposerState,\n [],\n [],\n BaseComposerState\n> = (set) => ({\n value: \"\",\n setValue: (value) => {\n set({ value });\n },\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","\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\nimport type { RequireAtLeastOne } from \"../../utils/RequireAtLeastOne\";\n\ntype ComposerIfFilters = {\n editing: boolean | undefined;\n};\n\ntype ComposerIfProps = PropsWithChildren<RequireAtLeastOne<ComposerIfFilters>>;\n\nconst useComposerIf = (props: RequireAtLeastOne<ComposerIfFilters>) => {\n const { useComposer } = useComposerContext();\n return useComposer((composer) => {\n if (props.editing === true && !composer.isEditing) return false;\n if (props.editing === false && composer.isEditing) return false;\n\n return true;\n });\n};\n\nexport const ComposerIf: FC<ComposerIfProps> = ({ children, ...query }) => {\n const result = useComposerIf(query);\n return result ? children : null;\n};\n","\"use client\";\n\nimport type { FC, ReactNode } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport type { RequireAtLeastOne } from \"../../utils/RequireAtLeastOne\";\n\ntype MessageIfFilters = {\n user: boolean | undefined;\n assistant: boolean | undefined;\n hasBranches: boolean | undefined;\n copied: boolean | undefined;\n lastOrHover: boolean | undefined;\n};\n\ntype MessageIfProps = RequireAtLeastOne<MessageIfFilters> & {\n children: ReactNode;\n};\n\nexport const useMessageIf = (props: RequireAtLeastOne<MessageIfFilters>) => {\n const { useMessage } = useMessageContext();\n\n return useMessage(({ message, branches, isLast, isCopied, isHovering }) => {\n if (props.hasBranches === true && branches.length < 2) return false;\n\n if (props.user && message.role !== \"user\") return false;\n if (props.assistant && message.role !== \"assistant\") return false;\n\n if (props.lastOrHover === true && !isHovering && !isLast) return false;\n\n if (props.copied === true && !isCopied) return false;\n if (props.copied === false && isCopied) return false;\n\n return true;\n });\n};\n\nexport const MessageIf: FC<MessageIfProps> = ({ children, ...query }) => {\n const result = useMessageIf(query);\n return result ? children : null;\n};\n","\"use client\";\n\nimport type { ComponentType, FC } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { MessageProvider } from \"../../context/providers/MessageProvider\";\nimport { ComposerIf } from \"../composer/ComposerIf\";\nimport { MessageIf } from \"../message/MessageIf\";\n\ntype ThreadMessagesProps = {\n components:\n | {\n Message: ComponentType;\n UserMessage?: ComponentType;\n EditComposer?: ComponentType;\n AssistantMessage?: ComponentType;\n }\n | {\n Message?: ComponentType;\n UserMessage: ComponentType;\n EditComposer?: ComponentType;\n AssistantMessage: ComponentType;\n };\n};\n\nconst getComponents = (components: ThreadMessagesProps[\"components\"]) => {\n return {\n EditComposer:\n components.EditComposer ??\n components.UserMessage ??\n (components.Message as ComponentType),\n UserMessage:\n components.UserMessage ?? (components.Message as ComponentType),\n AssistantMessage:\n components.AssistantMessage ?? (components.Message as ComponentType),\n };\n};\n\nexport const ThreadMessages: FC<ThreadMessagesProps> = ({ components }) => {\n const { useThread } = useThreadContext();\n const messagesLength = useThread((t) => t.messages.length);\n\n const { UserMessage, EditComposer, AssistantMessage } =\n getComponents(components);\n\n if (messagesLength === 0) return null;\n\n return (\n <>\n {new Array(messagesLength).fill(null).map((_, idx) => {\n const messageIndex = idx;\n // TODO avoid rerendering on messageLength change\n return (\n <MessageProvider\n key={messageIndex} // keep the same key when switching branches for better a11y support\n messageIndex={messageIndex}\n >\n <MessageIf user>\n <ComposerIf editing={false}>\n <UserMessage />\n </ComposerIf>\n <ComposerIf editing>\n <EditComposer />\n </ComposerIf>\n </MessageIf>\n <MessageIf assistant>\n <AssistantMessage />\n </MessageIf>\n </MessageProvider>\n );\n })}\n </>\n );\n};\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\ntype ThreadScrollToBottomElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ThreadScrollToBottomProps = PrimitiveButtonProps;\n\nexport const ThreadScrollToBottom = forwardRef<\n ThreadScrollToBottomElement,\n ThreadScrollToBottomProps\n>(({ onClick, ...rest }, ref) => {\n const { useViewport } = useThreadContext();\n\n const isAtBottom = useViewport((s) => s.isAtBottom);\n const handleScrollToBottom = () => {\n useViewport.getState().scrollToBottom();\n };\n\n return (\n <Primitive.button\n {...rest}\n disabled={isAtBottom}\n ref={ref}\n onClick={composeEventHandlers(onClick, handleScrollToBottom)}\n />\n );\n});\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\ntype ThreadSuggestionElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ThreadSuggestionProps = PrimitiveButtonProps & {\n prompt: string;\n method: \"replace\";\n autoSend?: boolean;\n};\n\nexport const ThreadSuggestion = forwardRef<\n ThreadSuggestionElement,\n ThreadSuggestionProps\n>(({ onClick, prompt, method, autoSend: send, ...rest }, ref) => {\n const { useThread, useComposer } = useThreadContext();\n\n const isDisabled = useThread((t) => t.isRunning);\n const handleApplySuggestion = () => {\n const thread = useThread.getState();\n const composer = useComposer.getState();\n composer.setValue(prompt);\n\n if (send && !thread.isRunning) {\n composer.send();\n }\n };\n\n return (\n <Primitive.button\n {...rest}\n disabled={isDisabled}\n ref={ref}\n onClick={composeEventHandlers(onClick, handleApplySuggestion)}\n />\n );\n});\n","export { ComposerRoot as Root } from \"./ComposerRoot\";\nexport { ComposerInput as Input } from \"./ComposerInput\";\nexport { ComposerSend as Send } from \"./ComposerSend\";\nexport { ComposerCancel as Cancel } from \"./ComposerCancel\";\nexport { ComposerIf as If } from \"./ComposerIf\";\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, type FormEvent, forwardRef, useRef } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\ntype ComposerRootElement = ElementRef<typeof Primitive.form>;\ntype PrimitiveFormProps = ComponentPropsWithoutRef<typeof Primitive.form>;\n\ntype ComposerRootProps = PrimitiveFormProps;\n\nexport const ComposerRoot = forwardRef<ComposerRootElement, ComposerRootProps>(\n ({ onSubmit, ...rest }, forwardedRef) => {\n const { useViewport } = useThreadContext();\n const { useComposer } = useComposerContext();\n\n const formRef = useRef<HTMLFormElement>(null);\n const ref = useComposedRefs(forwardedRef, formRef);\n\n const handleSubmit = (e: FormEvent) => {\n const composerState = useComposer.getState();\n if (!composerState.isEditing) return;\n\n e.preventDefault();\n composerState.send();\n\n useViewport.getState().scrollToBottom();\n };\n\n return (\n <Primitive.form\n {...rest}\n ref={ref}\n onSubmit={composeEventHandlers(onSubmit, handleSubmit)}\n />\n );\n },\n);\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n} from \"react-textarea-autosize\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\n\ntype ComposerInputProps = TextareaAutosizeProps & {\n asChild?: boolean;\n};\n\nexport const ComposerInput = forwardRef<\n HTMLTextAreaElement,\n ComposerInputProps\n>(\n (\n { autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest },\n forwardedRef,\n ) => {\n const { useThread, useViewport } = useThreadContext();\n const { useComposer, type } = useComposerContext();\n\n const value = useComposer((c) => {\n if (!c.isEditing) return \"\";\n return c.value;\n });\n\n const Component = asChild ? Slot : TextareaAutosize;\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (disabled) return;\n\n const composer = useComposer.getState();\n if (e.key === \"Escape\") {\n if (useComposer.getState().cancel()) {\n e.preventDefault();\n }\n } else if (e.key === \"Enter\" && e.shiftKey === false) {\n const isRunning = useThread.getState().isRunning;\n if (!isRunning) {\n e.preventDefault();\n composer.send();\n\n useViewport.getState().scrollToBottom();\n }\n }\n };\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n\n const autoFocusEnabled = autoFocus && !disabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus();\n textarea.setSelectionRange(\n textareaRef.current.value.length,\n textareaRef.current.value.length,\n );\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (type === \"new\") {\n focus();\n }\n });\n\n return (\n <Component\n value={value}\n {...rest}\n ref={ref}\n disabled={disabled}\n onChange={composeEventHandlers(onChange, (e) => {\n const composerState = useComposer.getState();\n if (!composerState.isEditing) return;\n return composerState.setValue(e.target.value);\n })}\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyPress)}\n />\n );\n },\n);\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\n\ntype ComposerSendElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveFormProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ComposerSendProps = PrimitiveFormProps;\n\nexport const ComposerSend = forwardRef<ComposerSendElement, ComposerSendProps>(\n ({ disabled, ...rest }, ref) => {\n const { useComposer } = useComposerContext();\n const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);\n\n return (\n <Primitive.button\n type=\"submit\"\n {...rest}\n ref={ref}\n disabled={disabled || !hasValue}\n />\n );\n },\n);\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\n\ntype ComposerCancelElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveFormProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ComposerCancelProps = PrimitiveFormProps;\n\nexport const ComposerCancel = forwardRef<\n ComposerCancelElement,\n ComposerCancelProps\n>(({ onClick, ...rest }, ref) => {\n const { useComposer } = useComposerContext();\n\n const handleCancel = () => {\n useComposer.getState().cancel();\n };\n\n return (\n <Primitive.button\n type=\"button\"\n {...rest}\n ref={ref}\n onClick={composeEventHandlers(onClick, handleCancel)}\n />\n );\n});\n","export { MessageRoot as Root } from \"./MessageRoot\";\nexport { MessageIf as If } from \"./MessageIf\";\nexport { MessageContent as Content } from \"./MessageContent\";\nexport { MessageInProgress as InProgress } from \"./MessageInProgress\";\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\ntype MessageRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype MessageRootProps = PrimitiveDivProps;\n\nexport const MessageRoot = forwardRef<MessageRootElement, MessageRootProps>(\n ({ onMouseEnter, onMouseLeave, ...rest }, ref) => {\n const { useMessage } = useMessageContext();\n const setIsHovering = useMessage((s) => s.setIsHovering);\n\n const handleMouseEnter = () => {\n setIsHovering(true);\n };\n const handleMouseLeave = () => {\n setIsHovering(false);\n };\n\n return (\n <Primitive.div\n {...rest}\n ref={ref}\n onMouseEnter={composeEventHandlers(onMouseEnter, handleMouseEnter)}\n onMouseLeave={composeEventHandlers(onMouseLeave, handleMouseLeave)}\n />\n );\n },\n);\n","\"use client\";\n\nimport { type FC, type PropsWithChildren, useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport { ContentPartContext } from \"../ContentPartContext\";\nimport type { ContentPartContextValue } from \"../ContentPartContext\";\nimport { useMessageContext } from \"../MessageContext\";\nimport type { MessageState } from \"../stores\";\nimport type { ContentPartState } from \"../stores/ContentPart\";\n\ntype ContentPartProviderProps = PropsWithChildren<{\n partIndex: number;\n}>;\n\nconst syncContentPart = (\n { message }: MessageState,\n useContentPart: ContentPartContextValue[\"useContentPart\"],\n partIndex: number,\n) => {\n const part = message.content[partIndex];\n // TODO check if this can happen\n if (!part) return;\n\n const messageStatus = message.role === \"assistant\" ? message.status : \"done\";\n const status =\n partIndex === message.content.length - 1 ? messageStatus : \"done\";\n\n useContentPart.setState({ part, status });\n};\n\nconst useContentPartContext = (partIndex: number) => {\n const { useMessage } = useMessageContext();\n const [context] = useState<ContentPartContextValue>(() => {\n const useContentPart = create<ContentPartState>(() => ({\n part: { type: \"text\", text: \"\" },\n status: \"done\",\n }));\n\n syncContentPart(useMessage.getState(), useContentPart, partIndex);\n\n return { useContentPart };\n });\n\n useEffect(() => {\n return useMessage.subscribe((message) => {\n syncContentPart(message, context.useContentPart, partIndex);\n });\n }, [context, useMessage, partIndex]);\n\n return context;\n};\n\nexport const ContentPartProvider: FC<ContentPartProviderProps> = ({\n partIndex,\n children,\n}) => {\n const context = useContentPartContext(partIndex);\n\n return (\n <ContentPartContext.Provider value={context}>\n {children}\n </ContentPartContext.Provider>\n );\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","import type { FC } from \"react\";\nimport { useContentPartContext } from \"../../context/ContentPartContext\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport { useCombinedStore } from \"../../utils/combined/useCombinedStore\";\n\nexport const ContentPartInProgressIndicator: FC = () => {\n const { useMessage } = useMessageContext();\n const { useContentPart } = useContentPartContext();\n\n const indicator = useCombinedStore([useMessage, useContentPart], (m, c) =>\n c.status === \"in_progress\" ? m.inProgressIndicator : null,\n );\n return indicator;\n};\n","\"use client\";\n\nimport type { ComponentType, FC, ReactNode } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport { ContentPartProvider } from \"../../context/providers/ContentPartProvider\";\nimport type {\n ImageContentPart,\n TextContentPart,\n ToolCallContentPart,\n UIContentPart,\n} from \"../../utils/AssistantTypes\";\nimport { ContentPartInProgressIndicator } from \"../contentPart/ContentPartInProgressIndicator\";\n\ntype MessageContentProps = {\n components?: {\n Text?: ComponentType<{ part: TextContentPart }>;\n Image?: ComponentType<{ part: ImageContentPart }>;\n UI?: ComponentType<{ part: UIContentPart }>;\n tools?: {\n by_name?: Record<string, ComponentType<{ part: ToolCallContentPart }>>;\n Fallback?: ComponentType<{ part: ToolCallContentPart }>;\n };\n };\n};\n\nconst defaultComponents = {\n Text: ({ part }) => (\n <>\n {part.text}\n <ContentPartInProgressIndicator />\n </>\n ),\n Image: () => null,\n UI: ({ part }) => part.display,\n tools: {\n Fallback: () => null,\n },\n} satisfies MessageContentProps[\"components\"];\n\nexport const MessageContent: FC<MessageContentProps> = ({\n components: {\n Text = defaultComponents.Text,\n Image = defaultComponents.Image,\n UI = defaultComponents.UI,\n tools: { by_name = {}, Fallback = defaultComponents.tools.Fallback } = {},\n } = {},\n}) => {\n const { useMessage } = useMessageContext();\n\n const message = useMessage((s) => s.message);\n const content = message.content;\n\n return (\n <>\n {content.map((part, i) => {\n const partIndex = i; // use the index as key, as message is generally append only\n\n const type = part.type;\n let component: ReactNode | null = null;\n switch (type) {\n case \"text\":\n component = <Text part={part} />;\n break;\n\n case \"image\":\n component = <Image part={part} />;\n break;\n case \"ui\":\n component = <UI part={part} />;\n break;\n case \"tool-call\": {\n const Tool = by_name[part.name] || Fallback;\n component = <Tool part={part} />;\n break;\n }\n default:\n throw new Error(`Unknown content part type: ${type}`);\n }\n\n return (\n <ContentPartProvider key={partIndex} partIndex={partIndex}>\n {component}\n </ContentPartProvider>\n );\n })}\n </>\n );\n};\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef, useMemo } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\ntype MessageInProgressElement = ElementRef<typeof Primitive.span>;\ntype PrimitiveSpanProps = ComponentPropsWithoutRef<typeof Primitive.span>;\n\ntype MessageInProgressProps = PrimitiveSpanProps;\n\nexport const MessageInProgress = forwardRef<\n MessageInProgressElement,\n MessageInProgressProps\n>((props, ref) => {\n const { useMessage } = useMessageContext();\n\n useMemo(() => {\n useMessage\n .getState()\n .setInProgressIndicator(<Primitive.span {...props} ref={ref} />);\n }, [useMessage, props, ref]);\n\n return null;\n});\n","export { BranchPickerNext as Next } from \"./BranchPickerNext\";\nexport { BranchPickerPrevious as Previous } from \"./BranchPickerPrevious\";\nexport { BranchPickerCount as Count } from \"./BranchPickerCount\";\nexport { BranchPickerNumber as Number } from \"./BranchPickerNumber\";\nexport { BranchPickerRoot as Root } from \"./BranchPickerRoot\";\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\n\ntype ActionButtonCallback<TProps> = (props: TProps) => null | (() => void);\n\nexport const createActionButton = <TProps,>(\n useActionButton: ActionButtonCallback<TProps>,\n) => {\n type PrimitiveButtonElement = ElementRef<typeof Primitive.button>;\n type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\n return forwardRef<PrimitiveButtonElement, PrimitiveButtonProps & TProps>(\n (props, forwardedRef) => {\n const onClick = useActionButton(props);\n\n return (\n <Primitive.button\n type=\"button\"\n disabled={!onClick}\n {...props}\n ref={forwardedRef}\n onClick={composeEventHandlers(props.onClick, onClick ?? undefined)}\n />\n );\n },\n );\n};\n","\"use client\";\n\nimport { useGoToNextBranch } from \"../../actions/useGoToNextBranch\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const BranchPickerNext = createActionButton(useGoToNextBranch);\n","\"use client\";\n\nimport { useGoToPreviousBranch } from \"../../actions/useGoToPreviousBranch\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const BranchPickerPrevious = createActionButton(useGoToPreviousBranch);\n","\"use client\";\n\nimport type { FC } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\nexport const BranchPickerCount: FC = () => {\n const { useMessage } = useMessageContext();\n const branchCount = useMessage((s) => s.branches.length);\n return <>{branchCount}</>;\n};\n","\"use client\";\n\nimport type { FC } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\nexport const BranchPickerNumber: FC = () => {\n const { useMessage } = useMessageContext();\n const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));\n return <>{branchIdx + 1}</>;\n};\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { If } from \"../message\";\n\ntype BranchPickerRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype BranchPickerRootProps = PrimitiveDivProps & {\n hideWhenSingleBranch?: boolean;\n};\n\nexport const BranchPickerRoot = forwardRef<\n BranchPickerRootElement,\n BranchPickerRootProps\n>(({ hideWhenSingleBranch, ...rest }, ref) => {\n return (\n <If hasBranches={hideWhenSingleBranch ? true : undefined}>\n <Primitive.div {...rest} ref={ref} />\n </If>\n );\n});\n","export { ActionBarRoot as Root } from \"./ActionBarRoot\";\nexport { ActionBarCopy as Copy } from \"./ActionBarCopy\";\nexport { ActionBarReload as Reload } from \"./ActionBarReload\";\nexport { ActionBarEdit as Edit } from \"./ActionBarEdit\";\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { useCombinedStore } from \"../../utils/combined/useCombinedStore\";\n\ntype ActionBarRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nenum HideAndFloatStatus {\n Hidden = \"hidden\",\n Floating = \"floating\",\n Normal = \"normal\",\n}\n\nexport type ActionBarRootProps = PrimitiveDivProps & {\n hideWhenRunning?: boolean;\n autohide?: \"always\" | \"not-last\" | \"never\";\n autohideFloat?: \"always\" | \"single-branch\" | \"never\";\n};\n\nexport const ActionBarRoot = forwardRef<\n ActionBarRootElement,\n ActionBarRootProps\n>(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {\n const { useThread } = useThreadContext();\n const { useMessage } = useMessageContext();\n\n const hideAndfloatStatus = useCombinedStore(\n [useThread, useMessage],\n (t, m) => {\n if (hideWhenRunning && t.isRunning) return HideAndFloatStatus.Hidden;\n\n const autohideEnabled =\n autohide === \"always\" || (autohide === \"not-last\" && !m.isLast);\n\n // normal status\n if (!autohideEnabled) return HideAndFloatStatus.Normal;\n\n // hidden status\n if (!m.isHovering) return HideAndFloatStatus.Hidden;\n\n // floating status\n if (\n autohideFloat === \"always\" ||\n (autohideFloat === \"single-branch\" && m.branches.length <= 1)\n )\n return HideAndFloatStatus.Floating;\n\n return HideAndFloatStatus.Normal;\n },\n );\n\n if (hideAndfloatStatus === HideAndFloatStatus.Hidden) return null;\n\n return (\n <Primitive.div\n data-floating={hideAndfloatStatus === HideAndFloatStatus.Floating}\n {...rest}\n ref={ref}\n />\n );\n});\n","\"use client\";\n\nimport { useCopyMessage } from \"../../actions/useCopyMessage\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\ntype ActionBarCopyProps = {\n copiedDuration?: number;\n};\n\nexport const ActionBarCopy =\n createActionButton<ActionBarCopyProps>(useCopyMessage);\n","\"use client\";\n\nimport { useReloadMessage } from \"../../actions/useReloadMessage\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const ActionBarReload = createActionButton(useReloadMessage);\n","\"use client\";\n\nimport { useBeginMessageEdit } from \"../../actions/useBeginMessageEdit\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const ActionBarEdit = createActionButton(useBeginMessageEdit);\n","export { ContentPartInProgressIndicator as InProgressIndicator } from \"./ContentPartInProgressIndicator\";\n","\"use client\";\n\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport { VercelRSCRuntime } from \"./VercelRSCRuntime\";\n\nexport const useVercelRSCRuntime = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n) => {\n const [runtime] = useState(() => new VercelRSCRuntime(adapter));\n\n useInsertionEffect(() => {\n runtime.adapter = adapter;\n });\n useEffect(() => {\n runtime.onAdapterUpdated();\n });\n\n return runtime;\n};\n","\"use client\";\n\nimport type {\n AppendMessage,\n AssistantRuntime,\n ReactThreadRuntime,\n ThreadMessage,\n} from \"@assistant-ui/react\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport { useVercelRSCSync } from \"./useVercelRSCSync\";\n\nconst EMPTY_BRANCHES: readonly never[] = Object.freeze([]);\n\nexport class VercelRSCRuntime<T extends WeakKey = VercelRSCMessage>\n implements AssistantRuntime, ReactThreadRuntime\n{\n private useAdapter: UseBoundStore<StoreApi<{ adapter: VercelRSCAdapter<T> }>>;\n\n private _subscriptions = new Set<() => void>();\n\n public isRunning = false;\n public messages: ThreadMessage[] = [];\n\n constructor(public adapter: VercelRSCAdapter<T>) {\n this.useAdapter = create(() => ({\n adapter,\n }));\n }\n\n private withRunning = (callback: Promise<unknown>) => {\n this.isRunning = true;\n return callback.finally(() => {\n this.isRunning = false;\n });\n };\n\n public getBranches(): readonly string[] {\n return EMPTY_BRANCHES;\n }\n\n public switchToBranch(): void {\n throw new Error(\n \"Branch switching is not supported by VercelRSCAssistantProvider.\",\n );\n }\n\n public async append(message: AppendMessage): Promise<void> {\n if (message.parentId !== (this.messages.at(-1)?.id ?? null)) {\n if (!this.adapter.edit)\n throw new Error(\n \"Message editing is not enabled, please provide an edit callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.edit(message));\n } else {\n await this.withRunning(this.adapter.append(message));\n }\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n if (!this.adapter.reload)\n throw new Error(\n \"Message reloading is not enabled, please provide a reload callback to VercelRSCAssistantProvider.\",\n );\n await this.withRunning(this.adapter.reload(parentId));\n }\n\n cancelRun(): void {\n // in dev mode, log a warning\n if (process.env[\"NODE_ENV\"] === \"development\") {\n console.warn(\n \"Run cancellation is not supported by VercelRSCAssistantProvider.\",\n );\n }\n }\n\n public subscribe(callback: () => void): () => void {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n public onAdapterUpdated() {\n if (this.useAdapter.getState().adapter !== this.adapter) {\n this.useAdapter.setState({ adapter: this.adapter });\n }\n }\n\n private updateData = (messages: ThreadMessage[]) => {\n this.messages = messages;\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { adapter } = this.useAdapter();\n\n useVercelRSCSync(adapter, this.updateData);\n\n return null;\n };\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../utils/ThreadMessageConverter\";\nimport type { VercelRSCAdapter } from \"./VercelRSCAdapter\";\nimport type { VercelRSCMessage } from \"./VercelRSCMessage\";\nimport {\n type VercelRSCThreadMessage,\n symbolInnerRSCMessage,\n} from \"./getVercelRSCMessage\";\n\nconst vercelToThreadMessage = <T,>(\n converter: (message: T) => VercelRSCMessage,\n rawMessage: T,\n): VercelRSCThreadMessage<T> => {\n const message = converter(rawMessage);\n\n return {\n id: message.id,\n role: message.role,\n content: [{ type: \"ui\", display: message.display }],\n createdAt: message.createdAt ?? new Date(),\n ...{ status: \"done\" },\n [symbolInnerRSCMessage]: rawMessage,\n };\n};\n\ntype UpdateDataCallback = (messages: ThreadMessage[]) => void;\n\nexport const useVercelRSCSync = <T extends WeakKey>(\n adapter: VercelRSCAdapter<T>,\n updateData: UpdateDataCallback,\n) => {\n // flush the converter cache when the convertMessage prop changes\n const [converter, convertCallback] = useMemo(() => {\n const rscConverter =\n adapter.convertMessage ?? ((m: T) => m as VercelRSCMessage);\n const convertCallback: ConverterCallback<T> = (m, cache) => {\n if (cache) return cache;\n return vercelToThreadMessage(rscConverter, m);\n };\n return [new ThreadMessageConverter(), convertCallback];\n }, [adapter.convertMessage]);\n\n useEffect(() => {\n updateData(converter.convertMessages(adapter.messages, convertCallback));\n }, [updateData, converter, convertCallback, adapter.messages]);\n};\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport type ConverterCallback<TIn> = (\n message: TIn,\n cache: ThreadMessage | undefined,\n) => ThreadMessage;\n\nexport class ThreadMessageConverter {\n private readonly cache = new WeakMap<WeakKey, ThreadMessage>();\n\n convertMessages<TIn extends WeakKey>(\n messages: TIn[],\n converter: ConverterCallback<TIn>,\n keyMapper: (m: TIn) => WeakKey = (key) => key,\n ): ThreadMessage[] {\n return messages.map((m) => {\n const key = keyMapper(m);\n const cached = this.cache.get(key);\n const newMessage = converter(m, cached);\n this.cache.set(key, newMessage);\n return newMessage;\n });\n }\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\n\nexport const symbolInnerRSCMessage = Symbol(\"innerVercelRSCMessage\");\n\nexport type VercelRSCThreadMessage<T> = ThreadMessage & {\n [symbolInnerRSCMessage]?: T;\n};\n\nexport const getVercelRSCMessage = <T,>(message: ThreadMessage) => {\n return (message as VercelRSCThreadMessage<T>)[symbolInnerRSCMessage];\n};\n","import type { UseChatHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseChatRuntime = (chatHelpers: UseChatHelpers) => {\n const [runtime] = useState(() => new VercelAIRuntime(chatHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = chatHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\n};\n","import {\n type AppendMessage,\n type AssistantRuntime,\n unstable_MessageRepository as MessageRepository,\n type ReactThreadRuntime,\n type ThreadMessage,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { getVercelAIMessage } from \"./getVercelAIMessage\";\nimport type { VercelHelpers } from \"./utils/VercelHelpers\";\nimport { sliceMessagesUntil } from \"./utils/sliceMessagesUntil\";\nimport { useVercelAIComposerSync } from \"./utils/useVercelAIComposerSync\";\nimport { useVercelAIThreadSync } from \"./utils/useVercelAIThreadSync\";\n\nconst hasUpcomingMessage = (isRunning: boolean, messages: ThreadMessage[]) => {\n return isRunning && messages[messages.length - 1]?.role !== \"assistant\";\n};\n\nexport class VercelAIRuntime implements AssistantRuntime, ReactThreadRuntime {\n private _subscriptions = new Set<() => void>();\n private repository = new MessageRepository();\n private assistantOptimisticId: string | null = null;\n\n private useVercel: UseBoundStore<StoreApi<{ vercel: VercelHelpers }>>;\n\n public messages: ThreadMessage[] = [];\n public isRunning = false;\n\n constructor(public vercel: VercelHelpers) {\n this.useVercel = create(() => ({\n vercel,\n }));\n }\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.updateVercelMessages(this.repository.getMessages());\n }\n\n public async append(message: AppendMessage): Promise<void> {\n // add user message\n if (message.content.length !== 1 || message.content[0]?.type !== \"text\")\n throw new Error(\"Only text content is supported by Vercel AI SDK.\");\n\n const newMessages = sliceMessagesUntil(\n this.vercel.messages,\n message.parentId,\n );\n this.vercel.setMessages(newMessages);\n\n await this.vercel.append({\n role: \"user\",\n content: message.content[0].text,\n });\n }\n\n public async startRun(parentId: string | null): Promise<void> {\n const reloadMaybe =\n \"reload\" in this.vercel ? this.vercel.reload : undefined;\n if (!reloadMaybe)\n throw new Error(\n \"Reload is not supported by Vercel AI SDK's useAssistant.\",\n );\n\n const newMessages = sliceMessagesUntil(this.vercel.messages, parentId);\n this.vercel.setMessages(newMessages);\n\n await reloadMaybe();\n }\n\n public cancelRun(): void {\n const previousMessage = this.vercel.messages.at(-1);\n\n this.vercel.stop();\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n let messages = this.repository.getMessages();\n if (\n previousMessage?.role === \"user\" &&\n previousMessage.id === messages.at(-1)?.id // ensure the previous message is a leaf node\n ) {\n this.vercel.setInput(previousMessage.content);\n this.repository.deleteMessage(previousMessage.id);\n\n messages = this.repository.getMessages();\n }\n\n // resync messages\n setTimeout(() => {\n this.updateVercelMessages(messages);\n }, 0);\n }\n\n public subscribe(callback: () => void): () => void {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private updateVercelMessages = (messages: ThreadMessage[]) => {\n this.vercel.setMessages(\n messages\n .flatMap(getVercelAIMessage)\n .filter((m): m is Message => m != null),\n );\n };\n\n public onVercelUpdated() {\n if (this.useVercel.getState().vercel !== this.vercel) {\n this.useVercel.setState({ vercel: this.vercel });\n }\n }\n\n private updateData = (isRunning: boolean, vm: ThreadMessage[]) => {\n for (let i = 0; i < vm.length; i++) {\n const message = vm[i]!;\n const parent = vm[i - 1];\n this.repository.addOrUpdateMessage(parent?.id ?? null, message);\n }\n\n if (this.assistantOptimisticId) {\n this.repository.deleteMessage(this.assistantOptimisticId);\n this.assistantOptimisticId = null;\n }\n\n if (hasUpcomingMessage(isRunning, vm)) {\n this.assistantOptimisticId = this.repository.appendOptimisticMessage(\n vm.at(-1)?.id ?? null,\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: \"\" }],\n },\n );\n }\n\n this.repository.resetHead(\n this.assistantOptimisticId ?? vm.at(-1)?.id ?? null,\n );\n\n this.messages = this.repository.getMessages();\n this.isRunning = isRunning;\n\n for (const callback of this._subscriptions) callback();\n };\n\n unstable_synchronizer = () => {\n const { vercel } = this.useVercel();\n\n useVercelAIThreadSync(vercel, this.updateData);\n useVercelAIComposerSync(vercel);\n\n return null;\n };\n}\n","import type { ThreadMessage } from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\n\nexport const symbolInnerAIMessage = Symbol(\"innerVercelAIUIMessage\");\n\nexport type VercelAIThreadMessage = ThreadMessage & {\n [symbolInnerAIMessage]?: Message[];\n};\n\nexport const getVercelAIMessage = (message: ThreadMessage) => {\n return (message as VercelAIThreadMessage)[symbolInnerAIMessage];\n};\n","import type { Message } from \"ai\";\n\nexport const sliceMessagesUntil = (\n messages: Message[],\n messageId: string | null,\n) => {\n if (messageId == null) return [];\n\n let messageIdx = messages.findIndex((m) => m.id === messageId);\n if (messageIdx === -1)\n throw new Error(\n \"useVercelAIThreadState: Message not found. This is liekly an internal bug in assistant-ui.\",\n );\n\n while (messages[messageIdx + 1]?.role === \"assistant\") {\n messageIdx++;\n }\n\n return messages.slice(0, messageIdx + 1);\n};\n","import { unstable_useThreadContext as useThreadContext } from \"@assistant-ui/react\";\nimport { useEffect } from \"react\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\n// two way sync between vercel helpers input state and composer text state\nexport const useVercelAIComposerSync = (vercel: VercelHelpers) => {\n const { useComposer } = useThreadContext();\n\n useEffect(() => {\n useComposer.setState({\n value: vercel.input,\n setValue: vercel.setInput,\n });\n }, [useComposer, vercel.input, vercel.setInput]);\n};\n","import type {\n TextContentPart,\n ThreadMessage,\n unstable_ToolCallContentPart as ToolCallContentPart,\n} from \"@assistant-ui/react\";\nimport type { Message } from \"ai\";\nimport { useEffect, useMemo } from \"react\";\nimport {\n type ConverterCallback,\n ThreadMessageConverter,\n} from \"../../utils/ThreadMessageConverter\";\nimport {\n type VercelAIThreadMessage,\n symbolInnerAIMessage,\n} from \"../getVercelAIMessage\";\nimport type { VercelHelpers } from \"./VercelHelpers\";\n\nconst getIsRunning = (vercel: VercelHelpers) => {\n if (\"isLoading\" in vercel) return vercel.isLoading;\n return vercel.status === \"in_progress\";\n};\n\nconst vercelToThreadMessage = (\n messages: Message[],\n status: \"in_progress\" | \"done\" | \"error\",\n): VercelAIThreadMessage => {\n const firstMessage = messages[0];\n if (!firstMessage) throw new Error(\"No messages found\");\n\n const common = {\n id: firstMessage.id,\n createdAt: firstMessage.createdAt ?? new Date(),\n [symbolInnerAIMessage]: messages,\n };\n\n switch (firstMessage.role) {\n case \"user\":\n if (messages.length > 1) {\n throw new Error(\n \"Multiple user messages found. This is likely an internal bug in assistant-ui.\",\n );\n }\n\n return {\n ...common,\n role: \"user\",\n content: [{ type: \"text\", text: firstMessage.content }],\n };\n case \"assistant\":\n return {\n ...common,\n role: \"assistant\",\n content: messages.flatMap((message) => [\n ...(message.content\n ? [{ type: \"text\", text: message.content } as TextContentPart]\n : []),\n ...(message.toolInvocations?.map(\n (t) =>\n ({\n type: \"tool-call\",\n name: t.toolName,\n args: t.args,\n result: \"result\" in t ? t.result : undefined,\n }) as ToolCallContentPart,\n ) ?? []),\n ]),\n status,\n };\n default:\n throw new Error(\n `You have a message with an unsupported role. The role ${firstMessage.role} is not supported.`,\n );\n }\n};\n\ntype Chunk = [Message, ...Message[]];\nconst hasItems = (messages: Message[]): messages is Chunk =>\n messages.length > 0;\n\nconst chunkedMessages = (messages: Message[]): Chunk[] => {\n const chunks: Chunk[] = [];\n let currentChunk: Message[] = [];\n\n for (const message of messages) {\n if (message.role === \"assistant\") {\n currentChunk.push(message);\n } else {\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n currentChunk = [];\n }\n chunks.push([message]);\n }\n }\n\n if (hasItems(currentChunk)) {\n chunks.push(currentChunk);\n }\n\n return chunks;\n};\n\nconst shallowArrayEqual = (a: unknown[], b: unknown[]) => {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\ntype UpdateDataCallback = (isRunning: boolean, vm: ThreadMessage[]) => void;\n\nexport const useVercelAIThreadSync = (\n vercel: VercelHelpers,\n updateData: UpdateDataCallback,\n) => {\n const isRunning = getIsRunning(vercel);\n\n const converter = useMemo(() => new ThreadMessageConverter(), []);\n\n useEffect(() => {\n const lastMessageId = vercel.messages.at(-1)?.id;\n const convertCallback: ConverterCallback<Chunk> = (messages, cache) => {\n const status =\n lastMessageId === messages[0].id && isRunning ? \"in_progress\" : \"done\";\n\n if (\n cache &&\n shallowArrayEqual(cache.content, messages) &&\n (cache.role === \"user\" || cache.status === status)\n )\n return cache;\n\n return vercelToThreadMessage(messages, status);\n };\n\n const messages = converter.convertMessages(\n chunkedMessages(vercel.messages),\n convertCallback,\n (m) => m[0],\n );\n\n updateData(isRunning, messages);\n }, [updateData, isRunning, vercel.messages, converter]);\n};\n","import type { UseAssistantHelpers } from \"@ai-sdk/react\";\nimport { useEffect, useInsertionEffect, useState } from \"react\";\nimport { VercelAIRuntime } from \"../VercelAIRuntime\";\n\nexport const useVercelUseAssistantRuntime = (\n assistantHelpers: UseAssistantHelpers,\n) => {\n const [runtime] = useState(() => new VercelAIRuntime(assistantHelpers));\n\n useInsertionEffect(() => {\n runtime.vercel = assistantHelpers;\n });\n useEffect(() => {\n runtime.onVercelUpdated();\n });\n\n return runtime;\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 { FC, PropsWithChildren } from \"react\";\nimport { memo } from \"react\";\nimport type { AssistantRuntime } from \"../../runtime/core/AssistantRuntime\";\nimport { ThreadProvider } from \"./ThreadProvider\";\n\ntype AssistantRuntimeProviderProps = {\n runtime: AssistantRuntime;\n};\n\nconst AssistantRuntimeProviderImpl: FC<\n PropsWithChildren<AssistantRuntimeProviderProps>\n> = ({ children, runtime }) => {\n return <ThreadProvider runtime={runtime}>{children}</ThreadProvider>;\n};\n\nexport const AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);\n","import type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useInsertionEffect, useRef, useState } from \"react\";\nimport type { ReactThreadRuntime } from \"../../runtime/core/ReactThreadRuntime\";\nimport type { ThreadRuntime } from \"../../runtime/core/ThreadRuntime\";\nimport type { ThreadContextValue } from \"../ThreadContext\";\nimport { ThreadContext } from \"../ThreadContext\";\nimport { makeComposerStore } from \"../stores/Composer\";\nimport { makeThreadStore } from \"../stores/Thread\";\nimport { makeThreadViewportStore } from \"../stores/ThreadViewport\";\n\ntype ThreadProviderProps = {\n runtime: ThreadRuntime;\n};\n\nexport const ThreadProvider: FC<PropsWithChildren<ThreadProviderProps>> = ({\n children,\n runtime,\n}) => {\n const runtimeRef = useRef(runtime);\n useInsertionEffect(() => {\n runtimeRef.current = runtime;\n });\n\n const [{ context, onRuntimeUpdate }] = useState(() => {\n const { useThread, onRuntimeUpdate } = makeThreadStore(runtimeRef);\n const useViewport = makeThreadViewportStore();\n const useComposer = makeComposerStore(useThread);\n\n return {\n context: {\n useViewport,\n useThread,\n useComposer,\n } satisfies ThreadContextValue,\n onRuntimeUpdate,\n };\n });\n\n useEffect(() => {\n // whenever the runtime changes\n onRuntimeUpdate();\n\n // subscribe to runtime updates\n return runtime.subscribe(onRuntimeUpdate);\n }, [onRuntimeUpdate, runtime]);\n\n const RuntimeSynchronizer = (runtime as ReactThreadRuntime)\n .unstable_synchronizer;\n\n return (\n <ThreadContext.Provider value={context}>\n {RuntimeSynchronizer && <RuntimeSynchronizer />}\n {children}\n </ThreadContext.Provider>\n );\n};\n","import { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { type BaseComposerState, makeBaseComposer } from \"./BaseComposer\";\nimport type { ThreadState } from \"./Thread\";\n\nexport type ComposerState = BaseComposerState &\n Readonly<{\n isEditing: true;\n\n send: () => void;\n cancel: () => boolean;\n }>;\n\nexport const makeComposerStore = (\n useThread: StoreApi<ThreadState>,\n): UseBoundStore<StoreApi<ComposerState>> =>\n create<ComposerState>()((set, get, store) => {\n return {\n ...makeBaseComposer(set, get, store),\n\n isEditing: true,\n\n send: () => {\n const { setValue, value } = get();\n setValue(\"\");\n\n useThread.getState().append({\n parentId: useThread.getState().messages.at(-1)?.id ?? null,\n content: [{ type: \"text\", text: value }],\n });\n },\n cancel: () => {\n const thread = useThread.getState();\n if (!thread.isRunning) return false;\n\n useThread.getState().cancelRun();\n return true;\n },\n };\n });\n","import type { MutableRefObject } from \"react\";\nimport { create } from \"zustand\";\nimport type { AppendMessage, ThreadMessage } from \"../../utils/AssistantTypes\";\n\nexport type ThreadState = {\n messages: readonly ThreadMessage[];\n isRunning: boolean;\n\n getBranches: (messageId: string) => readonly string[];\n switchToBranch: (branchId: string) => void;\n\n append: (message: AppendMessage) => void;\n startRun: (parentId: string | null) => void;\n cancelRun: () => void;\n};\n\nexport const makeThreadStore = (runtimeRef: MutableRefObject<ThreadState>) => {\n const useThread = create<ThreadState>(() => ({\n messages: runtimeRef.current.messages,\n isRunning: runtimeRef.current.isRunning,\n getBranches: (messageId) => runtimeRef.current.getBranches(messageId),\n switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),\n startRun: (parentId) => runtimeRef.current.startRun(parentId),\n append: (message) => runtimeRef.current.append(message),\n cancelRun: () => runtimeRef.current.cancelRun(),\n }));\n\n const onRuntimeUpdate = () => {\n useThread.setState({\n messages: runtimeRef.current.messages,\n isRunning: runtimeRef.current.isRunning,\n });\n };\n\n return {\n useThread,\n onRuntimeUpdate,\n };\n};\n","\"use client\";\nimport { create } from \"zustand\";\n\nexport type ThreadViewportState = {\n isAtBottom: boolean;\n scrollToBottom: () => void;\n onScrollToBottom: (callback: () => void) => () => void;\n};\n\nexport const makeThreadViewportStore = () => {\n const scrollToBottomListeners = new Set<() => void>();\n\n return create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: () => {\n for (const listener of scrollToBottomListeners) {\n listener();\n }\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n }));\n};\n","\"use client\";\n\nimport type { UseAssistantHelpers, UseChatHelpers } from \"@ai-sdk/react\";\nimport {\n useVercelUseAssistantRuntime,\n useVercelUseChatRuntime,\n} from \"@assistant-ui/react-ai-sdk\";\nimport type { FC, PropsWithChildren } from \"react\";\nimport { AssistantRuntimeProvider } from \"../../context/providers/AssistantRuntimeProvider\";\n\ntype VercelUseChatRuntimeProps = PropsWithChildren<{\n chat: UseChatHelpers;\n}>;\n\nconst VercelUseChatRuntimeProvider: FC<VercelUseChatRuntimeProps> = ({\n chat,\n children,\n}) => {\n const runtime = useVercelUseChatRuntime(chat);\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n {children}\n </AssistantRuntimeProvider>\n );\n};\n\ntype VercelUseAssistantRuntimeProps = PropsWithChildren<{\n assistant: UseAssistantHelpers;\n}>;\n\nconst VercelUseAssistantRuntimeProvider: FC<VercelUseAssistantRuntimeProps> = ({\n assistant,\n children,\n}) => {\n const runtime = useVercelUseAssistantRuntime(assistant);\n\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n {children}\n </AssistantRuntimeProvider>\n );\n};\n\n/**\n * @deprecated Will be removed in 0.1.0.\n */\nexport type VercelAIAssistantProviderProps = PropsWithChildren<\n | {\n chat: UseChatHelpers;\n }\n | {\n assistant: UseAssistantHelpers;\n }\n>;\n\n/**\n * @deprecated `const runtime = useVercelUseChatRuntime(chat)` and `<AssistantRuntimeProvider runtime={...} />`. Will be removed in 0.1.0.\n */\nexport const VercelAIAssistantProvider: FC<VercelAIAssistantProviderProps> = ({\n children,\n ...rest\n}) => {\n if (\"chat\" in rest) {\n return (\n <VercelUseChatRuntimeProvider chat={rest.chat}>\n {children}\n </VercelUseChatRuntimeProvider>\n );\n }\n\n return (\n <VercelUseAssistantRuntimeProvider assistant={rest.assistant}>\n {children}\n </VercelUseAssistantRuntimeProvider>\n );\n};\n","\"use client\";\n\nimport {\n type VercelRSCAdapter,\n type VercelRSCMessage,\n useVercelRSCRuntime,\n} from \"@assistant-ui/react-ai-sdk\";\nimport type { PropsWithChildren } from \"react\";\nimport { AssistantRuntimeProvider } from \"../../context/providers/AssistantRuntimeProvider\";\n\n/**\n * @deprecated Will be removed in 0.1.0.\n */\nexport type VercelRSCAssistantProviderProps<T> = PropsWithChildren<\n VercelRSCAdapter<T>\n>;\n\n/**\n * @deprecated Replaced with `const runtime = useVercelRSCRuntime({ messages, append })` and `<AssistantRuntimeProvider runtime={runtime} />`. Will be removed in 0.1.0.\n */\nexport const VercelRSCAssistantProvider = <\n T extends WeakKey = VercelRSCMessage,\n>({\n children,\n ...adapter\n}: VercelRSCAssistantProviderProps<T>) => {\n const runtime = useVercelRSCRuntime<T>(adapter as VercelRSCAdapter<T>);\n return (\n <AssistantRuntimeProvider runtime={runtime}>\n {children}\n </AssistantRuntimeProvider>\n );\n};\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","import type {\n AppendMessage,\n AssistantMessage,\n UserMessage,\n} from \"../../utils/AssistantTypes\";\nimport type { AssistantRuntime } from \"../core/AssistantRuntime\";\nimport type { Unsubscribe } from \"../core/ThreadRuntime\";\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\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 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"],"mappings":"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","names":["c","useCallback","createContext","useContext","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","jsx","Primitive","forwardRef","useCallbackRef","useEffect","useCallbackRef","useEffect","jsx","forwardRef","Primitive","useEffect","create","jsx","useMessageContext","create","useEffect","useContext","useMemo","useContext","useMemo","jsx","jsxs","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","composeEventHandlers","useComposedRefs","Primitive","forwardRef","useRef","jsx","forwardRef","useRef","useComposedRefs","Primitive","composeEventHandlers","composeEventHandlers","useComposedRefs","forwardRef","useCallback","useEffect","useRef","jsx","forwardRef","useRef","useComposedRefs","useCallback","useEffect","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","useEffect","useState","create","createContext","useContext","jsx","useContentPartContext","useState","create","useEffect","Fragment","jsx","jsxs","Primitive","forwardRef","useMemo","jsx","forwardRef","useMemo","Primitive","composeEventHandlers","Primitive","forwardRef","jsx","Fragment","jsx","Fragment","jsx","Primitive","forwardRef","jsx","forwardRef","Primitive","Primitive","forwardRef","jsx","forwardRef","jsx","Primitive","useEffect","useState","create","useEffect","useMemo","useMemo","convertCallback","useEffect","create","useState","useEffect","useEffect","useInsertionEffect","useState","create","useEffect","useEffect","useMemo","vercelToThreadMessage","useMemo","useEffect","messages","create","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useState","useState","useInsertionEffect","useEffect","useEffect","useInsertionEffect","useRef","useState","create","create","create","create","jsx","jsxs","useRef","useInsertionEffect","useState","onRuntimeUpdate","useEffect","jsx","jsx","jsx","useInsertionEffect","useState","useState","useInsertionEffect"]}
1
+ {"version":3,"sources":["../src/actions/useCopyMessage.tsx","../src/utils/combined/useCombinedStore.ts","../src/utils/combined/createCombinedStore.ts","../src/utils/getMessageText.tsx","../src/actions/useReloadMessage.tsx","../src/actions/useBeginMessageEdit.tsx","../src/actions/useGoToNextBranch.tsx","../src/actions/useGoToPreviousBranch.tsx","../src/primitives/thread/index.ts","../src/primitives/thread/ThreadRoot.tsx","../src/primitives/thread/ThreadIf.tsx","../src/primitives/thread/ThreadEmpty.tsx","../src/primitives/thread/ThreadViewport.tsx","../src/utils/hooks/useOnResizeContent.tsx","../src/utils/hooks/useOnScrollToBottom.tsx","../src/context/providers/MessageProvider.tsx","../src/context/stores/MessageComposer.ts","../src/context/stores/BaseComposer.ts","../src/primitives/composer/ComposerIf.tsx","../src/primitives/message/MessageIf.tsx","../src/primitives/thread/ThreadMessages.tsx","../src/primitives/thread/ThreadScrollToBottom.tsx","../src/primitives/thread/ThreadSuggestion.tsx","../src/primitives/composer/index.ts","../src/primitives/composer/ComposerRoot.tsx","../src/primitives/composer/ComposerInput.tsx","../src/primitives/composer/ComposerSend.tsx","../src/primitives/composer/ComposerCancel.tsx","../src/primitives/message/index.ts","../src/primitives/message/MessageRoot.tsx","../src/context/providers/ContentPartProvider.tsx","../src/primitives/contentPart/ContentPartInProgressIndicator.tsx","../src/primitives/message/MessageContent.tsx","../src/primitives/message/MessageInProgress.tsx","../src/primitives/branchPicker/index.ts","../src/utils/createActionButton.tsx","../src/primitives/branchPicker/BranchPickerNext.tsx","../src/primitives/branchPicker/BranchPickerPrevious.tsx","../src/primitives/branchPicker/BranchPickerCount.tsx","../src/primitives/branchPicker/BranchPickerNumber.tsx","../src/primitives/branchPicker/BranchPickerRoot.tsx","../src/primitives/actionBar/index.ts","../src/primitives/actionBar/ActionBarRoot.tsx","../src/primitives/actionBar/ActionBarCopy.tsx","../src/primitives/actionBar/ActionBarReload.tsx","../src/primitives/actionBar/ActionBarEdit.tsx","../src/primitives/contentPart/index.ts","../src/context/providers/AssistantRuntimeProvider.tsx","../src/context/providers/AssistantProvider.tsx","../src/context/stores/AssistantModelConfig.ts","../src/context/providers/ThreadProvider.tsx","../src/context/stores/Composer.ts","../src/context/stores/Thread.ts","../src/context/stores/ThreadViewport.tsx"],"sourcesContent":["import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\nimport { getMessageText } from \"../utils/getMessageText\";\n\nexport const useCopyMessage = ({ copiedDuration = 3000 }) => {\n const { useMessage, useComposer } = useMessageContext();\n\n const hasCopyableContent = useCombinedStore(\n [useMessage, useComposer],\n (m, c) => {\n return c.isEditing || m.message.content.some((c) => c.type === \"text\");\n },\n );\n\n const callback = useCallback(() => {\n const { isEditing, value: composerValue } = useComposer.getState();\n const { message, setIsCopied } = useMessage.getState();\n\n const valueToCopy = isEditing ? composerValue : getMessageText(message);\n\n navigator.clipboard.writeText(valueToCopy);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n }, [useComposer, useMessage, copiedDuration]);\n\n if (!hasCopyableContent) return null;\n return callback;\n};\n","\"use client\";\nimport { useMemo } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport {\n type CombinedSelector,\n createCombinedStore,\n} from \"./createCombinedStore\";\n\nexport const useCombinedStore = <T extends Array<unknown>, R>(\n stores: { [K in keyof T]: StoreApi<T[K]> },\n selector: CombinedSelector<T, R>,\n): R => {\n // biome-ignore lint/correctness/useExhaustiveDependencies: shallow-compare the store array\n const useCombined = useMemo(() => createCombinedStore<T, R>(stores), stores);\n return useCombined(selector);\n};\n","import { useSyncExternalStore } from \"react\";\nimport type { StoreApi } from \"zustand\";\nimport type { Unsubscribe } from \"../Unsubscribe\";\n\nexport type CombinedSelector<T extends Array<unknown>, R> = (...args: T) => R;\n\nexport const createCombinedStore = <T extends Array<unknown>, R>(\n stores: { [K in keyof T]: StoreApi<T[K]> },\n) => {\n const subscribe = (callback: () => void): Unsubscribe => {\n const unsubscribes = stores.map((store) => store.subscribe(callback));\n return () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n };\n\n return (selector: CombinedSelector<T, R>): R => {\n const getSnapshot = (): R =>\n selector(...(stores.map((store) => store.getState()) as T));\n\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n };\n};\n","\"use client\";\nimport type { TextContentPart, ThreadMessage } from \"./AssistantTypes\";\n\nexport const getMessageText = (message: ThreadMessage) => {\n const textParts = message.content.filter(\n (part) => part.type === \"text\",\n ) as TextContentPart[];\n\n return textParts.map((part) => part.text).join(\"\\n\\n\");\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useThreadContext } from \"../context/ThreadContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useReloadMessage = () => {\n const { useThread, useViewport } = useThreadContext();\n const { useMessage } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useThread, useMessage],\n (t, m) => t.isRunning || m.message.role !== \"assistant\",\n );\n\n const callback = useCallback(() => {\n const { parentId } = useMessage.getState();\n useThread.getState().startRun(parentId);\n useViewport.getState().scrollToBottom();\n }, [useMessage, useThread, useViewport]);\n\n if (disabled) return null;\n return callback;\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useBeginMessageEdit = () => {\n const { useMessage, useComposer } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useMessage, useComposer],\n (m, c) => m.message.role !== \"user\" || c.isEditing,\n );\n\n const callback = useCallback(() => {\n const { edit } = useComposer.getState();\n edit();\n }, [useComposer]);\n\n if (disabled) return null;\n return callback;\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useThreadContext } from \"../context/ThreadContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useGoToNextBranch = () => {\n const { useThread } = useThreadContext();\n const { useMessage, useComposer } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useMessage, useComposer],\n (m, c) =>\n c.isEditing || m.branches.indexOf(m.message.id) + 1 >= m.branches.length,\n );\n\n const callback = useCallback(() => {\n const { message, branches } = useMessage.getState();\n useThread\n .getState()\n .switchToBranch(branches[branches.indexOf(message.id) + 1]!);\n }, [useMessage, useThread]);\n\n if (disabled) return null;\n return callback;\n};\n","import { useCallback } from \"react\";\nimport { useMessageContext } from \"../context/MessageContext\";\nimport { useThreadContext } from \"../context/ThreadContext\";\nimport { useCombinedStore } from \"../utils/combined/useCombinedStore\";\n\nexport const useGoToPreviousBranch = () => {\n const { useThread } = useThreadContext();\n const { useMessage, useComposer } = useMessageContext();\n\n const disabled = useCombinedStore(\n [useMessage, useComposer],\n (m, c) => c.isEditing || m.branches.indexOf(m.message.id) <= 0,\n );\n\n const callback = useCallback(() => {\n const { message, branches } = useMessage.getState();\n useThread\n .getState()\n .switchToBranch(branches[branches.indexOf(message.id) - 1]!);\n }, [useMessage, useThread]);\n\n if (disabled) return null;\n return callback;\n};\n","export { ThreadRoot as Root } from \"./ThreadRoot\";\nexport { ThreadEmpty as Empty } from \"./ThreadEmpty\";\nexport { ThreadIf as If } from \"./ThreadIf\";\nexport { ThreadViewport as Viewport } from \"./ThreadViewport\";\nexport { ThreadMessages as Messages } from \"./ThreadMessages\";\nexport { ThreadScrollToBottom as ScrollToBottom } from \"./ThreadScrollToBottom\";\nexport { ThreadSuggestion as Suggestion } from \"./ThreadSuggestion\";\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\n\ntype ThreadRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype ThreadRootProps = PrimitiveDivProps;\n\nexport const ThreadRoot = forwardRef<ThreadRootElement, ThreadRootProps>(\n (props, ref) => {\n return <Primitive.div {...props} ref={ref} />;\n },\n);\n","\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport type { RequireAtLeastOne } from \"../../utils/RequireAtLeastOne\";\n\ntype ThreadIfFilters = {\n empty: boolean | undefined;\n running: boolean | undefined;\n};\n\ntype ThreadIfProps = PropsWithChildren<RequireAtLeastOne<ThreadIfFilters>>;\n\nconst useThreadIf = (props: RequireAtLeastOne<ThreadIfFilters>) => {\n const { useThread } = useThreadContext();\n return useThread((thread) => {\n if (props.empty === true && thread.messages.length !== 0) return false;\n if (props.empty === false && thread.messages.length === 0) return false;\n if (props.running === true && !thread.isRunning) return false;\n if (props.running === false && thread.isRunning) return false;\n\n return true;\n });\n};\n\nexport const ThreadIf: FC<ThreadIfProps> = ({ children, ...query }) => {\n const result = useThreadIf(query);\n return result ? children : null;\n};\n","\"use client\";\n\nimport type { FC, ReactNode } from \"react\";\nimport { ThreadIf } from \"./ThreadIf\";\n\ntype ThreadEmptyProps = {\n children: ReactNode;\n};\n\nexport const ThreadEmpty: FC<ThreadEmptyProps> = ({ children }) => {\n return <ThreadIf empty>{children}</ThreadIf>;\n};\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef, useRef } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { useOnResizeContent } from \"../../utils/hooks/useOnResizeContent\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\n\ntype ThreadViewportElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype ThreadViewportProps = PrimitiveDivProps & {\n autoScroll?: boolean;\n};\n\nexport const ThreadViewport = forwardRef<\n ThreadViewportElement,\n ThreadViewportProps\n>(({ autoScroll = true, onScroll, children, ...rest }, forwardedRef) => {\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const divRef = useRef<HTMLDivElement>(null);\n const ref = useComposedRefs(forwardedRef, divRef);\n\n const { useViewport } = useThreadContext();\n\n // TODO find a more elegant implementation for this\n\n const firstRenderRef = useRef(true);\n const isScrollingToBottomRef = useRef(false);\n const lastScrollTop = useRef<number>(0);\n\n const scrollToBottom = () => {\n const div = messagesEndRef.current;\n if (!div || !autoScroll) return;\n\n const behavior = firstRenderRef.current ? \"instant\" : \"auto\";\n firstRenderRef.current = false;\n\n isScrollingToBottomRef.current = true;\n div.scrollIntoView({ behavior });\n };\n\n useOnResizeContent(divRef, () => {\n if (!isScrollingToBottomRef.current && !useViewport.getState().isAtBottom) {\n handleScroll();\n } else {\n scrollToBottom();\n }\n });\n\n useOnScrollToBottom(() => {\n scrollToBottom();\n });\n\n const handleScroll = () => {\n const div = divRef.current;\n if (!div) return;\n\n const isAtBottom = useViewport.getState().isAtBottom;\n const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight;\n\n if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {\n // ignore scroll down\n } else if (newIsAtBottom !== isAtBottom) {\n isScrollingToBottomRef.current = false;\n useViewport.setState({ isAtBottom: newIsAtBottom });\n }\n\n lastScrollTop.current = div.scrollTop;\n };\n\n return (\n <Primitive.div\n {...rest}\n onScroll={composeEventHandlers(onScroll, handleScroll)}\n ref={ref}\n >\n {children}\n <div ref={messagesEndRef} />\n </Primitive.div>\n );\n});\n","\"use client\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { type MutableRefObject, useEffect } from \"react\";\n\nexport const useOnResizeContent = (\n ref: MutableRefObject<HTMLElement | null>,\n callback: () => void,\n) => {\n const callbackRef = useCallbackRef(callback);\n\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const resizeObserver = new ResizeObserver(() => {\n callbackRef();\n });\n\n const mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node instanceof Element) {\n resizeObserver.observe(node);\n }\n }\n\n for (const node of mutation.removedNodes) {\n if (node instanceof Element) {\n resizeObserver.unobserve(node);\n }\n }\n }\n\n callbackRef();\n });\n\n resizeObserver.observe(el);\n mutationObserver.observe(el, { childList: true });\n\n // Observe existing children\n for (const child of el.children) {\n resizeObserver.observe(child);\n }\n\n return () => {\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [ref.current, callbackRef]);\n};\n","\"use client\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { useEffect } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\nexport const useOnScrollToBottom = (callback: () => void) => {\n const callbackRef = useCallbackRef(callback);\n\n const { useViewport } = useThreadContext();\n useEffect(() => {\n return useViewport.getState().onScrollToBottom(() => {\n callbackRef();\n });\n }, [useViewport, callbackRef]);\n};\n","\"use client\";\n\nimport { type FC, type PropsWithChildren, useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport type {\n AppendContentPart,\n ThreadMessage,\n} from \"../../utils/AssistantTypes\";\nimport { getMessageText } from \"../../utils/getMessageText\";\nimport { MessageContext } from \"../MessageContext\";\nimport type { MessageContextValue } from \"../MessageContext\";\nimport { useThreadContext } from \"../ThreadContext\";\nimport type { MessageState } from \"../stores/Message\";\nimport { makeEditComposerStore } from \"../stores/MessageComposer\";\nimport type { ThreadState } from \"../stores/Thread\";\n\ntype MessageProviderProps = PropsWithChildren<{\n messageIndex: number;\n}>;\n\nconst getIsLast = (thread: ThreadState, message: ThreadMessage) => {\n return thread.messages[thread.messages.length - 1]?.id === message.id;\n};\n\nconst syncMessage = (\n thread: ThreadState,\n useMessage: MessageContextValue[\"useMessage\"],\n messageIndex: number,\n) => {\n const parentId = thread.messages[messageIndex - 1]?.id ?? null;\n const message = thread.messages[messageIndex];\n\n // TODO check if this can happen\n if (!message) return;\n\n const isLast = getIsLast(thread, message);\n const branches = thread.getBranches(message.id);\n\n // if the message is the same, don't update\n const currentState = useMessage.getState();\n if (\n currentState.message === message &&\n currentState.parentId === parentId &&\n currentState.branches === branches &&\n currentState.isLast === isLast\n )\n return;\n\n // sync useMessage\n useMessage.setState({\n message,\n parentId,\n branches,\n isLast,\n });\n};\n\nconst useMessageContext = (messageIndex: number) => {\n const { useThread } = useThreadContext();\n\n const [context] = useState<MessageContextValue>(() => {\n const useMessage = create<MessageState>((set) => ({\n message: null as unknown as ThreadMessage,\n parentId: null,\n branches: [],\n isLast: false,\n inProgressIndicator: null,\n isCopied: false,\n isHovering: false,\n setInProgressIndicator: (value) => {\n set({ inProgressIndicator: value });\n },\n setIsCopied: (value) => {\n set({ isCopied: value });\n },\n setIsHovering: (value) => {\n set({ isHovering: value });\n },\n }));\n\n const useComposer = makeEditComposerStore({\n onEdit: () => {\n const message = useMessage.getState().message;\n if (message.role !== \"user\")\n throw new Error(\n \"Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui.\",\n );\n\n const text = getMessageText(message);\n\n return text;\n },\n onSend: (text) => {\n const { message, parentId } = useMessage.getState();\n if (message.role !== \"user\")\n throw new Error(\n \"Tried to edit a non-user message. Editing is only supported for user messages. This is likely an internal bug in assistant-ui.\",\n );\n\n const nonTextParts = message.content.filter(\n (part): part is AppendContentPart =>\n part.type !== \"text\" && part.type !== \"ui\",\n );\n useThread.getState().append({\n parentId,\n content: [{ type: \"text\", text }, ...nonTextParts],\n });\n },\n });\n\n syncMessage(useThread.getState(), useMessage, messageIndex);\n\n return { useMessage, useComposer };\n });\n\n useEffect(() => {\n return useThread.subscribe((thread) => {\n syncMessage(thread, context.useMessage, messageIndex);\n });\n }, [context, useThread, messageIndex]);\n\n return context;\n};\n\nexport const MessageProvider: FC<MessageProviderProps> = ({\n messageIndex,\n children,\n}) => {\n const context = useMessageContext(messageIndex);\n\n return (\n <MessageContext.Provider value={context}>\n {children}\n </MessageContext.Provider>\n );\n};\n","import { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { type BaseComposerState, makeBaseComposer } from \"./BaseComposer\";\n\nexport type EditComposerState = BaseComposerState &\n Readonly<{\n isEditing: boolean;\n\n edit: () => void;\n send: () => void;\n cancel: () => boolean;\n }>;\n\nexport const makeEditComposerStore = ({\n onEdit,\n onSend,\n}: {\n onEdit: () => string;\n onSend: (value: string) => void;\n}): UseBoundStore<StoreApi<EditComposerState>> =>\n create<EditComposerState>()((set, get, store) => ({\n ...makeBaseComposer(set, get, store),\n\n isEditing: false,\n\n edit: () => {\n const value = onEdit();\n set({ isEditing: true, value });\n },\n send: () => {\n const value = get().value;\n set({ isEditing: false });\n onSend(value);\n },\n cancel: () => {\n if (!get().isEditing) return false;\n set({ isEditing: false });\n return true;\n },\n }));\n","import type { StateCreator } from \"zustand\";\n\nexport type BaseComposerState = Readonly<{\n value: string;\n setValue: (value: string) => void;\n}>;\n\nexport const makeBaseComposer: StateCreator<\n BaseComposerState,\n [],\n [],\n BaseComposerState\n> = (set) => ({\n value: \"\",\n setValue: (value) => {\n set({ value });\n },\n});\n","\"use client\";\n\nimport type { FC, PropsWithChildren } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\nimport type { RequireAtLeastOne } from \"../../utils/RequireAtLeastOne\";\n\ntype ComposerIfFilters = {\n editing: boolean | undefined;\n};\n\ntype ComposerIfProps = PropsWithChildren<RequireAtLeastOne<ComposerIfFilters>>;\n\nconst useComposerIf = (props: RequireAtLeastOne<ComposerIfFilters>) => {\n const { useComposer } = useComposerContext();\n return useComposer((composer) => {\n if (props.editing === true && !composer.isEditing) return false;\n if (props.editing === false && composer.isEditing) return false;\n\n return true;\n });\n};\n\nexport const ComposerIf: FC<ComposerIfProps> = ({ children, ...query }) => {\n const result = useComposerIf(query);\n return result ? children : null;\n};\n","\"use client\";\n\nimport type { FC, ReactNode } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport type { RequireAtLeastOne } from \"../../utils/RequireAtLeastOne\";\n\ntype MessageIfFilters = {\n user: boolean | undefined;\n assistant: boolean | undefined;\n hasBranches: boolean | undefined;\n copied: boolean | undefined;\n lastOrHover: boolean | undefined;\n};\n\ntype MessageIfProps = RequireAtLeastOne<MessageIfFilters> & {\n children: ReactNode;\n};\n\nexport const useMessageIf = (props: RequireAtLeastOne<MessageIfFilters>) => {\n const { useMessage } = useMessageContext();\n\n return useMessage(({ message, branches, isLast, isCopied, isHovering }) => {\n if (props.hasBranches === true && branches.length < 2) return false;\n\n if (props.user && message.role !== \"user\") return false;\n if (props.assistant && message.role !== \"assistant\") return false;\n\n if (props.lastOrHover === true && !isHovering && !isLast) return false;\n\n if (props.copied === true && !isCopied) return false;\n if (props.copied === false && isCopied) return false;\n\n return true;\n });\n};\n\nexport const MessageIf: FC<MessageIfProps> = ({ children, ...query }) => {\n const result = useMessageIf(query);\n return result ? children : null;\n};\n","\"use client\";\n\nimport type { ComponentType, FC } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { MessageProvider } from \"../../context/providers/MessageProvider\";\nimport { ComposerIf } from \"../composer/ComposerIf\";\nimport { MessageIf } from \"../message/MessageIf\";\n\ntype ThreadMessagesProps = {\n components:\n | {\n Message: ComponentType;\n UserMessage?: ComponentType;\n EditComposer?: ComponentType;\n AssistantMessage?: ComponentType;\n }\n | {\n Message?: ComponentType;\n UserMessage: ComponentType;\n EditComposer?: ComponentType;\n AssistantMessage: ComponentType;\n };\n};\n\nconst getComponents = (components: ThreadMessagesProps[\"components\"]) => {\n return {\n EditComposer:\n components.EditComposer ??\n components.UserMessage ??\n (components.Message as ComponentType),\n UserMessage:\n components.UserMessage ?? (components.Message as ComponentType),\n AssistantMessage:\n components.AssistantMessage ?? (components.Message as ComponentType),\n };\n};\n\nexport const ThreadMessages: FC<ThreadMessagesProps> = ({ components }) => {\n const { useThread } = useThreadContext();\n const messagesLength = useThread((t) => t.messages.length);\n\n const { UserMessage, EditComposer, AssistantMessage } =\n getComponents(components);\n\n if (messagesLength === 0) return null;\n\n return (\n <>\n {new Array(messagesLength).fill(null).map((_, idx) => {\n const messageIndex = idx;\n // TODO avoid rerendering on messageLength change\n return (\n <MessageProvider\n key={messageIndex} // keep the same key when switching branches for better a11y support\n messageIndex={messageIndex}\n >\n <MessageIf user>\n <ComposerIf editing={false}>\n <UserMessage />\n </ComposerIf>\n <ComposerIf editing>\n <EditComposer />\n </ComposerIf>\n </MessageIf>\n <MessageIf assistant>\n <AssistantMessage />\n </MessageIf>\n </MessageProvider>\n );\n })}\n </>\n );\n};\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\ntype ThreadScrollToBottomElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ThreadScrollToBottomProps = PrimitiveButtonProps;\n\nexport const ThreadScrollToBottom = forwardRef<\n ThreadScrollToBottomElement,\n ThreadScrollToBottomProps\n>(({ onClick, ...rest }, ref) => {\n const { useViewport } = useThreadContext();\n\n const isAtBottom = useViewport((s) => s.isAtBottom);\n const handleScrollToBottom = () => {\n useViewport.getState().scrollToBottom();\n };\n\n return (\n <Primitive.button\n {...rest}\n disabled={isAtBottom}\n ref={ref}\n onClick={composeEventHandlers(onClick, handleScrollToBottom)}\n />\n );\n});\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\ntype ThreadSuggestionElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ThreadSuggestionProps = PrimitiveButtonProps & {\n prompt: string;\n method: \"replace\";\n autoSend?: boolean;\n};\n\nexport const ThreadSuggestion = forwardRef<\n ThreadSuggestionElement,\n ThreadSuggestionProps\n>(({ onClick, prompt, method, autoSend: send, ...rest }, ref) => {\n const { useThread, useComposer } = useThreadContext();\n\n const isDisabled = useThread((t) => t.isRunning);\n const handleApplySuggestion = () => {\n const thread = useThread.getState();\n const composer = useComposer.getState();\n composer.setValue(prompt);\n\n if (send && !thread.isRunning) {\n composer.send();\n }\n };\n\n return (\n <Primitive.button\n {...rest}\n disabled={isDisabled}\n ref={ref}\n onClick={composeEventHandlers(onClick, handleApplySuggestion)}\n />\n );\n});\n","export { ComposerRoot as Root } from \"./ComposerRoot\";\nexport { ComposerInput as Input } from \"./ComposerInput\";\nexport { ComposerSend as Send } from \"./ComposerSend\";\nexport { ComposerCancel as Cancel } from \"./ComposerCancel\";\nexport { ComposerIf as If } from \"./ComposerIf\";\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, type FormEvent, forwardRef, useRef } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\n\ntype ComposerRootElement = ElementRef<typeof Primitive.form>;\ntype PrimitiveFormProps = ComponentPropsWithoutRef<typeof Primitive.form>;\n\ntype ComposerRootProps = PrimitiveFormProps;\n\nexport const ComposerRoot = forwardRef<ComposerRootElement, ComposerRootProps>(\n ({ onSubmit, ...rest }, forwardedRef) => {\n const { useViewport } = useThreadContext();\n const { useComposer } = useComposerContext();\n\n const formRef = useRef<HTMLFormElement>(null);\n const ref = useComposedRefs(forwardedRef, formRef);\n\n const handleSubmit = (e: FormEvent) => {\n const composerState = useComposer.getState();\n if (!composerState.isEditing) return;\n\n e.preventDefault();\n composerState.send();\n\n useViewport.getState().scrollToBottom();\n };\n\n return (\n <Primitive.form\n {...rest}\n ref={ref}\n onSubmit={composeEventHandlers(onSubmit, handleSubmit)}\n />\n );\n },\n);\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n type KeyboardEvent,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport TextareaAutosize, {\n type TextareaAutosizeProps,\n} from \"react-textarea-autosize\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\n\ntype ComposerInputProps = TextareaAutosizeProps & {\n asChild?: boolean;\n};\n\nexport const ComposerInput = forwardRef<\n HTMLTextAreaElement,\n ComposerInputProps\n>(\n (\n { autoFocus = false, asChild, disabled, onChange, onKeyDown, ...rest },\n forwardedRef,\n ) => {\n const { useThread, useViewport } = useThreadContext();\n const { useComposer, type } = useComposerContext();\n\n const value = useComposer((c) => {\n if (!c.isEditing) return \"\";\n return c.value;\n });\n\n const Component = asChild ? Slot : TextareaAutosize;\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (disabled) return;\n\n const composer = useComposer.getState();\n if (e.key === \"Escape\") {\n if (useComposer.getState().cancel()) {\n e.preventDefault();\n }\n } else if (e.key === \"Enter\" && e.shiftKey === false) {\n const isRunning = useThread.getState().isRunning;\n if (!isRunning) {\n e.preventDefault();\n composer.send();\n\n useViewport.getState().scrollToBottom();\n }\n }\n };\n\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const ref = useComposedRefs(forwardedRef, textareaRef);\n\n const autoFocusEnabled = autoFocus && !disabled;\n const focus = useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea || !autoFocusEnabled) return;\n\n textarea.focus();\n textarea.setSelectionRange(\n textareaRef.current.value.length,\n textareaRef.current.value.length,\n );\n }, [autoFocusEnabled]);\n\n useEffect(() => focus(), [focus]);\n\n useOnScrollToBottom(() => {\n if (type === \"new\") {\n focus();\n }\n });\n\n return (\n <Component\n value={value}\n {...rest}\n ref={ref}\n disabled={disabled}\n onChange={composeEventHandlers(onChange, (e) => {\n const composerState = useComposer.getState();\n if (!composerState.isEditing) return;\n return composerState.setValue(e.target.value);\n })}\n onKeyDown={composeEventHandlers(onKeyDown, handleKeyPress)}\n />\n );\n },\n);\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\n\ntype ComposerSendElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveFormProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ComposerSendProps = PrimitiveFormProps;\n\nexport const ComposerSend = forwardRef<ComposerSendElement, ComposerSendProps>(\n ({ disabled, ...rest }, ref) => {\n const { useComposer } = useComposerContext();\n const hasValue = useComposer((c) => c.isEditing && c.value.length > 0);\n\n return (\n <Primitive.button\n type=\"submit\"\n {...rest}\n ref={ref}\n disabled={disabled || !hasValue}\n />\n );\n },\n);\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useComposerContext } from \"../../context/ComposerContext\";\n\ntype ComposerCancelElement = ElementRef<typeof Primitive.button>;\ntype PrimitiveFormProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\ntype ComposerCancelProps = PrimitiveFormProps;\n\nexport const ComposerCancel = forwardRef<\n ComposerCancelElement,\n ComposerCancelProps\n>(({ onClick, ...rest }, ref) => {\n const { useComposer } = useComposerContext();\n\n const handleCancel = () => {\n useComposer.getState().cancel();\n };\n\n return (\n <Primitive.button\n type=\"button\"\n {...rest}\n ref={ref}\n onClick={composeEventHandlers(onClick, handleCancel)}\n />\n );\n});\n","export { MessageRoot as Root } from \"./MessageRoot\";\nexport { MessageIf as If } from \"./MessageIf\";\nexport { MessageContent as Content } from \"./MessageContent\";\nexport { MessageInProgress as InProgress } from \"./MessageInProgress\";\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\ntype MessageRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype MessageRootProps = PrimitiveDivProps;\n\nexport const MessageRoot = forwardRef<MessageRootElement, MessageRootProps>(\n ({ onMouseEnter, onMouseLeave, ...rest }, ref) => {\n const { useMessage } = useMessageContext();\n const setIsHovering = useMessage((s) => s.setIsHovering);\n\n const handleMouseEnter = () => {\n setIsHovering(true);\n };\n const handleMouseLeave = () => {\n setIsHovering(false);\n };\n\n return (\n <Primitive.div\n {...rest}\n ref={ref}\n onMouseEnter={composeEventHandlers(onMouseEnter, handleMouseEnter)}\n onMouseLeave={composeEventHandlers(onMouseLeave, handleMouseLeave)}\n />\n );\n },\n);\n","\"use client\";\n\nimport { type FC, type PropsWithChildren, useEffect, useState } from \"react\";\nimport { create } from \"zustand\";\nimport { ContentPartContext } from \"../ContentPartContext\";\nimport type { ContentPartContextValue } from \"../ContentPartContext\";\nimport { useMessageContext } from \"../MessageContext\";\nimport type { MessageState } from \"../stores\";\nimport type { ContentPartState } from \"../stores/ContentPart\";\n\ntype ContentPartProviderProps = PropsWithChildren<{\n partIndex: number;\n}>;\n\nconst syncContentPart = (\n { message }: MessageState,\n useContentPart: ContentPartContextValue[\"useContentPart\"],\n partIndex: number,\n) => {\n const part = message.content[partIndex];\n // TODO check if this can happen\n if (!part) return;\n\n const messageStatus = message.role === \"assistant\" ? message.status : \"done\";\n const status =\n partIndex === message.content.length - 1 ? messageStatus : \"done\";\n\n useContentPart.setState({ part, status });\n};\n\nconst useContentPartContext = (partIndex: number) => {\n const { useMessage } = useMessageContext();\n const [context] = useState<ContentPartContextValue>(() => {\n const useContentPart = create<ContentPartState>(() => ({\n part: { type: \"text\", text: \"\" },\n status: \"done\",\n }));\n\n syncContentPart(useMessage.getState(), useContentPart, partIndex);\n\n return { useContentPart };\n });\n\n useEffect(() => {\n return useMessage.subscribe((message) => {\n syncContentPart(message, context.useContentPart, partIndex);\n });\n }, [context, useMessage, partIndex]);\n\n return context;\n};\n\nexport const ContentPartProvider: FC<ContentPartProviderProps> = ({\n partIndex,\n children,\n}) => {\n const context = useContentPartContext(partIndex);\n\n return (\n <ContentPartContext.Provider value={context}>\n {children}\n </ContentPartContext.Provider>\n );\n};\n","import type { FC } from \"react\";\nimport { useContentPartContext } from \"../../context/ContentPartContext\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport { useCombinedStore } from \"../../utils/combined/useCombinedStore\";\n\nexport const ContentPartInProgressIndicator: FC = () => {\n const { useMessage } = useMessageContext();\n const { useContentPart } = useContentPartContext();\n\n const indicator = useCombinedStore([useMessage, useContentPart], (m, c) =>\n c.status === \"in_progress\" ? m.inProgressIndicator : null,\n );\n return indicator;\n};\n","\"use client\";\n\nimport type { ComponentType, FC, ReactNode } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport { ContentPartProvider } from \"../../context/providers/ContentPartProvider\";\nimport type {\n ImageContentPart,\n TextContentPart,\n ToolCallContentPart,\n UIContentPart,\n} from \"../../utils/AssistantTypes\";\nimport { ContentPartInProgressIndicator } from \"../contentPart/ContentPartInProgressIndicator\";\n\ntype MessageContentProps = {\n components?: {\n Text?: ComponentType<{ part: TextContentPart }>;\n Image?: ComponentType<{ part: ImageContentPart }>;\n UI?: ComponentType<{ part: UIContentPart }>;\n tools?: {\n by_name?: Record<string, ComponentType<{ part: ToolCallContentPart }>>;\n Fallback?: ComponentType<{ part: ToolCallContentPart }>;\n };\n };\n};\n\nconst defaultComponents = {\n Text: ({ part }) => (\n <>\n {part.text}\n <ContentPartInProgressIndicator />\n </>\n ),\n Image: () => null,\n UI: ({ part }) => part.display,\n tools: {\n Fallback: () => null,\n },\n} satisfies MessageContentProps[\"components\"];\n\nexport const MessageContent: FC<MessageContentProps> = ({\n components: {\n Text = defaultComponents.Text,\n Image = defaultComponents.Image,\n UI = defaultComponents.UI,\n tools: { by_name = {}, Fallback = defaultComponents.tools.Fallback } = {},\n } = {},\n}) => {\n const { useMessage } = useMessageContext();\n\n const message = useMessage((s) => s.message);\n const content = message.content;\n\n return (\n <>\n {content.map((part, i) => {\n const partIndex = i; // use the index as key, as message is generally append only\n\n const type = part.type;\n let component: ReactNode | null = null;\n switch (type) {\n case \"text\":\n component = <Text part={part} />;\n break;\n\n case \"image\":\n component = <Image part={part} />;\n break;\n case \"ui\":\n component = <UI part={part} />;\n break;\n case \"tool-call\": {\n const Tool = by_name[part.name] || Fallback;\n component = <Tool part={part} />;\n break;\n }\n default:\n throw new Error(`Unknown content part type: ${type}`);\n }\n\n return (\n <ContentPartProvider key={partIndex} partIndex={partIndex}>\n {component}\n </ContentPartProvider>\n );\n })}\n </>\n );\n};\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef, useMemo } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\ntype MessageInProgressElement = ElementRef<typeof Primitive.span>;\ntype PrimitiveSpanProps = ComponentPropsWithoutRef<typeof Primitive.span>;\n\ntype MessageInProgressProps = PrimitiveSpanProps;\n\nexport const MessageInProgress = forwardRef<\n MessageInProgressElement,\n MessageInProgressProps\n>((props, ref) => {\n const { useMessage } = useMessageContext();\n\n useMemo(() => {\n useMessage\n .getState()\n .setInProgressIndicator(<Primitive.span {...props} ref={ref} />);\n }, [useMessage, props, ref]);\n\n return null;\n});\n","export { BranchPickerNext as Next } from \"./BranchPickerNext\";\nexport { BranchPickerPrevious as Previous } from \"./BranchPickerPrevious\";\nexport { BranchPickerCount as Count } from \"./BranchPickerCount\";\nexport { BranchPickerNumber as Number } from \"./BranchPickerNumber\";\nexport { BranchPickerRoot as Root } from \"./BranchPickerRoot\";\n","\"use client\";\n\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\n\ntype ActionButtonCallback<TProps> = (props: TProps) => null | (() => void);\n\nexport const createActionButton = <TProps,>(\n useActionButton: ActionButtonCallback<TProps>,\n) => {\n type PrimitiveButtonElement = ElementRef<typeof Primitive.button>;\n type PrimitiveButtonProps = ComponentPropsWithoutRef<typeof Primitive.button>;\n\n return forwardRef<PrimitiveButtonElement, PrimitiveButtonProps & TProps>(\n (props, forwardedRef) => {\n const onClick = useActionButton(props);\n\n return (\n <Primitive.button\n type=\"button\"\n disabled={!onClick}\n {...props}\n ref={forwardedRef}\n onClick={composeEventHandlers(props.onClick, onClick ?? undefined)}\n />\n );\n },\n );\n};\n","\"use client\";\n\nimport { useGoToNextBranch } from \"../../actions/useGoToNextBranch\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const BranchPickerNext = createActionButton(useGoToNextBranch);\n","\"use client\";\n\nimport { useGoToPreviousBranch } from \"../../actions/useGoToPreviousBranch\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const BranchPickerPrevious = createActionButton(useGoToPreviousBranch);\n","\"use client\";\n\nimport type { FC } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\nexport const BranchPickerCount: FC = () => {\n const { useMessage } = useMessageContext();\n const branchCount = useMessage((s) => s.branches.length);\n return <>{branchCount}</>;\n};\n","\"use client\";\n\nimport type { FC } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\n\nexport const BranchPickerNumber: FC = () => {\n const { useMessage } = useMessageContext();\n const branchIdx = useMessage((s) => s.branches.indexOf(s.message.id));\n return <>{branchIdx + 1}</>;\n};\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { If } from \"../message\";\n\ntype BranchPickerRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\ntype BranchPickerRootProps = PrimitiveDivProps & {\n hideWhenSingleBranch?: boolean;\n};\n\nexport const BranchPickerRoot = forwardRef<\n BranchPickerRootElement,\n BranchPickerRootProps\n>(({ hideWhenSingleBranch, ...rest }, ref) => {\n return (\n <If hasBranches={hideWhenSingleBranch ? true : undefined}>\n <Primitive.div {...rest} ref={ref} />\n </If>\n );\n});\n","export { ActionBarRoot as Root } from \"./ActionBarRoot\";\nexport { ActionBarCopy as Copy } from \"./ActionBarCopy\";\nexport { ActionBarReload as Reload } from \"./ActionBarReload\";\nexport { ActionBarEdit as Edit } from \"./ActionBarEdit\";\n","\"use client\";\n\nimport {\n type ComponentPropsWithoutRef,\n Primitive,\n} from \"@radix-ui/react-primitive\";\nimport { type ElementRef, forwardRef } from \"react\";\nimport { useMessageContext } from \"../../context/MessageContext\";\nimport { useThreadContext } from \"../../context/ThreadContext\";\nimport { useCombinedStore } from \"../../utils/combined/useCombinedStore\";\n\ntype ActionBarRootElement = ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = ComponentPropsWithoutRef<typeof Primitive.div>;\n\nenum HideAndFloatStatus {\n Hidden = \"hidden\",\n Floating = \"floating\",\n Normal = \"normal\",\n}\n\nexport type ActionBarRootProps = PrimitiveDivProps & {\n hideWhenRunning?: boolean;\n autohide?: \"always\" | \"not-last\" | \"never\";\n autohideFloat?: \"always\" | \"single-branch\" | \"never\";\n};\n\nexport const ActionBarRoot = forwardRef<\n ActionBarRootElement,\n ActionBarRootProps\n>(({ hideWhenRunning, autohide, autohideFloat, ...rest }, ref) => {\n const { useThread } = useThreadContext();\n const { useMessage } = useMessageContext();\n\n const hideAndfloatStatus = useCombinedStore(\n [useThread, useMessage],\n (t, m) => {\n if (hideWhenRunning && t.isRunning) return HideAndFloatStatus.Hidden;\n\n const autohideEnabled =\n autohide === \"always\" || (autohide === \"not-last\" && !m.isLast);\n\n // normal status\n if (!autohideEnabled) return HideAndFloatStatus.Normal;\n\n // hidden status\n if (!m.isHovering) return HideAndFloatStatus.Hidden;\n\n // floating status\n if (\n autohideFloat === \"always\" ||\n (autohideFloat === \"single-branch\" && m.branches.length <= 1)\n )\n return HideAndFloatStatus.Floating;\n\n return HideAndFloatStatus.Normal;\n },\n );\n\n if (hideAndfloatStatus === HideAndFloatStatus.Hidden) return null;\n\n return (\n <Primitive.div\n data-floating={hideAndfloatStatus === HideAndFloatStatus.Floating}\n {...rest}\n ref={ref}\n />\n );\n});\n","\"use client\";\n\nimport { useCopyMessage } from \"../../actions/useCopyMessage\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\ntype ActionBarCopyProps = {\n copiedDuration?: number;\n};\n\nexport const ActionBarCopy =\n createActionButton<ActionBarCopyProps>(useCopyMessage);\n","\"use client\";\n\nimport { useReloadMessage } from \"../../actions/useReloadMessage\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const ActionBarReload = createActionButton(useReloadMessage);\n","\"use client\";\n\nimport { useBeginMessageEdit } from \"../../actions/useBeginMessageEdit\";\nimport { createActionButton } from \"../../utils/createActionButton\";\n\nexport const ActionBarEdit = createActionButton(useBeginMessageEdit);\n","export { ContentPartInProgressIndicator as InProgressIndicator } from \"./ContentPartInProgressIndicator\";\n","import type { FC, PropsWithChildren } from \"react\";\nimport { memo } from \"react\";\nimport type { AssistantRuntime } from \"../../runtime/core/AssistantRuntime\";\nimport { AssistantProvider } from \"./AssistantProvider\";\n\ntype AssistantRuntimeProviderProps = {\n runtime: AssistantRuntime;\n};\n\nconst AssistantRuntimeProviderImpl: FC<\n PropsWithChildren<AssistantRuntimeProviderProps>\n> = ({ children, runtime }) => {\n return <AssistantProvider runtime={runtime}>{children}</AssistantProvider>;\n};\n\nexport const AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);\n","import type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useInsertionEffect, useRef, useState } from \"react\";\nimport type { AssistantRuntime } from \"../../runtime\";\nimport { AssistantContext } from \"../AssistantContext\";\nimport { makeAssistantModelConfigStore } from \"../stores/AssistantModelConfig\";\nimport { ThreadProvider } from \"./ThreadProvider\";\n\ntype AssistantProviderProps = {\n runtime: AssistantRuntime;\n};\n\nexport const AssistantProvider: FC<\n PropsWithChildren<AssistantProviderProps>\n> = ({ children, runtime }) => {\n const runtimeRef = useRef(runtime);\n useInsertionEffect(() => {\n runtimeRef.current = runtime;\n });\n\n const [context] = useState(() => {\n const useModelConfig = makeAssistantModelConfigStore();\n\n return { useModelConfig };\n });\n\n const getModelCOnfig = context.useModelConfig((c) => c.getModelConfig);\n useEffect(() => {\n return runtime.registerModelConfigProvider(getModelCOnfig);\n }, [runtime, getModelCOnfig]);\n\n return (\n <AssistantContext.Provider value={context}>\n <ThreadProvider runtime={runtime}>{children}</ThreadProvider>\n </AssistantContext.Provider>\n );\n};\n","\"use client\";\n\nimport { create } from \"zustand\";\nimport type { ModelConfigProvider } from \"../../utils/ModelConfigTypes\";\nimport { ProxyConfigProvider } from \"../../utils/ProxyConfigProvider\";\n\nexport type AssistantModelConfigState = {\n getModelConfig: ModelConfigProvider;\n registerModelConfigProvider: (provider: ModelConfigProvider) => () => void;\n};\n\nexport const makeAssistantModelConfigStore = () =>\n create<AssistantModelConfigState>(() => {\n const proxy = new ProxyConfigProvider();\n\n return {\n getModelConfig: () => {\n return proxy.getModelConfig();\n },\n registerModelConfigProvider: (provider: ModelConfigProvider) => {\n return proxy.registerModelConfigProvider(provider);\n },\n } satisfies AssistantModelConfigState;\n });\n","import type { FC, PropsWithChildren } from \"react\";\nimport { useEffect, useInsertionEffect, useRef, useState } from \"react\";\nimport type { ReactThreadRuntime } from \"../../runtime/core/ReactThreadRuntime\";\nimport type { ThreadRuntime } from \"../../runtime/core/ThreadRuntime\";\nimport type { ThreadContextValue } from \"../ThreadContext\";\nimport { ThreadContext } from \"../ThreadContext\";\nimport { makeComposerStore } from \"../stores/Composer\";\nimport { makeThreadStore } from \"../stores/Thread\";\nimport { makeThreadViewportStore } from \"../stores/ThreadViewport\";\n\ntype ThreadProviderProps = {\n runtime: ThreadRuntime;\n};\n\nexport const ThreadProvider: FC<PropsWithChildren<ThreadProviderProps>> = ({\n children,\n runtime,\n}) => {\n const runtimeRef = useRef(runtime);\n useInsertionEffect(() => {\n runtimeRef.current = runtime;\n });\n\n const [{ context, onRuntimeUpdate }] = useState(() => {\n const { useThread, onRuntimeUpdate } = makeThreadStore(runtimeRef);\n const useViewport = makeThreadViewportStore();\n const useComposer = makeComposerStore(useThread);\n\n return {\n context: {\n useViewport,\n useThread,\n useComposer,\n } satisfies ThreadContextValue,\n onRuntimeUpdate,\n };\n });\n\n useEffect(() => {\n // whenever the runtime changes\n onRuntimeUpdate();\n\n // subscribe to runtime updates\n return runtime.subscribe(onRuntimeUpdate);\n }, [onRuntimeUpdate, runtime]);\n\n const RuntimeSynchronizer = (runtime as ReactThreadRuntime)\n .unstable_synchronizer;\n\n return (\n <ThreadContext.Provider value={context}>\n {RuntimeSynchronizer && <RuntimeSynchronizer />}\n {children}\n </ThreadContext.Provider>\n );\n};\n","import { type StoreApi, type UseBoundStore, create } from \"zustand\";\nimport { type BaseComposerState, makeBaseComposer } from \"./BaseComposer\";\nimport type { ThreadState } from \"./Thread\";\n\nexport type ComposerState = BaseComposerState &\n Readonly<{\n isEditing: true;\n\n send: () => void;\n cancel: () => boolean;\n }>;\n\nexport const makeComposerStore = (\n useThread: StoreApi<ThreadState>,\n): UseBoundStore<StoreApi<ComposerState>> =>\n create<ComposerState>()((set, get, store) => {\n return {\n ...makeBaseComposer(set, get, store),\n\n isEditing: true,\n\n send: () => {\n const { setValue, value } = get();\n setValue(\"\");\n\n useThread.getState().append({\n parentId: useThread.getState().messages.at(-1)?.id ?? null,\n content: [{ type: \"text\", text: value }],\n });\n },\n cancel: () => {\n const thread = useThread.getState();\n if (!thread.isRunning) return false;\n\n useThread.getState().cancelRun();\n return true;\n },\n };\n });\n","import type { MutableRefObject } from \"react\";\nimport { create } from \"zustand\";\nimport type { AppendMessage, ThreadMessage } from \"../../utils/AssistantTypes\";\n\nexport type ThreadState = {\n messages: readonly ThreadMessage[];\n isRunning: boolean;\n\n getBranches: (messageId: string) => readonly string[];\n switchToBranch: (branchId: string) => void;\n\n append: (message: AppendMessage) => void;\n startRun: (parentId: string | null) => void;\n cancelRun: () => void;\n};\n\nexport const makeThreadStore = (runtimeRef: MutableRefObject<ThreadState>) => {\n const useThread = create<ThreadState>(() => ({\n messages: runtimeRef.current.messages,\n isRunning: runtimeRef.current.isRunning,\n getBranches: (messageId) => runtimeRef.current.getBranches(messageId),\n switchToBranch: (branchId) => runtimeRef.current.switchToBranch(branchId),\n startRun: (parentId) => runtimeRef.current.startRun(parentId),\n append: (message) => runtimeRef.current.append(message),\n cancelRun: () => runtimeRef.current.cancelRun(),\n }));\n\n const onRuntimeUpdate = () => {\n useThread.setState({\n messages: runtimeRef.current.messages,\n isRunning: runtimeRef.current.isRunning,\n });\n };\n\n return {\n useThread,\n onRuntimeUpdate,\n };\n};\n","\"use client\";\nimport { create } from \"zustand\";\nimport type { Unsubscribe } from \"../../utils/Unsubscribe\";\n\nexport type ThreadViewportState = {\n isAtBottom: boolean;\n scrollToBottom: () => void;\n onScrollToBottom: (callback: () => void) => Unsubscribe;\n};\n\nexport const makeThreadViewportStore = () => {\n const scrollToBottomListeners = new Set<() => void>();\n\n return create<ThreadViewportState>(() => ({\n isAtBottom: true,\n scrollToBottom: () => {\n for (const listener of scrollToBottomListeners) {\n listener();\n }\n },\n onScrollToBottom: (callback) => {\n scrollToBottomListeners.add(callback);\n return () => {\n scrollToBottomListeners.delete(callback);\n };\n },\n }));\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,mBAAmB;;;ACC5B,SAAS,eAAe;;;ACDxB,SAAS,4BAA4B;AAM9B,IAAM,sBAAsB,CACjC,WACG;AACH,QAAM,YAAY,CAAC,aAAsC;AACvD,UAAM,eAAe,OAAO,IAAI,CAAC,UAAU,MAAM,UAAU,QAAQ,CAAC;AACpE,WAAO,MAAM;AACX,iBAAW,SAAS,cAAc;AAChC,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,aAAwC;AAC9C,UAAM,cAAc,MAClB,SAAS,GAAI,OAAO,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC,CAAO;AAE5D,WAAO,qBAAqB,WAAW,aAAa,WAAW;AAAA,EACjE;AACF;;;ADhBO,IAAM,mBAAmB,CAC9B,QACA,aACM;AAEN,QAAM,cAAc,QAAQ,MAAM,oBAA0B,MAAM,GAAG,MAAM;AAC3E,SAAO,YAAY,QAAQ;AAC7B;;;AEZO,IAAM,iBAAiB,CAAC,YAA2B;AACxD,QAAM,YAAY,QAAQ,QAAQ;AAAA,IAChC,CAAC,SAAS,KAAK,SAAS;AAAA,EAC1B;AAEA,SAAO,UAAU,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,MAAM;AACvD;;;AHJO,IAAM,iBAAiB,CAAC,EAAE,iBAAiB,IAAK,MAAM;AAC3D,QAAM,EAAE,YAAY,YAAY,IAAI,kBAAkB;AAEtD,QAAM,qBAAqB;AAAA,IACzB,CAAC,YAAY,WAAW;AAAA,IACxB,CAAC,GAAG,MAAM;AACR,aAAO,EAAE,aAAa,EAAE,QAAQ,QAAQ,KAAK,CAACA,OAAMA,GAAE,SAAS,MAAM;AAAA,IACvE;AAAA,EACF;AAEA,QAAM,WAAW,YAAY,MAAM;AACjC,UAAM,EAAE,WAAW,OAAO,cAAc,IAAI,YAAY,SAAS;AACjE,UAAM,EAAE,SAAS,YAAY,IAAI,WAAW,SAAS;AAErD,UAAM,cAAc,YAAY,gBAAgB,eAAe,OAAO;AAEtE,cAAU,UAAU,UAAU,WAAW;AACzC,gBAAY,IAAI;AAChB,eAAW,MAAM,YAAY,KAAK,GAAG,cAAc;AAAA,EACrD,GAAG,CAAC,aAAa,YAAY,cAAc,CAAC;AAE5C,MAAI,CAAC,mBAAoB,QAAO;AAChC,SAAO;AACT;;;AI5BA,SAAS,eAAAC,oBAAmB;AAKrB,IAAM,mBAAmB,MAAM;AACpC,QAAM,EAAE,WAAW,YAAY,IAAI,iBAAiB;AACpD,QAAM,EAAE,WAAW,IAAI,kBAAkB;AAEzC,QAAM,WAAW;AAAA,IACf,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,QAAQ,SAAS;AAAA,EAC9C;AAEA,QAAM,WAAWC,aAAY,MAAM;AACjC,UAAM,EAAE,SAAS,IAAI,WAAW,SAAS;AACzC,cAAU,SAAS,EAAE,SAAS,QAAQ;AACtC,gBAAY,SAAS,EAAE,eAAe;AAAA,EACxC,GAAG,CAAC,YAAY,WAAW,WAAW,CAAC;AAEvC,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ACtBA,SAAS,eAAAC,oBAAmB;AAIrB,IAAM,sBAAsB,MAAM;AACvC,QAAM,EAAE,YAAY,YAAY,IAAI,kBAAkB;AAEtD,QAAM,WAAW;AAAA,IACf,CAAC,YAAY,WAAW;AAAA,IACxB,CAAC,GAAG,MAAM,EAAE,QAAQ,SAAS,UAAU,EAAE;AAAA,EAC3C;AAEA,QAAM,WAAWC,aAAY,MAAM;AACjC,UAAM,EAAE,KAAK,IAAI,YAAY,SAAS;AACtC,SAAK;AAAA,EACP,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ACnBA,SAAS,eAAAC,oBAAmB;AAKrB,IAAM,oBAAoB,MAAM;AACrC,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,QAAM,EAAE,YAAY,YAAY,IAAI,kBAAkB;AAEtD,QAAM,WAAW;AAAA,IACf,CAAC,YAAY,WAAW;AAAA,IACxB,CAAC,GAAG,MACF,EAAE,aAAa,EAAE,SAAS,QAAQ,EAAE,QAAQ,EAAE,IAAI,KAAK,EAAE,SAAS;AAAA,EACtE;AAEA,QAAM,WAAWC,aAAY,MAAM;AACjC,UAAM,EAAE,SAAS,SAAS,IAAI,WAAW,SAAS;AAClD,cACG,SAAS,EACT,eAAe,SAAS,SAAS,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAE;AAAA,EAC/D,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ACxBA,SAAS,eAAAC,oBAAmB;AAKrB,IAAM,wBAAwB,MAAM;AACzC,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,QAAM,EAAE,YAAY,YAAY,IAAI,kBAAkB;AAEtD,QAAM,WAAW;AAAA,IACf,CAAC,YAAY,WAAW;AAAA,IACxB,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,SAAS,QAAQ,EAAE,QAAQ,EAAE,KAAK;AAAA,EAC/D;AAEA,QAAM,WAAWC,aAAY,MAAM;AACjC,UAAM,EAAE,SAAS,SAAS,IAAI,WAAW,SAAS;AAClD,cACG,SAAS,EACT,eAAe,SAAS,SAAS,QAAQ,QAAQ,EAAE,IAAI,CAAC,CAAE;AAAA,EAC/D,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,MAAI,SAAU,QAAO;AACrB,SAAO;AACT;;;ACvBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA;AAAA,EAEE;AAAA,OACK;AACP,SAA0B,kBAAkB;AASjC;AAFJ,IAAM,aAAa;AAAA,EACxB,CAAC,OAAO,QAAQ;AACd,WAAO,oBAAC,UAAU,KAAV,EAAe,GAAG,OAAO,KAAU;AAAA,EAC7C;AACF;;;ACJA,IAAM,cAAc,CAAC,UAA8C;AACjE,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,SAAO,UAAU,CAAC,WAAW;AAC3B,QAAI,MAAM,UAAU,QAAQ,OAAO,SAAS,WAAW,EAAG,QAAO;AACjE,QAAI,MAAM,UAAU,SAAS,OAAO,SAAS,WAAW,EAAG,QAAO;AAClE,QAAI,MAAM,YAAY,QAAQ,CAAC,OAAO,UAAW,QAAO;AACxD,QAAI,MAAM,YAAY,SAAS,OAAO,UAAW,QAAO;AAExD,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,WAA8B,CAAC,EAAE,UAAU,GAAG,MAAM,MAAM;AACrE,QAAM,SAAS,YAAY,KAAK;AAChC,SAAO,SAAS,WAAW;AAC7B;;;AClBS,gBAAAC,YAAA;AADF,IAAM,cAAoC,CAAC,EAAE,SAAS,MAAM;AACjE,SAAO,gBAAAA,KAAC,YAAS,OAAK,MAAE,UAAS;AACnC;;;ACTA,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAChC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,aAAY,cAAc;;;ACPpD,SAAS,sBAAsB;AAC/B,SAAgC,iBAAiB;AAE1C,IAAM,qBAAqB,CAChC,KACA,aACG;AACH,QAAM,cAAc,eAAe,QAAQ;AAE3C,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACf,QAAI,CAAC,GAAI;AAET,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,kBAAY;AAAA,IACd,CAAC;AAED,UAAM,mBAAmB,IAAI,iBAAiB,CAAC,cAAc;AAC3D,iBAAW,YAAY,WAAW;AAChC,mBAAW,QAAQ,SAAS,YAAY;AACtC,cAAI,gBAAgB,SAAS;AAC3B,2BAAe,QAAQ,IAAI;AAAA,UAC7B;AAAA,QACF;AAEA,mBAAW,QAAQ,SAAS,cAAc;AACxC,cAAI,gBAAgB,SAAS;AAC3B,2BAAe,UAAU,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAEA,kBAAY;AAAA,IACd,CAAC;AAED,mBAAe,QAAQ,EAAE;AACzB,qBAAiB,QAAQ,IAAI,EAAE,WAAW,KAAK,CAAC;AAGhD,eAAW,SAAS,GAAG,UAAU;AAC/B,qBAAe,QAAQ,KAAK;AAAA,IAC9B;AAEA,WAAO,MAAM;AACX,qBAAe,WAAW;AAC1B,uBAAiB,WAAW;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,IAAI,SAAS,WAAW,CAAC;AAC/B;;;AChDA,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,aAAAC,kBAAiB;AAGnB,IAAM,sBAAsB,CAAC,aAAyB;AAC3D,QAAM,cAAcC,gBAAe,QAAQ;AAE3C,QAAM,EAAE,YAAY,IAAI,iBAAiB;AACzC,EAAAC,WAAU,MAAM;AACd,WAAO,YAAY,SAAS,EAAE,iBAAiB,MAAM;AACnD,kBAAY;AAAA,IACd,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,WAAW,CAAC;AAC/B;;;AFgEI,SAME,OAAAC,MANF;AA1DG,IAAM,iBAAiBC,YAG5B,CAAC,EAAE,aAAa,MAAM,UAAU,UAAU,GAAG,KAAK,GAAG,iBAAiB;AACtE,QAAM,iBAAiB,OAAuB,IAAI;AAElD,QAAM,SAAS,OAAuB,IAAI;AAC1C,QAAM,MAAM,gBAAgB,cAAc,MAAM;AAEhD,QAAM,EAAE,YAAY,IAAI,iBAAiB;AAIzC,QAAM,iBAAiB,OAAO,IAAI;AAClC,QAAM,yBAAyB,OAAO,KAAK;AAC3C,QAAM,gBAAgB,OAAe,CAAC;AAEtC,QAAM,iBAAiB,MAAM;AAC3B,UAAM,MAAM,eAAe;AAC3B,QAAI,CAAC,OAAO,CAAC,WAAY;AAEzB,UAAM,WAAW,eAAe,UAAU,YAAY;AACtD,mBAAe,UAAU;AAEzB,2BAAuB,UAAU;AACjC,QAAI,eAAe,EAAE,SAAS,CAAC;AAAA,EACjC;AAEA,qBAAmB,QAAQ,MAAM;AAC/B,QAAI,CAAC,uBAAuB,WAAW,CAAC,YAAY,SAAS,EAAE,YAAY;AACzE,mBAAa;AAAA,IACf,OAAO;AACL,qBAAe;AAAA,IACjB;AAAA,EACF,CAAC;AAED,sBAAoB,MAAM;AACxB,mBAAe;AAAA,EACjB,CAAC;AAED,QAAM,eAAe,MAAM;AACzB,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAK;AAEV,UAAM,aAAa,YAAY,SAAS,EAAE;AAC1C,UAAM,gBAAgB,IAAI,eAAe,IAAI,aAAa,IAAI;AAE9D,QAAI,CAAC,iBAAiB,cAAc,UAAU,IAAI,WAAW;AAAA,IAE7D,WAAW,kBAAkB,YAAY;AACvC,6BAAuB,UAAU;AACjC,kBAAY,SAAS,EAAE,YAAY,cAAc,CAAC;AAAA,IACpD;AAEA,kBAAc,UAAU,IAAI;AAAA,EAC9B;AAEA,SACE;AAAA,IAACC,WAAU;AAAA,IAAV;AAAA,MACE,GAAG;AAAA,MACJ,UAAU,qBAAqB,UAAU,YAAY;AAAA,MACrD;AAAA,MAEC;AAAA;AAAA,QACD,gBAAAF,KAAC,SAAI,KAAK,gBAAgB;AAAA;AAAA;AAAA,EAC5B;AAEJ,CAAC;;;AGrFD,SAA0C,aAAAG,YAAW,gBAAgB;AACrE,SAAS,UAAAC,eAAc;;;ACHvB,SAA4C,cAAc;;;ACOnD,IAAM,mBAKT,CAAC,SAAS;AAAA,EACZ,OAAO;AAAA,EACP,UAAU,CAAC,UAAU;AACnB,QAAI,EAAE,MAAM,CAAC;AAAA,EACf;AACF;;;ADLO,IAAM,wBAAwB,CAAC;AAAA,EACpC;AAAA,EACA;AACF,MAIE,OAA0B,EAAE,CAAC,KAAK,KAAK,WAAW;AAAA,EAChD,GAAG,iBAAiB,KAAK,KAAK,KAAK;AAAA,EAEnC,WAAW;AAAA,EAEX,MAAM,MAAM;AACV,UAAM,QAAQ,OAAO;AACrB,QAAI,EAAE,WAAW,MAAM,MAAM,CAAC;AAAA,EAChC;AAAA,EACA,MAAM,MAAM;AACV,UAAM,QAAQ,IAAI,EAAE;AACpB,QAAI,EAAE,WAAW,MAAM,CAAC;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,QAAQ,MAAM;AACZ,QAAI,CAAC,IAAI,EAAE,UAAW,QAAO;AAC7B,QAAI,EAAE,WAAW,MAAM,CAAC;AACxB,WAAO;AAAA,EACT;AACF,EAAE;;;AD6FA,gBAAAC,YAAA;AA/GJ,IAAM,YAAY,CAAC,QAAqB,YAA2B;AACjE,SAAO,OAAO,SAAS,OAAO,SAAS,SAAS,CAAC,GAAG,OAAO,QAAQ;AACrE;AAEA,IAAM,cAAc,CAClB,QACA,YACA,iBACG;AACH,QAAM,WAAW,OAAO,SAAS,eAAe,CAAC,GAAG,MAAM;AAC1D,QAAM,UAAU,OAAO,SAAS,YAAY;AAG5C,MAAI,CAAC,QAAS;AAEd,QAAM,SAAS,UAAU,QAAQ,OAAO;AACxC,QAAM,WAAW,OAAO,YAAY,QAAQ,EAAE;AAG9C,QAAM,eAAe,WAAW,SAAS;AACzC,MACE,aAAa,YAAY,WACzB,aAAa,aAAa,YAC1B,aAAa,aAAa,YAC1B,aAAa,WAAW;AAExB;AAGF,aAAW,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAMC,qBAAoB,CAAC,iBAAyB;AAClD,QAAM,EAAE,UAAU,IAAI,iBAAiB;AAEvC,QAAM,CAAC,OAAO,IAAI,SAA8B,MAAM;AACpD,UAAM,aAAaC,QAAqB,CAAC,SAAS;AAAA,MAChD,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,MACR,qBAAqB;AAAA,MACrB,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,wBAAwB,CAAC,UAAU;AACjC,YAAI,EAAE,qBAAqB,MAAM,CAAC;AAAA,MACpC;AAAA,MACA,aAAa,CAAC,UAAU;AACtB,YAAI,EAAE,UAAU,MAAM,CAAC;AAAA,MACzB;AAAA,MACA,eAAe,CAAC,UAAU;AACxB,YAAI,EAAE,YAAY,MAAM,CAAC;AAAA,MAC3B;AAAA,IACF,EAAE;AAEF,UAAM,cAAc,sBAAsB;AAAA,MACxC,QAAQ,MAAM;AACZ,cAAM,UAAU,WAAW,SAAS,EAAE;AACtC,YAAI,QAAQ,SAAS;AACnB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAEF,cAAM,OAAO,eAAe,OAAO;AAEnC,eAAO;AAAA,MACT;AAAA,MACA,QAAQ,CAAC,SAAS;AAChB,cAAM,EAAE,SAAS,SAAS,IAAI,WAAW,SAAS;AAClD,YAAI,QAAQ,SAAS;AACnB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAEF,cAAM,eAAe,QAAQ,QAAQ;AAAA,UACnC,CAAC,SACC,KAAK,SAAS,UAAU,KAAK,SAAS;AAAA,QAC1C;AACA,kBAAU,SAAS,EAAE,OAAO;AAAA,UAC1B;AAAA,UACA,SAAS,CAAC,EAAE,MAAM,QAAQ,KAAK,GAAG,GAAG,YAAY;AAAA,QACnD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,gBAAY,UAAU,SAAS,GAAG,YAAY,YAAY;AAE1D,WAAO,EAAE,YAAY,YAAY;AAAA,EACnC,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,WAAO,UAAU,UAAU,CAAC,WAAW;AACrC,kBAAY,QAAQ,QAAQ,YAAY,YAAY;AAAA,IACtD,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,WAAW,YAAY,CAAC;AAErC,SAAO;AACT;AAEO,IAAM,kBAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AACF,MAAM;AACJ,QAAM,UAAUF,mBAAkB,YAAY;AAE9C,SACE,gBAAAD,KAAC,eAAe,UAAf,EAAwB,OAAO,SAC7B,UACH;AAEJ;;;AG3HA,IAAM,gBAAgB,CAAC,UAAgD;AACrE,QAAM,EAAE,YAAY,IAAI,mBAAmB;AAC3C,SAAO,YAAY,CAAC,aAAa;AAC/B,QAAI,MAAM,YAAY,QAAQ,CAAC,SAAS,UAAW,QAAO;AAC1D,QAAI,MAAM,YAAY,SAAS,SAAS,UAAW,QAAO;AAE1D,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,aAAkC,CAAC,EAAE,UAAU,GAAG,MAAM,MAAM;AACzE,QAAM,SAAS,cAAc,KAAK;AAClC,SAAO,SAAS,WAAW;AAC7B;;;ACPO,IAAM,eAAe,CAAC,UAA+C;AAC1E,QAAM,EAAE,WAAW,IAAI,kBAAkB;AAEzC,SAAO,WAAW,CAAC,EAAE,SAAS,UAAU,QAAQ,UAAU,WAAW,MAAM;AACzE,QAAI,MAAM,gBAAgB,QAAQ,SAAS,SAAS,EAAG,QAAO;AAE9D,QAAI,MAAM,QAAQ,QAAQ,SAAS,OAAQ,QAAO;AAClD,QAAI,MAAM,aAAa,QAAQ,SAAS,YAAa,QAAO;AAE5D,QAAI,MAAM,gBAAgB,QAAQ,CAAC,cAAc,CAAC,OAAQ,QAAO;AAEjE,QAAI,MAAM,WAAW,QAAQ,CAAC,SAAU,QAAO;AAC/C,QAAI,MAAM,WAAW,SAAS,SAAU,QAAO;AAE/C,WAAO;AAAA,EACT,CAAC;AACH;AAEO,IAAM,YAAgC,CAAC,EAAE,UAAU,GAAG,MAAM,MAAM;AACvE,QAAM,SAAS,aAAa,KAAK;AACjC,SAAO,SAAS,WAAW;AAC7B;;;ACQI,mBAWY,OAAAI,MAFJ,QAAAC,aATR;AAvBJ,IAAM,gBAAgB,CAAC,eAAkD;AACvE,SAAO;AAAA,IACL,cACE,WAAW,gBACX,WAAW,eACV,WAAW;AAAA,IACd,aACE,WAAW,eAAgB,WAAW;AAAA,IACxC,kBACE,WAAW,oBAAqB,WAAW;AAAA,EAC/C;AACF;AAEO,IAAM,iBAA0C,CAAC,EAAE,WAAW,MAAM;AACzE,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,QAAM,iBAAiB,UAAU,CAAC,MAAM,EAAE,SAAS,MAAM;AAEzD,QAAM,EAAE,aAAa,cAAc,iBAAiB,IAClD,cAAc,UAAU;AAE1B,MAAI,mBAAmB,EAAG,QAAO;AAEjC,SACE,gBAAAD,KAAA,YACG,cAAI,MAAM,cAAc,EAAE,KAAK,IAAI,EAAE,IAAI,CAAC,GAAG,QAAQ;AACpD,UAAM,eAAe;AAErB,WACE,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QAEA;AAAA,0BAAAA,MAAC,aAAU,MAAI,MACb;AAAA,4BAAAD,KAAC,cAAW,SAAS,OACnB,0BAAAA,KAAC,eAAY,GACf;AAAA,YACA,gBAAAA,KAAC,cAAW,SAAO,MACjB,0BAAAA,KAAC,gBAAa,GAChB;AAAA,aACF;AAAA,UACA,gBAAAA,KAAC,aAAU,WAAS,MAClB,0BAAAA,KAAC,oBAAiB,GACpB;AAAA;AAAA;AAAA,MAbK;AAAA,IAcP;AAAA,EAEJ,CAAC,GACH;AAEJ;;;ACtEA,SAAS,wBAAAE,6BAA4B;AACrC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,mBAAkB;AAoBxC,gBAAAC,YAAA;AAZG,IAAM,uBAAuBC,YAGlC,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ;AAC/B,QAAM,EAAE,YAAY,IAAI,iBAAiB;AAEzC,QAAM,aAAa,YAAY,CAAC,MAAM,EAAE,UAAU;AAClD,QAAM,uBAAuB,MAAM;AACjC,gBAAY,SAAS,EAAE,eAAe;AAAA,EACxC;AAEA,SACE,gBAAAD;AAAA,IAACE,WAAU;AAAA,IAAV;AAAA,MACE,GAAG;AAAA,MACJ,UAAU;AAAA,MACV;AAAA,MACA,SAASC,sBAAqB,SAAS,oBAAoB;AAAA;AAAA,EAC7D;AAEJ,CAAC;;;AChCD,SAAS,wBAAAC,6BAA4B;AACrC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,mBAAkB;AA8BxC,gBAAAC,YAAA;AAlBG,IAAM,mBAAmBC,YAG9B,CAAC,EAAE,SAAS,QAAQ,QAAQ,UAAU,MAAM,GAAG,KAAK,GAAG,QAAQ;AAC/D,QAAM,EAAE,WAAW,YAAY,IAAI,iBAAiB;AAEpD,QAAM,aAAa,UAAU,CAAC,MAAM,EAAE,SAAS;AAC/C,QAAM,wBAAwB,MAAM;AAClC,UAAM,SAAS,UAAU,SAAS;AAClC,UAAM,WAAW,YAAY,SAAS;AACtC,aAAS,SAAS,MAAM;AAExB,QAAI,QAAQ,CAAC,OAAO,WAAW;AAC7B,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,SACE,gBAAAD;AAAA,IAACE,WAAU;AAAA,IAAV;AAAA,MACE,GAAG;AAAA,MACJ,UAAU;AAAA,MACV;AAAA,MACA,SAASC,sBAAqB,SAAS,qBAAqB;AAAA;AAAA,EAC9D;AAEJ,CAAC;;;AC5CD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,wBAAAC,6BAA4B;AACrC,SAAS,mBAAAC,wBAAuB;AAChC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0C,cAAAC,aAAY,UAAAC,eAAc;AA4B9D,gBAAAC,YAAA;AAnBC,IAAM,eAAeC;AAAA,EAC1B,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,iBAAiB;AACvC,UAAM,EAAE,YAAY,IAAI,iBAAiB;AACzC,UAAM,EAAE,YAAY,IAAI,mBAAmB;AAE3C,UAAM,UAAUC,QAAwB,IAAI;AAC5C,UAAM,MAAMC,iBAAgB,cAAc,OAAO;AAEjD,UAAM,eAAe,CAAC,MAAiB;AACrC,YAAM,gBAAgB,YAAY,SAAS;AAC3C,UAAI,CAAC,cAAc,UAAW;AAE9B,QAAE,eAAe;AACjB,oBAAc,KAAK;AAEnB,kBAAY,SAAS,EAAE,eAAe;AAAA,IACxC;AAEA,WACE,gBAAAH;AAAA,MAACI,WAAU;AAAA,MAAV;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA,UAAUC,sBAAqB,UAAU,YAAY;AAAA;AAAA,IACvD;AAAA,EAEJ;AACF;;;ACzCA,SAAS,wBAAAC,6BAA4B;AACrC,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,YAAY;AACrB;AAAA,EAEE,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,OACK;AACP,OAAO,sBAEA;AAsED,gBAAAC,YAAA;AA7DC,IAAM,gBAAgBC;AAAA,EAI3B,CACE,EAAE,YAAY,OAAO,SAAS,UAAU,UAAU,WAAW,GAAG,KAAK,GACrE,iBACG;AACH,UAAM,EAAE,WAAW,YAAY,IAAI,iBAAiB;AACpD,UAAM,EAAE,aAAa,KAAK,IAAI,mBAAmB;AAEjD,UAAM,QAAQ,YAAY,CAAC,MAAM;AAC/B,UAAI,CAAC,EAAE,UAAW,QAAO;AACzB,aAAO,EAAE;AAAA,IACX,CAAC;AAED,UAAM,YAAY,UAAU,OAAO;AAEnC,UAAM,iBAAiB,CAAC,MAAqB;AAC3C,UAAI,SAAU;AAEd,YAAM,WAAW,YAAY,SAAS;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,YAAI,YAAY,SAAS,EAAE,OAAO,GAAG;AACnC,YAAE,eAAe;AAAA,QACnB;AAAA,MACF,WAAW,EAAE,QAAQ,WAAW,EAAE,aAAa,OAAO;AACpD,cAAM,YAAY,UAAU,SAAS,EAAE;AACvC,YAAI,CAAC,WAAW;AACd,YAAE,eAAe;AACjB,mBAAS,KAAK;AAEd,sBAAY,SAAS,EAAE,eAAe;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAcC,QAA4B,IAAI;AACpD,UAAM,MAAMC,iBAAgB,cAAc,WAAW;AAErD,UAAM,mBAAmB,aAAa,CAAC;AACvC,UAAM,QAAQC,aAAY,MAAM;AAC9B,YAAM,WAAW,YAAY;AAC7B,UAAI,CAAC,YAAY,CAAC,iBAAkB;AAEpC,eAAS,MAAM;AACf,eAAS;AAAA,QACP,YAAY,QAAQ,MAAM;AAAA,QAC1B,YAAY,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF,GAAG,CAAC,gBAAgB,CAAC;AAErB,IAAAC,WAAU,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC;AAEhC,wBAAoB,MAAM;AACxB,UAAI,SAAS,OAAO;AAClB,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAED,WACE,gBAAAL;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ;AAAA,QACA;AAAA,QACA,UAAUM,sBAAqB,UAAU,CAAC,MAAM;AAC9C,gBAAM,gBAAgB,YAAY,SAAS;AAC3C,cAAI,CAAC,cAAc,UAAW;AAC9B,iBAAO,cAAc,SAAS,EAAE,OAAO,KAAK;AAAA,QAC9C,CAAC;AAAA,QACD,WAAWA,sBAAqB,WAAW,cAAc;AAAA;AAAA,IAC3D;AAAA,EAEJ;AACF;;;AChGA;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,mBAAkB;AActC,gBAAAC,aAAA;AANC,IAAM,eAAeC;AAAA,EAC1B,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,QAAQ;AAC9B,UAAM,EAAE,YAAY,IAAI,mBAAmB;AAC3C,UAAM,WAAW,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErE,WACE,gBAAAD;AAAA,MAACE,WAAU;AAAA,MAAV;AAAA,QACC,MAAK;AAAA,QACJ,GAAG;AAAA,QACJ;AAAA,QACA,UAAU,YAAY,CAAC;AAAA;AAAA,IACzB;AAAA,EAEJ;AACF;;;AC1BA,SAAS,wBAAAC,6BAA4B;AACrC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,mBAAkB;AAmBxC,gBAAAC,aAAA;AAXG,IAAM,iBAAiBC,YAG5B,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ;AAC/B,QAAM,EAAE,YAAY,IAAI,mBAAmB;AAE3C,QAAM,eAAe,MAAM;AACzB,gBAAY,SAAS,EAAE,OAAO;AAAA,EAChC;AAEA,SACE,gBAAAD;AAAA,IAACE,WAAU;AAAA,IAAV;AAAA,MACC,MAAK;AAAA,MACJ,GAAG;AAAA,MACJ;AAAA,MACA,SAASC,sBAAqB,SAAS,YAAY;AAAA;AAAA,EACrD;AAEJ,CAAC;;;ACjCD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,wBAAAC,6BAA4B;AACrC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,mBAAkB;AAqBtC,gBAAAC,aAAA;AAbC,IAAM,cAAcC;AAAA,EACzB,CAAC,EAAE,cAAc,cAAc,GAAG,KAAK,GAAG,QAAQ;AAChD,UAAM,EAAE,WAAW,IAAI,kBAAkB;AACzC,UAAM,gBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa;AAEvD,UAAM,mBAAmB,MAAM;AAC7B,oBAAc,IAAI;AAAA,IACpB;AACA,UAAM,mBAAmB,MAAM;AAC7B,oBAAc,KAAK;AAAA,IACrB;AAEA,WACE,gBAAAD;AAAA,MAACE,WAAU;AAAA,MAAV;AAAA,QACE,GAAG;AAAA,QACJ;AAAA,QACA,cAAcC,sBAAqB,cAAc,gBAAgB;AAAA,QACjE,cAAcA,sBAAqB,cAAc,gBAAgB;AAAA;AAAA,IACnE;AAAA,EAEJ;AACF;;;AClCA,SAA0C,aAAAC,YAAW,YAAAC,iBAAgB;AACrE,SAAS,UAAAC,eAAc;AAwDnB,gBAAAC,aAAA;AA7CJ,IAAM,kBAAkB,CACtB,EAAE,QAAQ,GACV,gBACA,cACG;AACH,QAAM,OAAO,QAAQ,QAAQ,SAAS;AAEtC,MAAI,CAAC,KAAM;AAEX,QAAM,gBAAgB,QAAQ,SAAS,cAAc,QAAQ,SAAS;AACtE,QAAM,SACJ,cAAc,QAAQ,QAAQ,SAAS,IAAI,gBAAgB;AAE7D,iBAAe,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1C;AAEA,IAAMC,yBAAwB,CAAC,cAAsB;AACnD,QAAM,EAAE,WAAW,IAAI,kBAAkB;AACzC,QAAM,CAAC,OAAO,IAAIC,UAAkC,MAAM;AACxD,UAAM,iBAAiBC,QAAyB,OAAO;AAAA,MACrD,MAAM,EAAE,MAAM,QAAQ,MAAM,GAAG;AAAA,MAC/B,QAAQ;AAAA,IACV,EAAE;AAEF,oBAAgB,WAAW,SAAS,GAAG,gBAAgB,SAAS;AAEhE,WAAO,EAAE,eAAe;AAAA,EAC1B,CAAC;AAED,EAAAC,WAAU,MAAM;AACd,WAAO,WAAW,UAAU,CAAC,YAAY;AACvC,sBAAgB,SAAS,QAAQ,gBAAgB,SAAS;AAAA,IAC5D,CAAC;AAAA,EACH,GAAG,CAAC,SAAS,YAAY,SAAS,CAAC;AAEnC,SAAO;AACT;AAEO,IAAM,sBAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,UAAUH,uBAAsB,SAAS;AAE/C,SACE,gBAAAD,MAAC,mBAAmB,UAAnB,EAA4B,OAAO,SACjC,UACH;AAEJ;;;AC1DO,IAAM,iCAAqC,MAAM;AACtD,QAAM,EAAE,WAAW,IAAI,kBAAkB;AACzC,QAAM,EAAE,eAAe,IAAI,sBAAsB;AAEjD,QAAM,YAAY;AAAA,IAAiB,CAAC,YAAY,cAAc;AAAA,IAAG,CAAC,GAAG,MACnE,EAAE,WAAW,gBAAgB,EAAE,sBAAsB;AAAA,EACvD;AACA,SAAO;AACT;;;ACcI,qBAAAK,WAEE,OAAAC,OAFF,QAAAC,aAAA;AAFJ,IAAM,oBAAoB;AAAA,EACxB,MAAM,CAAC,EAAE,KAAK,MACZ,gBAAAA,MAAAF,WAAA,EACG;AAAA,SAAK;AAAA,IACN,gBAAAC,MAAC,kCAA+B;AAAA,KAClC;AAAA,EAEF,OAAO,MAAM;AAAA,EACb,IAAI,CAAC,EAAE,KAAK,MAAM,KAAK;AAAA,EACvB,OAAO;AAAA,IACL,UAAU,MAAM;AAAA,EAClB;AACF;AAEO,IAAM,iBAA0C,CAAC;AAAA,EACtD,YAAY;AAAA,IACV,OAAO,kBAAkB;AAAA,IACzB,QAAQ,kBAAkB;AAAA,IAC1B,KAAK,kBAAkB;AAAA,IACvB,OAAO,EAAE,UAAU,CAAC,GAAG,WAAW,kBAAkB,MAAM,SAAS,IAAI,CAAC;AAAA,EAC1E,IAAI,CAAC;AACP,MAAM;AACJ,QAAM,EAAE,WAAW,IAAI,kBAAkB;AAEzC,QAAM,UAAU,WAAW,CAAC,MAAM,EAAE,OAAO;AAC3C,QAAM,UAAU,QAAQ;AAExB,SACE,gBAAAA,MAAAD,WAAA,EACG,kBAAQ,IAAI,CAAC,MAAM,MAAM;AACxB,UAAM,YAAY;AAElB,UAAM,OAAO,KAAK;AAClB,QAAI,YAA8B;AAClC,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,oBAAY,gBAAAC,MAAC,QAAK,MAAY;AAC9B;AAAA,MAEF,KAAK;AACH,oBAAY,gBAAAA,MAAC,SAAM,MAAY;AAC/B;AAAA,MACF,KAAK;AACH,oBAAY,gBAAAA,MAAC,MAAG,MAAY;AAC5B;AAAA,MACF,KAAK,aAAa;AAChB,cAAM,OAAO,QAAQ,KAAK,IAAI,KAAK;AACnC,oBAAY,gBAAAA,MAAC,QAAK,MAAY;AAC9B;AAAA,MACF;AAAA,MACA;AACE,cAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,IACxD;AAEA,WACE,gBAAAA,MAAC,uBAAoC,WAClC,uBADuB,SAE1B;AAAA,EAEJ,CAAC,GACH;AAEJ;;;ACrFA;AAAA,EAEE,aAAAE;AAAA,OACK;AACP,SAA0B,cAAAC,cAAY,WAAAC,gBAAe;AAiBvB,gBAAAC,aAAA;AATvB,IAAM,oBAAoBC,aAG/B,CAAC,OAAO,QAAQ;AAChB,QAAM,EAAE,WAAW,IAAI,kBAAkB;AAEzC,EAAAC,SAAQ,MAAM;AACZ,eACG,SAAS,EACT,uBAAuB,gBAAAF,MAACG,WAAU,MAAV,EAAgB,GAAG,OAAO,KAAU,CAAE;AAAA,EACnE,GAAG,CAAC,YAAY,OAAO,GAAG,CAAC;AAE3B,SAAO;AACT,CAAC;;;AC3BD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,wBAAAC,6BAA4B;AACrC;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,oBAAkB;AAepC,gBAAAC,aAAA;AAXD,IAAM,qBAAqB,CAChC,oBACG;AAIH,SAAOD;AAAA,IACL,CAAC,OAAO,iBAAiB;AACvB,YAAM,UAAU,gBAAgB,KAAK;AAErC,aACE,gBAAAC;AAAA,QAACF,YAAU;AAAA,QAAV;AAAA,UACC,MAAK;AAAA,UACL,UAAU,CAAC;AAAA,UACV,GAAG;AAAA,UACJ,KAAK;AAAA,UACL,SAASD,sBAAqB,MAAM,SAAS,WAAW,MAAS;AAAA;AAAA,MACnE;AAAA,IAEJ;AAAA,EACF;AACF;;;AC3BO,IAAM,mBAAmB,mBAAmB,iBAAiB;;;ACA7D,IAAM,uBAAuB,mBAAmB,qBAAqB;;;ACGnE,qBAAAI,WAAA,OAAAC,aAAA;AAHF,IAAM,oBAAwB,MAAM;AACzC,QAAM,EAAE,WAAW,IAAI,kBAAkB;AACzC,QAAM,cAAc,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM;AACvD,SAAO,gBAAAA,MAAAD,WAAA,EAAG,uBAAY;AACxB;;;ACDS,qBAAAE,WAAA,OAAAC,aAAA;AAHF,IAAM,qBAAyB,MAAM;AAC1C,QAAM,EAAE,WAAW,IAAI,kBAAkB;AACzC,QAAM,YAAY,WAAW,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACpE,SAAO,gBAAAA,MAAAD,WAAA,EAAG,sBAAY,GAAE;AAC1B;;;ACPA;AAAA,EAEE,aAAAE;AAAA,OACK;AACP,SAA0B,cAAAC,oBAAkB;AAgBtC,gBAAAC,aAAA;AANC,IAAM,mBAAmBC,aAG9B,CAAC,EAAE,sBAAsB,GAAG,KAAK,GAAG,QAAQ;AAC5C,SACE,gBAAAD,MAAC,aAAG,aAAa,uBAAuB,OAAO,QAC7C,0BAAAA,MAACE,YAAU,KAAV,EAAe,GAAG,MAAM,KAAU,GACrC;AAEJ,CAAC;;;ACzBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA;AAAA,EAEE,aAAAC;AAAA,OACK;AACP,SAA0B,cAAAC,oBAAkB;AAuDxC,gBAAAC,aAAA;AAnCG,IAAM,gBAAgBC,aAG3B,CAAC,EAAE,iBAAiB,UAAU,eAAe,GAAG,KAAK,GAAG,QAAQ;AAChE,QAAM,EAAE,UAAU,IAAI,iBAAiB;AACvC,QAAM,EAAE,WAAW,IAAI,kBAAkB;AAEzC,QAAM,qBAAqB;AAAA,IACzB,CAAC,WAAW,UAAU;AAAA,IACtB,CAAC,GAAG,MAAM;AACR,UAAI,mBAAmB,EAAE,UAAW,QAAO;AAE3C,YAAM,kBACJ,aAAa,YAAa,aAAa,cAAc,CAAC,EAAE;AAG1D,UAAI,CAAC,gBAAiB,QAAO;AAG7B,UAAI,CAAC,EAAE,WAAY,QAAO;AAG1B,UACE,kBAAkB,YACjB,kBAAkB,mBAAmB,EAAE,SAAS,UAAU;AAE3D,eAAO;AAET,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,uBAAuB,sBAA2B,QAAO;AAE7D,SACE,gBAAAC;AAAA,IAACC,YAAU;AAAA,IAAV;AAAA,MACC,iBAAe,uBAAuB;AAAA,MACrC,GAAG;AAAA,MACJ;AAAA;AAAA,EACF;AAEJ,CAAC;;;AC1DM,IAAM,gBACX,mBAAuC,cAAc;;;ACLhD,IAAM,kBAAkB,mBAAmB,gBAAgB;;;ACA3D,IAAM,gBAAgB,mBAAmB,mBAAmB;;;ACLnE;AAAA;AAAA;AAAA;;;ACCA,SAAS,YAAY;;;ACArB,SAAS,aAAAC,YAAW,sBAAAC,qBAAoB,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACChE,SAAS,UAAAC,eAAc;AAShB,IAAM,gCAAgC,MAC3CC,QAAkC,MAAM;AACtC,QAAM,QAAQ,IAAI,oBAAoB;AAEtC,SAAO;AAAA,IACL,gBAAgB,MAAM;AACpB,aAAO,MAAM,eAAe;AAAA,IAC9B;AAAA,IACA,6BAA6B,CAAC,aAAkC;AAC9D,aAAO,MAAM,4BAA4B,QAAQ;AAAA,IACnD;AAAA,EACF;AACF,CAAC;;;ACtBH,SAAS,aAAAC,YAAW,oBAAoB,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACDhE,SAA4C,UAAAC,eAAc;AAYnD,IAAM,oBAAoB,CAC/B,cAEAC,QAAsB,EAAE,CAAC,KAAK,KAAK,UAAU;AAC3C,SAAO;AAAA,IACL,GAAG,iBAAiB,KAAK,KAAK,KAAK;AAAA,IAEnC,WAAW;AAAA,IAEX,MAAM,MAAM;AACV,YAAM,EAAE,UAAU,MAAM,IAAI,IAAI;AAChC,eAAS,EAAE;AAEX,gBAAU,SAAS,EAAE,OAAO;AAAA,QAC1B,UAAU,UAAU,SAAS,EAAE,SAAS,GAAG,EAAE,GAAG,MAAM;AAAA,QACtD,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,MAAM;AACZ,YAAM,SAAS,UAAU,SAAS;AAClC,UAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,gBAAU,SAAS,EAAE,UAAU;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AACF,CAAC;;;ACrCH,SAAS,UAAAC,eAAc;AAehB,IAAM,kBAAkB,CAAC,eAA8C;AAC5E,QAAM,YAAYA,QAAoB,OAAO;AAAA,IAC3C,UAAU,WAAW,QAAQ;AAAA,IAC7B,WAAW,WAAW,QAAQ;AAAA,IAC9B,aAAa,CAAC,cAAc,WAAW,QAAQ,YAAY,SAAS;AAAA,IACpE,gBAAgB,CAAC,aAAa,WAAW,QAAQ,eAAe,QAAQ;AAAA,IACxE,UAAU,CAAC,aAAa,WAAW,QAAQ,SAAS,QAAQ;AAAA,IAC5D,QAAQ,CAAC,YAAY,WAAW,QAAQ,OAAO,OAAO;AAAA,IACtD,WAAW,MAAM,WAAW,QAAQ,UAAU;AAAA,EAChD,EAAE;AAEF,QAAM,kBAAkB,MAAM;AAC5B,cAAU,SAAS;AAAA,MACjB,UAAU,WAAW,QAAQ;AAAA,MAC7B,WAAW,WAAW,QAAQ;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;;;ACrCA,SAAS,UAAAC,eAAc;AAShB,IAAM,0BAA0B,MAAM;AAC3C,QAAM,0BAA0B,oBAAI,IAAgB;AAEpD,SAAOA,QAA4B,OAAO;AAAA,IACxC,YAAY;AAAA,IACZ,gBAAgB,MAAM;AACpB,iBAAW,YAAY,yBAAyB;AAC9C,iBAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,kBAAkB,CAAC,aAAa;AAC9B,8BAAwB,IAAI,QAAQ;AACpC,aAAO,MAAM;AACX,gCAAwB,OAAO,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,EACF,EAAE;AACJ;;;AHuBI,SAC0B,OAAAC,OAD1B,QAAAC,aAAA;AApCG,IAAM,iBAA6D,CAAC;AAAA,EACzE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAaC,QAAO,OAAO;AACjC,qBAAmB,MAAM;AACvB,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,QAAM,CAAC,EAAE,SAAS,gBAAgB,CAAC,IAAIC,UAAS,MAAM;AACpD,UAAM,EAAE,WAAW,iBAAAC,iBAAgB,IAAI,gBAAgB,UAAU;AACjE,UAAM,cAAc,wBAAwB;AAC5C,UAAM,cAAc,kBAAkB,SAAS;AAE/C,WAAO;AAAA,MACL,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,iBAAAA;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAAC,WAAU,MAAM;AAEd,oBAAgB;AAGhB,WAAO,QAAQ,UAAU,eAAe;AAAA,EAC1C,GAAG,CAAC,iBAAiB,OAAO,CAAC;AAE7B,QAAM,sBAAuB,QAC1B;AAEH,SACE,gBAAAJ,MAAC,cAAc,UAAd,EAAuB,OAAO,SAC5B;AAAA,2BAAuB,gBAAAD,MAAC,uBAAoB;AAAA,IAC5C;AAAA,KACH;AAEJ;;;AFvBM,gBAAAM,aAAA;AArBC,IAAM,oBAET,CAAC,EAAE,UAAU,QAAQ,MAAM;AAC7B,QAAM,aAAaC,QAAO,OAAO;AACjC,EAAAC,oBAAmB,MAAM;AACvB,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,QAAM,CAAC,OAAO,IAAIC,UAAS,MAAM;AAC/B,UAAM,iBAAiB,8BAA8B;AAErD,WAAO,EAAE,eAAe;AAAA,EAC1B,CAAC;AAED,QAAM,iBAAiB,QAAQ,eAAe,CAAC,MAAM,EAAE,cAAc;AACrE,EAAAC,WAAU,MAAM;AACd,WAAO,QAAQ,4BAA4B,cAAc;AAAA,EAC3D,GAAG,CAAC,SAAS,cAAc,CAAC;AAE5B,SACE,gBAAAJ,MAAC,iBAAiB,UAAjB,EAA0B,OAAO,SAChC,0BAAAA,MAAC,kBAAe,SAAmB,UAAS,GAC9C;AAEJ;;;ADvBS,gBAAAK,aAAA;AAHT,IAAM,+BAEF,CAAC,EAAE,UAAU,QAAQ,MAAM;AAC7B,SAAO,gBAAAA,MAAC,qBAAkB,SAAmB,UAAS;AACxD;AAEO,IAAM,2BAA2B,KAAK,4BAA4B;","names":["c","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","useCallback","jsx","Primitive","forwardRef","useCallbackRef","useEffect","useCallbackRef","useEffect","jsx","forwardRef","Primitive","useEffect","create","jsx","useMessageContext","create","useEffect","jsx","jsxs","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","composeEventHandlers","useComposedRefs","Primitive","forwardRef","useRef","jsx","forwardRef","useRef","useComposedRefs","Primitive","composeEventHandlers","composeEventHandlers","useComposedRefs","forwardRef","useCallback","useEffect","useRef","jsx","forwardRef","useRef","useComposedRefs","useCallback","useEffect","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","composeEventHandlers","Primitive","forwardRef","jsx","forwardRef","Primitive","composeEventHandlers","useEffect","useState","create","jsx","useContentPartContext","useState","create","useEffect","Fragment","jsx","jsxs","Primitive","forwardRef","useMemo","jsx","forwardRef","useMemo","Primitive","composeEventHandlers","Primitive","forwardRef","jsx","Fragment","jsx","Fragment","jsx","Primitive","forwardRef","jsx","forwardRef","Primitive","Primitive","forwardRef","jsx","forwardRef","jsx","Primitive","useEffect","useInsertionEffect","useRef","useState","create","create","useEffect","useRef","useState","create","create","create","create","jsx","jsxs","useRef","useState","onRuntimeUpdate","useEffect","jsx","useRef","useInsertionEffect","useState","useEffect","jsx"]}
@@ -0,0 +1,75 @@
1
+ import { z } from 'zod';
2
+ import { ReactNode } from 'react';
3
+
4
+ type TextContentPart = {
5
+ type: "text";
6
+ text: string;
7
+ };
8
+ type ImageContentPart = {
9
+ type: "image";
10
+ image: string;
11
+ };
12
+ type UIContentPart = {
13
+ type: "ui";
14
+ display: ReactNode;
15
+ };
16
+ type ToolCallContentPart = {
17
+ type: "tool-call";
18
+ name: string;
19
+ args: object;
20
+ result?: object;
21
+ };
22
+ type UserContentPart = TextContentPart | ImageContentPart | UIContentPart;
23
+ type AssistantContentPart = TextContentPart | UIContentPart | ToolCallContentPart;
24
+ type AppendContentPart = TextContentPart | ImageContentPart;
25
+ type BaseMessage = {
26
+ id: string;
27
+ createdAt: Date;
28
+ };
29
+ type UserMessage = BaseMessage & {
30
+ role: "user";
31
+ content: UserContentPart[];
32
+ };
33
+ type AssistantMessage = BaseMessage & {
34
+ role: "assistant";
35
+ content: AssistantContentPart[];
36
+ status: "in_progress" | "done" | "error";
37
+ };
38
+ type AppendMessage = {
39
+ parentId: string | null;
40
+ content: AppendContentPart[];
41
+ };
42
+ type ThreadMessage = UserMessage | AssistantMessage;
43
+
44
+ type Tool<TArgs> = {
45
+ description: string;
46
+ parameters: z.ZodSchema<TArgs>;
47
+ execute: (args: TArgs) => unknown;
48
+ };
49
+ type ModelConfig = {
50
+ system?: string;
51
+ tools?: Record<string, Tool<any>>;
52
+ };
53
+ type ModelConfigProvider = () => ModelConfig;
54
+
55
+ declare class ProxyConfigProvider {
56
+ private _providers;
57
+ getModelConfig(): ModelConfig;
58
+ registerModelConfigProvider(provider: ModelConfigProvider): () => void;
59
+ }
60
+
61
+ declare class MessageRepository {
62
+ private messages;
63
+ private head;
64
+ private root;
65
+ private performOp;
66
+ getMessages(): ThreadMessage[];
67
+ addOrUpdateMessage(parentId: string | null, message: ThreadMessage): void;
68
+ appendOptimisticMessage(parentId: string | null, message: Omit<ThreadMessage, "id" | "createdAt">): string;
69
+ deleteMessage(messageId: string, replacementId?: string | null | undefined): void;
70
+ getBranches(messageId: string): string[];
71
+ switchToBranch(messageId: string): void;
72
+ resetHead(messageId: string | null): void;
73
+ }
74
+
75
+ export { type AppendMessage as A, type ImageContentPart as I, type ModelConfigProvider as M, ProxyConfigProvider as P, type TextContentPart as T, type UIContentPart as U, type ToolCallContentPart as a, type ThreadMessage as b, type ModelConfig as c, type AssistantContentPart as d, type AssistantMessage as e, type UserMessage as f, type UserContentPart as g, type AppendContentPart as h, MessageRepository as i };