@aigentyc/chat-sdk 0.4.0 → 0.5.1

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 (118) hide show
  1. package/context7.json +1 -1
  2. package/dist/{ChatInterface-0rq8D5-8.d.cts → ChatInterface-DrzYAWnG.d.cts} +1 -1
  3. package/dist/{ChatInterface--yaDB5yp.d.ts → ChatInterface-qiVhkmx3.d.ts} +1 -1
  4. package/dist/{SlotsContext-CWTjP0mA.d.ts → SlotsContext-B_087V7B.d.ts} +99 -5
  5. package/dist/{SlotsContext-u5CFB7MS.d.cts → SlotsContext-DAQiASVu.d.cts} +99 -5
  6. package/dist/ai-elements.cjs +164 -567
  7. package/dist/ai-elements.cjs.map +1 -1
  8. package/dist/ai-elements.d.cts +10 -2
  9. package/dist/ai-elements.d.ts +10 -2
  10. package/dist/ai-elements.js +17 -462
  11. package/dist/ai-elements.js.map +1 -1
  12. package/dist/{chunk-LSKOJ7SH.js → chunk-3H4CX3MS.js} +8 -5
  13. package/dist/chunk-3H4CX3MS.js.map +1 -0
  14. package/dist/{chunk-4WOBNRRB.cjs → chunk-6CVBJ4EI.cjs} +594 -10
  15. package/dist/chunk-6CVBJ4EI.cjs.map +1 -0
  16. package/dist/{chunk-3MP2EGEJ.cjs → chunk-72QJ2ORD.cjs} +4 -2
  17. package/dist/chunk-72QJ2ORD.cjs.map +1 -0
  18. package/dist/chunk-BYTPAQ7F.js +70 -0
  19. package/dist/chunk-BYTPAQ7F.js.map +1 -0
  20. package/dist/{chunk-P3RPAI4F.cjs → chunk-BYX6IOGX.cjs} +4 -4
  21. package/dist/{chunk-P3RPAI4F.cjs.map → chunk-BYX6IOGX.cjs.map} +1 -1
  22. package/dist/{chunk-B27JIQ4Z.js → chunk-CNGIOCLR.js} +577 -7
  23. package/dist/chunk-CNGIOCLR.js.map +1 -0
  24. package/dist/chunk-CNPYBLLT.js +81 -0
  25. package/dist/chunk-CNPYBLLT.js.map +1 -0
  26. package/dist/{chunk-6ZZTTD5E.js → chunk-CW6LCVNC.js} +3 -3
  27. package/dist/{chunk-6ZZTTD5E.js.map → chunk-CW6LCVNC.js.map} +1 -1
  28. package/dist/chunk-DDATCJ3O.cjs +75 -0
  29. package/dist/chunk-DDATCJ3O.cjs.map +1 -0
  30. package/dist/{chunk-LVWSWTI3.cjs → chunk-DTOOWY2S.cjs} +184 -74
  31. package/dist/chunk-DTOOWY2S.cjs.map +1 -0
  32. package/dist/{chunk-NYQSM3EB.cjs → chunk-DVWX2UGY.cjs} +16 -2
  33. package/dist/chunk-DVWX2UGY.cjs.map +1 -0
  34. package/dist/{chunk-TZ7EM3EG.cjs → chunk-EMVZ7HWM.cjs} +44 -2
  35. package/dist/chunk-EMVZ7HWM.cjs.map +1 -0
  36. package/dist/{chunk-3EN3DMUL.js → chunk-JAEXKKSE.js} +47 -38
  37. package/dist/chunk-JAEXKKSE.js.map +1 -0
  38. package/dist/{chunk-JHWSG5IB.js → chunk-JAOD6CNW.js} +38 -3
  39. package/dist/chunk-JAOD6CNW.js.map +1 -0
  40. package/dist/{chunk-OEEDYJTV.cjs → chunk-JEK2V5I3.cjs} +6 -6
  41. package/dist/{chunk-OEEDYJTV.cjs.map → chunk-JEK2V5I3.cjs.map} +1 -1
  42. package/dist/{chunk-QYCEHFAB.js → chunk-LDQVDUUJ.js} +4 -2
  43. package/dist/chunk-LDQVDUUJ.js.map +1 -0
  44. package/dist/{chunk-AWRQSM42.cjs → chunk-NBZDBH4M.cjs} +8 -5
  45. package/dist/chunk-NBZDBH4M.cjs.map +1 -0
  46. package/dist/{chunk-5F3O3ZJH.js → chunk-P7UR37HP.js} +17 -4
  47. package/dist/chunk-P7UR37HP.js.map +1 -0
  48. package/dist/{chunk-3KSMOHNY.js → chunk-R3TYC66R.js} +46 -81
  49. package/dist/chunk-R3TYC66R.js.map +1 -0
  50. package/dist/{chunk-RAQVW2D7.js → chunk-UTEGHMBN.js} +142 -33
  51. package/dist/chunk-UTEGHMBN.js.map +1 -0
  52. package/dist/{chunk-46MUOYPR.cjs → chunk-UXVOUC2A.cjs} +47 -38
  53. package/dist/chunk-UXVOUC2A.cjs.map +1 -0
  54. package/dist/{chunk-IU7Q7O5G.js → chunk-VQPOUMBC.js} +3 -3
  55. package/dist/{chunk-IU7Q7O5G.js.map → chunk-VQPOUMBC.js.map} +1 -1
  56. package/dist/chunk-VYBHYFG3.cjs +87 -0
  57. package/dist/chunk-VYBHYFG3.cjs.map +1 -0
  58. package/dist/{chunk-OU5OZKYH.cjs → chunk-Y4B45DW4.cjs} +48 -90
  59. package/dist/chunk-Y4B45DW4.cjs.map +1 -0
  60. package/dist/components.cjs +22 -21
  61. package/dist/components.cjs.map +1 -1
  62. package/dist/components.d.cts +3 -3
  63. package/dist/components.d.ts +3 -3
  64. package/dist/components.js +10 -9
  65. package/dist/components.js.map +1 -1
  66. package/dist/core.cjs +21 -82
  67. package/dist/core.cjs.map +1 -1
  68. package/dist/core.d.cts +2 -2
  69. package/dist/core.d.ts +2 -2
  70. package/dist/core.js +2 -78
  71. package/dist/core.js.map +1 -1
  72. package/dist/hooks.cjs +36 -14
  73. package/dist/hooks.cjs.map +1 -1
  74. package/dist/hooks.d.cts +2 -2
  75. package/dist/hooks.d.ts +2 -2
  76. package/dist/hooks.js +7 -5
  77. package/dist/hooks.js.map +1 -1
  78. package/dist/i18n.cjs +5 -5
  79. package/dist/i18n.d.cts +2 -2
  80. package/dist/i18n.d.ts +2 -2
  81. package/dist/i18n.js +1 -1
  82. package/dist/index.cjs +61 -35
  83. package/dist/index.cjs.map +1 -1
  84. package/dist/index.d.cts +15 -5
  85. package/dist/index.d.ts +15 -5
  86. package/dist/index.js +16 -14
  87. package/dist/index.js.map +1 -1
  88. package/dist/llms-full.txt +10 -10
  89. package/dist/styles.css +1 -1
  90. package/dist/theme.cjs +4 -4
  91. package/dist/theme.d.cts +1 -1
  92. package/dist/theme.d.ts +1 -1
  93. package/dist/theme.js +2 -2
  94. package/dist/tools.cjs +6 -5
  95. package/dist/tools.d.cts +2 -2
  96. package/dist/tools.d.ts +2 -2
  97. package/dist/tools.js +3 -2
  98. package/dist/{types-DQCjs81O.d.cts → types-DRa1zFlN.d.cts} +33 -1
  99. package/dist/{types-DQCjs81O.d.ts → types-DRa1zFlN.d.ts} +33 -1
  100. package/dist/ui.cjs +52 -52
  101. package/dist/ui.js +2 -2
  102. package/package.json +2 -2
  103. package/dist/chunk-3EN3DMUL.js.map +0 -1
  104. package/dist/chunk-3KSMOHNY.js.map +0 -1
  105. package/dist/chunk-3MP2EGEJ.cjs.map +0 -1
  106. package/dist/chunk-46MUOYPR.cjs.map +0 -1
  107. package/dist/chunk-4WOBNRRB.cjs.map +0 -1
  108. package/dist/chunk-5F3O3ZJH.js.map +0 -1
  109. package/dist/chunk-AWRQSM42.cjs.map +0 -1
  110. package/dist/chunk-B27JIQ4Z.js.map +0 -1
  111. package/dist/chunk-JHWSG5IB.js.map +0 -1
  112. package/dist/chunk-LSKOJ7SH.js.map +0 -1
  113. package/dist/chunk-LVWSWTI3.cjs.map +0 -1
  114. package/dist/chunk-NYQSM3EB.cjs.map +0 -1
  115. package/dist/chunk-OU5OZKYH.cjs.map +0 -1
  116. package/dist/chunk-QYCEHFAB.js.map +0 -1
  117. package/dist/chunk-RAQVW2D7.js.map +0 -1
  118. package/dist/chunk-TZ7EM3EG.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/button.tsx","../src/ui/textarea.tsx","../src/ui/separator.tsx","../src/ui/tooltip.tsx","../src/ui/collapsible.tsx"],"names":["cva","React","Slot","jsx","cn","React2","React3","SeparatorPrimitive","TooltipPrimitive","React4","CollapsiblePrimitive","CollapsibleTrigger","CollapsibleContent"],"mappings":"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","file":"chunk-EMVZ7HWM.cjs","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../core/utils\";\n\nconst buttonVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n\t\t\t\tghost: \"hover:bg-accent hover:text-accent-foreground\",\n\t\t\t\tlink: \"text-primary underline-offset-4 hover:underline\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-4 py-2\",\n\t\t\t\tsm: \"h-8 rounded-md px-3 text-xs\",\n\t\t\t\tlg: \"h-10 rounded-md px-8\",\n\t\t\t\ticon: \"h-9 w-9\",\n\t\t\t\t\"icon-sm\": \"h-7 w-7\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t},\n);\n\nexport interface ButtonProps\n\textends React.ButtonHTMLAttributes<HTMLButtonElement>,\n\tVariantProps<typeof buttonVariants> {\n\tasChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n\t({ className, variant, size, asChild = false, ...props }, ref) => {\n\t\tconst Comp = asChild ? Slot : \"button\";\n\t\treturn (\n\t\t\t<Comp\n\t\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\t\tref={ref}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","\"use client\";\n\nimport * as React from \"react\"\n\nimport { cn } from \"../core/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\";\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","\"use client\";\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../core/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"]}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
+ import { loadMessages, saveMessages, clearMessages } from './chunk-CNPYBLLT.js';
2
3
  import { createContext, useContext, useState, useRef, useMemo, useEffect, useCallback } from 'react';
3
4
  import { jsx } from 'react/jsx-runtime';
4
5
  import { useChat } from '@ai-sdk/react';
5
6
  import { DefaultChatTransport } from 'ai';
6
7
 
7
- // src/providers/SlotsContext.tsx
8
8
  var SlotsContext = createContext({});
9
9
  function SlotsProvider({ slots = {}, children }) {
10
10
  return /* @__PURE__ */ jsx(SlotsContext.Provider, { value: slots, children });
@@ -26,7 +26,14 @@ function renderSlot(name, props, DefaultComponent, slots) {
26
26
  return /* @__PURE__ */ jsx(Default, { ...spreadProps });
27
27
  }
28
28
  var SESSION_KEY_PREFIX = "aigentyc-session-";
29
- var MESSAGE_KEY_PREFIX = "aigentyc-messages-";
29
+ var LEGACY_MESSAGE_KEY_PREFIX = "aigentyc-messages-";
30
+ function dropLegacyMessageStore(projectId) {
31
+ if (typeof window === "undefined") return;
32
+ try {
33
+ localStorage.removeItem(LEGACY_MESSAGE_KEY_PREFIX + projectId);
34
+ } catch {
35
+ }
36
+ }
30
37
  function getOrCreateSessionId(projectId) {
31
38
  if (typeof window === "undefined") return crypto.randomUUID();
32
39
  const key = SESSION_KEY_PREFIX + projectId;
@@ -40,28 +47,14 @@ function getOrCreateSessionId(projectId) {
40
47
  return crypto.randomUUID();
41
48
  }
42
49
  }
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
- }
50
+ function persistMessages(projectId, sessionId, messages) {
51
+ saveMessages(projectId, sessionId, messages);
49
52
  }
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
- }
53
+ function loadPersistedMessages(projectId, sessionId) {
54
+ return loadMessages(projectId, sessionId);
58
55
  }
59
- function clearPersistedMessages(projectId) {
60
- if (typeof window === "undefined") return;
61
- try {
62
- localStorage.removeItem(MESSAGE_KEY_PREFIX + projectId);
63
- } catch {
64
- }
56
+ function clearPersistedMessages(projectId, sessionId) {
57
+ clearMessages(projectId, sessionId);
65
58
  }
66
59
  var ChatContext = createContext(null);
67
60
  function ChatContextProvider({
@@ -74,9 +67,12 @@ function ChatContextProvider({
74
67
  const callbacksRef = useRef(callbacks);
75
68
  callbacksRef.current = callbacks;
76
69
  const initialMessages = useMemo(
77
- () => loadPersistedMessages(projectId),
70
+ () => loadPersistedMessages(projectId, sessionId),
78
71
  [projectId, sessionId]
79
72
  );
73
+ useEffect(() => {
74
+ dropLegacyMessageStore(projectId);
75
+ }, [projectId]);
80
76
  const pageRef = useRef({
81
77
  pageUrl: config.pageUrl,
82
78
  pageTitle: config.pageTitle,
@@ -111,7 +107,9 @@ function ChatContextProvider({
111
107
  status: sdkStatus,
112
108
  error,
113
109
  stop,
114
- setMessages
110
+ setMessages,
111
+ regenerate,
112
+ clearError
115
113
  } = useChat({
116
114
  id: sessionId,
117
115
  messages: initialMessages,
@@ -125,8 +123,8 @@ function ChatContextProvider({
125
123
  });
126
124
  const status = error ? "error" : sdkStatus === "streaming" || sdkStatus === "submitted" ? "streaming" : "idle";
127
125
  useEffect(() => {
128
- persistMessages(projectId, messages);
129
- }, [messages, projectId]);
126
+ persistMessages(projectId, sessionId, messages);
127
+ }, [messages, projectId, sessionId]);
130
128
  const activeTools = useMemo(() => {
131
129
  if (messages.length === 0) return [];
132
130
  const last = messages[messages.length - 1];
@@ -140,21 +138,30 @@ function ChatContextProvider({
140
138
  }));
141
139
  }, [messages]);
142
140
  const sendMessage = useCallback(
143
- (content) => {
144
- if (!content.trim()) return;
141
+ (content, files) => {
142
+ if (!content.trim() && (!files || files.length === 0)) return;
145
143
  callbacksRef.current?.onMessageSent?.({
146
144
  id: crypto.randomUUID(),
147
145
  role: "user",
148
146
  content
149
147
  });
150
- sdkSendMessage({ text: content });
148
+ sdkSendMessage({
149
+ text: content,
150
+ ...files && files.length > 0 ? { files: files.map((f) => ({ ...f, type: "file" })) } : {}
151
+ });
151
152
  },
152
153
  [sdkSendMessage]
153
154
  );
154
155
  const stopGeneration = useCallback(() => stop(), [stop]);
156
+ const retryLastTurn = useCallback(() => {
157
+ clearError();
158
+ if (messages.length === 0) return;
159
+ regenerate().catch(() => {
160
+ });
161
+ }, [clearError, regenerate, messages]);
155
162
  const newConversation = useCallback(() => {
156
163
  setMessages([]);
157
- clearPersistedMessages(projectId);
164
+ clearPersistedMessages(projectId, sessionId);
158
165
  if (typeof window !== "undefined") {
159
166
  try {
160
167
  sessionStorage.removeItem(SESSION_KEY_PREFIX + projectId);
@@ -162,11 +169,11 @@ function ChatContextProvider({
162
169
  }
163
170
  }
164
171
  setSessionId(getOrCreateSessionId(projectId));
165
- }, [projectId, setMessages]);
166
- const clearMessages = useCallback(() => {
172
+ }, [projectId, sessionId, setMessages]);
173
+ const clearMessages2 = useCallback(() => {
167
174
  setMessages([]);
168
- clearPersistedMessages(projectId);
169
- }, [projectId, setMessages]);
175
+ clearPersistedMessages(projectId, sessionId);
176
+ }, [projectId, sessionId, setMessages]);
170
177
  const value = useMemo(
171
178
  () => ({
172
179
  messages,
@@ -177,8 +184,9 @@ function ChatContextProvider({
177
184
  activeTools,
178
185
  sendMessage,
179
186
  stopGeneration,
187
+ retryLastTurn,
180
188
  newConversation,
181
- clearMessages,
189
+ clearMessages: clearMessages2,
182
190
  callbacks: callbacksRef.current
183
191
  }),
184
192
  [
@@ -190,8 +198,9 @@ function ChatContextProvider({
190
198
  activeTools,
191
199
  sendMessage,
192
200
  stopGeneration,
201
+ retryLastTurn,
193
202
  newConversation,
194
- clearMessages
203
+ clearMessages2
195
204
  ]
196
205
  );
197
206
  return /* @__PURE__ */ jsx(ChatContext.Provider, { value, children });
@@ -207,5 +216,5 @@ function useChatContext() {
207
216
  }
208
217
 
209
218
  export { ChatContext, ChatContextProvider, SlotsProvider, renderSlot, useChatContext, useSlot, useSlots };
210
- //# sourceMappingURL=chunk-3EN3DMUL.js.map
211
- //# sourceMappingURL=chunk-3EN3DMUL.js.map
219
+ //# sourceMappingURL=chunk-JAEXKKSE.js.map
220
+ //# sourceMappingURL=chunk-JAEXKKSE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/SlotsContext.tsx","../src/providers/ChatContext.tsx"],"names":["createContext","clearMessages","jsx","useContext"],"mappings":"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","file":"chunk-JAEXKKSE.js","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 | \"error\";\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 * The generic `P` is NOT constrained to `Record<string, unknown>` so concrete\n * component prop types (e.g. `ChatHeaderProps`) flow through at call sites\n * without `as never` casts. Internal spreads are cast through\n * `Record<string, unknown>` — safe because JSX spread accepts any record.\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>(\n name: SlotName,\n props: P,\n DefaultComponent: ComponentType<P>,\n slots: SlotMap\n): React.ReactElement {\n const spreadProps = props as unknown as Record<string, unknown>;\n const Override = slots[name] as\n | ComponentType<Record<string, unknown> & { DefaultComponent: ComponentType<P> }>\n | undefined;\n if (Override) {\n return <Override {...spreadProps} DefaultComponent={DefaultComponent} />;\n }\n const Default = DefaultComponent as ComponentType<Record<string, unknown>>;\n return <Default {...spreadProps} />;\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 ChatAttachmentInput,\n} from \"../core/types\";\nimport { useChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport {\n clearMessages as clearStoredMessages,\n loadMessages as loadStoredMessages,\n saveMessages as saveStoredMessages,\n type StoredMessage,\n} from \"../core/message-store\";\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-\";\n\n/**\n * Where this provider used to keep history, before it moved to\n * `core/message-store`.\n *\n * Worth deleting rather than leaving behind. The old writer had no size cap and\n * no expiry, so an established visitor can be carrying a large dead blob under\n * this key — and `localStorage` is a ~5 MB budget shared by the whole origin.\n * Nothing reads the key any more, but the space it holds is space the new\n * store's writes need, and those writes fail SILENTLY when the quota is gone.\n * An orphan left in place would mean persistence quietly stopping for exactly\n * the visitors who had used the chat the most.\n */\nconst LEGACY_MESSAGE_KEY_PREFIX = \"aigentyc-messages-\";\n\nfunction dropLegacyMessageStore(projectId: string): void {\n if (typeof window === \"undefined\") return;\n try {\n localStorage.removeItem(LEGACY_MESSAGE_KEY_PREFIX + projectId);\n } catch {\n // Unavailable or blocked — the old key is harmless, just wasteful.\n }\n}\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\n/**\n * History is stored per project AND per session, by `core/message-store`.\n *\n * This used to be three local helpers keyed on `projectId` alone, with no\n * expiry and no size bound, while `message-store` — written for exactly this\n * job, and exported from the package — went unused. The difference is not\n * cosmetic:\n *\n * - **A session could not escape a poisoned history.** The server refuses a\n * turn whose replayed history is too long or too large. Because every\n * session in the project read the same key, that history came back on the\n * next page load, in the next tab and in a new session — so a conversation\n * that broke once answered nothing ever again, which is exactly how this was\n * reported from the field.\n * - **Sessions leaked into each other.** A second tab adopted the first tab's\n * conversation while reporting a different `sessionId` upstream, so the\n * transcript the server logged did not match the one on screen.\n * - **Nothing ever expired.** `message-store` drops history after 24 hours and\n * trims it when it outgrows 200 KB.\n *\n * Persistence across navigation is unchanged: the session id lives in\n * `sessionStorage`, which survives a full page load in the same tab.\n */\nfunction persistMessages(\n projectId: string,\n sessionId: string,\n messages: unknown[]\n): void {\n saveStoredMessages(projectId, sessionId, messages as StoredMessage[]);\n}\n\nfunction loadPersistedMessages(\n projectId: string,\n sessionId: string\n): ChatMessage[] {\n return loadStoredMessages(projectId, sessionId) as unknown as ChatMessage[];\n}\n\nfunction clearPersistedMessages(projectId: string, sessionId: string): void {\n clearStoredMessages(projectId, sessionId);\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 /**\n * Sends a user turn. `files` travel with it as message parts; a turn carrying\n * files may have empty text — an image on its own is a question.\n */\n sendMessage: (content: string, files?: ChatAttachmentInput[]) => void;\n stopGeneration: () => void;\n /**\n * Re-run the last turn after a failure. No-op while a turn is in flight.\n *\n * Worth offering for a transient refusal — a rate limit, a dropped stream, a\n * momentary 503. It cannot clear a refusal caused by the history itself,\n * because the same history is what gets re-sent; that needs\n * {@link ChatContextValue.newConversation}.\n */\n retryLastTurn: () => 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 // Re-load persisted messages whenever the session changes (incl. after\n // newConversation()). Keying only on mount cached the original array, so\n // useChat would re-inject the OLD messages into the new sessionId — a real\n // \"new chat\" effectively kept the old conversation alive.\n const initialMessages = useMemo(\n () => loadPersistedMessages(projectId, sessionId),\n [projectId, sessionId]\n );\n\n useEffect(() => {\n dropLegacyMessageStore(projectId);\n }, [projectId]);\n\n // Page context is whatever the host page looks like *right now*, so it is read\n // through a ref at send time rather than captured when the transport is built.\n // Rebuilding the transport on every navigation would remount `useChat` and\n // drop an in-flight stream — in a single-page host that is one route change.\n const pageRef = useRef({\n pageUrl: config.pageUrl,\n pageTitle: config.pageTitle,\n pageContext: config.pageContext,\n });\n pageRef.current = {\n pageUrl: config.pageUrl,\n pageTitle: config.pageTitle,\n pageContext: config.pageContext,\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 // A function body is resolved per request by the AI SDK transport.\n body: () => {\n const { pageUrl, pageTitle, pageContext } = pageRef.current;\n return {\n projectId: config.projectId,\n sessionId,\n ...(pageUrl ? { pageUrl } : {}),\n ...(pageTitle ? { pageTitle } : {}),\n ...(pageContext !== undefined ? { pageContext } : {}),\n };\n },\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 regenerate,\n clearError,\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, sessionId, messages);\n }, [messages, projectId, sessionId]);\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, files?: ChatAttachmentInput[]) => {\n // An attachment is a message on its own, so an empty string only blocks\n // the send when nothing else is going with it.\n if (!content.trim() && (!files || files.length === 0)) return;\n callbacksRef.current?.onMessageSent?.({\n id: crypto.randomUUID(),\n role: \"user\",\n content,\n } as ChatMessage);\n sdkSendMessage({\n text: content,\n ...(files && files.length > 0\n ? { files: files.map((f) => ({ ...f, type: \"file\" as const })) }\n : {}),\n });\n },\n [sdkSendMessage]\n );\n\n const stopGeneration = useCallback(() => stop(), [stop]);\n\n // `clearError` first: the error is what the UI is rendering, and leaving it\n // set would keep the failure card on screen next to the turn now streaming.\n //\n // The empty check is not defensive padding. `regenerate()` THROWS when there\n // is no message to re-run, and a host that calls `clearMessages()` while a\n // failure is on screen leaves exactly that state — no messages, error still\n // set, so the card is still rendered and still offering its button. Left\n // alone it would also be an unhandled rejection, since nothing awaits this.\n const retryLastTurn = useCallback(() => {\n clearError();\n if (messages.length === 0) return;\n regenerate().catch(() => {\n // Request failures already land in `error` via useChat's own handling;\n // this only stops a rejected promise escaping the click handler.\n });\n }, [clearError, regenerate, messages]);\n\n const newConversation = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId, sessionId);\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, sessionId, setMessages]);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n clearPersistedMessages(projectId, sessionId);\n }, [projectId, sessionId, 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 retryLastTurn,\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 retryLastTurn,\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"]}
@@ -4,6 +4,8 @@ import * as React from 'react';
4
4
  import { Slot } from '@radix-ui/react-slot';
5
5
  import { cva } from 'class-variance-authority';
6
6
  import { jsx } from 'react/jsx-runtime';
7
+ import * as SeparatorPrimitive from '@radix-ui/react-separator';
8
+ import * as TooltipPrimitive from '@radix-ui/react-tooltip';
7
9
  import * as CollapsiblePrimitive from '@radix-ui/react-collapsible';
8
10
 
9
11
  var buttonVariants = cva(
@@ -60,10 +62,43 @@ var Textarea = React.forwardRef(({ className, ...props }, ref) => {
60
62
  );
61
63
  });
62
64
  Textarea.displayName = "Textarea";
65
+ var Separator = React.forwardRef(
66
+ ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ jsx(
67
+ SeparatorPrimitive.Root,
68
+ {
69
+ ref,
70
+ decorative,
71
+ orientation,
72
+ className: cn(
73
+ "shrink-0 bg-border",
74
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
75
+ className
76
+ ),
77
+ ...props
78
+ }
79
+ )
80
+ );
81
+ Separator.displayName = SeparatorPrimitive.Root.displayName;
82
+ var TooltipProvider = TooltipPrimitive.Provider;
83
+ var Tooltip = TooltipPrimitive.Root;
84
+ var TooltipTrigger = TooltipPrimitive.Trigger;
85
+ var TooltipContent = React.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
86
+ TooltipPrimitive.Content,
87
+ {
88
+ ref,
89
+ sideOffset,
90
+ className: cn(
91
+ "z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",
92
+ className
93
+ ),
94
+ ...props
95
+ }
96
+ ) }));
97
+ TooltipContent.displayName = TooltipPrimitive.Content.displayName;
63
98
  var Collapsible = CollapsiblePrimitive.Root;
64
99
  var CollapsibleTrigger2 = CollapsiblePrimitive.CollapsibleTrigger;
65
100
  var CollapsibleContent2 = CollapsiblePrimitive.CollapsibleContent;
66
101
 
67
- export { Button, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, Textarea };
68
- //# sourceMappingURL=chunk-JHWSG5IB.js.map
69
- //# sourceMappingURL=chunk-JHWSG5IB.js.map
102
+ export { Button, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, Separator, Textarea, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
103
+ //# sourceMappingURL=chunk-JAOD6CNW.js.map
104
+ //# sourceMappingURL=chunk-JAOD6CNW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/button.tsx","../src/ui/textarea.tsx","../src/ui/separator.tsx","../src/ui/tooltip.tsx","../src/ui/collapsible.tsx"],"names":["React2","jsx","React3","React4","CollapsibleTrigger","CollapsibleContent"],"mappings":"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","file":"chunk-JAOD6CNW.js","sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../core/utils\";\n\nconst buttonVariants = cva(\n\t\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault:\n\t\t\t\t\t\"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n\t\t\t\tdestructive:\n\t\t\t\t\t\"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n\t\t\t\toutline:\n\t\t\t\t\t\"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n\t\t\t\tsecondary:\n\t\t\t\t\t\"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n\t\t\t\tghost: \"hover:bg-accent hover:text-accent-foreground\",\n\t\t\t\tlink: \"text-primary underline-offset-4 hover:underline\",\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: \"h-9 px-4 py-2\",\n\t\t\t\tsm: \"h-8 rounded-md px-3 text-xs\",\n\t\t\t\tlg: \"h-10 rounded-md px-8\",\n\t\t\t\ticon: \"h-9 w-9\",\n\t\t\t\t\"icon-sm\": \"h-7 w-7\",\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: \"default\",\n\t\t\tsize: \"default\",\n\t\t},\n\t},\n);\n\nexport interface ButtonProps\n\textends React.ButtonHTMLAttributes<HTMLButtonElement>,\n\tVariantProps<typeof buttonVariants> {\n\tasChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n\t({ className, variant, size, asChild = false, ...props }, ref) => {\n\t\tconst Comp = asChild ? Slot : \"button\";\n\t\treturn (\n\t\t\t<Comp\n\t\t\t\tclassName={cn(buttonVariants({ variant, size, className }))}\n\t\t\t\tref={ref}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t);\n\t},\n);\nButton.displayName = \"Button\";\n\nexport { Button, buttonVariants };\n","\"use client\";\n\nimport * as React from \"react\"\n\nimport { cn } from \"../core/utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...props}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\";\n\nimport * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","\"use client\";\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../core/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk46MUOYPR_cjs = require('./chunk-46MUOYPR.cjs');
4
+ var chunkUXVOUC2A_cjs = require('./chunk-UXVOUC2A.cjs');
5
5
  var chunkJOO6C3XT_cjs = require('./chunk-JOO6C3XT.cjs');
6
6
  var chunkJI5KCSOI_cjs = require('./chunk-JI5KCSOI.cjs');
7
7
  var chunkAWAJOSFP_cjs = require('./chunk-AWAJOSFP.cjs');
@@ -374,11 +374,11 @@ function getNestedValue(obj, path) {
374
374
  return current;
375
375
  }
376
376
  function useSafeChatCallbacks() {
377
- const ctx = react.useContext(chunk46MUOYPR_cjs.ChatContext);
377
+ const ctx = react.useContext(chunkUXVOUC2A_cjs.ChatContext);
378
378
  return ctx?.callbacks ?? {};
379
379
  }
380
380
  function useSafeChatConfig() {
381
- const ctx = react.useContext(chunk46MUOYPR_cjs.ChatContext);
381
+ const ctx = react.useContext(chunkUXVOUC2A_cjs.ChatContext);
382
382
  return ctx?.config;
383
383
  }
384
384
 
@@ -484,7 +484,7 @@ var KNOWN_RENDER_MODES = /* @__PURE__ */ new Set([
484
484
  var warnedToolNames = /* @__PURE__ */ new Set();
485
485
  function ToolRenderer(props) {
486
486
  const { toolName, state, result } = props;
487
- const slots = chunk46MUOYPR_cjs.useSlots();
487
+ const slots = chunkUXVOUC2A_cjs.useSlots();
488
488
  const callbacks = useSafeChatCallbacks();
489
489
  react.useEffect(() => {
490
490
  if (state === "output-available" && result) {
@@ -583,5 +583,5 @@ function pickDefaultForMode(mode) {
583
583
  exports.ComponentRenderer = ComponentRenderer;
584
584
  exports.SearchKnowledgeBaseRenderer = SearchKnowledgeBaseRenderer;
585
585
  exports.ToolRenderer = ToolRenderer;
586
- //# sourceMappingURL=chunk-OEEDYJTV.cjs.map
587
- //# sourceMappingURL=chunk-OEEDYJTV.cjs.map
586
+ //# sourceMappingURL=chunk-JEK2V5I3.cjs.map
587
+ //# sourceMappingURL=chunk-JEK2V5I3.cjs.map