kanha-ai 0.1.2 → 0.1.3

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.
package/dist/index.cjs CHANGED
@@ -30,9 +30,9 @@ function toWebLLMModelUrl(modelUrl) {
30
30
  return url;
31
31
  }
32
32
  var MIN_RAM_GB = {
33
- small: 4,
34
- medium: 8,
35
- large: 12
33
+ small: 2,
34
+ medium: 4,
35
+ large: 8
36
36
  };
37
37
  async function checkWebGPU() {
38
38
  try {
@@ -83,7 +83,7 @@ async function checkAvailableMemory(modelSize) {
83
83
  return `Not enough free memory to load the ${modelSize} model (~${needMB}MB required). Close other tabs and try again.`;
84
84
  }
85
85
  const nav = navigator;
86
- if (nav.deviceMemory) {
86
+ if (nav.deviceMemory && nav.deviceMemory < 8) {
87
87
  const required = MIN_RAM_GB[modelSize] ?? MIN_RAM_GB.small;
88
88
  if (nav.deviceMemory < required) {
89
89
  return `Your device has ~${nav.deviceMemory}GB RAM but the ${modelSize} model needs at least ${required}GB.`;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/use-kanha-chat.ts","../src/styles.ts","../src/KanhaBot.tsx"],"names":["nav","needed","useState","useRef","useCallback","useEffect","jsx","jsxs","Fragment","ReactMarkdown"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { Message, InferenceMode, KanhaChatConfig, KanhaChatReturn } from \"./types\";\n\nconst MODEL_LIB_PREFIX =\n \"https://raw.githubusercontent.com/mlc-ai/binary-mlc-llm-libs/main/web-llm-models/v0_2_80\";\n\nconst WASM_BY_SIZE: Record<string, string> = {\n small: `${MODEL_LIB_PREFIX}/Qwen3-0.6B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n medium: `${MODEL_LIB_PREFIX}/Qwen3-1.7B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n large: `${MODEL_LIB_PREFIX}/Qwen3-4B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n};\n\nfunction resolveModelLib(config: KanhaChatConfig): string {\n if (config.modelLib) return config.modelLib;\n const size = config.modelSize ?? \"small\";\n const lib = WASM_BY_SIZE[size];\n if (!lib) throw new Error(`Unknown model size \"${size}\". Provide modelLib explicitly.`);\n return lib;\n}\n\n/**\n * Converts a storage URL into a format web-llm's cleanModelUrl won't mangle.\n * web-llm checks for /resolve/ in the URL — if missing, it appends /resolve/main/.\n * We append /resolve/v1/ so the URL passes through untouched.\n * Files must be stored at {modelUrl}/resolve/v1/{filename} in storage.\n */\nfunction toWebLLMModelUrl(modelUrl: string): string {\n let url = modelUrl.endsWith(\"/\") ? modelUrl.slice(0, -1) : modelUrl;\n if (!url.includes(\"/resolve/\")) {\n url += \"/resolve/v1\";\n }\n return url;\n}\n\n// Minimum device RAM (GB) recommended per model size\nconst MIN_RAM_GB: Record<string, number> = {\n small: 4,\n medium: 8,\n large: 12,\n};\n\nasync function checkWebGPU(): Promise<boolean> {\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<unknown> } };\n if (!nav.gpu) return false;\n const adapter = (await nav.gpu.requestAdapter()) as { requestDevice(): Promise<unknown> } | null;\n if (!adapter) return false;\n const device = await adapter.requestDevice();\n return !!device;\n } catch {\n return false;\n }\n}\n\n// Approximate model weight sizes in bytes (q4f16_1 quantized)\nconst MODEL_WEIGHT_BYTES: Record<string, number> = {\n small: 400 * 1024 * 1024, // ~400MB\n medium: 1100 * 1024 * 1024, // ~1.1GB\n large: 2500 * 1024 * 1024, // ~2.5GB\n};\n\nasync function checkAvailableMemory(modelSize: string): Promise<string | null> {\n // 1. Try WebGPU adapter limits (most reliable for GPU memory)\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<{ limits: { maxBufferSize: number } } | null> } };\n if (nav.gpu) {\n const adapter = await nav.gpu.requestAdapter();\n if (adapter) {\n const maxBufferSize = adapter.limits.maxBufferSize;\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n // If the GPU's max buffer is smaller than model weights, it won't fit\n if (maxBufferSize < needed) {\n const maxMB = Math.round(maxBufferSize / (1024 * 1024));\n const needMB = Math.round(needed / (1024 * 1024));\n return `Your GPU can only allocate ~${maxMB}MB but the ${modelSize} model needs ~${needMB}MB. Try a smaller model or close other GPU-heavy tabs.`;\n }\n }\n }\n } catch { /* ignore, fall through */ }\n\n // 2. Try probing available system memory with a test allocation\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n const probeSize = Math.min(needed, 512 * 1024 * 1024); // probe up to 512MB\n try {\n const buf = new ArrayBuffer(probeSize);\n // If we got here, allocation succeeded — free it\n // (TypeScript doesn't have explicit free, but losing the reference lets GC collect)\n if (buf.byteLength !== probeSize) {\n return `Your device doesn't have enough free memory to load the ${modelSize} model. Close other tabs and try again.`;\n }\n } catch {\n const needMB = Math.round(needed / (1024 * 1024));\n return `Not enough free memory to load the ${modelSize} model (~${needMB}MB required). Close other tabs and try again.`;\n }\n\n // 3. Fallback: check navigator.deviceMemory (coarse, total RAM)\n const nav = navigator as Navigator & { deviceMemory?: number };\n if (nav.deviceMemory) {\n const required = MIN_RAM_GB[modelSize] ?? MIN_RAM_GB.small;\n if (nav.deviceMemory < required) {\n return `Your device has ~${nav.deviceMemory}GB RAM but the ${modelSize} model needs at least ${required}GB.`;\n }\n }\n\n return null;\n}\n\nfunction isMemoryError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes(\"out of memory\") ||\n msg.includes(\"oom\") ||\n msg.includes(\"allocation failed\") ||\n msg.includes(\"err_failed\") ||\n msg.includes(\"arraybuffer\") ||\n msg.includes(\"could not allocate\") ||\n msg.includes(\"webgpu device lost\")\n );\n}\n\nfunction stripThinkTokens(text: string): string {\n let cleaned = text.replace(/<think>[\\s\\S]*?<\\/think>/g, \"\");\n cleaned = cleaned.replace(/<think>[\\s\\S]*$/g, \"\");\n return cleaned.trimStart();\n}\n\nexport function useKanhaChat(config: KanhaChatConfig): KanhaChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n const [mode, setMode] = useState<InferenceMode>(\"detecting\");\n const [loadProgress, setLoadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const engineRef = useRef<any>(null);\n const configRef = useRef(config);\n configRef.current = config;\n\n const updateAssistantMessage = useCallback((text: string) => {\n const cleaned = stripThinkTokens(text);\n if (!cleaned) {\n setIsThinking(true);\n return;\n }\n setIsThinking(false);\n setMessages((prev) => {\n const msgs = [...prev];\n if (msgs[msgs.length - 1]?.role === \"assistant\") {\n msgs[msgs.length - 1] = { role: \"assistant\", content: cleaned };\n } else {\n msgs.push({ role: \"assistant\", content: cleaned });\n }\n return msgs;\n });\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n\n const init = async () => {\n setMode(\"detecting\");\n\n const hasWebGPU = await checkWebGPU();\n if (!hasWebGPU) {\n setMode(\"error\");\n setError(\"WebGPU is not supported in this browser. Try Chrome 113+ or Edge 113+.\");\n return;\n }\n\n const modelSize = configRef.current.modelSize ?? \"small\";\n const memWarning = await checkAvailableMemory(modelSize);\n if (memWarning) {\n setMode(\"error\");\n setError(memWarning);\n return;\n }\n\n if (cancelled) return;\n setMode(\"loading\");\n\n try {\n const webllm = await import(\"@mlc-ai/web-llm\");\n const modelId = \"kanha-custom-model\";\n const modelLib = resolveModelLib(configRef.current);\n const modelUrl = toWebLLMModelUrl(configRef.current.modelUrl);\n\n const engine = await webllm.CreateMLCEngine(modelId, {\n appConfig: {\n model_list: [\n {\n model: modelUrl,\n model_id: modelId,\n model_lib: modelLib,\n overrides: {\n context_window_size: configRef.current.contextWindowSize ?? 4096,\n },\n },\n ],\n useIndexedDBCache: true,\n },\n initProgressCallback: (report: { progress: number }) => {\n if (!cancelled) setLoadProgress(Math.round(report.progress * 100));\n },\n logLevel: \"SILENT\",\n });\n\n if (cancelled) return;\n engineRef.current = engine;\n setMode(\"ready\");\n } catch (err) {\n if (cancelled) return;\n setMode(\"error\");\n if (isMemoryError(err)) {\n const size = configRef.current.modelSize ?? \"small\";\n const ram = (navigator as Navigator & { deviceMemory?: number }).deviceMemory;\n setError(\n `Not enough memory to load the ${size} model${ram ? ` (device has ~${ram}GB RAM)` : \"\"}. ` +\n `Close other tabs or try a smaller model.`\n );\n } else {\n setError(\n err instanceof Error ? err.message : \"Failed to load AI model.\"\n );\n }\n }\n };\n\n init();\n return () => {\n cancelled = true;\n if (engineRef.current) {\n try { engineRef.current.unload(); } catch { /* best-effort */ }\n engineRef.current = null;\n }\n };\n }, [config.modelUrl, config.modelLib, config.modelSize]);\n\n const send = useCallback(async () => {\n if (!input.trim() || mode !== \"ready\" || isLoading || !engineRef.current) return;\n\n const userMsg: Message = { role: \"user\", content: input.trim() };\n const allMessages = [...messages, userMsg];\n setMessages(allMessages);\n setInput(\"\");\n setIsLoading(true);\n setIsThinking(true);\n setError(null);\n\n try {\n const systemMessages: Message[] = configRef.current.systemPrompt\n ? [{ role: \"system\", content: configRef.current.systemPrompt }]\n : [];\n\n const completion = await engineRef.current.chat.completions.create({\n messages: [...systemMessages, ...allMessages],\n temperature: configRef.current.temperature ?? 0.7,\n max_tokens: configRef.current.maxTokens ?? 1024,\n stream: true,\n });\n\n let text = \"\";\n for await (const chunk of completion) {\n const delta = chunk.choices[0]?.delta?.content || \"\";\n text += delta;\n updateAssistantMessage(text);\n }\n } catch {\n setError(\"Failed to generate response. Please try again.\");\n setMessages((prev) => [\n ...prev,\n { role: \"assistant\", content: \"Sorry, I encountered an error. Please try again.\" },\n ]);\n } finally {\n setIsLoading(false);\n setIsThinking(false);\n }\n }, [input, mode, isLoading, messages, updateAssistantMessage]);\n\n const clear = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n };\n}\n","import type { CSSProperties } from \"react\";\n\nexport function fabStyle(\n primaryColor: string,\n position: \"bottom-right\" | \"bottom-left\",\n): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 24,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 56,\n height: 56,\n borderRadius: \"50%\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n zIndex: 9999,\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n };\n}\n\nexport function panelStyle(position: \"bottom-right\" | \"bottom-left\"): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 96,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 384,\n maxWidth: \"calc(100vw - 48px)\",\n maxHeight: \"calc(100vh - 120px)\",\n borderRadius: 16,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n boxShadow: \"0 8px 30px rgba(0,0,0,0.12)\",\n border: \"1px solid #e5e7eb\",\n background: \"#ffffff\",\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n };\n}\n\nexport const headerStyle: CSSProperties = {\n padding: \"16px\",\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n};\n\nexport const headerTitleStyle: CSSProperties = {\n fontWeight: 600,\n fontSize: 15,\n margin: 0,\n};\n\nexport const headerSubtitleStyle: CSSProperties = {\n fontSize: 12,\n opacity: 0.85,\n margin: \"4px 0 0\",\n};\n\nexport const messagesContainerStyle: CSSProperties = {\n flex: 1,\n overflowY: \"auto\",\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n minHeight: 300,\n maxHeight: 384,\n background: \"#fafafa\",\n};\n\nexport const emptyStateStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n textAlign: \"center\",\n color: \"#6b7280\",\n fontSize: 14,\n padding: 16,\n};\n\nexport function userBubbleStyle(primaryColor: string): CSSProperties {\n return {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: primaryColor,\n color: \"#fff\",\n fontSize: 14,\n lineHeight: 1.5,\n alignSelf: \"flex-end\",\n wordBreak: \"break-word\",\n };\n}\n\nexport const assistantBubbleStyle: CSSProperties = {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: \"#fff\",\n color: \"#1f2937\",\n fontSize: 14,\n lineHeight: 1.5,\n border: \"1px solid #e5e7eb\",\n alignSelf: \"flex-start\",\n wordBreak: \"break-word\",\n};\n\nexport const inputBarStyle: CSSProperties = {\n display: \"flex\",\n gap: 8,\n padding: \"12px 16px\",\n borderTop: \"1px solid #e5e7eb\",\n background: \"#fff\",\n};\n\nexport const textareaStyle: CSSProperties = {\n flex: 1,\n padding: \"8px 12px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 10,\n fontSize: 14,\n resize: \"none\",\n overflow: \"hidden\",\n outline: \"none\",\n fontFamily: \"inherit\",\n minHeight: 40,\n maxHeight: 120,\n lineHeight: 1.5,\n};\n\nexport function sendButtonStyle(primaryColor: string): CSSProperties {\n return {\n padding: \"8px 14px\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n borderRadius: 10,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n transition: \"opacity 0.15s ease\",\n };\n}\n\nexport const iconButtonStyle: CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 4,\n borderRadius: 8,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.8,\n transition: \"opacity 0.15s ease\",\n};\n\nexport function suggestionButtonStyle(primaryColor: string): CSSProperties {\n return {\n fontSize: 13,\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n color: \"#374151\",\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n width: \"100%\",\n transition: \"border-color 0.15s ease\",\n // hover handled inline\n };\n}\n\nexport const progressBarContainer: CSSProperties = {\n width: \"60%\",\n height: 4,\n borderRadius: 2,\n background: \"rgba(255,255,255,0.3)\",\n marginTop: 8,\n overflow: \"hidden\",\n};\n\nexport function progressBarFill(progress: number, primaryColor: string): CSSProperties {\n return {\n width: `${progress}%`,\n height: \"100%\",\n borderRadius: 2,\n background: primaryColor,\n transition: \"width 0.3s ease\",\n };\n}\n","import {\n useState,\n useEffect,\n useRef,\n type KeyboardEvent,\n type CSSProperties,\n} from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport { useKanhaChat } from \"./use-kanha-chat\";\nimport type { KanhaBotProps } from \"./types\";\nimport * as s from \"./styles\";\n\n// Inline SVG icons (no icon library dependency)\nconst ChatIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst SendIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" /><polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\" /><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nconst Spinner = ({ size = 18 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ animation: \"kanha-spin 1s linear infinite\" }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n);\n\nconst spinKeyframes = `@keyframes kanha-spin { to { transform: rotate(360deg); } }`;\nconst bounceKeyframes = `\n@keyframes kanha-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n}`;\n\nfunction ThinkingDots() {\n const dotStyle = (delay: number): CSSProperties => ({\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#9ca3af\",\n animation: `kanha-bounce 1.2s ease-in-out ${delay}ms infinite`,\n });\n return (\n <span style={{ display: \"flex\", gap: 3, alignItems: \"center\" }}>\n <span style={dotStyle(0)} />\n <span style={dotStyle(150)} />\n <span style={dotStyle(300)} />\n <span style={{ fontSize: 12, color: \"#9ca3af\", marginLeft: 6 }}>Thinking</span>\n </span>\n );\n}\n\nexport function KanhaBot({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n botName = \"AI Assistant\",\n welcomeMessage = \"Ask me anything!\",\n suggestions = [],\n theme = {},\n}: KanhaBotProps) {\n const primaryColor = theme.primaryColor ?? \"#0d9488\";\n const position = theme.position ?? \"bottom-right\";\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n } = useKanhaChat({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n useEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height = Math.min(textareaRef.current.scrollHeight, 120) + \"px\";\n }\n }, [input]);\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const isReady = mode === \"ready\";\n\n return (\n <>\n <style>{spinKeyframes}{bounceKeyframes}</style>\n\n {isOpen && (\n <div style={s.panelStyle(position)}>\n {/* Header */}\n <div style={{ ...s.headerStyle, background: primaryColor }}>\n <div>\n <p style={s.headerTitleStyle}>{botName}</p>\n <p style={s.headerSubtitleStyle}>\n {isReady\n ? welcomeMessage\n : mode === \"loading\"\n ? `Loading AI model (${loadProgress}%)`\n : mode === \"error\"\n ? \"Failed to load\"\n : \"Detecting capabilities...\"}\n </p>\n {mode === \"loading\" && (\n <div style={s.progressBarContainer}>\n <div style={s.progressBarFill(loadProgress, \"#fff\")} />\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 4 }}>\n {messages.length > 0 && (\n <button onClick={clear} style={s.iconButtonStyle} aria-label=\"Clear chat\">\n <TrashIcon />\n </button>\n )}\n <button onClick={() => setIsOpen(false)} style={s.iconButtonStyle} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n </div>\n\n {/* Error banner */}\n {error && (\n <div style={{ padding: \"10px 16px\", background: \"#fef2f2\", borderBottom: \"1px solid #fecaca\", fontSize: 13, color: \"#b91c1c\" }}>\n {error}\n </div>\n )}\n\n {/* Messages */}\n <div style={s.messagesContainerStyle}>\n {messages.length === 0 ? (\n <div style={s.emptyStateStyle}>\n {isReady ? (\n <>\n <ChatIcon />\n <p style={{ marginTop: 12, fontWeight: 500, color: \"#374151\" }}>\n {welcomeMessage}\n </p>\n {suggestions.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, width: \"100%\", marginTop: 16 }}>\n {suggestions.map((text) => (\n <button\n key={text}\n onClick={() => { setInput(text); setTimeout(send, 0); }}\n style={s.suggestionButtonStyle(primaryColor)}\n onMouseEnter={(e) => { (e.target as HTMLElement).style.borderColor = primaryColor; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.borderColor = \"#e5e7eb\"; }}\n >\n {text}\n </button>\n ))}\n </div>\n )}\n </>\n ) : mode === \"loading\" ? (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Loading AI model ({loadProgress}%)</p>\n <p style={{ fontSize: 12, marginTop: 4 }}>First load takes about a minute</p>\n </>\n ) : mode === \"error\" ? (\n <p>{error}</p>\n ) : (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Detecting browser capabilities...</p>\n </>\n )}\n </div>\n ) : (\n <>\n {messages.map((msg, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n justifyContent: msg.role === \"user\" ? \"flex-end\" : \"flex-start\",\n }}\n >\n <div style={msg.role === \"user\" ? s.userBubbleStyle(primaryColor) : s.assistantBubbleStyle}>\n {msg.role === \"assistant\" ? (\n <ReactMarkdown>{msg.content}</ReactMarkdown>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{msg.content}</span>\n )}\n </div>\n </div>\n ))}\n {isLoading && (isThinking || messages[messages.length - 1]?.role !== \"assistant\") && (\n <div style={{ display: \"flex\", justifyContent: \"flex-start\" }}>\n <div style={s.assistantBubbleStyle}>\n {isThinking ? <ThinkingDots /> : <Spinner size={16} />}\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input */}\n <div style={s.inputBarStyle}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyPress}\n placeholder={isReady ? \"Type your message...\" : \"Waiting for model...\"}\n disabled={!isReady || isLoading}\n rows={1}\n style={{\n ...s.textareaStyle,\n opacity: !isReady ? 0.5 : 1,\n }}\n />\n <button\n onClick={send}\n disabled={!isReady || isLoading || !input.trim()}\n style={{\n ...s.sendButtonStyle(primaryColor),\n opacity: !isReady || isLoading || !input.trim() ? 0.5 : 1,\n cursor: !isReady || isLoading || !input.trim() ? \"not-allowed\" : \"pointer\",\n }}\n aria-label=\"Send message\"\n >\n {isLoading ? <Spinner size={18} /> : <SendIcon />}\n </button>\n </div>\n </div>\n )}\n\n {/* FAB */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={s.fabStyle(primaryColor, position)}\n aria-label=\"Toggle chat\"\n onMouseEnter={(e) => { (e.target as HTMLElement).style.transform = \"scale(1.05)\"; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.transform = \"scale(1)\"; }}\n >\n {isOpen ? <CloseIcon /> : <ChatIcon />}\n </button>\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/use-kanha-chat.ts","../src/styles.ts","../src/KanhaBot.tsx"],"names":["nav","needed","useState","useRef","useCallback","useEffect","jsx","jsxs","Fragment","ReactMarkdown"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { Message, InferenceMode, KanhaChatConfig, KanhaChatReturn } from \"./types\";\n\nconst MODEL_LIB_PREFIX =\n \"https://raw.githubusercontent.com/mlc-ai/binary-mlc-llm-libs/main/web-llm-models/v0_2_80\";\n\nconst WASM_BY_SIZE: Record<string, string> = {\n small: `${MODEL_LIB_PREFIX}/Qwen3-0.6B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n medium: `${MODEL_LIB_PREFIX}/Qwen3-1.7B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n large: `${MODEL_LIB_PREFIX}/Qwen3-4B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n};\n\nfunction resolveModelLib(config: KanhaChatConfig): string {\n if (config.modelLib) return config.modelLib;\n const size = config.modelSize ?? \"small\";\n const lib = WASM_BY_SIZE[size];\n if (!lib) throw new Error(`Unknown model size \"${size}\". Provide modelLib explicitly.`);\n return lib;\n}\n\n/**\n * Converts a storage URL into a format web-llm's cleanModelUrl won't mangle.\n * web-llm checks for /resolve/ in the URL — if missing, it appends /resolve/main/.\n * We append /resolve/v1/ so the URL passes through untouched.\n * Files must be stored at {modelUrl}/resolve/v1/{filename} in storage.\n */\nfunction toWebLLMModelUrl(modelUrl: string): string {\n let url = modelUrl.endsWith(\"/\") ? modelUrl.slice(0, -1) : modelUrl;\n if (!url.includes(\"/resolve/\")) {\n url += \"/resolve/v1\";\n }\n return url;\n}\n\n// Minimum device RAM (GB) recommended per model size\nconst MIN_RAM_GB: Record<string, number> = {\n small: 2,\n medium: 4,\n large: 8,\n};\n\nasync function checkWebGPU(): Promise<boolean> {\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<unknown> } };\n if (!nav.gpu) return false;\n const adapter = (await nav.gpu.requestAdapter()) as { requestDevice(): Promise<unknown> } | null;\n if (!adapter) return false;\n const device = await adapter.requestDevice();\n return !!device;\n } catch {\n return false;\n }\n}\n\n// Approximate model weight sizes in bytes (q4f16_1 quantized)\nconst MODEL_WEIGHT_BYTES: Record<string, number> = {\n small: 400 * 1024 * 1024, // ~400MB\n medium: 1100 * 1024 * 1024, // ~1.1GB\n large: 2500 * 1024 * 1024, // ~2.5GB\n};\n\nasync function checkAvailableMemory(modelSize: string): Promise<string | null> {\n // 1. Try WebGPU adapter limits (most reliable for GPU memory)\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<{ limits: { maxBufferSize: number } } | null> } };\n if (nav.gpu) {\n const adapter = await nav.gpu.requestAdapter();\n if (adapter) {\n const maxBufferSize = adapter.limits.maxBufferSize;\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n // If the GPU's max buffer is smaller than model weights, it won't fit\n if (maxBufferSize < needed) {\n const maxMB = Math.round(maxBufferSize / (1024 * 1024));\n const needMB = Math.round(needed / (1024 * 1024));\n return `Your GPU can only allocate ~${maxMB}MB but the ${modelSize} model needs ~${needMB}MB. Try a smaller model or close other GPU-heavy tabs.`;\n }\n }\n }\n } catch { /* ignore, fall through */ }\n\n // 2. Try probing available system memory with a test allocation\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n const probeSize = Math.min(needed, 512 * 1024 * 1024); // probe up to 512MB\n try {\n const buf = new ArrayBuffer(probeSize);\n // If we got here, allocation succeeded — free it\n // (TypeScript doesn't have explicit free, but losing the reference lets GC collect)\n if (buf.byteLength !== probeSize) {\n return `Your device doesn't have enough free memory to load the ${modelSize} model. Close other tabs and try again.`;\n }\n } catch {\n const needMB = Math.round(needed / (1024 * 1024));\n return `Not enough free memory to load the ${modelSize} model (~${needMB}MB required). Close other tabs and try again.`;\n }\n\n // 3. Fallback: check navigator.deviceMemory (coarse, total RAM)\n // Note: browsers cap this at 8GB for fingerprinting protection, so\n // if deviceMemory === 8 the actual RAM may be much higher. Only\n // reject when reported value is strictly below the cap.\n const nav = navigator as Navigator & { deviceMemory?: number };\n if (nav.deviceMemory && nav.deviceMemory < 8) {\n const required = MIN_RAM_GB[modelSize] ?? MIN_RAM_GB.small;\n if (nav.deviceMemory < required) {\n return `Your device has ~${nav.deviceMemory}GB RAM but the ${modelSize} model needs at least ${required}GB.`;\n }\n }\n\n return null;\n}\n\nfunction isMemoryError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes(\"out of memory\") ||\n msg.includes(\"oom\") ||\n msg.includes(\"allocation failed\") ||\n msg.includes(\"err_failed\") ||\n msg.includes(\"arraybuffer\") ||\n msg.includes(\"could not allocate\") ||\n msg.includes(\"webgpu device lost\")\n );\n}\n\nfunction stripThinkTokens(text: string): string {\n let cleaned = text.replace(/<think>[\\s\\S]*?<\\/think>/g, \"\");\n cleaned = cleaned.replace(/<think>[\\s\\S]*$/g, \"\");\n return cleaned.trimStart();\n}\n\nexport function useKanhaChat(config: KanhaChatConfig): KanhaChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n const [mode, setMode] = useState<InferenceMode>(\"detecting\");\n const [loadProgress, setLoadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const engineRef = useRef<any>(null);\n const configRef = useRef(config);\n configRef.current = config;\n\n const updateAssistantMessage = useCallback((text: string) => {\n const cleaned = stripThinkTokens(text);\n if (!cleaned) {\n setIsThinking(true);\n return;\n }\n setIsThinking(false);\n setMessages((prev) => {\n const msgs = [...prev];\n if (msgs[msgs.length - 1]?.role === \"assistant\") {\n msgs[msgs.length - 1] = { role: \"assistant\", content: cleaned };\n } else {\n msgs.push({ role: \"assistant\", content: cleaned });\n }\n return msgs;\n });\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n\n const init = async () => {\n setMode(\"detecting\");\n\n const hasWebGPU = await checkWebGPU();\n if (!hasWebGPU) {\n setMode(\"error\");\n setError(\"WebGPU is not supported in this browser. Try Chrome 113+ or Edge 113+.\");\n return;\n }\n\n const modelSize = configRef.current.modelSize ?? \"small\";\n const memWarning = await checkAvailableMemory(modelSize);\n if (memWarning) {\n setMode(\"error\");\n setError(memWarning);\n return;\n }\n\n if (cancelled) return;\n setMode(\"loading\");\n\n try {\n const webllm = await import(\"@mlc-ai/web-llm\");\n const modelId = \"kanha-custom-model\";\n const modelLib = resolveModelLib(configRef.current);\n const modelUrl = toWebLLMModelUrl(configRef.current.modelUrl);\n\n const engine = await webllm.CreateMLCEngine(modelId, {\n appConfig: {\n model_list: [\n {\n model: modelUrl,\n model_id: modelId,\n model_lib: modelLib,\n overrides: {\n context_window_size: configRef.current.contextWindowSize ?? 4096,\n },\n },\n ],\n useIndexedDBCache: true,\n },\n initProgressCallback: (report: { progress: number }) => {\n if (!cancelled) setLoadProgress(Math.round(report.progress * 100));\n },\n logLevel: \"SILENT\",\n });\n\n if (cancelled) return;\n engineRef.current = engine;\n setMode(\"ready\");\n } catch (err) {\n if (cancelled) return;\n setMode(\"error\");\n if (isMemoryError(err)) {\n const size = configRef.current.modelSize ?? \"small\";\n const ram = (navigator as Navigator & { deviceMemory?: number }).deviceMemory;\n setError(\n `Not enough memory to load the ${size} model${ram ? ` (device has ~${ram}GB RAM)` : \"\"}. ` +\n `Close other tabs or try a smaller model.`\n );\n } else {\n setError(\n err instanceof Error ? err.message : \"Failed to load AI model.\"\n );\n }\n }\n };\n\n init();\n return () => {\n cancelled = true;\n if (engineRef.current) {\n try { engineRef.current.unload(); } catch { /* best-effort */ }\n engineRef.current = null;\n }\n };\n }, [config.modelUrl, config.modelLib, config.modelSize]);\n\n const send = useCallback(async () => {\n if (!input.trim() || mode !== \"ready\" || isLoading || !engineRef.current) return;\n\n const userMsg: Message = { role: \"user\", content: input.trim() };\n const allMessages = [...messages, userMsg];\n setMessages(allMessages);\n setInput(\"\");\n setIsLoading(true);\n setIsThinking(true);\n setError(null);\n\n try {\n const systemMessages: Message[] = configRef.current.systemPrompt\n ? [{ role: \"system\", content: configRef.current.systemPrompt }]\n : [];\n\n const completion = await engineRef.current.chat.completions.create({\n messages: [...systemMessages, ...allMessages],\n temperature: configRef.current.temperature ?? 0.7,\n max_tokens: configRef.current.maxTokens ?? 1024,\n stream: true,\n });\n\n let text = \"\";\n for await (const chunk of completion) {\n const delta = chunk.choices[0]?.delta?.content || \"\";\n text += delta;\n updateAssistantMessage(text);\n }\n } catch {\n setError(\"Failed to generate response. Please try again.\");\n setMessages((prev) => [\n ...prev,\n { role: \"assistant\", content: \"Sorry, I encountered an error. Please try again.\" },\n ]);\n } finally {\n setIsLoading(false);\n setIsThinking(false);\n }\n }, [input, mode, isLoading, messages, updateAssistantMessage]);\n\n const clear = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n };\n}\n","import type { CSSProperties } from \"react\";\n\nexport function fabStyle(\n primaryColor: string,\n position: \"bottom-right\" | \"bottom-left\",\n): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 24,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 56,\n height: 56,\n borderRadius: \"50%\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n zIndex: 9999,\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n };\n}\n\nexport function panelStyle(position: \"bottom-right\" | \"bottom-left\"): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 96,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 384,\n maxWidth: \"calc(100vw - 48px)\",\n maxHeight: \"calc(100vh - 120px)\",\n borderRadius: 16,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n boxShadow: \"0 8px 30px rgba(0,0,0,0.12)\",\n border: \"1px solid #e5e7eb\",\n background: \"#ffffff\",\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n };\n}\n\nexport const headerStyle: CSSProperties = {\n padding: \"16px\",\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n};\n\nexport const headerTitleStyle: CSSProperties = {\n fontWeight: 600,\n fontSize: 15,\n margin: 0,\n};\n\nexport const headerSubtitleStyle: CSSProperties = {\n fontSize: 12,\n opacity: 0.85,\n margin: \"4px 0 0\",\n};\n\nexport const messagesContainerStyle: CSSProperties = {\n flex: 1,\n overflowY: \"auto\",\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n minHeight: 300,\n maxHeight: 384,\n background: \"#fafafa\",\n};\n\nexport const emptyStateStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n textAlign: \"center\",\n color: \"#6b7280\",\n fontSize: 14,\n padding: 16,\n};\n\nexport function userBubbleStyle(primaryColor: string): CSSProperties {\n return {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: primaryColor,\n color: \"#fff\",\n fontSize: 14,\n lineHeight: 1.5,\n alignSelf: \"flex-end\",\n wordBreak: \"break-word\",\n };\n}\n\nexport const assistantBubbleStyle: CSSProperties = {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: \"#fff\",\n color: \"#1f2937\",\n fontSize: 14,\n lineHeight: 1.5,\n border: \"1px solid #e5e7eb\",\n alignSelf: \"flex-start\",\n wordBreak: \"break-word\",\n};\n\nexport const inputBarStyle: CSSProperties = {\n display: \"flex\",\n gap: 8,\n padding: \"12px 16px\",\n borderTop: \"1px solid #e5e7eb\",\n background: \"#fff\",\n};\n\nexport const textareaStyle: CSSProperties = {\n flex: 1,\n padding: \"8px 12px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 10,\n fontSize: 14,\n resize: \"none\",\n overflow: \"hidden\",\n outline: \"none\",\n fontFamily: \"inherit\",\n minHeight: 40,\n maxHeight: 120,\n lineHeight: 1.5,\n};\n\nexport function sendButtonStyle(primaryColor: string): CSSProperties {\n return {\n padding: \"8px 14px\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n borderRadius: 10,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n transition: \"opacity 0.15s ease\",\n };\n}\n\nexport const iconButtonStyle: CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 4,\n borderRadius: 8,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.8,\n transition: \"opacity 0.15s ease\",\n};\n\nexport function suggestionButtonStyle(primaryColor: string): CSSProperties {\n return {\n fontSize: 13,\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n color: \"#374151\",\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n width: \"100%\",\n transition: \"border-color 0.15s ease\",\n // hover handled inline\n };\n}\n\nexport const progressBarContainer: CSSProperties = {\n width: \"60%\",\n height: 4,\n borderRadius: 2,\n background: \"rgba(255,255,255,0.3)\",\n marginTop: 8,\n overflow: \"hidden\",\n};\n\nexport function progressBarFill(progress: number, primaryColor: string): CSSProperties {\n return {\n width: `${progress}%`,\n height: \"100%\",\n borderRadius: 2,\n background: primaryColor,\n transition: \"width 0.3s ease\",\n };\n}\n","import {\n useState,\n useEffect,\n useRef,\n type KeyboardEvent,\n type CSSProperties,\n} from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport { useKanhaChat } from \"./use-kanha-chat\";\nimport type { KanhaBotProps } from \"./types\";\nimport * as s from \"./styles\";\n\n// Inline SVG icons (no icon library dependency)\nconst ChatIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst SendIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" /><polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\" /><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nconst Spinner = ({ size = 18 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ animation: \"kanha-spin 1s linear infinite\" }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n);\n\nconst spinKeyframes = `@keyframes kanha-spin { to { transform: rotate(360deg); } }`;\nconst bounceKeyframes = `\n@keyframes kanha-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n}`;\n\nfunction ThinkingDots() {\n const dotStyle = (delay: number): CSSProperties => ({\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#9ca3af\",\n animation: `kanha-bounce 1.2s ease-in-out ${delay}ms infinite`,\n });\n return (\n <span style={{ display: \"flex\", gap: 3, alignItems: \"center\" }}>\n <span style={dotStyle(0)} />\n <span style={dotStyle(150)} />\n <span style={dotStyle(300)} />\n <span style={{ fontSize: 12, color: \"#9ca3af\", marginLeft: 6 }}>Thinking</span>\n </span>\n );\n}\n\nexport function KanhaBot({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n botName = \"AI Assistant\",\n welcomeMessage = \"Ask me anything!\",\n suggestions = [],\n theme = {},\n}: KanhaBotProps) {\n const primaryColor = theme.primaryColor ?? \"#0d9488\";\n const position = theme.position ?? \"bottom-right\";\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n } = useKanhaChat({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n useEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height = Math.min(textareaRef.current.scrollHeight, 120) + \"px\";\n }\n }, [input]);\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const isReady = mode === \"ready\";\n\n return (\n <>\n <style>{spinKeyframes}{bounceKeyframes}</style>\n\n {isOpen && (\n <div style={s.panelStyle(position)}>\n {/* Header */}\n <div style={{ ...s.headerStyle, background: primaryColor }}>\n <div>\n <p style={s.headerTitleStyle}>{botName}</p>\n <p style={s.headerSubtitleStyle}>\n {isReady\n ? welcomeMessage\n : mode === \"loading\"\n ? `Loading AI model (${loadProgress}%)`\n : mode === \"error\"\n ? \"Failed to load\"\n : \"Detecting capabilities...\"}\n </p>\n {mode === \"loading\" && (\n <div style={s.progressBarContainer}>\n <div style={s.progressBarFill(loadProgress, \"#fff\")} />\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 4 }}>\n {messages.length > 0 && (\n <button onClick={clear} style={s.iconButtonStyle} aria-label=\"Clear chat\">\n <TrashIcon />\n </button>\n )}\n <button onClick={() => setIsOpen(false)} style={s.iconButtonStyle} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n </div>\n\n {/* Error banner */}\n {error && (\n <div style={{ padding: \"10px 16px\", background: \"#fef2f2\", borderBottom: \"1px solid #fecaca\", fontSize: 13, color: \"#b91c1c\" }}>\n {error}\n </div>\n )}\n\n {/* Messages */}\n <div style={s.messagesContainerStyle}>\n {messages.length === 0 ? (\n <div style={s.emptyStateStyle}>\n {isReady ? (\n <>\n <ChatIcon />\n <p style={{ marginTop: 12, fontWeight: 500, color: \"#374151\" }}>\n {welcomeMessage}\n </p>\n {suggestions.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, width: \"100%\", marginTop: 16 }}>\n {suggestions.map((text) => (\n <button\n key={text}\n onClick={() => { setInput(text); setTimeout(send, 0); }}\n style={s.suggestionButtonStyle(primaryColor)}\n onMouseEnter={(e) => { (e.target as HTMLElement).style.borderColor = primaryColor; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.borderColor = \"#e5e7eb\"; }}\n >\n {text}\n </button>\n ))}\n </div>\n )}\n </>\n ) : mode === \"loading\" ? (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Loading AI model ({loadProgress}%)</p>\n <p style={{ fontSize: 12, marginTop: 4 }}>First load takes about a minute</p>\n </>\n ) : mode === \"error\" ? (\n <p>{error}</p>\n ) : (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Detecting browser capabilities...</p>\n </>\n )}\n </div>\n ) : (\n <>\n {messages.map((msg, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n justifyContent: msg.role === \"user\" ? \"flex-end\" : \"flex-start\",\n }}\n >\n <div style={msg.role === \"user\" ? s.userBubbleStyle(primaryColor) : s.assistantBubbleStyle}>\n {msg.role === \"assistant\" ? (\n <ReactMarkdown>{msg.content}</ReactMarkdown>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{msg.content}</span>\n )}\n </div>\n </div>\n ))}\n {isLoading && (isThinking || messages[messages.length - 1]?.role !== \"assistant\") && (\n <div style={{ display: \"flex\", justifyContent: \"flex-start\" }}>\n <div style={s.assistantBubbleStyle}>\n {isThinking ? <ThinkingDots /> : <Spinner size={16} />}\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input */}\n <div style={s.inputBarStyle}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyPress}\n placeholder={isReady ? \"Type your message...\" : \"Waiting for model...\"}\n disabled={!isReady || isLoading}\n rows={1}\n style={{\n ...s.textareaStyle,\n opacity: !isReady ? 0.5 : 1,\n }}\n />\n <button\n onClick={send}\n disabled={!isReady || isLoading || !input.trim()}\n style={{\n ...s.sendButtonStyle(primaryColor),\n opacity: !isReady || isLoading || !input.trim() ? 0.5 : 1,\n cursor: !isReady || isLoading || !input.trim() ? \"not-allowed\" : \"pointer\",\n }}\n aria-label=\"Send message\"\n >\n {isLoading ? <Spinner size={18} /> : <SendIcon />}\n </button>\n </div>\n </div>\n )}\n\n {/* FAB */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={s.fabStyle(primaryColor, position)}\n aria-label=\"Toggle chat\"\n onMouseEnter={(e) => { (e.target as HTMLElement).style.transform = \"scale(1.05)\"; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.transform = \"scale(1)\"; }}\n >\n {isOpen ? <CloseIcon /> : <ChatIcon />}\n </button>\n </>\n );\n}\n"]}
package/dist/index.js CHANGED
@@ -24,9 +24,9 @@ function toWebLLMModelUrl(modelUrl) {
24
24
  return url;
25
25
  }
26
26
  var MIN_RAM_GB = {
27
- small: 4,
28
- medium: 8,
29
- large: 12
27
+ small: 2,
28
+ medium: 4,
29
+ large: 8
30
30
  };
31
31
  async function checkWebGPU() {
32
32
  try {
@@ -77,7 +77,7 @@ async function checkAvailableMemory(modelSize) {
77
77
  return `Not enough free memory to load the ${modelSize} model (~${needMB}MB required). Close other tabs and try again.`;
78
78
  }
79
79
  const nav = navigator;
80
- if (nav.deviceMemory) {
80
+ if (nav.deviceMemory && nav.deviceMemory < 8) {
81
81
  const required = MIN_RAM_GB[modelSize] ?? MIN_RAM_GB.small;
82
82
  if (nav.deviceMemory < required) {
83
83
  return `Your device has ~${nav.deviceMemory}GB RAM but the ${modelSize} model needs at least ${required}GB.`;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/use-kanha-chat.ts","../src/styles.ts","../src/KanhaBot.tsx"],"names":["nav","needed","useState","useRef","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { Message, InferenceMode, KanhaChatConfig, KanhaChatReturn } from \"./types\";\n\nconst MODEL_LIB_PREFIX =\n \"https://raw.githubusercontent.com/mlc-ai/binary-mlc-llm-libs/main/web-llm-models/v0_2_80\";\n\nconst WASM_BY_SIZE: Record<string, string> = {\n small: `${MODEL_LIB_PREFIX}/Qwen3-0.6B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n medium: `${MODEL_LIB_PREFIX}/Qwen3-1.7B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n large: `${MODEL_LIB_PREFIX}/Qwen3-4B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n};\n\nfunction resolveModelLib(config: KanhaChatConfig): string {\n if (config.modelLib) return config.modelLib;\n const size = config.modelSize ?? \"small\";\n const lib = WASM_BY_SIZE[size];\n if (!lib) throw new Error(`Unknown model size \"${size}\". Provide modelLib explicitly.`);\n return lib;\n}\n\n/**\n * Converts a storage URL into a format web-llm's cleanModelUrl won't mangle.\n * web-llm checks for /resolve/ in the URL — if missing, it appends /resolve/main/.\n * We append /resolve/v1/ so the URL passes through untouched.\n * Files must be stored at {modelUrl}/resolve/v1/{filename} in storage.\n */\nfunction toWebLLMModelUrl(modelUrl: string): string {\n let url = modelUrl.endsWith(\"/\") ? modelUrl.slice(0, -1) : modelUrl;\n if (!url.includes(\"/resolve/\")) {\n url += \"/resolve/v1\";\n }\n return url;\n}\n\n// Minimum device RAM (GB) recommended per model size\nconst MIN_RAM_GB: Record<string, number> = {\n small: 4,\n medium: 8,\n large: 12,\n};\n\nasync function checkWebGPU(): Promise<boolean> {\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<unknown> } };\n if (!nav.gpu) return false;\n const adapter = (await nav.gpu.requestAdapter()) as { requestDevice(): Promise<unknown> } | null;\n if (!adapter) return false;\n const device = await adapter.requestDevice();\n return !!device;\n } catch {\n return false;\n }\n}\n\n// Approximate model weight sizes in bytes (q4f16_1 quantized)\nconst MODEL_WEIGHT_BYTES: Record<string, number> = {\n small: 400 * 1024 * 1024, // ~400MB\n medium: 1100 * 1024 * 1024, // ~1.1GB\n large: 2500 * 1024 * 1024, // ~2.5GB\n};\n\nasync function checkAvailableMemory(modelSize: string): Promise<string | null> {\n // 1. Try WebGPU adapter limits (most reliable for GPU memory)\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<{ limits: { maxBufferSize: number } } | null> } };\n if (nav.gpu) {\n const adapter = await nav.gpu.requestAdapter();\n if (adapter) {\n const maxBufferSize = adapter.limits.maxBufferSize;\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n // If the GPU's max buffer is smaller than model weights, it won't fit\n if (maxBufferSize < needed) {\n const maxMB = Math.round(maxBufferSize / (1024 * 1024));\n const needMB = Math.round(needed / (1024 * 1024));\n return `Your GPU can only allocate ~${maxMB}MB but the ${modelSize} model needs ~${needMB}MB. Try a smaller model or close other GPU-heavy tabs.`;\n }\n }\n }\n } catch { /* ignore, fall through */ }\n\n // 2. Try probing available system memory with a test allocation\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n const probeSize = Math.min(needed, 512 * 1024 * 1024); // probe up to 512MB\n try {\n const buf = new ArrayBuffer(probeSize);\n // If we got here, allocation succeeded — free it\n // (TypeScript doesn't have explicit free, but losing the reference lets GC collect)\n if (buf.byteLength !== probeSize) {\n return `Your device doesn't have enough free memory to load the ${modelSize} model. Close other tabs and try again.`;\n }\n } catch {\n const needMB = Math.round(needed / (1024 * 1024));\n return `Not enough free memory to load the ${modelSize} model (~${needMB}MB required). Close other tabs and try again.`;\n }\n\n // 3. Fallback: check navigator.deviceMemory (coarse, total RAM)\n const nav = navigator as Navigator & { deviceMemory?: number };\n if (nav.deviceMemory) {\n const required = MIN_RAM_GB[modelSize] ?? MIN_RAM_GB.small;\n if (nav.deviceMemory < required) {\n return `Your device has ~${nav.deviceMemory}GB RAM but the ${modelSize} model needs at least ${required}GB.`;\n }\n }\n\n return null;\n}\n\nfunction isMemoryError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes(\"out of memory\") ||\n msg.includes(\"oom\") ||\n msg.includes(\"allocation failed\") ||\n msg.includes(\"err_failed\") ||\n msg.includes(\"arraybuffer\") ||\n msg.includes(\"could not allocate\") ||\n msg.includes(\"webgpu device lost\")\n );\n}\n\nfunction stripThinkTokens(text: string): string {\n let cleaned = text.replace(/<think>[\\s\\S]*?<\\/think>/g, \"\");\n cleaned = cleaned.replace(/<think>[\\s\\S]*$/g, \"\");\n return cleaned.trimStart();\n}\n\nexport function useKanhaChat(config: KanhaChatConfig): KanhaChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n const [mode, setMode] = useState<InferenceMode>(\"detecting\");\n const [loadProgress, setLoadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const engineRef = useRef<any>(null);\n const configRef = useRef(config);\n configRef.current = config;\n\n const updateAssistantMessage = useCallback((text: string) => {\n const cleaned = stripThinkTokens(text);\n if (!cleaned) {\n setIsThinking(true);\n return;\n }\n setIsThinking(false);\n setMessages((prev) => {\n const msgs = [...prev];\n if (msgs[msgs.length - 1]?.role === \"assistant\") {\n msgs[msgs.length - 1] = { role: \"assistant\", content: cleaned };\n } else {\n msgs.push({ role: \"assistant\", content: cleaned });\n }\n return msgs;\n });\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n\n const init = async () => {\n setMode(\"detecting\");\n\n const hasWebGPU = await checkWebGPU();\n if (!hasWebGPU) {\n setMode(\"error\");\n setError(\"WebGPU is not supported in this browser. Try Chrome 113+ or Edge 113+.\");\n return;\n }\n\n const modelSize = configRef.current.modelSize ?? \"small\";\n const memWarning = await checkAvailableMemory(modelSize);\n if (memWarning) {\n setMode(\"error\");\n setError(memWarning);\n return;\n }\n\n if (cancelled) return;\n setMode(\"loading\");\n\n try {\n const webllm = await import(\"@mlc-ai/web-llm\");\n const modelId = \"kanha-custom-model\";\n const modelLib = resolveModelLib(configRef.current);\n const modelUrl = toWebLLMModelUrl(configRef.current.modelUrl);\n\n const engine = await webllm.CreateMLCEngine(modelId, {\n appConfig: {\n model_list: [\n {\n model: modelUrl,\n model_id: modelId,\n model_lib: modelLib,\n overrides: {\n context_window_size: configRef.current.contextWindowSize ?? 4096,\n },\n },\n ],\n useIndexedDBCache: true,\n },\n initProgressCallback: (report: { progress: number }) => {\n if (!cancelled) setLoadProgress(Math.round(report.progress * 100));\n },\n logLevel: \"SILENT\",\n });\n\n if (cancelled) return;\n engineRef.current = engine;\n setMode(\"ready\");\n } catch (err) {\n if (cancelled) return;\n setMode(\"error\");\n if (isMemoryError(err)) {\n const size = configRef.current.modelSize ?? \"small\";\n const ram = (navigator as Navigator & { deviceMemory?: number }).deviceMemory;\n setError(\n `Not enough memory to load the ${size} model${ram ? ` (device has ~${ram}GB RAM)` : \"\"}. ` +\n `Close other tabs or try a smaller model.`\n );\n } else {\n setError(\n err instanceof Error ? err.message : \"Failed to load AI model.\"\n );\n }\n }\n };\n\n init();\n return () => {\n cancelled = true;\n if (engineRef.current) {\n try { engineRef.current.unload(); } catch { /* best-effort */ }\n engineRef.current = null;\n }\n };\n }, [config.modelUrl, config.modelLib, config.modelSize]);\n\n const send = useCallback(async () => {\n if (!input.trim() || mode !== \"ready\" || isLoading || !engineRef.current) return;\n\n const userMsg: Message = { role: \"user\", content: input.trim() };\n const allMessages = [...messages, userMsg];\n setMessages(allMessages);\n setInput(\"\");\n setIsLoading(true);\n setIsThinking(true);\n setError(null);\n\n try {\n const systemMessages: Message[] = configRef.current.systemPrompt\n ? [{ role: \"system\", content: configRef.current.systemPrompt }]\n : [];\n\n const completion = await engineRef.current.chat.completions.create({\n messages: [...systemMessages, ...allMessages],\n temperature: configRef.current.temperature ?? 0.7,\n max_tokens: configRef.current.maxTokens ?? 1024,\n stream: true,\n });\n\n let text = \"\";\n for await (const chunk of completion) {\n const delta = chunk.choices[0]?.delta?.content || \"\";\n text += delta;\n updateAssistantMessage(text);\n }\n } catch {\n setError(\"Failed to generate response. Please try again.\");\n setMessages((prev) => [\n ...prev,\n { role: \"assistant\", content: \"Sorry, I encountered an error. Please try again.\" },\n ]);\n } finally {\n setIsLoading(false);\n setIsThinking(false);\n }\n }, [input, mode, isLoading, messages, updateAssistantMessage]);\n\n const clear = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n };\n}\n","import type { CSSProperties } from \"react\";\n\nexport function fabStyle(\n primaryColor: string,\n position: \"bottom-right\" | \"bottom-left\",\n): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 24,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 56,\n height: 56,\n borderRadius: \"50%\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n zIndex: 9999,\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n };\n}\n\nexport function panelStyle(position: \"bottom-right\" | \"bottom-left\"): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 96,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 384,\n maxWidth: \"calc(100vw - 48px)\",\n maxHeight: \"calc(100vh - 120px)\",\n borderRadius: 16,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n boxShadow: \"0 8px 30px rgba(0,0,0,0.12)\",\n border: \"1px solid #e5e7eb\",\n background: \"#ffffff\",\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n };\n}\n\nexport const headerStyle: CSSProperties = {\n padding: \"16px\",\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n};\n\nexport const headerTitleStyle: CSSProperties = {\n fontWeight: 600,\n fontSize: 15,\n margin: 0,\n};\n\nexport const headerSubtitleStyle: CSSProperties = {\n fontSize: 12,\n opacity: 0.85,\n margin: \"4px 0 0\",\n};\n\nexport const messagesContainerStyle: CSSProperties = {\n flex: 1,\n overflowY: \"auto\",\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n minHeight: 300,\n maxHeight: 384,\n background: \"#fafafa\",\n};\n\nexport const emptyStateStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n textAlign: \"center\",\n color: \"#6b7280\",\n fontSize: 14,\n padding: 16,\n};\n\nexport function userBubbleStyle(primaryColor: string): CSSProperties {\n return {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: primaryColor,\n color: \"#fff\",\n fontSize: 14,\n lineHeight: 1.5,\n alignSelf: \"flex-end\",\n wordBreak: \"break-word\",\n };\n}\n\nexport const assistantBubbleStyle: CSSProperties = {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: \"#fff\",\n color: \"#1f2937\",\n fontSize: 14,\n lineHeight: 1.5,\n border: \"1px solid #e5e7eb\",\n alignSelf: \"flex-start\",\n wordBreak: \"break-word\",\n};\n\nexport const inputBarStyle: CSSProperties = {\n display: \"flex\",\n gap: 8,\n padding: \"12px 16px\",\n borderTop: \"1px solid #e5e7eb\",\n background: \"#fff\",\n};\n\nexport const textareaStyle: CSSProperties = {\n flex: 1,\n padding: \"8px 12px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 10,\n fontSize: 14,\n resize: \"none\",\n overflow: \"hidden\",\n outline: \"none\",\n fontFamily: \"inherit\",\n minHeight: 40,\n maxHeight: 120,\n lineHeight: 1.5,\n};\n\nexport function sendButtonStyle(primaryColor: string): CSSProperties {\n return {\n padding: \"8px 14px\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n borderRadius: 10,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n transition: \"opacity 0.15s ease\",\n };\n}\n\nexport const iconButtonStyle: CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 4,\n borderRadius: 8,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.8,\n transition: \"opacity 0.15s ease\",\n};\n\nexport function suggestionButtonStyle(primaryColor: string): CSSProperties {\n return {\n fontSize: 13,\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n color: \"#374151\",\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n width: \"100%\",\n transition: \"border-color 0.15s ease\",\n // hover handled inline\n };\n}\n\nexport const progressBarContainer: CSSProperties = {\n width: \"60%\",\n height: 4,\n borderRadius: 2,\n background: \"rgba(255,255,255,0.3)\",\n marginTop: 8,\n overflow: \"hidden\",\n};\n\nexport function progressBarFill(progress: number, primaryColor: string): CSSProperties {\n return {\n width: `${progress}%`,\n height: \"100%\",\n borderRadius: 2,\n background: primaryColor,\n transition: \"width 0.3s ease\",\n };\n}\n","import {\n useState,\n useEffect,\n useRef,\n type KeyboardEvent,\n type CSSProperties,\n} from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport { useKanhaChat } from \"./use-kanha-chat\";\nimport type { KanhaBotProps } from \"./types\";\nimport * as s from \"./styles\";\n\n// Inline SVG icons (no icon library dependency)\nconst ChatIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst SendIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" /><polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\" /><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nconst Spinner = ({ size = 18 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ animation: \"kanha-spin 1s linear infinite\" }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n);\n\nconst spinKeyframes = `@keyframes kanha-spin { to { transform: rotate(360deg); } }`;\nconst bounceKeyframes = `\n@keyframes kanha-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n}`;\n\nfunction ThinkingDots() {\n const dotStyle = (delay: number): CSSProperties => ({\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#9ca3af\",\n animation: `kanha-bounce 1.2s ease-in-out ${delay}ms infinite`,\n });\n return (\n <span style={{ display: \"flex\", gap: 3, alignItems: \"center\" }}>\n <span style={dotStyle(0)} />\n <span style={dotStyle(150)} />\n <span style={dotStyle(300)} />\n <span style={{ fontSize: 12, color: \"#9ca3af\", marginLeft: 6 }}>Thinking</span>\n </span>\n );\n}\n\nexport function KanhaBot({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n botName = \"AI Assistant\",\n welcomeMessage = \"Ask me anything!\",\n suggestions = [],\n theme = {},\n}: KanhaBotProps) {\n const primaryColor = theme.primaryColor ?? \"#0d9488\";\n const position = theme.position ?? \"bottom-right\";\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n } = useKanhaChat({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n useEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height = Math.min(textareaRef.current.scrollHeight, 120) + \"px\";\n }\n }, [input]);\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const isReady = mode === \"ready\";\n\n return (\n <>\n <style>{spinKeyframes}{bounceKeyframes}</style>\n\n {isOpen && (\n <div style={s.panelStyle(position)}>\n {/* Header */}\n <div style={{ ...s.headerStyle, background: primaryColor }}>\n <div>\n <p style={s.headerTitleStyle}>{botName}</p>\n <p style={s.headerSubtitleStyle}>\n {isReady\n ? welcomeMessage\n : mode === \"loading\"\n ? `Loading AI model (${loadProgress}%)`\n : mode === \"error\"\n ? \"Failed to load\"\n : \"Detecting capabilities...\"}\n </p>\n {mode === \"loading\" && (\n <div style={s.progressBarContainer}>\n <div style={s.progressBarFill(loadProgress, \"#fff\")} />\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 4 }}>\n {messages.length > 0 && (\n <button onClick={clear} style={s.iconButtonStyle} aria-label=\"Clear chat\">\n <TrashIcon />\n </button>\n )}\n <button onClick={() => setIsOpen(false)} style={s.iconButtonStyle} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n </div>\n\n {/* Error banner */}\n {error && (\n <div style={{ padding: \"10px 16px\", background: \"#fef2f2\", borderBottom: \"1px solid #fecaca\", fontSize: 13, color: \"#b91c1c\" }}>\n {error}\n </div>\n )}\n\n {/* Messages */}\n <div style={s.messagesContainerStyle}>\n {messages.length === 0 ? (\n <div style={s.emptyStateStyle}>\n {isReady ? (\n <>\n <ChatIcon />\n <p style={{ marginTop: 12, fontWeight: 500, color: \"#374151\" }}>\n {welcomeMessage}\n </p>\n {suggestions.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, width: \"100%\", marginTop: 16 }}>\n {suggestions.map((text) => (\n <button\n key={text}\n onClick={() => { setInput(text); setTimeout(send, 0); }}\n style={s.suggestionButtonStyle(primaryColor)}\n onMouseEnter={(e) => { (e.target as HTMLElement).style.borderColor = primaryColor; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.borderColor = \"#e5e7eb\"; }}\n >\n {text}\n </button>\n ))}\n </div>\n )}\n </>\n ) : mode === \"loading\" ? (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Loading AI model ({loadProgress}%)</p>\n <p style={{ fontSize: 12, marginTop: 4 }}>First load takes about a minute</p>\n </>\n ) : mode === \"error\" ? (\n <p>{error}</p>\n ) : (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Detecting browser capabilities...</p>\n </>\n )}\n </div>\n ) : (\n <>\n {messages.map((msg, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n justifyContent: msg.role === \"user\" ? \"flex-end\" : \"flex-start\",\n }}\n >\n <div style={msg.role === \"user\" ? s.userBubbleStyle(primaryColor) : s.assistantBubbleStyle}>\n {msg.role === \"assistant\" ? (\n <ReactMarkdown>{msg.content}</ReactMarkdown>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{msg.content}</span>\n )}\n </div>\n </div>\n ))}\n {isLoading && (isThinking || messages[messages.length - 1]?.role !== \"assistant\") && (\n <div style={{ display: \"flex\", justifyContent: \"flex-start\" }}>\n <div style={s.assistantBubbleStyle}>\n {isThinking ? <ThinkingDots /> : <Spinner size={16} />}\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input */}\n <div style={s.inputBarStyle}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyPress}\n placeholder={isReady ? \"Type your message...\" : \"Waiting for model...\"}\n disabled={!isReady || isLoading}\n rows={1}\n style={{\n ...s.textareaStyle,\n opacity: !isReady ? 0.5 : 1,\n }}\n />\n <button\n onClick={send}\n disabled={!isReady || isLoading || !input.trim()}\n style={{\n ...s.sendButtonStyle(primaryColor),\n opacity: !isReady || isLoading || !input.trim() ? 0.5 : 1,\n cursor: !isReady || isLoading || !input.trim() ? \"not-allowed\" : \"pointer\",\n }}\n aria-label=\"Send message\"\n >\n {isLoading ? <Spinner size={18} /> : <SendIcon />}\n </button>\n </div>\n </div>\n )}\n\n {/* FAB */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={s.fabStyle(primaryColor, position)}\n aria-label=\"Toggle chat\"\n onMouseEnter={(e) => { (e.target as HTMLElement).style.transform = \"scale(1.05)\"; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.transform = \"scale(1)\"; }}\n >\n {isOpen ? <CloseIcon /> : <ChatIcon />}\n </button>\n </>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/use-kanha-chat.ts","../src/styles.ts","../src/KanhaBot.tsx"],"names":["nav","needed","useState","useRef","useEffect"],"mappings":";;;;;AAGA,IAAM,gBAAA,GACJ,0FAAA;AAEF,IAAM,YAAA,GAAuC;AAAA,EAC3C,KAAA,EAAO,GAAG,gBAAgB,CAAA,0CAAA,CAAA;AAAA,EAC1B,MAAA,EAAQ,GAAG,gBAAgB,CAAA,0CAAA,CAAA;AAAA,EAC3B,KAAA,EAAO,GAAG,gBAAgB,CAAA,wCAAA;AAC5B,CAAA;AAEA,SAAS,gBAAgB,MAAA,EAAiC;AACxD,EAAA,IAAI,MAAA,CAAO,QAAA,EAAU,OAAO,MAAA,CAAO,QAAA;AACnC,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,IAAa,OAAA;AACjC,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,+BAAA,CAAiC,CAAA;AACtF,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,iBAAiB,QAAA,EAA0B;AAClD,EAAA,IAAI,GAAA,GAAM,SAAS,QAAA,CAAS,GAAG,IAAI,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA;AAC3D,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC9B,IAAA,GAAA,IAAO,aAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAGA,IAAM,UAAA,GAAqC;AAAA,EACzC,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,KAAA,EAAO;AACT,CAAA;AAEA,eAAe,WAAA,GAAgC;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,SAAA;AACZ,IAAA,IAAI,CAAC,GAAA,CAAI,GAAA,EAAK,OAAO,KAAA;AACrB,IAAA,MAAM,OAAA,GAAW,MAAM,GAAA,CAAI,GAAA,CAAI,cAAA,EAAe;AAC9C,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,aAAA,EAAc;AAC3C,IAAA,OAAO,CAAC,CAAC,MAAA;AAAA,EACX,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,IAAM,kBAAA,GAA6C;AAAA,EACjD,KAAA,EAAO,MAAM,IAAA,GAAO,IAAA;AAAA;AAAA,EACpB,MAAA,EAAQ,OAAO,IAAA,GAAO,IAAA;AAAA;AAAA,EACtB,KAAA,EAAO,OAAO,IAAA,GAAO;AAAA;AACvB,CAAA;AAEA,eAAe,qBAAqB,SAAA,EAA2C;AAE7E,EAAA,IAAI;AACF,IAAA,MAAMA,IAAAA,GAAM,SAAA;AACZ,IAAA,IAAIA,KAAI,GAAA,EAAK;AACX,MAAA,MAAM,OAAA,GAAU,MAAMA,IAAAA,CAAI,GAAA,CAAI,cAAA,EAAe;AAC7C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,aAAA;AACrC,QAAA,MAAMC,OAAAA,GAAS,kBAAA,CAAmB,SAAS,CAAA,IAAK,kBAAA,CAAmB,KAAA;AAEnE,QAAA,IAAI,gBAAgBA,OAAAA,EAAQ;AAC1B,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,aAAA,IAAiB,OAAO,IAAA,CAAK,CAAA;AACtD,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAMA,OAAAA,IAAU,OAAO,IAAA,CAAK,CAAA;AAChD,UAAA,OAAO,CAAA,4BAAA,EAA+B,KAAK,CAAA,WAAA,EAAc,SAAS,iBAAiB,MAAM,CAAA,sDAAA,CAAA;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAA6B;AAGrC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAS,CAAA,IAAK,kBAAA,CAAmB,KAAA;AACnE,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,GAAA,GAAM,OAAO,IAAI,CAAA;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,SAAS,CAAA;AAGrC,IAAA,IAAI,GAAA,CAAI,eAAe,SAAA,EAAW;AAChC,MAAA,OAAO,2DAA2D,SAAS,CAAA,uCAAA,CAAA;AAAA,IAC7E;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,OAAO,IAAA,CAAK,CAAA;AAChD,IAAA,OAAO,CAAA,mCAAA,EAAsC,SAAS,CAAA,SAAA,EAAY,MAAM,CAAA,6CAAA,CAAA;AAAA,EAC1E;AAMA,EAAA,MAAM,GAAA,GAAM,SAAA;AACZ,EAAA,IAAI,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG;AAC5C,IAAA,MAAM,QAAA,GAAW,UAAA,CAAW,SAAS,CAAA,IAAK,UAAA,CAAW,KAAA;AACrD,IAAA,IAAI,GAAA,CAAI,eAAe,QAAA,EAAU;AAC/B,MAAA,OAAO,oBAAoB,GAAA,CAAI,YAAY,CAAA,eAAA,EAAkB,SAAS,yBAAyB,QAAQ,CAAA,GAAA,CAAA;AAAA,IACzG;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,GAAA,EAAuB;AAC5C,EAAA,IAAI,EAAE,GAAA,YAAe,KAAA,CAAA,EAAQ,OAAO,KAAA;AACpC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAY;AACpC,EAAA,OACE,GAAA,CAAI,QAAA,CAAS,eAAe,CAAA,IAC5B,GAAA,CAAI,QAAA,CAAS,KAAK,CAAA,IAClB,GAAA,CAAI,QAAA,CAAS,mBAAmB,CAAA,IAChC,GAAA,CAAI,SAAS,YAAY,CAAA,IACzB,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,IAC1B,GAAA,CAAI,QAAA,CAAS,oBAAoB,CAAA,IACjC,GAAA,CAAI,QAAA,CAAS,oBAAoB,CAAA;AAErC;AAEA,SAAS,iBAAiB,IAAA,EAAsB;AAC9C,EAAA,IAAI,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,2BAAA,EAA6B,EAAE,CAAA;AAC1D,EAAA,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,kBAAA,EAAoB,EAAE,CAAA;AAChD,EAAA,OAAO,QAAQ,SAAA,EAAU;AAC3B;AAEO,SAAS,aAAa,MAAA,EAA0C;AACrE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAAoB,EAAE,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAwB,WAAW,CAAA;AAC3D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,CAAC,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,IAAI,CAAA;AAGtD,EAAA,MAAM,SAAA,GAAY,OAAY,IAAI,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,OAAO,MAAM,CAAA;AAC/B,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAEpB,EAAA,MAAM,sBAAA,GAAyB,WAAA,CAAY,CAAC,IAAA,KAAiB;AAC3D,IAAA,MAAM,OAAA,GAAU,iBAAiB,IAAI,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA;AAAA,IACF;AACA,IAAA,aAAA,CAAc,KAAK,CAAA;AACnB,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA;AACrB,MAAA,IAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAG,SAAS,WAAA,EAAa;AAC/C,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,CAAC,CAAA,GAAI,EAAE,IAAA,EAAM,WAAA,EAAa,SAAS,OAAA,EAAQ;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,SAAS,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,OAAO,YAAY;AACvB,MAAA,OAAA,CAAQ,WAAW,CAAA;AAEnB,MAAA,MAAM,SAAA,GAAY,MAAM,WAAA,EAAY;AACpC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,OAAO,CAAA;AACf,QAAA,QAAA,CAAS,wEAAwE,CAAA;AACjF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,SAAA,IAAa,OAAA;AACjD,MAAA,MAAM,UAAA,GAAa,MAAM,oBAAA,CAAqB,SAAS,CAAA;AACvD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,OAAA,CAAQ,OAAO,CAAA;AACf,QAAA,QAAA,CAAS,UAAU,CAAA;AACnB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,OAAA,CAAQ,SAAS,CAAA;AAEjB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,OAAO,iBAAiB,CAAA;AAC7C,QAAA,MAAM,OAAA,GAAU,oBAAA;AAChB,QAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,SAAA,CAAU,OAAO,CAAA;AAClD,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAE5D,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA,CAAgB,OAAA,EAAS;AAAA,UACnD,SAAA,EAAW;AAAA,YACT,UAAA,EAAY;AAAA,cACV;AAAA,gBACE,KAAA,EAAO,QAAA;AAAA,gBACP,QAAA,EAAU,OAAA;AAAA,gBACV,SAAA,EAAW,QAAA;AAAA,gBACX,SAAA,EAAW;AAAA,kBACT,mBAAA,EAAqB,SAAA,CAAU,OAAA,CAAQ,iBAAA,IAAqB;AAAA;AAC9D;AACF,aACF;AAAA,YACA,iBAAA,EAAmB;AAAA,WACrB;AAAA,UACA,oBAAA,EAAsB,CAAC,MAAA,KAAiC;AACtD,YAAA,IAAI,CAAC,WAAW,eAAA,CAAgB,IAAA,CAAK,MAAM,MAAA,CAAO,QAAA,GAAW,GAAG,CAAC,CAAA;AAAA,UACnE,CAAA;AAAA,UACA,QAAA,EAAU;AAAA,SACX,CAAA;AAED,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,MACjB,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,OAAA,CAAQ,OAAO,CAAA;AACf,QAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,UAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,CAAQ,SAAA,IAAa,OAAA;AAC5C,UAAA,MAAM,MAAO,SAAA,CAAoD,YAAA;AACjE,UAAA,QAAA;AAAA,YACE,iCAAiC,IAAI,CAAA,MAAA,EAAS,MAAM,CAAA,cAAA,EAAiB,GAAG,YAAY,EAAE,CAAA,0CAAA;AAAA,WAExF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,QAAA;AAAA,YACE,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,WACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,EAAK;AACL,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI,UAAU,OAAA,EAAS;AACrB,QAAA,IAAI;AAAE,UAAA,SAAA,CAAU,QAAQ,MAAA,EAAO;AAAA,QAAG,CAAA,CAAA,MAAQ;AAAA,QAAoB;AAC9D,QAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,CAAO,QAAA,EAAU,OAAO,QAAA,EAAU,MAAA,CAAO,SAAS,CAAC,CAAA;AAEvD,EAAA,MAAM,IAAA,GAAO,YAAY,YAAY;AACnC,IAAA,IAAI,CAAC,MAAM,IAAA,EAAK,IAAK,SAAS,OAAA,IAAW,SAAA,IAAa,CAAC,SAAA,CAAU,OAAA,EAAS;AAE1E,IAAA,MAAM,UAAmB,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,CAAM,MAAK,EAAE;AAC/D,IAAA,MAAM,WAAA,GAAc,CAAC,GAAG,QAAA,EAAU,OAAO,CAAA;AACzC,IAAA,WAAA,CAAY,WAAW,CAAA;AACvB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,GAA4B,SAAA,CAAU,OAAA,CAAQ,YAAA,GAChD,CAAC,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,SAAA,CAAU,OAAA,CAAQ,YAAA,EAAc,IAC5D,EAAC;AAEL,MAAA,MAAM,aAAa,MAAM,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,YAAY,MAAA,CAAO;AAAA,QACjE,QAAA,EAAU,CAAC,GAAG,cAAA,EAAgB,GAAG,WAAW,CAAA;AAAA,QAC5C,WAAA,EAAa,SAAA,CAAU,OAAA,CAAQ,WAAA,IAAe,GAAA;AAAA,QAC9C,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,SAAA,IAAa,IAAA;AAAA,QAC3C,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,IAAA,GAAO,EAAA;AACX,MAAA,WAAA,MAAiB,SAAS,UAAA,EAAY;AACpC,QAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,OAAA,IAAW,EAAA;AAClD,QAAA,IAAA,IAAQ,KAAA;AACR,QAAA,sBAAA,CAAuB,IAAI,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,gDAAgD,CAAA;AACzD,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AAAA,QACpB,GAAG,IAAA;AAAA,QACH,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,kDAAA;AAAmD,OAClF,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,MAAM,SAAA,EAAW,QAAA,EAAU,sBAAsB,CAAC,CAAA;AAE7D,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;;;AC7SO,SAAS,QAAA,CACd,cACA,QAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,CAAC,QAAA,KAAa,cAAA,GAAiB,OAAA,GAAU,MAAM,GAAG,EAAA;AAAA,IAClD,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,UAAA,EAAY,YAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,6BAAA;AAAA,IACX,MAAA,EAAQ,IAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AACF;AAEO,SAAS,WAAW,QAAA,EAAyD;AAClF,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,OAAA;AAAA,IACV,MAAA,EAAQ,EAAA;AAAA,IACR,CAAC,QAAA,KAAa,cAAA,GAAiB,OAAA,GAAU,MAAM,GAAG,EAAA;AAAA,IAClD,KAAA,EAAO,GAAA;AAAA,IACP,QAAA,EAAU,oBAAA;AAAA,IACV,SAAA,EAAW,qBAAA;AAAA,IACX,YAAA,EAAc,EAAA;AAAA,IACd,QAAA,EAAU,QAAA;AAAA,IACV,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,6BAAA;AAAA,IACX,MAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AACF;AAEO,IAAM,WAAA,GAA6B;AAAA,EACxC,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB;AAClB,CAAA;AAEO,IAAM,gBAAA,GAAkC;AAAA,EAC7C,UAAA,EAAY,GAAA;AAAA,EACZ,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAA;AAEO,IAAM,mBAAA,GAAqC;AAAA,EAChD,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ;AACV,CAAA;AAEO,IAAM,sBAAA,GAAwC;AAAA,EACnD,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,MAAA;AAAA,EACX,OAAA,EAAS,EAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,GAAA,EAAK,EAAA;AAAA,EACL,SAAA,EAAW,GAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,eAAA,GAAiC;AAAA,EAC5C,OAAA,EAAS,MAAA;AAAA,EACT,aAAA,EAAe,QAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,MAAA,EAAQ,MAAA;AAAA,EACR,SAAA,EAAW,QAAA;AAAA,EACX,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,EAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEO,SAAS,gBAAgB,YAAA,EAAqC;AACnE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,UAAA;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,UAAA,EAAY,YAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,UAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AACF;AAEO,IAAM,oBAAA,GAAsC;AAAA,EACjD,QAAA,EAAU,KAAA;AAAA,EACV,OAAA,EAAS,UAAA;AAAA,EACT,YAAA,EAAc,EAAA;AAAA,EACd,UAAA,EAAY,MAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,QAAA,EAAU,EAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,MAAA,EAAQ,mBAAA;AAAA,EACR,SAAA,EAAW,YAAA;AAAA,EACX,SAAA,EAAW;AACb,CAAA;AAEO,IAAM,aAAA,GAA+B;AAAA,EAC1C,OAAA,EAAS,MAAA;AAAA,EACT,GAAA,EAAK,CAAA;AAAA,EACL,OAAA,EAAS,WAAA;AAAA,EACT,SAAA,EAAW,mBAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,aAAA,GAA+B;AAAA,EAC1C,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,UAAA;AAAA,EACT,MAAA,EAAQ,mBAAA;AAAA,EACR,YAAA,EAAc,EAAA;AAAA,EACd,QAAA,EAAU,EAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,SAAA;AAAA,EACZ,SAAA,EAAW,EAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,gBAAgB,YAAA,EAAqC;AACnE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,YAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,MAAA,EAAQ,SAAA;AAAA,IACR,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AACF;AAEO,IAAM,eAAA,GAAiC;AAAA,EAC5C,UAAA,EAAY,MAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,CAAA;AAAA,EACT,YAAA,EAAc,CAAA;AAAA,EACd,OAAA,EAAS,MAAA;AAAA,EACT,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB,QAAA;AAAA,EAChB,OAAA,EAAS,GAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAEO,SAAS,sBAAsB,YAAA,EAAqC;AACzE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAA;AAAA,IACV,OAAA,EAAS,UAAA;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,MAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAY,MAAA;AAAA,IACZ,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,MAAA;AAAA,IACX,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY;AAAA;AAAA,GAEd;AACF;AAEO,IAAM,oBAAA,GAAsC;AAAA,EACjD,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,YAAA,EAAc,CAAA;AAAA,EACd,UAAA,EAAY,uBAAA;AAAA,EACZ,SAAA,EAAW,CAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAA;AAEO,SAAS,eAAA,CAAgB,UAAkB,YAAA,EAAqC;AACrF,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,GAAG,QAAQ,CAAA,CAAA,CAAA;AAAA,IAClB,MAAA,EAAQ,MAAA;AAAA,IACR,YAAA,EAAc,CAAA;AAAA,IACd,UAAA,EAAY,YAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AACF;AC9LA,IAAM,QAAA,GAAW,sBACf,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,SACrI,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+DAAA,EAAgE,CAAA,EAC1E,CAAA;AAGF,IAAM,YAAY,sBAChB,IAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA;AAAA,kBAAE,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,CAAA,EAC5E,CAAA;AAGF,IAAM,WAAW,sBACf,IAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA;AAAA,kBAAE,GAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,2BAAA,EAA4B;AAAA,CAAA,EACrF,CAAA;AAGF,IAAM,YAAY,sBAChB,IAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAS,QAAO,cAAA,EAAe,CAAA;AAAA,kBAAE,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gFAAA,EAAiF;AAAA,CAAA,EAC7H,CAAA;AAGF,IAAM,OAAA,GAAU,CAAC,EAAE,IAAA,GAAO,EAAA,EAAG,qBAC3B,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,KAAA,EAAO,EAAE,SAAA,EAAW,+BAAA,EAAgC,EACxJ,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+BAA8B,CAAA,EACxC,CAAA;AAGF,IAAM,aAAA,GAAgB,CAAA,2DAAA,CAAA;AACtB,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAMxB,SAAS,YAAA,GAAe;AACtB,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,MAAkC;AAAA,IAClD,KAAA,EAAO,CAAA;AAAA,IACP,MAAA,EAAQ,CAAA;AAAA,IACR,YAAA,EAAc,KAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,SAAA,EAAW,iCAAiC,KAAK,CAAA,WAAA;AAAA,GACnD,CAAA;AACA,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,CAAA,EAAG,UAAA,EAAY,QAAA,EAAS,EAC3D,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA;AAAA,oBAC1B,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA;AAAA,oBAC5B,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAAG,CAAA;AAAA,oBAC5B,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,CAAA,EAAE,EAAG,QAAA,EAAA,UAAA,EAAQ;AAAA,GAAA,EAC1E,CAAA;AAEJ;AAEO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,OAAA,GAAU,cAAA;AAAA,EACV,cAAA,GAAiB,kBAAA;AAAA,EACjB,cAAc,EAAC;AAAA,EACf,QAAQ;AACV,CAAA,EAAkB;AAChB,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,SAAA;AAC3C,EAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,cAAA;AAEnC,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA;AAAA,MACE,YAAA,CAAa;AAAA,IACf,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIC,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAiBC,OAAuB,IAAI,CAAA;AAClD,EAAA,MAAM,WAAA,GAAcA,OAA4B,IAAI,CAAA;AAEpD,EAAAC,UAAU,MAAM;AACd,IAAA,cAAA,CAAe,OAAA,EAAS,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,WAAA,CAAY,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AACnC,MAAA,WAAA,CAAY,OAAA,CAAQ,MAAM,MAAA,GAAS,IAAA,CAAK,IAAI,WAAA,CAAY,OAAA,CAAQ,YAAA,EAAc,GAAG,CAAA,GAAI,IAAA;AAAA,IACvF;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAqB;AAC3C,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAA,EAAK;AAAA,IACP;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,UAAU,IAAA,KAAS,OAAA;AAEzB,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA,MAAA,aAAA;AAAA,MAAe;AAAA,KAAA,EAAgB,CAAA;AAAA,IAEtC,0BACC,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,UAAA,CAAW,QAAQ,CAAA,EAE/B,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,GAAK,WAAA,EAAa,UAAA,EAAY,cAAa,EACvD,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAS,gBAAA,EAAmB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BACvC,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAS,mBAAA,EACT,oBACG,cAAA,GACA,IAAA,KAAS,SAAA,GACP,CAAA,kBAAA,EAAqB,YAAY,CAAA,EAAA,CAAA,GACjC,IAAA,KAAS,OAAA,GACP,mBACA,2BAAA,EACV,CAAA;AAAA,UACC,IAAA,KAAS,SAAA,oBACR,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,oBAAA,EACZ,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,eAAA,CAAgB,YAAA,EAAc,MAAM,GAAG,CAAA,EACvD;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACA,IAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,GAAA,EAAK,GAAE,EACnC,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,MAAA,GAAS,CAAA,oBACjB,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,EAAS,eAAA,EAAiB,YAAA,EAAW,YAAA,EAC3D,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb,CAAA;AAAA,0BAEF,GAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,KAAA,EAAS,eAAA,EAAiB,YAAA,EAAW,OAAA,EAC5E,QAAA,kBAAA,GAAA,CAAC,aAAU,CAAA,EACb;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,yBACC,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,WAAA,EAAa,UAAA,EAAY,SAAA,EAAW,YAAA,EAAc,qBAAqB,QAAA,EAAU,EAAA,EAAI,KAAA,EAAO,SAAA,IAChH,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,sBAIF,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,sBAAA,EACX,QAAA,EAAA,QAAA,CAAS,MAAA,KAAW,CAAA,mBACnB,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,eAAA,EACX,QAAA,EAAA,OAAA,mBACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAAA,wBACV,GAAA,CAAC,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,EAAA,EAAI,UAAA,EAAY,GAAA,EAAK,KAAA,EAAO,SAAA,EAAU,EAC1D,QAAA,EAAA,cAAA,EACH,CAAA;AAAA,QACC,WAAA,CAAY,SAAS,CAAA,oBACpB,GAAA,CAAC,SAAI,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,aAAA,EAAe,UAAU,GAAA,EAAK,CAAA,EAAG,OAAO,MAAA,EAAQ,SAAA,EAAW,IAAG,EAC1F,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,qBAChB,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,SAAS,MAAM;AAAE,cAAA,QAAA,CAAS,IAAI,CAAA;AAAG,cAAA,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,YAAG,CAAA;AAAA,YACtD,KAAA,EAAS,sBAAkC,CAAA;AAAA,YAC3C,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,cAAC,CAAA,CAAE,MAAA,CAAuB,KAAA,CAAM,WAAA,GAAc,YAAA;AAAA,YAAc,CAAA;AAAA,YACnF,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,cAAC,CAAA,CAAE,MAAA,CAAuB,KAAA,CAAM,WAAA,GAAc,SAAA;AAAA,YAAW,CAAA;AAAA,YAE/E,QAAA,EAAA;AAAA,WAAA;AAAA,UANI;AAAA,SAQR,CAAA,EACH;AAAA,OAAA,EAEJ,CAAA,GACE,IAAA,KAAS,SAAA,mBACX,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,6BAClB,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,GAAE,EAAG,QAAA,EAAA;AAAA,UAAA,oBAAA;AAAA,UAAmB,YAAA;AAAA,UAAa;AAAA,SAAA,EAAE,CAAA;AAAA,wBAC9D,GAAA,CAAC,OAAE,KAAA,EAAO,EAAE,UAAU,EAAA,EAAI,SAAA,EAAW,CAAA,EAAE,EAAG,QAAA,EAAA,iCAAA,EAA+B;AAAA,OAAA,EAC3E,IACE,IAAA,KAAS,OAAA,uBACV,GAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,oBAEV,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,CAAA;AAAA,4BAClB,GAAA,EAAA,EAAE,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,IAAK,QAAA,EAAA,mCAAA,EAAiC;AAAA,OAAA,EAC/D,CAAA,EAEJ,oBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,QAAA,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBAClB,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO;AAAA,cACL,OAAA,EAAS,MAAA;AAAA,cACT,cAAA,EAAgB,GAAA,CAAI,IAAA,KAAS,MAAA,GAAS,UAAA,GAAa;AAAA,aACrD;AAAA,YAEA,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,GAAA,CAAI,IAAA,KAAS,MAAA,GAAW,eAAA,CAAgB,YAAY,CAAA,GAAM,oBAAA,EACnE,QAAA,EAAA,GAAA,CAAI,IAAA,KAAS,WAAA,mBACZ,GAAA,CAAC,aAAA,EAAA,EAAe,QAAA,EAAA,GAAA,CAAI,OAAA,EAAQ,CAAA,mBAE5B,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,UAAA,EAAW,EAAI,QAAA,EAAA,GAAA,CAAI,OAAA,EAAQ,CAAA,EAE1D;AAAA,WAAA;AAAA,UAZK;AAAA,SAcR,CAAA;AAAA,QACA,SAAA,KAAc,UAAA,IAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,EAAG,IAAA,KAAS,WAAA,CAAA,oBACnE,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,cAAA,EAAgB,YAAA,EAAa,EAC1D,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,sBACX,QAAA,EAAA,UAAA,mBAAa,GAAA,CAAC,YAAA,EAAA,EAAa,CAAA,mBAAK,GAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAM,EAAA,EAAI,GACtD,CAAA,EACF,CAAA;AAAA,wBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,cAAA,EAAgB;AAAA,OAAA,EAC5B,CAAA,EAEJ,CAAA;AAAA,sBAGA,IAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAS,aAAA,EACZ,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,WAAA;AAAA,YACL,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,SAAA,EAAW,cAAA;AAAA,YACX,WAAA,EAAa,UAAU,sBAAA,GAAyB,sBAAA;AAAA,YAChD,QAAA,EAAU,CAAC,OAAA,IAAW,SAAA;AAAA,YACtB,IAAA,EAAM,CAAA;AAAA,YACN,KAAA,EAAO;AAAA,cACL,GAAK,aAAA;AAAA,cACL,OAAA,EAAS,CAAC,OAAA,GAAU,GAAA,GAAM;AAAA;AAC5B;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,IAAA;AAAA,YACT,UAAU,CAAC,OAAA,IAAW,SAAA,IAAa,CAAC,MAAM,IAAA,EAAK;AAAA,YAC/C,KAAA,EAAO;AAAA,cACL,GAAK,gBAAgB,YAAY,CAAA;AAAA,cACjC,OAAA,EAAS,CAAC,OAAA,IAAW,SAAA,IAAa,CAAC,KAAA,CAAM,IAAA,KAAS,GAAA,GAAM,CAAA;AAAA,cACxD,MAAA,EAAQ,CAAC,OAAA,IAAW,SAAA,IAAa,CAAC,KAAA,CAAM,IAAA,KAAS,aAAA,GAAgB;AAAA,aACnE;AAAA,YACA,YAAA,EAAW,cAAA;AAAA,YAEV,sCAAY,GAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,EAAA,EAAI,CAAA,uBAAM,QAAA,EAAA,EAAS;AAAA;AAAA;AACjD,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAIF,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,QAChC,KAAA,EAAS,QAAA,CAAS,YAAA,EAAc,QAAQ,CAAA;AAAA,QACxC,YAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,MAAA,CAAuB,KAAA,CAAM,SAAA,GAAY,aAAA;AAAA,QAAe,CAAA;AAAA,QAClF,YAAA,EAAc,CAAC,CAAA,KAAM;AAAE,UAAC,CAAA,CAAE,MAAA,CAAuB,KAAA,CAAM,SAAA,GAAY,UAAA;AAAA,QAAY,CAAA;AAAA,QAE9E,QAAA,EAAA,MAAA,mBAAS,GAAA,CAAC,SAAA,EAAA,EAAU,CAAA,uBAAM,QAAA,EAAA,EAAS;AAAA;AAAA;AACtC,GAAA,EACF,CAAA;AAEJ","file":"index.js","sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { Message, InferenceMode, KanhaChatConfig, KanhaChatReturn } from \"./types\";\n\nconst MODEL_LIB_PREFIX =\n \"https://raw.githubusercontent.com/mlc-ai/binary-mlc-llm-libs/main/web-llm-models/v0_2_80\";\n\nconst WASM_BY_SIZE: Record<string, string> = {\n small: `${MODEL_LIB_PREFIX}/Qwen3-0.6B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n medium: `${MODEL_LIB_PREFIX}/Qwen3-1.7B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n large: `${MODEL_LIB_PREFIX}/Qwen3-4B-q4f16_1-ctx4k_cs1k-webgpu.wasm`,\n};\n\nfunction resolveModelLib(config: KanhaChatConfig): string {\n if (config.modelLib) return config.modelLib;\n const size = config.modelSize ?? \"small\";\n const lib = WASM_BY_SIZE[size];\n if (!lib) throw new Error(`Unknown model size \"${size}\". Provide modelLib explicitly.`);\n return lib;\n}\n\n/**\n * Converts a storage URL into a format web-llm's cleanModelUrl won't mangle.\n * web-llm checks for /resolve/ in the URL — if missing, it appends /resolve/main/.\n * We append /resolve/v1/ so the URL passes through untouched.\n * Files must be stored at {modelUrl}/resolve/v1/{filename} in storage.\n */\nfunction toWebLLMModelUrl(modelUrl: string): string {\n let url = modelUrl.endsWith(\"/\") ? modelUrl.slice(0, -1) : modelUrl;\n if (!url.includes(\"/resolve/\")) {\n url += \"/resolve/v1\";\n }\n return url;\n}\n\n// Minimum device RAM (GB) recommended per model size\nconst MIN_RAM_GB: Record<string, number> = {\n small: 2,\n medium: 4,\n large: 8,\n};\n\nasync function checkWebGPU(): Promise<boolean> {\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<unknown> } };\n if (!nav.gpu) return false;\n const adapter = (await nav.gpu.requestAdapter()) as { requestDevice(): Promise<unknown> } | null;\n if (!adapter) return false;\n const device = await adapter.requestDevice();\n return !!device;\n } catch {\n return false;\n }\n}\n\n// Approximate model weight sizes in bytes (q4f16_1 quantized)\nconst MODEL_WEIGHT_BYTES: Record<string, number> = {\n small: 400 * 1024 * 1024, // ~400MB\n medium: 1100 * 1024 * 1024, // ~1.1GB\n large: 2500 * 1024 * 1024, // ~2.5GB\n};\n\nasync function checkAvailableMemory(modelSize: string): Promise<string | null> {\n // 1. Try WebGPU adapter limits (most reliable for GPU memory)\n try {\n const nav = navigator as Navigator & { gpu?: { requestAdapter(): Promise<{ limits: { maxBufferSize: number } } | null> } };\n if (nav.gpu) {\n const adapter = await nav.gpu.requestAdapter();\n if (adapter) {\n const maxBufferSize = adapter.limits.maxBufferSize;\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n // If the GPU's max buffer is smaller than model weights, it won't fit\n if (maxBufferSize < needed) {\n const maxMB = Math.round(maxBufferSize / (1024 * 1024));\n const needMB = Math.round(needed / (1024 * 1024));\n return `Your GPU can only allocate ~${maxMB}MB but the ${modelSize} model needs ~${needMB}MB. Try a smaller model or close other GPU-heavy tabs.`;\n }\n }\n }\n } catch { /* ignore, fall through */ }\n\n // 2. Try probing available system memory with a test allocation\n const needed = MODEL_WEIGHT_BYTES[modelSize] ?? MODEL_WEIGHT_BYTES.small;\n const probeSize = Math.min(needed, 512 * 1024 * 1024); // probe up to 512MB\n try {\n const buf = new ArrayBuffer(probeSize);\n // If we got here, allocation succeeded — free it\n // (TypeScript doesn't have explicit free, but losing the reference lets GC collect)\n if (buf.byteLength !== probeSize) {\n return `Your device doesn't have enough free memory to load the ${modelSize} model. Close other tabs and try again.`;\n }\n } catch {\n const needMB = Math.round(needed / (1024 * 1024));\n return `Not enough free memory to load the ${modelSize} model (~${needMB}MB required). Close other tabs and try again.`;\n }\n\n // 3. Fallback: check navigator.deviceMemory (coarse, total RAM)\n // Note: browsers cap this at 8GB for fingerprinting protection, so\n // if deviceMemory === 8 the actual RAM may be much higher. Only\n // reject when reported value is strictly below the cap.\n const nav = navigator as Navigator & { deviceMemory?: number };\n if (nav.deviceMemory && nav.deviceMemory < 8) {\n const required = MIN_RAM_GB[modelSize] ?? MIN_RAM_GB.small;\n if (nav.deviceMemory < required) {\n return `Your device has ~${nav.deviceMemory}GB RAM but the ${modelSize} model needs at least ${required}GB.`;\n }\n }\n\n return null;\n}\n\nfunction isMemoryError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n const msg = err.message.toLowerCase();\n return (\n msg.includes(\"out of memory\") ||\n msg.includes(\"oom\") ||\n msg.includes(\"allocation failed\") ||\n msg.includes(\"err_failed\") ||\n msg.includes(\"arraybuffer\") ||\n msg.includes(\"could not allocate\") ||\n msg.includes(\"webgpu device lost\")\n );\n}\n\nfunction stripThinkTokens(text: string): string {\n let cleaned = text.replace(/<think>[\\s\\S]*?<\\/think>/g, \"\");\n cleaned = cleaned.replace(/<think>[\\s\\S]*$/g, \"\");\n return cleaned.trimStart();\n}\n\nexport function useKanhaChat(config: KanhaChatConfig): KanhaChatReturn {\n const [messages, setMessages] = useState<Message[]>([]);\n const [input, setInput] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n const [isThinking, setIsThinking] = useState(false);\n const [mode, setMode] = useState<InferenceMode>(\"detecting\");\n const [loadProgress, setLoadProgress] = useState(0);\n const [error, setError] = useState<string | null>(null);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const engineRef = useRef<any>(null);\n const configRef = useRef(config);\n configRef.current = config;\n\n const updateAssistantMessage = useCallback((text: string) => {\n const cleaned = stripThinkTokens(text);\n if (!cleaned) {\n setIsThinking(true);\n return;\n }\n setIsThinking(false);\n setMessages((prev) => {\n const msgs = [...prev];\n if (msgs[msgs.length - 1]?.role === \"assistant\") {\n msgs[msgs.length - 1] = { role: \"assistant\", content: cleaned };\n } else {\n msgs.push({ role: \"assistant\", content: cleaned });\n }\n return msgs;\n });\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let cancelled = false;\n\n const init = async () => {\n setMode(\"detecting\");\n\n const hasWebGPU = await checkWebGPU();\n if (!hasWebGPU) {\n setMode(\"error\");\n setError(\"WebGPU is not supported in this browser. Try Chrome 113+ or Edge 113+.\");\n return;\n }\n\n const modelSize = configRef.current.modelSize ?? \"small\";\n const memWarning = await checkAvailableMemory(modelSize);\n if (memWarning) {\n setMode(\"error\");\n setError(memWarning);\n return;\n }\n\n if (cancelled) return;\n setMode(\"loading\");\n\n try {\n const webllm = await import(\"@mlc-ai/web-llm\");\n const modelId = \"kanha-custom-model\";\n const modelLib = resolveModelLib(configRef.current);\n const modelUrl = toWebLLMModelUrl(configRef.current.modelUrl);\n\n const engine = await webllm.CreateMLCEngine(modelId, {\n appConfig: {\n model_list: [\n {\n model: modelUrl,\n model_id: modelId,\n model_lib: modelLib,\n overrides: {\n context_window_size: configRef.current.contextWindowSize ?? 4096,\n },\n },\n ],\n useIndexedDBCache: true,\n },\n initProgressCallback: (report: { progress: number }) => {\n if (!cancelled) setLoadProgress(Math.round(report.progress * 100));\n },\n logLevel: \"SILENT\",\n });\n\n if (cancelled) return;\n engineRef.current = engine;\n setMode(\"ready\");\n } catch (err) {\n if (cancelled) return;\n setMode(\"error\");\n if (isMemoryError(err)) {\n const size = configRef.current.modelSize ?? \"small\";\n const ram = (navigator as Navigator & { deviceMemory?: number }).deviceMemory;\n setError(\n `Not enough memory to load the ${size} model${ram ? ` (device has ~${ram}GB RAM)` : \"\"}. ` +\n `Close other tabs or try a smaller model.`\n );\n } else {\n setError(\n err instanceof Error ? err.message : \"Failed to load AI model.\"\n );\n }\n }\n };\n\n init();\n return () => {\n cancelled = true;\n if (engineRef.current) {\n try { engineRef.current.unload(); } catch { /* best-effort */ }\n engineRef.current = null;\n }\n };\n }, [config.modelUrl, config.modelLib, config.modelSize]);\n\n const send = useCallback(async () => {\n if (!input.trim() || mode !== \"ready\" || isLoading || !engineRef.current) return;\n\n const userMsg: Message = { role: \"user\", content: input.trim() };\n const allMessages = [...messages, userMsg];\n setMessages(allMessages);\n setInput(\"\");\n setIsLoading(true);\n setIsThinking(true);\n setError(null);\n\n try {\n const systemMessages: Message[] = configRef.current.systemPrompt\n ? [{ role: \"system\", content: configRef.current.systemPrompt }]\n : [];\n\n const completion = await engineRef.current.chat.completions.create({\n messages: [...systemMessages, ...allMessages],\n temperature: configRef.current.temperature ?? 0.7,\n max_tokens: configRef.current.maxTokens ?? 1024,\n stream: true,\n });\n\n let text = \"\";\n for await (const chunk of completion) {\n const delta = chunk.choices[0]?.delta?.content || \"\";\n text += delta;\n updateAssistantMessage(text);\n }\n } catch {\n setError(\"Failed to generate response. Please try again.\");\n setMessages((prev) => [\n ...prev,\n { role: \"assistant\", content: \"Sorry, I encountered an error. Please try again.\" },\n ]);\n } finally {\n setIsLoading(false);\n setIsThinking(false);\n }\n }, [input, mode, isLoading, messages, updateAssistantMessage]);\n\n const clear = useCallback(() => {\n setMessages([]);\n setError(null);\n }, []);\n\n return {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n };\n}\n","import type { CSSProperties } from \"react\";\n\nexport function fabStyle(\n primaryColor: string,\n position: \"bottom-right\" | \"bottom-left\",\n): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 24,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 56,\n height: 56,\n borderRadius: \"50%\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: \"0 4px 12px rgba(0,0,0,0.15)\",\n zIndex: 9999,\n transition: \"transform 0.15s ease, box-shadow 0.15s ease\",\n };\n}\n\nexport function panelStyle(position: \"bottom-right\" | \"bottom-left\"): CSSProperties {\n return {\n position: \"fixed\",\n bottom: 96,\n [position === \"bottom-right\" ? \"right\" : \"left\"]: 24,\n width: 384,\n maxWidth: \"calc(100vw - 48px)\",\n maxHeight: \"calc(100vh - 120px)\",\n borderRadius: 16,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n boxShadow: \"0 8px 30px rgba(0,0,0,0.12)\",\n border: \"1px solid #e5e7eb\",\n background: \"#ffffff\",\n zIndex: 9999,\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n };\n}\n\nexport const headerStyle: CSSProperties = {\n padding: \"16px\",\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n};\n\nexport const headerTitleStyle: CSSProperties = {\n fontWeight: 600,\n fontSize: 15,\n margin: 0,\n};\n\nexport const headerSubtitleStyle: CSSProperties = {\n fontSize: 12,\n opacity: 0.85,\n margin: \"4px 0 0\",\n};\n\nexport const messagesContainerStyle: CSSProperties = {\n flex: 1,\n overflowY: \"auto\",\n padding: 16,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n minHeight: 300,\n maxHeight: 384,\n background: \"#fafafa\",\n};\n\nexport const emptyStateStyle: CSSProperties = {\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n textAlign: \"center\",\n color: \"#6b7280\",\n fontSize: 14,\n padding: 16,\n};\n\nexport function userBubbleStyle(primaryColor: string): CSSProperties {\n return {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: primaryColor,\n color: \"#fff\",\n fontSize: 14,\n lineHeight: 1.5,\n alignSelf: \"flex-end\",\n wordBreak: \"break-word\",\n };\n}\n\nexport const assistantBubbleStyle: CSSProperties = {\n maxWidth: \"80%\",\n padding: \"8px 14px\",\n borderRadius: 16,\n background: \"#fff\",\n color: \"#1f2937\",\n fontSize: 14,\n lineHeight: 1.5,\n border: \"1px solid #e5e7eb\",\n alignSelf: \"flex-start\",\n wordBreak: \"break-word\",\n};\n\nexport const inputBarStyle: CSSProperties = {\n display: \"flex\",\n gap: 8,\n padding: \"12px 16px\",\n borderTop: \"1px solid #e5e7eb\",\n background: \"#fff\",\n};\n\nexport const textareaStyle: CSSProperties = {\n flex: 1,\n padding: \"8px 12px\",\n border: \"1px solid #e5e7eb\",\n borderRadius: 10,\n fontSize: 14,\n resize: \"none\",\n overflow: \"hidden\",\n outline: \"none\",\n fontFamily: \"inherit\",\n minHeight: 40,\n maxHeight: 120,\n lineHeight: 1.5,\n};\n\nexport function sendButtonStyle(primaryColor: string): CSSProperties {\n return {\n padding: \"8px 14px\",\n background: primaryColor,\n color: \"#fff\",\n border: \"none\",\n borderRadius: 10,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n transition: \"opacity 0.15s ease\",\n };\n}\n\nexport const iconButtonStyle: CSSProperties = {\n background: \"none\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 4,\n borderRadius: 8,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n opacity: 0.8,\n transition: \"opacity 0.15s ease\",\n};\n\nexport function suggestionButtonStyle(primaryColor: string): CSSProperties {\n return {\n fontSize: 13,\n padding: \"8px 12px\",\n borderRadius: 10,\n border: \"1px solid #e5e7eb\",\n background: \"#fff\",\n color: \"#374151\",\n cursor: \"pointer\",\n textAlign: \"left\" as const,\n width: \"100%\",\n transition: \"border-color 0.15s ease\",\n // hover handled inline\n };\n}\n\nexport const progressBarContainer: CSSProperties = {\n width: \"60%\",\n height: 4,\n borderRadius: 2,\n background: \"rgba(255,255,255,0.3)\",\n marginTop: 8,\n overflow: \"hidden\",\n};\n\nexport function progressBarFill(progress: number, primaryColor: string): CSSProperties {\n return {\n width: `${progress}%`,\n height: \"100%\",\n borderRadius: 2,\n background: primaryColor,\n transition: \"width 0.3s ease\",\n };\n}\n","import {\n useState,\n useEffect,\n useRef,\n type KeyboardEvent,\n type CSSProperties,\n} from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport { useKanhaChat } from \"./use-kanha-chat\";\nimport type { KanhaBotProps } from \"./types\";\nimport * as s from \"./styles\";\n\n// Inline SVG icons (no icon library dependency)\nconst ChatIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n);\n\nconst CloseIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" /><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nconst SendIcon = () => (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" /><polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n);\n\nconst TrashIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 6 5 6 21 6\" /><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n);\n\nconst Spinner = ({ size = 18 }: { size?: number }) => (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" style={{ animation: \"kanha-spin 1s linear infinite\" }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n);\n\nconst spinKeyframes = `@keyframes kanha-spin { to { transform: rotate(360deg); } }`;\nconst bounceKeyframes = `\n@keyframes kanha-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n}`;\n\nfunction ThinkingDots() {\n const dotStyle = (delay: number): CSSProperties => ({\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"#9ca3af\",\n animation: `kanha-bounce 1.2s ease-in-out ${delay}ms infinite`,\n });\n return (\n <span style={{ display: \"flex\", gap: 3, alignItems: \"center\" }}>\n <span style={dotStyle(0)} />\n <span style={dotStyle(150)} />\n <span style={dotStyle(300)} />\n <span style={{ fontSize: 12, color: \"#9ca3af\", marginLeft: 6 }}>Thinking</span>\n </span>\n );\n}\n\nexport function KanhaBot({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n botName = \"AI Assistant\",\n welcomeMessage = \"Ask me anything!\",\n suggestions = [],\n theme = {},\n}: KanhaBotProps) {\n const primaryColor = theme.primaryColor ?? \"#0d9488\";\n const position = theme.position ?? \"bottom-right\";\n\n const {\n messages,\n input,\n setInput,\n isLoading,\n isThinking,\n mode,\n loadProgress,\n error,\n send,\n clear,\n } = useKanhaChat({\n modelUrl,\n modelLib,\n modelSize,\n systemPrompt,\n temperature,\n maxTokens,\n contextWindowSize,\n });\n\n const [isOpen, setIsOpen] = useState(false);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n useEffect(() => {\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height = Math.min(textareaRef.current.scrollHeight, 120) + \"px\";\n }\n }, [input]);\n\n const handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n send();\n }\n };\n\n const isReady = mode === \"ready\";\n\n return (\n <>\n <style>{spinKeyframes}{bounceKeyframes}</style>\n\n {isOpen && (\n <div style={s.panelStyle(position)}>\n {/* Header */}\n <div style={{ ...s.headerStyle, background: primaryColor }}>\n <div>\n <p style={s.headerTitleStyle}>{botName}</p>\n <p style={s.headerSubtitleStyle}>\n {isReady\n ? welcomeMessage\n : mode === \"loading\"\n ? `Loading AI model (${loadProgress}%)`\n : mode === \"error\"\n ? \"Failed to load\"\n : \"Detecting capabilities...\"}\n </p>\n {mode === \"loading\" && (\n <div style={s.progressBarContainer}>\n <div style={s.progressBarFill(loadProgress, \"#fff\")} />\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", gap: 4 }}>\n {messages.length > 0 && (\n <button onClick={clear} style={s.iconButtonStyle} aria-label=\"Clear chat\">\n <TrashIcon />\n </button>\n )}\n <button onClick={() => setIsOpen(false)} style={s.iconButtonStyle} aria-label=\"Close\">\n <CloseIcon />\n </button>\n </div>\n </div>\n\n {/* Error banner */}\n {error && (\n <div style={{ padding: \"10px 16px\", background: \"#fef2f2\", borderBottom: \"1px solid #fecaca\", fontSize: 13, color: \"#b91c1c\" }}>\n {error}\n </div>\n )}\n\n {/* Messages */}\n <div style={s.messagesContainerStyle}>\n {messages.length === 0 ? (\n <div style={s.emptyStateStyle}>\n {isReady ? (\n <>\n <ChatIcon />\n <p style={{ marginTop: 12, fontWeight: 500, color: \"#374151\" }}>\n {welcomeMessage}\n </p>\n {suggestions.length > 0 && (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6, width: \"100%\", marginTop: 16 }}>\n {suggestions.map((text) => (\n <button\n key={text}\n onClick={() => { setInput(text); setTimeout(send, 0); }}\n style={s.suggestionButtonStyle(primaryColor)}\n onMouseEnter={(e) => { (e.target as HTMLElement).style.borderColor = primaryColor; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.borderColor = \"#e5e7eb\"; }}\n >\n {text}\n </button>\n ))}\n </div>\n )}\n </>\n ) : mode === \"loading\" ? (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Loading AI model ({loadProgress}%)</p>\n <p style={{ fontSize: 12, marginTop: 4 }}>First load takes about a minute</p>\n </>\n ) : mode === \"error\" ? (\n <p>{error}</p>\n ) : (\n <>\n <Spinner size={32} />\n <p style={{ marginTop: 8 }}>Detecting browser capabilities...</p>\n </>\n )}\n </div>\n ) : (\n <>\n {messages.map((msg, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n justifyContent: msg.role === \"user\" ? \"flex-end\" : \"flex-start\",\n }}\n >\n <div style={msg.role === \"user\" ? s.userBubbleStyle(primaryColor) : s.assistantBubbleStyle}>\n {msg.role === \"assistant\" ? (\n <ReactMarkdown>{msg.content}</ReactMarkdown>\n ) : (\n <span style={{ whiteSpace: \"pre-wrap\" }}>{msg.content}</span>\n )}\n </div>\n </div>\n ))}\n {isLoading && (isThinking || messages[messages.length - 1]?.role !== \"assistant\") && (\n <div style={{ display: \"flex\", justifyContent: \"flex-start\" }}>\n <div style={s.assistantBubbleStyle}>\n {isThinking ? <ThinkingDots /> : <Spinner size={16} />}\n </div>\n </div>\n )}\n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input */}\n <div style={s.inputBarStyle}>\n <textarea\n ref={textareaRef}\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={handleKeyPress}\n placeholder={isReady ? \"Type your message...\" : \"Waiting for model...\"}\n disabled={!isReady || isLoading}\n rows={1}\n style={{\n ...s.textareaStyle,\n opacity: !isReady ? 0.5 : 1,\n }}\n />\n <button\n onClick={send}\n disabled={!isReady || isLoading || !input.trim()}\n style={{\n ...s.sendButtonStyle(primaryColor),\n opacity: !isReady || isLoading || !input.trim() ? 0.5 : 1,\n cursor: !isReady || isLoading || !input.trim() ? \"not-allowed\" : \"pointer\",\n }}\n aria-label=\"Send message\"\n >\n {isLoading ? <Spinner size={18} /> : <SendIcon />}\n </button>\n </div>\n </div>\n )}\n\n {/* FAB */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n style={s.fabStyle(primaryColor, position)}\n aria-label=\"Toggle chat\"\n onMouseEnter={(e) => { (e.target as HTMLElement).style.transform = \"scale(1.05)\"; }}\n onMouseLeave={(e) => { (e.target as HTMLElement).style.transform = \"scale(1)\"; }}\n >\n {isOpen ? <CloseIcon /> : <ChatIcon />}\n </button>\n </>\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kanha-ai",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Drop-in AI chatbot widget powered by on-device WebGPU inference",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",