@djangocfg/ui-tools 2.1.344 → 2.1.345

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tools/Chat/types.ts","../src/tools/Chat/config.ts","../src/tools/Chat/core/reducer.ts","../src/tools/Chat/core/ids.ts","../src/tools/Chat/core/logger.ts","../src/tools/Chat/core/markdown.ts","../src/tools/Chat/hooks/useChat.ts","../src/tools/Chat/hooks/useChatLayout.ts","../src/tools/Chat/core/audio/audioBus.ts","../src/tools/Chat/core/audio/preferences.ts","../src/tools/Chat/hooks/useChatAudio.ts","../src/tools/Chat/context/ChatProvider.tsx","../src/tools/Chat/hooks/useChatComposer.ts","../src/tools/Chat/hooks/useChatScroll.ts","../src/tools/Chat/hooks/useChatHistory.ts","../src/tools/Chat/components/Attachments.tsx","../src/tools/Chat/components/Composer.tsx","../src/tools/Chat/components/EmptyState.tsx","../src/tools/Chat/components/ErrorBanner.tsx","../src/tools/Chat/components/JumpToLatest.tsx","../src/tools/Chat/core/persona.ts","../src/tools/Chat/components/StreamingIndicator.tsx","../src/tools/Chat/components/Sources.tsx","../src/tools/Chat/components/ToolCalls.tsx","../src/tools/Chat/components/MessageActions.tsx","../src/tools/Chat/components/MessageBubble.tsx","../src/tools/Chat/components/MessageList.tsx","../src/tools/Chat/components/ChatRoot.tsx"],"names":["__name","consola","isDev","useReducer","useRef","useEffect","useCallback","useLocalStorage","useMediaQuery","useState","useMemo","cache","create","persist","createJSONStorage","useSyncExternalStore","createContext","jsx","useContext","cn","jsxs","FileIcon","X","forwardRef","Composer","Button","Paperclip","Textarea","Square","Send","Sparkles","AlertCircle","RefreshCw","ArrowDown","ExternalLink","ChevronDown","ChevronRight","Loader2","Copy","Pencil","Trash","Avatar","AvatarImage","AvatarFallback","MarkdownMessage","memo","MessageList","Spinner","copy","Fragment"],"mappings":"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","file":"chunk-HE3N2ACJ.cjs","sourcesContent":["/**\n * Public types for the Chat tool.\n *\n * Shapes here are the contract between transport adapters, the reducer,\n * the hooks layer and the components. Keep serializable (no Date, no Map).\n */\n\nexport type ChatRole = 'user' | 'assistant' | 'system';\n\nexport interface ChatToolCall {\n id: string;\n name: string;\n input: unknown;\n output?: unknown;\n /** Live buffer accumulated during streaming. Replaced by `output` on completion. */\n streamingText?: string;\n status: 'running' | 'success' | 'error' | 'cancelled';\n startedAt: number;\n endedAt?: number;\n /** Optional grouping label for parallel/fan-out execution. */\n sourceHostname?: string;\n}\n\nexport interface ChatAttachment {\n id: string;\n type: 'image' | 'file' | 'audio' | 'video';\n url: string;\n thumbnailUrl?: string;\n name?: string;\n mimeType?: string;\n sizeBytes?: number;\n status?: 'uploading' | 'ready' | 'error';\n /** 0..1 while uploading. */\n progress?: number;\n /** Extracted text from images (OCR). */\n ocrText?: string;\n}\n\nexport interface ChatSource {\n title: string;\n url: string;\n snippet?: string;\n chunkIndex?: number;\n}\n\nexport interface ChatPersona {\n /** Display name. */\n name?: string;\n /** Avatar image URL. */\n avatarUrl?: string;\n /** Initials fallback when no avatar. Auto-derived from `name` if absent. */\n initials?: string;\n /** Tooltip / aria description. */\n description?: string;\n}\n\nexport interface ChatMessage {\n id: string;\n role: ChatRole;\n content: string;\n /** epoch ms — serializable. */\n createdAt: number;\n isStreaming?: boolean;\n isError?: boolean;\n /** Bumps on edit so memo keys invalidate. */\n version?: number;\n /** Per-message persona override (multi-user / multi-bot). Falls back to\n * `ChatConfig.user` / `ChatConfig.assistant` when absent. */\n sender?: ChatPersona;\n /** Simple status indicator above message (\"Searching knowledge base...\"). */\n toolActivity?: string;\n toolCalls?: ChatToolCall[];\n attachments?: ChatAttachment[];\n sources?: ChatSource[];\n tokensIn?: number;\n tokensOut?: number;\n}\n\nexport type ChatDisplayMode = 'closed' | 'embedded' | 'floating' | 'sidebar' | 'fullscreen';\n\nexport interface ChatUserContext extends ChatPersona {\n email?: string;\n language?: string;\n role?: string;\n /** Free-form custom data forwarded to transport metadata. */\n custom?: Record<string, unknown>;\n}\n\nexport interface ChatAssistantContext extends ChatPersona {\n /** Model identifier (gpt-4o, claude-opus, …). */\n model?: string;\n}\n\nexport interface ChatPrefs {\n /** Submit hotkey for the composer. */\n submitOn?: 'enter' | 'cmd+enter';\n /** UI density. */\n density?: 'comfortable' | 'compact';\n /** Locale forwarded to transport metadata. */\n locale?: string;\n /** Show timestamps on each bubble. */\n showTimestamps?: boolean;\n}\n\nexport interface ChatConfig {\n /** Window title / aria-label. */\n title?: string;\n /** Composer placeholder. */\n placeholder?: string;\n /** Empty-state greeting. */\n greeting?: string;\n /** Empty-state description. */\n description?: string;\n /** Suggested prompts shown on empty conversation. */\n suggestions?: Array<{ label: string; prompt: string }>;\n /** Locale forwarded to the transport via stream metadata. */\n locale?: string;\n /** Project / chat slug forwarded to the transport. */\n slug?: string;\n /** UI density. Use `prefs.density` for the same effect; this stays for\n * backwards compatibility. */\n density?: 'comfortable' | 'compact';\n /** Identity of the human author. Renders avatar / name on user bubbles\n * and gets stamped on outgoing messages as `message.sender`. */\n user?: ChatUserContext;\n /** Identity of the assistant. Renders avatar / name on assistant bubbles. */\n assistant?: ChatAssistantContext;\n /** UI preferences. */\n prefs?: ChatPrefs;\n /** Visual labels (i18n is the host's job). */\n labels?: Partial<ChatLabels>;\n}\n\nexport interface ChatLabels {\n send: string;\n cancel: string;\n copy: string;\n regenerate: string;\n edit: string;\n delete: string;\n retry: string;\n newChat: string;\n loadMore: string;\n jumpToLatest: string;\n attach: string;\n voice: string;\n errorGeneric: string;\n cancelledSuffix: string;\n}\n\nexport const DEFAULT_LABELS: ChatLabels = {\n send: 'Send',\n cancel: 'Stop',\n copy: 'Copy',\n regenerate: 'Regenerate',\n edit: 'Edit',\n delete: 'Delete',\n retry: 'Retry',\n newChat: 'New chat',\n loadMore: 'Load more',\n jumpToLatest: 'Jump to latest',\n attach: 'Attach files',\n voice: 'Voice input',\n errorGeneric: 'Something went wrong',\n cancelledSuffix: '[cancelled]',\n};\n\n// ---- Transport ------------------------------------------------------------\n\nexport interface CreateSessionOptions {\n metadata?: Record<string, unknown>;\n}\n\nexport interface SessionInfo {\n sessionId: string;\n /** If the server resumed an existing session, it may return prior messages. */\n messages?: ChatMessage[];\n hasMore?: boolean;\n cursor?: string | null;\n resumed?: boolean;\n}\n\nexport interface HistoryPage {\n messages: ChatMessage[];\n hasMore: boolean;\n nextCursor: string | null;\n}\n\nexport interface StreamOptions {\n signal: AbortSignal;\n attachments?: ChatAttachment[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface SendOptions {\n signal?: AbortSignal;\n attachments?: ChatAttachment[];\n metadata?: Record<string, unknown>;\n}\n\nexport type ChatStreamEvent =\n | { type: 'message_start'; messageId: string; sessionId: string }\n | { type: 'resume_start' }\n | { type: 'chunk'; delta: string }\n | { type: 'tool_activity'; tool: string; status: string }\n | {\n type: 'tool_call_start';\n toolId: string;\n name: string;\n input: unknown;\n sourceHostname?: string;\n }\n | { type: 'tool_call_delta'; toolId: string; delta: string }\n | {\n type: 'tool_call_end';\n toolId: string;\n output: unknown;\n status: 'success' | 'error';\n }\n | {\n type: 'message_end';\n tokensIn?: number;\n tokensOut?: number;\n sources?: ChatSource[];\n }\n | { type: 'error'; code: string; message: string };\n\nexport interface ChatTransport {\n createSession(opts?: CreateSessionOptions): Promise<SessionInfo>;\n loadHistory(sessionId: string, cursor?: string | null, limit?: number): Promise<HistoryPage>;\n stream(\n sessionId: string,\n content: string,\n options: StreamOptions,\n ): AsyncGenerator<ChatStreamEvent, void, void>;\n send(sessionId: string, content: string, options?: SendOptions): Promise<ChatMessage>;\n closeSession(sessionId: string): Promise<void>;\n}\n","/**\n * Chat defaults and constants.\n */\n\nexport const STORAGE_KEYS = {\n mode: 'djc-chat-mode',\n sidebarWidth: 'djc-chat-sidebar-width',\n composerHistory: 'djc-chat-composer-history',\n} as const;\n\nexport const CSS_VARS = {\n reserve: '--djc-chat-reserve',\n} as const;\n\nexport const DEFAULT_Z_INDEX = 9000;\n\nexport const LIMITS = {\n /** Max characters per single message. */\n messageMaxLength: 8000,\n /** Max attachments per message. */\n attachmentsMax: 10,\n /** Composer history slots. */\n composerHistorySize: 50,\n /** Coalesce stream tokens within this window before dispatching. */\n streamCoalesceMs: 16,\n /** Default history page size. */\n pageSize: 50,\n /** Virtualize list when >= this many messages (host-controlled threshold). */\n virtualizeThreshold: 50,\n /** SSE idle timeout. */\n sseIdleMs: 45_000,\n} as const;\n\nexport const DEFAULT_SIDEBAR = {\n width: 420,\n min: 320,\n max: 720,\n} as const;\n\nexport const HOTKEYS = {\n send: 'mod+enter',\n cancel: 'esc',\n newChat: 'mod+shift+n',\n toggleOpen: 'mod+/',\n focusComposer: 'mod+l',\n} as const;\n\nexport const CHAT_EVENT_NAME = 'djc:chat:send';\n\nexport interface ChatEventDetail {\n content: string;\n sessionId?: string;\n attachments?: unknown[];\n metadata?: Record<string, unknown>;\n}\n","/**\n * Pure chat state machine. Zero React. Zero I/O.\n *\n * Invariants:\n * - At most one message has `isStreaming === true` at any time. It is always\n * the last message in the array.\n * - Messages are immutable; updates produce new objects.\n * - `version` bumps on edit so memo keys invalidate.\n */\n\nimport type { ChatAttachment, ChatMessage, ChatSource, ChatToolCall } from '../types';\n\nexport interface ChatState {\n sessionId: string | null;\n messages: ChatMessage[];\n /** Initial history load in flight. */\n isLoading: boolean;\n /** Assistant is generating a reply. */\n isStreaming: boolean;\n /** Older history page in flight. */\n isLoadingMore: boolean;\n hasMore: boolean;\n oldestCursor: string | null;\n error: string | null;\n}\n\nexport const initialState: ChatState = {\n sessionId: null,\n messages: [],\n isLoading: false,\n isStreaming: false,\n isLoadingMore: false,\n hasMore: true,\n oldestCursor: null,\n error: null,\n};\n\nexport type ChatAction =\n | {\n type: 'SESSION_SET';\n sessionId: string;\n messages?: ChatMessage[];\n hasMore?: boolean;\n cursor?: string | null;\n }\n | { type: 'HISTORY_LOAD_START' }\n | {\n type: 'HISTORY_LOAD_DONE';\n messages: ChatMessage[];\n hasMore: boolean;\n cursor: string | null;\n }\n | { type: 'HISTORY_MORE_START' }\n | {\n type: 'HISTORY_MORE_DONE';\n messages: ChatMessage[];\n hasMore: boolean;\n cursor: string | null;\n }\n | { type: 'MESSAGE_USER_ADD'; message: ChatMessage }\n | { type: 'STREAM_START'; id: string; createdAt?: number }\n | { type: 'STREAM_CHUNK'; delta: string }\n | { type: 'STREAM_TOOL_ACTIVITY'; tool: string }\n | { type: 'TOOL_CALL_START'; messageId: string; toolCall: ChatToolCall }\n | { type: 'TOOL_CALL_DELTA'; messageId: string; toolId: string; delta: string }\n | {\n type: 'TOOL_CALL_END';\n messageId: string;\n toolId: string;\n output: unknown;\n status: 'success' | 'error';\n }\n | {\n type: 'STREAM_DONE';\n id: string;\n tokensIn?: number;\n tokensOut?: number;\n sources?: ChatSource[];\n }\n | { type: 'STREAM_CANCELLED'; id: string; partialText: string; label?: string }\n | { type: 'STREAM_ERROR'; id?: string; message: string }\n | { type: 'STREAM_CANCEL_PLACEHOLDER'; id: string }\n | { type: 'STREAM_RESUME_EXISTING' }\n | { type: 'MESSAGE_EDIT'; id: string; content: string }\n | { type: 'MESSAGE_DELETE'; id: string }\n | { type: 'MESSAGES_CLEAR' }\n | { type: 'ERROR_SET'; error: string | null }\n | {\n type: 'ATTACHMENT_PROGRESS';\n messageId: string;\n attachmentId: string;\n progress?: number;\n status?: ChatAttachment['status'];\n };\n\nfunction updateLastStreaming(\n messages: ChatMessage[],\n patch: (m: ChatMessage) => ChatMessage,\n): ChatMessage[] {\n const idx = findLastStreamingIndex(messages);\n if (idx === -1) return messages;\n const next = messages.slice();\n next[idx] = patch(messages[idx]);\n return next;\n}\n\nfunction findLastStreamingIndex(messages: ChatMessage[]): number {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i].isStreaming) return i;\n }\n return -1;\n}\n\nfunction patchMessageById(\n messages: ChatMessage[],\n id: string,\n patch: (m: ChatMessage) => ChatMessage,\n): ChatMessage[] {\n const idx = messages.findIndex((m) => m.id === id);\n if (idx === -1) return messages;\n const next = messages.slice();\n next[idx] = patch(messages[idx]);\n return next;\n}\n\nexport function reducer(state: ChatState, action: ChatAction): ChatState {\n switch (action.type) {\n case 'SESSION_SET':\n return {\n ...state,\n sessionId: action.sessionId,\n messages: action.messages ?? state.messages,\n hasMore: action.hasMore ?? state.hasMore,\n oldestCursor: action.cursor ?? state.oldestCursor,\n error: null,\n };\n\n case 'HISTORY_LOAD_START':\n return { ...state, isLoading: true, error: null };\n\n case 'HISTORY_LOAD_DONE':\n return {\n ...state,\n isLoading: false,\n messages: action.messages,\n hasMore: action.hasMore,\n oldestCursor: action.cursor,\n };\n\n case 'HISTORY_MORE_START':\n return { ...state, isLoadingMore: true };\n\n case 'HISTORY_MORE_DONE':\n return {\n ...state,\n isLoadingMore: false,\n // Older messages prepend to the top.\n messages: [...action.messages, ...state.messages],\n hasMore: action.hasMore,\n oldestCursor: action.cursor,\n };\n\n case 'MESSAGE_USER_ADD':\n return {\n ...state,\n messages: [...state.messages, action.message],\n error: null,\n };\n\n case 'STREAM_START': {\n if (state.isStreaming) {\n if (typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn('[chat] STREAM_START while already streaming, ignoring');\n }\n return state;\n }\n const placeholder: ChatMessage = {\n id: action.id,\n role: 'assistant',\n content: '',\n createdAt: action.createdAt ?? Date.now(),\n isStreaming: true,\n };\n return {\n ...state,\n isStreaming: true,\n messages: [...state.messages, placeholder],\n };\n }\n\n case 'STREAM_CHUNK': {\n const messages = updateLastStreaming(state.messages, (m) => ({\n ...m,\n content: m.content + action.delta,\n }));\n return { ...state, messages };\n }\n\n case 'STREAM_TOOL_ACTIVITY': {\n const messages = updateLastStreaming(state.messages, (m) => ({\n ...m,\n toolActivity: action.tool,\n }));\n return { ...state, messages };\n }\n\n case 'TOOL_CALL_START': {\n const messages = patchMessageById(state.messages, action.messageId, (m) => ({\n ...m,\n toolCalls: [...(m.toolCalls ?? []), action.toolCall],\n }));\n return { ...state, messages };\n }\n\n case 'TOOL_CALL_DELTA': {\n const messages = patchMessageById(state.messages, action.messageId, (m) => {\n if (!m.toolCalls) return m;\n return {\n ...m,\n toolCalls: m.toolCalls.map((tc) =>\n tc.id === action.toolId\n ? { ...tc, streamingText: (tc.streamingText ?? '') + action.delta }\n : tc,\n ),\n };\n });\n return { ...state, messages };\n }\n\n case 'TOOL_CALL_END': {\n const messages = patchMessageById(state.messages, action.messageId, (m) => {\n if (!m.toolCalls) return m;\n return {\n ...m,\n toolCalls: m.toolCalls.map((tc) =>\n tc.id === action.toolId\n ? {\n ...tc,\n output: action.output,\n status: action.status,\n streamingText: undefined,\n endedAt: Date.now(),\n }\n : tc,\n ),\n };\n });\n return { ...state, messages };\n }\n\n case 'STREAM_DONE': {\n const messages = patchMessageById(state.messages, action.id, (m) => ({\n ...m,\n isStreaming: false,\n tokensIn: action.tokensIn ?? m.tokensIn,\n tokensOut: action.tokensOut ?? m.tokensOut,\n sources: action.sources ?? m.sources,\n }));\n return { ...state, isStreaming: false, messages };\n }\n\n case 'STREAM_CANCELLED': {\n const suffix = action.label ?? '[cancelled]';\n const messages = patchMessageById(state.messages, action.id, (m) => ({\n ...m,\n isStreaming: false,\n content: action.partialText + (action.partialText ? `\\n\\n_${suffix}_` : `_${suffix}_`),\n }));\n return { ...state, isStreaming: false, messages };\n }\n\n case 'STREAM_ERROR': {\n const messages = action.id\n ? patchMessageById(state.messages, action.id, (m) => ({\n ...m,\n isStreaming: false,\n isError: true,\n }))\n : state.messages;\n return { ...state, isStreaming: false, error: action.message, messages };\n }\n\n case 'STREAM_CANCEL_PLACEHOLDER':\n // Remove the freshly-created empty assistant placeholder (resume path).\n return {\n ...state,\n isStreaming: false,\n messages: state.messages.filter((m) => m.id !== action.id),\n };\n\n case 'STREAM_RESUME_EXISTING': {\n // Mark the last assistant message as streaming so resume chunks append to it.\n const lastIdx = (() => {\n for (let i = state.messages.length - 1; i >= 0; i--) {\n if (state.messages[i].role === 'assistant') return i;\n }\n return -1;\n })();\n if (lastIdx === -1) return { ...state, isStreaming: true };\n const msgs = state.messages.slice();\n msgs[lastIdx] = { ...msgs[lastIdx], isStreaming: true };\n return { ...state, isStreaming: true, messages: msgs };\n }\n\n case 'MESSAGE_EDIT': {\n const messages = patchMessageById(state.messages, action.id, (m) => ({\n ...m,\n content: action.content,\n version: (m.version ?? 0) + 1,\n }));\n return { ...state, messages };\n }\n\n case 'MESSAGE_DELETE':\n return {\n ...state,\n messages: state.messages.filter((m) => m.id !== action.id),\n };\n\n case 'MESSAGES_CLEAR':\n return {\n ...state,\n messages: [],\n isStreaming: false,\n error: null,\n };\n\n case 'ERROR_SET':\n return { ...state, error: action.error };\n\n case 'ATTACHMENT_PROGRESS': {\n const messages = patchMessageById(state.messages, action.messageId, (m) => {\n if (!m.attachments) return m;\n return {\n ...m,\n attachments: m.attachments.map((a) =>\n a.id === action.attachmentId\n ? {\n ...a,\n progress: action.progress ?? a.progress,\n status: action.status ?? a.status,\n }\n : a,\n ),\n };\n });\n return { ...state, messages };\n }\n\n default: {\n // Exhaustiveness check.\n const _exhaustive: never = action;\n void _exhaustive;\n return state;\n }\n }\n}\n","/**\n * ID generation. Uses crypto.randomUUID when available with a fallback\n * for older environments (and SSR bundles that may not have crypto).\n */\n\nlet counter = 0;\n\nexport function createId(prefix = 'm'): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return `${prefix}_${crypto.randomUUID()}`;\n }\n counter += 1;\n return `${prefix}_${Date.now().toString(36)}_${counter.toString(36)}_${Math.random()\n .toString(36)\n .slice(2, 8)}`;\n}\n","/**\n * Chat dev logger.\n *\n * A thin namespaced wrapper over `consola` that no-ops in production unless\n * the host app explicitly opts in via `<ChatRoot debug />`. The default\n * detection uses `isDev` from `@djangocfg/ui-core/lib/env` (NODE_ENV).\n *\n * Why a dedicated module: chat is async and event-heavy (bootstrap, transport,\n * SSE chunks, tool calls, regenerate, …). Inline `console.log`s rot fast and\n * leak into prod. A single `getChatLogger()` call gives every layer the same\n * namespaced sub-logger and keeps zero-cost gating in one place.\n *\n * Sub-loggers:\n * bootstrap — initial session bootstrap (createSession / loadHistory)\n * transport — outbound transport calls + responses\n * stream — SSE chunk / tool / message_end events\n * lifecycle — sendMessage, regenerate, newSession, edits\n * tools — tool_call_start / _delta / _end specifics\n * error — caught errors (always emitted as `error` level)\n */\nimport { consola, type ConsolaInstance } from 'consola';\n\nimport { isDev } from '@djangocfg/ui-core/lib';\n\nexport type ChatLogScope = 'bootstrap' | 'transport' | 'stream' | 'lifecycle' | 'tools' | 'error';\n\nexport interface ChatLogger {\n bootstrap: ConsolaInstance;\n transport: ConsolaInstance;\n stream: ConsolaInstance;\n lifecycle: ConsolaInstance;\n tools: ConsolaInstance;\n error: ConsolaInstance;\n /** True when this logger is actually emitting (host opted in or NODE_ENV=development). */\n enabled: boolean;\n}\n\nconst SCOPES: ChatLogScope[] = ['bootstrap', 'transport', 'stream', 'lifecycle', 'tools', 'error'];\n\n/** Module-level cache so all hooks/components share the same logger instance per `enabled` mode. */\nconst cache = new Map<boolean, ChatLogger>();\n\nfunction buildLogger(enabled: boolean): ChatLogger {\n const root = consola.withTag('chat');\n const subs = Object.fromEntries(\n SCOPES.map((scope) => [scope, root.withTag(scope)]),\n ) as Record<ChatLogScope, ConsolaInstance>;\n\n if (!enabled) {\n // Silence everything except `error` — surfaced errors should never go\n // missing even if the host didn't opt in to debug logs.\n for (const scope of SCOPES) {\n if (scope === 'error') continue;\n subs[scope].level = -999;\n }\n }\n\n return { ...subs, enabled };\n}\n\n/**\n * Get the chat logger.\n * @param debug Explicit override from the host. `undefined` falls back to `isDev`.\n */\nexport function getChatLogger(debug?: boolean): ChatLogger {\n const enabled = debug ?? isDev;\n let logger = cache.get(enabled);\n if (!logger) {\n logger = buildLogger(enabled);\n cache.set(enabled, logger);\n }\n return logger;\n}\n","/**\n * Token coalescer. Buffers stream tokens within a small time window before\n * dispatching a single aggregated chunk. Prevents 60+ re-renders per second\n * on fast streams.\n */\n\nimport { LIMITS } from '../config';\n\nexport interface TokenBuffer {\n /** Append a delta. Returns immediately. */\n push(delta: string): void;\n /** Force flush and resolve any pending timer. */\n flush(): void;\n /** Stop accepting tokens; flush whatever is buffered. */\n close(): void;\n}\n\nexport function createTokenBuffer(\n onFlush: (delta: string) => void,\n windowMs = LIMITS.streamCoalesceMs,\n): TokenBuffer {\n let pending = '';\n let timer: ReturnType<typeof setTimeout> | null = null;\n let closed = false;\n\n const flush = () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (pending) {\n const out = pending;\n pending = '';\n onFlush(out);\n }\n };\n\n return {\n push(delta: string) {\n if (closed || !delta) return;\n pending += delta;\n if (windowMs <= 0) {\n flush();\n return;\n }\n if (timer === null) {\n timer = setTimeout(flush, windowMs);\n }\n },\n flush,\n close() {\n closed = true;\n flush();\n },\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport type {\n ChatAttachment,\n ChatMessage,\n ChatPersona,\n ChatStreamEvent,\n ChatTransport,\n ChatToolCall,\n} from '../types';\nimport { LIMITS } from '../config';\nimport {\n type ChatState,\n initialState,\n reducer,\n type ChatAction,\n} from '../core/reducer';\nimport { createId } from '../core/ids';\nimport { getChatLogger } from '../core/logger';\nimport { createTokenBuffer } from '../core/markdown';\n\nexport interface UseChatConfig {\n transport: ChatTransport;\n initialSessionId?: string;\n autoCreateSession?: boolean;\n streaming?: boolean;\n pageSize?: number;\n onError?: (err: Error) => void;\n /** Fires once an assistant message finishes streaming (or buffered send returns). */\n onMessageEnd?: (msg: ChatMessage) => void;\n /** Fires after a user message is added to the state (right before streaming starts). */\n onMessageSent?: (msg: ChatMessage) => void;\n /** Fires when the assistant placeholder is created (first byte / pre-stream). */\n onStreamStart?: (assistantMessageId: string) => void;\n metadata?: Record<string, unknown>;\n /** Stamped on outgoing user messages as `message.sender`. */\n userPersona?: ChatPersona;\n /**\n * Enable verbose dev-mode logging (consola, namespace `chat:*`).\n * Defaults to `isDev` from `@djangocfg/ui-core/lib`. Pass `false` to silence\n * even in development; `true` to force on in production.\n */\n debug?: boolean;\n}\n\nexport interface UseChatReturn extends ChatState {\n sendMessage: (content: string, attachments?: ChatAttachment[]) => Promise<void>;\n cancelStream: () => void;\n regenerate: (messageId?: string) => Promise<void>;\n editMessage: (id: string, content: string) => Promise<void>;\n deleteMessage: (id: string) => void;\n clearMessages: () => void;\n loadMore: () => Promise<void>;\n newSession: () => Promise<void>;\n lastError: Error | null;\n}\n\nexport function useChat(config: UseChatConfig): UseChatReturn {\n const [state, dispatch] = useReducer(reducer, initialState);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n const abortRef = useRef<AbortController | null>(null);\n const lastErrorRef = useRef<Error | null>(null);\n const streamingMsgIdRef = useRef<string | null>(null);\n // Promise resolved once the initial session is available (or `null` when the\n // bootstrap finished without producing one — e.g. autoCreateSession=false).\n // Action methods (sendMessage, regenerate, …) await this so users who type\n // before the first network round-trip resolves don't hit \"No active session\".\n const bootstrapRef = useRef<Promise<string | null> | null>(null);\n\n const { transport, autoCreateSession = true, streaming = true, pageSize = LIMITS.pageSize } =\n config;\n const log = getChatLogger(config.debug);\n\n // Initial session bootstrap.\n //\n // Strict Mode quirk: this effect runs twice in dev (mount → unmount → mount).\n // Previous design used `initRef` to skip the second run, but the first run's\n // cleanup sets `cancelled = true`, so its dispatch never lands — and the\n // second run was blocked. Result: bootstrap silently completed the network\n // call but never wrote sessionId to state.\n //\n // Fix: drop `initRef`. On the second mount we DO re-run, but `bootstrapRef`\n // is preserved across renders so we don't re-fetch if a previous run already\n // succeeded — we just resolve from existing state.\n useEffect(() => {\n let cancelled = false;\n\n // If a prior run already produced a sessionId, skip.\n if (stateRef.current.sessionId) {\n return;\n }\n\n // Show \"loading\" state immediately so the UI doesn't look idle while we\n // wait for createSession / loadHistory to come back.\n if (config.initialSessionId || autoCreateSession) {\n dispatch({ type: 'HISTORY_LOAD_START' });\n }\n\n log.bootstrap.info('start', {\n mode: config.initialSessionId ? 'resume' : autoCreateSession ? 'create' : 'idle',\n initialSessionId: config.initialSessionId,\n });\n\n const run = async (): Promise<string | null> => {\n const t0 = performance.now();\n try {\n if (config.initialSessionId) {\n if (!cancelled) {\n dispatch({\n type: 'SESSION_SET',\n sessionId: config.initialSessionId,\n });\n }\n const page = await transport.loadHistory(config.initialSessionId, null, pageSize);\n if (cancelled) {\n log.bootstrap.debug('cancelled (post-loadHistory)');\n // Even though *this* effect is cancelled, the network call did\n // succeed — return the sessionId so awaitSession() doesn't see\n // a phantom null when the next mount picks up.\n return config.initialSessionId;\n }\n dispatch({\n type: 'HISTORY_LOAD_DONE',\n messages: page.messages,\n hasMore: page.hasMore,\n cursor: page.nextCursor,\n });\n log.bootstrap.success('resumed', {\n sessionId: config.initialSessionId,\n messages: page.messages.length,\n hasMore: page.hasMore,\n elapsedMs: Math.round(performance.now() - t0),\n });\n return config.initialSessionId;\n }\n if (autoCreateSession) {\n const info = await transport.createSession({ metadata: config.metadata });\n // We always commit the session to state even if this effect was\n // cancelled — the network call already succeeded, throwing away the\n // sessionId would just trigger a duplicate createSession on remount.\n dispatch({\n type: 'SESSION_SET',\n sessionId: info.sessionId,\n messages: info.messages ?? [],\n hasMore: info.hasMore ?? false,\n cursor: info.cursor ?? null,\n });\n dispatch({\n type: 'HISTORY_LOAD_DONE',\n messages: info.messages ?? [],\n hasMore: info.hasMore ?? false,\n cursor: info.cursor ?? null,\n });\n log.bootstrap.success(cancelled ? 'created (post-cancel)' : 'created', {\n sessionId: info.sessionId,\n resumed: info.resumed ?? false,\n cancelled,\n elapsedMs: Math.round(performance.now() - t0),\n });\n return info.sessionId;\n }\n log.bootstrap.debug('idle (no initialSessionId, autoCreateSession=false)');\n return null;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (cancelled) {\n log.bootstrap.debug('cancelled (in catch)', { message: e.message });\n return null;\n }\n lastErrorRef.current = e;\n dispatch({ type: 'ERROR_SET', error: e.message });\n config.onError?.(e);\n log.error.error('bootstrap failed', { message: e.message, elapsedMs: Math.round(performance.now() - t0) });\n return null;\n }\n };\n bootstrapRef.current = run();\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /** Wait for the initial session bootstrap to settle, then return whatever\n * sessionId is now in state. Safe to call multiple times. */\n const awaitSession = useCallback(async (): Promise<string | null> => {\n if (stateRef.current.sessionId) return stateRef.current.sessionId;\n if (bootstrapRef.current) {\n const id = await bootstrapRef.current;\n if (id) return id;\n }\n return stateRef.current.sessionId;\n }, []);\n\n const consumeStream = useCallback(\n async (\n sessionId: string,\n content: string,\n attachments?: ChatAttachment[],\n ): Promise<void> => {\n const ctrl = new AbortController();\n abortRef.current = ctrl;\n const assistantId = createId('a');\n streamingMsgIdRef.current = assistantId;\n\n const iterator = transport.stream(sessionId, content, {\n signal: ctrl.signal,\n attachments,\n metadata: config.metadata,\n });\n\n // Peek at the first event — if it's `resume_start` we reuse the last assistant\n // message instead of creating a new empty placeholder. The peek happens inside\n // the try/catch so any transport error (network, 401, etc.) is handled normally.\n let peekedEvent: ChatStreamEvent | null = null;\n\n dispatch({ type: 'STREAM_START', id: assistantId });\n config.onStreamStart?.(assistantId);\n log.stream.info('start', { sessionId, assistantId, chars: content.length });\n\n const tokenBuffer = createTokenBuffer((delta) =>\n dispatch({ type: 'STREAM_CHUNK', delta }),\n );\n\n let serverMessageId: string | null = null;\n let chunkCount = 0;\n let charsReceived = 0;\n const t0 = performance.now();\n\n try {\n // Peek first event to detect resume_start — must be inside try/catch so\n // transport errors (network down, 401) are caught and shown as error banners.\n const firstResult = await iterator.next();\n if (!firstResult.done) {\n const ev = firstResult.value as ChatStreamEvent;\n if (ev.type === 'resume_start') {\n // Switch existing placeholder to continueExisting mode: remove the\n // just-created empty placeholder and mark the last assistant msg streaming.\n dispatch({ type: 'STREAM_CANCEL_PLACEHOLDER', id: assistantId });\n dispatch({ type: 'STREAM_RESUME_EXISTING' });\n } else {\n peekedEvent = ev;\n }\n }\n\n if (peekedEvent) handleEvent(peekedEvent);\n\n for await (const ev of iterator) {\n if (ctrl.signal.aborted) break;\n handleEvent(ev);\n }\n tokenBuffer.flush();\n\n // If transport never emitted message_end, finalize manually.\n if (stateRef.current.isStreaming) {\n dispatch({ type: 'STREAM_DONE', id: assistantId });\n }\n\n const finalMsg = stateRef.current.messages.find((m) => m.id === assistantId);\n if (finalMsg) config.onMessageEnd?.(finalMsg);\n log.stream.success('done', {\n assistantId,\n chunks: chunkCount,\n chars: charsReceived,\n elapsedMs: Math.round(performance.now() - t0),\n });\n } catch (err) {\n tokenBuffer.close();\n if (ctrl.signal.aborted) {\n const partial =\n stateRef.current.messages.find((m) => m.id === assistantId)?.content ?? '';\n dispatch({ type: 'STREAM_CANCELLED', id: assistantId, partialText: partial });\n log.stream.warn('cancelled', { assistantId, partialChars: partial.length });\n return;\n }\n const e = err instanceof Error ? err : new Error(String(err));\n lastErrorRef.current = e;\n dispatch({ type: 'STREAM_ERROR', id: assistantId, message: e.message });\n config.onError?.(e);\n log.error.error('stream failed', { assistantId, message: e.message });\n } finally {\n tokenBuffer.close();\n if (abortRef.current === ctrl) abortRef.current = null;\n streamingMsgIdRef.current = null;\n }\n\n function handleEvent(ev: ChatStreamEvent) {\n switch (ev.type) {\n case 'message_start':\n serverMessageId = ev.messageId;\n log.stream.debug('message_start', { messageId: ev.messageId });\n return;\n case 'chunk':\n tokenBuffer.push(ev.delta);\n chunkCount += 1;\n charsReceived += ev.delta.length;\n return;\n case 'tool_activity':\n tokenBuffer.flush();\n dispatch({ type: 'STREAM_TOOL_ACTIVITY', tool: ev.tool });\n log.tools.debug('activity', { tool: ev.tool, status: ev.status });\n return;\n case 'tool_call_start': {\n tokenBuffer.flush();\n const toolCall: ChatToolCall = {\n id: ev.toolId,\n name: ev.name,\n input: ev.input,\n status: 'running',\n startedAt: Date.now(),\n sourceHostname: ev.sourceHostname,\n };\n dispatch({\n type: 'TOOL_CALL_START',\n messageId: assistantId,\n toolCall,\n });\n log.tools.info('call_start', { toolId: ev.toolId, name: ev.name });\n return;\n }\n case 'tool_call_delta':\n dispatch({\n type: 'TOOL_CALL_DELTA',\n messageId: assistantId,\n toolId: ev.toolId,\n delta: ev.delta,\n });\n return;\n case 'tool_call_end':\n dispatch({\n type: 'TOOL_CALL_END',\n messageId: assistantId,\n toolId: ev.toolId,\n output: ev.output,\n status: ev.status,\n });\n log.tools.info('call_end', { toolId: ev.toolId, status: ev.status });\n return;\n case 'message_end':\n tokenBuffer.flush();\n dispatch({\n type: 'STREAM_DONE',\n id: assistantId,\n tokensIn: ev.tokensIn,\n tokensOut: ev.tokensOut,\n sources: ev.sources,\n });\n log.stream.debug('message_end', {\n tokensIn: ev.tokensIn,\n tokensOut: ev.tokensOut,\n sources: ev.sources?.length ?? 0,\n });\n return;\n case 'error':\n tokenBuffer.flush();\n dispatch({\n type: 'STREAM_ERROR',\n id: assistantId,\n message: ev.message,\n });\n log.error.error('stream event error', { code: ev.code, message: ev.message });\n return;\n }\n // unreachable; prevents unused-var on serverMessageId\n void serverMessageId;\n }\n },\n [transport, config],\n );\n\n const consumeBuffered = useCallback(\n async (sessionId: string, content: string, attachments?: ChatAttachment[]): Promise<void> => {\n const ctrl = new AbortController();\n abortRef.current = ctrl;\n try {\n const reply = await transport.send(sessionId, content, {\n signal: ctrl.signal,\n attachments,\n metadata: config.metadata,\n });\n const placeholderId = createId('a');\n dispatch({ type: 'STREAM_START', id: placeholderId });\n config.onStreamStart?.(placeholderId);\n dispatch({ type: 'STREAM_CHUNK', delta: reply.content });\n dispatch({ type: 'STREAM_DONE', id: placeholderId });\n config.onMessageEnd?.(reply);\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n lastErrorRef.current = e;\n dispatch({ type: 'STREAM_ERROR', message: e.message });\n config.onError?.(e);\n } finally {\n if (abortRef.current === ctrl) abortRef.current = null;\n }\n },\n [transport, config],\n );\n\n const sendMessage = useCallback(\n async (content: string, attachments?: ChatAttachment[]) => {\n // Wait for the initial session bootstrap if it's still in flight.\n // Without this, fast typers hit \"No active session\" before\n // transport.createSession resolves.\n log.lifecycle.info('sendMessage', {\n chars: content.length,\n attachments: attachments?.length ?? 0,\n hasSession: !!stateRef.current.sessionId,\n });\n const sessionId = await awaitSession();\n if (!sessionId) {\n const e = new Error('No active session');\n lastErrorRef.current = e;\n dispatch({ type: 'ERROR_SET', error: e.message });\n config.onError?.(e);\n log.error.error('sendMessage aborted: no session');\n return;\n }\n if (!content.trim() && !(attachments && attachments.length > 0)) {\n log.lifecycle.debug('sendMessage skipped (empty)');\n return;\n }\n if (stateRef.current.isStreaming) {\n log.lifecycle.debug('sendMessage skipped (already streaming)');\n return;\n }\n\n const userMsg: ChatMessage = {\n id: createId('u'),\n role: 'user',\n content,\n createdAt: Date.now(),\n attachments,\n sender: config.userPersona,\n };\n dispatch({ type: 'MESSAGE_USER_ADD', message: userMsg });\n config.onMessageSent?.(userMsg);\n\n if (streaming) {\n await consumeStream(sessionId, content, attachments);\n } else {\n await consumeBuffered(sessionId, content, attachments);\n }\n },\n [streaming, consumeStream, consumeBuffered, config, awaitSession],\n );\n\n const cancelStream = useCallback(() => {\n abortRef.current?.abort();\n }, []);\n\n const regenerate = useCallback(\n async (messageId?: string) => {\n log.lifecycle.info('regenerate', { messageId: messageId ?? '(last)' });\n const messages = stateRef.current.messages;\n let targetUserIdx = -1;\n if (messageId) {\n const idx = messages.findIndex((m) => m.id === messageId);\n if (idx !== -1) {\n targetUserIdx =\n messages[idx].role === 'user' ? idx : findPreviousUserIndex(messages, idx);\n }\n } else {\n targetUserIdx = findLastUserIndex(messages);\n }\n if (targetUserIdx === -1) return;\n const userMsg = messages[targetUserIdx];\n // Drop everything after this user message.\n for (let i = messages.length - 1; i > targetUserIdx; i -= 1) {\n dispatch({ type: 'MESSAGE_DELETE', id: messages[i].id });\n }\n const sessionId = await awaitSession();\n if (!sessionId) return;\n if (streaming) {\n await consumeStream(sessionId, userMsg.content, userMsg.attachments);\n } else {\n await consumeBuffered(sessionId, userMsg.content, userMsg.attachments);\n }\n },\n [streaming, consumeStream, consumeBuffered, awaitSession],\n );\n\n const editMessage = useCallback(\n async (id: string, content: string) => {\n dispatch({ type: 'MESSAGE_EDIT', id, content });\n const msg = stateRef.current.messages.find((m) => m.id === id);\n if (msg?.role === 'user') {\n await regenerate(id);\n }\n },\n [regenerate],\n );\n\n const deleteMessage = useCallback((id: string) => {\n dispatch({ type: 'MESSAGE_DELETE', id });\n }, []);\n\n const clearMessages = useCallback(() => {\n abortRef.current?.abort();\n dispatch({ type: 'MESSAGES_CLEAR' });\n }, []);\n\n const loadMore = useCallback(async () => {\n const sessionId = stateRef.current.sessionId;\n if (!sessionId) return;\n if (stateRef.current.isLoadingMore || !stateRef.current.hasMore) return;\n dispatch({ type: 'HISTORY_MORE_START' });\n try {\n const page = await transport.loadHistory(\n sessionId,\n stateRef.current.oldestCursor,\n pageSize,\n );\n dispatch({\n type: 'HISTORY_MORE_DONE',\n messages: page.messages,\n hasMore: page.hasMore,\n cursor: page.nextCursor,\n });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n lastErrorRef.current = e;\n dispatch({ type: 'ERROR_SET', error: e.message });\n config.onError?.(e);\n }\n }, [transport, pageSize, config]);\n\n const newSession = useCallback(async () => {\n log.lifecycle.info('newSession', { previous: stateRef.current.sessionId });\n abortRef.current?.abort();\n const previous = stateRef.current.sessionId;\n if (previous) {\n try {\n await transport.closeSession(previous);\n } catch {\n /* ignore */\n }\n }\n dispatch({ type: 'MESSAGES_CLEAR' });\n try {\n const info = await transport.createSession({ metadata: config.metadata });\n dispatch({\n type: 'SESSION_SET',\n sessionId: info.sessionId,\n messages: info.messages ?? [],\n hasMore: info.hasMore ?? false,\n cursor: info.cursor ?? null,\n });\n log.lifecycle.success('newSession ok', { sessionId: info.sessionId });\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n lastErrorRef.current = e;\n dispatch({ type: 'ERROR_SET', error: e.message });\n config.onError?.(e);\n log.error.error('newSession failed', { message: e.message });\n }\n }, [transport, config]);\n\n return {\n ...state,\n sendMessage,\n cancelStream,\n regenerate,\n editMessage,\n deleteMessage,\n clearMessages,\n loadMore,\n newSession,\n lastError: lastErrorRef.current,\n };\n}\n\nfunction findLastUserIndex(messages: ChatMessage[]): number {\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n if (messages[i].role === 'user') return i;\n }\n return -1;\n}\n\nfunction findPreviousUserIndex(messages: ChatMessage[], from: number): number {\n for (let i = from - 1; i >= 0; i -= 1) {\n if (messages[i].role === 'user') return i;\n }\n return -1;\n}\n\n// Suppress unused-action warnings if the action union grows.\ntype _Used = ChatAction;\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useLocalStorage, useMediaQuery } from '@djangocfg/ui-core/hooks';\n\nimport { CSS_VARS, DEFAULT_SIDEBAR, STORAGE_KEYS } from '../config';\nimport type { ChatDisplayMode } from '../types';\n\nexport interface UseChatLayoutConfig {\n defaultMode?: ChatDisplayMode;\n storageKey?: string;\n sidebarStorageKey?: string;\n reserveCssVar?: string;\n defaultSidebarWidth?: number;\n minSidebarWidth?: number;\n maxSidebarWidth?: number;\n /** Mobile breakpoint, e.g. '(max-width: 640px)'. */\n mobileQuery?: string;\n}\n\nexport interface UseChatLayoutReturn {\n mode: ChatDisplayMode;\n setMode: (m: ChatDisplayMode) => void;\n open: () => void;\n close: () => void;\n toggle: () => void;\n sidebarWidth: number;\n setSidebarWidth: (w: number) => void;\n isMobile: boolean;\n /** Mode after mobile collapse rules — sidebar/floating become fullscreen on mobile. */\n effectiveMode: ChatDisplayMode;\n}\n\nconst DEFAULT_MOBILE_QUERY = '(max-width: 640px)';\n\nexport function useChatLayout(config: UseChatLayoutConfig = {}): UseChatLayoutReturn {\n const {\n defaultMode = 'closed',\n storageKey = STORAGE_KEYS.mode,\n sidebarStorageKey = STORAGE_KEYS.sidebarWidth,\n reserveCssVar = CSS_VARS.reserve,\n defaultSidebarWidth = DEFAULT_SIDEBAR.width,\n minSidebarWidth = DEFAULT_SIDEBAR.min,\n maxSidebarWidth = DEFAULT_SIDEBAR.max,\n mobileQuery = DEFAULT_MOBILE_QUERY,\n } = config;\n\n const [mode, setMode] = useLocalStorage<ChatDisplayMode>(storageKey, defaultMode);\n const [sidebarWidthRaw, setSidebarWidthRaw] = useLocalStorage<number>(\n sidebarStorageKey,\n defaultSidebarWidth,\n );\n const isMobile = useMediaQuery(mobileQuery);\n\n const setSidebarWidth = useCallback(\n (w: number) => {\n const clamped = Math.max(minSidebarWidth, Math.min(maxSidebarWidth, w));\n setSidebarWidthRaw(clamped);\n },\n [setSidebarWidthRaw, minSidebarWidth, maxSidebarWidth],\n );\n\n const [previousOpenMode, setPreviousOpenMode] = useState<ChatDisplayMode>(\n mode === 'closed' ? 'embedded' : mode,\n );\n useEffect(() => {\n if (mode !== 'closed') setPreviousOpenMode(mode);\n }, [mode]);\n\n const open = useCallback(() => {\n setMode(previousOpenMode === 'closed' ? 'embedded' : previousOpenMode);\n }, [setMode, previousOpenMode]);\n\n const close = useCallback(() => setMode('closed'), [setMode]);\n const toggle = useCallback(() => {\n setMode((mode === 'closed' ? previousOpenMode : 'closed') as ChatDisplayMode);\n }, [setMode, mode, previousOpenMode]);\n\n const effectiveMode = useMemo<ChatDisplayMode>(() => {\n if (mode === 'closed') return 'closed';\n if (isMobile && (mode === 'sidebar' || mode === 'floating')) return 'fullscreen';\n return mode;\n }, [mode, isMobile]);\n\n // Reserve right padding when in sidebar mode.\n useEffect(() => {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n if (effectiveMode === 'sidebar') {\n root.style.setProperty(reserveCssVar, `${sidebarWidthRaw}px`);\n } else {\n root.style.removeProperty(reserveCssVar);\n }\n return () => {\n root.style.removeProperty(reserveCssVar);\n };\n }, [effectiveMode, sidebarWidthRaw, reserveCssVar]);\n\n return {\n mode,\n setMode,\n open,\n close,\n toggle,\n sidebarWidth: sidebarWidthRaw,\n setSidebarWidth,\n isMobile,\n effectiveMode,\n };\n}\n","// Per-provider audio bus.\n//\n// Owns the actual `<audio>` elements (one per (bus × event)) plus the global\n// \"unlocked\" flag. Pure module / class — no React. The hook layer is in\n// `hooks/useChatAudio.ts`.\n//\n// Pitfalls this addresses (lessons from AudioPlayer/audio):\n// - Safari needs a user-gesture transaction to unlock playback. We pre-allocate\n// an `<audio>` per event and call `play()` on each during the unlock event.\n// - Multiple `play()` calls in quick succession on the same element: we clone\n// a fresh `HTMLAudioElement` from the cache for each fire so they don't\n// cancel each other (cheap — same `src` reuses the HTTP cache).\n// - SSR safety: ALL DOM access is gated; the bus is only constructed in\n// a `'use client'` component (the provider).\n// - `play()` returns a Promise; uncaught rejections show up as warnings on\n// Chrome. We attach `.catch()` everywhere.\n// - Module unload cleanup: `dispose()` revokes blob URLs, drops listeners,\n// and clears the cache.\n\nimport type { ChatAudioEvent, ChatAudioSounds } from './types';\n\ninterface BusOptions {\n sounds: ChatAudioSounds;\n /** Returns the current master volume 0..1. Read on each play. */\n getVolume: () => number;\n /** Returns master mute. Read on each play. */\n getMuted: () => boolean;\n /** Per-event predicate. */\n isEnabled: (event: ChatAudioEvent) => boolean;\n}\n\nexport interface ChatAudioBus {\n play: (event: ChatAudioEvent) => void;\n preload: (event: ChatAudioEvent) => void;\n unlock: () => void;\n isUnlocked: () => boolean;\n /** Lets the provider re-publish unlock changes to React via a listener. */\n subscribeUnlock: (cb: (unlocked: boolean) => void) => () => void;\n /** Hot-swap the sounds map without re-creating the bus. */\n setSounds: (sounds: ChatAudioSounds) => void;\n dispose: () => void;\n}\n\n// One unlock state per tab — first gesture inside ANY <ChatProvider> unlocks\n// every bus. AudioPlayer follows the same \"global per tab\" rule for its\n// AudioContext (ADR-004).\nlet unlocked = false;\nconst unlockListeners = new Set<(v: boolean) => void>();\n\nfunction setUnlocked(value: boolean) {\n if (unlocked === value) return;\n unlocked = value;\n for (const cb of unlockListeners) cb(value);\n}\n\nexport function _resetUnlockForTesting(): void {\n unlocked = false;\n unlockListeners.clear();\n}\n\nexport function createAudioBus(options: BusOptions): ChatAudioBus {\n // SSR guard.\n if (typeof window === 'undefined') {\n return noopBus();\n }\n\n let sounds = options.sounds;\n /** Cache of \"template\" audio elements per URL — reused across plays. */\n const cache = new Map<string, HTMLAudioElement>();\n\n const getOrCreate = (url: string): HTMLAudioElement => {\n const hit = cache.get(url);\n if (hit) return hit;\n const el = new Audio(url);\n el.preload = 'auto';\n el.crossOrigin = 'anonymous';\n cache.set(url, el);\n return el;\n };\n\n const resolveUrl = (event: ChatAudioEvent): string | null => {\n const v = sounds[event];\n if (!v) return null;\n return v;\n };\n\n const play = (event: ChatAudioEvent) => {\n if (options.getMuted()) return;\n if (!options.isEnabled(event)) return;\n const url = resolveUrl(event);\n if (!url) return;\n\n // Use the cached template just for HTTP cache warming; clone so two rapid\n // events don't cut each other off on the same element.\n getOrCreate(url);\n const fresh = new Audio(url);\n fresh.preload = 'auto';\n fresh.volume = options.getVolume();\n // Fire-and-forget; the promise rejects when autoplay is blocked.\n const p = fresh.play();\n if (p && typeof p.catch === 'function') {\n p.catch(() => {\n // Browser blocked playback (no gesture yet) — ignore.\n });\n }\n };\n\n const preload = (event: ChatAudioEvent) => {\n const url = resolveUrl(event);\n if (!url) return;\n const el = getOrCreate(url);\n // Trigger a low-priority load.\n try {\n el.load();\n } catch {\n // ignore\n }\n };\n\n const unlock = () => {\n if (unlocked) return;\n // Play (silently) every cached element in one user-gesture transaction so\n // Safari/iOS lifts the autoplay block for the whole bus at once.\n for (const el of cache.values()) {\n const wasMuted = el.muted;\n el.muted = true;\n const p = el.play();\n if (p && typeof p.then === 'function') {\n p.then(() => {\n el.pause();\n el.currentTime = 0;\n el.muted = wasMuted;\n }).catch(() => {\n el.muted = wasMuted;\n });\n } else {\n el.pause();\n el.muted = wasMuted;\n }\n }\n setUnlocked(true);\n };\n\n return {\n play,\n preload,\n unlock,\n isUnlocked: () => unlocked,\n subscribeUnlock(cb) {\n unlockListeners.add(cb);\n return () => unlockListeners.delete(cb);\n },\n setSounds(next) {\n sounds = next;\n },\n dispose() {\n cache.clear();\n },\n };\n}\n\nfunction noopBus(): ChatAudioBus {\n return {\n play: () => undefined,\n preload: () => undefined,\n unlock: () => undefined,\n isUnlocked: () => false,\n subscribeUnlock: () => () => undefined,\n setSounds: () => undefined,\n dispose: () => undefined,\n };\n}\n","// Cross-tab persistent chat-audio prefs (master volume / muted / unlocked).\n//\n// Why Zustand here (vs. AudioPlayer's plain module-level store): the chat\n// audio system has more knobs (per-event toggles + volume + muted) and lives\n// behind a React context where multiple chat providers might exist. We get the\n// `subscribe()` + `useSyncExternalStore` plumbing for free, and the persist\n// middleware handles cross-tab sync via the `storage` event.\n//\n// We DO NOT close the AudioContext (matches AudioPlayer's ADR-004) and we\n// remain SSR-safe by gating window access in the bus, not here.\n\n'use client';\n\nimport { create } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\nimport type { ChatAudioEvent } from './types';\n\nconst STORAGE_KEY = 'djangocfg-chat-audio:prefs';\n\nexport interface ChatAudioPrefsState {\n /** 0..1 master volume. */\n volume: number;\n /** Master mute (overrides per-event toggles). */\n muted: boolean;\n /** Per-event opt-out — `false` silences a single trigger. */\n enabled: Partial<Record<ChatAudioEvent, boolean>>;\n\n setVolume: (v: number) => void;\n setMuted: (m: boolean) => void;\n setEventEnabled: (event: ChatAudioEvent, enabled: boolean) => void;\n}\n\nconst clamp01 = (v: number): number => {\n if (!Number.isFinite(v)) return 1;\n return v < 0 ? 0 : v > 1 ? 1 : v;\n};\n\nexport const useChatAudioPrefs = create<ChatAudioPrefsState>()(\n persist(\n (set) => ({\n volume: 1,\n muted: false,\n enabled: {},\n\n setVolume: (v) => set({ volume: clamp01(v) }),\n setMuted: (m) => set({ muted: !!m }),\n setEventEnabled: (event, enabled) =>\n set((s) => ({ enabled: { ...s.enabled, [event]: enabled } })),\n }),\n {\n name: STORAGE_KEY,\n storage: createJSONStorage(() => {\n // SSR-safe: zustand calls `getStorage()` lazily, but be defensive.\n if (typeof window === 'undefined') {\n return {\n getItem: () => null,\n setItem: () => undefined,\n removeItem: () => undefined,\n };\n }\n return window.localStorage;\n }),\n partialize: (s) => ({ volume: s.volume, muted: s.muted, enabled: s.enabled }),\n version: 1,\n },\n ),\n);\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\n\nimport { createAudioBus, type ChatAudioBus } from '../core/audio/audioBus';\nimport { useChatAudioPrefs } from '../core/audio/preferences';\nimport type {\n ChatAudioConfig,\n ChatAudioEvent,\n UseChatAudioReturn,\n} from '../core/audio/types';\n\nconst ALL_EVENTS: ChatAudioEvent[] = [\n 'messageSent',\n 'messageReceived',\n 'streamStart',\n 'error',\n 'mention',\n 'notification',\n];\n\nfunction readReducedMotion(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\nfunction readReducedData(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia('(prefers-reduced-data: reduce)').matches;\n}\n\nfunction readVisibilityHidden(): boolean {\n if (typeof document === 'undefined') return false;\n return document.visibilityState === 'hidden';\n}\n\nexport function useChatAudio(config: ChatAudioConfig = {}): UseChatAudioReturn {\n const {\n sounds = {},\n volume: volumeOverride,\n muted: mutedOverride,\n shouldPlay,\n respectReducedMotion = true,\n respectReducedData = true,\n muteWhenHidden = true,\n } = config;\n\n const volume = useChatAudioPrefs((s) => (volumeOverride != null ? volumeOverride : s.volume));\n const mutedPersisted = useChatAudioPrefs((s) => s.muted);\n const muted = mutedOverride != null ? mutedOverride : mutedPersisted;\n const enabledMap = useChatAudioPrefs((s) => s.enabled);\n const setVolumePref = useChatAudioPrefs((s) => s.setVolume);\n const setMutedPref = useChatAudioPrefs((s) => s.setMuted);\n const setEventEnabledPref = useChatAudioPrefs((s) => s.setEventEnabled);\n\n // Refs to keep `play()` referentially-stable while still reading current prefs.\n const volumeRef = useRef(volume);\n volumeRef.current = volume;\n const mutedRef = useRef(muted);\n mutedRef.current = muted;\n const enabledRef = useRef(enabledMap);\n enabledRef.current = enabledMap;\n const reducedMotionRef = useRef(readReducedMotion());\n const reducedDataRef = useRef(readReducedData());\n const hiddenRef = useRef(readVisibilityHidden());\n const shouldPlayRef = useRef(shouldPlay);\n shouldPlayRef.current = shouldPlay;\n\n // Watch reduced-motion / reduced-data preference changes.\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n const mqMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n const mqData = window.matchMedia('(prefers-reduced-data: reduce)');\n const onMotion = () => {\n reducedMotionRef.current = mqMotion.matches;\n };\n const onData = () => {\n reducedDataRef.current = mqData.matches;\n };\n mqMotion.addEventListener('change', onMotion);\n mqData.addEventListener('change', onData);\n return () => {\n mqMotion.removeEventListener('change', onMotion);\n mqData.removeEventListener('change', onData);\n };\n }, []);\n\n // Visibility tracking — mute while tab is hidden.\n useEffect(() => {\n if (!muteWhenHidden || typeof document === 'undefined') return;\n const onVis = () => {\n hiddenRef.current = document.visibilityState === 'hidden';\n };\n document.addEventListener('visibilitychange', onVis);\n return () => document.removeEventListener('visibilitychange', onVis);\n }, [muteWhenHidden]);\n\n // Bus instance — created once per provider, sounds map hot-swapped on change.\n const busRef = useRef<ChatAudioBus | null>(null);\n if (busRef.current === null) {\n busRef.current = createAudioBus({\n sounds,\n getVolume: () => volumeRef.current,\n getMuted: () => effectiveMuted(),\n isEnabled: (event) => isEnabledImpl(event),\n });\n }\n\n function effectiveMuted(): boolean {\n if (mutedRef.current) return true;\n if (muteWhenHidden && hiddenRef.current) return true;\n if (respectReducedMotion && reducedMotionRef.current) return true;\n if (respectReducedData && reducedDataRef.current) return true;\n return false;\n }\n\n function isEnabledImpl(event: ChatAudioEvent): boolean {\n if (shouldPlayRef.current && shouldPlayRef.current(event) === false) return false;\n const flag = enabledRef.current[event];\n if (flag === false) return false;\n return true;\n }\n\n // Hot-swap sounds when caller-provided map changes.\n useEffect(() => {\n busRef.current?.setSounds(sounds);\n }, [sounds]);\n\n // Preload all configured events once.\n useEffect(() => {\n const bus = busRef.current;\n if (!bus) return;\n for (const event of ALL_EVENTS) {\n bus.preload(event);\n }\n }, [sounds]);\n\n // Dispose on unmount.\n useEffect(() => {\n const bus = busRef.current;\n return () => {\n bus?.dispose();\n };\n }, []);\n\n // Reactive `isUnlocked`.\n const isUnlocked = useSyncExternalStore(\n useCallback((cb) => busRef.current?.subscribeUnlock(cb) ?? (() => undefined), []),\n () => busRef.current?.isUnlocked() ?? false,\n () => false,\n );\n\n const play = useCallback((event: ChatAudioEvent) => {\n busRef.current?.play(event);\n }, []);\n const preload = useCallback((event: ChatAudioEvent) => {\n busRef.current?.preload(event);\n }, []);\n const unlock = useCallback(() => {\n busRef.current?.unlock();\n }, []);\n\n const isEventEnabled = useCallback(\n (event: ChatAudioEvent) => isEnabledImpl(event),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n );\n\n const api = useMemo<UseChatAudioReturn>(\n () => ({\n play,\n preload,\n unlock,\n isUnlocked,\n muted,\n setMuted: (m: boolean) => setMutedPref(m),\n volume,\n setVolume: (v: number) => setVolumePref(v),\n isEventEnabled,\n setEventEnabled: (event, enabled) => setEventEnabledPref(event, enabled),\n }),\n [play, preload, unlock, isUnlocked, muted, volume, isEventEnabled, setMutedPref, setVolumePref, setEventEnabledPref],\n );\n\n // We need a useState here just to register a re-render trigger when the\n // bus reports unlock changes — but we already wired `useSyncExternalStore`\n // above, so this is a no-op holder.\n void useState;\n\n return api;\n}\n","'use client';\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n} from 'react';\n\nimport type { ChatConfig, ChatLabels, ChatTransport } from '../types';\nimport { DEFAULT_LABELS } from '../types';\nimport { useChat, type UseChatReturn } from '../hooks/useChat';\nimport { useChatLayout, type UseChatLayoutReturn } from '../hooks/useChatLayout';\nimport { useChatAudio } from '../hooks/useChatAudio';\nimport type { ChatAudioConfig, UseChatAudioReturn } from '../core/audio/types';\n\nexport interface ChatContextValue extends UseChatReturn {\n layout: UseChatLayoutReturn;\n config: ChatConfig;\n labels: ChatLabels;\n audio: UseChatAudioReturn;\n}\n\nconst Ctx = createContext<ChatContextValue | null>(null);\n\nexport interface ChatProviderProps {\n transport: ChatTransport;\n config?: ChatConfig;\n initialSessionId?: string;\n autoCreateSession?: boolean;\n streaming?: boolean;\n /** Audio-trigger configuration. Off by default (no `sounds` map). */\n audio?: ChatAudioConfig;\n /** Enable verbose dev logging via consola. Defaults to `isDev`. */\n debug?: boolean;\n children?: ReactNode;\n}\n\nexport function ChatProvider({\n transport,\n config = {},\n initialSessionId,\n autoCreateSession,\n streaming,\n audio,\n debug,\n children,\n}: ChatProviderProps) {\n const audioApi = useChatAudio(audio ?? {});\n\n // Keep latest audio API in a ref so the chat-callback closures stay\n // referentially stable (don't re-mount transport on every audio change).\n const audioRef = useRef(audioApi);\n audioRef.current = audioApi;\n\n const onMessageSent = useCallback(() => audioRef.current.play('messageSent'), []);\n const onMessageEnd = useCallback(() => audioRef.current.play('messageReceived'), []);\n const onStreamStart = useCallback(() => audioRef.current.play('streamStart'), []);\n const onError = useCallback(() => audioRef.current.play('error'), []);\n\n const chat = useChat({\n transport,\n initialSessionId,\n autoCreateSession,\n streaming,\n debug,\n metadata: {\n locale: config.locale ?? config.prefs?.locale,\n slug: config.slug,\n },\n userPersona: config.user,\n onMessageSent,\n onMessageEnd,\n onStreamStart,\n onError,\n });\n const layout = useChatLayout({ defaultMode: 'embedded' });\n\n // Auto-unlock audio on the first user gesture inside the provider.\n const rootRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n if (audioApi.isUnlocked) return;\n const root = rootRef.current;\n if (!root) return;\n const handler = () => {\n audioApi.unlock();\n };\n root.addEventListener('pointerdown', handler, { once: true, capture: true });\n root.addEventListener('keydown', handler, { once: true, capture: true });\n return () => {\n root.removeEventListener('pointerdown', handler, { capture: true });\n root.removeEventListener('keydown', handler, { capture: true });\n };\n }, [audioApi]);\n\n const labels = useMemo<ChatLabels>(\n () => ({ ...DEFAULT_LABELS, ...(config.labels ?? {}) }),\n [config.labels],\n );\n\n const value = useMemo<ChatContextValue>(\n () => ({ ...chat, layout, config, labels, audio: audioApi }),\n [chat, layout, config, labels, audioApi],\n );\n\n return (\n <Ctx.Provider value={value}>\n <div ref={rootRef} style={{ display: 'contents' }}>\n {children}\n </div>\n </Ctx.Provider>\n );\n}\n\nexport function useChatContext(): ChatContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error('useChatContext must be used inside <ChatProvider>');\n return v;\n}\n\nexport function useChatContextOptional(): ChatContextValue | null {\n return useContext(Ctx);\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type ClipboardEvent,\n type KeyboardEvent,\n type RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport type { ChatAttachment } from '../types';\nimport { LIMITS } from '../config';\n\nexport interface UseChatComposerOptions {\n onSubmit: (content: string, attachments: ChatAttachment[]) => void | Promise<void>;\n initialValue?: string;\n maxLength?: number;\n maxAttachments?: number;\n disabled?: boolean;\n /** 'enter' = Enter sends, Shift+Enter newline. 'cmd+enter' = Enter inserts newline, Cmd/Ctrl+Enter sends. */\n submitOn?: 'enter' | 'cmd+enter';\n history?: { enabled?: boolean; size?: number };\n onPasteFiles?: (files: File[]) => void;\n}\n\nexport interface UseChatComposerReturn {\n value: string;\n setValue: (next: string) => void;\n attachments: ChatAttachment[];\n addAttachment: (a: ChatAttachment) => void;\n removeAttachment: (id: string) => void;\n isSubmitting: boolean;\n canSubmit: boolean;\n submit: () => Promise<void>;\n reset: () => void;\n focus: () => void;\n textareaRef: RefObject<HTMLTextAreaElement | null>;\n textareaProps: {\n ref: RefObject<HTMLTextAreaElement | null>;\n value: string;\n disabled: boolean;\n onChange: (e: ChangeEvent<HTMLTextAreaElement>) => void;\n onKeyDown: (e: KeyboardEvent<HTMLTextAreaElement>) => void;\n onPaste: (e: ClipboardEvent<HTMLTextAreaElement>) => void;\n };\n recallPrevious: () => void;\n recallNext: () => void;\n}\n\nconst MAX_TEXTAREA_HEIGHT = 240;\n\nexport function useChatComposer(options: UseChatComposerOptions): UseChatComposerReturn {\n const {\n onSubmit,\n initialValue = '',\n maxLength = LIMITS.messageMaxLength,\n maxAttachments = LIMITS.attachmentsMax,\n disabled = false,\n submitOn = 'enter',\n history = { enabled: true, size: LIMITS.composerHistorySize },\n onPasteFiles,\n } = options;\n\n const [value, setValueState] = useState(initialValue);\n const [attachments, setAttachments] = useState<ChatAttachment[]>([]);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n const historyRef = useRef<{ items: string[]; index: number }>({ items: [], index: -1 });\n\n const setValue = useCallback(\n (next: string) => {\n setValueState(next.length > maxLength ? next.slice(0, maxLength) : next);\n },\n [maxLength],\n );\n\n // Autosize textarea on value change.\n useEffect(() => {\n const el = textareaRef.current;\n if (!el) return;\n el.style.height = 'auto';\n el.style.height = `${Math.min(el.scrollHeight, MAX_TEXTAREA_HEIGHT)}px`;\n }, [value]);\n\n const reset = useCallback(() => {\n setValueState('');\n setAttachments([]);\n historyRef.current.index = -1;\n }, []);\n\n const focus = useCallback(() => {\n requestAnimationFrame(() => textareaRef.current?.focus());\n }, []);\n\n const submit = useCallback(async () => {\n const trimmed = value.trim();\n if ((!trimmed && attachments.length === 0) || isSubmitting || disabled) return;\n setIsSubmitting(true);\n try {\n if (history.enabled !== false && trimmed) {\n const buf = historyRef.current.items;\n if (buf[buf.length - 1] !== trimmed) {\n buf.push(trimmed);\n if (buf.length > (history.size ?? LIMITS.composerHistorySize)) buf.shift();\n }\n historyRef.current.index = -1;\n }\n const snapshot = [...attachments];\n const text = value;\n reset();\n await onSubmit(text, snapshot);\n } finally {\n setIsSubmitting(false);\n }\n }, [value, attachments, isSubmitting, disabled, history, onSubmit, reset]);\n\n const addAttachment = useCallback(\n (a: ChatAttachment) => {\n setAttachments((prev) => {\n if (prev.some((p) => p.id === a.id)) {\n return prev.map((p) => (p.id === a.id ? a : p));\n }\n if (prev.length >= maxAttachments) return prev;\n return [...prev, a];\n });\n },\n [maxAttachments],\n );\n\n const removeAttachment = useCallback((id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n const recallPrevious = useCallback(() => {\n const { items } = historyRef.current;\n if (!items.length) return;\n const next = historyRef.current.index < 0 ? items.length - 1 : Math.max(0, historyRef.current.index - 1);\n historyRef.current.index = next;\n setValueState(items[next]);\n }, []);\n\n const recallNext = useCallback(() => {\n const { items } = historyRef.current;\n if (!items.length || historyRef.current.index < 0) return;\n const next = historyRef.current.index + 1;\n if (next >= items.length) {\n historyRef.current.index = -1;\n setValueState('');\n return;\n }\n historyRef.current.index = next;\n setValueState(items[next]);\n }, []);\n\n const onChange = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value);\n },\n [setValue],\n );\n\n const onKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter') {\n const isCmd = e.metaKey || e.ctrlKey;\n const shouldSend = submitOn === 'cmd+enter' ? isCmd : !e.shiftKey;\n if (shouldSend) {\n e.preventDefault();\n void submit();\n }\n return;\n }\n if (history.enabled !== false && value === '' && attachments.length === 0) {\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n recallPrevious();\n } else if (e.key === 'ArrowDown' && historyRef.current.index >= 0) {\n e.preventDefault();\n recallNext();\n }\n }\n },\n [submitOn, submit, history, value, attachments.length, recallPrevious, recallNext],\n );\n\n const onPaste = useCallback(\n (e: ClipboardEvent<HTMLTextAreaElement>) => {\n const files = Array.from(e.clipboardData?.files ?? []);\n if (files.length && onPasteFiles) {\n e.preventDefault();\n onPasteFiles(files);\n }\n },\n [onPasteFiles],\n );\n\n const canSubmit =\n !disabled && !isSubmitting && (value.trim().length > 0 || attachments.length > 0);\n\n return {\n value,\n setValue,\n attachments,\n addAttachment,\n removeAttachment,\n isSubmitting,\n canSubmit,\n submit,\n reset,\n focus,\n textareaRef,\n textareaProps: {\n ref: textareaRef,\n value,\n disabled,\n onChange,\n onKeyDown,\n onPaste,\n },\n recallPrevious,\n recallNext,\n };\n}\n","'use client';\n\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseChatScrollOptions {\n containerRef: RefObject<HTMLElement | null>;\n bottomRef: RefObject<HTMLElement | null>;\n isStreaming?: boolean;\n /** Distance from bottom (px) considered \"at bottom\". */\n bottomThresholdPx?: number;\n /** Bump key — increment when a new message arrives so the hook re-evaluates auto-scroll. */\n messagesCount?: number;\n}\n\nexport interface UseChatScrollReturn {\n isAtBottom: boolean;\n unreadCount: number;\n scrollToBottom: (smooth?: boolean) => void;\n resetUnread: () => void;\n}\n\nexport function useChatScroll(options: UseChatScrollOptions): UseChatScrollReturn {\n const {\n containerRef,\n bottomRef,\n isStreaming = false,\n bottomThresholdPx = 80,\n messagesCount = 0,\n } = options;\n\n const [isAtBottom, setIsAtBottom] = useState(true);\n const [unreadCount, setUnreadCount] = useState(0);\n const lastCountRef = useRef(messagesCount);\n const stickyRef = useRef(true);\n const wasStreamingRef = useRef(isStreaming);\n\n const scrollToBottom = useCallback(\n (smooth = false) => {\n const el = containerRef.current;\n if (!el) return;\n el.scrollTo({\n top: el.scrollHeight,\n behavior: smooth ? 'smooth' : 'auto',\n });\n stickyRef.current = true;\n setIsAtBottom(true);\n setUnreadCount(0);\n },\n [containerRef],\n );\n\n const resetUnread = useCallback(() => setUnreadCount(0), []);\n\n // Track scroll position relative to bottom.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const onScroll = () => {\n const distance = el.scrollHeight - el.scrollTop - el.clientHeight;\n const atBottom = distance <= bottomThresholdPx;\n stickyRef.current = atBottom;\n setIsAtBottom(atBottom);\n if (atBottom) setUnreadCount(0);\n };\n onScroll();\n el.addEventListener('scroll', onScroll, { passive: true });\n return () => {\n el.removeEventListener('scroll', onScroll);\n };\n }, [containerRef, bottomThresholdPx]);\n\n // Stick to bottom while streaming, and one extra rAF after stream ends so\n // the final layout (markdown re-render, sources/tool-call panels) doesn't\n // push the latest content out of view.\n useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n\n if (isStreaming) {\n wasStreamingRef.current = true;\n if (!stickyRef.current) return;\n let raf = 0;\n const tick = () => {\n if (!stickyRef.current) return;\n el.scrollTop = el.scrollHeight;\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }\n\n // Stream just ended — flush one more scroll on the next two frames so\n // both markdown swap and any post-stream panel insertions are reflected.\n if (wasStreamingRef.current && stickyRef.current) {\n wasStreamingRef.current = false;\n let raf1 = 0;\n let raf2 = 0;\n raf1 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n raf2 = requestAnimationFrame(() => {\n el.scrollTop = el.scrollHeight;\n });\n });\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n };\n }\n wasStreamingRef.current = false;\n return;\n }, [containerRef, isStreaming]);\n\n // On message count increase, decide whether to scroll or bump unread.\n useEffect(() => {\n if (messagesCount > lastCountRef.current) {\n if (stickyRef.current) {\n const el = containerRef.current;\n if (el) el.scrollTop = el.scrollHeight;\n } else {\n setUnreadCount((n) => n + (messagesCount - lastCountRef.current));\n }\n }\n lastCountRef.current = messagesCount;\n }, [containerRef, messagesCount]);\n\n // Watch bottom sentinel just for symmetry/future hooks.\n useEffect(() => {\n void bottomRef;\n }, [bottomRef]);\n\n return { isAtBottom, unreadCount, scrollToBottom, resetUnread };\n}\n","'use client';\n\nimport { type RefObject, useEffect, useRef } from 'react';\n\nexport interface UseChatHistoryOptions {\n enabled?: boolean;\n containerRef: RefObject<HTMLElement | null>;\n topSentinelRef: RefObject<HTMLElement | null>;\n hasMore: boolean;\n isLoadingMore: boolean;\n loadMore: () => Promise<void>;\n}\n\n/** Triggers `loadMore` when the top sentinel enters the container's viewport.\n * Preserves scroll anchor: if the container's height grows after load, we\n * bump scrollTop by the delta so the previously-visible message stays put. */\nexport function useChatHistory(options: UseChatHistoryOptions): void {\n const { enabled = true, containerRef, topSentinelRef, hasMore, isLoadingMore, loadMore } = options;\n const heightBeforeRef = useRef<number | null>(null);\n\n // Restore anchor after content prepends.\n useEffect(() => {\n if (heightBeforeRef.current == null) return;\n const el = containerRef.current;\n if (!el) {\n heightBeforeRef.current = null;\n return;\n }\n if (!isLoadingMore) {\n const delta = el.scrollHeight - heightBeforeRef.current;\n if (delta > 0) {\n el.scrollTop += delta;\n }\n heightBeforeRef.current = null;\n }\n }, [containerRef, isLoadingMore]);\n\n useEffect(() => {\n if (!enabled || !hasMore) return;\n const sentinel = topSentinelRef.current;\n const root = containerRef.current;\n if (!sentinel || !root) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (!entry?.isIntersecting) return;\n if (isLoadingMore) return;\n const el = containerRef.current;\n if (el) heightBeforeRef.current = el.scrollHeight;\n void loadMore();\n },\n { root, threshold: 0, rootMargin: '200px 0px 0px 0px' },\n );\n\n observer.observe(sentinel);\n return () => observer.disconnect();\n }, [enabled, hasMore, isLoadingMore, containerRef, topSentinelRef, loadMore]);\n}\n","'use client';\n\nimport { type ReactNode } from 'react';\nimport { File as FileIcon, X } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ChatAttachment } from '../types';\n\nexport interface AttachmentRendererArgs {\n attachment: ChatAttachment;\n /** True when shown inside the composer's staging tray (denser layout). */\n isInComposer: boolean;\n onClick?: () => void;\n onRemove?: () => void;\n}\n\nexport type AttachmentRenderer = (args: AttachmentRendererArgs) => ReactNode;\n\nexport interface AttachmentRendererMap {\n image?: AttachmentRenderer;\n audio?: AttachmentRenderer;\n video?: AttachmentRenderer;\n file?: AttachmentRenderer;\n /** Fallback renderer when no per-type entry matched. */\n default?: AttachmentRenderer;\n}\n\ninterface CommonProps {\n attachments: ChatAttachment[];\n maxVisible?: number;\n onClick?: (a: ChatAttachment) => void;\n onRemove?: (a: ChatAttachment) => void;\n isInComposer?: boolean;\n className?: string;\n}\n\n// ---------------------------------------------------------------------------\n// AttachmentsGrid — flex-wrap, ideal for thumbnails / file chips.\n// ---------------------------------------------------------------------------\n\nexport interface AttachmentsGridProps extends CommonProps {\n layout?: 'wrap' | 'grid';\n}\n\nexport function AttachmentsGrid({\n attachments,\n maxVisible,\n onClick,\n onRemove,\n isInComposer = false,\n layout = 'wrap',\n className,\n}: AttachmentsGridProps) {\n if (!attachments?.length) return null;\n const visible = maxVisible ? attachments.slice(0, maxVisible) : attachments;\n return (\n <div\n className={cn(\n layout === 'grid' ? 'grid grid-cols-3 gap-2' : 'flex flex-wrap gap-2',\n className,\n )}\n >\n {visible.map((a) => (\n <AttachmentTile\n key={a.id}\n attachment={a}\n isInComposer={isInComposer}\n onClick={onClick ? () => onClick(a) : undefined}\n onRemove={onRemove ? () => onRemove(a) : undefined}\n />\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// AttachmentsList — vertical stack, designed for rich custom renderers\n// (LazyAudioPlayer, video players, document previews).\n// ---------------------------------------------------------------------------\n\nexport interface AttachmentsListProps extends CommonProps {\n /** Per-type renderer overrides. Falls back to the default tile. */\n renderers?: AttachmentRendererMap;\n}\n\nexport function AttachmentsList({\n attachments,\n maxVisible,\n onClick,\n onRemove,\n renderers,\n isInComposer = false,\n className,\n}: AttachmentsListProps) {\n if (!attachments?.length) return null;\n const visible = maxVisible ? attachments.slice(0, maxVisible) : attachments;\n return (\n <div className={cn('flex w-full flex-col gap-2', className)}>\n {visible.map((a) => {\n const renderer = renderers?.[a.type] ?? renderers?.default;\n const args: AttachmentRendererArgs = {\n attachment: a,\n isInComposer,\n onClick: onClick ? () => onClick(a) : undefined,\n onRemove: onRemove ? () => onRemove(a) : undefined,\n };\n if (renderer) {\n return (\n <div key={a.id} className=\"relative w-full min-w-0\">\n {renderer(args)}\n {args.onRemove ? <RemoveBtn onRemove={args.onRemove} /> : null}\n </div>\n );\n }\n return <AttachmentTile key={a.id} {...args} />;\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Attachments — backwards-compatible facade. Picks the right component based\n// on whether `renderers` are supplied. Existing call-sites keep working.\n// ---------------------------------------------------------------------------\n\nexport interface AttachmentsProps extends CommonProps {\n layout?: 'grid' | 'row';\n renderers?: AttachmentRendererMap;\n}\n\nexport function Attachments(props: AttachmentsProps) {\n const { renderers, layout, ...rest } = props;\n if (renderers) {\n return <AttachmentsList {...rest} renderers={renderers} />;\n }\n return <AttachmentsGrid {...rest} layout={layout === 'grid' ? 'grid' : 'wrap'} />;\n}\n\n// ---------------------------------------------------------------------------\n// Tile + remove btn (default renderers).\n// ---------------------------------------------------------------------------\n\nfunction AttachmentTile({ attachment, onClick, onRemove }: AttachmentRendererArgs) {\n const isImage = attachment.type === 'image';\n const isUploading = attachment.status === 'uploading';\n\n const inner = isImage ? (\n <img\n src={attachment.thumbnailUrl ?? attachment.url}\n alt={attachment.name ?? 'attachment'}\n className=\"h-16 w-16 rounded-md object-cover\"\n loading=\"lazy\"\n />\n ) : (\n <div className=\"flex max-w-44 items-center gap-2 rounded-md border border-border bg-background/60 px-2 py-1.5 text-xs\">\n <FileIcon aria-hidden className=\"size-4 shrink-0 text-muted-foreground\" />\n <span className=\"truncate\">{attachment.name ?? 'file'}</span>\n </div>\n );\n\n return (\n <div className=\"relative\">\n {onClick ? (\n <button type=\"button\" onClick={onClick} className=\"block\">\n {inner}\n </button>\n ) : (\n inner\n )}\n {isUploading ? (\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center rounded-md bg-background/70 text-[10px] font-medium\">\n {attachment.progress != null ? `${Math.round(attachment.progress * 100)}%` : '…'}\n </div>\n ) : null}\n {onRemove ? <RemoveBtn onRemove={onRemove} /> : null}\n </div>\n );\n}\n\nfunction RemoveBtn({ onRemove }: { onRemove: () => void }) {\n return (\n <button\n type=\"button\"\n aria-label=\"Remove attachment\"\n onClick={onRemove}\n className=\"absolute -right-1.5 -top-1.5 grid h-4 w-4 place-items-center rounded-full border border-border bg-background text-muted-foreground hover:bg-destructive hover:text-destructive-foreground\"\n >\n <X aria-hidden className=\"size-2.5\" />\n </button>\n );\n}\n","'use client';\n\nimport { type ReactNode, forwardRef } from 'react';\nimport { Paperclip, Send, Square } from 'lucide-react';\n\nimport { Button, Textarea } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { useChatContextOptional } from '../context';\nimport type { UseChatComposerReturn } from '../hooks/useChatComposer';\nimport { Attachments } from './Attachments';\n\nexport interface ComposerProps {\n composer: UseChatComposerReturn;\n placeholder?: string;\n disabled?: boolean;\n showAttachmentButton?: boolean;\n onPickFiles?: () => void;\n toolbarStart?: ReactNode;\n toolbarEnd?: ReactNode;\n attachmentTray?: ReactNode;\n className?: string;\n textareaClassName?: string;\n /** Show \"Stop\" button instead of \"Send\" while streaming. */\n isStreaming?: boolean;\n onCancel?: () => void;\n}\n\nexport const Composer = forwardRef<HTMLDivElement, ComposerProps>(function Composer(\n {\n composer,\n placeholder = 'Type a message...',\n disabled,\n showAttachmentButton = false,\n onPickFiles,\n toolbarStart,\n toolbarEnd,\n attachmentTray,\n className,\n textareaClassName,\n isStreaming: isStreamingProp,\n onCancel: onCancelProp,\n },\n ref,\n) {\n const ctx = useChatContextOptional();\n const isStreaming = isStreamingProp ?? ctx?.isStreaming ?? false;\n const onCancel = onCancelProp ?? ctx?.cancelStream;\n const isDisabled = disabled ?? isStreaming;\n\n return (\n <div\n ref={ref}\n className={cn(\n 'border-t border-border bg-background/95 px-2.5 pt-2 pb-[max(0.5rem,env(safe-area-inset-bottom))]',\n className,\n )}\n >\n {composer.attachments.length > 0 ? (\n <div className=\"mb-1.5\">\n {attachmentTray ?? (\n <Attachments\n attachments={composer.attachments}\n onRemove={(a) => composer.removeAttachment(a.id)}\n />\n )}\n </div>\n ) : null}\n\n {/* `[&>*]:h-9` enforces a consistent 36px slot height so toolbar\n * buttons line up with the textarea baseline (`min-h-[36px]`).\n * Toolbar slots that want to opt out can pass an explicit class\n * like `!h-auto`. */}\n <div className=\"flex items-end gap-1.5 [&>:not(textarea)]:shrink-0 [&>:not(textarea)]:h-9\">\n {showAttachmentButton ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n onClick={onPickFiles}\n aria-label=\"Attach files\"\n disabled={isDisabled}\n className=\"h-9 w-9\"\n >\n <Paperclip aria-hidden className=\"size-4\" />\n </Button>\n ) : null}\n\n {toolbarStart}\n\n <Textarea\n {...composer.textareaProps}\n rows={1}\n placeholder={placeholder}\n aria-label={placeholder}\n aria-multiline=\"true\"\n disabled={isDisabled}\n className={cn(\n 'min-h-9 max-h-60 flex-1 resize-none rounded-2xl px-3.5 py-2 text-base sm:text-sm',\n textareaClassName,\n )}\n />\n\n {toolbarEnd}\n\n {isStreaming ? (\n <Button\n type=\"button\"\n variant=\"secondary\"\n size=\"icon\"\n onClick={onCancel}\n aria-label=\"Stop\"\n aria-keyshortcuts=\"Escape\"\n className=\"h-9 w-9\"\n >\n <Square aria-hidden className=\"size-3.5\" />\n </Button>\n ) : (\n <Button\n type=\"button\"\n size=\"icon\"\n onClick={() => void composer.submit()}\n disabled={!composer.canSubmit}\n aria-label=\"Send\"\n aria-keyshortcuts=\"Enter\"\n className=\"h-9 w-9\"\n >\n <Send aria-hidden className=\"size-4\" />\n </Button>\n )}\n </div>\n </div>\n );\n});\n","'use client';\n\nimport { Sparkles } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface EmptyStateProps {\n greeting?: string;\n description?: string;\n suggestions?: Array<{ label: string; prompt: string }>;\n onPickSuggestion?: (prompt: string) => void;\n className?: string;\n}\n\nexport function EmptyState({\n greeting,\n description,\n suggestions,\n onPickSuggestion,\n className,\n}: EmptyStateProps) {\n return (\n <div className={cn('flex flex-col items-center gap-3 px-4 py-12 text-center', className)}>\n <div className=\"grid size-10 place-items-center rounded-full bg-muted\">\n <Sparkles aria-hidden className=\"size-5 text-muted-foreground\" />\n </div>\n {greeting ? <h2 className=\"text-base font-semibold\">{greeting}</h2> : null}\n {description ? (\n <p className=\"max-w-md text-sm text-muted-foreground\">{description}</p>\n ) : null}\n {suggestions?.length ? (\n <div className=\"mt-2 grid w-full max-w-md grid-cols-1 gap-2 sm:grid-cols-2\">\n {suggestions.map((s) => (\n <button\n key={s.prompt}\n type=\"button\"\n onClick={() => onPickSuggestion?.(s.prompt)}\n className=\"rounded-lg border border-border bg-background/60 px-3 py-2 text-left text-xs hover:bg-accent\"\n >\n {s.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { AlertCircle, RefreshCw, X } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface ErrorBannerProps {\n error: string | null;\n onDismiss?: () => void;\n onRetry?: () => void;\n className?: string;\n}\n\nexport function ErrorBanner({ error, onDismiss, onRetry, className }: ErrorBannerProps) {\n if (!error) return null;\n return (\n <div\n role=\"alert\"\n className={cn(\n 'mx-2.5 my-2 flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive',\n className,\n )}\n >\n <AlertCircle aria-hidden className=\"mt-0.5 size-3.5 shrink-0\" />\n <p className=\"min-w-0 flex-1 break-words\">{error}</p>\n {onRetry ? (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"inline-flex items-center gap-1 rounded px-1.5 py-0.5 hover:bg-destructive/15\"\n >\n <RefreshCw aria-hidden className=\"size-3\" /> Retry\n </button>\n ) : null}\n {onDismiss ? (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n onClick={onDismiss}\n className=\"rounded p-0.5 hover:bg-destructive/15\"\n >\n <X aria-hidden className=\"size-3\" />\n </button>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { ArrowDown } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface JumpToLatestProps {\n visible?: boolean;\n unreadCount?: number;\n onClick?: () => void;\n className?: string;\n}\n\nexport function JumpToLatest({ visible, unreadCount = 0, onClick, className }: JumpToLatestProps) {\n if (!visible) return null;\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-live=\"polite\"\n className={cn(\n 'pointer-events-auto inline-flex items-center gap-1.5 rounded-full border border-border bg-background px-3 py-1 text-xs shadow-md hover:bg-accent',\n className,\n )}\n >\n <ArrowDown aria-hidden className=\"size-3.5\" />\n {unreadCount > 0 ? `${unreadCount} new` : 'Jump to latest'}\n </button>\n );\n}\n","// Persona resolution helpers — pure, no React.\n//\n// Resolution cascade for a bubble's persona:\n// 1. message.sender (per-message override; multi-user chats)\n// 2. config.user / config.assistant (provider-level default)\n// 3. role-based fallback ('You' / 'AI')\n\nimport type { ChatAssistantContext, ChatMessage, ChatPersona, ChatUserContext } from '../types';\n\nconst FALLBACK_USER: ChatPersona = { name: 'You', initials: 'You' };\nconst FALLBACK_ASSISTANT: ChatPersona = { name: 'AI', initials: 'AI' };\n\nexport function resolvePersona(\n message: Pick<ChatMessage, 'role' | 'sender'>,\n user?: ChatUserContext,\n assistant?: ChatAssistantContext,\n): ChatPersona {\n if (message.sender) return message.sender;\n if (message.role === 'user') return user ?? FALLBACK_USER;\n if (message.role === 'assistant') return assistant ?? FALLBACK_ASSISTANT;\n return { name: message.role };\n}\n\n/** Compute initials for an avatar fallback. */\nexport function deriveInitials(persona: ChatPersona, role?: string): string {\n if (persona.initials) return persona.initials;\n if (persona.name) {\n const parts = persona.name.trim().split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n if (role === 'user') return 'You';\n if (role === 'assistant') return 'AI';\n return '?';\n}\n","'use client';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nexport interface StreamingIndicatorProps {\n variant?: 'dots' | 'pulse';\n label?: string;\n className?: string;\n}\n\nexport function StreamingIndicator({ variant = 'dots', label, className }: StreamingIndicatorProps) {\n return (\n <span\n className={cn('inline-flex items-center gap-1.5 text-xs text-muted-foreground', className)}\n aria-live=\"off\"\n >\n {variant === 'dots' ? (\n <span className=\"inline-flex gap-0.5\" aria-hidden>\n <span className=\"size-1 animate-bounce rounded-full bg-current [animation-delay:-0.2s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-current [animation-delay:-0.1s]\" />\n <span className=\"size-1 animate-bounce rounded-full bg-current\" />\n </span>\n ) : (\n <span className=\"inline-block size-1.5 animate-pulse rounded-full bg-current\" aria-hidden />\n )}\n {label ? <span className=\"italic\">{label}</span> : null}\n </span>\n );\n}\n","'use client';\n\nimport { ExternalLink } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ChatSource } from '../types';\n\nexport interface SourcesProps {\n sources: ChatSource[];\n layout?: 'inline' | 'grid';\n maxVisible?: number;\n onClick?: (source: ChatSource) => void;\n className?: string;\n}\n\nexport function Sources({ sources, layout = 'inline', maxVisible, onClick, className }: SourcesProps) {\n if (!sources?.length) return null;\n const visible = maxVisible ? sources.slice(0, maxVisible) : sources;\n const remaining = maxVisible ? Math.max(0, sources.length - maxVisible) : 0;\n\n return (\n <div\n className={cn(\n 'mt-2 flex flex-wrap gap-1.5',\n layout === 'grid' && 'grid grid-cols-2',\n className,\n )}\n >\n {visible.map((s, i) => {\n const handle = onClick ? () => onClick(s) : undefined;\n const Tag = handle ? 'button' : 'a';\n const props = handle\n ? ({ type: 'button', onClick: handle } as const)\n : ({ href: s.url, target: '_blank', rel: 'noopener noreferrer' } as const);\n return (\n <Tag\n key={`${s.url}-${i}`}\n {...props}\n className=\"inline-flex max-w-full items-center gap-1 rounded-md border border-border bg-background/60 px-2 py-1 text-xs text-foreground/80 hover:bg-accent hover:text-foreground\"\n title={s.snippet ?? s.title}\n >\n <span className=\"truncate\">{s.title || s.url}</span>\n <ExternalLink aria-hidden className=\"size-3 shrink-0 opacity-60\" />\n </Tag>\n );\n })}\n {remaining > 0 ? (\n <span className=\"inline-flex items-center rounded-md border border-dashed border-border px-2 py-1 text-xs text-muted-foreground\">\n +{remaining}\n </span>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { type ReactNode, useEffect, useRef, useState } from 'react';\nimport { ChevronDown, ChevronRight, Loader2 } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ChatToolCall } from '../types';\n\nexport type ToolPayloadKind = 'input' | 'output' | 'streaming';\n\nexport interface ToolCallsProps {\n calls: ChatToolCall[];\n /** Open every panel up-front. Default: false (panels are closed). */\n defaultExpanded?: boolean;\n /** Auto-open while a tool is running, then auto-close on completion.\n * User toggles after that are remembered. Default: true. */\n expandWhileStreaming?: boolean;\n /** Override how the tool input payload is rendered. Receives the raw value. */\n renderInput?: (input: unknown, call: ChatToolCall) => ReactNode;\n /** Override how the tool output payload is rendered. */\n renderOutput?: (output: unknown, call: ChatToolCall) => ReactNode;\n /** Override how the live `streamingText` is rendered. */\n renderStreaming?: (text: string, call: ChatToolCall) => ReactNode;\n /** Single override for all three; specific renderers above take precedence. */\n renderPayload?: (value: unknown, kind: ToolPayloadKind, call: ChatToolCall) => ReactNode;\n className?: string;\n}\n\nexport function ToolCalls({\n calls,\n defaultExpanded = false,\n expandWhileStreaming = true,\n renderInput,\n renderOutput,\n renderStreaming,\n renderPayload,\n className,\n}: ToolCallsProps) {\n if (!calls?.length) return null;\n return (\n <div className={cn('mt-2 space-y-1.5', className)}>\n {calls.map((call) => (\n <ToolCallItem\n key={call.id}\n call={call}\n defaultExpanded={defaultExpanded}\n expandWhileStreaming={expandWhileStreaming}\n renderInput={renderInput}\n renderOutput={renderOutput}\n renderStreaming={renderStreaming}\n renderPayload={renderPayload}\n />\n ))}\n </div>\n );\n}\n\ninterface ItemProps {\n call: ChatToolCall;\n defaultExpanded: boolean;\n expandWhileStreaming: boolean;\n renderInput?: ToolCallsProps['renderInput'];\n renderOutput?: ToolCallsProps['renderOutput'];\n renderStreaming?: ToolCallsProps['renderStreaming'];\n renderPayload?: ToolCallsProps['renderPayload'];\n}\n\nfunction ToolCallItem({\n call,\n defaultExpanded,\n expandWhileStreaming,\n renderInput,\n renderOutput,\n renderStreaming,\n renderPayload,\n}: ItemProps) {\n const isRunning = call.status === 'running';\n const initialOpen = defaultExpanded || (expandWhileStreaming && isRunning);\n const [open, setOpen] = useState(initialOpen);\n // Remember manual interaction so completion doesn't override it.\n const userToggledRef = useRef(false);\n const wasRunningRef = useRef(isRunning);\n\n // Auto-collapse on running → completed transition, unless user has interacted.\n useEffect(() => {\n if (wasRunningRef.current && !isRunning) {\n if (!userToggledRef.current && !defaultExpanded) {\n setOpen(false);\n }\n }\n wasRunningRef.current = isRunning;\n }, [isRunning, defaultExpanded]);\n\n const handleToggle = () => {\n userToggledRef.current = true;\n setOpen((v) => !v);\n };\n\n const Icon = open ? ChevronDown : ChevronRight;\n const statusColor =\n call.status === 'success'\n ? 'text-emerald-500'\n : call.status === 'error'\n ? 'text-destructive'\n : call.status === 'cancelled'\n ? 'text-muted-foreground'\n : 'text-amber-500';\n\n const renderValue = (value: unknown, kind: ToolPayloadKind): ReactNode => {\n if (kind === 'input' && renderInput) return renderInput(value, call);\n if (kind === 'output' && renderOutput) return renderOutput(value, call);\n if (kind === 'streaming' && renderStreaming)\n return renderStreaming(typeof value === 'string' ? value : String(value), call);\n if (renderPayload) return renderPayload(value, kind, call);\n return <DefaultPayload value={value} kind={kind} />;\n };\n\n return (\n <div className=\"overflow-hidden rounded-md border border-border bg-muted/30\">\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={open}\n className=\"flex w-full items-center gap-2 px-2 py-1.5 text-left text-xs hover:bg-muted/60\"\n >\n <Icon aria-hidden className=\"size-3 shrink-0 text-muted-foreground\" />\n {isRunning ? (\n <Loader2 aria-hidden className=\"size-3 shrink-0 animate-spin text-amber-500\" />\n ) : (\n <span className={cn('size-2 shrink-0 rounded-full', statusColor.replace('text-', 'bg-'))} />\n )}\n <span className=\"font-mono text-foreground\">{call.name}</span>\n <span className={cn('ml-auto', statusColor)}>{call.status}</span>\n </button>\n {open ? (\n <div className=\"space-y-1 border-t border-border px-2 py-1.5 text-[11px]\">\n {call.input != null ? renderValue(call.input, 'input') : null}\n {call.streamingText != null\n ? renderValue(call.streamingText, 'streaming')\n : call.output !== undefined\n ? renderValue(call.output, 'output')\n : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction DefaultPayload({ value, kind }: { value: unknown; kind: ToolPayloadKind }) {\n const isStreamingOrString = kind === 'streaming' || typeof value === 'string';\n const muted = kind === 'input';\n return (\n <pre\n className={cn(\n 'overflow-auto rounded bg-background/60 p-1.5 font-mono',\n kind === 'input' ? 'max-h-32' : 'max-h-48',\n muted ? 'text-muted-foreground' : 'text-foreground/90',\n )}\n >\n {isStreamingOrString ? String(value) : safeStringify(value)}\n </pre>\n );\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n","'use client';\n\nimport { Copy, Pencil, RefreshCw, Trash } from 'lucide-react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ChatRole } from '../types';\n\nexport interface MessageActionsProps {\n role: ChatRole;\n onCopy?: () => void;\n onRegenerate?: () => void;\n onEdit?: () => void;\n onDelete?: () => void;\n hideOn?: Array<ChatRole>;\n className?: string;\n}\n\nexport function MessageActions({\n role,\n onCopy,\n onRegenerate,\n onEdit,\n onDelete,\n hideOn,\n className,\n}: MessageActionsProps) {\n if (hideOn?.includes(role)) return null;\n return (\n <div\n className={cn(\n 'mt-1 flex items-center gap-0.5 opacity-0 transition-opacity group-hover/msg:opacity-100 focus-within:opacity-100',\n className,\n )}\n >\n {onCopy ? <ActionButton onClick={onCopy} label=\"Copy\" icon={Copy} /> : null}\n {onRegenerate && role === 'assistant' ? (\n <ActionButton onClick={onRegenerate} label=\"Regenerate\" icon={RefreshCw} />\n ) : null}\n {onEdit && role === 'user' ? (\n <ActionButton onClick={onEdit} label=\"Edit\" icon={Pencil} />\n ) : null}\n {onDelete ? <ActionButton onClick={onDelete} label=\"Delete\" icon={Trash} destructive /> : null}\n </div>\n );\n}\n\nfunction ActionButton({\n onClick,\n label,\n icon: Icon,\n destructive,\n}: {\n onClick: () => void;\n label: string;\n icon: typeof Copy;\n destructive?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={cn(\n 'rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground',\n destructive && 'hover:bg-destructive/15 hover:text-destructive',\n )}\n >\n <Icon aria-hidden className=\"size-3\" />\n </button>\n );\n}\n","'use client';\n\nimport { memo, type ReactNode } from 'react';\n\nimport { Avatar, AvatarFallback, AvatarImage } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { MarkdownMessage } from '../../../components/markdown';\nimport type {\n ChatAssistantContext,\n ChatAttachment,\n ChatMessage,\n ChatSource,\n ChatToolCall,\n ChatUserContext,\n} from '../types';\nimport { resolvePersona, deriveInitials } from '../core/persona';\nimport { useChatContextOptional } from '../context';\nimport { StreamingIndicator } from './StreamingIndicator';\nimport { Sources } from './Sources';\nimport { ToolCalls } from './ToolCalls';\nimport {\n AttachmentsGrid,\n AttachmentsList,\n type AttachmentRendererMap,\n} from './Attachments';\nimport { MessageActions } from './MessageActions';\nimport type { ToolCallsProps } from './ToolCalls';\n\nexport interface MessageBubbleProps {\n message: ChatMessage;\n isUser?: boolean;\n showAvatar?: boolean;\n /** Override avatar URL (skips persona resolution). */\n avatarSrc?: string;\n /** Override avatar fallback (skips persona resolution). */\n avatarFallback?: ReactNode;\n /** Personas — when provided, take precedence over context. */\n user?: ChatUserContext;\n assistant?: ChatAssistantContext;\n showTimestamp?: boolean;\n showActions?: boolean;\n isCompact?: boolean;\n className?: string;\n beforeContent?: ReactNode;\n afterContent?: ReactNode;\n toolCallsRenderer?: (calls: ChatToolCall[]) => ReactNode;\n /** Forwarded to the default `<ToolCalls>` when `toolCallsRenderer` is not set. */\n toolCallsProps?: Omit<ToolCallsProps, 'calls'>;\n sourcesRenderer?: (sources: ChatSource[]) => ReactNode;\n attachmentsRenderer?: (atts: ChatAttachment[]) => ReactNode;\n /** Per-type attachment renderers forwarded to default `<Attachments>`. */\n attachmentRenderers?: AttachmentRendererMap;\n /** Click handler for attachment tiles (e.g. open lightbox). */\n onAttachmentOpen?: (a: ChatAttachment) => void;\n onCopy?: () => void;\n onRegenerate?: () => void;\n onEdit?: () => void;\n onDelete?: () => void;\n}\n\nconst MessageBubbleInner = ({\n message,\n isUser: isUserProp,\n showAvatar = true,\n avatarSrc,\n avatarFallback,\n user,\n assistant,\n showTimestamp = false,\n showActions = true,\n isCompact = false,\n className,\n beforeContent,\n afterContent,\n toolCallsRenderer,\n toolCallsProps,\n sourcesRenderer,\n attachmentsRenderer,\n attachmentRenderers,\n onAttachmentOpen,\n onCopy,\n onRegenerate,\n onEdit,\n onDelete,\n}: MessageBubbleProps) => {\n const isUser = isUserProp ?? message.role === 'user';\n const isStreaming = !!message.isStreaming;\n const isErr = !!message.isError;\n\n const ctx = useChatContextOptional();\n const persona = resolvePersona(\n message,\n user ?? ctx?.config.user,\n assistant ?? ctx?.config.assistant,\n );\n const initials = deriveInitials(persona, message.role);\n const personaName = persona.name ?? (isUser ? 'You' : 'Assistant');\n\n return (\n <div\n role=\"article\"\n aria-label={`${personaName} said: ${message.content.slice(0, 80)}`}\n aria-busy={isStreaming || undefined}\n data-role={message.role}\n className={cn(\n 'group/msg flex gap-2.5 px-2.5 py-2',\n isUser ? 'flex-row-reverse' : 'flex-row',\n className,\n )}\n >\n {showAvatar ? (\n <Avatar\n className=\"size-7 shrink-0\"\n title={persona.description ?? personaName}\n >\n {avatarSrc || persona.avatarUrl ? (\n <AvatarImage src={avatarSrc ?? persona.avatarUrl} alt={personaName} />\n ) : null}\n <AvatarFallback className=\"text-[10px]\">\n {avatarFallback ?? initials}\n </AvatarFallback>\n </Avatar>\n ) : null}\n\n <div className={cn('min-w-0 flex-1', isUser && 'flex flex-col items-end')}>\n {beforeContent}\n {message.attachments?.length\n ? attachmentsRenderer\n ? attachmentsRenderer(message.attachments)\n : (\n <div className=\"mb-1.5 w-full\">\n {attachmentRenderers ? (\n <AttachmentsList\n attachments={message.attachments}\n renderers={attachmentRenderers}\n onClick={onAttachmentOpen}\n className={isUser ? 'items-end' : undefined}\n />\n ) : (\n <AttachmentsGrid\n attachments={message.attachments}\n onClick={onAttachmentOpen}\n className={isUser ? 'justify-end' : undefined}\n />\n )}\n </div>\n )\n : null}\n\n <div\n className={cn(\n 'inline-block max-w-full rounded-2xl px-3.5 py-2 text-sm',\n isUser\n ? 'bg-primary text-primary-foreground rounded-tr-md'\n : isErr\n ? 'bg-destructive/10 text-destructive rounded-tl-md border border-destructive/30'\n : 'bg-muted text-foreground rounded-tl-md',\n )}\n >\n {isStreaming && message.toolActivity ? (\n <div className=\"mb-1.5\">\n <StreamingIndicator label={message.toolActivity} />\n </div>\n ) : null}\n\n {message.content || !isStreaming ? (\n <MarkdownMessage\n content={message.content || (isErr ? '*Failed to generate a response.*' : '')}\n isUser={isUser}\n isCompact={isCompact}\n plainText={isStreaming}\n />\n ) : (\n <StreamingIndicator />\n )}\n </div>\n\n {message.toolCalls?.length\n ? toolCallsRenderer\n ? toolCallsRenderer(message.toolCalls)\n : <ToolCalls calls={message.toolCalls} {...toolCallsProps} />\n : null}\n\n {message.sources?.length && !isStreaming\n ? sourcesRenderer\n ? sourcesRenderer(message.sources)\n : <Sources sources={message.sources} />\n : null}\n\n {showActions && !isStreaming ? (\n <MessageActions\n role={message.role}\n onCopy={onCopy}\n onRegenerate={onRegenerate}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n ) : null}\n\n {showTimestamp ? (\n <div className=\"mt-1 text-[10px] text-muted-foreground\">\n {new Date(message.createdAt).toLocaleTimeString()}\n </div>\n ) : null}\n\n {afterContent}\n </div>\n </div>\n );\n};\n\nexport const MessageBubble = memo(MessageBubbleInner, (prev, next) => {\n const a = prev.message;\n const b = next.message;\n return (\n a.id === b.id &&\n a.content === b.content &&\n a.isStreaming === b.isStreaming &&\n a.isError === b.isError &&\n (a.version ?? 0) === (b.version ?? 0) &&\n a.toolActivity === b.toolActivity &&\n a.toolCalls === b.toolCalls &&\n a.sources === b.sources &&\n a.attachments === b.attachments\n );\n});\nMessageBubble.displayName = 'MessageBubble';\n","'use client';\n\nimport { type RefObject, type ReactNode, forwardRef, useCallback } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\nimport { Spinner } from '@djangocfg/ui-core/components';\n\nimport type { ChatMessage } from '../types';\nimport { useChatContextOptional } from '../context';\nimport { MessageBubble } from './MessageBubble';\n\nexport interface MessageListProps {\n messages?: ChatMessage[];\n renderItem?: (m: ChatMessage, i: number) => ReactNode;\n renderEmpty?: () => ReactNode;\n isLoadingMore?: boolean;\n topSentinelRef?: RefObject<HTMLDivElement | null>;\n bottomRef?: RefObject<HTMLDivElement | null>;\n className?: string;\n itemClassName?: string;\n}\n\nexport const MessageList = forwardRef<HTMLDivElement, MessageListProps>(function MessageList(\n {\n messages: messagesProp,\n renderItem,\n renderEmpty,\n isLoadingMore: isLoadingMoreProp,\n topSentinelRef,\n bottomRef,\n className,\n itemClassName,\n },\n ref,\n) {\n const ctx = useChatContextOptional();\n const messages = messagesProp ?? ctx?.messages ?? [];\n const isLoadingMore = isLoadingMoreProp ?? ctx?.isLoadingMore ?? false;\n\n const defaultRenderItem = useCallback(\n (m: ChatMessage) => (\n <div className={itemClassName} key={m.id}>\n <MessageBubble\n message={m}\n onCopy={() => copy(m.content)}\n onRegenerate={ctx ? () => void ctx.regenerate(m.id) : undefined}\n onDelete={ctx ? () => ctx.deleteMessage(m.id) : undefined}\n />\n </div>\n ),\n [itemClassName, ctx],\n );\n\n const itemRenderer = renderItem ?? defaultRenderItem;\n\n return (\n <div\n ref={ref}\n role=\"log\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n className={cn('flex-1 overflow-y-auto', className)}\n >\n <div ref={topSentinelRef} aria-hidden />\n {isLoadingMore ? (\n <div className=\"flex justify-center py-2\">\n <Spinner className=\"size-4 text-muted-foreground\" />\n </div>\n ) : null}\n {messages.length === 0\n ? renderEmpty?.() ?? null\n : messages.map((m, i) => itemRenderer(m, i))}\n <div ref={bottomRef} aria-hidden />\n </div>\n );\n});\n\nfunction copy(text: string) {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n void navigator.clipboard.writeText(text);\n }\n}\n","'use client';\n\nimport { type ReactNode, useRef } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ChatAttachment, ChatConfig, ChatMessage, ChatTransport } from '../types';\nimport type { ChatAudioConfig } from '../core/audio/types';\nimport { ChatProvider, useChatContext, type ChatContextValue } from '../context';\nimport { useChatComposer, type UseChatComposerReturn } from '../hooks/useChatComposer';\nimport { useChatScroll } from '../hooks/useChatScroll';\nimport { useChatHistory } from '../hooks/useChatHistory';\nimport { Composer } from './Composer';\nimport { EmptyState } from './EmptyState';\nimport { ErrorBanner } from './ErrorBanner';\nimport { JumpToLatest } from './JumpToLatest';\nimport { MessageBubble } from './MessageBubble';\nimport { MessageList } from './MessageList';\nimport type { AttachmentRendererMap } from './Attachments';\nimport type { ToolCallsProps } from './ToolCalls';\n\nexport interface ChatRootProps {\n // ---- core wiring -------------------------------------------------------\n transport: ChatTransport;\n config?: ChatConfig;\n initialSessionId?: string;\n autoCreateSession?: boolean;\n streaming?: boolean;\n /** Audio-trigger configuration. Off by default (no `sounds` map). */\n audio?: ChatAudioConfig;\n /**\n * Verbose dev-mode logging via `consola` (namespace `chat:*`).\n * Defaults to `isDev` from `@djangocfg/ui-core/lib`. Pass `false` to silence\n * even in development, or `true` to force on in production for debugging.\n */\n debug?: boolean;\n className?: string;\n\n // ---- named ReactNode slots --------------------------------------------\n /** Sticky banner above the message list (e.g. quota warning). */\n banner?: ReactNode;\n /** Header row below the banner — title / actions / session switcher. */\n header?: ReactNode;\n /** Footer slot below the composer (disclaimers, model picker). */\n footer?: ReactNode;\n /** Replaces the default `<EmptyState>` rendered when the conversation is empty. */\n empty?: ReactNode;\n /** Slot left of the textarea inside `<Composer>`. */\n composerToolbarStart?: ReactNode;\n /** Slot right of the textarea inside `<Composer>`. */\n composerToolbarEnd?: ReactNode;\n /** Replaces the default attachment tray inside `<Composer>`. */\n composerAttachmentTray?: ReactNode;\n /** Replaces the default `<JumpToLatest>` floating pill. */\n jumpToLatest?: ReactNode;\n\n // ---- render-prop slots (need access to data) --------------------------\n /** Replace `<MessageBubble>` per message. */\n renderMessage?: (m: ChatMessage, i: number) => ReactNode;\n /** Render the header lazily — receives the chat context. */\n renderHeader?: (ctx: ChatContextValue) => ReactNode;\n /** Render the empty-state lazily — receives a `setValue` to seed the composer. */\n renderEmpty?: (api: { setValue: (v: string) => void; focus: () => void }) => ReactNode;\n /** Forwarded into `<MessageBubble toolCallsProps>` so hosts can swap payload renderers. */\n toolCallsProps?: Omit<ToolCallsProps, 'calls'>;\n /** Per-type attachment renderers — `{ image, audio, video, file, default }`. */\n attachmentRenderers?: AttachmentRendererMap;\n /** Called when an attachment tile is clicked (e.g. open lightbox). */\n onAttachmentOpen?: (attachment: ChatAttachment) => void;\n\n // ---- composer customization -------------------------------------------\n /** Show the paperclip \"attach\" button in the composer. */\n showAttachmentButton?: boolean;\n /** Called when the user clicks the attach button (host opens its file picker). */\n onPickFiles?: () => void;\n /** Hide the composer input area entirely (e.g. while waiting for human approval). */\n hideComposer?: boolean;\n}\n\nexport function ChatRoot(props: ChatRootProps) {\n const { transport, config, initialSessionId, autoCreateSession, streaming, audio, debug, className, ...slots } = props;\n return (\n <ChatProvider\n transport={transport}\n config={config}\n initialSessionId={initialSessionId}\n autoCreateSession={autoCreateSession}\n streaming={streaming}\n audio={audio}\n debug={debug}\n >\n <ChatRootShell className={className} slots={slots} />\n </ChatProvider>\n );\n}\n\ninterface ChatRootShellProps {\n className?: string;\n slots: Omit<ChatRootProps, 'transport' | 'config' | 'initialSessionId' | 'autoCreateSession' | 'streaming' | 'audio' | 'debug' | 'className'>;\n}\n\nfunction ChatRootShell({ className, slots }: ChatRootShellProps) {\n const chat = useChatContext();\n const composer = useChatComposer({\n onSubmit: (content, attachments) => chat.sendMessage(content, attachments),\n disabled: chat.isStreaming,\n });\n const containerRef = useRef<HTMLDivElement | null>(null);\n const bottomRef = useRef<HTMLDivElement | null>(null);\n const topRef = useRef<HTMLDivElement | null>(null);\n\n const scroll = useChatScroll({\n containerRef,\n bottomRef,\n isStreaming: chat.isStreaming,\n messagesCount: chat.messages.length,\n });\n\n useChatHistory({\n containerRef,\n topSentinelRef: topRef,\n hasMore: chat.hasMore,\n isLoadingMore: chat.isLoadingMore,\n loadMore: chat.loadMore,\n });\n\n const greeting = chat.config.greeting ?? 'How can I help?';\n const description = chat.config.description;\n const suggestions = chat.config.suggestions;\n\n const headerNode = slots.renderHeader ? slots.renderHeader(chat) : slots.header;\n\n const emptyNode = slots.empty\n ?? (slots.renderEmpty\n ? slots.renderEmpty({ setValue: composer.setValue, focus: composer.focus })\n : (\n <EmptyState\n greeting={greeting}\n description={description}\n suggestions={suggestions}\n onPickSuggestion={(prompt) => {\n composer.setValue(prompt);\n composer.focus();\n }}\n />\n ));\n\n const renderItem = slots.renderMessage\n ?? ((m: ChatMessage) => (\n <MessageBubble\n key={m.id}\n message={m}\n toolCallsProps={slots.toolCallsProps}\n attachmentRenderers={slots.attachmentRenderers}\n onAttachmentOpen={slots.onAttachmentOpen}\n onCopy={() => copy(m.content)}\n onRegenerate={() => void chat.regenerate(m.id)}\n onDelete={() => chat.deleteMessage(m.id)}\n />\n ));\n\n return (\n <div className={cn('relative flex h-full min-h-0 flex-col overflow-hidden', className)}>\n {slots.banner ?? null}\n {headerNode ?? null}\n <div className=\"relative flex min-h-0 flex-1 flex-col\">\n <ErrorBanner\n error={chat.error}\n onDismiss={chat.error ? () => chat.clearMessages() : undefined}\n onRetry={chat.error ? () => void chat.regenerate() : undefined}\n />\n <MessageList\n ref={containerRef}\n topSentinelRef={topRef}\n bottomRef={bottomRef}\n renderItem={renderItem}\n renderEmpty={() => <>{emptyNode}</>}\n />\n <div className=\"pointer-events-none absolute inset-x-0 bottom-2 flex justify-center\">\n {slots.jumpToLatest ?? (\n <JumpToLatest\n visible={!scroll.isAtBottom}\n unreadCount={scroll.unreadCount}\n onClick={() => scroll.scrollToBottom(true)}\n />\n )}\n </div>\n </div>\n {!slots.hideComposer && (\n <Composer\n composer={composer}\n placeholder={chat.config.placeholder}\n showAttachmentButton={slots.showAttachmentButton}\n onPickFiles={slots.onPickFiles}\n toolbarStart={slots.composerToolbarStart}\n toolbarEnd={slots.composerToolbarEnd}\n attachmentTray={slots.composerAttachmentTray}\n />\n )}\n {slots.footer ?? null}\n </div>\n );\n}\n\nfunction copy(text: string) {\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n void navigator.clipboard.writeText(text);\n }\n}\n\n// re-export for convenience: composer hook return is a common slot dependency\nexport type { UseChatComposerReturn };\n"]}
@@ -147,19 +147,6 @@ function reducer(state, action) {
147
147
  }
148
148
  return state;
149
149
  }
150
- if (action.continueExisting) {
151
- const lastAssistantIdx = (() => {
152
- for (let i = state.messages.length - 1; i >= 0; i--) {
153
- if (state.messages[i].role === "assistant") return i;
154
- }
155
- return -1;
156
- })();
157
- if (lastAssistantIdx !== -1) {
158
- const msgs = state.messages.slice();
159
- msgs[lastAssistantIdx] = { ...msgs[lastAssistantIdx], isStreaming: true };
160
- return { ...state, isStreaming: true, messages: msgs };
161
- }
162
- }
163
150
  const placeholder = {
164
151
  id: action.id,
165
152
  role: "assistant",
@@ -253,6 +240,24 @@ _${suffix}_` : `_${suffix}_`)
253
240
  })) : state.messages;
254
241
  return { ...state, isStreaming: false, error: action.message, messages };
255
242
  }
243
+ case "STREAM_CANCEL_PLACEHOLDER":
244
+ return {
245
+ ...state,
246
+ isStreaming: false,
247
+ messages: state.messages.filter((m) => m.id !== action.id)
248
+ };
249
+ case "STREAM_RESUME_EXISTING": {
250
+ const lastIdx = (() => {
251
+ for (let i = state.messages.length - 1; i >= 0; i--) {
252
+ if (state.messages[i].role === "assistant") return i;
253
+ }
254
+ return -1;
255
+ })();
256
+ if (lastIdx === -1) return { ...state, isStreaming: true };
257
+ const msgs = state.messages.slice();
258
+ msgs[lastIdx] = { ...msgs[lastIdx], isStreaming: true };
259
+ return { ...state, isStreaming: true, messages: msgs };
260
+ }
256
261
  case "MESSAGE_EDIT": {
257
262
  const messages = patchMessageById(state.messages, action.id, (m) => ({
258
263
  ...m,
@@ -486,20 +491,10 @@ function useChat(config) {
486
491
  attachments,
487
492
  metadata: config.metadata
488
493
  });
489
- let continueExisting = false;
490
494
  let peekedEvent = null;
491
- const firstResult = await iterator.next();
492
- if (!firstResult.done) {
493
- const ev = firstResult.value;
494
- if (ev.type === "resume_start") {
495
- continueExisting = true;
496
- } else {
497
- peekedEvent = ev;
498
- }
499
- }
500
- dispatch({ type: "STREAM_START", id: assistantId, continueExisting });
495
+ dispatch({ type: "STREAM_START", id: assistantId });
501
496
  config.onStreamStart?.(assistantId);
502
- log.stream.info("start", { sessionId, assistantId, chars: content.length, continueExisting });
497
+ log.stream.info("start", { sessionId, assistantId, chars: content.length });
503
498
  const tokenBuffer = createTokenBuffer(
504
499
  (delta) => dispatch({ type: "STREAM_CHUNK", delta })
505
500
  );
@@ -507,6 +502,16 @@ function useChat(config) {
507
502
  let charsReceived = 0;
508
503
  const t0 = performance.now();
509
504
  try {
505
+ const firstResult = await iterator.next();
506
+ if (!firstResult.done) {
507
+ const ev = firstResult.value;
508
+ if (ev.type === "resume_start") {
509
+ dispatch({ type: "STREAM_CANCEL_PLACEHOLDER", id: assistantId });
510
+ dispatch({ type: "STREAM_RESUME_EXISTING" });
511
+ } else {
512
+ peekedEvent = ev;
513
+ }
514
+ }
510
515
  if (peekedEvent) handleEvent(peekedEvent);
511
516
  for await (const ev of iterator) {
512
517
  if (ctrl.signal.aborted) break;
@@ -2359,5 +2364,5 @@ function copy2(text) {
2359
2364
  __name(copy2, "copy");
2360
2365
 
2361
2366
  export { Attachments, AttachmentsGrid, AttachmentsList, CHAT_EVENT_NAME, CSS_VARS, ChatProvider, ChatRoot, Composer, DEFAULT_LABELS, DEFAULT_SIDEBAR, DEFAULT_Z_INDEX, EmptyState, ErrorBanner, HOTKEYS, JumpToLatest, LIMITS, MessageActions, MessageBubble, MessageList, STORAGE_KEYS, Sources, StreamingIndicator, ToolCalls, createId, createTokenBuffer, deriveInitials, getChatLogger, initialState, reducer, resolvePersona, useChat, useChatAudio, useChatAudioPrefs, useChatComposer, useChatContext, useChatContextOptional, useChatHistory, useChatLayout, useChatScroll };
2362
- //# sourceMappingURL=chunk-D7ISTFUS.mjs.map
2363
- //# sourceMappingURL=chunk-D7ISTFUS.mjs.map
2367
+ //# sourceMappingURL=chunk-OMUJNA42.mjs.map
2368
+ //# sourceMappingURL=chunk-OMUJNA42.mjs.map