@aigentyc/chat-sdk 0.5.3 → 0.5.5

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.
Files changed (39) hide show
  1. package/context7.json +1 -1
  2. package/dist/{SlotsContext-B_087V7B.d.ts → SlotsContext-hUp2jze9.d.ts} +8 -0
  3. package/dist/{SlotsContext-DAQiASVu.d.cts → SlotsContext-p_bTEjGT.d.cts} +8 -0
  4. package/dist/ai-elements.cjs +29 -29
  5. package/dist/ai-elements.js +1 -1
  6. package/dist/{chunk-B277MAUK.cjs → chunk-7LJMBYHC.cjs} +5 -11
  7. package/dist/chunk-7LJMBYHC.cjs.map +1 -0
  8. package/dist/{chunk-LVH5ZIYA.cjs → chunk-7MHR4BSJ.cjs} +35 -35
  9. package/dist/{chunk-LVH5ZIYA.cjs.map → chunk-7MHR4BSJ.cjs.map} +1 -1
  10. package/dist/{chunk-MQJ6MGTC.js → chunk-7TMQBROA.js} +5 -5
  11. package/dist/{chunk-MQJ6MGTC.js.map → chunk-7TMQBROA.js.map} +1 -1
  12. package/dist/{chunk-JEK2V5I3.cjs → chunk-AQTN4QLR.cjs} +6 -6
  13. package/dist/{chunk-JEK2V5I3.cjs.map → chunk-AQTN4QLR.cjs.map} +1 -1
  14. package/dist/{chunk-JAEXKKSE.js → chunk-G63CLUHC.js} +21 -2
  15. package/dist/chunk-G63CLUHC.js.map +1 -0
  16. package/dist/{chunk-UXVOUC2A.cjs → chunk-JJRLHXHZ.cjs} +21 -2
  17. package/dist/chunk-JJRLHXHZ.cjs.map +1 -0
  18. package/dist/{chunk-O5TPHZRP.js → chunk-TXX2W7ZR.js} +5 -11
  19. package/dist/chunk-TXX2W7ZR.js.map +1 -0
  20. package/dist/{chunk-CW6LCVNC.js → chunk-ZPOCKCBF.js} +3 -3
  21. package/dist/{chunk-CW6LCVNC.js.map → chunk-ZPOCKCBF.js.map} +1 -1
  22. package/dist/components.cjs +16 -16
  23. package/dist/components.js +5 -5
  24. package/dist/hooks.cjs +4 -4
  25. package/dist/hooks.d.cts +1 -1
  26. package/dist/hooks.d.ts +1 -1
  27. package/dist/hooks.js +1 -1
  28. package/dist/index.cjs +23 -23
  29. package/dist/index.d.cts +1 -1
  30. package/dist/index.d.ts +1 -1
  31. package/dist/index.js +6 -6
  32. package/dist/llms-full.txt +2 -2
  33. package/dist/tools.cjs +5 -5
  34. package/dist/tools.js +2 -2
  35. package/package.json +1 -1
  36. package/dist/chunk-B277MAUK.cjs.map +0 -1
  37. package/dist/chunk-JAEXKKSE.js.map +0 -1
  38. package/dist/chunk-O5TPHZRP.js.map +0 -1
  39. package/dist/chunk-UXVOUC2A.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ai-elements/conversation.tsx","../src/core/api/kb-client.ts","../src/ai-elements/message-feedback.tsx","../src/ui/button-group.tsx","../src/ai-elements/message.tsx","../src/ai-elements/loader.tsx","../src/ai-elements/sources.tsx"],"names":["jsx","jsxs","useState","useEffect","Fragment"],"mappings":"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","file":"chunk-TXX2W7ZR.js","sourcesContent":["\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../core/utils\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback, useEffect } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\n/**\n * Marks the turn the visitor sent last. {@link anchorToLatestTurn} stops the\n * view there instead of at the bottom of whatever came back.\n */\nexport const LATEST_TURN_ATTR = \"data-ac-latest-turn\";\n\n/** Breathing room kept above the anchored question. */\nconst LATEST_TURN_GAP_PX = 16;\n\n/** Keys that scroll a focused scroll container. */\nconst SCROLL_KEYS = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"PageUp\",\n \"PageDown\",\n \"Home\",\n \"End\",\n \" \",\n]);\n\ntype TargetScrollTop = NonNullable<ConversationProps[\"targetScrollTop\"]>;\n\n/**\n * Where \"the bottom\" is for a conversation: never further down than the point\n * where the latest question reaches the top of the view.\n *\n * ## Why not simply stick to the bottom\n *\n * `StickToBottom` follows the end of the content, which is right while an\n * answer is shorter than the view and wrong the moment it is taller. A reply\n * that carries a product grid can run to thousands of pixels; following its\n * end lands the visitor on the last row of cards with the written answer\n * scrolled far out of sight above. Nothing on screen changes while the text\n * streams in up there, so a turn that worked reads as a chat that stopped\n * answering — which is how it was reported from the field.\n *\n * Capping the target instead gives the reading order people expect: the\n * question pinned at the top, the answer growing downward from it.\n *\n * ## Why it is safe to hand to the library\n *\n * `use-stick-to-bottom` clamps the result to `min(this, bottom)`, so an answer\n * that fits on screen behaves exactly as before. It also treats this capped\n * position as \"at the bottom\" — so the lock holds while the answer grows, and a\n * visitor who scrolls away still escapes it as usual.\n *\n * Measured from the live layout on every call rather than cached: the anchor\n * moves whenever anything above it changes size (an image loading, an older\n * result folding away), and the library already memoises per animation frame.\n */\nexport const anchorToLatestTurn: TargetScrollTop = (\n bottom,\n { scrollElement, contentElement }\n) => {\n const anchorTop = latestTurnTop(scrollElement, contentElement);\n if (anchorTop === null) return bottom;\n return Math.min(bottom, Math.max(0, anchorTop - LATEST_TURN_GAP_PX));\n};\n\n/** The latest turn's offset in the scroll container's own coordinates. */\nfunction latestTurnTop(\n scrollElement: HTMLElement,\n contentElement: HTMLElement\n): number | null {\n const anchor = contentElement.querySelector<HTMLElement>(\n `[${LATEST_TURN_ATTR}]`\n );\n if (!anchor) return null;\n return (\n anchor.getBoundingClientRect().top -\n scrollElement.getBoundingClientRect().top +\n scrollElement.scrollTop\n );\n}\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn(\"relative flex-1 overflow-y-hidden\", className)}\n initial=\"smooth\"\n resize=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\n/**\n * Bring the view to a turn the visitor just sent. Render inside a\n * {@link Conversation}; `turnKey` is the id of that turn.\n *\n * ## Why the anchor alone is not enough\n *\n * `use-stick-to-bottom` follows new content only while it believes the view is\n * locked to the end, and it drops that lock on any upward scroll it did not\n * make itself — a visitor reading back, but also the browser keeping content\n * steady when something above the view shrinks, as an older result card does\n * when it folds away. Once released it stays released: content growth is\n * handled with the current position preserved, so every later answer streamed\n * in below the fold while the view sat still, and the conversation read as one\n * that had stopped answering.\n *\n * Sending a message is the one moment the visitor has plainly asked to follow\n * along, so this re-engages the lock then. The scroll target is capped by\n * {@link anchorToLatestTurn}, so \"re-engage\" lands on the new question rather\n * than on the end of a long answer, and the library only ever scrolls\n * downward, so it never drags the view back up over something being read.\n *\n * Deferred a frame so the new turn has been laid out when the target is\n * measured.\n */\nexport const FollowLatestTurn = ({ turnKey }: { turnKey?: string }) => {\n const { scrollToBottom, scrollRef, contentRef, state } =\n useStickToBottomContext();\n\n useEffect(() => {\n if (!turnKey) return;\n const frame = requestAnimationFrame(() => {\n void scrollToBottom();\n });\n return () => cancelAnimationFrame(frame);\n }, [turnKey, scrollToBottom]);\n\n // Keep the view on its target through every change of layout.\n //\n // The library follows growth downward and only downward, and it moves only\n // while it believes it is locked. Neither holds up in practice:\n //\n // - an older result folding away (the Teldor widget collapses the previous\n // product grid when a new one appears) lifts the question and everything\n // after it by the height removed. Measured: the question ~500px above the\n // view, the start of its answer out of sight, and nothing brought it back;\n // - a narrower or wider panel reflows every message above the question, and\n // the browser's own scroll anchoring corrects for that some of the time.\n // Adding a correction of our own on top double-counted it — measured at\n // 115px and 58px past the question after switching widths.\n //\n // So on every resize of the content, the view is simply put where it belongs:\n // `calculatedTargetScrollTop`, which is the latest question at the top (or\n // the end, for an answer short enough to fit). Setting an absolute position\n // cannot double-count, and it moves up as readily as down.\n //\n // Written through `state.scrollTop`, which the library records as its own\n // move; a plain `scrollTop` write would read as the visitor scrolling up and\n // release the lock that keeps the answer followed.\n //\n // Stands down for the rest of the turn the moment the visitor scrolls or\n // clicks inside the conversation. Someone reading back, reading ahead or\n // working a result card is steering, and snapping them to the question would\n // take the page out from under them; from then on the browser's own anchoring\n // and their hand decide.\n useEffect(() => {\n const scroll = scrollRef.current;\n const content = contentRef.current;\n if (!turnKey || !scroll || !content) return;\n let steering = false;\n const takeOver = () => {\n steering = true;\n };\n const onKey = (event: KeyboardEvent) => {\n if (SCROLL_KEYS.has(event.key)) steering = true;\n };\n const observer = new ResizeObserver(() => {\n if (steering) return;\n const target = state.calculatedTargetScrollTop;\n if (Math.abs(state.scrollTop - target) > 1) state.scrollTop = target;\n });\n observer.observe(content);\n scroll.addEventListener(\"wheel\", takeOver, { passive: true });\n scroll.addEventListener(\"touchmove\", takeOver, { passive: true });\n scroll.addEventListener(\"pointerdown\", takeOver, { passive: true });\n scroll.addEventListener(\"keydown\", onKey);\n return () => {\n observer.disconnect();\n scroll.removeEventListener(\"wheel\", takeOver);\n scroll.removeEventListener(\"touchmove\", takeOver);\n scroll.removeEventListener(\"pointerdown\", takeOver);\n scroll.removeEventListener(\"keydown\", onKey);\n };\n }, [turnKey, scrollRef, contentRef, state]);\n\n return null;\n};\n\nexport type ConversationContentProps = ComponentProps<\n typeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n className,\n ...props\n}: ConversationContentProps) => (\n <StickToBottom.Content\n className={cn(\"flex flex-col gap-8\", className)}\n {...props}\n />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<\"div\"> & {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = \"No messages yet\",\n description = \"Start a conversation to see messages here\",\n icon,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn(\n \"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n <div className=\"space-y-1\">\n <h3 className=\"font-medium text-sm\">{title}</h3>\n {description && (\n <p className=\"text-muted-foreground text-sm\">{description}</p>\n )}\n </div>\n </>\n )}\n </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n className,\n ...props\n}: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn(\n \"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full\",\n className\n )}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n","\"use client\";\n\n/**\n * Knowledge Base API Client\n * Communicates with central system's KB endpoints.\n */\n\nexport interface KBSearchOptions {\n\ttopK?: number;\n\tthreshold?: number;\n\tsectorId?: string;\n}\n\nexport interface KBSearchResult {\n\tid: number;\n\tcontent: string;\n\tdocumentName: string | null;\n\tsourceUrl: string | null;\n\tsimilarity: number;\n\tpageTitle?: string;\n\tsectionType?: string;\n}\n\nexport interface KBSearchResponse {\n\tsuccess: boolean;\n\tresults: KBSearchResult[];\n\tmetadata: {\n\t\tquery: string;\n\t\ttotalResults: number;\n\t\tgeneratedQueries?: string[];\n\t};\n}\n\nfunction getDefaultEndpoint(): string {\n\ttry {\n\t\t// Vite/ESM environments\n\t\tconst env = (import.meta as unknown as { env?: Record<string, string> }).env;\n\t\tif (env?.VITE_API_ENDPOINT) return env.VITE_API_ENDPOINT;\n\t} catch {\n\t\t// Ignore — not a Vite/ESM env.\n\t}\n\treturn \"http://localhost:3000\";\n}\n\n/**\n * Search the knowledge base via central API.\n */\nexport async function searchKnowledgeBase(\n\tprojectId: string,\n\tquery: string,\n\toptions?: KBSearchOptions,\n\tapiEndpoint?: string,\n): Promise<KBSearchResponse> {\n\tconst endpoint = apiEndpoint || getDefaultEndpoint();\n\n\tconst response = await fetch(`${endpoint}/api/kb/search`, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\tcredentials: \"include\",\n\t\tbody: JSON.stringify({\n\t\t\tprojectId,\n\t\t\tquery,\n\t\t\ttopK: options?.topK || 5,\n\t\t\tthreshold: options?.threshold || 0.3,\n\t\t\tsectorId: options?.sectorId,\n\t\t}),\n\t});\n\n\tif (!response.ok) {\n\t\tconst error = await response\n\t\t\t.json()\n\t\t\t.catch(() => ({ error: response.statusText }));\n\t\tthrow new Error(\n\t\t\t`KB search failed: ${error.error || response.statusText}`,\n\t\t);\n\t}\n\n\treturn await response.json();\n}\n\nexport interface CustomTool {\n\tid: string;\n\tname: string;\n\tdisplayName: string;\n\tdescription: string;\n\tinputSchema: unknown;\n\ttoolType: string;\n\tisActive: boolean;\n}\n\n/**\n * Get the list of available custom tools.\n */\nexport async function getCustomTools(\n\tprojectId: string,\n\tapiEndpoint?: string,\n): Promise<CustomTool[]> {\n\tconst endpoint = apiEndpoint || getDefaultEndpoint();\n\n\tconst response = await fetch(\n\t\t`${endpoint}/api/kb/tools?projectId=${projectId}`,\n\t\t{ method: \"GET\", credentials: \"include\" },\n\t);\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to get tools: ${response.statusText}`);\n\t}\n\n\tconst data = await response.json();\n\treturn data.tools || [];\n}\n\n/**\n * Execute a custom tool.\n */\nexport async function executeCustomTool(\n\tprojectId: string,\n\ttoolName: string,\n\tinput: unknown,\n\tapiEndpoint?: string,\n): Promise<unknown> {\n\tconst endpoint = apiEndpoint || getDefaultEndpoint();\n\n\tconst response = await fetch(`${endpoint}/api/kb/tools`, {\n\t\tmethod: \"POST\",\n\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\tcredentials: \"include\",\n\t\tbody: JSON.stringify({ projectId, toolName, input }),\n\t});\n\n\tif (!response.ok) {\n\t\tthrow new Error(`Tool execution failed: ${response.statusText}`);\n\t}\n\n\tconst data = await response.json();\n\treturn data.result;\n}\n\n/**\n * Feedback request payload.\n */\nexport interface FeedbackRequest {\n\tprojectId: string;\n\tsessionId?: string;\n\tmessageId?: string;\n\tisPositive: boolean;\n\tissueType?:\n\t\t| \"wrong_answer\"\n\t\t| \"partial_answer\"\n\t\t| \"hallucination\"\n\t\t| \"inappropriate_tone\";\n\tfeedbackText?: string;\n}\n\n/**\n * Submit feedback for a chat response.\n */\nexport async function submitFeedback(\n\trequest: FeedbackRequest,\n\tapiKey?: string,\n\tapiEndpoint?: string,\n): Promise<{ success: boolean; error?: string }> {\n\tconst endpoint = apiEndpoint || getDefaultEndpoint();\n\n\tconst headers: Record<string, string> = {\n\t\t\"Content-Type\": \"application/json\",\n\t};\n\tif (apiKey) {\n\t\theaders[\"Authorization\"] = `Bearer ${apiKey}`;\n\t}\n\n\ttry {\n\t\tconst response = await fetch(`${endpoint}/api/kb/feedback`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tcredentials: \"include\",\n\t\t\tbody: JSON.stringify(request),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tconst error = await response\n\t\t\t\t.json()\n\t\t\t\t.catch(() => ({ error: response.statusText }));\n\t\t\treturn { success: false, error: error.error || response.statusText };\n\t\t}\n\n\t\treturn { success: true };\n\t} catch (error) {\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\terror: error instanceof Error ? error.message : \"Unknown error\",\n\t\t};\n\t}\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { Check, Copy, X } from \"lucide-react\";\nimport { Textarea } from \"../ui/textarea\";\nimport { submitFeedback, type FeedbackRequest } from \"../core/api/kb-client\";\nimport type { TrackInteractionParams } from \"../core/analytics/interaction-tracker\";\nimport { useI18n } from \"../hooks/use-i18n\";\nimport { cn } from \"../core/utils\";\n\n// Custom icons\nconst ThumbsUpIcon = ({ className }: { className?: string }) => (\n\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className={className}>\n\t\t<path\n\t\t\td=\"M7 11V19C7 19.2652 6.89464 19.5196 6.70711 19.7071C6.51957 19.8946 6.26522 20 6 20H4C3.73478 20 3.48043 19.8946 3.29289 19.7071C3.10536 19.5196 3 19.2652 3 19V12C3 11.7348 3.10536 11.4804 3.29289 11.2929C3.48043 11.1054 3.73478 11 4 11H7ZM7 11C8.06087 11 9.07828 10.5786 9.82843 9.82843C10.5786 9.07828 11 8.06087 11 7V6C11 5.46957 11.2107 4.96086 11.5858 4.58579C11.9609 4.21071 12.4696 4 13 4C13.5304 4 14.0391 4.21071 14.4142 4.58579C14.7893 4.96086 15 5.46957 15 6V11H18C18.5304 11 19.0391 11.2107 19.4142 11.5858C19.7893 11.9609 20 12.4696 20 13L19 18C18.8562 18.6135 18.5834 19.1402 18.2227 19.501C17.8619 19.8617 17.4328 20.0368 17 20H10C9.20435 20 8.44129 19.6839 7.87868 19.1213C7.31607 18.5587 7 17.7956 7 17\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"1.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t/>\n\t</svg>\n);\n\nconst ThumbsDownIcon = ({ className }: { className?: string }) => (\n\t<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" className={className}>\n\t\t<path\n\t\t\td=\"M7 13V4.99999C7 4.73478 6.89464 4.48042 6.70711 4.29289C6.51957 4.10535 6.26522 3.99999 6 3.99999H4C3.73478 3.99999 3.48043 4.10535 3.29289 4.29289C3.10536 4.48042 3 4.73478 3 4.99999V12C3 12.2652 3.10536 12.5196 3.29289 12.7071C3.48043 12.8946 3.73478 13 4 13H7ZM7 13C8.06087 13 9.07828 13.4214 9.82843 14.1716C10.5786 14.9217 11 15.9391 11 17V18C11 18.5304 11.2107 19.0391 11.5858 19.4142C11.9609 19.7893 12.4696 20 13 20C13.5304 20 14.0391 19.7893 14.4142 19.4142C14.7893 19.0391 15 18.5304 15 18V13H18C18.5304 13 19.0391 12.7893 19.4142 12.4142C19.7893 12.0391 20 11.5304 20 11L19 5.99999C18.8562 5.38652 18.5834 4.85975 18.2227 4.49903C17.8619 4.13831 17.4328 3.96317 17 3.99999H10C9.20435 3.99999 8.44129 4.31606 7.87868 4.87867C7.31607 5.44128 7 6.20434 7 6.99999\"\n\t\t\tstroke=\"currentColor\"\n\t\t\tstrokeWidth=\"1.5\"\n\t\t\tstrokeLinecap=\"round\"\n\t\t\tstrokeLinejoin=\"round\"\n\t\t/>\n\t</svg>\n);\n\nconst REVIEW_TYPES = [\n\t{ value: \"wrong_answer\", labelKey: \"wrongAnswer\" as const },\n\t{ value: \"partial_answer\", labelKey: \"partialAnswer\" as const },\n\t{ value: \"hallucination\", labelKey: \"hallucination\" as const },\n\t{ value: \"inappropriate_tone\", labelKey: \"inappropriateTone\" as const },\n] as const;\n\ntype ReviewType = (typeof REVIEW_TYPES)[number][\"value\"];\n\nexport interface FeedbackData {\n\tisPositive: boolean;\n\treviewType?: ReviewType;\n\treviewText?: string;\n}\n\n/**\n * Render-prop state passed to `renderActions`, letting consumers build\n * a fully custom action row while keeping all behaviour (submit, copy,\n * analytics) intact.\n */\nexport interface MessageFeedbackActionsState {\n\t/** Current feedback selection (if any) */\n\tfeedback: \"positive\" | \"negative\" | null;\n\t/** True while a feedback submit is in-flight */\n\tisSubmitting: boolean;\n\t/** True briefly after the copy button is used */\n\tcopied: boolean;\n\t/** Submit positive feedback and fire analytics */\n\tonPositive: () => void;\n\t/** Submit negative feedback — opens the review form */\n\tonNegative: () => void;\n\t/** Copy the assistant's text content to clipboard */\n\tonCopy: () => void;\n}\n\ninterface MessageFeedbackProps {\n\tmessageId: string;\n\tprojectId: string;\n\tsessionId?: string;\n\tapiKey?: string;\n\tapiEndpoint?: string;\n\ttextContent: string;\n\ttrackInteraction?: (params: TrackInteractionParams) => void;\n\t/** Optional className merged onto the root wrapper. */\n\tclassName?: string;\n\t/**\n\t * When true, strip the default Tailwind bubble styling and only render\n\t * the semantic structure. Ideal if you want to style from scratch with\n\t * your own design system.\n\t */\n\tunstyled?: boolean;\n\t/**\n\t * Per-element className overrides. Merged with defaults via `cn()` so\n\t * Tailwind utilities can override (e.g. `bg-red-500`).\n\t */\n\tclassNames?: {\n\t\troot?: string;\n\t\tactions?: string;\n\t\tthumbsUp?: string;\n\t\tthumbsDown?: string;\n\t\tcopy?: string;\n\t\treviewForm?: string;\n\t};\n\t/**\n\t * Full override of the action button row. Receives the submit handlers\n\t * + current state. Return any ReactNode. The built-in review form still\n\t * appears below when the user clicks thumbs-down (unless you handle\n\t * `onNegative` yourself and never trigger it).\n\t *\n\t * @example\n\t * ```tsx\n\t * renderActions={({ onPositive, onNegative, onCopy }) => (\n\t * <div className=\"my-custom-row\">\n\t * <MyButton onClick={onPositive}>👍</MyButton>\n\t * <MyButton onClick={onNegative}>👎</MyButton>\n\t * <MyButton onClick={onCopy}>Copy</MyButton>\n\t * </div>\n\t * )}\n\t * ```\n\t */\n\trenderActions?: (state: MessageFeedbackActionsState) => ReactNode;\n}\n\nexport function MessageFeedback({\n\tmessageId,\n\tprojectId,\n\tsessionId,\n\tapiKey,\n\tapiEndpoint,\n\ttextContent,\n\ttrackInteraction,\n\tclassName,\n\tunstyled = false,\n\tclassNames,\n\trenderActions,\n}: MessageFeedbackProps) {\n\tconst { t } = useI18n();\n\tconst [feedback, setFeedback] = useState<\"positive\" | \"negative\" | null>(null);\n\tconst [showReviewForm, setShowReviewForm] = useState(false);\n\tconst [reviewType, setReviewType] = useState<ReviewType | null>(null);\n\tconst [reviewText, setReviewText] = useState(\"\");\n\tconst [isSubmitting, setIsSubmitting] = useState(false);\n\tconst [copied, setCopied] = useState(false);\n\n\tconst submitFeedbackToApi = async (feedbackData: FeedbackData) => {\n\t\tif (!projectId || !messageId || isSubmitting) return;\n\n\t\tsetIsSubmitting(true);\n\t\ttry {\n\t\t\tconst request: FeedbackRequest = {\n\t\t\t\tprojectId,\n\t\t\t\tsessionId,\n\t\t\t\tmessageId,\n\t\t\t\tisPositive: feedbackData.isPositive,\n\t\t\t\tissueType: feedbackData.reviewType as any,\n\t\t\t\tfeedbackText: feedbackData.reviewText,\n\t\t\t};\n\t\t\tconst result = await submitFeedback(request, apiKey, apiEndpoint);\n\t\t\tif (!result.success) {\n\t\t\t\tconsole.error(\"Failed to submit feedback:\", result.error);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to submit feedback:\", error);\n\t\t} finally {\n\t\t\tsetIsSubmitting(false);\n\t\t}\n\t};\n\n\tconst handlePositiveFeedback = () => {\n\t\tif (isSubmitting) return;\n\t\tsetFeedback(\"positive\");\n\t\tsetShowReviewForm(false);\n\t\tsubmitFeedbackToApi({ isPositive: true });\n\n\t\ttrackInteraction?.({\n\t\t\ttype: \"feedback\",\n\t\t\ttarget: \"thumbs_up\",\n\t\t\tlabel: \"Positive feedback\",\n\t\t\tmessageId,\n\t\t\tmetadata: { isPositive: true },\n\t\t});\n\t};\n\n\tconst handleNegativeFeedback = () => {\n\t\tif (isSubmitting) return;\n\t\tsetFeedback(\"negative\");\n\t\tsetShowReviewForm(true);\n\t};\n\n\tconst handleSubmitReview = () => {\n\t\tif (isSubmitting) return;\n\t\tconst feedbackData: FeedbackData = {\n\t\t\tisPositive: false,\n\t\t\treviewType: reviewType ?? undefined,\n\t\t\treviewText: reviewText || undefined,\n\t\t};\n\t\tsetShowReviewForm(false);\n\t\tsubmitFeedbackToApi(feedbackData);\n\n\t\ttrackInteraction?.({\n\t\t\ttype: \"feedback\",\n\t\t\ttarget: \"thumbs_down\",\n\t\t\tlabel: \"Negative feedback\",\n\t\t\tmessageId,\n\t\t\tmetadata: { isPositive: false, reviewType, reviewText },\n\t\t});\n\t};\n\n\tconst handleCancelReview = () => {\n\t\tsetFeedback(null);\n\t\tsetShowReviewForm(false);\n\t\tsetReviewType(null);\n\t\tsetReviewText(\"\");\n\t};\n\n\tconst handleCopy = async () => {\n\t\tif (typeof window === \"undefined\" || !navigator?.clipboard?.writeText) return;\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(textContent);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\n\t\t\ttrackInteraction?.({\n\t\t\t\ttype: \"copy\",\n\t\t\t\ttarget: \"message\",\n\t\t\t\tlabel: \"Copy response\",\n\t\t\t\tmessageId,\n\t\t\t\tmetadata: { contentLength: textContent.length },\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to copy:\", error);\n\t\t}\n\t};\n\n\tconst actionsState: MessageFeedbackActionsState = {\n\t\tfeedback,\n\t\tisSubmitting,\n\t\tcopied,\n\t\tonPositive: handlePositiveFeedback,\n\t\tonNegative: handleNegativeFeedback,\n\t\tonCopy: handleCopy,\n\t};\n\n\treturn (\n\t\t<div className={cn(unstyled ? \"\" : \"mt-4\", classNames?.root, className)}>\n\t\t\t{/* Action buttons row */}\n\t\t\t{renderActions ? (\n\t\t\t\trenderActions(actionsState)\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"flex items-center gap-2\", classNames?.actions)}>\n\t\t\t\t\t{/* Thumbs Up */}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handlePositiveFeedback}\n\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tunstyled\n\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t: cn(\n\t\t\t\t\t\t\t\t\t\t\"group w-8 h-8 rounded-full flex items-center justify-center transition-all duration-300\",\n\t\t\t\t\t\t\t\t\t\tfeedback === \"positive\"\n\t\t\t\t\t\t\t\t\t\t\t? \"bg-primary/10 text-primary\"\n\t\t\t\t\t\t\t\t\t\t\t: \"bg-secondary text-muted-foreground hover:bg-primary/10 hover:text-primary\",\n\t\t\t\t\t\t\t\t\t\tisSubmitting && \"opacity-50 cursor-not-allowed\",\n\t\t\t\t\t\t\t\t ),\n\t\t\t\t\t\t\tclassNames?.thumbsUp,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle={t(\"helpful\")}\n\t\t\t\t\t\taria-label={t(\"helpful\")}\n\t\t\t\t\t\taria-pressed={feedback === \"positive\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbsUpIcon />\n\t\t\t\t\t</button>\n\n\t\t\t\t\t{/* Thumbs Down */}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleNegativeFeedback}\n\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tunstyled\n\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t: cn(\n\t\t\t\t\t\t\t\t\t\t\"group w-8 h-8 rounded-full flex items-center justify-center transition-all duration-300\",\n\t\t\t\t\t\t\t\t\t\tfeedback === \"negative\"\n\t\t\t\t\t\t\t\t\t\t\t? \"bg-red-100 text-red-500\"\n\t\t\t\t\t\t\t\t\t\t\t: \"bg-secondary text-muted-foreground hover:bg-red-50 hover:text-red-500\",\n\t\t\t\t\t\t\t\t\t\tisSubmitting && \"opacity-50 cursor-not-allowed\",\n\t\t\t\t\t\t\t\t ),\n\t\t\t\t\t\t\tclassNames?.thumbsDown,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle={t(\"notHelpful\")}\n\t\t\t\t\t\taria-label={t(\"notHelpful\")}\n\t\t\t\t\t\taria-pressed={feedback === \"negative\"}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ThumbsDownIcon />\n\t\t\t\t\t</button>\n\n\t\t\t\t\t{/* Copy Button */}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\tunstyled\n\t\t\t\t\t\t\t\t? \"\"\n\t\t\t\t\t\t\t\t: \"group w-8 h-8 rounded-full bg-secondary flex items-center justify-center text-muted-foreground hover:bg-primary/10 hover:text-primary transition-all duration-300\",\n\t\t\t\t\t\t\tclassNames?.copy,\n\t\t\t\t\t\t)}\n\t\t\t\t\t\ttitle={t(\"copyResponse\")}\n\t\t\t\t\t\taria-label={t(\"copyResponse\")}\n\t\t\t\t\t>\n\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t<Check className=\"w-4 h-4 text-green-600\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Copy className=\"w-4 h-4\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* Review Form */}\n\t\t\t{showReviewForm && (\n\t\t\t\t<div className=\"mt-4 bg-gradient-to-br from-accent to-secondary rounded-2xl border border-border overflow-hidden animate-in slide-in-from-top-2 duration-300\">\n\t\t\t\t\t<div className=\"px-5 py-4 border-b border-border flex items-center justify-between\">\n\t\t\t\t\t\t<div className=\"flex items-center gap-3\">\n\t\t\t\t\t\t\t<span className=\"w-8 h-8 rounded-xl bg-card border border-border flex items-center justify-center\">\n\t\t\t\t\t\t\t\t<ThumbsDownIcon className=\"text-red-500\" />\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"font-medium text-sm\">{t(\"whatWentWrong\")}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\tonClick={handleCancelReview}\n\t\t\t\t\t\t\tclassName=\"w-8 h-8 rounded-full bg-card border border-border flex items-center justify-center hover:border-primary transition-colors\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<X className=\"w-4 h-4\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"p-5 space-y-4\">\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-2\">\n\t\t\t\t\t\t\t{REVIEW_TYPES.map((type) => (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={type.value}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setReviewType(type.value as ReviewType)}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\"px-4 py-2 rounded-full text-xs font-medium transition-all duration-300\",\n\t\t\t\t\t\t\t\t\t\treviewType === type.value\n\t\t\t\t\t\t\t\t\t\t\t? \"bg-primary text-primary-foreground shadow-md shadow-primary/20\"\n\t\t\t\t\t\t\t\t\t\t\t: \"bg-card border border-border text-foreground hover:border-primary hover:text-primary\"\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{t(type.labelKey)}\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\tplaceholder={t(\"addDetails\")}\n\t\t\t\t\t\t\tvalue={reviewText}\n\t\t\t\t\t\t\tonChange={(e) => setReviewText(e.target.value)}\n\t\t\t\t\t\t\trows={2}\n\t\t\t\t\t\t\tclassName=\"text-sm resize-none rounded-xl border-border focus:border-primary focus:ring-primary/20\"\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tonClick={handleSubmitReview}\n\t\t\t\t\t\t\t\tdisabled={isSubmitting}\n\t\t\t\t\t\t\t\tclassName=\"group relative px-5 py-2.5 bg-primary text-primary-foreground rounded-full text-sm font-medium overflow-hidden transition-all duration-300 hover:shadow-lg hover:shadow-primary/25 disabled:opacity-50 disabled:cursor-not-allowed\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<span className=\"relative z-10\">\n\t\t\t\t\t\t\t\t\t{isSubmitting ? t(\"submitting\") : t(\"submitFeedback\")}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tclassName=\"absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity bg-primary/90\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<style>{`\n\t\t\t\t.animate-in {\n\t\t\t\t\tanimation: animateIn 0.3s ease-out;\n\t\t\t\t}\n\t\t\t\t.slide-in-from-top-2 {\n\t\t\t\t\t--tw-enter-translate-y: -0.5rem;\n\t\t\t\t}\n\t\t\t\t@keyframes animateIn {\n\t\t\t\t\tfrom {\n\t\t\t\t\t\topacity: 0;\n\t\t\t\t\t\ttransform: translateY(var(--tw-enter-translate-y, 0));\n\t\t\t\t\t}\n\t\t\t\t\tto {\n\t\t\t\t\t\topacity: 1;\n\t\t\t\t\t\ttransform: translateY(0);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t`}</style>\n\t\t</div>\n\t);\n}\n","\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../core/utils\"\nimport { Separator } from \"./separator\"\n\nconst buttonGroupVariants = cva(\n \"flex w-fit items-stretch has-[>[data-slot=button-group]]:gap-2 [&>*]:focus-visible:relative [&>*]:focus-visible:z-10 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1\",\n {\n variants: {\n orientation: {\n horizontal:\n \"[&>*:not(:first-child)]:rounded-l-none [&>*:not(:first-child)]:border-l-0 [&>*:not(:last-child)]:rounded-r-none\",\n vertical:\n \"flex-col [&>*:not(:first-child)]:rounded-t-none [&>*:not(:first-child)]:border-t-0 [&>*:not(:last-child)]:rounded-b-none\",\n },\n },\n defaultVariants: {\n orientation: \"horizontal\",\n },\n }\n)\n\nfunction ButtonGroup({\n className,\n orientation,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof buttonGroupVariants>) {\n return (\n <div\n role=\"group\"\n data-slot=\"button-group\"\n data-orientation={orientation}\n className={cn(buttonGroupVariants({ orientation }), className)}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupText({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n asChild?: boolean\n}) {\n const Comp = asChild ? Slot : \"div\"\n\n return (\n <Comp\n className={cn(\n \"bg-muted shadow-xs flex items-center gap-2 rounded-md border px-4 text-sm font-medium [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction ButtonGroupSeparator({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"button-group-separator\"\n orientation={orientation}\n className={cn(\n \"bg-input relative !m-0 self-stretch data-[orientation=vertical]:h-auto\",\n className\n )}\n {...props}\n />\n )\n}\n\nexport {\n ButtonGroup,\n ButtonGroupSeparator,\n ButtonGroupText,\n buttonGroupVariants,\n}\n","\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport {\n ButtonGroup,\n ButtonGroupText,\n} from \"../ui/button-group\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../ui/tooltip\";\nimport { cn } from \"../core/utils\";\nimport type { FileUIPart, UIMessage } from \"ai\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n PaperclipIcon,\n XIcon,\n} from \"lucide-react\";\nimport type { ComponentProps, HTMLAttributes, ReactElement } from \"react\";\nimport { createContext, memo, useContext, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Streamdown } from \"streamdown\";\n\nexport type MessageProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage[\"role\"];\n fullWidth?: boolean;\n};\n\nexport const Message = ({ className, from, fullWidth, ...props }: MessageProps) => (\n <div\n className={cn(\n \"group flex w-full flex-col gap-2\",\n fullWidth ? \"\" : from === \"assistant\" ? \"max-w-[var(--ac-assistant-max-width,95%)]\" : \"max-w-[95%]\",\n from === \"user\" ? \"is-user justify-end\" : \"is-assistant\",\n className\n )}\n {...props}\n />\n);\n\nexport type MessageContentProps = HTMLAttributes<HTMLDivElement> & {\n fullWidth?: boolean;\n};\n\nexport const MessageContent = ({\n children,\n className,\n fullWidth,\n ...props\n}: MessageContentProps) => (\n <div\n className={cn(\n \"flex min-w-0 flex-col gap-2 overflow-hidden\",\n fullWidth\n ? \"w-full\"\n : \"w-fit max-w-full\",\n \"group-[.is-user]:ml-auto group-[.is-user]:px-6 group-[.is-user]:py-4 group-[.is-user]:text-foreground group-[.is-user]:rounded-bl-[24px] group-[.is-user]:rounded-br-[24px] group-[.is-user]:rounded-tl-[4px] group-[.is-user]:rounded-tr-[24px] group-[.is-user]:bg-[var(--ac-user-bubble-bg,#f0f4f8)]\",\n \"group-[.is-assistant]:text-foreground group-[.is-assistant]:w-full\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n\nexport type MessageActionsProps = ComponentProps<\"div\">;\n\nexport const MessageActions = ({\n className,\n children,\n ...props\n}: MessageActionsProps) => (\n <div className={cn(\"flex items-center gap-1\", className)} {...props}>\n {children}\n </div>\n);\n\nexport type MessageActionProps = ComponentProps<typeof Button> & {\n tooltip?: string;\n label?: string;\n};\n\nexport const MessageAction = ({\n tooltip,\n children,\n label,\n variant = \"ghost\",\n size = \"icon-sm\",\n ...props\n}: MessageActionProps) => {\n const button = (\n <Button size={size} type=\"button\" variant={variant} {...props}>\n {children}\n <span className=\"sr-only\">{label || tooltip}</span>\n </Button>\n );\n\n if (tooltip) {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>\n <p>{tooltip}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return button;\n};\n\ntype MessageBranchContextType = {\n currentBranch: number;\n totalBranches: number;\n goToPrevious: () => void;\n goToNext: () => void;\n branches: ReactElement[];\n setBranches: (branches: ReactElement[]) => void;\n};\n\nconst MessageBranchContext = createContext<MessageBranchContextType | null>(\n null\n);\n\nconst useMessageBranch = () => {\n const context = useContext(MessageBranchContext);\n\n if (!context) {\n throw new Error(\n \"MessageBranch components must be used within MessageBranch\"\n );\n }\n\n return context;\n};\n\nexport type MessageBranchProps = HTMLAttributes<HTMLDivElement> & {\n defaultBranch?: number;\n onBranchChange?: (branchIndex: number) => void;\n};\n\nexport const MessageBranch = ({\n defaultBranch = 0,\n onBranchChange,\n className,\n ...props\n}: MessageBranchProps) => {\n const [currentBranch, setCurrentBranch] = useState(defaultBranch);\n const [branches, setBranches] = useState<ReactElement[]>([]);\n\n const handleBranchChange = (newBranch: number) => {\n setCurrentBranch(newBranch);\n onBranchChange?.(newBranch);\n };\n\n const goToPrevious = () => {\n const newBranch =\n currentBranch > 0 ? currentBranch - 1 : branches.length - 1;\n handleBranchChange(newBranch);\n };\n\n const goToNext = () => {\n const newBranch =\n currentBranch < branches.length - 1 ? currentBranch + 1 : 0;\n handleBranchChange(newBranch);\n };\n\n const contextValue: MessageBranchContextType = {\n currentBranch,\n totalBranches: branches.length,\n goToPrevious,\n goToNext,\n branches,\n setBranches,\n };\n\n return (\n <MessageBranchContext.Provider value={contextValue}>\n <div\n className={cn(\"grid w-full gap-2 [&>div]:pb-0\", className)}\n {...props}\n />\n </MessageBranchContext.Provider>\n );\n};\n\nexport type MessageBranchContentProps = HTMLAttributes<HTMLDivElement>;\n\nexport const MessageBranchContent = ({\n children,\n ...props\n}: MessageBranchContentProps) => {\n const { currentBranch, setBranches, branches } = useMessageBranch();\n const childrenArray = Array.isArray(children) ? children : [children];\n\n useEffect(() => {\n if (branches.length !== childrenArray.length) {\n setBranches(childrenArray);\n }\n }, [childrenArray, branches, setBranches]);\n\n return childrenArray.map((branch, index) => (\n <div\n className={cn(\n \"grid gap-2 overflow-hidden [&>div]:pb-0\",\n index === currentBranch ? \"block\" : \"hidden\"\n )}\n key={branch.key}\n {...props}\n >\n {branch}\n </div>\n ));\n};\n\nexport type MessageBranchSelectorProps = HTMLAttributes<HTMLDivElement> & {\n from: UIMessage[\"role\"];\n};\n\nexport const MessageBranchSelector = ({\n className,\n from,\n ...props\n}: MessageBranchSelectorProps) => {\n const { totalBranches } = useMessageBranch();\n\n if (totalBranches <= 1) {\n return null;\n }\n\n return (\n <ButtonGroup\n className=\"[&>*:not(:first-child)]:rounded-l-md [&>*:not(:last-child)]:rounded-r-md\"\n orientation=\"horizontal\"\n {...props}\n />\n );\n};\n\nexport type MessageBranchPreviousProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchPrevious = ({\n children,\n ...props\n}: MessageBranchPreviousProps) => {\n const { goToPrevious, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Previous branch\"\n disabled={totalBranches <= 1}\n onClick={goToPrevious}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronLeftIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchNextProps = ComponentProps<typeof Button>;\n\nexport const MessageBranchNext = ({\n children,\n className,\n ...props\n}: MessageBranchNextProps) => {\n const { goToNext, totalBranches } = useMessageBranch();\n\n return (\n <Button\n aria-label=\"Next branch\"\n disabled={totalBranches <= 1}\n onClick={goToNext}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n {...props}\n >\n {children ?? <ChevronRightIcon size={14} />}\n </Button>\n );\n};\n\nexport type MessageBranchPageProps = HTMLAttributes<HTMLSpanElement>;\n\nexport const MessageBranchPage = ({\n className,\n ...props\n}: MessageBranchPageProps) => {\n const { currentBranch, totalBranches } = useMessageBranch();\n\n return (\n <ButtonGroupText\n className={cn(\n \"border-none bg-transparent text-muted-foreground shadow-none\",\n className\n )}\n {...props}\n >\n {currentBranch + 1} of {totalBranches}\n </ButtonGroupText>\n );\n};\n\nexport type MessageResponseProps = ComponentProps<typeof Streamdown>;\n\n/**\n * Add UTM parameters to a URL\n */\nfunction addUtmParams(url: string): string {\n try {\n const urlObj = new URL(url);\n urlObj.searchParams.set(\"utm_source\", \"chat\");\n urlObj.searchParams.set(\"utm_medium\", \"referral\");\n return urlObj.toString();\n } catch {\n return url;\n }\n}\n\nconst CustomLink = ({ href, children, ...props }: React.AnchorHTMLAttributes<HTMLAnchorElement>) => (\n <a\n href={href ? addUtmParams(href) : href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:underline hover:opacity-80 transition-opacity font-medium\"\n {...props}\n >\n {children}\n </a>\n);\n\nconst CustomImage = ({ src, alt, ...props }: React.ImgHTMLAttributes<HTMLImageElement>) => (\n <img\n src={src}\n alt={alt || \"\"}\n loading=\"lazy\"\n className=\"rounded-xl max-w-full h-auto my-4\"\n {...props}\n />\n);\n\nconst CustomTable = ({ children, ...props }: React.TableHTMLAttributes<HTMLTableElement>) => (\n <div className=\"my-4 overflow-x-auto\">\n <table\n className=\"w-full text-sm rounded-xl border border-black/[0.08] overflow-hidden\"\n {...props}\n >\n {children}\n </table>\n </div>\n);\n\nconst CustomThead = ({ children, ...props }: React.HTMLAttributes<HTMLTableSectionElement>) => (\n <thead className=\"bg-black/[0.04]\" {...props}>\n {children}\n </thead>\n);\n\nconst CustomTh = ({ children, ...props }: React.ThHTMLAttributes<HTMLTableCellElement>) => (\n <th\n className=\"px-4 py-3 text-start text-xs font-medium uppercase tracking-wider opacity-60 border-b border-black/[0.08]\"\n {...props}\n >\n {children}\n </th>\n);\n\nconst CustomTd = ({ children, ...props }: React.TdHTMLAttributes<HTMLTableCellElement>) => (\n <td\n className=\"px-4 py-3 border-b border-black/[0.08]\"\n {...props}\n >\n {children}\n </td>\n);\n\nconst CustomTr = ({ children, ...props }: React.HTMLAttributes<HTMLTableRowElement>) => (\n <tr\n className=\"hover:bg-black/[0.02] transition-colors\"\n {...props}\n >\n {children}\n </tr>\n);\n\nexport const MessageResponse = memo(\n ({ className, ...props }: MessageResponseProps) => (\n <Streamdown\n className={cn(\n \"message-response size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0\",\n className\n )}\n components={{\n a: CustomLink,\n img: CustomImage,\n table: CustomTable,\n thead: CustomThead,\n th: CustomTh,\n td: CustomTd,\n tr: CustomTr,\n } as never}\n linkSafety={{ enabled: false }}\n {...props}\n />\n ),\n (prevProps, nextProps) => prevProps.children === nextProps.children\n);\n\nMessageResponse.displayName = \"MessageResponse\";\n\nexport type MessageAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: FileUIPart;\n className?: string;\n onRemove?: () => void;\n};\n\n/**\n * A full-size view of one attachment, laid over the chat.\n *\n * Portalled into the component's own root — `getRootNode()` returns the shadow\n * root when the chat is mounted in one — so the overlay is not clipped by the\n * message's `overflow-hidden` tile and is not stranded outside the tree that\n * carries the widget's styles. Positioning and colour are inline rather than\n * utility classes for the same reason: an embedded widget's host page has no\n * obligation to have loaded anything.\n */\nfunction MessageAttachmentLightbox({\n url,\n alt,\n onClose,\n}: {\n url: string;\n alt: string;\n onClose: () => void;\n}) {\n const [container, setContainer] = useState<Element | DocumentFragment | null>(\n null\n );\n const anchorRef = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n const root = anchorRef.current?.getRootNode();\n if (!root) return;\n const host =\n root instanceof ShadowRoot ? root : (root as Document).body ?? null;\n if (!host) return;\n const node = document.createElement(\"div\");\n // Marked so the widget's own theme variables resolve inside the overlay.\n node.setAttribute(\"data-aigentyc-chat\", \"\");\n host.appendChild(node);\n setContainer(node);\n return () => {\n node.remove();\n };\n }, []);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n const overlay = (\n <div\n aria-label={alt}\n aria-modal=\"true\"\n className=\"ac-lightbox\"\n onClick={onClose}\n role=\"dialog\"\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 2147483001,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 24,\n background: \"rgba(8, 12, 16, 0.82)\",\n pointerEvents: \"auto\",\n cursor: \"zoom-out\",\n }}\n >\n <img\n alt={alt}\n // Stops a click on the picture itself from closing what it opened.\n onClick={(e) => e.stopPropagation()}\n src={url}\n style={{\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n objectFit: \"contain\",\n borderRadius: 12,\n boxShadow: \"0 24px 64px rgba(0, 0, 0, 0.45)\",\n cursor: \"default\",\n }}\n />\n <button\n aria-label=\"Close\"\n onClick={onClose}\n style={{\n position: \"absolute\",\n top: 16,\n insetInlineEnd: 16,\n width: 36,\n height: 36,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"none\",\n borderRadius: \"50%\",\n background: \"rgba(255, 255, 255, 0.14)\",\n color: \"#fff\",\n cursor: \"pointer\",\n }}\n type=\"button\"\n >\n <XIcon size={18} />\n </button>\n </div>\n );\n\n return (\n <>\n {/* Zero-size anchor: the portal needs a node already in the tree to ask\n which root it belongs to. */}\n <span ref={anchorRef} style={{ display: \"none\" }} />\n {container ? createPortal(overlay, container) : null}\n </>\n );\n}\n\nexport function MessageAttachment({\n data,\n className,\n onRemove,\n ...props\n}: MessageAttachmentProps) {\n const [zoomed, setZoomed] = useState(false);\n const filename = data.filename || \"\";\n const mediaType =\n data.mediaType?.startsWith(\"image/\") && data.url ? \"image\" : \"file\";\n const isImage = mediaType === \"image\";\n const attachmentLabel = filename || (isImage ? \"Image\" : \"Attachment\");\n\n return (\n <div\n className={cn(\n \"group relative size-24 overflow-hidden rounded-lg\",\n className\n )}\n {...props}\n >\n {isImage ? (\n <>\n {/* The thumbnail is a crop, so it has to lead somewhere: a picture of a\n cable's printed marking is unreadable at 96px, and the transcript is\n exactly where someone goes back to read it. It opens in place rather\n than in a tab — leaving the panel to look at an image you just sent\n into it is a strange thing to be asked to do. */}\n <button\n aria-label={`View ${attachmentLabel} full size`}\n className=\"block size-full cursor-zoom-in\"\n onClick={() => setZoomed(true)}\n title=\"View full size\"\n type=\"button\"\n >\n <img\n alt={filename || \"attachment\"}\n className=\"size-full object-cover transition-transform duration-200 group-hover:scale-105\"\n height={100}\n src={data.url}\n width={100}\n />\n </button>\n {zoomed && (\n <MessageAttachmentLightbox\n alt={attachmentLabel}\n onClose={() => setZoomed(false)}\n url={data.url}\n />\n )}\n {onRemove && (\n <Button\n aria-label=\"Remove attachment\"\n className=\"absolute top-2 right-2 size-6 rounded-full bg-background/80 p-0 opacity-0 backdrop-blur-sm transition-opacity hover:bg-background group-hover:opacity-100 [&>svg]:size-3\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n )}\n </>\n ) : (\n <>\n {/* Wrapped in its own provider: `Tooltip` here is Radix's bare Root,\n and the surrounding transcript is not inside one. */}\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"flex size-full shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground\">\n <PaperclipIcon className=\"size-4\" />\n </div>\n </TooltipTrigger>\n <TooltipContent>\n <p>{attachmentLabel}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n {onRemove && (\n <Button\n aria-label=\"Remove attachment\"\n className=\"size-6 shrink-0 rounded-full p-0 opacity-0 transition-opacity hover:bg-accent group-hover:opacity-100 [&>svg]:size-3\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n )}\n </>\n )}\n </div>\n );\n}\n\nexport type MessageAttachmentsProps = ComponentProps<\"div\">;\n\nexport function MessageAttachments({\n children,\n className,\n ...props\n}: MessageAttachmentsProps) {\n // An empty array is truthy, so a message with no files would otherwise render\n // an empty flex row that still takes up the container's gap.\n const isEmpty =\n !children || (Array.isArray(children) && children.flat().filter(Boolean).length === 0);\n if (isEmpty) {\n return null;\n }\n\n return (\n <div\n className={cn(\n \"ml-auto flex w-fit flex-wrap items-start gap-2\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport type MessageToolbarProps = ComponentProps<\"div\">;\n\nexport const MessageToolbar = ({\n className,\n children,\n ...props\n}: MessageToolbarProps) => (\n <div\n className={cn(\n \"mt-4 flex w-full items-center justify-between gap-4\",\n className\n )}\n {...props}\n >\n {children}\n </div>\n);\n","\"use client\";\n\nimport { cn } from \"../core/utils\";\nimport type { HTMLAttributes } from \"react\";\n\nexport type LoaderProps = HTMLAttributes<HTMLDivElement> & {\n text?: string;\n};\n\nexport const Loader = ({ className, text = \"Thinking...\", ...props }: LoaderProps) => (\n <div\n className={cn(\n \"flex items-center gap-2 w-full py-3\",\n className\n )}\n style={{ color: \"var(--ac-loader-color, var(--ac-primary, #2f80ed))\" }}\n {...props}\n >\n {/* Circular spinner */}\n <svg\n className=\"animate-spin\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n stroke=\"#E5E5E5\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n <path\n d=\"M10 2C14.4183 2 18 5.58172 18 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n <span className=\"text-sm text-foreground\">{text}</span>\n </div>\n);\n\n// Spinner loader for other use cases\nexport type SpinnerLoaderProps = HTMLAttributes<HTMLDivElement> & {\n size?: number;\n};\n\nexport const SpinnerLoader = ({ className, size = 16, ...props }: SpinnerLoaderProps) => (\n <div\n className={cn(\n \"inline-flex animate-spin items-center justify-center\",\n className\n )}\n {...props}\n >\n <svg\n height={size}\n strokeLinejoin=\"round\"\n style={{ color: \"currentcolor\" }}\n viewBox=\"0 0 16 16\"\n width={size}\n >\n <title>Loader</title>\n <g clipPath=\"url(#clip0_2393_1490)\">\n <path d=\"M8 0V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 16V12\" opacity=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M3.29773 1.52783L5.64887 4.7639\" opacity=\"0.9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.7023 1.52783L10.3511 4.7639\" opacity=\"0.1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.7023 14.472L10.3511 11.236\" opacity=\"0.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M3.29773 14.472L5.64887 11.236\" opacity=\"0.6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M15.6085 5.52783L11.8043 6.7639\" opacity=\"0.2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M0.391602 10.472L4.19583 9.23598\" opacity=\"0.7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M15.6085 10.4722L11.8043 9.2361\" opacity=\"0.3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M0.391602 5.52783L4.19583 6.7639\" opacity=\"0.8\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0_2393_1490\">\n <rect fill=\"white\" height=\"16\" width=\"16\" />\n </clipPath>\n </defs>\n </svg>\n </div>\n);\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../core/utils\";\nimport { BookIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nexport type SourcesProps = ComponentProps<\"div\">;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n <Collapsible\n className={cn(\"not-prose mb-4 text-primary text-xs\", className)}\n {...props}\n />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n count: number;\n};\n\nexport const SourcesTrigger = ({\n className,\n count,\n children,\n ...props\n}: SourcesTriggerProps) => (\n <CollapsibleTrigger\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n >\n {children ?? (\n <>\n <p className=\"font-medium\">Used {count} sources</p>\n <ChevronDownIcon className=\"h-4 w-4\" />\n </>\n )}\n </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({\n className,\n ...props\n}: SourcesContentProps) => (\n <CollapsibleContent\n className={cn(\n \"mt-3 flex w-fit flex-col gap-2\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n />\n);\n\nexport type SourceProps = ComponentProps<\"a\">;\n\nexport const Source = ({ href, title, children, ...props }: SourceProps) => (\n <a\n className=\"flex items-center gap-2\"\n href={href}\n rel=\"noreferrer\"\n target=\"_blank\"\n {...props}\n >\n {children ?? (\n <>\n <BookIcon className=\"h-4 w-4\" />\n <span className=\"block font-medium\">{title}</span>\n </>\n )}\n </a>\n);\n"]}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { useSlots, ChatContext } from './chunk-JAEXKKSE.js';
2
+ import { useSlots, ChatContext } from './chunk-G63CLUHC.js';
3
3
  import { processImagesInHtml } from './chunk-PS3U7T37.js';
4
4
  import { Spinner } from './chunk-4QT25AXI.js';
5
5
  import { Card } from './chunk-NPJKLYLV.js';
@@ -579,5 +579,5 @@ function pickDefaultForMode(mode) {
579
579
  }
580
580
 
581
581
  export { ComponentRenderer, SearchKnowledgeBaseRenderer, ToolRenderer };
582
- //# sourceMappingURL=chunk-CW6LCVNC.js.map
583
- //# sourceMappingURL=chunk-CW6LCVNC.js.map
582
+ //# sourceMappingURL=chunk-ZPOCKCBF.js.map
583
+ //# sourceMappingURL=chunk-ZPOCKCBF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/SearchKnowledgeBaseRenderer.tsx","../src/tools/ComponentRenderer.tsx","../src/tools/useSafeChatCallbacks.ts","../src/tools/tool-registry.ts","../src/tools/ToolRenderer.tsx"],"names":["useState","jsxs","jsx","useEffect"],"mappings":";;;;;;;AAyBA,SAAS,QAAA,CAAS,IAAA,EAAc,GAAA,GAAM,GAAA,EAAK;AACzC,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,GAAA,EAAK,OAAO,IAAA;AAC/B,EAAA,OAAO,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,SAAQ,GAAI,QAAA;AACxC;AAEO,SAAS,4BAA4B,KAAA,EAA0B;AACpE,EAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,MAAA,EAAQ,YAAA,IAAgB,MAAM,MAAA,EAAQ,IAAA;AAC1D,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAE9C,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,CAAK,SAAS,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,EAAA,MAAM,UAAU,QAAA,GAAW,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAC,CAAA;AAEvD,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACb,QAAA,kBAAA,IAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,MAAA,QAAA;AAAA,0BACG,QAAA,EAAA,EAAO,SAAA,EAAU,mBAAmB,QAAA,EAAA,IAAA,CAAK,YAAA,IAAgB,QAAQ,MAAA,EAAO,CAAA;AAAA,MAAU,GAAA;AAAA,MAAI,QAAA;AAAA,MAAA,CACrF,IAAA,CAAK,YAAA,IAAgB,OAAA,CAAQ,MAAA,MAAY,IAAI,EAAA,GAAK,GAAA;AAAA,MACzD,IAAA,CAAK,kBAAkB,MAAA,GACpB,CAAA,MAAA,EAAS,KAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GACzC;AAAA,KAAA,EACN,CAAA,EACF,CAAA;AAAA,oBAEA,GAAA,CAAC,QAAG,SAAA,EAAU,qBAAA,EACX,kBAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACrB,MAAA,MAAM,OAAA,GAAU,QAAA,CAAA,CAAU,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,IAAW,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAM,CAAA;AACnF,MAAA,MAAM,KAAA,GAAQ,EAAE,YAAA,IAAgB,CAAA,CAAE,aAAa,CAAA,OAAA,EAAU,CAAA,CAAE,IAAA,IAAQ,CAAA,GAAI,CAAC,CAAA,CAAA;AACxE,MAAA,uBACE,IAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAU,oDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yCAAA,EACb,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EAAwB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,cAC7C,OAAO,CAAA,CAAE,UAAA,KAAe,4BACvB,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4CAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,CAAA,CAAA,CAAE,UAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA;AAAA,gBAAE;AAAA,eAAA,EACnC;AAAA,aAAA,EAEJ,CAAA;AAAA,YACC,OAAA,oBACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sDACV,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,YAED,EAAE,SAAA,oBACD,GAAA;AAAA,cAAC,GAAA;AAAA,cAAA;AAAA,gBACC,MAAM,CAAA,CAAE,SAAA;AAAA,gBACR,MAAA,EAAO,QAAA;AAAA,gBACP,GAAA,EAAI,qBAAA;AAAA,gBACJ,SAAA,EAAU,wDAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA,SAAA;AAAA,QAxBG,CAAA,EAAG,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA;AAAA,OA0BnB;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAEC,OAAA,CAAQ,SAAS,CAAA,oBAChB,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QACpC,SAAA,EAAU,0DAAA;AAAA,QAET,QAAA,EAAA,QAAA,GAAW,WAAA,GAAc,CAAA,KAAA,EAAQ,OAAA,CAAQ,SAAS,CAAC,CAAA,KAAA;AAAA;AAAA;AACtD,GAAA,EAEJ,CAAA;AAEJ;ACjFA,IAAM,iBAAA,GAAoB,GAAA;AAE1B,SAAS,kBAAkB,EAAA,EAAgB;AACzC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,MAAM;AAAA,EAAC,CAAA;AACjD,EAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,EAAE,CAAA;AACpC,EAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,EAAE,CAAA;AACtD;AAEA,SAAS,WAAA,GAAc;AACrB,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,OAAO,OAAO,UAAA,GAAa,iBAAA;AAC7B;AAoCO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA,GAAiB,CAAA;AAAA,EACjB,eAAA,GAAkB,CAAA;AAAA,EAClB,aAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA,GAAiB,CAAA;AAAA,EACjB,eAAA,GAAkB;AACpB,CAAA,EAA2B;AACzB,EAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,EAAA,MAAM,YAAA,GAAe,OAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,oBAAA;AAAA,IACf,iBAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAM;AAAA,GACR;AAEA,EAAA,MAAM,QAAA,GAAW,WAAW,cAAA,GAAiB,eAAA;AAE7C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,OAAA,GAAW,IAAA,CAAmB,MAAA,GAAS,CAAA;AAC1D,EAAA,MAAM,aAAa,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,QAAQ,CAAA,GAAI,CAAA;AAChE,EAAA,MAAM,aAAA,GAAgB,WAAW,UAAA,GAAa,QAAA;AAE9C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,GAAa,CAAC,CAAC,CAAC,CAAA;AAAA,EAChE,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,WAAA,GACJ,OAAA,IAAW,aAAA,GACN,IAAA,CAAmB,KAAA;AAAA,IAClB,WAAA,GAAc,QAAA;AAAA,IAAA,CACb,cAAc,CAAA,IAAK;AAAA,GACtB,GACA,IAAA;AAEN,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAC3B,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,IAAA,IAAI,aAAA,GAAgB,EAAA;AAEpB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,MAAA,GAAS,QAAQ,WAAW,CAAA,CAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,WAAA,CACX,GAAA,CAAI,CAAC,MAAM,GAAA,KAAQ;AAClB,QAAA,IAAI,QAAA,GAAW,wBAAA,CAAyB,QAAA,EAAU,IAAI,CAAA;AACtD,QAAA,QAAA,GAAW,oBAAoB,QAAQ,CAAA;AACvC,QAAA,MAAM,WAAA,GAAc,cAAc,QAAA,GAAW,GAAA;AAC7C,QAAA,OAAO,CAAA,wCAAA,EAA2C,WAAW,CAAA,EAAA,EAAK,QAAQ,CAAA,MAAA,CAAA;AAAA,MAC5E,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,MAAA,aAAA,GAAgB,CAAA,gCAAA,EAAmC,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,MAAA,CAAA;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,aAAA,GAAgB,wBAAA,CAAyB,UAAU,WAAW,CAAA;AAC9D,MAAA,aAAA,GAAgB,oBAAoB,aAAa,CAAA;AAAA,IACnD;AAEA,IAAA,YAAA,CAAa,QAAQ,SAAA,GAAY,aAAA;AAEjC,IAAA,MAAM,OAAA,GAAU,mBAAmB,WAAW,CAAA,CAAA;AAC9C,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,cAAA,CAAe,OAAO,CAAA;AACrD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,MAAA,EAAO;AAAA,IACvB;AAEA,IAAA,IAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,OAAA,GAAU;AAAA,CAAA,EACnB,WAAW,CAAA;AAAA;AAAA,gCAAA,EAEoB,cAAc,CAAA;AAAA;AAAA;AAAA;;AAAA,CAAA,EAK7C,WAAW,CAAA;AAAA;AAAA;;AAAA;AAAA,GAAA,EAKT,WAAW,CAAA;AAAA,kCAAA,EACoB,eAAe,CAAA;AAAA;AAAA;AAAA,CAAA;AAI7C,MAAA,QAAA,GAAW,GAAG,OAAO;AAAA,EAAK,OAAO,CAAA,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,EAAA,GAAK,OAAA;AACX,IAAA,KAAA,CAAM,WAAA,GAAc,QAAA;AACpB,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,KAAK,CAAA;AAEtC,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,gBAAA,CAAiB,KAAK,CAAA;AAC1D,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACtB,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAChC,QAAA,GAAA,CAAI,YAAA,CAAa,WAAW,MAAM,CAAA;AAAA,MACpC;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,gBAAA,CAAiB,GAAG,CAAA;AACvD,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAS;AACtB,MAAA,IAAA,CAAK,YAAA,CAAa,UAAU,QAAQ,CAAA;AACpC,MAAA,IAAA,CAAK,YAAA,CAAa,OAAO,qBAAqB,CAAA;AAAA,IAChD,CAAC,CAAA;AAAA,EACH,CAAA,EAAG;AAAA,IACD,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAuC;AAC1D,IAAA,IAAI,CAAC,aAAA,EAAe;AACpB,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAEtC,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,YAAA;AAAA,QACN,QAAQ,IAAA,CAAK,IAAA;AAAA,QACb,KAAA,EAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,IAAA;AAAA,QAChC,UAAU,EAAE,GAAA,EAAK,KAAK,IAAA,EAAM,IAAA,EAAM,KAAK,WAAA,EAAY;AAAA,QACnD,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,WAAW,MAAA,IAAU,CAAC,MAAA,CAAO,YAAA,CAAa,eAAe,CAAA,EAAG;AAC1D,MAAA,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,cAAA;AAAA,QACN,MAAA,EAAQ,OAAO,WAAA,IAAe,QAAA;AAAA,QAC9B,KAAA,EAAO,OAAO,WAAA,IAAe,QAAA;AAAA,QAC7B,QAAA,EAAU,EAAE,UAAA,EAAY,MAAA,CAAO,WAAA,EAAY;AAAA,QAC3C,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,YAAA;AAAA,QACL,EAAA,EAAI,WAAA;AAAA,QACJ,SAAA,EAAU,iCAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,KAAA,EAAO,EAAE,OAAA,EAAS,OAAA;AAAQ;AAAA,KAC5B;AAAA,IAEC,iCACCD,IAAAA,CAAC,SAAI,SAAA,EAAU,6CAAA,EAA8C,KAAI,KAAA,EAC/D,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,cAAA,CAAe,CAAC,CAAA,KAAM,KAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,UACvD,UAAU,WAAA,KAAgB,CAAA;AAAA,UAC1B,SAAA,EAAU,2IAAA;AAAA,UACV,YAAA,EAAW,eAAA;AAAA,UAEV,QAAA,EAAA;AAAA;AAAA,OACH;AAAA,sBAEAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACb,QAAA,EAAA;AAAA,QAAA,WAAA,GAAc,CAAA;AAAA,QAAE,KAAA;AAAA,QAAI;AAAA,OAAA,EACvB,CAAA;AAAA,sBAEAC,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MACP,cAAA,CAAe,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,UAEvD,QAAA,EAAU,eAAe,UAAA,GAAa,CAAA;AAAA,UACtC,SAAA,EAAU,2IAAA;AAAA,UACV,YAAA,EAAW,WAAA;AAAA,UAEV,QAAA,EAAA;AAAA;AAAA;AACH,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAsBA,SAAS,wBAAA,CAAyB,MAAc,IAAA,EAAuB;AAIrE,EAAA,IAAI,SAAA,GAAY,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AAC1C,EAAA,SAAA,GAAY,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAC/C,EAAA,SAAA,GAAY,qBAAA,CAAsB,WAAW,IAAI,CAAA;AACjD,EAAA,SAAA,GAAY,iBAAA,CAAkB,WAAW,IAAI,CAAA;AAE7C,EAAA,SAAA,GAAY,eAAA,CAAgB,WAAW,IAAI,CAAA;AAC3C,EAAA,SAAA,GAAY,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAC/C,EAAA,SAAA,GAAY,qBAAA,CAAsB,WAAW,IAAI,CAAA;AAGjD,EAAA,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA;AAEtD,EAAA,SAAA,GAAY,SAAA,CAAU,OAAA;AAAA,IAAQ,eAAA;AAAA,IAAiB,MAC7C,IAAA,KAAS,MAAA,IAAa,SAAS,IAAA,GAAO,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,GACvD;AAEA,EAAA,SAAA,GAAY,SAAA,CAAU,OAAA,CAAQ,wBAAA,EAA0B,QAAQ,CAAA;AAEhE,EAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,kBAAA,EAAoB,CAAC,OAAO,IAAA,KAAiB;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAC9B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,WAAW,CAAA;AAE9C,MAAA,IAAI,KAAA,KAAU,KAAA,CAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,EAAA;AAClD,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1D,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AACH;AAGA,SAAS,SAAS,KAAA,EAAyB;AACzC,EAAA,IAAI,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,OAAO,OAAO,KAAA;AACrE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAM,MAAA,GAAS,CAAA;AACrD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,UAAU,CAAA,IAAK,CAAC,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACxE,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,MAAA,GAAS,CAAA;AAChD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,OAAO,IAAA,CAAK,KAAe,EAAE,MAAA,GAAS,CAAA;AAC5E,EAAA,OAAO,QAAQ,KAAK,CAAA;AACtB;AAGA,SAAS,YAAY,IAAA,EAAuC;AAE1D,EAAA,MAAM,EAAA,GAAK,oFAAA;AACX,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AACnC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG,KAAA,EAAA;AAAA,SAAA,IACjB,CAAA,CAAE,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG,KAAA,EAAA;AAAA,SAAA,IACtB,CAAA,CAAE,CAAC,CAAA,KAAM,MAAA,IAAU,UAAU,CAAA,EAAG;AACvC,MAAA,OAAO,CAAC,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,IACzE;AAAA,EACF;AACA,EAAA,OAAO,CAAC,MAAM,IAAI,CAAA;AACpB;AAEA,SAAS,eAAA,CAAgB,MAAc,IAAA,EAAuB;AAC5D,EAAA,MAAM,OAAA,GAAU,8CAAA;AAChB,EAAA,OAAO,KAAK,OAAA,CAAQ,OAAA,EAAS,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AACpE,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,CAAA,GAAI,YAAY,IAAI,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,KAAK,CAAA,GAAI,GAAA,GAAM,EAAA,IAAM,EAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAEA,SAAS,mBAAA,CAAoB,MAAc,IAAA,EAAuB;AAChE,EAAA,MAAM,WAAA,GAAc,sDAAA;AACpB,EAAA,OAAO,KAAK,OAAA,CAAQ,WAAA,EAAa,CAAC,MAAA,EAAQ,OAAe,IAAA,KAAiB;AACxE,IAAA,MAAM,CAAC,EAAA,EAAI,GAAG,CAAA,GAAI,YAAY,IAAI,CAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,KAAK,CAAA,GAAI,GAAA,IAAO,EAAA,GAAK,EAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAEA,SAAS,qBAAA,CAAsB,MAAc,IAAA,EAAuB;AAElE,EAAA,MAAM,EAAA,GAAK,kGAAA;AACX,EAAA,OAAO,IAAA,CAAK,QAAQ,EAAA,EAAI,CAAC,QAAQ,KAAA,EAAe,EAAA,EAAY,EAAA,EAAY,GAAA,EAAa,IAAA,KAAiB;AACpG,IAAA,MAAM,CAAC,GAAA,EAAK,EAAE,CAAA,GAAI,YAAY,IAAI,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,EAAA,IAAM,GAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,KAAM,OAAO,QAAQ,CAAA;AACjD,IAAA,OAAO,OAAA,GAAU,MAAM,EAAA,IAAM,EAAA;AAAA,EAC/B,CAAC,CAAA;AACH;AAEA,SAAS,iBAAA,CAAkB,MAAc,IAAA,EAAuB;AAC9D,EAAA,MAAM,SAAA,GAAY,kDAAA;AAElB,EAAA,OAAO,KAAK,OAAA,CAAQ,SAAA,EAAW,CAAC,MAAA,EAAQ,OAAe,OAAA,KAAoB;AACzE,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,EAAK;AAChC,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,YAAY,CAAA;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,EAAA;AAElC,IAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS;AAEb,MAAA,IAAI,QAAA,GAAW,iBAAA,CAAkB,OAAA,EAAS,IAAI,CAAA;AAC9C,MAAA,QAAA,GAAW,eAAA,CAAgB,UAAU,IAAI,CAAA;AACzC,MAAA,QAAA,GAAW,mBAAA,CAAoB,UAAU,IAAI,CAAA;AAC7C,MAAA,QAAA,GAAW,qBAAA,CAAsB,UAAU,IAAI,CAAA;AAE/C,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,EAAM;AAC7C,QAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,IAAI,CAAC,CAAA;AACzD,QAAA,OAAO,QAAA;AAAA,MACT;AAEA,MAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,wBAAA,EAA0B,QAAQ,CAAA;AAC9D,MAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,kBAAA,EAAoB,CAAC,GAAG,IAAA,KAAiB;AACnE,QAAA,MAAM,WAAA,GAAc,KAAK,IAAA,EAAK;AAC9B,QAAA,IAAI,YAAY,UAAA,CAAW,GAAG,CAAA,IAAK,WAAA,CAAY,WAAW,GAAG,CAAA;AAC3D,UAAA,OAAO,CAAA;AACT,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,EAAM,WAAW,CAAA;AAC9C,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,EAAA;AAClD,QAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC1D,QAAA,OAAO,OAAO,KAAK,CAAA;AAAA,MACrB,CAAC,CAAA;AAED,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ,CAAC,CAAA;AACH;AAEA,SAAS,cAAA,CAAe,KAAc,IAAA,EAAuB;AAC3D,EAAA,IAAI,CAAC,IAAA,IAAQ,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,QAAW,OAAO,MAAA;AAEvD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AACxC,EAAA,IAAI,OAAA,GAAmB,GAAA;AAEvB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,OAAA,KAAY,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA;AAEtD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,uBAAuB,CAAA;AACrD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,GAAG,GAAA,EAAK,KAAK,CAAA,GAAI,UAAA;AACvB,MAAA,OAAA,GAAW,QAAoC,GAAG,CAAA;AAClD,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,QAAA,OAAA,GAAU,OAAA,CAAQ,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,GAAW,QAAoC,IAAI,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;ACnaO,SAAS,oBAAA,GAA2C;AAC1D,EAAA,MAAM,GAAA,GAAM,WAAW,WAAW,CAAA;AAClC,EAAA,OAAO,GAAA,EAAK,aAAa,EAAC;AAC3B;AAQO,SAAS,iBAAA,GAA4C;AAC3D,EAAA,MAAM,GAAA,GAAM,WAAW,WAAW,CAAA;AAClC,EAAA,OAAO,GAAA,EAAK,MAAA;AACb;;;ACcO,IAAM,uBAAA,GAGT;AAAA,EACF,gBAAA,EAAkB,IAAA;AAAA;AAAA;AAAA;AAAA,EAIlB,mBAAA,EAAqB;AACvB,CAAA;ACJA,IAAM,iBAAA,GAAoB,IAAA;AAAA,EAAK,MAC7B,OAAO,qCAAyB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO;AAAA,IAC7C,SAAS,CAAA,CAAE;AAAA,GACb,CAAE;AACJ,CAAA;AAEA,IAAM,cAAA,GAAiB,IAAA;AAAA,EAAK,MAC1B,OAAO,gCAAiC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO;AAAA,IACrD,SAAS,CAAA,CAAE;AAAA,GACb,CAAE;AACJ,CAAA;AAUA,SAAS,eAAe,MAAA,EAAyC;AAC/D,EAAA,IAAI,CAAC,QAAQ,OAAO,MAAA;AACpB,EAAA,IAAI,MAAA,CAAO,YAAA,KAAiB,MAAA,EAAW,OAAO,MAAA,CAAO,YAAA;AACrD,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AAMA,SAAS,eAAA,CAAgB,EAAE,IAAA,EAAK,EAAsB;AACpD,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uDAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,oBAC7BA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,IAAQ,YAAA,EAAa;AAAA,GAAA,EAC9B,CAAA;AAEJ;AAEA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAC3C,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,IAAA;AACtD,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACZ,QAAA,EAAA,aAAA,CAAc,OAAO,GACxB,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,qBAAqB,KAAA,EAA0B;AACtD,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAE3C,EAAA,MAAM,IAAA,GACJ,WAAW,OAAO,OAAA,KAAY,YAAY,MAAA,IAAW,OAAA,GAChD,UACA,OAAA,EAAgD,IAAA;AACvD,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,uBACEA,GAAAA,CAAC,QAAA,EAAA,EAAS,QAAA,kBAAUA,IAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,aAAa,CAAA,EAEpE,QAAA,kBAAAA,GAAAA,CAAC,iBAAA,EAAA,EAAkB,MAAmB,CAAA,EACxC,CAAA;AAEJ;AAEA,SAAS,kBAAkB,KAAA,EAA0B;AACnD,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,EAAQ,cAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAK3C,EAAA,MAAM,aAAa,iBAAA,EAAkB;AACrC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,uBACEA,GAAAA,CAAC,QAAA,EAAA,EAAS,QAAA,kBAAUA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,WAAA,EAAa,CAAA,EACpE,QAAA,kBAAAA,GAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,IAAA,EAAM,OAAA;AAAA,MACN,eAAe,KAAA,CAAM,aAAA;AAAA,MACrB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAQ,UAAA,EAAY,MAAA;AAAA,MACpB,aAAa,UAAA,EAAY;AAAA;AAAA,GAC3B,EACF,CAAA;AAEJ;AAEA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,MAAM,OAAA,GAAU,eAAe,MAAM,CAAA;AACrC,EAAA,MAAM,SAAS,MAAA,EAAQ,eAAA;AAIvB,EAAA,MAAM,MACJ,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,OACpC,MAAA,GAQD,IAAA;AACN,EAAA,IAAI,CAAC,GAAA,EAAK,QAAA,EAAU,OAAO,IAAA;AAE3B,EAAA,uBACEA,GAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAA,EAAS,IAAI,OAAA,IAAW,EAAA;AAAA,MACxB,IAAA,EAAM,OAAA;AAAA,MACN,gBAAgB,GAAA,CAAI,cAAA;AAAA,MACpB,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,gBAAgB,GAAA,CAAI,cAAA;AAAA,MACpB,iBAAiB,GAAA,CAAI;AAAA;AAAA,GACvB;AAEJ;AAEA,SAAS,gBAAgB,KAAA,EAA0B;AACjD,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAC3C,EAAA,IAAI,OAAA,KAAY,QAAW,OAAO,IAAA;AAClC,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACZ,QAAA,EAAA,aAAA,CAAc,OAAO,GACxB,CAAA,EACF,CAAA;AAEJ;AAiBA,IAAM,kBAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,eAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,eAAA,uBAAsB,GAAA,EAAY;AAEjC,SAAS,aAAa,KAAA,EAA0B;AACrD,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,MAAA,EAAO,GAAI,KAAA;AACpC,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,YAAY,oBAAA,EAAqB;AAGvC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,KAAU,sBAAsB,MAAA,EAAQ;AAC1C,MAAC,SAAA,EAA2E,YAAA,GAAe,QAAA,EAAU,MAAA,EAAQ,OAAO,YAAY,CAAA;AAAA,IAClI;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,SAAS,CAAC,CAAA;AAMvC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AAC3C,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,aAAA,IAAiB,EAAE,CAAA;AACtD,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,CAAC,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,KAAQ,QAAA,IAAY,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,EAAG;AACjF,QAAA,eAAA,CAAgB,IAAI,GAAG,CAAA;AACvB,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,yCAAA,EAA4C,GAAG,CAAA,uJAAA,EAES,GAAG,CAAA,GAAA;AAAA,SAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,aAAA,EAAe,QAAQ,CAAC,CAAA;AAGlC,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAM;AAC7B,IAAA,MAAM,eAAe,KAAA,CAAM,QAAA;AAC3B,IAAA,OAAO,CAAC,QAAyB,QAAA,KAAuB;AACtD,MAAC,SAAA,EAA2E,YAAA,GAAe,MAAA,EAAQ,QAAQ,CAAA;AAC3G,MAAA,YAAA,GAAe,MAAM,CAAA;AAAA,IACvB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,KAAA,CAAM,QAAQ,CAAC,CAAA;AAG9B,EAAA,MAAM,cAAA,GAAoC,EAAE,GAAG,KAAA,EAAO,QAAA,EAAS;AAG/D,EAAA,IAAI,KAAA,KAAU,cAAA,IAAkB,KAAA,KAAU,MAAA,EAAQ;AAChD,IAAA,MAAM,aAAc,KAAA,CAA8C,MAAA;AAClE,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,CAAA,GAAI,UAAA;AACV,MAAA,uBAAOD,GAAAA,CAAC,CAAA,EAAA,EAAE,IAAA,EAAM,QAAQ,WAAA,EAAa,CAAA;AAAA,IACvC;AACA,IAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAM,QAAQ,WAAA,EAAa,CAAA;AAAA,EACrD;AAGA,EAAA,MAAM,IAAA,GAAQ,QAAQ,YAAA,IAAuC,QAAA;AAC7D,EAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,QAAA,EAAU;AAGxC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,GAAQ,QAAQ,CAAA;AACpC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,iBAAA,CAAkB,KAAA,EAAO,cAAA,EAAgB,eAAe,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,GAAQ,QAAQ,CAAA;AACvC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,iBAAA,CAAkB,QAAA,EAAU,cAAA,EAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,EAC7E;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,GAAgB,IAAI,CAAA;AAC3C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,iBAAA,CAAkB,QAAA,EAAU,cAAA,EAAgB,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,EAC7E;AAGA,EAAA,MAAM,YAAA,GAAe,wBAAwB,QAAQ,CAAA;AACrD,EAAA,IAAI,YAAA,KAAiB,IAAA,IAAQ,QAAA,IAAY,uBAAA,EAAyB;AAEhE,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,CAAA,GAAI,YAAA;AACV,IAAA,uBAAOA,GAAAA,CAAC,CAAA,EAAA,EAAG,GAAG,cAAA,EAAgB,CAAA;AAAA,EAChC;AAGA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,eAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,oBAAA,EAAA,EAAsB,GAAG,cAAA,EAAgB,CAAA;AAAA,IACnD,KAAK,aAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,iBAAA,EAAA,EAAmB,GAAG,cAAA,EAAgB,CAAA;AAAA,IAChD,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,cAAA,EAAgB,CAAA;AAAA,IAC5C,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,uBAAOA,GAAAA,CAAC,aAAA,EAAA,EAAe,GAAG,cAAA,EAAgB,CAAA;AAAA,IAC5C;AAEE,MAAA,uBAAOA,GAAAA,CAAC,eAAA,EAAA,EAAiB,GAAG,cAAA,EAAgB,CAAA;AAAA;AAElD;AAYA,SAAS,iBAAA,CACP,QAAA,EACA,KAAA,EACA,OAAA,EACA;AACA,EAAA,uBAAOA,GAAAA,CAAC,QAAA,EAAA,EAAU,GAAG,KAAA,EAAO,kBAAkB,OAAA,EAAS,CAAA;AACzD;AAEA,SAAS,mBAAmB,IAAA,EAAgD;AAC1E,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,eAAA;AACH,MAAA,OAAO,oBAAA;AAAA,IACT,KAAK,aAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,iBAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,SAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT;AACE,MAAA,OAAO,eAAA;AAAA;AAEb","file":"chunk-CW6LCVNC.js","sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Card } from \"../ui/card\";\nimport type { ToolRendererProps } from \"../core/types\";\n\ninterface KbSource {\n rank?: number;\n id?: number | string;\n content?: string;\n documentName?: string;\n sourceUrl?: string | null;\n similarity?: number;\n pageTitle?: string | null;\n summary?: string | null;\n relevance?: string;\n}\n\ninterface KbResult {\n found?: boolean;\n totalResults?: number;\n generatedQueries?: string[];\n sources?: KbSource[];\n}\n\nfunction truncate(text: string, max = 220) {\n if (text.length <= max) return text;\n return text.slice(0, max).trimEnd() + \"…\";\n}\n\nexport function SearchKnowledgeBaseRenderer(props: ToolRendererProps) {\n const data = (props.result?._displayData ?? props.result?.data) as KbResult | undefined;\n const [expanded, setExpanded] = useState(false);\n\n if (!data || !data.found || !Array.isArray(data.sources) || data.sources.length === 0) {\n return null;\n }\n\n const sources = data.sources;\n const visible = expanded ? sources : sources.slice(0, 3);\n\n return (\n <Card className=\"p-3 text-sm\">\n <div className=\"mb-2 flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n Found <strong className=\"text-foreground\">{data.totalResults ?? sources.length}</strong>{\" \"}\n source{(data.totalResults ?? sources.length) === 1 ? \"\" : \"s\"}\n {data.generatedQueries?.length\n ? ` for \"${data.generatedQueries.join(\", \")}\"`\n : \"\"}\n </span>\n </div>\n\n <ul className=\"flex flex-col gap-2\">\n {visible.map((s, i) => {\n const snippet = truncate((s.summary || s.content || \"\").replace(/\\s+/g, \" \").trim());\n const title = s.documentName || s.pageTitle || `Source ${s.rank ?? i + 1}`;\n return (\n <li\n key={`${s.id ?? i}`}\n className=\"rounded-md border border-border/60 bg-muted/20 p-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium truncate\">{title}</span>\n {typeof s.similarity === \"number\" && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {(s.similarity * 100).toFixed(0)}%\n </span>\n )}\n </div>\n {snippet && (\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n {snippet}\n </p>\n )}\n {s.sourceUrl && (\n <a\n href={s.sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-block text-xs text-primary hover:underline\"\n >\n Open source ↗\n </a>\n )}\n </li>\n );\n })}\n </ul>\n\n {sources.length > 3 && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n {expanded ? \"Show less\" : `Show ${sources.length - 3} more`}\n </button>\n )}\n </Card>\n );\n}\n\nexport default SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ComponentRenderer — renders a \"legacy\" tool result that ships custom\n * HTML + CSS with Handlebars-style `{{field}}` template variables.\n *\n * Supports single objects and arrays with a responsive grid and a\n * show-more pagination fold. All window access is SSR-guarded.\n */\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n type MouseEvent as ReactMouseEvent,\n} from \"react\";\nimport { processImagesInHtml } from \"../core/image-utils\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction subscribeToResize(cb: () => void) {\n if (typeof window === \"undefined\") return () => {};\n window.addEventListener(\"resize\", cb);\n return () => window.removeEventListener(\"resize\", cb);\n}\n\nfunction getIsMobile() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth < MOBILE_BREAKPOINT;\n}\n\n/** Props for `ComponentRenderer`. */\nexport interface ComponentRendererProps {\n /** Raw HTML template with `{{field}}` placeholders. */\n htmlCode: string;\n /** Scoped CSS for the template. */\n cssCode: string;\n /** Data payload — object (single render) or array (grid). */\n data: unknown;\n /** Columns on mobile when `data` is an array. Default: 1 */\n mobileGridCols?: number;\n /** Columns on desktop when `data` is an array. Default: 3 */\n desktopGridCols?: number;\n /** Optional interaction tracker. */\n onInteraction?: (params: {\n type: string;\n target: string;\n label: string;\n metadata?: Record<string, unknown>;\n messageId?: string;\n eventId?: string;\n }) => void;\n messageId?: string;\n eventId?: string;\n /** Items per page on mobile (default: 4). */\n mobilePageSize?: number;\n /** Items per page on desktop (default: 4). */\n desktopPageSize?: number;\n}\n\n/**\n * Renders a tool-provided HTML/CSS template against data. Strings such as\n * `{{user.name}}` and `{{#each items}}...{{/each}}` are resolved before\n * insertion.\n */\nexport function ComponentRenderer({\n htmlCode,\n cssCode,\n data,\n mobileGridCols = 1,\n desktopGridCols = 3,\n onInteraction,\n messageId,\n eventId,\n mobilePageSize = 4,\n desktopPageSize = 4,\n}: ComponentRendererProps) {\n const containerId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentPage, setCurrentPage] = useState(0);\n const isMobile = useSyncExternalStore(\n subscribeToResize,\n getIsMobile,\n () => true\n );\n\n const pageSize = isMobile ? mobilePageSize : desktopPageSize;\n\n const isArray = Array.isArray(data);\n const totalItems = isArray ? (data as unknown[]).length : 1;\n const totalPages = isArray ? Math.ceil(totalItems / pageSize) : 1;\n const hasPagination = isArray && totalItems > pageSize;\n\n useEffect(() => {\n setCurrentPage((p) => Math.min(p, Math.max(0, totalPages - 1)));\n }, [totalPages]);\n\n const displayData =\n isArray && hasPagination\n ? (data as unknown[]).slice(\n currentPage * pageSize,\n (currentPage + 1) * pageSize\n )\n : data;\n\n useEffect(() => {\n if (!containerRef.current) return;\n if (typeof document === \"undefined\") return;\n\n let processedHtml = \"\";\n\n if (Array.isArray(displayData)) {\n const gridId = `grid-${containerId}`;\n const items = displayData\n .map((item, idx) => {\n let rendered = replaceTemplateVariables(htmlCode, item);\n rendered = processImagesInHtml(rendered);\n const globalIndex = currentPage * pageSize + idx;\n return `<div class=\"grid-item\" data-item-index=\"${globalIndex}\">${rendered}</div>`;\n })\n .join(\"\");\n processedHtml = `<div class=\"grid-container\" id=\"${gridId}\">${items}</div>`;\n } else {\n processedHtml = replaceTemplateVariables(htmlCode, displayData);\n processedHtml = processImagesInHtml(processedHtml);\n }\n\n containerRef.current.innerHTML = processedHtml;\n\n const styleId = `component-style-${containerId}`;\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n let finalCss = cssCode;\n if (Array.isArray(displayData)) {\n const gridCss = `\n#${containerId} .grid-container {\n display: grid;\n grid-template-columns: repeat(${mobileGridCols}, 1fr);\n gap: 1rem;\n width: 100%;\n}\n\n#${containerId} .grid-item {\n width: 100%;\n}\n\n@media (min-width: 768px) {\n #${containerId} .grid-container {\n grid-template-columns: repeat(${desktopGridCols}, 1fr);\n }\n}\n`;\n finalCss = `${cssCode}\\n${gridCss}`;\n }\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = finalCss;\n containerRef.current.appendChild(style);\n\n const images = containerRef.current.querySelectorAll(\"img\");\n images.forEach((img) => {\n if (!img.hasAttribute(\"loading\")) {\n img.setAttribute(\"loading\", \"lazy\");\n }\n });\n\n const links = containerRef.current.querySelectorAll(\"a\");\n links.forEach((link) => {\n link.setAttribute(\"target\", \"_blank\");\n link.setAttribute(\"rel\", \"noopener noreferrer\");\n });\n }, [\n htmlCode,\n cssCode,\n displayData,\n mobileGridCols,\n desktopGridCols,\n containerId,\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n ]);\n\n const handleClick = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onInteraction) return;\n const target = e.target as HTMLElement;\n const link = target.closest(\"a\");\n const button = target.closest(\"button\");\n\n if (link?.href) {\n onInteraction({\n type: \"link_click\",\n target: link.href,\n label: link.textContent || link.href,\n metadata: { url: link.href, text: link.textContent },\n messageId,\n eventId,\n });\n } else if (button && !button.hasAttribute(\"data-no-track\")) {\n onInteraction({\n type: \"button_click\",\n target: button.textContent || \"button\",\n label: button.textContent || \"button\",\n metadata: { buttonText: button.textContent },\n messageId,\n eventId,\n });\n }\n };\n\n return (\n <div className=\"component-renderer-wrapper\">\n <div\n ref={containerRef}\n id={containerId}\n className=\"component-render w-full rounded\"\n onClick={handleClick}\n style={{ display: \"block\" }}\n />\n\n {hasPagination && (\n <div className=\"flex items-center justify-center gap-2 mt-4\" dir=\"ltr\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n disabled={currentPage === 0}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Previous page\"\n >\n {\"‹\"}\n </button>\n\n <span className=\"text-sm text-gray-600 px-2 tabular-nums\">\n {currentPage + 1} / {totalPages}\n </span>\n\n <button\n onClick={() =>\n setCurrentPage((p) => Math.min(totalPages - 1, p + 1))\n }\n disabled={currentPage >= totalPages - 1}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Next page\"\n >\n {\"›\"}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default ComponentRenderer;\n\n// ---------------------------------------------------------------------------\n// Template engine\n// ---------------------------------------------------------------------------\n\n/**\n * Replace `{{template}}` variables in HTML with actual data values.\n *\n * Supported patterns:\n * • `{{field}}`, `{{nested.field}}`, `{{arr[0].name}}` — interpolation\n * • `{{#each field}}...{{/each}}` — loop over an array\n * • `{{this}}` / `{{this.field}}` — current scope (inside each)\n * • `{{#if field}}...{{/if}}` — render block when field is truthy\n * • `{{#if field}}...{{else}}...{{/if}}` — truthy / falsy branches\n * • `{{#unless field}}...{{/unless}}` — render block when field is falsy\n * • `{{#ifEquals field \"value\"}}...{{/ifEquals}}` — equality branch\n *\n * Truthiness: non-empty array, non-empty string, non-zero number, true.\n */\nfunction replaceTemplateVariables(html: string, data: unknown): string {\n // Control-flow blocks first. Order matters: #each can contain #if, #if can\n // contain #each, so we pass the data through both repeatedly. Two passes\n // covers realistic nesting; the recursion inside each handler covers deeper.\n let processed = processIfBlocks(html, data);\n processed = processUnlessBlocks(processed, data);\n processed = processIfEqualsBlocks(processed, data);\n processed = processEachBlocks(processed, data);\n // Second pass — conditionals emitted from inside an #each may need resolving.\n processed = processIfBlocks(processed, data);\n processed = processUnlessBlocks(processed, data);\n processed = processIfEqualsBlocks(processed, data);\n\n // Strip any leftover block markers we don't recognize (defensive).\n processed = processed.replace(/\\{\\{[#/][^}]+\\}\\}/g, \"\");\n\n processed = processed.replace(/\\{\\{this\\}\\}/g, () =>\n data !== undefined && data !== null ? String(data) : \"\"\n );\n\n processed = processed.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n\n return processed.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path: string) => {\n try {\n const trimmedPath = path.trim();\n const value = getNestedValue(data, trimmedPath);\n\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n } catch {\n return match;\n }\n });\n}\n\n/** Truthy check used by all conditional helpers. */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) return false;\n if (typeof value === \"string\") return value.length > 0;\n if (typeof value === \"number\") return value !== 0 && !Number.isNaN(value);\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\n return Boolean(value);\n}\n\n/** Split a conditional body on the first top-level `{{else}}`. */\nfunction splitOnElse(body: string): [string, string | null] {\n // Find the first {{else}} that's NOT nested inside another #if/#each block.\n const re = /\\{\\{(#(?:if|unless|each|ifEquals)\\s+[^}]+|\\/(?:if|unless|each|ifEquals)|else)\\}\\}/g;\n let depth = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(body)) !== null) {\n if (m[1].startsWith(\"#\")) depth++;\n else if (m[1].startsWith(\"/\")) depth--;\n else if (m[1] === \"else\" && depth === 0) {\n return [body.slice(0, m.index), body.slice(m.index + \"{{else}}\".length)];\n }\n }\n return [body, null];\n}\n\nfunction processIfBlocks(html: string, data: unknown): string {\n const ifRegex = /\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n return html.replace(ifRegex, (_match, field: string, body: string) => {\n const [yes, no] = splitOnElse(body);\n const value = getNestedValue(data, field.trim());\n return isTruthy(value) ? yes : no ?? \"\";\n });\n}\n\nfunction processUnlessBlocks(html: string, data: unknown): string {\n const unlessRegex = /\\{\\{#unless\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/unless\\}\\}/g;\n return html.replace(unlessRegex, (_match, field: string, body: string) => {\n const [no, yes] = splitOnElse(body);\n const value = getNestedValue(data, field.trim());\n return isTruthy(value) ? yes ?? \"\" : no;\n });\n}\n\nfunction processIfEqualsBlocks(html: string, data: unknown): string {\n // {{#ifEquals field \"value\"}} or {{#ifEquals field 'value'}} or {{#ifEquals field 42}}\n const re = /\\{\\{#ifEquals\\s+([^\\s\"'}]+)\\s+(?:\"([^\"]*)\"|'([^']*)'|([^\\s}]+))\\}\\}([\\s\\S]*?)\\{\\{\\/ifEquals\\}\\}/g;\n return html.replace(re, (_match, field: string, dq: string, sq: string, raw: string, body: string) => {\n const [yes, no] = splitOnElse(body);\n const expected = dq ?? sq ?? raw;\n const value = getNestedValue(data, field.trim());\n const matches = String(value) === String(expected);\n return matches ? yes : no ?? \"\";\n });\n}\n\nfunction processEachBlocks(html: string, data: unknown): string {\n const eachRegex = /\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n\n return html.replace(eachRegex, (_match, field: string, content: string) => {\n const trimmedField = field.trim();\n const array = getNestedValue(data, trimmedField);\n if (!Array.isArray(array)) return \"\";\n\n return array\n .map((item) => {\n // Process nested control flow in this item's scope.\n let itemHtml = processEachBlocks(content, item);\n itemHtml = processIfBlocks(itemHtml, item);\n itemHtml = processUnlessBlocks(itemHtml, item);\n itemHtml = processIfEqualsBlocks(itemHtml, item);\n\n if (typeof item !== \"object\" || item === null) {\n itemHtml = itemHtml.replace(/\\{\\{this\\}\\}/g, String(item));\n return itemHtml;\n }\n\n itemHtml = itemHtml.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n itemHtml = itemHtml.replace(/\\{\\{([^}]+)\\}\\}/g, (m, path: string) => {\n const trimmedPath = path.trim();\n if (trimmedPath.startsWith(\"#\") || trimmedPath.startsWith(\"/\"))\n return m;\n const value = getNestedValue(item, trimmedPath);\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n });\n\n return itemHtml;\n })\n .join(\"\");\n });\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (!path || obj === null || obj === undefined) return undefined;\n\n const parts = path.split(/\\.(?![^[]*\\])/);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n\n const arrayMatch = part.match(/^([^[]+)\\[([^\\]]+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = (current as Record<string, unknown>)[key];\n if (Array.isArray(current)) {\n current = current[parseInt(index, 10)];\n }\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ChatContext } from \"../providers/ChatContext\";\nimport type { ChatConfig, ChatEventCallbacks } from \"../core/types\";\n\n/**\n * Read chat event callbacks from ChatContext if available, otherwise return\n * an empty object. Safe to call from components that may render outside a\n * ChatProvider (e.g. standalone tool previews).\n */\nexport function useSafeChatCallbacks(): ChatEventCallbacks {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.callbacks ?? {};\n}\n\n/**\n * Read the chat config (projectId, apiEndpoint, apiKey, clientName) from\n * ChatContext if available. Returns `undefined` when the component renders\n * outside a ChatProvider so callers can decide how to degrade (e.g. tool\n * result renderers in standalone previews skip auth-required actions).\n */\nexport function useSafeChatConfig(): ChatConfig | undefined {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.config;\n}\n","\"use client\";\n\n/**\n * Built-in tool renderer registry.\n *\n * The `ToolRenderer` router consults these maps after slot overrides and\n * before falling back to a generic JSON preview.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ToolRendererProps } from \"../core/types\";\nimport { SearchKnowledgeBaseRenderer } from \"./SearchKnowledgeBaseRenderer\";\n\n/**\n * Map of built-in renderers keyed by the tool result's `uiRenderMode`.\n *\n * Entries are populated lazily by `ToolRenderer` (via `React.lazy`) so the\n * heavy renderers (recharts, JSON-render catalog) don't end up in the core\n * bundle unless used. This map is intentionally empty at module scope — look\n * at `ToolRenderer.tsx` for the actual dispatch logic.\n */\nexport const BUILTIN_TOOL_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n visualization: null,\n json_render: null,\n legacy: null,\n preset: null,\n none: null,\n};\n\n/**\n * Built-in renderers addressed by tool *name* (not render mode).\n *\n * A `null` value signals \"render nothing\" — useful for tools whose side\n * effects are handled elsewhere (e.g. `requestHumanChat` is consumed by the\n * `LiveChatProvider` and must not produce UI inside the message stream).\n */\nexport const BUILTIN_NAMED_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n requestHumanChat: null,\n // Hidden by default — knowledge-base searches are context for the assistant,\n // not content for the user. Opt in via:\n // slots: { tools: { searchKnowledgeBase: SearchKnowledgeBaseRenderer } }\n searchKnowledgeBase: null,\n};\n// Keep the component reachable even though the default is null.\nvoid SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ToolRenderer — the main dispatcher for tool invocations in the chat stream.\n *\n * Resolution order:\n * 1. `slots.tools[toolName]` — per-tool-name slot override\n * 2. `slots.toolRenderers[result.uiRenderMode]` — per-render-mode slot override\n * 3. `BUILTIN_NAMED_RENDERERS[toolName]` — special named built-ins\n * 4. `BUILTIN_TOOL_RENDERERS[result.uiRenderMode]` — built-in mode dispatch\n * 5. Fallback — clean JSON preview inside a Card\n *\n * Heavy renderers (`VisualizationRenderer`, `JsonRenderResult`) are loaded\n * lazily via `React.lazy` + `Suspense` to keep the core bundle small.\n */\n\nimport {\n lazy,\n Suspense,\n useEffect,\n useMemo,\n type ComponentType,\n} from \"react\";\nimport { useSlots } from \"../providers/SlotsContext\";\nimport { Card } from \"../ui/card\";\nimport { Spinner } from \"../ui/spinner\";\nimport type {\n ComponentAction,\n ToolRendererProps,\n ToolResult,\n} from \"../core/types\";\n// ToolRenderer may be rendered outside a ChatContext (e.g. standalone\n// previews), so we read the context defensively via a safe hook.\nimport { useSafeChatCallbacks, useSafeChatConfig } from \"./useSafeChatCallbacks\";\nimport {\n BUILTIN_NAMED_RENDERERS,\n BUILTIN_TOOL_RENDERERS,\n} from \"./tool-registry\";\nimport { ComponentRenderer } from \"./ComponentRenderer\";\n\n// ---------------------------------------------------------------------------\n// Lazy renderers\n// ---------------------------------------------------------------------------\n\nconst LazyVisualization = lazy(() =>\n import(\"./VisualizationRenderer\").then((m) => ({\n default: m.VisualizationRenderer,\n }))\n);\n\nconst LazyJsonRender = lazy(() =>\n import(\"../json-render/JsonRenderResult\").then((m) => ({\n default: m.JsonRenderResult as unknown as ComponentType<Record<string, unknown>>,\n }))\n);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Return the best display payload for a tool result, preferring `_displayData`\n * (which the server strips before sending back to the LLM) over `data`.\n */\nfunction getDisplayData(result: ToolResult | undefined): unknown {\n if (!result) return undefined;\n if (result._displayData !== undefined) return result._displayData;\n return result.data;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default (fallback) renderers\n// ---------------------------------------------------------------------------\n\nfunction LoadingFallback({ text }: { text?: string }) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"h-4 w-4\" />\n <span>{text || \"Working...\"}</span>\n </div>\n );\n}\n\nfunction PresetPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined || payload === null) return null;\n return (\n <Card className=\"p-3\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\nfunction VisualizationWrapper(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n // Accept either a full spec or `{ spec: ... }`.\n const spec =\n payload && typeof payload === \"object\" && \"type\" in (payload as object)\n ? (payload as Record<string, unknown>)\n : (payload as { spec?: Record<string, unknown> })?.spec;\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <LazyVisualization spec={spec as any} />\n </Suspense>\n );\n}\n\nfunction JsonRenderWrapper(props: ToolRendererProps) {\n const spec = props.result?.jsonRenderSpec;\n const payload = getDisplayData(props.result);\n // Pull apiKey from the chat config so `call_api` actions in the spec\n // (e.g. form-submit buttons hitting /api/kb/form-submit) can attach the\n // project's Bearer token. Without this, third-party-domain embeds hit\n // 401 on submit — the matching headline bug.\n const chatConfig = useSafeChatConfig();\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n <LazyJsonRender\n spec={spec}\n data={payload}\n onSendMessage={props.onSendMessage}\n onAction={props.onAction}\n apiKey={chatConfig?.apiKey}\n apiEndpoint={chatConfig?.apiEndpoint}\n />\n </Suspense>\n );\n}\n\nfunction LegacyWrapper(props: ToolRendererProps) {\n const result = props.result;\n const payload = getDisplayData(result);\n const config = result?.customComponent;\n // `customComponent` in core/types is declared as `string`, but when used by\n // the legacy render mode the server inlines the `{ htmlCode, cssCode, ... }`\n // object. Widen the type locally.\n const cfg =\n typeof config === \"object\" && config !== null\n ? (config as {\n htmlCode?: string;\n cssCode?: string;\n mobileGridCols?: number;\n desktopGridCols?: number;\n mobilePageSize?: number;\n desktopPageSize?: number;\n })\n : null;\n if (!cfg?.htmlCode) return null;\n\n return (\n <ComponentRenderer\n htmlCode={cfg.htmlCode}\n cssCode={cfg.cssCode || \"\"}\n data={payload}\n mobileGridCols={cfg.mobileGridCols}\n desktopGridCols={cfg.desktopGridCols}\n mobilePageSize={cfg.mobilePageSize}\n desktopPageSize={cfg.desktopPageSize}\n />\n );\n}\n\nfunction FallbackPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined) return null;\n return (\n <Card className=\"p-3 bg-muted/30\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Router\n// ---------------------------------------------------------------------------\n\n/**\n * Main tool renderer. Place one of these per tool invocation inside the\n * assistant message stream.\n */\ninterface PublicSlotMap {\n loader?: ComponentType<{ text?: string }>;\n tools?: Record<string, ComponentType<ToolRendererProps>>;\n toolRenderers?: Record<string, ComponentType<ToolRendererProps>>;\n}\n\n// Known render modes — used to detect tool-name typos in slots.toolRenderers.\nconst KNOWN_RENDER_MODES = new Set([\n \"visualization\",\n \"json_render\",\n \"json\",\n \"legacy\",\n \"display\",\n \"preset\",\n \"text\",\n \"none\",\n \"hidden\",\n]);\n\n// Track tool names we've already warned about to avoid log spam.\nconst warnedToolNames = new Set<string>();\n\nexport function ToolRenderer(props: ToolRendererProps) {\n const { toolName, state, result } = props;\n const slots = useSlots() as unknown as PublicSlotMap;\n const callbacks = useSafeChatCallbacks();\n\n // ----- Fire analytics callbacks -----\n useEffect(() => {\n if (state === \"output-available\" && result) {\n (callbacks as { onToolResult?: (...args: unknown[]) => void } | undefined)?.onToolResult?.(toolName, result, result.uiRenderMode);\n }\n }, [state, toolName, result, callbacks]);\n\n // ----- Dev warning: did the caller confuse `tools` and `toolRenderers`? -----\n // `toolRenderers` is keyed by render MODE. If a key looks like a tool name\n // (not a known mode) AND there's a tool result with that name, it's almost\n // certainly a mistake — the override will never fire.\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n const modeKeys = Object.keys(slots.toolRenderers || {});\n for (const key of modeKeys) {\n if (!KNOWN_RENDER_MODES.has(key) && key === toolName && !warnedToolNames.has(key)) {\n warnedToolNames.add(key);\n console.warn(\n `[aigentyc-chat-sdk] slots.toolRenderers[\"${key}\"] looks like a tool name, ` +\n `but toolRenderers is keyed by render MODE (visualization | json_render | ` +\n `legacy | preset | text). Did you mean slots.tools[\"${key}\"]?`,\n );\n }\n }\n }, [slots.toolRenderers, toolName]);\n\n // Wrap onAction to also forward to callbacks.onToolAction.\n const onAction = useMemo(() => {\n const userOnAction = props.onAction;\n return (action: ComponentAction, itemData?: unknown) => {\n (callbacks as { onToolAction?: (...args: unknown[]) => void } | undefined)?.onToolAction?.(action, itemData);\n userOnAction?.(action);\n };\n }, [callbacks, props.onAction]);\n\n // Build a prop-forwarding wrapper that swaps `onAction`.\n const forwardedProps: ToolRendererProps = { ...props, onAction };\n\n // ----- Pending / in-flight states -----\n if (state === \"partial-call\" || state === \"call\") {\n const slotLoader = (slots as { loader?: ComponentType<unknown> }).loader;\n if (slotLoader) {\n const L = slotLoader as ComponentType<{ text?: string }>;\n return <L text={result?.loadingText} />;\n }\n return <LoadingFallback text={result?.loadingText} />;\n }\n\n // Output-available — nothing to show if the result explicitly hides itself\n const mode = (result?.uiRenderMode as string | undefined) ?? \"preset\";\n if (mode === \"none\" || mode === \"hidden\") {\n // Still check named overrides in case a host wants to render a\n // side-effect-y tool.\n const named = slots.tools?.[toolName];\n if (named) {\n return renderWithDefault(named, forwardedProps, FallbackPreview);\n }\n return null;\n }\n\n // 1. per-tool slot override\n const toolSlot = slots.tools?.[toolName];\n if (toolSlot) {\n return renderWithDefault(toolSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 2. per-render-mode slot override\n const modeSlot = slots.toolRenderers?.[mode];\n if (modeSlot) {\n return renderWithDefault(modeSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 3. named built-in\n const namedBuiltin = BUILTIN_NAMED_RENDERERS[toolName];\n if (namedBuiltin === null && toolName in BUILTIN_NAMED_RENDERERS) {\n // explicit \"render nothing\" for this tool\n return null;\n }\n if (namedBuiltin) {\n const N = namedBuiltin;\n return <N {...forwardedProps} />;\n }\n\n // 4. built-in by render mode\n switch (mode) {\n case \"visualization\":\n return <VisualizationWrapper {...forwardedProps} />;\n case \"json_render\":\n case \"json\":\n return <JsonRenderWrapper {...forwardedProps} />;\n case \"legacy\":\n case \"display\":\n return <LegacyWrapper {...forwardedProps} />;\n case \"preset\":\n case \"text\":\n return <PresetPreview {...forwardedProps} />;\n default:\n // 5. fallback JSON card\n return <FallbackPreview {...forwardedProps} />;\n }\n}\n\nexport default ToolRenderer;\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/**\n * Render a slot override and inject the matching `DefaultComponent` so the\n * override can fall back to the built-in rendering.\n */\nfunction renderWithDefault(\n Override: ComponentType<ToolRendererProps & { DefaultComponent?: ComponentType<ToolRendererProps> }>,\n props: ToolRendererProps,\n Default: ComponentType<ToolRendererProps>\n) {\n return <Override {...props} DefaultComponent={Default} />;\n}\n\nfunction pickDefaultForMode(mode: string): ComponentType<ToolRendererProps> {\n switch (mode) {\n case \"visualization\":\n return VisualizationWrapper;\n case \"json_render\":\n case \"json\":\n return JsonRenderWrapper;\n case \"legacy\":\n case \"display\":\n return LegacyWrapper;\n case \"preset\":\n case \"text\":\n return PresetPreview;\n default:\n return FallbackPreview;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports for convenience\n// ---------------------------------------------------------------------------\n\nexport type { ToolRendererProps, ToolResult, ComponentAction };\n"]}
1
+ {"version":3,"sources":["../src/tools/SearchKnowledgeBaseRenderer.tsx","../src/tools/ComponentRenderer.tsx","../src/tools/useSafeChatCallbacks.ts","../src/tools/tool-registry.ts","../src/tools/ToolRenderer.tsx"],"names":["useState","jsxs","jsx","useEffect"],"mappings":"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","file":"chunk-ZPOCKCBF.js","sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Card } from \"../ui/card\";\nimport type { ToolRendererProps } from \"../core/types\";\n\ninterface KbSource {\n rank?: number;\n id?: number | string;\n content?: string;\n documentName?: string;\n sourceUrl?: string | null;\n similarity?: number;\n pageTitle?: string | null;\n summary?: string | null;\n relevance?: string;\n}\n\ninterface KbResult {\n found?: boolean;\n totalResults?: number;\n generatedQueries?: string[];\n sources?: KbSource[];\n}\n\nfunction truncate(text: string, max = 220) {\n if (text.length <= max) return text;\n return text.slice(0, max).trimEnd() + \"…\";\n}\n\nexport function SearchKnowledgeBaseRenderer(props: ToolRendererProps) {\n const data = (props.result?._displayData ?? props.result?.data) as KbResult | undefined;\n const [expanded, setExpanded] = useState(false);\n\n if (!data || !data.found || !Array.isArray(data.sources) || data.sources.length === 0) {\n return null;\n }\n\n const sources = data.sources;\n const visible = expanded ? sources : sources.slice(0, 3);\n\n return (\n <Card className=\"p-3 text-sm\">\n <div className=\"mb-2 flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n Found <strong className=\"text-foreground\">{data.totalResults ?? sources.length}</strong>{\" \"}\n source{(data.totalResults ?? sources.length) === 1 ? \"\" : \"s\"}\n {data.generatedQueries?.length\n ? ` for \"${data.generatedQueries.join(\", \")}\"`\n : \"\"}\n </span>\n </div>\n\n <ul className=\"flex flex-col gap-2\">\n {visible.map((s, i) => {\n const snippet = truncate((s.summary || s.content || \"\").replace(/\\s+/g, \" \").trim());\n const title = s.documentName || s.pageTitle || `Source ${s.rank ?? i + 1}`;\n return (\n <li\n key={`${s.id ?? i}`}\n className=\"rounded-md border border-border/60 bg-muted/20 p-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium truncate\">{title}</span>\n {typeof s.similarity === \"number\" && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {(s.similarity * 100).toFixed(0)}%\n </span>\n )}\n </div>\n {snippet && (\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n {snippet}\n </p>\n )}\n {s.sourceUrl && (\n <a\n href={s.sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-block text-xs text-primary hover:underline\"\n >\n Open source ↗\n </a>\n )}\n </li>\n );\n })}\n </ul>\n\n {sources.length > 3 && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n {expanded ? \"Show less\" : `Show ${sources.length - 3} more`}\n </button>\n )}\n </Card>\n );\n}\n\nexport default SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ComponentRenderer — renders a \"legacy\" tool result that ships custom\n * HTML + CSS with Handlebars-style `{{field}}` template variables.\n *\n * Supports single objects and arrays with a responsive grid and a\n * show-more pagination fold. All window access is SSR-guarded.\n */\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n type MouseEvent as ReactMouseEvent,\n} from \"react\";\nimport { processImagesInHtml } from \"../core/image-utils\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction subscribeToResize(cb: () => void) {\n if (typeof window === \"undefined\") return () => {};\n window.addEventListener(\"resize\", cb);\n return () => window.removeEventListener(\"resize\", cb);\n}\n\nfunction getIsMobile() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth < MOBILE_BREAKPOINT;\n}\n\n/** Props for `ComponentRenderer`. */\nexport interface ComponentRendererProps {\n /** Raw HTML template with `{{field}}` placeholders. */\n htmlCode: string;\n /** Scoped CSS for the template. */\n cssCode: string;\n /** Data payload — object (single render) or array (grid). */\n data: unknown;\n /** Columns on mobile when `data` is an array. Default: 1 */\n mobileGridCols?: number;\n /** Columns on desktop when `data` is an array. Default: 3 */\n desktopGridCols?: number;\n /** Optional interaction tracker. */\n onInteraction?: (params: {\n type: string;\n target: string;\n label: string;\n metadata?: Record<string, unknown>;\n messageId?: string;\n eventId?: string;\n }) => void;\n messageId?: string;\n eventId?: string;\n /** Items per page on mobile (default: 4). */\n mobilePageSize?: number;\n /** Items per page on desktop (default: 4). */\n desktopPageSize?: number;\n}\n\n/**\n * Renders a tool-provided HTML/CSS template against data. Strings such as\n * `{{user.name}}` and `{{#each items}}...{{/each}}` are resolved before\n * insertion.\n */\nexport function ComponentRenderer({\n htmlCode,\n cssCode,\n data,\n mobileGridCols = 1,\n desktopGridCols = 3,\n onInteraction,\n messageId,\n eventId,\n mobilePageSize = 4,\n desktopPageSize = 4,\n}: ComponentRendererProps) {\n const containerId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentPage, setCurrentPage] = useState(0);\n const isMobile = useSyncExternalStore(\n subscribeToResize,\n getIsMobile,\n () => true\n );\n\n const pageSize = isMobile ? mobilePageSize : desktopPageSize;\n\n const isArray = Array.isArray(data);\n const totalItems = isArray ? (data as unknown[]).length : 1;\n const totalPages = isArray ? Math.ceil(totalItems / pageSize) : 1;\n const hasPagination = isArray && totalItems > pageSize;\n\n useEffect(() => {\n setCurrentPage((p) => Math.min(p, Math.max(0, totalPages - 1)));\n }, [totalPages]);\n\n const displayData =\n isArray && hasPagination\n ? (data as unknown[]).slice(\n currentPage * pageSize,\n (currentPage + 1) * pageSize\n )\n : data;\n\n useEffect(() => {\n if (!containerRef.current) return;\n if (typeof document === \"undefined\") return;\n\n let processedHtml = \"\";\n\n if (Array.isArray(displayData)) {\n const gridId = `grid-${containerId}`;\n const items = displayData\n .map((item, idx) => {\n let rendered = replaceTemplateVariables(htmlCode, item);\n rendered = processImagesInHtml(rendered);\n const globalIndex = currentPage * pageSize + idx;\n return `<div class=\"grid-item\" data-item-index=\"${globalIndex}\">${rendered}</div>`;\n })\n .join(\"\");\n processedHtml = `<div class=\"grid-container\" id=\"${gridId}\">${items}</div>`;\n } else {\n processedHtml = replaceTemplateVariables(htmlCode, displayData);\n processedHtml = processImagesInHtml(processedHtml);\n }\n\n containerRef.current.innerHTML = processedHtml;\n\n const styleId = `component-style-${containerId}`;\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n let finalCss = cssCode;\n if (Array.isArray(displayData)) {\n const gridCss = `\n#${containerId} .grid-container {\n display: grid;\n grid-template-columns: repeat(${mobileGridCols}, 1fr);\n gap: 1rem;\n width: 100%;\n}\n\n#${containerId} .grid-item {\n width: 100%;\n}\n\n@media (min-width: 768px) {\n #${containerId} .grid-container {\n grid-template-columns: repeat(${desktopGridCols}, 1fr);\n }\n}\n`;\n finalCss = `${cssCode}\\n${gridCss}`;\n }\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = finalCss;\n containerRef.current.appendChild(style);\n\n const images = containerRef.current.querySelectorAll(\"img\");\n images.forEach((img) => {\n if (!img.hasAttribute(\"loading\")) {\n img.setAttribute(\"loading\", \"lazy\");\n }\n });\n\n const links = containerRef.current.querySelectorAll(\"a\");\n links.forEach((link) => {\n link.setAttribute(\"target\", \"_blank\");\n link.setAttribute(\"rel\", \"noopener noreferrer\");\n });\n }, [\n htmlCode,\n cssCode,\n displayData,\n mobileGridCols,\n desktopGridCols,\n containerId,\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n ]);\n\n const handleClick = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onInteraction) return;\n const target = e.target as HTMLElement;\n const link = target.closest(\"a\");\n const button = target.closest(\"button\");\n\n if (link?.href) {\n onInteraction({\n type: \"link_click\",\n target: link.href,\n label: link.textContent || link.href,\n metadata: { url: link.href, text: link.textContent },\n messageId,\n eventId,\n });\n } else if (button && !button.hasAttribute(\"data-no-track\")) {\n onInteraction({\n type: \"button_click\",\n target: button.textContent || \"button\",\n label: button.textContent || \"button\",\n metadata: { buttonText: button.textContent },\n messageId,\n eventId,\n });\n }\n };\n\n return (\n <div className=\"component-renderer-wrapper\">\n <div\n ref={containerRef}\n id={containerId}\n className=\"component-render w-full rounded\"\n onClick={handleClick}\n style={{ display: \"block\" }}\n />\n\n {hasPagination && (\n <div className=\"flex items-center justify-center gap-2 mt-4\" dir=\"ltr\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n disabled={currentPage === 0}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Previous page\"\n >\n {\"‹\"}\n </button>\n\n <span className=\"text-sm text-gray-600 px-2 tabular-nums\">\n {currentPage + 1} / {totalPages}\n </span>\n\n <button\n onClick={() =>\n setCurrentPage((p) => Math.min(totalPages - 1, p + 1))\n }\n disabled={currentPage >= totalPages - 1}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Next page\"\n >\n {\"›\"}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default ComponentRenderer;\n\n// ---------------------------------------------------------------------------\n// Template engine\n// ---------------------------------------------------------------------------\n\n/**\n * Replace `{{template}}` variables in HTML with actual data values.\n *\n * Supported patterns:\n * • `{{field}}`, `{{nested.field}}`, `{{arr[0].name}}` — interpolation\n * • `{{#each field}}...{{/each}}` — loop over an array\n * • `{{this}}` / `{{this.field}}` — current scope (inside each)\n * • `{{#if field}}...{{/if}}` — render block when field is truthy\n * • `{{#if field}}...{{else}}...{{/if}}` — truthy / falsy branches\n * • `{{#unless field}}...{{/unless}}` — render block when field is falsy\n * • `{{#ifEquals field \"value\"}}...{{/ifEquals}}` — equality branch\n *\n * Truthiness: non-empty array, non-empty string, non-zero number, true.\n */\nfunction replaceTemplateVariables(html: string, data: unknown): string {\n // Control-flow blocks first. Order matters: #each can contain #if, #if can\n // contain #each, so we pass the data through both repeatedly. Two passes\n // covers realistic nesting; the recursion inside each handler covers deeper.\n let processed = processIfBlocks(html, data);\n processed = processUnlessBlocks(processed, data);\n processed = processIfEqualsBlocks(processed, data);\n processed = processEachBlocks(processed, data);\n // Second pass — conditionals emitted from inside an #each may need resolving.\n processed = processIfBlocks(processed, data);\n processed = processUnlessBlocks(processed, data);\n processed = processIfEqualsBlocks(processed, data);\n\n // Strip any leftover block markers we don't recognize (defensive).\n processed = processed.replace(/\\{\\{[#/][^}]+\\}\\}/g, \"\");\n\n processed = processed.replace(/\\{\\{this\\}\\}/g, () =>\n data !== undefined && data !== null ? String(data) : \"\"\n );\n\n processed = processed.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n\n return processed.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path: string) => {\n try {\n const trimmedPath = path.trim();\n const value = getNestedValue(data, trimmedPath);\n\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n } catch {\n return match;\n }\n });\n}\n\n/** Truthy check used by all conditional helpers. */\nfunction isTruthy(value: unknown): boolean {\n if (value === undefined || value === null || value === false) return false;\n if (typeof value === \"string\") return value.length > 0;\n if (typeof value === \"number\") return value !== 0 && !Number.isNaN(value);\n if (Array.isArray(value)) return value.length > 0;\n if (typeof value === \"object\") return Object.keys(value as object).length > 0;\n return Boolean(value);\n}\n\n/** Split a conditional body on the first top-level `{{else}}`. */\nfunction splitOnElse(body: string): [string, string | null] {\n // Find the first {{else}} that's NOT nested inside another #if/#each block.\n const re = /\\{\\{(#(?:if|unless|each|ifEquals)\\s+[^}]+|\\/(?:if|unless|each|ifEquals)|else)\\}\\}/g;\n let depth = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(body)) !== null) {\n if (m[1].startsWith(\"#\")) depth++;\n else if (m[1].startsWith(\"/\")) depth--;\n else if (m[1] === \"else\" && depth === 0) {\n return [body.slice(0, m.index), body.slice(m.index + \"{{else}}\".length)];\n }\n }\n return [body, null];\n}\n\nfunction processIfBlocks(html: string, data: unknown): string {\n const ifRegex = /\\{\\{#if\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n return html.replace(ifRegex, (_match, field: string, body: string) => {\n const [yes, no] = splitOnElse(body);\n const value = getNestedValue(data, field.trim());\n return isTruthy(value) ? yes : no ?? \"\";\n });\n}\n\nfunction processUnlessBlocks(html: string, data: unknown): string {\n const unlessRegex = /\\{\\{#unless\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/unless\\}\\}/g;\n return html.replace(unlessRegex, (_match, field: string, body: string) => {\n const [no, yes] = splitOnElse(body);\n const value = getNestedValue(data, field.trim());\n return isTruthy(value) ? yes ?? \"\" : no;\n });\n}\n\nfunction processIfEqualsBlocks(html: string, data: unknown): string {\n // {{#ifEquals field \"value\"}} or {{#ifEquals field 'value'}} or {{#ifEquals field 42}}\n const re = /\\{\\{#ifEquals\\s+([^\\s\"'}]+)\\s+(?:\"([^\"]*)\"|'([^']*)'|([^\\s}]+))\\}\\}([\\s\\S]*?)\\{\\{\\/ifEquals\\}\\}/g;\n return html.replace(re, (_match, field: string, dq: string, sq: string, raw: string, body: string) => {\n const [yes, no] = splitOnElse(body);\n const expected = dq ?? sq ?? raw;\n const value = getNestedValue(data, field.trim());\n const matches = String(value) === String(expected);\n return matches ? yes : no ?? \"\";\n });\n}\n\nfunction processEachBlocks(html: string, data: unknown): string {\n const eachRegex = /\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n\n return html.replace(eachRegex, (_match, field: string, content: string) => {\n const trimmedField = field.trim();\n const array = getNestedValue(data, trimmedField);\n if (!Array.isArray(array)) return \"\";\n\n return array\n .map((item) => {\n // Process nested control flow in this item's scope.\n let itemHtml = processEachBlocks(content, item);\n itemHtml = processIfBlocks(itemHtml, item);\n itemHtml = processUnlessBlocks(itemHtml, item);\n itemHtml = processIfEqualsBlocks(itemHtml, item);\n\n if (typeof item !== \"object\" || item === null) {\n itemHtml = itemHtml.replace(/\\{\\{this\\}\\}/g, String(item));\n return itemHtml;\n }\n\n itemHtml = itemHtml.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n itemHtml = itemHtml.replace(/\\{\\{([^}]+)\\}\\}/g, (m, path: string) => {\n const trimmedPath = path.trim();\n if (trimmedPath.startsWith(\"#\") || trimmedPath.startsWith(\"/\"))\n return m;\n const value = getNestedValue(item, trimmedPath);\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n });\n\n return itemHtml;\n })\n .join(\"\");\n });\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (!path || obj === null || obj === undefined) return undefined;\n\n const parts = path.split(/\\.(?![^[]*\\])/);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n\n const arrayMatch = part.match(/^([^[]+)\\[([^\\]]+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = (current as Record<string, unknown>)[key];\n if (Array.isArray(current)) {\n current = current[parseInt(index, 10)];\n }\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ChatContext } from \"../providers/ChatContext\";\nimport type { ChatConfig, ChatEventCallbacks } from \"../core/types\";\n\n/**\n * Read chat event callbacks from ChatContext if available, otherwise return\n * an empty object. Safe to call from components that may render outside a\n * ChatProvider (e.g. standalone tool previews).\n */\nexport function useSafeChatCallbacks(): ChatEventCallbacks {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.callbacks ?? {};\n}\n\n/**\n * Read the chat config (projectId, apiEndpoint, apiKey, clientName) from\n * ChatContext if available. Returns `undefined` when the component renders\n * outside a ChatProvider so callers can decide how to degrade (e.g. tool\n * result renderers in standalone previews skip auth-required actions).\n */\nexport function useSafeChatConfig(): ChatConfig | undefined {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.config;\n}\n","\"use client\";\n\n/**\n * Built-in tool renderer registry.\n *\n * The `ToolRenderer` router consults these maps after slot overrides and\n * before falling back to a generic JSON preview.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ToolRendererProps } from \"../core/types\";\nimport { SearchKnowledgeBaseRenderer } from \"./SearchKnowledgeBaseRenderer\";\n\n/**\n * Map of built-in renderers keyed by the tool result's `uiRenderMode`.\n *\n * Entries are populated lazily by `ToolRenderer` (via `React.lazy`) so the\n * heavy renderers (recharts, JSON-render catalog) don't end up in the core\n * bundle unless used. This map is intentionally empty at module scope — look\n * at `ToolRenderer.tsx` for the actual dispatch logic.\n */\nexport const BUILTIN_TOOL_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n visualization: null,\n json_render: null,\n legacy: null,\n preset: null,\n none: null,\n};\n\n/**\n * Built-in renderers addressed by tool *name* (not render mode).\n *\n * A `null` value signals \"render nothing\" — useful for tools whose side\n * effects are handled elsewhere (e.g. `requestHumanChat` is consumed by the\n * `LiveChatProvider` and must not produce UI inside the message stream).\n */\nexport const BUILTIN_NAMED_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n requestHumanChat: null,\n // Hidden by default — knowledge-base searches are context for the assistant,\n // not content for the user. Opt in via:\n // slots: { tools: { searchKnowledgeBase: SearchKnowledgeBaseRenderer } }\n searchKnowledgeBase: null,\n};\n// Keep the component reachable even though the default is null.\nvoid SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ToolRenderer — the main dispatcher for tool invocations in the chat stream.\n *\n * Resolution order:\n * 1. `slots.tools[toolName]` — per-tool-name slot override\n * 2. `slots.toolRenderers[result.uiRenderMode]` — per-render-mode slot override\n * 3. `BUILTIN_NAMED_RENDERERS[toolName]` — special named built-ins\n * 4. `BUILTIN_TOOL_RENDERERS[result.uiRenderMode]` — built-in mode dispatch\n * 5. Fallback — clean JSON preview inside a Card\n *\n * Heavy renderers (`VisualizationRenderer`, `JsonRenderResult`) are loaded\n * lazily via `React.lazy` + `Suspense` to keep the core bundle small.\n */\n\nimport {\n lazy,\n Suspense,\n useEffect,\n useMemo,\n type ComponentType,\n} from \"react\";\nimport { useSlots } from \"../providers/SlotsContext\";\nimport { Card } from \"../ui/card\";\nimport { Spinner } from \"../ui/spinner\";\nimport type {\n ComponentAction,\n ToolRendererProps,\n ToolResult,\n} from \"../core/types\";\n// ToolRenderer may be rendered outside a ChatContext (e.g. standalone\n// previews), so we read the context defensively via a safe hook.\nimport { useSafeChatCallbacks, useSafeChatConfig } from \"./useSafeChatCallbacks\";\nimport {\n BUILTIN_NAMED_RENDERERS,\n BUILTIN_TOOL_RENDERERS,\n} from \"./tool-registry\";\nimport { ComponentRenderer } from \"./ComponentRenderer\";\n\n// ---------------------------------------------------------------------------\n// Lazy renderers\n// ---------------------------------------------------------------------------\n\nconst LazyVisualization = lazy(() =>\n import(\"./VisualizationRenderer\").then((m) => ({\n default: m.VisualizationRenderer,\n }))\n);\n\nconst LazyJsonRender = lazy(() =>\n import(\"../json-render/JsonRenderResult\").then((m) => ({\n default: m.JsonRenderResult as unknown as ComponentType<Record<string, unknown>>,\n }))\n);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Return the best display payload for a tool result, preferring `_displayData`\n * (which the server strips before sending back to the LLM) over `data`.\n */\nfunction getDisplayData(result: ToolResult | undefined): unknown {\n if (!result) return undefined;\n if (result._displayData !== undefined) return result._displayData;\n return result.data;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default (fallback) renderers\n// ---------------------------------------------------------------------------\n\nfunction LoadingFallback({ text }: { text?: string }) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"h-4 w-4\" />\n <span>{text || \"Working...\"}</span>\n </div>\n );\n}\n\nfunction PresetPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined || payload === null) return null;\n return (\n <Card className=\"p-3\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\nfunction VisualizationWrapper(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n // Accept either a full spec or `{ spec: ... }`.\n const spec =\n payload && typeof payload === \"object\" && \"type\" in (payload as object)\n ? (payload as Record<string, unknown>)\n : (payload as { spec?: Record<string, unknown> })?.spec;\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <LazyVisualization spec={spec as any} />\n </Suspense>\n );\n}\n\nfunction JsonRenderWrapper(props: ToolRendererProps) {\n const spec = props.result?.jsonRenderSpec;\n const payload = getDisplayData(props.result);\n // Pull apiKey from the chat config so `call_api` actions in the spec\n // (e.g. form-submit buttons hitting /api/kb/form-submit) can attach the\n // project's Bearer token. Without this, third-party-domain embeds hit\n // 401 on submit — the matching headline bug.\n const chatConfig = useSafeChatConfig();\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n <LazyJsonRender\n spec={spec}\n data={payload}\n onSendMessage={props.onSendMessage}\n onAction={props.onAction}\n apiKey={chatConfig?.apiKey}\n apiEndpoint={chatConfig?.apiEndpoint}\n />\n </Suspense>\n );\n}\n\nfunction LegacyWrapper(props: ToolRendererProps) {\n const result = props.result;\n const payload = getDisplayData(result);\n const config = result?.customComponent;\n // `customComponent` in core/types is declared as `string`, but when used by\n // the legacy render mode the server inlines the `{ htmlCode, cssCode, ... }`\n // object. Widen the type locally.\n const cfg =\n typeof config === \"object\" && config !== null\n ? (config as {\n htmlCode?: string;\n cssCode?: string;\n mobileGridCols?: number;\n desktopGridCols?: number;\n mobilePageSize?: number;\n desktopPageSize?: number;\n })\n : null;\n if (!cfg?.htmlCode) return null;\n\n return (\n <ComponentRenderer\n htmlCode={cfg.htmlCode}\n cssCode={cfg.cssCode || \"\"}\n data={payload}\n mobileGridCols={cfg.mobileGridCols}\n desktopGridCols={cfg.desktopGridCols}\n mobilePageSize={cfg.mobilePageSize}\n desktopPageSize={cfg.desktopPageSize}\n />\n );\n}\n\nfunction FallbackPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined) return null;\n return (\n <Card className=\"p-3 bg-muted/30\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Router\n// ---------------------------------------------------------------------------\n\n/**\n * Main tool renderer. Place one of these per tool invocation inside the\n * assistant message stream.\n */\ninterface PublicSlotMap {\n loader?: ComponentType<{ text?: string }>;\n tools?: Record<string, ComponentType<ToolRendererProps>>;\n toolRenderers?: Record<string, ComponentType<ToolRendererProps>>;\n}\n\n// Known render modes — used to detect tool-name typos in slots.toolRenderers.\nconst KNOWN_RENDER_MODES = new Set([\n \"visualization\",\n \"json_render\",\n \"json\",\n \"legacy\",\n \"display\",\n \"preset\",\n \"text\",\n \"none\",\n \"hidden\",\n]);\n\n// Track tool names we've already warned about to avoid log spam.\nconst warnedToolNames = new Set<string>();\n\nexport function ToolRenderer(props: ToolRendererProps) {\n const { toolName, state, result } = props;\n const slots = useSlots() as unknown as PublicSlotMap;\n const callbacks = useSafeChatCallbacks();\n\n // ----- Fire analytics callbacks -----\n useEffect(() => {\n if (state === \"output-available\" && result) {\n (callbacks as { onToolResult?: (...args: unknown[]) => void } | undefined)?.onToolResult?.(toolName, result, result.uiRenderMode);\n }\n }, [state, toolName, result, callbacks]);\n\n // ----- Dev warning: did the caller confuse `tools` and `toolRenderers`? -----\n // `toolRenderers` is keyed by render MODE. If a key looks like a tool name\n // (not a known mode) AND there's a tool result with that name, it's almost\n // certainly a mistake — the override will never fire.\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n const modeKeys = Object.keys(slots.toolRenderers || {});\n for (const key of modeKeys) {\n if (!KNOWN_RENDER_MODES.has(key) && key === toolName && !warnedToolNames.has(key)) {\n warnedToolNames.add(key);\n console.warn(\n `[aigentyc-chat-sdk] slots.toolRenderers[\"${key}\"] looks like a tool name, ` +\n `but toolRenderers is keyed by render MODE (visualization | json_render | ` +\n `legacy | preset | text). Did you mean slots.tools[\"${key}\"]?`,\n );\n }\n }\n }, [slots.toolRenderers, toolName]);\n\n // Wrap onAction to also forward to callbacks.onToolAction.\n const onAction = useMemo(() => {\n const userOnAction = props.onAction;\n return (action: ComponentAction, itemData?: unknown) => {\n (callbacks as { onToolAction?: (...args: unknown[]) => void } | undefined)?.onToolAction?.(action, itemData);\n userOnAction?.(action);\n };\n }, [callbacks, props.onAction]);\n\n // Build a prop-forwarding wrapper that swaps `onAction`.\n const forwardedProps: ToolRendererProps = { ...props, onAction };\n\n // ----- Pending / in-flight states -----\n if (state === \"partial-call\" || state === \"call\") {\n const slotLoader = (slots as { loader?: ComponentType<unknown> }).loader;\n if (slotLoader) {\n const L = slotLoader as ComponentType<{ text?: string }>;\n return <L text={result?.loadingText} />;\n }\n return <LoadingFallback text={result?.loadingText} />;\n }\n\n // Output-available — nothing to show if the result explicitly hides itself\n const mode = (result?.uiRenderMode as string | undefined) ?? \"preset\";\n if (mode === \"none\" || mode === \"hidden\") {\n // Still check named overrides in case a host wants to render a\n // side-effect-y tool.\n const named = slots.tools?.[toolName];\n if (named) {\n return renderWithDefault(named, forwardedProps, FallbackPreview);\n }\n return null;\n }\n\n // 1. per-tool slot override\n const toolSlot = slots.tools?.[toolName];\n if (toolSlot) {\n return renderWithDefault(toolSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 2. per-render-mode slot override\n const modeSlot = slots.toolRenderers?.[mode];\n if (modeSlot) {\n return renderWithDefault(modeSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 3. named built-in\n const namedBuiltin = BUILTIN_NAMED_RENDERERS[toolName];\n if (namedBuiltin === null && toolName in BUILTIN_NAMED_RENDERERS) {\n // explicit \"render nothing\" for this tool\n return null;\n }\n if (namedBuiltin) {\n const N = namedBuiltin;\n return <N {...forwardedProps} />;\n }\n\n // 4. built-in by render mode\n switch (mode) {\n case \"visualization\":\n return <VisualizationWrapper {...forwardedProps} />;\n case \"json_render\":\n case \"json\":\n return <JsonRenderWrapper {...forwardedProps} />;\n case \"legacy\":\n case \"display\":\n return <LegacyWrapper {...forwardedProps} />;\n case \"preset\":\n case \"text\":\n return <PresetPreview {...forwardedProps} />;\n default:\n // 5. fallback JSON card\n return <FallbackPreview {...forwardedProps} />;\n }\n}\n\nexport default ToolRenderer;\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/**\n * Render a slot override and inject the matching `DefaultComponent` so the\n * override can fall back to the built-in rendering.\n */\nfunction renderWithDefault(\n Override: ComponentType<ToolRendererProps & { DefaultComponent?: ComponentType<ToolRendererProps> }>,\n props: ToolRendererProps,\n Default: ComponentType<ToolRendererProps>\n) {\n return <Override {...props} DefaultComponent={Default} />;\n}\n\nfunction pickDefaultForMode(mode: string): ComponentType<ToolRendererProps> {\n switch (mode) {\n case \"visualization\":\n return VisualizationWrapper;\n case \"json_render\":\n case \"json\":\n return JsonRenderWrapper;\n case \"legacy\":\n case \"display\":\n return LegacyWrapper;\n case \"preset\":\n case \"text\":\n return PresetPreview;\n default:\n return FallbackPreview;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports for convenience\n// ---------------------------------------------------------------------------\n\nexport type { ToolRendererProps, ToolResult, ComponentAction };\n"]}
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunkLVH5ZIYA_cjs = require('./chunk-LVH5ZIYA.cjs');
4
+ var chunk7MHR4BSJ_cjs = require('./chunk-7MHR4BSJ.cjs');
5
5
  require('./chunk-DVWX2UGY.cjs');
6
6
  require('./chunk-BYX6IOGX.cjs');
7
- require('./chunk-B277MAUK.cjs');
7
+ require('./chunk-7LJMBYHC.cjs');
8
8
  require('./chunk-X7R334SB.cjs');
9
9
  var chunk72QJ2ORD_cjs = require('./chunk-72QJ2ORD.cjs');
10
- require('./chunk-JEK2V5I3.cjs');
11
- require('./chunk-UXVOUC2A.cjs');
10
+ require('./chunk-AQTN4QLR.cjs');
11
+ require('./chunk-JJRLHXHZ.cjs');
12
12
  require('./chunk-VYBHYFG3.cjs');
13
13
  require('./chunk-JOO6C3XT.cjs');
14
14
  require('./chunk-EMVZ7HWM.cjs');
@@ -287,7 +287,7 @@ function ChatDrawer({
287
287
  className: "w-full sm:w-[450px] sm:max-w-[450px] p-0 flex flex-col [&>button]:hidden",
288
288
  children: [
289
289
  /* @__PURE__ */ jsxRuntime.jsx(VisuallyHidden__namespace.Root, { children: /* @__PURE__ */ jsxRuntime.jsx(SheetTitle, { children: "Chat Assistant" }) }),
290
- /* @__PURE__ */ jsxRuntime.jsx(chunkLVH5ZIYA_cjs.ChatInterface, {})
290
+ /* @__PURE__ */ jsxRuntime.jsx(chunk7MHR4BSJ_cjs.ChatInterface, {})
291
291
  ]
292
292
  }
293
293
  )
@@ -479,47 +479,47 @@ function SatisfactionRating({ onSubmit, onSkip }) {
479
479
 
480
480
  Object.defineProperty(exports, "CartDrawer", {
481
481
  enumerable: true,
482
- get: function () { return chunkLVH5ZIYA_cjs.CartDrawer; }
482
+ get: function () { return chunk7MHR4BSJ_cjs.CartDrawer; }
483
483
  });
484
484
  Object.defineProperty(exports, "ChatFooter", {
485
485
  enumerable: true,
486
- get: function () { return chunkLVH5ZIYA_cjs.ChatFooter; }
486
+ get: function () { return chunk7MHR4BSJ_cjs.ChatFooter; }
487
487
  });
488
488
  Object.defineProperty(exports, "ChatHeader", {
489
489
  enumerable: true,
490
- get: function () { return chunkLVH5ZIYA_cjs.ChatHeader; }
490
+ get: function () { return chunk7MHR4BSJ_cjs.ChatHeader; }
491
491
  });
492
492
  Object.defineProperty(exports, "ChatInput", {
493
493
  enumerable: true,
494
- get: function () { return chunkLVH5ZIYA_cjs.ChatInput; }
494
+ get: function () { return chunk7MHR4BSJ_cjs.ChatInput; }
495
495
  });
496
496
  Object.defineProperty(exports, "ChatInterface", {
497
497
  enumerable: true,
498
- get: function () { return chunkLVH5ZIYA_cjs.ChatInterface; }
498
+ get: function () { return chunk7MHR4BSJ_cjs.ChatInterface; }
499
499
  });
500
500
  Object.defineProperty(exports, "FloatingButton", {
501
501
  enumerable: true,
502
- get: function () { return chunkLVH5ZIYA_cjs.FloatingButton; }
502
+ get: function () { return chunk7MHR4BSJ_cjs.FloatingButton; }
503
503
  });
504
504
  Object.defineProperty(exports, "LiveChatPanel", {
505
505
  enumerable: true,
506
- get: function () { return chunkLVH5ZIYA_cjs.LiveChatPanel; }
506
+ get: function () { return chunk7MHR4BSJ_cjs.LiveChatPanel; }
507
507
  });
508
508
  Object.defineProperty(exports, "PreviewEmbedPanel", {
509
509
  enumerable: true,
510
- get: function () { return chunkLVH5ZIYA_cjs.PreviewEmbedPanel; }
510
+ get: function () { return chunk7MHR4BSJ_cjs.PreviewEmbedPanel; }
511
511
  });
512
512
  Object.defineProperty(exports, "QuickQuestions", {
513
513
  enumerable: true,
514
- get: function () { return chunkLVH5ZIYA_cjs.QuickQuestions; }
514
+ get: function () { return chunk7MHR4BSJ_cjs.QuickQuestions; }
515
515
  });
516
516
  Object.defineProperty(exports, "SystemMessage", {
517
517
  enumerable: true,
518
- get: function () { return chunkLVH5ZIYA_cjs.SystemMessage; }
518
+ get: function () { return chunk7MHR4BSJ_cjs.SystemMessage; }
519
519
  });
520
520
  Object.defineProperty(exports, "WelcomePage", {
521
521
  enumerable: true,
522
- get: function () { return chunkLVH5ZIYA_cjs.WelcomePage; }
522
+ get: function () { return chunk7MHR4BSJ_cjs.WelcomePage; }
523
523
  });
524
524
  exports.ChatDrawer = ChatDrawer;
525
525
  exports.ChatInputWithAttachments = ChatInputWithAttachments;