import type { Component } from 'solid-js' import type { InferredClientContext } from '@tanstack/ai-client' import type { ChatUIInterruptsOf, ChatUISchemaOf, ChatUIToolsOf, } from '@tanstack/ai-client/ui' import { useChat as useUnboundChat } from '../use-chat' import type { UseChatOptions } from '../types' import { createChatUI } from './create-ui' import type { ChatUIFactoryConfig, ChatUIHost, InputProps } from './create-ui' type HeadlessOptions = UseChatOptions< ChatUIToolsOf, ChatUISchemaOf, InferredClientContext>, ChatUIInterruptsOf > type ChatInstanceOverrides = { threadId?: string live?: boolean forwardedProps?: Record body?: Record initialMessages?: HeadlessOptions['initialMessages'] } /** * Bind chat options and UI widgets once at module scope. * * This matches Form `createFormHook` and Table `createTableHook`. The * returned `useAppChat` creates a chat instance. `chat.AppChat` renders it. * Context `useChatContext` reads that instance. Part and interrupt * widgets take `part` / `interrupt` as props. * * Pass instance overrides such as `threadId` into `useAppChat()`. */ export function createChatHook< const TOptions, TInput extends Component | undefined = | Component>> | undefined, >({ options, ...chatComponents }: { options: TOptions } & ChatUIFactoryConfig, TInput>) { const ui = createChatUI( options, chatComponents as ChatUIFactoryConfig, TInput>, ) function useAppChat(overrides?: ChatInstanceOverrides) { const chat = ( overrides ? useUnboundChat({ ...(options as HeadlessOptions), ...overrides, }) : useUnboundChat(options as HeadlessOptions) ) as ChatUIHost function AppChat() { return } return Object.assign(chat, { AppChat }) as ChatUIHost & { AppChat: Component } } return { useAppChat, useChatContext: ui.useChatContext, } }