@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/json-render/catalog.ts","../src/json-render/registry.tsx","../src/json-render/JsonRenderResult.tsx"],"names":["z","defineCatalog","schema","shadcnComponentDefinitions","defineRegistry","jsx","shadcnComponents","VisualizationRenderer","useMemo","useRef","useCallback","jsxs","JSONUIProvider","Renderer","useStateValue","Fragment","useValidation","useEffect"],"mappings":"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","file":"chunk-J2H6MLQF.cjs","sourcesContent":["/**\n * json-render catalog for the widget.\n * Uses @json-render/shadcn standard component definitions.\n */\n\nimport { defineCatalog } from \"@json-render/core\";\nimport { schema } from \"@json-render/react/schema\";\nimport { shadcnComponentDefinitions } from \"@json-render/shadcn/catalog\";\nimport { z } from \"zod\";\n\n// ── Chart prop schemas ──────────────────────────────────────\nconst seriesSchema = z.object({\n dataKey: z.string(),\n label: z.string(),\n color: z.string().nullable().optional(),\n type: z.enum([\"line\", \"bar\", \"area\"]).nullable().optional(),\n});\n\nconst chartConfigSchema = z.object({\n xAxis: z.string().nullable().optional(),\n series: z.array(seriesSchema),\n showGrid: z.boolean().nullable().optional(),\n showLegend: z.boolean().nullable().optional(),\n stacked: z.boolean().nullable().optional(),\n valueFormatter: z\n .enum([\"currency\", \"percent\", \"number\", \"compact\"])\n .nullable()\n .optional(),\n});\n\nconst chartBaseProps = {\n title: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n config: chartConfigSchema,\n height: z.number().nullable().optional(),\n};\n\nexport const catalog = defineCatalog(schema, {\n components: {\n // ── Layout ──────────────────────────────────────────────\n Card: shadcnComponentDefinitions.Card,\n Stack: shadcnComponentDefinitions.Stack,\n Grid: shadcnComponentDefinitions.Grid,\n Separator: shadcnComponentDefinitions.Separator,\n Tabs: shadcnComponentDefinitions.Tabs,\n Accordion: shadcnComponentDefinitions.Accordion,\n Collapsible: shadcnComponentDefinitions.Collapsible,\n Dialog: shadcnComponentDefinitions.Dialog,\n Drawer: shadcnComponentDefinitions.Drawer,\n Carousel: shadcnComponentDefinitions.Carousel,\n\n // ── Typography ──────────────────────────────────────────\n Heading: shadcnComponentDefinitions.Heading,\n Text: shadcnComponentDefinitions.Text,\n Badge: shadcnComponentDefinitions.Badge,\n Link: shadcnComponentDefinitions.Link,\n Alert: shadcnComponentDefinitions.Alert,\n\n // ── Media ───────────────────────────────────────────────\n Image: shadcnComponentDefinitions.Image,\n Avatar: shadcnComponentDefinitions.Avatar,\n\n // ── Data ────────────────────────────────────────────────\n Table: shadcnComponentDefinitions.Table,\n\n // ── Charts & Visualization ────────────────────────────\n LineChart: {\n props: z.object(chartBaseProps),\n description: \"Line chart for trends over time. Provide data array + config.xAxis + config.series.\",\n example: {\n title: \"Monthly Sales\",\n data: [{ month: \"Jan\", sales: 100 }, { month: \"Feb\", sales: 150 }],\n config: { xAxis: \"month\", series: [{ dataKey: \"sales\", label: \"Sales\" }] },\n },\n },\n BarChart: {\n props: z.object(chartBaseProps),\n description: \"Bar chart for comparing categories. Provide data array + config.xAxis + config.series.\",\n example: {\n title: \"Product Comparison\",\n data: [{ product: \"A\", revenue: 500 }, { product: \"B\", revenue: 300 }],\n config: { xAxis: \"product\", series: [{ dataKey: \"revenue\", label: \"Revenue\" }] },\n },\n },\n PieChart: {\n props: z.object({\n title: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n data: z.array(z.record(z.string(), z.unknown())),\n dataKey: z.string(),\n nameKey: z.string().nullable().optional(),\n height: z.number().nullable().optional(),\n }),\n description: \"Pie chart for proportional breakdown. Each data item needs a name and a value field.\",\n example: {\n title: \"Market Share\",\n data: [{ name: \"Product A\", value: 60 }, { name: \"Product B\", value: 40 }],\n dataKey: \"value\",\n nameKey: \"name\",\n },\n },\n AreaChart: {\n props: z.object(chartBaseProps),\n description: \"Area chart for cumulative values over time with gradient fills.\",\n example: {\n title: \"Traffic Volume\",\n data: [{ day: \"Mon\", visits: 200 }, { day: \"Tue\", visits: 350 }],\n config: { xAxis: \"day\", series: [{ dataKey: \"visits\", label: \"Visits\" }] },\n },\n },\n MetricCards: {\n props: z.object({\n title: z.string().nullable().optional(),\n metrics: z.array(\n z.object({\n label: z.string(),\n value: z.string(),\n unit: z.string().nullable().optional(),\n trend: z.string().nullable().optional(),\n trendDirection: z.enum([\"up\", \"down\", \"neutral\"]).nullable().optional(),\n description: z.string().nullable().optional(),\n }),\n ),\n }),\n description: \"KPI metric cards grid with big numbers and optional trend indicators.\",\n example: {\n metrics: [\n { label: \"Revenue\", value: \"$1.2M\", trend: \"+12%\", trendDirection: \"up\" },\n { label: \"Users\", value: \"45K\", trend: \"-3%\", trendDirection: \"down\" },\n ],\n },\n },\n ComparisonTable: {\n props: z.object({\n title: z.string().nullable().optional(),\n items: z.array(\n z.object({\n name: z.string(),\n highlight: z.boolean().nullable().optional(),\n features: z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])),\n }),\n ),\n fields: z.array(\n z.object({\n key: z.string(),\n label: z.string(),\n type: z.enum([\"text\", \"boolean\", \"rating\"]).nullable().optional(),\n }),\n ),\n }),\n description: \"Side-by-side comparison table. Items are columns, fields are rows.\",\n example: {\n title: \"Plan Comparison\",\n items: [\n { name: \"Basic\", features: { price: \"$9/mo\", storage: \"10GB\", support: true } },\n { name: \"Pro\", highlight: true, features: { price: \"$29/mo\", storage: \"100GB\", support: true } },\n ],\n fields: [\n { key: \"price\", label: \"Price\", type: \"text\" },\n { key: \"storage\", label: \"Storage\", type: \"text\" },\n { key: \"support\", label: \"Support\", type: \"boolean\" },\n ],\n },\n },\n Timeline: {\n props: z.object({\n title: z.string().nullable().optional(),\n events: z.array(\n z.object({\n date: z.string().nullable().optional(),\n title: z.string(),\n description: z.string().nullable().optional(),\n status: z.enum([\"completed\", \"current\", \"upcoming\"]).nullable().optional(),\n }),\n ),\n }),\n description: \"Vertical timeline for chronological events or process steps.\",\n example: {\n events: [\n { title: \"Order Placed\", date: \"Jan 1\", status: \"completed\" },\n { title: \"Shipped\", date: \"Jan 3\", status: \"current\" },\n { title: \"Delivered\", status: \"upcoming\" },\n ],\n },\n },\n ProgressBars: {\n props: z.object({\n title: z.string().nullable().optional(),\n goals: z.array(\n z.object({\n label: z.string(),\n current: z.number(),\n target: z.number(),\n unit: z.string().nullable().optional(),\n }),\n ),\n }),\n description: \"Progress bars for goal tracking with current/target values.\",\n example: {\n goals: [\n { label: \"Revenue\", current: 75000, target: 100000, unit: \"$\" },\n { label: \"Users\", current: 800, target: 1000 },\n ],\n },\n },\n\n // ── Form ────────────────────────────────────────────────\n Input: shadcnComponentDefinitions.Input,\n Textarea: shadcnComponentDefinitions.Textarea,\n Select: shadcnComponentDefinitions.Select,\n Checkbox: shadcnComponentDefinitions.Checkbox,\n Radio: shadcnComponentDefinitions.Radio,\n Switch: shadcnComponentDefinitions.Switch,\n Slider: shadcnComponentDefinitions.Slider,\n Button: shadcnComponentDefinitions.Button,\n ButtonGroup: shadcnComponentDefinitions.ButtonGroup,\n Toggle: shadcnComponentDefinitions.Toggle,\n ToggleGroup: shadcnComponentDefinitions.ToggleGroup,\n DropdownMenu: shadcnComponentDefinitions.DropdownMenu,\n\n // ── Feedback ────────────────────────────────────────────\n Progress: shadcnComponentDefinitions.Progress,\n Spinner: shadcnComponentDefinitions.Spinner,\n Skeleton: shadcnComponentDefinitions.Skeleton,\n Tooltip: shadcnComponentDefinitions.Tooltip,\n Popover: shadcnComponentDefinitions.Popover,\n\n // ── Navigation ──────────────────────────────────────────\n Pagination: shadcnComponentDefinitions.Pagination,\n },\n\n actions: {\n navigate_url: {\n params: z.object({\n url: z.string(),\n target: z.enum([\"_self\", \"_blank\"]).default(\"_blank\"),\n }),\n description: \"Open a URL in a new tab or the current tab.\",\n },\n send_message: {\n params: z.object({\n message: z.string(),\n }),\n description: \"Send a follow-up chat message on behalf of the user.\",\n },\n call_api: {\n params: z.object({\n endpoint: z.string(),\n method: z.enum([\"GET\", \"POST\", \"PUT\", \"DELETE\"]).default(\"POST\"),\n body: z.record(z.string(), z.unknown()).optional(),\n }),\n description: \"Make a proxied API call through the platform backend.\",\n },\n },\n});\n\nexport type PlatformCatalog = typeof catalog;\nexport type PlatformSpec = typeof catalog._specType;\n","\"use client\";\n\n/**\n * json-render registry for the widget.\n * Uses @json-render/shadcn standard component implementations.\n * Includes custom chart & visualization components.\n */\n\nimport { defineRegistry } from \"@json-render/react\";\nimport { shadcnComponents } from \"@json-render/shadcn\";\nimport { VisualizationRenderer } from \"../tools/VisualizationRenderer\";\nimport type { VisualizationSpec } from \"../tools/VisualizationRenderer\";\nimport { catalog } from \"./catalog\";\n\nexport const { registry, handlers: createActionHandlers } = defineRegistry(\n catalog,\n {\n components: {\n // ── Layout ──────────────────────────────────────────────\n Card: (p) => <div className=\"w-full [&>div]:border-0 [&>div]:shadow-none\">{shadcnComponents.Card(p)}</div>,\n Stack: shadcnComponents.Stack,\n Grid: shadcnComponents.Grid,\n Separator: shadcnComponents.Separator,\n Tabs: shadcnComponents.Tabs,\n Accordion: shadcnComponents.Accordion,\n Collapsible: shadcnComponents.Collapsible,\n Dialog: shadcnComponents.Dialog,\n Drawer: shadcnComponents.Drawer,\n Carousel: shadcnComponents.Carousel,\n\n // ── Typography ──────────────────────────────────────────\n Heading: shadcnComponents.Heading,\n Text: shadcnComponents.Text,\n Badge: shadcnComponents.Badge,\n Link: shadcnComponents.Link,\n Alert: shadcnComponents.Alert,\n\n // ── Media ───────────────────────────────────────────────\n Image: shadcnComponents.Image,\n Avatar: shadcnComponents.Avatar,\n\n // ── Data ────────────────────────────────────────────────\n Table: shadcnComponents.Table,\n\n // ── Charts & Visualization ────────────────────────────\n LineChart: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"line_chart\",\n title: props.title ?? undefined,\n description: props.description ?? undefined,\n data: props.data as VisualizationSpec[\"data\"],\n config: {\n xAxis: props.config?.xAxis ?? undefined,\n series: props.config?.series?.map((s) => ({\n dataKey: s.dataKey,\n label: s.label,\n color: s.color ?? undefined,\n })),\n showGrid: props.config?.showGrid ?? undefined,\n showLegend: props.config?.showLegend ?? undefined,\n stacked: props.config?.stacked ?? undefined,\n valueFormatter: props.config?.valueFormatter ?? undefined,\n },\n }}\n />\n ),\n BarChart: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"bar_chart\",\n title: props.title ?? undefined,\n description: props.description ?? undefined,\n data: props.data as VisualizationSpec[\"data\"],\n config: {\n xAxis: props.config?.xAxis ?? undefined,\n series: props.config?.series?.map((s) => ({\n dataKey: s.dataKey,\n label: s.label,\n color: s.color ?? undefined,\n })),\n showGrid: props.config?.showGrid ?? undefined,\n showLegend: props.config?.showLegend ?? undefined,\n stacked: props.config?.stacked ?? undefined,\n valueFormatter: props.config?.valueFormatter ?? undefined,\n },\n }}\n />\n ),\n PieChart: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"pie_chart\",\n title: props.title ?? undefined,\n description: props.description ?? undefined,\n data: props.data as VisualizationSpec[\"data\"],\n config: {\n series: [{ dataKey: props.dataKey, label: props.dataKey }],\n },\n }}\n />\n ),\n AreaChart: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"area_chart\",\n title: props.title ?? undefined,\n description: props.description ?? undefined,\n data: props.data as VisualizationSpec[\"data\"],\n config: {\n xAxis: props.config?.xAxis ?? undefined,\n series: props.config?.series?.map((s) => ({\n dataKey: s.dataKey,\n label: s.label,\n color: s.color ?? undefined,\n })),\n showGrid: props.config?.showGrid ?? undefined,\n showLegend: props.config?.showLegend ?? undefined,\n stacked: props.config?.stacked ?? undefined,\n valueFormatter: props.config?.valueFormatter ?? undefined,\n },\n }}\n />\n ),\n MetricCards: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"metric_cards\",\n title: props.title ?? undefined,\n metrics: props.metrics?.map((m) => ({\n label: m.label,\n value: m.value,\n unit: m.unit ?? undefined,\n trend: m.trend ?? undefined,\n trendDirection: m.trendDirection ?? undefined,\n description: m.description ?? undefined,\n })),\n }}\n />\n ),\n ComparisonTable: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"comparison\",\n title: props.title ?? undefined,\n items: props.items?.map((item) => ({\n name: item.name,\n highlight: item.highlight ?? undefined,\n features: item.features as Record<string, string | boolean | number>,\n })),\n comparisonFields: props.fields?.map((f) => ({\n key: f.key,\n label: f.label,\n type: f.type ?? undefined,\n })),\n }}\n />\n ),\n Timeline: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"timeline\",\n title: props.title ?? undefined,\n events: props.events?.map((e) => ({\n date: e.date ?? undefined,\n title: e.title,\n description: e.description ?? undefined,\n status: e.status ?? undefined,\n })),\n }}\n />\n ),\n ProgressBars: ({ props }) => (\n <VisualizationRenderer\n spec={{\n type: \"progress\",\n title: props.title ?? undefined,\n goals: props.goals?.map((g) => ({\n label: g.label,\n current: g.current,\n target: g.target,\n unit: g.unit ?? undefined,\n })),\n }}\n />\n ),\n\n // ── Form (wrapped with w-full for proper layout) ────────\n Input: (p) => <div className=\"w-full\">{shadcnComponents.Input(p)}</div>,\n Textarea: (p) => <div className=\"w-full\">{shadcnComponents.Textarea(p)}</div>,\n Select: (p) => <div className=\"w-full\">{shadcnComponents.Select(p)}</div>,\n Checkbox: shadcnComponents.Checkbox,\n Radio: shadcnComponents.Radio,\n Switch: shadcnComponents.Switch,\n Slider: shadcnComponents.Slider,\n Button: shadcnComponents.Button,\n ButtonGroup: shadcnComponents.ButtonGroup,\n Toggle: shadcnComponents.Toggle,\n ToggleGroup: shadcnComponents.ToggleGroup,\n DropdownMenu: shadcnComponents.DropdownMenu,\n\n // ── Feedback ────────────────────────────────────────────\n Progress: shadcnComponents.Progress,\n Spinner: shadcnComponents.Spinner,\n Skeleton: shadcnComponents.Skeleton,\n Tooltip: shadcnComponents.Tooltip,\n Popover: shadcnComponents.Popover,\n\n // ── Navigation ──────────────────────────────────────────\n Pagination: shadcnComponents.Pagination,\n },\n\n actions: {\n navigate_url: async (params) => {\n if (params?.url) {\n window.open(params.url, params.target ?? \"_blank\");\n }\n },\n send_message: async (params) => {\n console.log(\"[json-render] send_message action:\", params?.message);\n },\n call_api: async (params) => {\n const p = params as Record<string, unknown>;\n const url = (p?.endpoint || p?.url) as string | undefined;\n if (!url) {\n console.warn(\"[json-render] call_api: missing endpoint/url\");\n return;\n }\n const method = ((params?.method as string) || \"POST\").toUpperCase();\n try {\n const res = await fetch(url, {\n method,\n headers: { \"Content-Type\": \"application/json\" },\n ...(method !== \"GET\" && params?.body\n ? { body: JSON.stringify(params.body) }\n : {}),\n });\n const data = await res.json().catch(() => null);\n console.log(\"[json-render] call_api response:\", res.status, data);\n return data;\n } catch (err) {\n console.error(\"[json-render] call_api error:\", err);\n }\n },\n },\n },\n);\n","\"use client\";\n\n/**\n * JsonRenderResult — wrapper component for rendering json-render specs\n * inside tool results (both frontend dashboard and widget).\n */\n\nimport type { Spec } from \"@json-render/core\";\nimport {\n JSONUIProvider,\n Renderer,\n useStateValue,\n useValidation,\n} from \"@json-render/react\";\nimport { useMemo, useRef, useCallback, useEffect } from \"react\";\nimport { registry } from \"./registry\";\n\n/** Normalize a spec to the { root: string, elements: {...} } format. */\nfunction normalizeSpec(raw: Record<string, unknown>): Spec {\n if (typeof raw.root === \"string\" && raw.elements) {\n return raw as unknown as Spec;\n }\n const elements: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (\n value &&\n typeof value === \"object\" &&\n \"type\" in (value as Record<string, unknown>)\n ) {\n elements[key] = value;\n }\n }\n return { root: \"root\", elements } as unknown as Spec;\n}\n\n/** Extract the `state` field from a spec and flatten into state paths. */\nfunction extractSpecState(\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const state = raw.state as Record<string, unknown> | undefined;\n if (!state || typeof state !== \"object\") return {};\n\n const result: Record<string, unknown> = {};\n function walk(obj: Record<string, unknown>, prefix: string) {\n for (const [key, value] of Object.entries(obj)) {\n const path = `${prefix}/${key}`;\n result[path] = value;\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n walk(value as Record<string, unknown>, path);\n }\n }\n }\n walk(state, \"\");\n return result;\n}\n\n/** Deeply resolve $state expressions in a value tree. */\nfunction deepResolve(\n value: unknown,\n stateMap: Record<string, unknown>,\n): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n if (Object.keys(obj).length === 1 && typeof obj.$state === \"string\") {\n return stateMap[obj.$state];\n }\n const resolved: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n resolved[key] = deepResolve(val, stateMap);\n }\n return resolved;\n }\n if (Array.isArray(value)) {\n return value.map((item) => deepResolve(item, stateMap));\n }\n return value;\n}\n\ninterface FormConfig {\n successMessage?: string;\n errorMessage?: string;\n hideFormAfter?: boolean;\n}\n\ninterface JsonRenderResultProps {\n spec: Spec;\n data: unknown;\n onSendMessage?: (message: string) => void;\n className?: string;\n conversationMessages?: Array<{ role: string; content: string }>;\n /** API key for authenticated requests (form submissions etc.) */\n apiKey?: string;\n}\n\nexport function JsonRenderResult({\n spec: rawSpec,\n data,\n onSendMessage,\n className,\n conversationMessages,\n apiKey,\n}: JsonRenderResultProps) {\n const rawSpecObj = rawSpec as unknown as Record<string, unknown>;\n const spec = useMemo(() => normalizeSpec(rawSpecObj), [rawSpecObj]);\n\n // Extract _formConfig from spec (set by the Form Settings panel)\n const formConfig = useMemo(\n () => (rawSpecObj._formConfig as FormConfig) || null,\n [rawSpecObj],\n );\n\n const initialState = useMemo(() => {\n const specState = extractSpecState(rawSpecObj);\n return {\n \"/data\": data,\n ...(conversationMessages\n ? { \"/conversationMessages\": conversationMessages }\n : {}),\n ...specState,\n };\n }, [data, rawSpecObj, conversationMessages]);\n\n // Ref for state tracking (updated via onStateChange)\n const stateRef = useRef<Record<string, unknown>>(initialState);\n const validateRef = useRef<(() => boolean) | null>(null);\n\n const handleStateChange = useCallback(\n (changes: Array<{ path: string; value: unknown }>) => {\n for (const { path, value } of changes) {\n stateRef.current[path] = value;\n }\n },\n [],\n );\n\n const handlers = useMemo(\n () => ({\n navigate_url: async (params: Record<string, unknown>) => {\n if (params?.url) {\n window.open(\n params.url as string,\n (params.target as string) ?? \"_blank\",\n );\n }\n },\n\n send_message: async (params: Record<string, unknown>) => {\n if (\n onSendMessage &&\n params?.message &&\n typeof params.message === \"string\"\n ) {\n onSendMessage(params.message);\n }\n },\n\n call_api: async (params: Record<string, unknown>) => {\n if (validateRef.current) {\n const isValid = validateRef.current();\n if (!isValid) {\n throw new Error(\"Validation failed\");\n }\n }\n\n const resolved = deepResolve(\n params,\n stateRef.current,\n ) as Record<string, unknown>;\n\n const url = (resolved?.endpoint || resolved?.url) as\n | string\n | undefined;\n if (!url) {\n throw new Error(\"Missing endpoint/url in call_api params\");\n }\n const method = (\n (resolved?.method as string) || \"POST\"\n ).toUpperCase();\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n\n const res = await fetch(url, {\n method,\n headers,\n credentials: \"include\",\n ...(method !== \"GET\" && resolved?.body\n ? { body: JSON.stringify(resolved.body) }\n : {}),\n });\n\n if (!res.ok) {\n const errBody = await res.text().catch(() => \"\");\n throw new Error(\n errBody || `Request failed with status ${res.status}`,\n );\n }\n\n const responseData = await res.json().catch(() => null);\n return responseData;\n },\n }),\n [onSendMessage, apiKey],\n );\n\n return (\n <div className={className}>\n <JSONUIProvider\n registry={registry}\n initialState={initialState}\n handlers={handlers}\n onStateChange={handleStateChange}\n >\n <ValidationBridge validateRef={validateRef} />\n {formConfig ? (\n <FormFeedbackWrapper formConfig={formConfig}>\n <Renderer spec={spec} registry={registry} />\n </FormFeedbackWrapper>\n ) : (\n <Renderer spec={spec} registry={registry} />\n )}\n </JSONUIProvider>\n </div>\n );\n}\n\n/** Reads /formSubmitted and /formError from state and shows feedback UI.\n * Optionally hides form children after success. */\nfunction FormFeedbackWrapper({\n formConfig,\n children,\n}: {\n formConfig: FormConfig;\n children: React.ReactNode;\n}) {\n const formSubmitted = useStateValue(\"/formSubmitted\");\n const formError = useStateValue(\"/formError\");\n\n // Only show feedback when state has been explicitly set to truthy values\n const isSubmitted = formSubmitted === true;\n const hasError = !!formError && formError !== \"\" && formError !== false;\n\n if (isSubmitted && formConfig.hideFormAfter) {\n return (\n <div\n className=\"rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-950/30\"\n role=\"alert\"\n >\n <p className=\"text-sm font-medium text-green-800 dark:text-green-200\">\n {formConfig.successMessage || \"Submitted successfully!\"}\n </p>\n </div>\n );\n }\n\n return (\n <>\n {isSubmitted && formConfig.successMessage && (\n <div\n className=\"rounded-lg border border-green-200 bg-green-50 p-3 mb-3 dark:border-green-800 dark:bg-green-950/30\"\n role=\"alert\"\n >\n <p className=\"text-sm font-medium text-green-800 dark:text-green-200\">\n {formConfig.successMessage}\n </p>\n </div>\n )}\n {hasError && formConfig.errorMessage && (\n <div\n className=\"rounded-lg border border-red-200 bg-red-50 p-3 mb-3 dark:border-red-800 dark:bg-red-950/30\"\n role=\"alert\"\n >\n <p className=\"text-sm font-medium text-red-800 dark:text-red-200\">\n {formConfig.errorMessage}\n </p>\n </div>\n )}\n {children}\n </>\n );\n}\n\n/** Bridges the validation context to the parent's ref. */\nfunction ValidationBridge({\n validateRef,\n}: {\n validateRef: React.RefObject<(() => boolean) | null>;\n}) {\n const validation = useValidation();\n\n useEffect(() => {\n if (validation?.validateAll) {\n validateRef.current = () => validation.validateAll();\n }\n return () => {\n validateRef.current = null;\n };\n }, [validation, validateRef]);\n\n return null;\n}\n"]}
@@ -0,0 +1,198 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var react$1 = require('@ai-sdk/react');
7
+ var ai = require('ai');
8
+
9
+ // src/providers/SlotsContext.tsx
10
+ var SlotsContext = react.createContext({});
11
+ function SlotsProvider({ slots = {}, children }) {
12
+ return /* @__PURE__ */ jsxRuntime.jsx(SlotsContext.Provider, { value: slots, children });
13
+ }
14
+ function useSlots() {
15
+ return react.useContext(SlotsContext);
16
+ }
17
+ function useSlot(name) {
18
+ const slots = react.useContext(SlotsContext);
19
+ return slots[name];
20
+ }
21
+ function renderSlot(name, props, DefaultComponent, slots) {
22
+ const Override = slots[name];
23
+ if (Override) {
24
+ return /* @__PURE__ */ jsxRuntime.jsx(Override, { ...props, DefaultComponent });
25
+ }
26
+ return /* @__PURE__ */ jsxRuntime.jsx(DefaultComponent, { ...props });
27
+ }
28
+ var SESSION_KEY_PREFIX = "aigentyc-session-";
29
+ var MESSAGE_KEY_PREFIX = "aigentyc-messages-";
30
+ function getOrCreateSessionId(projectId) {
31
+ if (typeof window === "undefined") return crypto.randomUUID();
32
+ const key = SESSION_KEY_PREFIX + projectId;
33
+ try {
34
+ const stored = sessionStorage.getItem(key);
35
+ if (stored) return stored;
36
+ const id = crypto.randomUUID();
37
+ sessionStorage.setItem(key, id);
38
+ return id;
39
+ } catch {
40
+ return crypto.randomUUID();
41
+ }
42
+ }
43
+ function persistMessages(projectId, messages) {
44
+ if (typeof window === "undefined") return;
45
+ try {
46
+ localStorage.setItem(MESSAGE_KEY_PREFIX + projectId, JSON.stringify(messages));
47
+ } catch {
48
+ }
49
+ }
50
+ function loadPersistedMessages(projectId) {
51
+ if (typeof window === "undefined") return [];
52
+ try {
53
+ const raw = localStorage.getItem(MESSAGE_KEY_PREFIX + projectId);
54
+ return raw ? JSON.parse(raw) : [];
55
+ } catch {
56
+ return [];
57
+ }
58
+ }
59
+ function clearPersistedMessages(projectId) {
60
+ if (typeof window === "undefined") return;
61
+ try {
62
+ localStorage.removeItem(MESSAGE_KEY_PREFIX + projectId);
63
+ } catch {
64
+ }
65
+ }
66
+ var ChatContext = react.createContext(null);
67
+ function ChatContextProvider({
68
+ config,
69
+ callbacks,
70
+ children
71
+ }) {
72
+ const projectId = config.projectId || "default";
73
+ const [sessionId, setSessionId] = react.useState(() => getOrCreateSessionId(projectId));
74
+ const callbacksRef = react.useRef(callbacks);
75
+ callbacksRef.current = callbacks;
76
+ const initialMessages = react.useMemo(
77
+ () => loadPersistedMessages(projectId),
78
+ // eslint-disable-next-line react-hooks/exhaustive-deps
79
+ []
80
+ );
81
+ const transport = react.useMemo(
82
+ () => new ai.DefaultChatTransport({
83
+ api: `${config.apiEndpoint || ""}/api/kb/chat`,
84
+ headers: config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : void 0,
85
+ body: { projectId: config.projectId, sessionId }
86
+ }),
87
+ [config.apiEndpoint, config.apiKey, config.projectId, sessionId]
88
+ );
89
+ const {
90
+ messages,
91
+ sendMessage: sdkSendMessage,
92
+ status: sdkStatus,
93
+ error,
94
+ stop,
95
+ setMessages
96
+ } = react$1.useChat({
97
+ id: sessionId,
98
+ messages: initialMessages,
99
+ transport,
100
+ onFinish: (message) => {
101
+ callbacksRef.current?.onMessageReceived?.(message);
102
+ },
103
+ onError: (err) => {
104
+ callbacksRef.current?.onError?.(err);
105
+ }
106
+ });
107
+ const status = error ? "error" : sdkStatus === "streaming" || sdkStatus === "submitted" ? "streaming" : "idle";
108
+ react.useEffect(() => {
109
+ persistMessages(projectId, messages);
110
+ }, [messages, projectId]);
111
+ const activeTools = react.useMemo(() => {
112
+ if (messages.length === 0) return [];
113
+ const last = messages[messages.length - 1];
114
+ if (last.role !== "assistant" || !Array.isArray(last.parts)) return [];
115
+ return last.parts.filter((p) => typeof p.type === "string" && p.type.startsWith("tool-")).map((p) => ({
116
+ toolName: p.toolName || p.type.replace("tool-", ""),
117
+ state: p.state || "output-available",
118
+ args: p.args || {},
119
+ result: p.result,
120
+ renderMode: p.renderMode || "inline"
121
+ }));
122
+ }, [messages]);
123
+ const sendMessage = react.useCallback(
124
+ (content) => {
125
+ if (!content.trim()) return;
126
+ callbacksRef.current?.onMessageSent?.({
127
+ id: crypto.randomUUID(),
128
+ role: "user",
129
+ content
130
+ });
131
+ sdkSendMessage({ text: content });
132
+ },
133
+ [sdkSendMessage]
134
+ );
135
+ const stopGeneration = react.useCallback(() => stop(), [stop]);
136
+ const newConversation = react.useCallback(() => {
137
+ setMessages([]);
138
+ clearPersistedMessages(projectId);
139
+ if (typeof window !== "undefined") {
140
+ try {
141
+ sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId);
142
+ } catch {
143
+ }
144
+ }
145
+ setSessionId(getOrCreateSessionId(projectId));
146
+ }, [projectId, setMessages]);
147
+ const clearMessages = react.useCallback(() => {
148
+ setMessages([]);
149
+ clearPersistedMessages(projectId);
150
+ }, [projectId, setMessages]);
151
+ const value = react.useMemo(
152
+ () => ({
153
+ messages,
154
+ status,
155
+ error,
156
+ sessionId,
157
+ config,
158
+ activeTools,
159
+ sendMessage,
160
+ stopGeneration,
161
+ newConversation,
162
+ clearMessages,
163
+ callbacks: callbacksRef.current
164
+ }),
165
+ [
166
+ messages,
167
+ status,
168
+ error,
169
+ sessionId,
170
+ config,
171
+ activeTools,
172
+ sendMessage,
173
+ stopGeneration,
174
+ newConversation,
175
+ clearMessages
176
+ ]
177
+ );
178
+ return /* @__PURE__ */ jsxRuntime.jsx(ChatContext.Provider, { value, children });
179
+ }
180
+ function useChatContext() {
181
+ const ctx = react.useContext(ChatContext);
182
+ if (!ctx) {
183
+ throw new Error(
184
+ "useChatContext must be used within a ChatProvider or ChatContextProvider"
185
+ );
186
+ }
187
+ return ctx;
188
+ }
189
+
190
+ exports.ChatContext = ChatContext;
191
+ exports.ChatContextProvider = ChatContextProvider;
192
+ exports.SlotsProvider = SlotsProvider;
193
+ exports.renderSlot = renderSlot;
194
+ exports.useChatContext = useChatContext;
195
+ exports.useSlot = useSlot;
196
+ exports.useSlots = useSlots;
197
+ //# sourceMappingURL=chunk-J2K7EJYP.cjs.map
198
+ //# sourceMappingURL=chunk-J2K7EJYP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/SlotsContext.tsx","../src/providers/ChatContext.tsx"],"names":["createContext","useContext","jsx","useState","useRef","useMemo","DefaultChatTransport","useChat","useEffect","useCallback"],"mappings":"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","file":"chunk-J2K7EJYP.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n createContext,\n useContext,\n type ReactNode,\n type ComponentType,\n} from \"react\";\n\n/**\n * All available slot names that can be overridden.\n */\nexport type SlotName =\n | \"header\"\n | \"footer\"\n | \"input\"\n | \"welcomePage\"\n | \"userMessage\"\n | \"assistantMessage\"\n | \"systemMessage\"\n | \"loader\"\n | \"feedback\"\n | \"tools\"\n | \"toolRenderers\"\n | \"liveChatPanel\"\n | \"satisfactionRating\"\n | \"visitorIdentityForm\"\n | \"floatingButton\"\n | \"emptyState\";\n\n/**\n * A slot component receives the default component as a prop alongside its own props.\n */\nexport type SlotComponent<P = Record<string, unknown>> = ComponentType<\n P & { DefaultComponent: ComponentType<P> }\n>;\n\n/**\n * Map of slot name to override component.\n */\nexport type SlotMap = Partial<Record<SlotName, SlotComponent<any>>>;\n\nconst SlotsContext = createContext<SlotMap>({});\n\n/** Props for the SlotsProvider component. */\nexport interface SlotsProviderProps {\n /** Slot overrides map */\n slots?: SlotMap;\n children: ReactNode;\n}\n\n/**\n * Provides slot overrides to descendant components.\n * Wrap your chat tree with this provider and pass a `slots` map\n * to replace built-in UI sections.\n */\nexport function SlotsProvider({ slots = {}, children }: SlotsProviderProps) {\n return (\n <SlotsContext.Provider value={slots}>{children}</SlotsContext.Provider>\n );\n}\n\n/**\n * Returns the full SlotMap from context.\n */\nexport function useSlots(): SlotMap {\n return useContext(SlotsContext);\n}\n\n/**\n * Returns the override component for the given slot name, or undefined if none is set.\n */\nexport function useSlot<P = Record<string, unknown>>(\n name: SlotName\n): SlotComponent<P> | undefined {\n const slots = useContext(SlotsContext);\n return slots[name] as SlotComponent<P> | undefined;\n}\n\n/**\n * Renders a slot: if an override exists, renders it with `{...props, DefaultComponent}`.\n * Otherwise renders the DefaultComponent with the given props.\n *\n * @param name - The slot name\n * @param props - Props to pass to the component\n * @param DefaultComponent - The built-in fallback component\n */\nexport function renderSlot<P extends Record<string, unknown>>(\n name: SlotName,\n props: P,\n DefaultComponent: ComponentType<P>,\n slots: SlotMap\n): React.ReactElement {\n const Override = slots[name] as SlotComponent<P> | undefined;\n if (Override) {\n return <Override {...props} DefaultComponent={DefaultComponent} />;\n }\n return <DefaultComponent {...props} />;\n}\n","\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useRef,\n useEffect,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport type {\n ChatConfig,\n ChatMessage,\n ChatEventCallbacks,\n} from \"../core/types\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\n\ntype ChatStatus = \"idle\" | \"streaming\" | \"error\";\n\ninterface ActiveTool {\n toolName: string;\n state: \"partial-call\" | \"call\" | \"output-available\";\n args: Record<string, unknown>;\n result?: unknown;\n renderMode: string;\n}\n\nconst SESSION_KEY_PREFIX = \"aigentyc-session-\";\nconst MESSAGE_KEY_PREFIX = \"aigentyc-messages-\";\n\nfunction getOrCreateSessionId(projectId: string): string {\n if (typeof window === \"undefined\") return crypto.randomUUID();\n const key = SESSION_KEY_PREFIX + projectId;\n try {\n const stored = sessionStorage.getItem(key);\n if (stored) return stored;\n const id = crypto.randomUUID();\n sessionStorage.setItem(key, id);\n return id;\n } catch {\n return crypto.randomUUID();\n }\n}\n\nfunction persistMessages(projectId: string, messages: unknown[]): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.setItem(MESSAGE_KEY_PREFIX + projectId, JSON.stringify(messages));\n } catch {\n // Quota or unavailable\n }\n}\n\nfunction loadPersistedMessages(projectId: string): ChatMessage[] {\n if (typeof window === \"undefined\") return [];\n try {\n const raw = localStorage.getItem(MESSAGE_KEY_PREFIX + projectId);\n return raw ? JSON.parse(raw) : [];\n } catch {\n return [];\n }\n}\n\nfunction clearPersistedMessages(projectId: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(MESSAGE_KEY_PREFIX + projectId);\n } catch {\n // ignore\n }\n}\n\nexport interface ChatContextValue {\n messages: ChatMessage[];\n status: ChatStatus;\n error: Error | undefined;\n sessionId: string;\n config: ChatConfig;\n activeTools: ActiveTool[];\n sendMessage: (content: string) => void;\n stopGeneration: () => void;\n newConversation: () => void;\n clearMessages: () => void;\n callbacks?: ChatEventCallbacks;\n}\n\nexport const ChatContext = createContext<ChatContextValue | null>(null);\n\nexport interface ChatContextProviderProps {\n config: ChatConfig;\n callbacks?: ChatEventCallbacks;\n children: ReactNode;\n}\n\n/**\n * Internal provider that manages chat state via @ai-sdk/react `useChat`.\n * Handles message persistence and session management.\n */\nexport function ChatContextProvider({\n config,\n callbacks,\n children,\n}: ChatContextProviderProps) {\n const projectId = config.projectId || \"default\";\n const [sessionId, setSessionId] = useState(() => getOrCreateSessionId(projectId));\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n const initialMessages = useMemo(\n () => loadPersistedMessages(projectId),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const transport = useMemo(\n () =>\n new DefaultChatTransport({\n api: `${config.apiEndpoint || \"\"}/api/kb/chat`,\n headers: config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : undefined,\n body: { projectId: config.projectId, sessionId },\n }),\n [config.apiEndpoint, config.apiKey, config.projectId, sessionId]\n );\n\n const {\n messages,\n sendMessage: sdkSendMessage,\n status: sdkStatus,\n error,\n stop,\n setMessages,\n } = useChat({\n id: sessionId,\n messages: initialMessages as never,\n transport,\n onFinish: (message) => {\n callbacksRef.current?.onMessageReceived?.(message as unknown as ChatMessage);\n },\n onError: (err) => {\n callbacksRef.current?.onError?.(err);\n },\n });\n\n const status: ChatStatus = error\n ? \"error\"\n : sdkStatus === \"streaming\" || sdkStatus === \"submitted\"\n ? \"streaming\"\n : \"idle\";\n\n useEffect(() => {\n persistMessages(projectId, messages);\n }, [messages, projectId]);\n\n const activeTools = useMemo<ActiveTool[]>(() => {\n if (messages.length === 0) return [];\n const last = messages[messages.length - 1] as { role: string; parts?: unknown[] };\n if (last.role !== \"assistant\" || !Array.isArray(last.parts)) return [];\n return (last.parts as Array<Record<string, unknown>>)\n .filter((p) => typeof p.type === \"string\" && (p.type as string).startsWith(\"tool-\"))\n .map((p) => ({\n toolName: (p.toolName as string) || (p.type as string).replace(\"tool-\", \"\"),\n state: (p.state as ActiveTool[\"state\"]) || \"output-available\",\n args: (p.args as Record<string, unknown>) || {},\n result: p.result,\n renderMode: (p.renderMode as string) || \"inline\",\n }));\n }, [messages]);\n\n const sendMessage = useCallback(\n (content: string) => {\n if (!content.trim()) return;\n callbacksRef.current?.onMessageSent?.({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n } as ChatMessage);\n sdkSendMessage({ text: content });\n },\n [sdkSendMessage]\n );\n\n const stopGeneration = useCallback(() => stop(), [stop]);\n\n const newConversation = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId);\n if (typeof window !== \"undefined\") {\n try {\n sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId);\n } catch {\n // ignore\n }\n }\n setSessionId(getOrCreateSessionId(projectId));\n }, [projectId, setMessages]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId);\n }, [projectId, setMessages]);\n\n const value = useMemo<ChatContextValue>(\n () => ({\n messages: messages as unknown as ChatMessage[],\n status,\n error: error as Error | undefined,\n sessionId,\n config,\n activeTools,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n callbacks: callbacksRef.current,\n }),\n [\n messages,\n status,\n error,\n sessionId,\n config,\n activeTools,\n sendMessage,\n stopGeneration,\n newConversation,\n clearMessages,\n ]\n );\n\n return <ChatContext.Provider value={value}>{children}</ChatContext.Provider>;\n}\n\n/**\n * Returns the chat context. Must be used within a `ChatContextProvider`.\n */\nexport function useChatContext(): ChatContextValue {\n const ctx = useContext(ChatContext);\n if (!ctx) {\n throw new Error(\n \"useChatContext must be used within a ChatProvider or ChatContextProvider\"\n );\n }\n return ctx;\n}\n"]}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk525KS5HM_cjs = require('./chunk-525KS5HM.cjs');
5
+ var lucideReact = require('lucide-react');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function Spinner({ className, style, ...props }) {
9
+ return /* @__PURE__ */ jsxRuntime.jsx(
10
+ lucideReact.Loader2Icon,
11
+ {
12
+ role: "status",
13
+ "aria-label": "Loading",
14
+ className: chunk525KS5HM_cjs.cn("size-4 animate-spin", className),
15
+ style: { color: "var(--loader-color, var(--primary, currentColor))", ...style },
16
+ ...props
17
+ }
18
+ );
19
+ }
20
+
21
+ exports.Spinner = Spinner;
22
+ //# sourceMappingURL=chunk-JI5KCSOI.cjs.map
23
+ //# sourceMappingURL=chunk-JI5KCSOI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/spinner.tsx"],"names":["jsx","Loader2Icon","cn"],"mappings":";;;;;;AAMA,SAAS,QAAQ,EAAE,SAAA,EAAW,KAAA,EAAO,GAAG,OAAM,EAAgC;AAC5E,EAAA,uBACEA,cAAA;AAAA,IAACC,uBAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAW,SAAA;AAAA,MACX,SAAA,EAAWC,oBAAA,CAAG,qBAAA,EAAuB,SAAS,CAAA;AAAA,MAC9C,KAAA,EAAO,EAAE,KAAA,EAAO,mDAAA,EAAqD,GAAG,KAAA,EAAM;AAAA,MAC7E,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-JI5KCSOI.cjs","sourcesContent":["\"use client\";\n\nimport { Loader2Icon } from \"lucide-react\"\n\nimport { cn } from \"../core/utils\"\n\nfunction Spinner({ className, style, ...props }: React.ComponentProps<\"svg\">) {\n return (\n <Loader2Icon\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(\"size-4 animate-spin\", className)}\n style={{ color: \"var(--loader-color, var(--primary, currentColor))\", ...style }}\n {...props}\n />\n )\n}\n\nexport { Spinner }\n"]}
@@ -0,0 +1,44 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ // src/core/image-utils.ts
5
+ var MAX_BASE64_SIZE = 100 * 1024;
6
+ function processImagesInHtml(html, options = {}) {
7
+ if (typeof window === "undefined") return html;
8
+ const {
9
+ replaceLargeBase64 = true,
10
+ maxBase64Size = MAX_BASE64_SIZE,
11
+ addLazyLoading = true
12
+ } = options;
13
+ const imgRegex = /<img([^>]*)src=["']([^"']+)["']([^>]*)>/gi;
14
+ return html.replace(imgRegex, (_match, before, src, after) => {
15
+ let newSrc = src;
16
+ let additionalAttrs = "";
17
+ if (src.startsWith("data:image")) {
18
+ const base64Size = src.length * 0.75;
19
+ if (base64Size > maxBase64Size && replaceLargeBase64) {
20
+ console.warn(
21
+ `[ImageUtils] Large base64 image detected (${Math.round(base64Size / 1024)}KB), replacing with placeholder`
22
+ );
23
+ newSrc = createPlaceholderSvg(Math.round(base64Size / 1024));
24
+ additionalAttrs = ` data-original-size="${Math.round(base64Size / 1024)}KB" title="Image too large to display (${Math.round(base64Size / 1024)}KB)"`;
25
+ }
26
+ }
27
+ if (addLazyLoading && !before.includes("loading=") && !after.includes("loading=")) {
28
+ additionalAttrs += ' loading="lazy"';
29
+ }
30
+ return `<img${before}src="${newSrc}"${after}${additionalAttrs}>`;
31
+ });
32
+ }
33
+ function createPlaceholderSvg(sizeKb) {
34
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="200" height="150" viewBox="0 0 200 150">
35
+ <rect width="200" height="150" fill="#f0f0f0"/>
36
+ <text x="100" y="70" text-anchor="middle" fill="#999" font-family="Arial" font-size="12">Image too large</text>
37
+ <text x="100" y="90" text-anchor="middle" fill="#999" font-family="Arial" font-size="10">(${sizeKb}KB)</text>
38
+ </svg>`;
39
+ return `data:image/svg+xml;base64,${btoa(svg)}`;
40
+ }
41
+
42
+ exports.processImagesInHtml = processImagesInHtml;
43
+ //# sourceMappingURL=chunk-JOO6C3XT.cjs.map
44
+ //# sourceMappingURL=chunk-JOO6C3XT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/image-utils.ts"],"names":[],"mappings":";;;AAUA,IAAM,kBAAkB,GAAA,GAAM,IAAA;AAevB,SAAS,mBAAA,CACd,IAAA,EACA,OAAA,GAOI,EAAC,EACG;AAER,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAE1C,EAAA,MAAM;AAAA,IACJ,kBAAA,GAAqB,IAAA;AAAA,IACrB,aAAA,GAAgB,eAAA;AAAA,IAChB,cAAA,GAAiB;AAAA,GACnB,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,2CAAA;AAEjB,EAAA,OAAO,KAAK,OAAA,CAAQ,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAgB,KAAa,KAAA,KAAkB;AACpF,IAAA,IAAI,MAAA,GAAS,GAAA;AACb,IAAA,IAAI,eAAA,GAAkB,EAAA;AAGtB,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,MAAA,MAAM,UAAA,GAAa,IAAI,MAAA,GAAS,IAAA;AAEhC,MAAA,IAAI,UAAA,GAAa,iBAAiB,kBAAA,EAAoB;AACpD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,0CAAA,EAA6C,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,IAAI,CAAC,CAAA,+BAAA;AAAA,SAC5E;AACA,QAAA,MAAA,GAAS,oBAAA,CAAqB,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,IAAI,CAAC,CAAA;AAC3D,QAAA,eAAA,GAAkB,CAAA,qBAAA,EAAwB,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,IAAI,CAAC,CAAA,uCAAA,EAA0C,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,IAAI,CAAC,CAAA,IAAA,CAAA;AAAA,MAChJ;AAAA,IACF;AAGA,IAAA,IACE,cAAA,IACA,CAAC,MAAA,CAAO,QAAA,CAAS,UAAU,KAC3B,CAAC,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,EAC1B;AACA,MAAA,eAAA,IAAmB,iBAAA;AAAA,IACrB;AAEA,IAAA,OAAO,OAAO,MAAM,CAAA,KAAA,EAAQ,MAAM,CAAA,CAAA,EAAI,KAAK,GAAG,eAAe,CAAA,CAAA,CAAA;AAAA,EAC/D,CAAC,CAAA;AACH;AAOA,SAAS,qBAAqB,MAAA,EAAwB;AACpD,EAAA,MAAM,GAAA,GAAM,CAAA;AAAA;AAAA;AAAA,8FAAA,EAGkF,MAAM,CAAA;AAAA,QAAA,CAAA;AAEpG,EAAA,OAAO,CAAA,0BAAA,EAA6B,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC/C","file":"chunk-JOO6C3XT.cjs","sourcesContent":["\"use client\";\n\n/**\n * Utility functions for processing and optimising images in HTML content.\n *\n * Helps prevent performance issues with large images — especially\n * base64-encoded ones returned by tool invocations.\n */\n\n/** Maximum size for base64 images in bytes (100 KB) */\nconst MAX_BASE64_SIZE = 100 * 1024;\n\n/**\n * Process `<img>` tags in an HTML string:\n *\n * - Detect and optionally replace oversized base64 images with SVG placeholders.\n * - Add `loading=\"lazy\"` to every image that does not already have it.\n *\n * All DOM / `btoa` calls are guarded against SSR — when `window` is\n * unavailable the function returns the input unchanged.\n *\n * @param html - Raw HTML string to process\n * @param options - Processing options\n * @returns The processed HTML string\n */\nexport function processImagesInHtml(\n html: string,\n options: {\n /** Replace base64 images exceeding the size limit with placeholders (default `true`) */\n replaceLargeBase64?: boolean;\n /** Size limit in bytes for base64 images (default 100 KB) */\n maxBase64Size?: number;\n /** Add `loading=\"lazy\"` to images (default `true`) */\n addLazyLoading?: boolean;\n } = {},\n): string {\n // Guard: btoa is not available in all SSR runtimes\n if (typeof window === \"undefined\") return html;\n\n const {\n replaceLargeBase64 = true,\n maxBase64Size = MAX_BASE64_SIZE,\n addLazyLoading = true,\n } = options;\n\n const imgRegex = /<img([^>]*)src=[\"']([^\"']+)[\"']([^>]*)>/gi;\n\n return html.replace(imgRegex, (_match, before: string, src: string, after: string) => {\n let newSrc = src;\n let additionalAttrs = \"\";\n\n // Check if it's a base64 image\n if (src.startsWith(\"data:image\")) {\n const base64Size = src.length * 0.75;\n\n if (base64Size > maxBase64Size && replaceLargeBase64) {\n console.warn(\n `[ImageUtils] Large base64 image detected (${Math.round(base64Size / 1024)}KB), replacing with placeholder`,\n );\n newSrc = createPlaceholderSvg(Math.round(base64Size / 1024));\n additionalAttrs = ` data-original-size=\"${Math.round(base64Size / 1024)}KB\" title=\"Image too large to display (${Math.round(base64Size / 1024)}KB)\"`;\n }\n }\n\n // Add loading=\"lazy\" if not already present\n if (\n addLazyLoading &&\n !before.includes(\"loading=\") &&\n !after.includes(\"loading=\")\n ) {\n additionalAttrs += ' loading=\"lazy\"';\n }\n\n return `<img${before}src=\"${newSrc}\"${after}${additionalAttrs}>`;\n });\n}\n\n/**\n * Create a lightweight SVG placeholder for an oversized image.\n *\n * @internal\n */\nfunction createPlaceholderSvg(sizeKb: number): string {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"200\" height=\"150\" viewBox=\"0 0 200 150\">\n <rect width=\"200\" height=\"150\" fill=\"#f0f0f0\"/>\n <text x=\"100\" y=\"70\" text-anchor=\"middle\" fill=\"#999\" font-family=\"Arial\" font-size=\"12\">Image too large</text>\n <text x=\"100\" y=\"90\" text-anchor=\"middle\" fill=\"#999\" font-family=\"Arial\" font-size=\"10\">(${sizeKb}KB)</text>\n </svg>`;\n return `data:image/svg+xml;base64,${btoa(svg)}`;\n}\n"]}
@@ -0,0 +1,78 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+
6
+ // src/core/analytics/interaction-tracker.ts
7
+ var BATCH_SIZE = 5;
8
+ var BATCH_DELAY_MS = 1e3;
9
+ function useInteractionTracker(sessionId, options) {
10
+ const { apiEndpoint, projectId, apiKey, pageUrl } = options;
11
+ const batchRef = react.useRef([]);
12
+ const batchTimeoutRef = react.useRef(null);
13
+ const flushBatch = react.useCallback(async () => {
14
+ if (typeof window === "undefined") return;
15
+ if (batchRef.current.length === 0 || !sessionId) return;
16
+ const interactions = [...batchRef.current];
17
+ batchRef.current = [];
18
+ try {
19
+ const headers = {
20
+ "Content-Type": "application/json"
21
+ };
22
+ if (apiKey) {
23
+ headers["Authorization"] = `Bearer ${apiKey}`;
24
+ }
25
+ const response = await fetch(`${apiEndpoint}/api/kb/interactions`, {
26
+ method: "POST",
27
+ headers,
28
+ credentials: "include",
29
+ body: JSON.stringify({
30
+ projectId,
31
+ sessionId,
32
+ interactions,
33
+ ...pageUrl ? { pageUrl } : {}
34
+ })
35
+ });
36
+ if (!response.ok) {
37
+ const error = await response.json().catch(() => ({}));
38
+ console.error("[Analytics] Failed to track interactions:", error);
39
+ }
40
+ } catch (error) {
41
+ console.error("[Analytics] Error tracking interactions:", error);
42
+ }
43
+ }, [sessionId, apiEndpoint, projectId, apiKey, pageUrl]);
44
+ const trackInteraction = react.useCallback(
45
+ (params) => {
46
+ if (typeof window === "undefined") return;
47
+ if (!sessionId) {
48
+ console.warn("[Analytics] Cannot track interaction: no sessionId");
49
+ return;
50
+ }
51
+ batchRef.current.push(params);
52
+ if (batchTimeoutRef.current) {
53
+ clearTimeout(batchTimeoutRef.current);
54
+ }
55
+ if (batchRef.current.length >= BATCH_SIZE) {
56
+ flushBatch();
57
+ } else {
58
+ batchTimeoutRef.current = setTimeout(flushBatch, BATCH_DELAY_MS);
59
+ }
60
+ },
61
+ [sessionId, flushBatch]
62
+ );
63
+ const flushOnUnmount = react.useCallback(() => {
64
+ if (batchTimeoutRef.current) {
65
+ clearTimeout(batchTimeoutRef.current);
66
+ }
67
+ flushBatch();
68
+ }, [flushBatch]);
69
+ return { trackInteraction, flushOnUnmount };
70
+ }
71
+ function generateSessionId() {
72
+ return `kb-${Date.now()}-${Math.random().toString(36).slice(2)}`;
73
+ }
74
+
75
+ exports.generateSessionId = generateSessionId;
76
+ exports.useInteractionTracker = useInteractionTracker;
77
+ //# sourceMappingURL=chunk-KBGPBUTI.cjs.map
78
+ //# sourceMappingURL=chunk-KBGPBUTI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/analytics/interaction-tracker.ts"],"names":["useRef","useCallback"],"mappings":"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","file":"chunk-KBGPBUTI.cjs","sourcesContent":["\"use client\";\n\n/**\n * Interaction tracking hook and utilities.\n *\n * Tracks user interactions (link clicks, copies, feedback, etc.) and\n * sends them in batches to the KB analytics API.\n *\n * All browser API access is guarded against SSR.\n */\n\nimport { useCallback, useRef } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Supported interaction types for analytics.\n */\nexport type InteractionType =\n | \"link_click\"\n | \"suggestion_click\"\n | \"source_click\"\n | \"copy\"\n | \"expand\"\n | \"collapse\"\n | \"button_click\"\n | \"landing_question_click\"\n | \"tool_ui_interaction\"\n | \"tool_action_click\"\n | \"tool_order_sample\"\n | \"tool_view_details\"\n | \"tool_back_to_list\"\n | \"tool_gallery_image_click\"\n | \"tool_contact_click\"\n | \"tool_pagination_next\"\n | \"tool_pagination_prev\"\n | \"feedback\"\n | \"flag\"\n | \"page_view\";\n\n/**\n * Arbitrary metadata attached to a tracked interaction.\n */\nexport interface InteractionMetadata {\n /** URL that was interacted with */\n url?: string;\n /** Visible text of the element */\n text?: string;\n /** Position / index in a list */\n position?: number;\n /** DOM element type (e.g. `\"a\"`, `\"button\"`) */\n elementType?: string;\n /** Additional key-value pairs */\n [key: string]: unknown;\n}\n\n/**\n * Parameters for a single `trackInteraction` call.\n */\nexport interface TrackInteractionParams {\n /** Interaction type */\n type: InteractionType;\n /** Identifier for the interacted element */\n target?: string;\n /** Human-readable label */\n label?: string;\n /** Extra metadata */\n metadata?: InteractionMetadata;\n /** Associated message ID (for per-message analytics) */\n messageId?: string;\n /** Server event ID (for correlation) */\n eventId?: string;\n}\n\n/**\n * Options for the `useInteractionTracker` hook.\n */\nexport interface UseInteractionTrackerOptions {\n /** Base API endpoint */\n apiEndpoint: string;\n /** Aigentyc project ID */\n projectId: string;\n /** Bearer API key (optional — falls back to session cookies) */\n apiKey?: string;\n /** Current page URL for contextual tracking */\n pageUrl?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/** Batch size before auto-flush */\nconst BATCH_SIZE = 5;\n/** Delay before flushing a partial batch (ms) */\nconst BATCH_DELAY_MS = 1000;\n\n/**\n * React hook to track user interactions via the KB analytics API.\n *\n * Interactions are batched (up to `BATCH_SIZE`) and flushed after\n * `BATCH_DELAY_MS` of inactivity.\n *\n * @param sessionId - Current chat session ID (tracking is skipped if `null`)\n * @param options - API configuration\n * @returns `{ trackInteraction, flushOnUnmount }`\n *\n * @example\n * ```tsx\n * const { trackInteraction, flushOnUnmount } = useInteractionTracker(sessionId, {\n * apiEndpoint: \"https://api.example.com\",\n * projectId: \"abc\",\n * });\n *\n * useEffect(() => () => flushOnUnmount(), [flushOnUnmount]);\n *\n * trackInteraction({ type: \"link_click\", target: \"https://example.com\" });\n * ```\n */\nexport function useInteractionTracker(\n sessionId: string | null,\n options: UseInteractionTrackerOptions,\n) {\n const { apiEndpoint, projectId, apiKey, pageUrl } = options;\n const batchRef = useRef<TrackInteractionParams[]>([]);\n const batchTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const flushBatch = useCallback(async () => {\n if (typeof window === \"undefined\") return;\n if (batchRef.current.length === 0 || !sessionId) return;\n\n const interactions = [...batchRef.current];\n batchRef.current = [];\n\n try {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (apiKey) {\n headers[\"Authorization\"] = `Bearer ${apiKey}`;\n }\n\n const response = await fetch(`${apiEndpoint}/api/kb/interactions`, {\n method: \"POST\",\n headers,\n credentials: \"include\",\n body: JSON.stringify({\n projectId,\n sessionId,\n interactions,\n ...(pageUrl ? { pageUrl } : {}),\n }),\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n console.error(\"[Analytics] Failed to track interactions:\", error);\n }\n } catch (error) {\n console.error(\"[Analytics] Error tracking interactions:\", error);\n }\n }, [sessionId, apiEndpoint, projectId, apiKey, pageUrl]);\n\n /**\n * Track a single interaction. Interactions are batched and flushed\n * automatically.\n */\n const trackInteraction = useCallback(\n (params: TrackInteractionParams) => {\n if (typeof window === \"undefined\") return;\n if (!sessionId) {\n console.warn(\"[Analytics] Cannot track interaction: no sessionId\");\n return;\n }\n\n batchRef.current.push(params);\n\n if (batchTimeoutRef.current) {\n clearTimeout(batchTimeoutRef.current);\n }\n\n if (batchRef.current.length >= BATCH_SIZE) {\n flushBatch();\n } else {\n batchTimeoutRef.current = setTimeout(flushBatch, BATCH_DELAY_MS);\n }\n },\n [sessionId, flushBatch],\n );\n\n /**\n * Flush any pending interactions immediately.\n * Call this in a cleanup effect to avoid losing data on unmount.\n */\n const flushOnUnmount = useCallback(() => {\n if (batchTimeoutRef.current) {\n clearTimeout(batchTimeoutRef.current);\n }\n flushBatch();\n }, [flushBatch]);\n\n return { trackInteraction, flushOnUnmount };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a unique session ID for analytics.\n *\n * Format: `kb-<timestamp>-<random>`\n */\nexport function generateSessionId(): string {\n return `kb-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n"]}
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { useRef, useCallback } from 'react';
3
+
4
+ // src/core/analytics/interaction-tracker.ts
5
+ var BATCH_SIZE = 5;
6
+ var BATCH_DELAY_MS = 1e3;
7
+ function useInteractionTracker(sessionId, options) {
8
+ const { apiEndpoint, projectId, apiKey, pageUrl } = options;
9
+ const batchRef = useRef([]);
10
+ const batchTimeoutRef = useRef(null);
11
+ const flushBatch = useCallback(async () => {
12
+ if (typeof window === "undefined") return;
13
+ if (batchRef.current.length === 0 || !sessionId) return;
14
+ const interactions = [...batchRef.current];
15
+ batchRef.current = [];
16
+ try {
17
+ const headers = {
18
+ "Content-Type": "application/json"
19
+ };
20
+ if (apiKey) {
21
+ headers["Authorization"] = `Bearer ${apiKey}`;
22
+ }
23
+ const response = await fetch(`${apiEndpoint}/api/kb/interactions`, {
24
+ method: "POST",
25
+ headers,
26
+ credentials: "include",
27
+ body: JSON.stringify({
28
+ projectId,
29
+ sessionId,
30
+ interactions,
31
+ ...pageUrl ? { pageUrl } : {}
32
+ })
33
+ });
34
+ if (!response.ok) {
35
+ const error = await response.json().catch(() => ({}));
36
+ console.error("[Analytics] Failed to track interactions:", error);
37
+ }
38
+ } catch (error) {
39
+ console.error("[Analytics] Error tracking interactions:", error);
40
+ }
41
+ }, [sessionId, apiEndpoint, projectId, apiKey, pageUrl]);
42
+ const trackInteraction = useCallback(
43
+ (params) => {
44
+ if (typeof window === "undefined") return;
45
+ if (!sessionId) {
46
+ console.warn("[Analytics] Cannot track interaction: no sessionId");
47
+ return;
48
+ }
49
+ batchRef.current.push(params);
50
+ if (batchTimeoutRef.current) {
51
+ clearTimeout(batchTimeoutRef.current);
52
+ }
53
+ if (batchRef.current.length >= BATCH_SIZE) {
54
+ flushBatch();
55
+ } else {
56
+ batchTimeoutRef.current = setTimeout(flushBatch, BATCH_DELAY_MS);
57
+ }
58
+ },
59
+ [sessionId, flushBatch]
60
+ );
61
+ const flushOnUnmount = useCallback(() => {
62
+ if (batchTimeoutRef.current) {
63
+ clearTimeout(batchTimeoutRef.current);
64
+ }
65
+ flushBatch();
66
+ }, [flushBatch]);
67
+ return { trackInteraction, flushOnUnmount };
68
+ }
69
+ function generateSessionId() {
70
+ return `kb-${Date.now()}-${Math.random().toString(36).slice(2)}`;
71
+ }
72
+
73
+ export { generateSessionId, useInteractionTracker };
74
+ //# sourceMappingURL=chunk-MT2AMINB.js.map
75
+ //# sourceMappingURL=chunk-MT2AMINB.js.map