@aigentyc/chat-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +156 -0
  3. package/dist/JsonRenderResult-Ftw4AKwb.d.cts +18 -0
  4. package/dist/JsonRenderResult-Ftw4AKwb.d.ts +18 -0
  5. package/dist/JsonRenderResult-GQOYPLVH.cjs +15 -0
  6. package/dist/JsonRenderResult-GQOYPLVH.cjs.map +1 -0
  7. package/dist/JsonRenderResult-ZFJ6VWMS.js +6 -0
  8. package/dist/JsonRenderResult-ZFJ6VWMS.js.map +1 -0
  9. package/dist/SlotsContext-CBtt36al.d.ts +148 -0
  10. package/dist/SlotsContext-CHvISDJT.d.cts +148 -0
  11. package/dist/VisualizationRenderer-FNFYNN66.js +5 -0
  12. package/dist/VisualizationRenderer-FNFYNN66.js.map +1 -0
  13. package/dist/VisualizationRenderer-VKMZXRUX.cjs +20 -0
  14. package/dist/VisualizationRenderer-VKMZXRUX.cjs.map +1 -0
  15. package/dist/ai-elements.cjs +4608 -0
  16. package/dist/ai-elements.cjs.map +1 -0
  17. package/dist/ai-elements.d.cts +897 -0
  18. package/dist/ai-elements.d.ts +897 -0
  19. package/dist/ai-elements.js +4363 -0
  20. package/dist/ai-elements.js.map +1 -0
  21. package/dist/chunk-3MP2EGEJ.cjs +270 -0
  22. package/dist/chunk-3MP2EGEJ.cjs.map +1 -0
  23. package/dist/chunk-3RW7O444.js +26 -0
  24. package/dist/chunk-3RW7O444.js.map +1 -0
  25. package/dist/chunk-42ARGQXE.js +51 -0
  26. package/dist/chunk-42ARGQXE.js.map +1 -0
  27. package/dist/chunk-4FBVV64J.js +257 -0
  28. package/dist/chunk-4FBVV64J.js.map +1 -0
  29. package/dist/chunk-4QT25AXI.js +21 -0
  30. package/dist/chunk-4QT25AXI.js.map +1 -0
  31. package/dist/chunk-525KS5HM.cjs +30 -0
  32. package/dist/chunk-525KS5HM.cjs.map +1 -0
  33. package/dist/chunk-5F3O3ZJH.js +299 -0
  34. package/dist/chunk-5F3O3ZJH.js.map +1 -0
  35. package/dist/chunk-5QSXB6UL.cjs +259 -0
  36. package/dist/chunk-5QSXB6UL.cjs.map +1 -0
  37. package/dist/chunk-5T4FJ2SR.js +664 -0
  38. package/dist/chunk-5T4FJ2SR.js.map +1 -0
  39. package/dist/chunk-7BNYTOTE.cjs +67 -0
  40. package/dist/chunk-7BNYTOTE.cjs.map +1 -0
  41. package/dist/chunk-AWAJOSFP.cjs +96 -0
  42. package/dist/chunk-AWAJOSFP.cjs.map +1 -0
  43. package/dist/chunk-BKDV2H6Z.js +224 -0
  44. package/dist/chunk-BKDV2H6Z.js.map +1 -0
  45. package/dist/chunk-FQN6OBGN.cjs +171 -0
  46. package/dist/chunk-FQN6OBGN.cjs.map +1 -0
  47. package/dist/chunk-FYPJSHCL.js +190 -0
  48. package/dist/chunk-FYPJSHCL.js.map +1 -0
  49. package/dist/chunk-J2H6MLQF.cjs +680 -0
  50. package/dist/chunk-J2H6MLQF.cjs.map +1 -0
  51. package/dist/chunk-J2K7EJYP.cjs +198 -0
  52. package/dist/chunk-J2K7EJYP.cjs.map +1 -0
  53. package/dist/chunk-JI5KCSOI.cjs +23 -0
  54. package/dist/chunk-JI5KCSOI.cjs.map +1 -0
  55. package/dist/chunk-JOO6C3XT.cjs +44 -0
  56. package/dist/chunk-JOO6C3XT.cjs.map +1 -0
  57. package/dist/chunk-KBGPBUTI.cjs +78 -0
  58. package/dist/chunk-KBGPBUTI.cjs.map +1 -0
  59. package/dist/chunk-MT2AMINB.js +75 -0
  60. package/dist/chunk-MT2AMINB.js.map +1 -0
  61. package/dist/chunk-MZQKGNWF.js +4 -0
  62. package/dist/chunk-MZQKGNWF.js.map +1 -0
  63. package/dist/chunk-NG7OTWXQ.cjs +226 -0
  64. package/dist/chunk-NG7OTWXQ.cjs.map +1 -0
  65. package/dist/chunk-NPJKLYLV.js +68 -0
  66. package/dist/chunk-NPJKLYLV.js.map +1 -0
  67. package/dist/chunk-NW2ESHRV.js +685 -0
  68. package/dist/chunk-NW2ESHRV.js.map +1 -0
  69. package/dist/chunk-NWF735F5.js +1631 -0
  70. package/dist/chunk-NWF735F5.js.map +1 -0
  71. package/dist/chunk-NYQSM3EB.cjs +305 -0
  72. package/dist/chunk-NYQSM3EB.cjs.map +1 -0
  73. package/dist/chunk-OU7OROOE.cjs +1643 -0
  74. package/dist/chunk-OU7OROOE.cjs.map +1 -0
  75. package/dist/chunk-PS3U7T37.js +42 -0
  76. package/dist/chunk-PS3U7T37.js.map +1 -0
  77. package/dist/chunk-Q7T3VAJV.cjs +687 -0
  78. package/dist/chunk-Q7T3VAJV.cjs.map +1 -0
  79. package/dist/chunk-QYCEHFAB.js +265 -0
  80. package/dist/chunk-QYCEHFAB.js.map +1 -0
  81. package/dist/chunk-RPDJXB3U.js +676 -0
  82. package/dist/chunk-RPDJXB3U.js.map +1 -0
  83. package/dist/chunk-UKEL7FWS.js +64 -0
  84. package/dist/chunk-UKEL7FWS.js.map +1 -0
  85. package/dist/chunk-VS3NZ7FX.js +164 -0
  86. package/dist/chunk-VS3NZ7FX.js.map +1 -0
  87. package/dist/chunk-WZLWAVSS.cjs +73 -0
  88. package/dist/chunk-WZLWAVSS.cjs.map +1 -0
  89. package/dist/chunk-X5YEOOPK.cjs +758 -0
  90. package/dist/chunk-X5YEOOPK.cjs.map +1 -0
  91. package/dist/chunk-X7R334SB.cjs +5 -0
  92. package/dist/chunk-X7R334SB.cjs.map +1 -0
  93. package/dist/chunk-XXNDL5SJ.cjs +432 -0
  94. package/dist/chunk-XXNDL5SJ.cjs.map +1 -0
  95. package/dist/chunk-YQELMJW5.js +429 -0
  96. package/dist/chunk-YQELMJW5.js.map +1 -0
  97. package/dist/components.cjs +551 -0
  98. package/dist/components.cjs.map +1 -0
  99. package/dist/components.d.cts +181 -0
  100. package/dist/components.d.ts +181 -0
  101. package/dist/components.js +483 -0
  102. package/dist/components.js.map +1 -0
  103. package/dist/core.cjs +283 -0
  104. package/dist/core.cjs.map +1 -0
  105. package/dist/core.d.cts +455 -0
  106. package/dist/core.d.ts +455 -0
  107. package/dist/core.js +241 -0
  108. package/dist/core.js.map +1 -0
  109. package/dist/hooks.cjs +324 -0
  110. package/dist/hooks.cjs.map +1 -0
  111. package/dist/hooks.d.cts +163 -0
  112. package/dist/hooks.d.ts +163 -0
  113. package/dist/hooks.js +277 -0
  114. package/dist/hooks.js.map +1 -0
  115. package/dist/i18n.cjs +26 -0
  116. package/dist/i18n.cjs.map +1 -0
  117. package/dist/i18n.d.cts +50 -0
  118. package/dist/i18n.d.ts +50 -0
  119. package/dist/i18n.js +5 -0
  120. package/dist/i18n.js.map +1 -0
  121. package/dist/index.cjs +466 -0
  122. package/dist/index.cjs.map +1 -0
  123. package/dist/index.d.cts +80 -0
  124. package/dist/index.d.ts +80 -0
  125. package/dist/index.js +438 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/interaction-tracker-D9P1Oq4j.d.cts +83 -0
  128. package/dist/interaction-tracker-D9P1Oq4j.d.ts +83 -0
  129. package/dist/json-render.cjs +23 -0
  130. package/dist/json-render.cjs.map +1 -0
  131. package/dist/json-render.d.cts +857 -0
  132. package/dist/json-render.d.ts +857 -0
  133. package/dist/json-render.js +6 -0
  134. package/dist/json-render.js.map +1 -0
  135. package/dist/live-chat-transport-4XLOIPOE.js +4 -0
  136. package/dist/live-chat-transport-4XLOIPOE.js.map +1 -0
  137. package/dist/live-chat-transport-ALVRGWX7.cjs +13 -0
  138. package/dist/live-chat-transport-ALVRGWX7.cjs.map +1 -0
  139. package/dist/select-B4l9yoyn.d.cts +99 -0
  140. package/dist/select-B4l9yoyn.d.ts +99 -0
  141. package/dist/styles.css +2 -0
  142. package/dist/theme.cjs +18 -0
  143. package/dist/theme.cjs.map +1 -0
  144. package/dist/theme.d.cts +55 -0
  145. package/dist/theme.d.ts +55 -0
  146. package/dist/theme.js +5 -0
  147. package/dist/theme.js.map +1 -0
  148. package/dist/tools.cjs +32 -0
  149. package/dist/tools.cjs.map +1 -0
  150. package/dist/tools.d.cts +117 -0
  151. package/dist/tools.d.ts +117 -0
  152. package/dist/tools.js +11 -0
  153. package/dist/tools.js.map +1 -0
  154. package/dist/types-DKJ_-nbG.d.cts +349 -0
  155. package/dist/types-DKJ_-nbG.d.ts +349 -0
  156. package/dist/ui.cjs +667 -0
  157. package/dist/ui.cjs.map +1 -0
  158. package/dist/ui.d.cts +95 -0
  159. package/dist/ui.d.ts +95 -0
  160. package/dist/ui.js +414 -0
  161. package/dist/ui.js.map +1 -0
  162. package/package.json +255 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/chart.tsx","../src/tools/VisualizationRenderer.tsx"],"names":["config","jsx","jsxs"],"mappings":"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","file":"chunk-5T4FJ2SR.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"../core/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n [k in string]: {\n label?: React.ReactNode\n icon?: React.ComponentType\n } & (\n | { color?: string; theme?: never }\n | { color?: never; theme: Record<keyof typeof THEMES, string> }\n )\n}\n\ntype ChartContextProps = {\n config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n const context = React.useContext(ChartContext)\n\n if (!context) {\n throw new Error(\"useChart must be used within a <ChartContainer />\")\n }\n\n return context\n}\n\nconst ChartContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> & {\n config: ChartConfig\n children: React.ComponentProps<\n typeof RechartsPrimitive.ResponsiveContainer\n >[\"children\"]\n }\n>(({ id, className, children, config, ...props }, ref) => {\n const uniqueId = React.useId()\n const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`\n\n return (\n <ChartContext.Provider value={{ config }}>\n <div\n data-chart={chartId}\n ref={ref}\n className={cn(\n \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n className\n )}\n {...props}\n >\n <ChartStyle id={chartId} config={config} />\n <RechartsPrimitive.ResponsiveContainer>\n {children}\n </RechartsPrimitive.ResponsiveContainer>\n </div>\n </ChartContext.Provider>\n )\n})\nChartContainer.displayName = \"Chart\"\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n const colorConfig = Object.entries(config).filter(\n ([, config]) => config.theme || config.color\n )\n\n if (!colorConfig.length) {\n return null\n }\n\n return (\n <style\n dangerouslySetInnerHTML={{\n __html: Object.entries(THEMES)\n .map(\n ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n .map(([key, itemConfig]) => {\n const color =\n itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n itemConfig.color\n return color ? ` --color-${key}: ${color};` : null\n })\n .join(\"\\n\")}\n}\n`\n )\n .join(\"\\n\"),\n }}\n />\n )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nconst ChartTooltipContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n React.ComponentProps<\"div\"> & {\n hideLabel?: boolean\n hideIndicator?: boolean\n indicator?: \"line\" | \"dot\" | \"dashed\"\n nameKey?: string\n labelKey?: string\n }\n>(\n (\n {\n active,\n payload,\n className,\n indicator = \"dot\",\n hideLabel = false,\n hideIndicator = false,\n label,\n labelFormatter,\n labelClassName,\n formatter,\n color,\n nameKey,\n labelKey,\n },\n ref\n ) => {\n const { config } = useChart()\n\n const tooltipLabel = React.useMemo(() => {\n if (hideLabel || !payload?.length) {\n return null\n }\n\n const [item] = payload\n const key = `${labelKey || item?.dataKey || item?.name || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const value =\n !labelKey && typeof label === \"string\"\n ? config[label as keyof typeof config]?.label || label\n : itemConfig?.label\n\n if (labelFormatter) {\n return (\n <div className={cn(\"font-medium\", labelClassName)}>\n {labelFormatter(value, payload)}\n </div>\n )\n }\n\n if (!value) {\n return null\n }\n\n return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n }, [\n label,\n labelFormatter,\n payload,\n hideLabel,\n labelClassName,\n config,\n labelKey,\n ])\n\n if (!active || !payload?.length) {\n return null\n }\n\n const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n return (\n <div\n ref={ref}\n className={cn(\n \"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n className\n )}\n >\n {!nestLabel ? tooltipLabel : null}\n <div className=\"grid gap-1.5\">\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item, index) => {\n const key = `${nameKey || item.name || item.dataKey || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n const indicatorColor = color || item.payload.fill || item.color\n\n return (\n <div\n key={item.dataKey}\n className={cn(\n \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n indicator === \"dot\" && \"items-center\"\n )}\n >\n {formatter && item?.value !== undefined && item.name ? (\n formatter(item.value, item.name, item, index, item.payload)\n ) : (\n <>\n {itemConfig?.icon ? (\n <itemConfig.icon />\n ) : (\n !hideIndicator && (\n <div\n className={cn(\n \"shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]\",\n {\n \"h-2.5 w-2.5\": indicator === \"dot\",\n \"w-1\": indicator === \"line\",\n \"w-0 border-[1.5px] border-dashed bg-transparent\":\n indicator === \"dashed\",\n \"my-0.5\": nestLabel && indicator === \"dashed\",\n }\n )}\n style={\n {\n \"--color-bg\": indicatorColor,\n \"--color-border\": indicatorColor,\n } as React.CSSProperties\n }\n />\n )\n )}\n <div\n className={cn(\n \"flex flex-1 justify-between leading-none\",\n nestLabel ? \"items-end\" : \"items-center\"\n )}\n >\n <div className=\"grid gap-1.5\">\n {nestLabel ? tooltipLabel : null}\n <span className=\"text-muted-foreground\">\n {itemConfig?.label || item.name}\n </span>\n </div>\n {item.value && (\n <span className=\"font-mono font-medium tabular-nums text-foreground\">\n {item.value.toLocaleString()}\n </span>\n )}\n </div>\n </>\n )}\n </div>\n )\n })}\n </div>\n </div>\n )\n }\n)\nChartTooltipContent.displayName = \"ChartTooltip\"\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nconst ChartLegendContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\"> &\n Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n hideIcon?: boolean\n nameKey?: string\n }\n>(\n (\n { className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey },\n ref\n ) => {\n const { config } = useChart()\n\n if (!payload?.length) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex items-center justify-center gap-4\",\n verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n className\n )}\n >\n {payload\n .filter((item) => item.type !== \"none\")\n .map((item) => {\n const key = `${nameKey || item.dataKey || \"value\"}`\n const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n return (\n <div\n key={item.value}\n className={cn(\n \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n )}\n >\n {itemConfig?.icon && !hideIcon ? (\n <itemConfig.icon />\n ) : (\n <div\n className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n style={{\n backgroundColor: item.color,\n }}\n />\n )}\n {itemConfig?.label}\n </div>\n )\n })}\n </div>\n )\n }\n)\nChartLegendContent.displayName = \"ChartLegend\"\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(\n config: ChartConfig,\n payload: unknown,\n key: string\n) {\n if (typeof payload !== \"object\" || payload === null) {\n return undefined\n }\n\n const payloadPayload =\n \"payload\" in payload &&\n typeof payload.payload === \"object\" &&\n payload.payload !== null\n ? payload.payload\n : undefined\n\n let configLabelKey: string = key\n\n if (\n key in payload &&\n typeof payload[key as keyof typeof payload] === \"string\"\n ) {\n configLabelKey = payload[key as keyof typeof payload] as string\n } else if (\n payloadPayload &&\n key in payloadPayload &&\n typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n ) {\n configLabelKey = payloadPayload[\n key as keyof typeof payloadPayload\n ] as string\n }\n\n return configLabelKey in config\n ? config[configLabelKey]\n : config[key as keyof typeof config]\n}\n\nexport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n ChartStyle,\n}\n","\"use client\";\n\n/**\n * VisualizationRenderer — renders chart / metric / comparison / timeline specs\n * produced by tools whose `uiRenderMode === \"visualization\"`.\n *\n * Uses `recharts` (declared as an optional peer dependency).\n */\n\nimport {\n LineChart,\n Line,\n BarChart,\n Bar,\n PieChart,\n Pie,\n Cell,\n AreaChart,\n Area,\n RadarChart,\n Radar,\n PolarGrid,\n PolarAngleAxis,\n ComposedChart,\n XAxis,\n YAxis,\n CartesianGrid,\n} from \"recharts\";\nimport {\n ChartContainer,\n ChartTooltip,\n ChartTooltipContent,\n ChartLegend,\n ChartLegendContent,\n} from \"../ui/chart\";\nimport type { ChartConfig } from \"../ui/chart\";\nimport {\n TrendingUp,\n TrendingDown,\n Minus,\n Check,\n X,\n Star,\n} from \"lucide-react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface SeriesConfig {\n dataKey: string;\n label: string;\n color?: string;\n type?: \"line\" | \"bar\" | \"area\";\n}\n\ninterface VisualizationConfig {\n xAxis?: string;\n series?: SeriesConfig[];\n showGrid?: boolean;\n showLegend?: boolean;\n stacked?: boolean;\n valueFormatter?: \"currency\" | \"percent\" | \"number\" | \"compact\";\n}\n\ninterface MetricItem {\n label: string;\n value: string;\n unit?: string;\n trend?: string;\n trendDirection?: \"up\" | \"down\" | \"neutral\";\n description?: string;\n}\n\ninterface ComparisonItem {\n name: string;\n highlight?: boolean;\n features: Record<string, string | boolean | number>;\n}\n\ninterface ComparisonField {\n key: string;\n label: string;\n type?: \"text\" | \"boolean\" | \"rating\";\n}\n\ninterface TimelineEvent {\n date?: string;\n title: string;\n description?: string;\n status?: \"completed\" | \"current\" | \"upcoming\";\n}\n\ninterface GoalItem {\n label: string;\n current: number;\n target: number;\n unit?: string;\n}\n\n/** Declarative visualization spec produced by a tool. */\nexport interface VisualizationSpec {\n type:\n | \"line_chart\"\n | \"bar_chart\"\n | \"pie_chart\"\n | \"area_chart\"\n | \"radar_chart\"\n | \"composed_chart\"\n | \"metric_cards\"\n | \"comparison\"\n | \"timeline\"\n | \"progress\";\n title?: string;\n description?: string;\n data?: Array<Record<string, unknown>>;\n config?: VisualizationConfig;\n metrics?: MetricItem[];\n items?: ComparisonItem[];\n comparisonFields?: ComparisonField[];\n events?: TimelineEvent[];\n goals?: GoalItem[];\n}\n\n// ---------------------------------------------------------------------------\n// Constants & helpers\n// ---------------------------------------------------------------------------\n\nconst CHART_COLORS = [\n \"var(--ac-chart-1, hsl(221, 83%, 53%))\",\n \"var(--ac-chart-2, hsl(142, 71%, 45%))\",\n \"var(--ac-chart-3, hsl(38, 92%, 50%))\",\n \"var(--ac-chart-4, hsl(0, 84%, 60%))\",\n \"var(--ac-chart-5, hsl(262, 83%, 58%))\",\n \"var(--ac-chart-6, hsl(173, 80%, 40%))\",\n \"var(--ac-chart-7, hsl(330, 81%, 60%))\",\n \"var(--ac-chart-8, hsl(25, 95%, 53%))\",\n];\n\nfunction formatValue(value: number, formatter?: string): string {\n switch (formatter) {\n case \"currency\":\n return `$${value.toLocaleString()}`;\n case \"percent\":\n return `${value}%`;\n case \"compact\": {\n if (value >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (value >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n return value.toLocaleString();\n }\n default:\n return value.toLocaleString();\n }\n}\n\nfunction buildChartConfig(series: SeriesConfig[]): ChartConfig {\n const cfg: ChartConfig = {};\n for (let i = 0; i < series.length; i++) {\n const s = series[i];\n cfg[s.dataKey] = {\n label: s.label,\n color: s.color || CHART_COLORS[i % CHART_COLORS.length],\n };\n }\n return cfg;\n}\n\nfunction shouldShowLegend(\n config?: VisualizationConfig,\n series?: SeriesConfig[]\n): boolean {\n if (config?.showLegend !== undefined) return config.showLegend;\n return (series?.length ?? 0) > 1;\n}\n\n// ---------------------------------------------------------------------------\n// Chart renderers\n// ---------------------------------------------------------------------------\n\nfunction RenderLineChart({ spec }: { spec: VisualizationSpec }) {\n const series = spec.config?.series ?? [];\n const chartConfig = buildChartConfig(series);\n const xKey = spec.config?.xAxis ?? \"name\";\n const showGrid = spec.config?.showGrid !== false;\n\n return (\n <ChartContainer config={chartConfig} className=\"h-[300px] w-full\">\n <LineChart data={spec.data} accessibilityLayer>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-muted\" />}\n <XAxis dataKey={xKey} className=\"text-xs\" tickLine={false} axisLine={false} />\n <YAxis\n className=\"text-xs\"\n tickLine={false}\n axisLine={false}\n tickFormatter={(v: number) => formatValue(v, spec.config?.valueFormatter)}\n />\n <ChartTooltip content={<ChartTooltipContent />} />\n {shouldShowLegend(spec.config, series) && (\n <ChartLegend content={<ChartLegendContent />} />\n )}\n {series.map((s) => (\n <Line\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n stroke={`var(--color-${s.dataKey})`}\n strokeWidth={2}\n dot={{ r: 3 }}\n activeDot={{ r: 5 }}\n />\n ))}\n </LineChart>\n </ChartContainer>\n );\n}\n\nfunction RenderBarChart({ spec }: { spec: VisualizationSpec }) {\n const series = spec.config?.series ?? [];\n const chartConfig = buildChartConfig(series);\n const xKey = spec.config?.xAxis ?? \"name\";\n const showGrid = spec.config?.showGrid !== false;\n const stacked = spec.config?.stacked ?? false;\n\n return (\n <ChartContainer config={chartConfig} className=\"h-[300px] w-full\">\n <BarChart data={spec.data} accessibilityLayer>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-muted\" />}\n <XAxis dataKey={xKey} className=\"text-xs\" tickLine={false} axisLine={false} />\n <YAxis\n className=\"text-xs\"\n tickLine={false}\n axisLine={false}\n tickFormatter={(v: number) => formatValue(v, spec.config?.valueFormatter)}\n />\n <ChartTooltip content={<ChartTooltipContent />} />\n {shouldShowLegend(spec.config, series) && (\n <ChartLegend content={<ChartLegendContent />} />\n )}\n {series.map((s) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n fill={`var(--color-${s.dataKey})`}\n radius={[4, 4, 0, 0]}\n stackId={stacked ? \"stack\" : undefined}\n />\n ))}\n </BarChart>\n </ChartContainer>\n );\n}\n\nfunction RenderPieChart({ spec }: { spec: VisualizationSpec }) {\n const series = spec.config?.series ?? [];\n const valueKey = series[0]?.dataKey ?? \"value\";\n const chartConfig = buildChartConfig(series);\n\n const data = (spec.data ?? []).map((d, i) => ({\n ...d,\n fill: CHART_COLORS[i % CHART_COLORS.length],\n }));\n\n return (\n <ChartContainer config={chartConfig} className=\"h-[300px] w-full\">\n <PieChart accessibilityLayer>\n <ChartTooltip content={<ChartTooltipContent nameKey=\"name\" />} />\n <Pie\n data={data}\n dataKey={valueKey}\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={100}\n label={({ percent }) => `${((percent ?? 0) * 100).toFixed(0)}%`}\n labelLine={false}\n >\n {data.map((_entry, i) => (\n <Cell key={`cell-${i}`} fill={CHART_COLORS[i % CHART_COLORS.length]} />\n ))}\n </Pie>\n {shouldShowLegend(spec.config, series) && (\n <ChartLegend content={<ChartLegendContent nameKey=\"name\" />} />\n )}\n </PieChart>\n </ChartContainer>\n );\n}\n\nfunction RenderAreaChart({ spec }: { spec: VisualizationSpec }) {\n const series = spec.config?.series ?? [];\n const chartConfig = buildChartConfig(series);\n const xKey = spec.config?.xAxis ?? \"name\";\n const showGrid = spec.config?.showGrid !== false;\n const stacked = spec.config?.stacked ?? false;\n\n return (\n <ChartContainer config={chartConfig} className=\"h-[300px] w-full\">\n <AreaChart data={spec.data} accessibilityLayer>\n <defs>\n {series.map((s) => (\n <linearGradient key={s.dataKey} id={`fill-${s.dataKey}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor={`var(--color-${s.dataKey})`} stopOpacity={0.3} />\n <stop offset=\"95%\" stopColor={`var(--color-${s.dataKey})`} stopOpacity={0.05} />\n </linearGradient>\n ))}\n </defs>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-muted\" />}\n <XAxis dataKey={xKey} className=\"text-xs\" tickLine={false} axisLine={false} />\n <YAxis\n className=\"text-xs\"\n tickLine={false}\n axisLine={false}\n tickFormatter={(v: number) => formatValue(v, spec.config?.valueFormatter)}\n />\n <ChartTooltip content={<ChartTooltipContent />} />\n {shouldShowLegend(spec.config, series) && (\n <ChartLegend content={<ChartLegendContent />} />\n )}\n {series.map((s) => (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n stroke={`var(--color-${s.dataKey})`}\n fill={`url(#fill-${s.dataKey})`}\n strokeWidth={2}\n stackId={stacked ? \"stack\" : undefined}\n />\n ))}\n </AreaChart>\n </ChartContainer>\n );\n}\n\nfunction RenderRadarChart({ spec }: { spec: VisualizationSpec }) {\n const series = spec.config?.series ?? [];\n const chartConfig = buildChartConfig(series);\n const xKey = spec.config?.xAxis ?? \"name\";\n\n return (\n <ChartContainer config={chartConfig} className=\"h-[300px] w-full\">\n <RadarChart data={spec.data} cx=\"50%\" cy=\"50%\" outerRadius=\"80%\" accessibilityLayer>\n <PolarGrid className=\"stroke-muted\" />\n <PolarAngleAxis dataKey={xKey} className=\"text-xs\" />\n <ChartTooltip content={<ChartTooltipContent />} />\n {shouldShowLegend(spec.config, series) && (\n <ChartLegend content={<ChartLegendContent />} />\n )}\n {series.map((s) => (\n <Radar\n key={s.dataKey}\n name={s.label}\n dataKey={s.dataKey}\n stroke={`var(--color-${s.dataKey})`}\n fill={`var(--color-${s.dataKey})`}\n fillOpacity={0.2}\n />\n ))}\n </RadarChart>\n </ChartContainer>\n );\n}\n\nfunction RenderComposedChart({ spec }: { spec: VisualizationSpec }) {\n const series = spec.config?.series ?? [];\n const chartConfig = buildChartConfig(series);\n const xKey = spec.config?.xAxis ?? \"name\";\n const showGrid = spec.config?.showGrid !== false;\n\n return (\n <ChartContainer config={chartConfig} className=\"h-[300px] w-full\">\n <ComposedChart data={spec.data} accessibilityLayer>\n {showGrid && <CartesianGrid strokeDasharray=\"3 3\" className=\"stroke-muted\" />}\n <XAxis dataKey={xKey} className=\"text-xs\" tickLine={false} axisLine={false} />\n <YAxis\n className=\"text-xs\"\n tickLine={false}\n axisLine={false}\n tickFormatter={(v: number) => formatValue(v, spec.config?.valueFormatter)}\n />\n <ChartTooltip content={<ChartTooltipContent />} />\n {shouldShowLegend(spec.config, series) && (\n <ChartLegend content={<ChartLegendContent />} />\n )}\n {series.map((s) => {\n const color = `var(--color-${s.dataKey})`;\n switch (s.type) {\n case \"area\":\n return (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n stroke={color}\n fill={color}\n fillOpacity={0.15}\n strokeWidth={2}\n />\n );\n case \"line\":\n return (\n <Line\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n stroke={color}\n strokeWidth={2}\n dot={{ r: 3 }}\n />\n );\n case \"bar\":\n default:\n return (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n fill={color}\n radius={[4, 4, 0, 0]}\n />\n );\n }\n })}\n </ComposedChart>\n </ChartContainer>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Non-chart renderers\n// ---------------------------------------------------------------------------\n\nfunction RenderMetricCards({ spec }: { spec: VisualizationSpec }) {\n const metrics = spec.metrics ?? [];\n if (metrics.length === 0) return null;\n\n return (\n <div className=\"grid grid-cols-2 md:grid-cols-3 gap-3\">\n {metrics.map((m, i) => (\n <div key={i} className=\"rounded-lg border bg-card p-4 space-y-1.5\">\n <div className=\"flex items-baseline gap-1\">\n <span className=\"text-2xl font-bold tracking-tight\">{m.value}</span>\n {m.unit && (\n <span className=\"text-sm text-muted-foreground\">{m.unit}</span>\n )}\n </div>\n <p className=\"text-sm font-medium text-muted-foreground\">{m.label}</p>\n {m.trend && (\n <div className=\"flex items-center gap-1\">\n {m.trendDirection === \"up\" && (\n <TrendingUp className=\"h-3.5 w-3.5 text-emerald-500\" />\n )}\n {m.trendDirection === \"down\" && (\n <TrendingDown className=\"h-3.5 w-3.5 text-red-500\" />\n )}\n {m.trendDirection === \"neutral\" && (\n <Minus className=\"h-3.5 w-3.5 text-muted-foreground\" />\n )}\n <span\n className={`text-xs font-medium ${\n m.trendDirection === \"up\"\n ? \"text-emerald-500\"\n : m.trendDirection === \"down\"\n ? \"text-red-500\"\n : \"text-muted-foreground\"\n }`}\n >\n {m.trend}\n </span>\n </div>\n )}\n {m.description && (\n <p className=\"text-xs text-muted-foreground/70\">{m.description}</p>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction RenderComparison({ spec }: { spec: VisualizationSpec }) {\n const items = spec.items ?? [];\n const fields = spec.comparisonFields ?? [];\n if (items.length === 0 || fields.length === 0) return null;\n\n function renderCellValue(value: string | boolean | number, type?: string) {\n if (type === \"boolean\" || typeof value === \"boolean\") {\n return value ? (\n <Check className=\"h-4 w-4 text-emerald-500 mx-auto\" />\n ) : (\n <X className=\"h-4 w-4 text-red-400 mx-auto\" />\n );\n }\n if (type === \"rating\" && typeof value === \"number\") {\n return (\n <div className=\"flex items-center justify-center gap-0.5\">\n {Array.from({ length: 5 }).map((_, i) => (\n <Star\n key={i}\n className={`h-3.5 w-3.5 ${\n i < value\n ? \"fill-amber-400 text-amber-400\"\n : \"text-muted-foreground/30\"\n }`}\n />\n ))}\n </div>\n );\n }\n return <span className=\"text-sm\">{String(value)}</span>;\n }\n\n return (\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th className=\"px-3 py-2 text-left font-medium text-muted-foreground\" />\n {items.map((item, i) => (\n <th\n key={i}\n className={`px-3 py-2 text-center font-semibold ${\n item.highlight\n ? \"bg-primary/5 border-t-2 border-t-primary\"\n : \"\"\n }`}\n >\n {item.name}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {fields.map((field, fi) => (\n <tr key={field.key} className={fi % 2 === 0 ? \"\" : \"bg-muted/20\"}>\n <td className=\"px-3 py-2 font-medium text-muted-foreground whitespace-nowrap\">\n {field.label}\n </td>\n {items.map((item, ii) => (\n <td\n key={ii}\n className={`px-3 py-2 text-center ${\n item.highlight ? \"bg-primary/5\" : \"\"\n }`}\n >\n {field.key in item.features ? (\n renderCellValue(item.features[field.key], field.type)\n ) : (\n <span className=\"text-muted-foreground/40\">-</span>\n )}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction RenderTimeline({ spec }: { spec: VisualizationSpec }) {\n const events = spec.events ?? [];\n if (events.length === 0) return null;\n\n return (\n <div className=\"relative pl-6 space-y-6\">\n <div className=\"absolute left-[9px] top-2 bottom-2 w-px bg-border\" />\n {events.map((event, i) => {\n const status = event.status ?? \"upcoming\";\n return (\n <div key={i} className=\"relative flex gap-4\">\n <div className=\"absolute -left-6 top-0.5 flex items-center justify-center\">\n <div\n className={`h-[18px] w-[18px] rounded-full border-2 ${\n status === \"completed\"\n ? \"border-emerald-500 bg-emerald-500\"\n : status === \"current\"\n ? \"border-blue-500 bg-blue-500 animate-pulse\"\n : \"border-muted-foreground/40 bg-background\"\n }`}\n >\n {status === \"completed\" && (\n <Check className=\"h-3.5 w-3.5 text-white m-auto\" />\n )}\n </div>\n </div>\n <div className=\"flex-1 min-w-0 pb-1\">\n {event.date && (\n <p className=\"text-xs text-muted-foreground mb-0.5\">{event.date}</p>\n )}\n <p\n className={`text-sm font-medium ${\n status === \"upcoming\" ? \"text-muted-foreground\" : \"\"\n }`}\n >\n {event.title}\n </p>\n {event.description && (\n <p className=\"text-xs text-muted-foreground/70 mt-0.5\">\n {event.description}\n </p>\n )}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction RenderProgress({ spec }: { spec: VisualizationSpec }) {\n const goals = spec.goals ?? [];\n if (goals.length === 0) return null;\n\n return (\n <div className=\"space-y-4\">\n {goals.map((goal, i) => {\n const pct =\n goal.target > 0 ? Math.min((goal.current / goal.target) * 100, 100) : 0;\n const barColor =\n pct >= 75 ? \"bg-emerald-500\" : pct >= 40 ? \"bg-amber-500\" : \"bg-red-500\";\n\n return (\n <div key={i} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-medium\">{goal.label}</span>\n <span className=\"text-muted-foreground tabular-nums\">\n {goal.current.toLocaleString()}\n {goal.unit ? ` ${goal.unit}` : \"\"} / {goal.target.toLocaleString()}\n {goal.unit ? ` ${goal.unit}` : \"\"}\n </span>\n </div>\n <div className=\"h-2.5 w-full rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${barColor}`}\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground text-right tabular-nums\">\n {pct.toFixed(0)}%\n </p>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Router\n// ---------------------------------------------------------------------------\n\nfunction renderContent(spec: VisualizationSpec) {\n switch (spec.type) {\n case \"line_chart\":\n return spec.data?.length ? <RenderLineChart spec={spec} /> : null;\n case \"bar_chart\":\n return spec.data?.length ? <RenderBarChart spec={spec} /> : null;\n case \"pie_chart\":\n return spec.data?.length ? <RenderPieChart spec={spec} /> : null;\n case \"area_chart\":\n return spec.data?.length ? <RenderAreaChart spec={spec} /> : null;\n case \"radar_chart\":\n return spec.data?.length ? <RenderRadarChart spec={spec} /> : null;\n case \"composed_chart\":\n return spec.data?.length ? <RenderComposedChart spec={spec} /> : null;\n case \"metric_cards\":\n return <RenderMetricCards spec={spec} />;\n case \"comparison\":\n return <RenderComparison spec={spec} />;\n case \"timeline\":\n return <RenderTimeline spec={spec} />;\n case \"progress\":\n return <RenderProgress spec={spec} />;\n default:\n return (\n <p className=\"text-sm text-muted-foreground\">\n Unsupported visualization type: {String((spec as { type?: string }).type)}\n </p>\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\n/**\n * Props for `VisualizationRenderer`.\n *\n * The renderer expects the visualization spec inside the tool result's `data`\n * (or directly as `spec`).\n */\nexport interface VisualizationRendererProps {\n spec: VisualizationSpec;\n}\n\n/**\n * Renders a declarative visualization spec (charts, metric cards, timelines,\n * comparisons, progress bars) using recharts.\n */\nexport function VisualizationRenderer({ spec }: VisualizationRendererProps) {\n if (!spec || !spec.type) {\n return null;\n }\n\n return (\n <div className=\"w-full space-y-3\">\n {(spec.title || spec.description) && (\n <div>\n {spec.title && <h4 className=\"text-sm font-semibold\">{spec.title}</h4>}\n {spec.description && (\n <p className=\"text-xs text-muted-foreground\">{spec.description}</p>\n )}\n </div>\n )}\n {renderContent(spec)}\n </div>\n );\n}\n\nexport default VisualizationRenderer;\n"]}
@@ -0,0 +1,67 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk3MP2EGEJ_cjs = require('./chunk-3MP2EGEJ.cjs');
5
+ var react = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ var ThemeContext = react.createContext(null);
9
+ function themeToCSSVars(theme) {
10
+ const vars = {
11
+ "--ac-primary": theme.primaryColor,
12
+ "--ac-accent": theme.accentColor,
13
+ "--ac-background": theme.backgroundColor,
14
+ "--ac-text": theme.textColor,
15
+ "--ac-link": theme.linkColor,
16
+ "--ac-loader": theme.loaderColor,
17
+ "--ac-user-bubble": theme.userBubbleColor,
18
+ "--ac-assistant-bubble": theme.assistantBubbleColor,
19
+ "--ac-assistant-bubble-text": theme.assistantBubbleTextColor,
20
+ "--ac-secondary": theme.secondaryColor,
21
+ "--ac-border": theme.borderColor,
22
+ "--ac-placeholder": theme.placeholderColor,
23
+ "--ac-font-family": theme.fontFamily,
24
+ "--ac-heading-font-family": theme.headingFontFamily,
25
+ "--ac-border-radius": theme.borderRadius,
26
+ "--ac-assistant-bubble-padding": theme.assistantBubblePadding,
27
+ "--ac-assistant-max-width": theme.assistantMaxWidth
28
+ };
29
+ const style = {};
30
+ for (const [key, value] of Object.entries(vars)) {
31
+ if (value !== void 0) {
32
+ style[key] = value;
33
+ }
34
+ }
35
+ if (theme.customProperties) {
36
+ for (const [key, value] of Object.entries(theme.customProperties)) {
37
+ style[key] = value;
38
+ }
39
+ }
40
+ return style;
41
+ }
42
+ function ThemeProvider({
43
+ theme: initialTheme = {},
44
+ children
45
+ }) {
46
+ const [theme, setTheme] = react.useState(initialTheme);
47
+ const i18n = chunk3MP2EGEJ_cjs.useI18n();
48
+ const direction = i18n.direction;
49
+ const cssVars = react.useMemo(() => themeToCSSVars(theme), [theme]);
50
+ const value = react.useMemo(
51
+ () => ({ theme, setTheme, direction }),
52
+ [theme, direction]
53
+ );
54
+ return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx("div", { "data-aigentyc-chat": "", dir: direction, style: cssVars, children }) });
55
+ }
56
+ function useTheme() {
57
+ const ctx = react.useContext(ThemeContext);
58
+ if (!ctx) {
59
+ throw new Error("useTheme must be used within a ThemeProvider");
60
+ }
61
+ return ctx;
62
+ }
63
+
64
+ exports.ThemeProvider = ThemeProvider;
65
+ exports.useTheme = useTheme;
66
+ //# sourceMappingURL=chunk-7BNYTOTE.cjs.map
67
+ //# sourceMappingURL=chunk-7BNYTOTE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/ThemeProvider.tsx"],"names":["createContext","useState","useI18n","useMemo","jsx","useContext"],"mappings":";;;;;;AA8CA,IAAM,YAAA,GAAeA,oBAAwC,IAAI,CAAA;AAUjE,SAAS,eAAe,KAAA,EAAmC;AACzD,EAAA,MAAM,IAAA,GAA2C;AAAA,IAC/C,gBAAgB,KAAA,CAAM,YAAA;AAAA,IACtB,eAAe,KAAA,CAAM,WAAA;AAAA,IACrB,mBAAmB,KAAA,CAAM,eAAA;AAAA,IACzB,aAAa,KAAA,CAAM,SAAA;AAAA,IACnB,aAAa,KAAA,CAAM,SAAA;AAAA,IACnB,eAAe,KAAA,CAAM,WAAA;AAAA,IACrB,oBAAoB,KAAA,CAAM,eAAA;AAAA,IAC1B,yBAAyB,KAAA,CAAM,oBAAA;AAAA,IAC/B,8BAA8B,KAAA,CAAM,wBAAA;AAAA,IACpC,kBAAkB,KAAA,CAAM,cAAA;AAAA,IACxB,eAAe,KAAA,CAAM,WAAA;AAAA,IACrB,oBAAoB,KAAA,CAAM,gBAAA;AAAA,IAC1B,oBAAoB,KAAA,CAAM,UAAA;AAAA,IAC1B,4BAA4B,KAAA,CAAM,iBAAA;AAAA,IAClC,sBAAsB,KAAA,CAAM,YAAA;AAAA,IAC5B,iCAAiC,KAAA,CAAM,sBAAA;AAAA,IACvC,4BAA4B,KAAA,CAAM;AAAA,GACpC;AAGA,EAAA,MAAM,QAAgC,EAAC;AACvC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,IACf;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,gBAAA,EAAkB;AAC1B,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,gBAAgB,CAAA,EAAG;AACjE,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,aAAA,CAAc;AAAA,EAC5B,KAAA,EAAO,eAAe,EAAC;AAAA,EACvB;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAsB,YAAY,CAAA;AAC5D,EAAA,MAAM,OAAOC,yBAAA,EAAQ;AACrB,EAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AAEvB,EAAA,MAAM,OAAA,GAAUC,cAAQ,MAAM,cAAA,CAAe,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAE5D,EAAA,MAAM,KAAA,GAAQA,aAAA;AAAA,IACZ,OAAO,EAAE,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU,CAAA;AAAA,IACpC,CAAC,OAAO,SAAS;AAAA,GACnB;AAEA,EAAA,uBACEC,cAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OACrB,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,oBAAA,EAAmB,EAAA,EAAG,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAC/C,UACH,CAAA,EACF,CAAA;AAEJ;AAMO,SAAS,QAAA,GAA8B;AAC5C,EAAA,MAAM,GAAA,GAAMC,iBAAW,YAAY,CAAA;AACnC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-7BNYTOTE.cjs","sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useMemo,\n type ReactNode,\n type CSSProperties,\n} from \"react\";\nimport { useI18n } from \"./I18nProvider\";\n\n/**\n * Theme configuration for the chat widget.\n */\nexport interface ThemeConfig {\n primaryColor?: string;\n accentColor?: string;\n backgroundColor?: string;\n textColor?: string;\n linkColor?: string;\n loaderColor?: string;\n userBubbleColor?: string;\n assistantBubbleColor?: string;\n assistantBubbleTextColor?: string;\n secondaryColor?: string;\n borderColor?: string;\n placeholderColor?: string;\n fontFamily?: string;\n headingFontFamily?: string;\n borderRadius?: string;\n assistantBubblePadding?: string;\n assistantMaxWidth?: string;\n /** Arbitrary CSS custom properties (key must start with `--`). */\n customProperties?: Record<string, string>;\n}\n\ninterface ThemeContextValue {\n /** Current theme configuration. */\n theme: ThemeConfig;\n /** Update the theme at runtime. */\n setTheme: (theme: ThemeConfig) => void;\n /** Current text direction derived from language. */\n direction: \"ltr\" | \"rtl\";\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\n/** Props for the ThemeProvider component. */\nexport interface ThemeProviderProps {\n /** Theme configuration. */\n theme?: ThemeConfig;\n children: ReactNode;\n}\n\n/** Map a ThemeConfig to CSS custom properties. */\nfunction themeToCSSVars(theme: ThemeConfig): CSSProperties {\n const vars: Record<string, string | undefined> = {\n \"--ac-primary\": theme.primaryColor,\n \"--ac-accent\": theme.accentColor,\n \"--ac-background\": theme.backgroundColor,\n \"--ac-text\": theme.textColor,\n \"--ac-link\": theme.linkColor,\n \"--ac-loader\": theme.loaderColor,\n \"--ac-user-bubble\": theme.userBubbleColor,\n \"--ac-assistant-bubble\": theme.assistantBubbleColor,\n \"--ac-assistant-bubble-text\": theme.assistantBubbleTextColor,\n \"--ac-secondary\": theme.secondaryColor,\n \"--ac-border\": theme.borderColor,\n \"--ac-placeholder\": theme.placeholderColor,\n \"--ac-font-family\": theme.fontFamily,\n \"--ac-heading-font-family\": theme.headingFontFamily,\n \"--ac-border-radius\": theme.borderRadius,\n \"--ac-assistant-bubble-padding\": theme.assistantBubblePadding,\n \"--ac-assistant-max-width\": theme.assistantMaxWidth,\n };\n\n // Strip undefined values\n const style: Record<string, string> = {};\n for (const [key, value] of Object.entries(vars)) {\n if (value !== undefined) {\n style[key] = value;\n }\n }\n\n // Merge arbitrary custom properties\n if (theme.customProperties) {\n for (const [key, value] of Object.entries(theme.customProperties)) {\n style[key] = value;\n }\n }\n\n return style as CSSProperties;\n}\n\n/**\n * Provides theme context and renders a wrapper `<div data-aigentyc-chat>`\n * that sets CSS custom properties for styling.\n * Reads direction from I18nProvider.\n */\nexport function ThemeProvider({\n theme: initialTheme = {},\n children,\n}: ThemeProviderProps) {\n const [theme, setTheme] = useState<ThemeConfig>(initialTheme);\n const i18n = useI18n();\n const direction = i18n.direction;\n\n const cssVars = useMemo(() => themeToCSSVars(theme), [theme]);\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, setTheme, direction }),\n [theme, direction]\n );\n\n return (\n <ThemeContext.Provider value={value}>\n <div data-aigentyc-chat=\"\" dir={direction} style={cssVars}>\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n\n/**\n * Returns the current theme configuration and `setTheme` updater.\n * Must be used within a `ThemeProvider`.\n */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) {\n throw new Error(\"useTheme must be used within a ThemeProvider\");\n }\n return ctx;\n}\n"]}
@@ -0,0 +1,96 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk525KS5HM_cjs = require('./chunk-525KS5HM.cjs');
5
+ var React = require('react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ var Card = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
29
+ "div",
30
+ {
31
+ ref,
32
+ className: chunk525KS5HM_cjs.cn(
33
+ "rounded-xl border bg-card text-card-foreground shadow",
34
+ className
35
+ ),
36
+ ...props
37
+ }
38
+ ));
39
+ Card.displayName = "Card";
40
+ var CardHeader = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
41
+ "div",
42
+ {
43
+ ref,
44
+ className: chunk525KS5HM_cjs.cn("flex flex-col space-y-1.5 p-6", className),
45
+ ...props
46
+ }
47
+ ));
48
+ CardHeader.displayName = "CardHeader";
49
+ var CardTitle = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
50
+ "div",
51
+ {
52
+ ref,
53
+ className: chunk525KS5HM_cjs.cn("font-semibold leading-none tracking-tight", className),
54
+ ...props
55
+ }
56
+ ));
57
+ CardTitle.displayName = "CardTitle";
58
+ var CardDescription = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
59
+ "div",
60
+ {
61
+ ref,
62
+ className: chunk525KS5HM_cjs.cn("text-sm text-muted-foreground", className),
63
+ ...props
64
+ }
65
+ ));
66
+ CardDescription.displayName = "CardDescription";
67
+ var CardContent = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: chunk525KS5HM_cjs.cn("p-6 pt-0", className), ...props }));
68
+ CardContent.displayName = "CardContent";
69
+ var CardFooter = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
70
+ "div",
71
+ {
72
+ ref,
73
+ className: chunk525KS5HM_cjs.cn("flex items-center p-6 pt-0", className),
74
+ ...props
75
+ }
76
+ ));
77
+ CardFooter.displayName = "CardFooter";
78
+ var CardAction = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
79
+ "div",
80
+ {
81
+ ref,
82
+ className: chunk525KS5HM_cjs.cn("ml-auto flex items-center gap-2", className),
83
+ ...props
84
+ }
85
+ ));
86
+ CardAction.displayName = "CardAction";
87
+
88
+ exports.Card = Card;
89
+ exports.CardAction = CardAction;
90
+ exports.CardContent = CardContent;
91
+ exports.CardDescription = CardDescription;
92
+ exports.CardFooter = CardFooter;
93
+ exports.CardHeader = CardHeader;
94
+ exports.CardTitle = CardTitle;
95
+ //# sourceMappingURL=chunk-AWAJOSFP.cjs.map
96
+ //# sourceMappingURL=chunk-AWAJOSFP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/card.tsx"],"names":["React","jsx","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,IAAM,IAAA,GAAaA,4BAGjB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,oBAAA;AAAA,MACT,uDAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG;AAAA;AACN,CACD;AACD,IAAA,CAAK,WAAA,GAAc,MAAA;AAEnB,IAAM,UAAA,GAAmBF,4BAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,oBAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,IAAM,SAAA,GAAkBF,4BAGtB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,oBAAA,CAAG,2CAAA,EAA6C,SAAS,CAAA;AAAA,IACnE,GAAG;AAAA;AACN,CACD;AACD,SAAA,CAAU,WAAA,GAAc,WAAA;AAExB,IAAM,eAAA,GAAwBF,4BAG5B,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,oBAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,IACvD,GAAG;AAAA;AACN,CACD;AACD,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,IAAM,cAAoBF,gBAAA,CAAA,UAAA,CAGxB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,EAAG,GAAA,oCACzB,KAAA,EAAA,EAAI,GAAA,EAAU,WAAWE,oBAAA,CAAG,UAAA,EAAY,SAAS,CAAA,EAAI,GAAG,OAAO,CACjE;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;AAE1B,IAAM,UAAA,GAAmBF,4BAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,oBAAA,CAAG,4BAAA,EAA8B,SAAS,CAAA;AAAA,IACpD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA;AAEzB,IAAM,UAAA,GAAmBF,4BAGvB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,oBAAA,CAAG,iCAAA,EAAmC,SAAS,CAAA;AAAA,IACzD,GAAG;AAAA;AACN,CACD;AACD,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-AWAJOSFP.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\"\n\nimport { cn } from \"../core/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nconst CardAction = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"ml-auto flex items-center gap-2\", className)}\n {...props}\n />\n))\nCardAction.displayName = \"CardAction\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent, CardAction }\n"]}
@@ -0,0 +1,224 @@
1
+ "use client";
2
+ // src/core/live-chat-transport.ts
3
+ var LiveChatTransport = class {
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ socket = null;
6
+ config;
7
+ state = "ai";
8
+ liveChatSessionId = null;
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ listeners = /* @__PURE__ */ new Map();
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /**
15
+ * Establish the Socket.IO connection and wire up all server events.
16
+ *
17
+ * Safe to call in SSR — will resolve immediately without connecting.
18
+ */
19
+ async connect() {
20
+ if (typeof window === "undefined") return;
21
+ const { io } = await import('socket.io-client');
22
+ this.socket = io(`${this.config.chatServiceUrl}/visitor`, {
23
+ path: "/api/chat/socket.io",
24
+ auth: {
25
+ apiKey: this.config.apiKey,
26
+ projectId: this.config.projectId
27
+ },
28
+ transports: ["websocket", "polling"]
29
+ });
30
+ this.socket.on("connect", () => {
31
+ console.log("[LiveChat] Connected");
32
+ });
33
+ this.socket.on("disconnect", () => {
34
+ console.log("[LiveChat] Disconnected");
35
+ });
36
+ this.socket.on(
37
+ "livechat:queued",
38
+ (data) => {
39
+ this.liveChatSessionId = data.liveChatSessionId;
40
+ this.setState("queued");
41
+ this.emit("queued", data);
42
+ }
43
+ );
44
+ this.socket.on("livechat:queue-update", (data) => {
45
+ this.emit("queue-update", data);
46
+ });
47
+ this.socket.on("livechat:accepted", (data) => {
48
+ this.setState("live");
49
+ this.emit("accepted", data);
50
+ });
51
+ this.socket.on("livechat:message", (data) => {
52
+ this.emit("message", {
53
+ id: data.id,
54
+ content: data.content,
55
+ senderType: data.senderType,
56
+ timestamp: data.timestamp
57
+ });
58
+ });
59
+ this.socket.on("livechat:ended", (data) => {
60
+ this.setState("ended");
61
+ this.emit("ended", data);
62
+ });
63
+ this.socket.on("livechat:handback-ai", () => {
64
+ this.setState("ai");
65
+ this.emit("handback-ai", void 0);
66
+ });
67
+ this.socket.on(
68
+ "livechat:system",
69
+ (data) => {
70
+ this.emit("system", data);
71
+ }
72
+ );
73
+ this.socket.on(
74
+ "livechat:error",
75
+ (data) => {
76
+ this.emit("error", data);
77
+ }
78
+ );
79
+ this.socket.on(
80
+ "livechat:rejoin-success",
81
+ (data) => {
82
+ this.emit("rejoin-success", data);
83
+ }
84
+ );
85
+ this.socket.on("livechat:rejoin-failed", (data) => {
86
+ this.emit("rejoin-failed", data);
87
+ });
88
+ this.socket.on("livechat:typing", (data) => {
89
+ this.emit("typing", data);
90
+ });
91
+ }
92
+ /**
93
+ * Request a handoff from AI to a human operator.
94
+ *
95
+ * @param params - Visitor info and AI conversation history
96
+ */
97
+ requestHandoff(params) {
98
+ this.setState("requesting");
99
+ this.socket?.emit("livechat:request", {
100
+ projectId: this.config.projectId,
101
+ sessionId: this.config.visitorSessionId,
102
+ ...params
103
+ });
104
+ }
105
+ /**
106
+ * Send a message to the operator.
107
+ *
108
+ * @param content - Message text
109
+ */
110
+ sendMessage(content) {
111
+ if (!this.liveChatSessionId) return;
112
+ this.socket?.emit("livechat:message", {
113
+ liveChatSessionId: this.liveChatSessionId,
114
+ content
115
+ });
116
+ }
117
+ /**
118
+ * Send a typing indicator to the operator.
119
+ *
120
+ * @param isTyping - `true` if the visitor is currently typing
121
+ */
122
+ sendTyping(isTyping) {
123
+ if (!this.liveChatSessionId) return;
124
+ this.socket?.emit("livechat:typing", {
125
+ liveChatSessionId: this.liveChatSessionId,
126
+ isTyping
127
+ });
128
+ }
129
+ /**
130
+ * Cancel a pending handoff request.
131
+ *
132
+ * @param liveChatSessionId - The session to cancel
133
+ */
134
+ cancelRequest(liveChatSessionId) {
135
+ this.socket?.emit("livechat:cancel", { liveChatSessionId });
136
+ }
137
+ /**
138
+ * End the current live-chat session.
139
+ */
140
+ endChat() {
141
+ if (!this.liveChatSessionId) return;
142
+ this.socket?.emit("livechat:end", {
143
+ liveChatSessionId: this.liveChatSessionId
144
+ });
145
+ }
146
+ /**
147
+ * Submit a satisfaction rating for the ended session.
148
+ *
149
+ * @param rating - `"positive"` or `"negative"`
150
+ * @param comment - Optional free-text feedback
151
+ */
152
+ submitRating(rating, comment) {
153
+ if (!this.liveChatSessionId) return;
154
+ this.socket?.emit("livechat:rating", {
155
+ liveChatSessionId: this.liveChatSessionId,
156
+ rating,
157
+ comment
158
+ });
159
+ }
160
+ /**
161
+ * Rejoin an existing session (e.g. after a page refresh).
162
+ *
163
+ * @param liveChatSessionId - The session to rejoin
164
+ */
165
+ rejoinSession(liveChatSessionId) {
166
+ this.liveChatSessionId = liveChatSessionId;
167
+ this.socket?.emit("livechat:rejoin", { liveChatSessionId });
168
+ }
169
+ /**
170
+ * Disconnect the socket and reset state.
171
+ */
172
+ disconnect() {
173
+ this.socket?.disconnect();
174
+ this.socket = null;
175
+ this.liveChatSessionId = null;
176
+ this.state = "ai";
177
+ }
178
+ /**
179
+ * Get the current live-chat state.
180
+ */
181
+ getState() {
182
+ return this.state;
183
+ }
184
+ /**
185
+ * Get the current live-chat session ID (if any).
186
+ */
187
+ getSessionId() {
188
+ return this.liveChatSessionId;
189
+ }
190
+ // --- Event emitter ---
191
+ setState(state) {
192
+ this.state = state;
193
+ this.emit("state-change", state);
194
+ }
195
+ /**
196
+ * Subscribe to a live-chat event.
197
+ *
198
+ * @param event - Event name
199
+ * @param handler - Callback
200
+ */
201
+ on(event, handler) {
202
+ if (!this.listeners.has(event)) {
203
+ this.listeners.set(event, /* @__PURE__ */ new Set());
204
+ }
205
+ this.listeners.get(event).add(handler);
206
+ }
207
+ /**
208
+ * Unsubscribe from a live-chat event.
209
+ *
210
+ * @param event - Event name
211
+ * @param handler - The same callback reference passed to `on()`
212
+ */
213
+ off(event, handler) {
214
+ this.listeners.get(event)?.delete(handler);
215
+ }
216
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
217
+ emit(event, data) {
218
+ this.listeners.get(event)?.forEach((handler) => handler(data));
219
+ }
220
+ };
221
+
222
+ export { LiveChatTransport };
223
+ //# sourceMappingURL=chunk-BKDV2H6Z.js.map
224
+ //# sourceMappingURL=chunk-BKDV2H6Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/live-chat-transport.ts"],"names":[],"mappings":"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","file":"chunk-BKDV2H6Z.js","sourcesContent":["\"use client\";\n\n/**\n * Live Chat Transport\n *\n * Socket.IO client for real-time communication with human operators.\n * Lazy-loaded only when live chat is triggered to avoid bundling\n * `socket.io-client` for AI-only use cases.\n *\n * All browser API access is guarded against SSR.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * State machine for live-chat sessions.\n *\n * @see {@link LiveChatTransport.getState}\n */\nexport type LiveChatState = \"ai\" | \"requesting\" | \"queued\" | \"live\" | \"ended\";\n\n/**\n * Configuration required to establish a live-chat connection.\n */\nexport interface LiveChatConfig {\n /** Socket.IO endpoint URL */\n chatServiceUrl: string;\n /** Bearer API key */\n apiKey: string;\n /** Aigentyc project ID */\n projectId: string;\n /** Visitor session identifier (matches the AI chat session) */\n visitorSessionId: string;\n}\n\n/**\n * A single message exchanged during a live-chat session.\n */\nexport interface LiveChatMessage {\n /** Server-assigned message ID */\n id: number;\n /** Message body (plain text or HTML) */\n content: string;\n /** Who sent the message */\n senderType: \"visitor\" | \"operator\" | \"system\";\n /** ISO-8601 timestamp */\n timestamp: string;\n /** Optional system-message sub-type */\n systemMessageType?: string;\n}\n\n/**\n * Typed event map for live-chat transport listeners.\n */\nexport type LiveChatEventMap = {\n /** Fired when the state machine transitions */\n \"state-change\": (state: LiveChatState) => void;\n /** Fired when the request is queued */\n queued: (data: { liveChatSessionId: string; position: number }) => void;\n /** Fired when the queue position updates */\n \"queue-update\": (data: { position: number }) => void;\n /** Fired when an operator accepts the chat */\n accepted: (data: { operatorName: string }) => void;\n /** Fired on every incoming message */\n message: (data: LiveChatMessage) => void;\n /** Fired when the live-chat session ends */\n ended: (data: { endedBy: string }) => void;\n /** Fired when the operator hands the visitor back to AI */\n \"handback-ai\": () => void;\n /** System-level notification */\n system: (data: { message: string; type: string }) => void;\n /** Error notification */\n error: (data: { code: string; message: string }) => void;\n /** Operator typing indicator */\n typing: (data: { isTyping: boolean }) => void;\n /** Successful session rejoin (after page refresh) */\n \"rejoin-success\": (data: {\n state: string;\n operatorName?: string;\n position?: number;\n messages: LiveChatMessage[];\n }) => void;\n /** Failed session rejoin */\n \"rejoin-failed\": (data: { reason: string }) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Transport Class\n// ---------------------------------------------------------------------------\n\n/**\n * Manages the Socket.IO connection for live-chat sessions.\n *\n * Lazily imports `socket.io-client` on first `connect()` call so the\n * dependency is never loaded for AI-only deployments.\n *\n * @example\n * ```ts\n * const transport = new LiveChatTransport({\n * chatServiceUrl: \"https://api.example.com\",\n * apiKey: \"key\",\n * projectId: \"abc\",\n * visitorSessionId: \"sess-123\",\n * });\n *\n * transport.on(\"message\", (msg) => console.log(msg));\n * await transport.connect();\n * transport.requestHandoff({ aiChatHistory: messages });\n * ```\n */\nexport class LiveChatTransport {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private socket: any = null;\n private config: LiveChatConfig;\n private state: LiveChatState = \"ai\";\n private liveChatSessionId: string | null = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private listeners = new Map<string, Set<Function>>();\n\n constructor(config: LiveChatConfig) {\n this.config = config;\n }\n\n /**\n * Establish the Socket.IO connection and wire up all server events.\n *\n * Safe to call in SSR — will resolve immediately without connecting.\n */\n async connect(): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n // Lazy import socket.io-client\n const { io } = await import(\"socket.io-client\");\n\n this.socket = io(`${this.config.chatServiceUrl}/visitor`, {\n path: \"/api/chat/socket.io\",\n auth: {\n apiKey: this.config.apiKey,\n projectId: this.config.projectId,\n },\n transports: [\"websocket\", \"polling\"],\n });\n\n this.socket.on(\"connect\", () => {\n console.log(\"[LiveChat] Connected\");\n });\n\n this.socket.on(\"disconnect\", () => {\n console.log(\"[LiveChat] Disconnected\");\n });\n\n this.socket.on(\n \"livechat:queued\",\n (data: { liveChatSessionId: string; position: number }) => {\n this.liveChatSessionId = data.liveChatSessionId;\n this.setState(\"queued\");\n this.emit(\"queued\", data);\n },\n );\n\n this.socket.on(\"livechat:queue-update\", (data: { position: number }) => {\n this.emit(\"queue-update\", data);\n });\n\n this.socket.on(\"livechat:accepted\", (data: { operatorName: string }) => {\n this.setState(\"live\");\n this.emit(\"accepted\", data);\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.socket.on(\"livechat:message\", (data: any) => {\n this.emit(\"message\", {\n id: data.id,\n content: data.content,\n senderType: data.senderType,\n timestamp: data.timestamp,\n });\n });\n\n this.socket.on(\"livechat:ended\", (data: { endedBy: string }) => {\n this.setState(\"ended\");\n this.emit(\"ended\", data);\n });\n\n this.socket.on(\"livechat:handback-ai\", () => {\n this.setState(\"ai\");\n this.emit(\"handback-ai\", undefined);\n });\n\n this.socket.on(\n \"livechat:system\",\n (data: { message: string; type: string }) => {\n this.emit(\"system\", data);\n },\n );\n\n this.socket.on(\n \"livechat:error\",\n (data: { code: string; message: string }) => {\n this.emit(\"error\", data);\n },\n );\n\n this.socket.on(\n \"livechat:rejoin-success\",\n (data: {\n state: string;\n operatorName?: string;\n position?: number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n messages: any[];\n }) => {\n this.emit(\"rejoin-success\", data);\n },\n );\n\n this.socket.on(\"livechat:rejoin-failed\", (data: { reason: string }) => {\n this.emit(\"rejoin-failed\", data);\n });\n\n this.socket.on(\"livechat:typing\", (data: { isTyping: boolean }) => {\n this.emit(\"typing\", data);\n });\n }\n\n /**\n * Request a handoff from AI to a human operator.\n *\n * @param params - Visitor info and AI conversation history\n */\n requestHandoff(params: {\n visitorName?: string;\n visitorEmail?: string;\n aiChatHistory: unknown[];\n }): void {\n this.setState(\"requesting\");\n this.socket?.emit(\"livechat:request\", {\n projectId: this.config.projectId,\n sessionId: this.config.visitorSessionId,\n ...params,\n });\n }\n\n /**\n * Send a message to the operator.\n *\n * @param content - Message text\n */\n sendMessage(content: string): void {\n if (!this.liveChatSessionId) return;\n this.socket?.emit(\"livechat:message\", {\n liveChatSessionId: this.liveChatSessionId,\n content,\n });\n }\n\n /**\n * Send a typing indicator to the operator.\n *\n * @param isTyping - `true` if the visitor is currently typing\n */\n sendTyping(isTyping: boolean): void {\n if (!this.liveChatSessionId) return;\n this.socket?.emit(\"livechat:typing\", {\n liveChatSessionId: this.liveChatSessionId,\n isTyping,\n });\n }\n\n /**\n * Cancel a pending handoff request.\n *\n * @param liveChatSessionId - The session to cancel\n */\n cancelRequest(liveChatSessionId: string): void {\n this.socket?.emit(\"livechat:cancel\", { liveChatSessionId });\n }\n\n /**\n * End the current live-chat session.\n */\n endChat(): void {\n if (!this.liveChatSessionId) return;\n this.socket?.emit(\"livechat:end\", {\n liveChatSessionId: this.liveChatSessionId,\n });\n }\n\n /**\n * Submit a satisfaction rating for the ended session.\n *\n * @param rating - `\"positive\"` or `\"negative\"`\n * @param comment - Optional free-text feedback\n */\n submitRating(rating: \"positive\" | \"negative\", comment?: string): void {\n if (!this.liveChatSessionId) return;\n this.socket?.emit(\"livechat:rating\", {\n liveChatSessionId: this.liveChatSessionId,\n rating,\n comment,\n });\n }\n\n /**\n * Rejoin an existing session (e.g. after a page refresh).\n *\n * @param liveChatSessionId - The session to rejoin\n */\n rejoinSession(liveChatSessionId: string): void {\n this.liveChatSessionId = liveChatSessionId;\n this.socket?.emit(\"livechat:rejoin\", { liveChatSessionId });\n }\n\n /**\n * Disconnect the socket and reset state.\n */\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this.liveChatSessionId = null;\n this.state = \"ai\";\n }\n\n /**\n * Get the current live-chat state.\n */\n getState(): LiveChatState {\n return this.state;\n }\n\n /**\n * Get the current live-chat session ID (if any).\n */\n getSessionId(): string | null {\n return this.liveChatSessionId;\n }\n\n // --- Event emitter ---\n\n private setState(state: LiveChatState): void {\n this.state = state;\n this.emit(\"state-change\", state);\n }\n\n /**\n * Subscribe to a live-chat event.\n *\n * @param event - Event name\n * @param handler - Callback\n */\n on<K extends keyof LiveChatEventMap>(\n event: K,\n handler: LiveChatEventMap[K],\n ): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n }\n\n /**\n * Unsubscribe from a live-chat event.\n *\n * @param event - Event name\n * @param handler - The same callback reference passed to `on()`\n */\n off<K extends keyof LiveChatEventMap>(\n event: K,\n handler: LiveChatEventMap[K],\n ): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private emit(event: string, data: any): void {\n this.listeners.get(event)?.forEach((handler) => handler(data));\n }\n}\n"]}