kanha-ai 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/widget.ts"],"names":[],"mappings":"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","file":"widget.js","sourcesContent":["/**\n * Standalone widget for CDN / vanilla JS usage.\n * No React dependency — pure DOM manipulation.\n *\n * Usage via CDN:\n * <script type=\"module\">\n * import { mount } from 'https://cdn.jsdelivr.net/npm/kanha/dist/widget.js';\n * const bot = mount('#chat', { modelUrl: '...', systemPrompt: '...' });\n * </script>\n *\n * Or as a web component:\n * <script type=\"module\" src=\"https://cdn.jsdelivr.net/npm/kanha/dist/widget.js\"></script>\n * <kanha-bot model-url=\"...\" system-prompt=\"...\" bot-name=\"Acme Bot\"></kanha-bot>\n */\n\nimport type { KanhaBotProps, KanhaBotTheme, Message, InferenceMode } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Engine (same logic as use-kanha-chat.ts, but non-React)\n// ---------------------------------------------------------------------------\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(modelLib?: string, modelSize?: string): string {\n if (modelLib) return modelLib;\n const size = 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\nfunction toWebLLMModelUrl(modelUrl: string): string {\n let url = modelUrl.endsWith(\"/\") ? modelUrl.slice(0, -1) : modelUrl;\n if (!url.includes(\"/resolve/\")) url += \"/resolve/v1\";\n return url;\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 return !!(await adapter.requestDevice());\n } catch {\n return false;\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\nfunction esc(text: string): string {\n const el = document.createElement(\"span\");\n el.textContent = text;\n return el.innerHTML;\n}\n\n// ---------------------------------------------------------------------------\n// DOM Widget\n// ---------------------------------------------------------------------------\n\nconst CSS = `\n:host {\n all: initial;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n}\n@keyframes kb-spin { to { transform: rotate(360deg); } }\n@keyframes kb-bounce {\n 0%, 80%, 100% { transform: translateY(0); }\n 40% { transform: translateY(-4px); }\n}\n.kb-fab {\n position: fixed; bottom: 24px; width: 56px; height: 56px; border-radius: 50%;\n color: #fff; border: none; cursor: pointer; display: flex; align-items: center;\n justify-content: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 9999;\n transition: transform 0.15s ease;\n}\n.kb-fab:hover { transform: scale(1.05); }\n.kb-panel {\n position: fixed; bottom: 96px; width: 384px; max-width: calc(100vw - 48px);\n border-radius: 16px; overflow: hidden; display: flex; flex-direction: column;\n box-shadow: 0 8px 30px rgba(0,0,0,0.12); border: 1px solid #e5e7eb;\n background: #fff; z-index: 9999;\n}\n.kb-header { padding: 16px; color: #fff; display: flex; align-items: center; justify-content: space-between; }\n.kb-header-title { font-weight: 600; font-size: 15px; margin: 0; }\n.kb-header-sub { font-size: 12px; opacity: 0.85; margin: 4px 0 0; }\n.kb-progress { width: 60%; height: 4px; border-radius: 2px; background: rgba(255,255,255,0.3); margin-top: 8px; overflow: hidden; }\n.kb-progress-fill { height: 100%; border-radius: 2px; background: #fff; transition: width 0.3s ease; }\n.kb-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 12px; min-height: 300px; max-height: 384px; background: #fafafa; }\n.kb-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; text-align: center; color: #6b7280; font-size: 14px; padding: 16px; }\n.kb-msg { display: flex; }\n.kb-msg-user { justify-content: flex-end; }\n.kb-msg-assistant { justify-content: flex-start; }\n.kb-bubble { max-width: 80%; padding: 8px 14px; border-radius: 16px; font-size: 14px; line-height: 1.5; word-break: break-word; }\n.kb-bubble-user { color: #fff; }\n.kb-bubble-assistant { background: #fff; color: #1f2937; border: 1px solid #e5e7eb; }\n.kb-bubble p { margin: 0; } .kb-bubble p + p { margin-top: 8px; }\n.kb-thinking { display: flex; gap: 3px; align-items: center; }\n.kb-dot { width: 6px; height: 6px; border-radius: 50%; background: #9ca3af; }\n.kb-dot:nth-child(1) { animation: kb-bounce 1.2s ease-in-out 0ms infinite; }\n.kb-dot:nth-child(2) { animation: kb-bounce 1.2s ease-in-out 150ms infinite; }\n.kb-dot:nth-child(3) { animation: kb-bounce 1.2s ease-in-out 300ms infinite; }\n.kb-thinking-label { font-size: 12px; color: #9ca3af; margin-left: 6px; }\n.kb-spinner { animation: kb-spin 1s linear infinite; }\n.kb-input-bar { display: flex; gap: 8px; padding: 12px 16px; border-top: 1px solid #e5e7eb; background: #fff; }\n.kb-textarea {\n flex: 1; padding: 8px 12px; border: 1px solid #e5e7eb; border-radius: 10px; font-size: 14px;\n resize: none; overflow: hidden; outline: none; font-family: inherit; min-height: 40px; max-height: 120px; line-height: 1.5;\n}\n.kb-textarea:focus { box-shadow: 0 0 0 2px rgba(13,148,136,0.25); }\n.kb-send {\n padding: 8px 14px; color: #fff; border: none; border-radius: 10px; cursor: pointer;\n display: flex; align-items: center; justify-content: center; flex-shrink: 0;\n transition: opacity 0.15s ease;\n}\n.kb-send:disabled { opacity: 0.5; cursor: not-allowed; }\n.kb-icon-btn { background: none; border: none; color: inherit; cursor: pointer; padding: 4px; border-radius: 8px; display: flex; align-items: center; opacity: 0.8; }\n.kb-icon-btn:hover { opacity: 1; }\n.kb-suggestions { display: flex; flex-direction: column; gap: 6px; width: 100%; margin-top: 16px; }\n.kb-suggestion {\n font-size: 13px; padding: 8px 12px; border-radius: 10px; border: 1px solid #e5e7eb;\n background: #fff; color: #374151; cursor: pointer; text-align: left; width: 100%;\n transition: border-color 0.15s ease;\n}\n.kb-suggestion:hover { border-color: var(--kb-primary, #0d9488); }\n.kb-error { padding: 10px 16px; background: #fef2f2; border-bottom: 1px solid #fecaca; font-size: 13px; color: #b91c1c; }\n`;\n\nconst SVG_CHAT = `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>`;\nconst SVG_CLOSE = `<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>`;\nconst SVG_SEND = `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></svg>`;\nconst SVG_TRASH = `<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><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\"/></svg>`;\nconst SVG_SPINNER = `<svg width=\"SIZE\" height=\"SIZE\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" class=\"kb-spinner\"><path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/></svg>`;\n\nfunction spinner(size = 18) {\n return SVG_SPINNER.replace(/SIZE/g, String(size));\n}\n\ninterface WidgetState {\n messages: Message[];\n input: string;\n isLoading: boolean;\n isThinking: boolean;\n mode: InferenceMode;\n loadProgress: number;\n error: string | null;\n isOpen: boolean;\n}\n\nclass KanhaBotWidget {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private engine: any = null;\n private props: KanhaBotProps;\n private state: WidgetState;\n private root: ShadowRoot;\n private panelEl: HTMLElement | null = null;\n private messagesEl: HTMLElement | null = null;\n private textareaEl: HTMLTextAreaElement | null = null;\n private unmounted = false;\n\n constructor(container: HTMLElement, props: KanhaBotProps) {\n this.props = {\n botName: \"AI Assistant\",\n welcomeMessage: \"Ask me anything!\",\n suggestions: [],\n theme: {},\n ...props,\n };\n this.state = {\n messages: [],\n input: \"\",\n isLoading: false,\n isThinking: false,\n mode: \"detecting\",\n loadProgress: 0,\n error: null,\n isOpen: false,\n };\n\n this.root = container.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = CSS;\n this.root.appendChild(style);\n\n this.render();\n this.initEngine();\n }\n\n private get primary(): string {\n return this.props.theme?.primaryColor ?? \"#0d9488\";\n }\n\n private get position(): \"bottom-right\" | \"bottom-left\" {\n return this.props.theme?.position ?? \"bottom-right\";\n }\n\n private async initEngine() {\n const hasWebGPU = await checkWebGPU();\n if (!hasWebGPU) {\n this.setState({ mode: \"error\", error: \"WebGPU is not supported in this browser. Try Chrome 113+ or Edge 113+.\" });\n return;\n }\n\n this.setState({ mode: \"loading\" });\n\n try {\n const webllm = await import(\"@mlc-ai/web-llm\");\n const modelId = \"kanha-custom-model\";\n const modelLib = resolveModelLib(this.props.modelLib, this.props.modelSize);\n const modelUrl = toWebLLMModelUrl(this.props.modelUrl);\n\n this.engine = await webllm.CreateMLCEngine(modelId, {\n appConfig: {\n model_list: [{\n model: modelUrl,\n model_id: modelId,\n model_lib: modelLib,\n overrides: { context_window_size: this.props.contextWindowSize ?? 4096 },\n }],\n },\n initProgressCallback: (report: { progress: number }) => {\n if (!this.unmounted) this.setState({ loadProgress: Math.round(report.progress * 100) });\n },\n });\n\n if (!this.unmounted) this.setState({ mode: \"ready\" });\n } catch (err) {\n if (!this.unmounted) {\n this.setState({\n mode: \"error\",\n error: err instanceof Error ? err.message : \"Failed to load AI model.\",\n });\n }\n }\n }\n\n private setState(partial: Partial<WidgetState>) {\n Object.assign(this.state, partial);\n this.render();\n }\n\n private async handleSend() {\n const text = this.state.input.trim();\n if (!text || this.state.mode !== \"ready\" || this.state.isLoading || !this.engine) return;\n\n const userMsg: Message = { role: \"user\", content: text };\n const allMessages = [...this.state.messages, userMsg];\n this.setState({ messages: allMessages, input: \"\", isLoading: true, isThinking: true, error: null });\n\n try {\n const systemMessages: Message[] = this.props.systemPrompt\n ? [{ role: \"system\", content: this.props.systemPrompt }]\n : [];\n\n const completion = await this.engine.chat.completions.create({\n messages: [...systemMessages, ...allMessages],\n temperature: this.props.temperature ?? 0.7,\n max_tokens: this.props.maxTokens ?? 1024,\n stream: true,\n });\n\n let fullText = \"\";\n for await (const chunk of completion) {\n const delta = chunk.choices[0]?.delta?.content || \"\";\n fullText += delta;\n const cleaned = stripThinkTokens(fullText);\n if (!cleaned) {\n this.setState({ isThinking: true });\n } else {\n const msgs = [...allMessages];\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 this.setState({ messages: msgs, isThinking: false });\n }\n }\n } catch {\n this.setState({\n error: \"Failed to generate response. Please try again.\",\n messages: [...allMessages, { role: \"assistant\", content: \"Sorry, I encountered an error. Please try again.\" }],\n });\n } finally {\n this.setState({ isLoading: false, isThinking: false });\n }\n }\n\n private render() {\n const { messages, isLoading, isThinking, mode, loadProgress, error, isOpen } = this.state;\n const isReady = mode === \"ready\";\n\n // Clear non-style children\n const style = this.root.querySelector(\"style\");\n this.root.innerHTML = \"\";\n if (style) this.root.appendChild(style);\n\n // Set CSS variable for primary color\n const wrapper = document.createElement(\"div\");\n wrapper.style.setProperty(\"--kb-primary\", this.primary);\n this.root.appendChild(wrapper);\n\n // FAB\n const fab = document.createElement(\"button\");\n fab.className = \"kb-fab\";\n fab.style.background = this.primary;\n fab.style[this.position === \"bottom-right\" ? \"right\" : \"left\"] = \"24px\";\n fab.innerHTML = isOpen ? SVG_CLOSE : SVG_CHAT;\n fab.setAttribute(\"aria-label\", \"Toggle chat\");\n fab.onclick = () => this.setState({ isOpen: !isOpen });\n wrapper.appendChild(fab);\n\n if (!isOpen) return;\n\n // Panel\n const panel = document.createElement(\"div\");\n panel.className = \"kb-panel\";\n panel.style[this.position === \"bottom-right\" ? \"right\" : \"left\"] = \"24px\";\n wrapper.appendChild(panel);\n this.panelEl = panel;\n\n // Header\n const header = document.createElement(\"div\");\n header.className = \"kb-header\";\n header.style.background = this.primary;\n header.innerHTML = `\n <div>\n <p class=\"kb-header-title\">${esc(this.props.botName!)}</p>\n <p class=\"kb-header-sub\">${\n isReady ? esc(this.props.welcomeMessage!)\n : mode === \"loading\" ? `Loading AI model (${loadProgress}%)`\n : mode === \"error\" ? \"Failed to load\"\n : \"Detecting capabilities...\"\n }</p>\n ${mode === \"loading\" ? `<div class=\"kb-progress\"><div class=\"kb-progress-fill\" style=\"width:${loadProgress}%\"></div></div>` : \"\"}\n </div>\n <div style=\"display:flex;gap:4px\">\n ${messages.length > 0 ? `<button class=\"kb-icon-btn\" data-action=\"clear\" aria-label=\"Clear\">${SVG_TRASH}</button>` : \"\"}\n <button class=\"kb-icon-btn\" data-action=\"close\" aria-label=\"Close\">${SVG_CLOSE}</button>\n </div>`;\n header.querySelector(\"[data-action=clear]\")?.addEventListener(\"click\", () => this.setState({ messages: [], error: null }));\n header.querySelector(\"[data-action=close]\")?.addEventListener(\"click\", () => this.setState({ isOpen: false }));\n panel.appendChild(header);\n\n // Error\n if (error) {\n const errEl = document.createElement(\"div\");\n errEl.className = \"kb-error\";\n errEl.textContent = error;\n panel.appendChild(errEl);\n }\n\n // Messages\n const msgsContainer = document.createElement(\"div\");\n msgsContainer.className = \"kb-messages\";\n panel.appendChild(msgsContainer);\n this.messagesEl = msgsContainer;\n\n if (messages.length === 0) {\n const empty = document.createElement(\"div\");\n empty.className = \"kb-empty\";\n if (isReady) {\n empty.innerHTML = `${SVG_CHAT}<p style=\"margin-top:12px;font-weight:500;color:#374151\">${esc(this.props.welcomeMessage!)}</p>`;\n if (this.props.suggestions && this.props.suggestions.length > 0) {\n const sugDiv = document.createElement(\"div\");\n sugDiv.className = \"kb-suggestions\";\n for (const text of this.props.suggestions) {\n const btn = document.createElement(\"button\");\n btn.className = \"kb-suggestion\";\n btn.textContent = text;\n btn.onclick = () => {\n this.setState({ input: text });\n setTimeout(() => this.handleSend(), 0);\n };\n sugDiv.appendChild(btn);\n }\n empty.appendChild(sugDiv);\n }\n } else if (mode === \"loading\") {\n empty.innerHTML = `${spinner(32)}<p style=\"margin-top:8px\">Loading AI model (${loadProgress}%)</p><p style=\"font-size:12px;margin-top:4px\">First load takes about a minute</p>`;\n } else if (mode === \"error\") {\n empty.innerHTML = `<p>${esc(error ?? \"An error occurred\")}</p>`;\n } else {\n empty.innerHTML = `${spinner(32)}<p style=\"margin-top:8px\">Detecting browser capabilities...</p>`;\n }\n msgsContainer.appendChild(empty);\n } else {\n for (const msg of messages) {\n const row = document.createElement(\"div\");\n row.className = `kb-msg kb-msg-${msg.role}`;\n const bubble = document.createElement(\"div\");\n bubble.className = `kb-bubble kb-bubble-${msg.role}`;\n if (msg.role === \"user\") {\n bubble.style.background = this.primary;\n bubble.innerHTML = `<span style=\"white-space:pre-wrap\">${esc(msg.content)}</span>`;\n } else {\n // Simple markdown: paragraphs only (no heavy dep for CDN build)\n bubble.innerHTML = msg.content\n .split(\"\\n\\n\")\n .map((p) => `<p>${esc(p).replace(/\\n/g, \"<br>\")}</p>`)\n .join(\"\");\n }\n row.appendChild(bubble);\n msgsContainer.appendChild(row);\n }\n // Thinking/loading indicator\n if (isLoading && (isThinking || messages[messages.length - 1]?.role !== \"assistant\")) {\n const row = document.createElement(\"div\");\n row.className = \"kb-msg kb-msg-assistant\";\n const bubble = document.createElement(\"div\");\n bubble.className = \"kb-bubble kb-bubble-assistant\";\n bubble.innerHTML = isThinking\n ? `<span class=\"kb-thinking\"><span class=\"kb-dot\"></span><span class=\"kb-dot\"></span><span class=\"kb-dot\"></span><span class=\"kb-thinking-label\">Thinking</span></span>`\n : spinner(16);\n row.appendChild(bubble);\n msgsContainer.appendChild(row);\n }\n msgsContainer.scrollTop = msgsContainer.scrollHeight;\n }\n\n // Input bar\n const inputBar = document.createElement(\"div\");\n inputBar.className = \"kb-input-bar\";\n panel.appendChild(inputBar);\n\n const textarea = document.createElement(\"textarea\");\n textarea.className = \"kb-textarea\";\n textarea.rows = 1;\n textarea.placeholder = isReady ? \"Type your message...\" : \"Waiting for model...\";\n textarea.disabled = !isReady || isLoading;\n textarea.value = this.state.input;\n textarea.oninput = () => {\n this.state.input = textarea.value;\n textarea.style.height = \"auto\";\n textarea.style.height = Math.min(textarea.scrollHeight, 120) + \"px\";\n };\n textarea.onkeydown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n this.handleSend();\n }\n };\n inputBar.appendChild(textarea);\n this.textareaEl = textarea;\n\n const sendBtn = document.createElement(\"button\");\n sendBtn.className = \"kb-send\";\n sendBtn.style.background = this.primary;\n sendBtn.disabled = !isReady || isLoading || !this.state.input.trim();\n sendBtn.innerHTML = isLoading ? spinner(18) : SVG_SEND;\n sendBtn.setAttribute(\"aria-label\", \"Send\");\n sendBtn.onclick = () => this.handleSend();\n inputBar.appendChild(sendBtn);\n\n // Re-focus textarea if panel is open\n if (isReady && !isLoading) {\n requestAnimationFrame(() => textarea.focus());\n }\n }\n\n destroy() {\n this.unmounted = true;\n this.root.innerHTML = \"\";\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Mount a Kanha chatbot widget onto a DOM element.\n *\n * @param target - CSS selector string or HTMLElement\n * @param props - Bot configuration\n * @returns Object with `destroy()` method to unmount\n */\nexport function mount(\n target: string | HTMLElement,\n props: KanhaBotProps,\n): { destroy: () => void } {\n const el = typeof target === \"string\" ? document.querySelector<HTMLElement>(target) : target;\n if (!el) throw new Error(`Kanha: element \"${target}\" not found`);\n const widget = new KanhaBotWidget(el, props);\n return { destroy: () => widget.destroy() };\n}\n\n// ---------------------------------------------------------------------------\n// Web Component: <kanha-bot>\n// ---------------------------------------------------------------------------\n\nclass KanhaBotElement extends HTMLElement {\n private widget: KanhaBotWidget | null = null;\n\n connectedCallback() {\n const props: KanhaBotProps = {\n modelUrl: this.getAttribute(\"model-url\") ?? \"\",\n modelLib: this.getAttribute(\"model-lib\") ?? undefined,\n modelSize: (this.getAttribute(\"model-size\") as KanhaBotProps[\"modelSize\"]) ?? undefined,\n systemPrompt: this.getAttribute(\"system-prompt\") ?? undefined,\n temperature: this.hasAttribute(\"temperature\") ? Number(this.getAttribute(\"temperature\")) : undefined,\n maxTokens: this.hasAttribute(\"max-tokens\") ? Number(this.getAttribute(\"max-tokens\")) : undefined,\n botName: this.getAttribute(\"bot-name\") ?? undefined,\n welcomeMessage: this.getAttribute(\"welcome-message\") ?? undefined,\n suggestions: this.hasAttribute(\"suggestions\")\n ? JSON.parse(this.getAttribute(\"suggestions\")!)\n : undefined,\n theme: {\n primaryColor: this.getAttribute(\"primary-color\") ?? undefined,\n position: (this.getAttribute(\"position\") as KanhaBotTheme[\"position\"]) ?? undefined,\n },\n };\n this.widget = new KanhaBotWidget(this, props);\n }\n\n disconnectedCallback() {\n this.widget?.destroy();\n }\n}\n\nif (typeof customElements !== \"undefined\" && !customElements.get(\"kanha-bot\")) {\n customElements.define(\"kanha-bot\", KanhaBotElement);\n}\n\nexport type { KanhaBotProps, KanhaBotTheme, Message, InferenceMode };\n"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "kanha-ai",
3
+ "version": "0.1.0",
4
+ "description": "Drop-in AI chatbot widget powered by on-device WebGPU inference",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./widget": {
16
+ "types": "./dist/widget.d.ts",
17
+ "import": "./dist/widget.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch"
26
+ },
27
+ "peerDependencies": {
28
+ "react": ">=18.0.0",
29
+ "react-dom": ">=18.0.0"
30
+ },
31
+ "dependencies": {
32
+ "@mlc-ai/web-llm": "^0.2.81",
33
+ "react-markdown": "^9.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/react": "^19.0.0",
37
+ "@types/react-dom": "^19.0.0",
38
+ "tsup": "^8.0.0",
39
+ "typescript": "^5.5.0"
40
+ },
41
+ "keywords": [
42
+ "ai",
43
+ "chatbot",
44
+ "webgpu",
45
+ "on-device",
46
+ "web-llm",
47
+ "react"
48
+ ],
49
+ "license": "MIT",
50
+ "repository": {
51
+ "type": "git",
52
+ "url": "https://github.com/kanha-ai/kanha"
53
+ }
54
+ }