veryfront 0.0.37 → 0.0.38

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.
@@ -347,7 +347,9 @@ var Chat = React6.forwardRef(
347
347
  messages,
348
348
  input,
349
349
  onChange,
350
+ handleInputChange,
350
351
  onSubmit,
352
+ handleSubmit,
351
353
  isLoading,
352
354
  error,
353
355
  placeholder = "Type a message...",
@@ -360,6 +362,9 @@ var Chat = React6.forwardRef(
360
362
  }, ref) => {
361
363
  const theme = mergeThemes(defaultChatTheme, userTheme);
362
364
  const messagesEndRef = React6.useRef(null);
365
+ const inputChangeHandler = onChange || handleInputChange || (() => {
366
+ });
367
+ const submitHandler = onSubmit || handleSubmit;
363
368
  React6.useEffect(() => {
364
369
  messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
365
370
  }, [messages]);
@@ -392,29 +397,35 @@ var Chat = React6.forwardRef(
392
397
  /* @__PURE__ */ jsx6("p", { className: "text-sm font-medium", children: "Error" }),
393
398
  /* @__PURE__ */ jsx6("p", { className: "text-sm", children: error.message })
394
399
  ] }),
395
- /* @__PURE__ */ jsx6("form", { onSubmit, className: "border-t border-gray-200 dark:border-gray-800 p-4", children: /* @__PURE__ */ jsxs2("div", { className: "flex gap-2", children: [
396
- /* @__PURE__ */ jsx6(
397
- InputBox,
398
- {
399
- value: input,
400
- onChange: onChange || (() => {
401
- }),
402
- placeholder,
403
- disabled: isLoading,
404
- multiline,
405
- className: theme.input
406
- }
407
- ),
408
- /* @__PURE__ */ jsx6(
409
- SubmitButton,
410
- {
411
- isLoading,
412
- disabled: !input.trim() || isLoading,
413
- className: theme.button,
414
- children: "Send"
415
- }
416
- )
417
- ] }) })
400
+ /* @__PURE__ */ jsx6(
401
+ "form",
402
+ {
403
+ onSubmit: submitHandler,
404
+ className: "border-t border-gray-200 dark:border-gray-800 p-4",
405
+ children: /* @__PURE__ */ jsxs2("div", { className: "flex gap-2", children: [
406
+ /* @__PURE__ */ jsx6(
407
+ InputBox,
408
+ {
409
+ value: input,
410
+ onChange: inputChangeHandler,
411
+ placeholder,
412
+ disabled: isLoading,
413
+ multiline,
414
+ className: theme.input
415
+ }
416
+ ),
417
+ /* @__PURE__ */ jsx6(
418
+ SubmitButton,
419
+ {
420
+ isLoading,
421
+ disabled: !input.trim() || isLoading,
422
+ className: theme.button,
423
+ children: "Send"
424
+ }
425
+ )
426
+ ] })
427
+ }
428
+ )
418
429
  ]
419
430
  }
420
431
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/ai/react/components/theme.ts", "../../../src/ai/react/components/chat.tsx", "../../../src/ai/react/primitives/chat-container.tsx", "../../../src/ai/react/primitives/message-list.tsx", "../../../src/ai/react/primitives/input-box.tsx", "../../../src/ai/react/primitives/agent-primitives.tsx", "../../../src/ai/react/primitives/tool-primitives.tsx", "../../../src/ai/react/components/agent-card.tsx", "../../../src/ai/react/components/message.tsx", "../../../src/ai/react/components/error-boundary.tsx"],
4
- "sourcesContent": ["/**\n * Theme System for Styled Components\n *\n * Provides default theme and utilities for customization.\n */\n\nexport interface ChatTheme {\n /** Container styles */\n container?: string;\n\n /** Message styles by role */\n message?: {\n user?: string;\n assistant?: string;\n system?: string;\n tool?: string;\n };\n\n /** Input styles */\n input?: string;\n\n /** Button styles */\n button?: string;\n\n /** Loading indicator styles */\n loading?: string;\n}\n\n/**\n * Default theme using Tailwind CSS\n */\nexport const defaultChatTheme: ChatTheme = {\n container: \"flex flex-col h-full bg-white dark:bg-gray-950\",\n message: {\n user: \"bg-blue-600 text-white rounded-lg px-4 py-2 max-w-[70%] ml-auto\",\n assistant:\n \"bg-gray-200 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded-lg px-4 py-2 max-w-[70%]\",\n system:\n \"bg-yellow-100 dark:bg-yellow-900/20 text-yellow-900 dark:text-yellow-100 rounded px-3 py-1 text-sm\",\n tool:\n \"bg-purple-100 dark:bg-purple-900/20 text-purple-900 dark:text-purple-100 rounded px-3 py-1 text-sm font-mono\",\n },\n input:\n \"flex-1 px-4 py-2 border border-gray-300 dark:border-gray-700 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-900 dark:text-gray-100\",\n button:\n \"px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\",\n loading: \"w-5 h-5 border-2 border-gray-400 border-t-transparent rounded-full animate-spin\",\n};\n\nexport interface AgentTheme {\n /** Container styles */\n container?: string;\n\n /** Status styles */\n status?: string;\n\n /** Thinking indicator styles */\n thinking?: string;\n\n /** Tool invocation styles */\n tool?: string;\n\n /** Tool result styles */\n toolResult?: string;\n}\n\n/**\n * Default agent theme\n */\nexport const defaultAgentTheme: AgentTheme = {\n container:\n \"border border-gray-200 dark:border-gray-800 rounded-lg p-6 space-y-4 bg-white dark:bg-gray-950\",\n status: \"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium\",\n thinking:\n \"bg-yellow-50 dark:bg-yellow-900/20 border-l-4 border-yellow-500 pl-4 py-2 italic text-gray-700 dark:text-gray-300\",\n tool: \"border-l-4 border-blue-500 pl-4 py-2 bg-blue-50 dark:bg-blue-900/20\",\n toolResult: \"mt-2 p-3 bg-gray-100 dark:bg-gray-900 rounded font-mono text-sm overflow-x-auto\",\n};\n\n/**\n * Merge themes (user theme overrides default)\n */\nexport function mergeThemes<T extends Record<string, any>>(\n defaultTheme: T,\n userTheme?: Partial<T>,\n): T {\n if (!userTheme) return defaultTheme;\n\n const merged = { ...defaultTheme };\n\n for (const key in userTheme) {\n const value = userTheme[key];\n\n if (value === undefined) {\n continue;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Merge nested objects\n merged[key] = { ...defaultTheme[key], ...value } as T[Extract<keyof T, string>];\n } else {\n merged[key] = value as T[Extract<keyof T, string>];\n }\n }\n\n return merged;\n}\n\n/**\n * Utility to combine class names\n * (Simple version - in production use 'clsx' or 'cn' from shadcn)\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n", "/**\n * Chat Component - Layer 3 (Styled)\n *\n * Production-ready, fully styled chat component.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n ChatContainer,\n InputBox,\n LoadingIndicator,\n MessageItem,\n MessageList,\n SubmitButton,\n} from \"../primitives/index.ts\";\nimport type { Message, ToolCall } from \"../../types/agent.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface ChatProps {\n /** Messages to display */\n messages: Message[];\n\n /** Current input value */\n input: string;\n\n /** Input change handler */\n onChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Loading state */\n isLoading?: boolean;\n\n /** Error state */\n error?: Error | null;\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Max height */\n maxHeight?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Custom message renderer */\n renderMessage?: (message: Message) => React.ReactNode;\n\n /** Custom tool renderer */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n\n /** Enable multiline input */\n multiline?: boolean;\n}\n\n/**\n * Chat - Complete chat interface\n *\n * Production-ready chat component with sensible defaults.\n *\n * @example\n * ```tsx\n * import { Chat } from 'veryfront/ai/components';\n * import { useChat } from 'veryfront/ai/react';\n *\n * export default function ChatPage() {\n * const chat = useChat({ api: '/api/chat' });\n * return <Chat {...chat} />;\n * }\n * ```\n */\nexport const Chat = React.forwardRef<HTMLDivElement, ChatProps>(\n (\n {\n messages,\n input,\n onChange,\n onSubmit,\n isLoading,\n error,\n placeholder = \"Type a message...\",\n maxHeight = \"100%\",\n className,\n theme: userTheme,\n renderMessage,\n renderTool: _renderTool,\n multiline = false,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n const messagesEndRef = React.useRef<HTMLDivElement>(null);\n\n // Auto-scroll to bottom on new messages\n React.useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n return (\n <ChatContainer\n ref={ref}\n className={cn(theme.container, className)}\n style={{ maxHeight }}\n >\n {/* Message List */}\n <MessageList className=\"flex-1 overflow-y-auto p-4 space-y-4\">\n {messages.map((msg) =>\n renderMessage\n ? <React.Fragment key={msg.id}>{renderMessage(msg)}</React.Fragment>\n : (\n <MessageItem\n key={msg.id}\n role={msg.role}\n className={cn(\n \"flex\",\n msg.role === \"user\" ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div className={theme.message?.[msg.role] || theme.message?.assistant}>\n {msg.content}\n </div>\n </MessageItem>\n )\n )}\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"flex justify-start\">\n <div className=\"bg-gray-200 dark:bg-gray-800 rounded-lg px-4 py-2\">\n <LoadingIndicator className={theme.loading} />\n </div>\n </div>\n )}\n\n {/* Auto-scroll anchor */}\n <div ref={messagesEndRef} />\n </MessageList>\n\n {/* Error display */}\n {error && (\n <div className=\"px-4 py-2 bg-red-50 dark:bg-red-900/20 border-l-4 border-red-500 text-red-900 dark:text-red-100\">\n <p className=\"text-sm font-medium\">Error</p>\n <p className=\"text-sm\">{error.message}</p>\n </div>\n )}\n\n {/* Input area */}\n <form onSubmit={onSubmit} className=\"border-t border-gray-200 dark:border-gray-800 p-4\">\n <div className=\"flex gap-2\">\n <InputBox\n value={input}\n onChange={onChange || (() => {})}\n placeholder={placeholder}\n disabled={isLoading}\n multiline={multiline}\n className={theme.input}\n />\n <SubmitButton\n isLoading={isLoading}\n disabled={!input.trim() || isLoading}\n className={theme.button}\n >\n Send\n </SubmitButton>\n </div>\n </form>\n </ChatContainer>\n );\n },\n);\n\nChat.displayName = \"Chat\";\n\n// Composition API (for advanced usage)\nconst ChatHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-b border-gray-200 dark:border-gray-800 p-4 bg-gray-50 dark:bg-gray-900\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatHeader.displayName = \"ChatHeader\";\n\nconst ChatMessages = MessageList;\nChatMessages.displayName = \"ChatMessages\";\n\nconst ChatInput = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n React.ComponentProps<typeof InputBox>\n>(({ className, ...props }, ref) => {\n return (\n <div className=\"border-t border-gray-200 dark:border-gray-800 p-4\">\n <div className=\"flex gap-2\">\n <InputBox\n ref={ref}\n className={cn(defaultChatTheme.input, className)}\n {...props}\n />\n </div>\n </div>\n );\n});\nChatInput.displayName = \"ChatInput\";\n\nconst ChatFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-t border-gray-200 dark:border-gray-800 p-4 text-sm text-gray-500\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatFooter.displayName = \"ChatFooter\";\n\n// Attach subcomponents for composition API\nexport const ChatComponents = Object.assign(Chat, {\n Header: ChatHeader,\n Messages: ChatMessages,\n Input: ChatInput,\n Footer: ChatFooter,\n});\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { Message } from \"../../types/agent.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: Message[\"role\"];\n\n /** Message content (can be children or prop) */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading state */\n isLoading?: boolean;\n\n children?: React.ReactNode;\n}\n\n/**\n * SubmitButton - Submit button primitive\n *\n * @example\n * ```tsx\n * <SubmitButton\n * onClick={handleSubmit}\n * isLoading={isLoading}\n * disabled={!input.trim()}\n * className=\"px-4 py-2 bg-blue-600 text-white rounded-lg\"\n * >\n * Send\n * </SubmitButton>\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>(({ className, isLoading, disabled, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"submit\"\n className={className}\n disabled={disabled || isLoading}\n data-submit-button=\"\"\n data-loading={isLoading}\n aria-label=\"Submit message\"\n {...props}\n >\n {children || \"Send\"}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { ToolCall } from \"../../types/agent.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args?: Record<string, unknown>;\n\n /** Tool status */\n status?: ToolCall[\"status\"];\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={tool.name}\n * args={tool.args}\n * status={tool.status}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>(({ className, name, args, status, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-status={status}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {status && <span data-tool-status=\"\">({status})</span>}\n </div>\n\n {args && (\n <div data-tool-args=\"\">\n <pre>{JSON.stringify(args, null, 2)}</pre>\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool result data */\n result: unknown;\n\n /** Custom renderer */\n renderResult?: (result: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display\n *\n * @example\n * ```tsx\n * <ToolResult\n * result={tool.result}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, result, renderResult, ...props }, ref) => {\n const content = renderResult ? renderResult(result) : JSON.stringify(result, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n\n /** Render each tool */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * ToolList - Display list of tool calls\n *\n * @example\n * ```tsx\n * <ToolList\n * toolCalls={agent.toolCalls}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation {...tool}>\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, toolCalls, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {toolCalls.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.id}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.id}\n name={tool.name}\n args={tool.args}\n status={tool.status}\n >\n {tool.result !== undefined && <ToolResult result={tool.result} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n", "/**\n * AgentCard Component - Layer 3 (Styled)\n *\n * Production-ready agent status and tool visualization.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n AgentContainer,\n AgentStatus as AgentStatusPrimitive,\n ThinkingIndicator,\n ToolInvocation,\n ToolList,\n ToolResult,\n} from \"../primitives/index.ts\";\nimport type { AgentStatus, Message, ToolCall } from \"../../types/agent.ts\";\nimport { type AgentTheme, cn, defaultAgentTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface AgentCardProps {\n /** Agent messages */\n messages?: Message[];\n\n /** Tool calls */\n toolCalls?: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text */\n thinking?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<AgentTheme>;\n\n /** Custom tool renderer */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * AgentCard - Agent status and tool visualization\n *\n * @example\n * ```tsx\n * import { AgentCard } from 'veryfront/ai/components';\n * import { useAgent } from 'veryfront/ai/react';\n *\n * export default function AgentInterface() {\n * const agent = useAgent({ agent: 'support' });\n * return <AgentCard {...agent} />;\n * }\n * ```\n */\nexport const AgentCard = React.forwardRef<HTMLDivElement, AgentCardProps>(\n (\n {\n messages,\n toolCalls = [],\n status,\n thinking,\n className,\n theme: userTheme,\n renderTool,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultAgentTheme, userTheme);\n\n return (\n <AgentContainer ref={ref} className={cn(theme.container, className)}>\n {/* Status */}\n <AgentStatusPrimitive\n status={status}\n className={cn(theme.status, getStatusColor(status))}\n />\n\n {/* Thinking indicator */}\n {thinking && (\n <ThinkingIndicator className={theme.thinking}>\n <span className=\"font-semibold\">Thinking:</span>\n {thinking}\n </ThinkingIndicator>\n )}\n\n {/* Tool calls */}\n {toolCalls.length > 0 && (\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-gray-700 dark:text-gray-300\">\n Tool Calls\n </h3>\n <ToolList\n toolCalls={toolCalls}\n className=\"space-y-2\"\n renderTool={renderTool ||\n ((tool) => (\n <ToolInvocation\n name={tool.name}\n args={tool.args}\n status={tool.status}\n className={theme.tool}\n >\n {tool.result !== undefined && (\n <ToolResult result={tool.result} className={theme.toolResult} />\n )}\n {tool.error && (\n <div className=\"mt-2 p-2 bg-red-50 dark:bg-red-900/20 text-red-900 dark:text-red-100 rounded text-sm\">\n Error: {tool.error}\n </div>\n )}\n </ToolInvocation>\n ))}\n />\n </div>\n )}\n\n {/* Messages (if provided) */}\n {messages && messages.length > 0 && (\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-gray-700 dark:text-gray-300\">\n Messages\n </h3>\n <div className=\"space-y-2 max-h-96 overflow-y-auto\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className=\"text-sm p-2 rounded bg-gray-50 dark:bg-gray-900\"\n >\n <span className=\"font-semibold capitalize\">{msg.role}:</span>\n <span>{msg.content.substring(0, 200)}...</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </AgentContainer>\n );\n },\n);\n\nAgentCard.displayName = \"AgentCard\";\n\n/**\n * Get status color classes\n */\nfunction getStatusColor(status: AgentStatus): string {\n switch (status) {\n case \"idle\":\n return \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\";\n case \"thinking\":\n return \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300\";\n case \"tool_execution\":\n return \"bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300\";\n case \"streaming\":\n return \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300\";\n case \"completed\":\n return \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300\";\n case \"error\":\n return \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300\";\n default:\n return \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\";\n }\n}\n", "/**\n * Message Component - Layer 3 (Styled)\n *\n * Production-ready message display.\n */\n\nimport * as React from \"react\";\nimport { MessageContent, MessageItem, MessageRole } from \"../primitives/index.ts\";\nimport type { Message as MessageType } from \"../../types/agent.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface MessageProps {\n /** Message to display */\n message: MessageType;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Show role label */\n showRole?: boolean;\n\n /** Show timestamp */\n showTimestamp?: boolean;\n}\n\n/**\n * Message - Styled message component\n *\n * @example\n * ```tsx\n * import { Message } from 'veryfront/ai/components';\n *\n * <Message message={msg} showRole={true} />\n * ```\n */\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n (\n { message, className, theme: userTheme, showRole = false, showTimestamp = false },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n\n return (\n <MessageItem\n ref={ref}\n role={message.role}\n className={cn(\n \"flex\",\n message.role === \"user\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div className={theme.message?.[message.role] || theme.message?.assistant}>\n {showRole && (\n <MessageRole className=\"block text-xs font-semibold mb-1 opacity-75 uppercase\">\n {message.role}\n </MessageRole>\n )}\n\n <MessageContent>{message.content}</MessageContent>\n\n {showTimestamp && message.timestamp && (\n <div className=\"text-xs opacity-60 mt-1\">\n {new Date(message.timestamp).toLocaleTimeString()}\n </div>\n )}\n </div>\n </MessageItem>\n );\n },\n);\n\nMessage.displayName = \"Message\";\n\nexport interface StreamingMessageProps {\n /** Streaming content */\n content: string;\n\n /** Show typing cursor */\n showCursor?: boolean;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n}\n\n/**\n * StreamingMessage - Display streaming text\n *\n * @example\n * ```tsx\n * import { StreamingMessage } from 'veryfront/ai/components';\n *\n * {streamingText && (\n * <StreamingMessage content={streamingText} showCursor={true} />\n * )}\n * ```\n */\nexport const StreamingMessage = React.forwardRef<\n HTMLDivElement,\n StreamingMessageProps\n>(({ content, showCursor = true, className, theme: userTheme }, ref) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n\n return (\n <MessageItem\n ref={ref}\n role=\"assistant\"\n className={cn(\"flex justify-start\", className)}\n >\n <div className={theme.message?.assistant}>\n <MessageContent>\n {content}\n {showCursor && <span className=\"inline-block w-1 h-4 bg-current ml-1 animate-pulse\" />}\n </MessageContent>\n </div>\n </MessageItem>\n );\n});\n\nStreamingMessage.displayName = \"StreamingMessage\";\n", "/**\n * Error Boundary for AI Components\n *\n * React error boundary specifically designed for AI component errors.\n */\n\nimport * as React from \"react\";\n\nexport interface AIErrorBoundaryProps {\n /** Children to wrap */\n children: React.ReactNode;\n\n /** Fallback UI when error occurs */\n fallback?: React.ReactNode | ((error: Error, reset: () => void) => React.ReactNode);\n\n /** Callback when error occurs */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\ninterface AIErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * AIErrorBoundary - Error boundary for AI components\n *\n * @example\n * ```tsx\n * import { AIErrorBoundary } from 'veryfront/ai/components';\n *\n * <AIErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={reset}>Try Again</button>\n * </div>\n * )}\n * >\n * <Chat {...chat} />\n * </AIErrorBoundary>\n * ```\n */\nexport class AIErrorBoundary extends React.Component<\n AIErrorBoundaryProps,\n AIErrorBoundaryState\n> {\n constructor(props: AIErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): AIErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Log error\n console.error(\"[AIErrorBoundary] Caught error:\", error, errorInfo);\n\n // Call error callback\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError && this.state.error) {\n // Custom fallback\n if (this.props.fallback) {\n if (typeof this.props.fallback === \"function\") {\n return this.props.fallback(this.state.error, this.reset);\n }\n return this.props.fallback;\n }\n\n // Default fallback UI\n return (\n <div\n className=\"border border-red-200 bg-red-50 dark:bg-red-900/20 rounded-lg p-6\"\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3\">\n <svg\n className=\"w-5 h-5 text-red-600 dark:text-red-400 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-red-900 dark:text-red-100\">\n {this.props.errorMessage || \"An error occurred in the AI component\"}\n </h3>\n\n <p className=\"mt-2 text-sm text-red-700 dark:text-red-300\">\n {this.state.error.message}\n </p>\n\n <button\n type=\"button\"\n onClick={this.reset}\n className=\"mt-4 px-4 py-2 text-sm font-medium text-red-900 dark:text-red-100 bg-red-100 dark:bg-red-900/40 hover:bg-red-200 dark:hover:bg-red-900/60 rounded-lg transition-colors\"\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Hook version of error boundary\n */\nexport function useAIErrorHandler() {\n const [error, setError] = React.useState<Error | null>(null);\n\n const handleError = React.useCallback((error: Error) => {\n console.error(\"[useAIErrorHandler] Error:\", error);\n setError(error);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n error,\n handleError,\n clearError,\n hasError: error !== null,\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Theme System for Styled Components\n *\n * Provides default theme and utilities for customization.\n */\n\nexport interface ChatTheme {\n /** Container styles */\n container?: string;\n\n /** Message styles by role */\n message?: {\n user?: string;\n assistant?: string;\n system?: string;\n tool?: string;\n };\n\n /** Input styles */\n input?: string;\n\n /** Button styles */\n button?: string;\n\n /** Loading indicator styles */\n loading?: string;\n}\n\n/**\n * Default theme using Tailwind CSS\n */\nexport const defaultChatTheme: ChatTheme = {\n container: \"flex flex-col h-full bg-white dark:bg-gray-950\",\n message: {\n user: \"bg-blue-600 text-white rounded-lg px-4 py-2 max-w-[70%] ml-auto\",\n assistant:\n \"bg-gray-200 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded-lg px-4 py-2 max-w-[70%]\",\n system:\n \"bg-yellow-100 dark:bg-yellow-900/20 text-yellow-900 dark:text-yellow-100 rounded px-3 py-1 text-sm\",\n tool:\n \"bg-purple-100 dark:bg-purple-900/20 text-purple-900 dark:text-purple-100 rounded px-3 py-1 text-sm font-mono\",\n },\n input:\n \"flex-1 px-4 py-2 border border-gray-300 dark:border-gray-700 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 dark:bg-gray-900 dark:text-gray-100\",\n button:\n \"px-6 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-lg font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed\",\n loading: \"w-5 h-5 border-2 border-gray-400 border-t-transparent rounded-full animate-spin\",\n};\n\nexport interface AgentTheme {\n /** Container styles */\n container?: string;\n\n /** Status styles */\n status?: string;\n\n /** Thinking indicator styles */\n thinking?: string;\n\n /** Tool invocation styles */\n tool?: string;\n\n /** Tool result styles */\n toolResult?: string;\n}\n\n/**\n * Default agent theme\n */\nexport const defaultAgentTheme: AgentTheme = {\n container:\n \"border border-gray-200 dark:border-gray-800 rounded-lg p-6 space-y-4 bg-white dark:bg-gray-950\",\n status: \"inline-flex items-center px-3 py-1 rounded-full text-sm font-medium\",\n thinking:\n \"bg-yellow-50 dark:bg-yellow-900/20 border-l-4 border-yellow-500 pl-4 py-2 italic text-gray-700 dark:text-gray-300\",\n tool: \"border-l-4 border-blue-500 pl-4 py-2 bg-blue-50 dark:bg-blue-900/20\",\n toolResult: \"mt-2 p-3 bg-gray-100 dark:bg-gray-900 rounded font-mono text-sm overflow-x-auto\",\n};\n\n/**\n * Merge themes (user theme overrides default)\n */\nexport function mergeThemes<T extends Record<string, any>>(\n defaultTheme: T,\n userTheme?: Partial<T>,\n): T {\n if (!userTheme) return defaultTheme;\n\n const merged = { ...defaultTheme };\n\n for (const key in userTheme) {\n const value = userTheme[key];\n\n if (value === undefined) {\n continue;\n }\n\n if (typeof value === \"object\" && !Array.isArray(value)) {\n // Merge nested objects\n merged[key] = { ...defaultTheme[key], ...value } as T[Extract<keyof T, string>];\n } else {\n merged[key] = value as T[Extract<keyof T, string>];\n }\n }\n\n return merged;\n}\n\n/**\n * Utility to combine class names\n * (Simple version - in production use 'clsx' or 'cn' from shadcn)\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(\" \");\n}\n", "/**\n * Chat Component - Layer 3 (Styled)\n *\n * Production-ready, fully styled chat component.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n ChatContainer,\n InputBox,\n LoadingIndicator,\n MessageItem,\n MessageList,\n SubmitButton,\n} from \"../primitives/index.ts\";\nimport type { Message, ToolCall } from \"../../types/agent.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface ChatProps {\n /** Messages to display */\n messages: Message[];\n\n /** Current input value */\n input: string;\n\n /** Input change handler (alternative naming) */\n onChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Input change handler (from useChat) */\n handleInputChange?: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler (alternative naming) */\n onSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Submit handler (from useChat) */\n handleSubmit?: (e: React.FormEvent) => void | Promise<void>;\n\n /** Loading state */\n isLoading?: boolean;\n\n /** Error state */\n error?: Error | null;\n\n /** Placeholder text */\n placeholder?: string;\n\n /** Max height */\n maxHeight?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Custom message renderer */\n renderMessage?: (message: Message) => React.ReactNode;\n\n /** Custom tool renderer */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n\n /** Enable multiline input */\n multiline?: boolean;\n}\n\n/**\n * Chat - Complete chat interface\n *\n * Production-ready chat component with sensible defaults.\n *\n * @example\n * ```tsx\n * import { Chat } from 'veryfront/ai/components';\n * import { useChat } from 'veryfront/ai/react';\n *\n * export default function ChatPage() {\n * const chat = useChat({ api: '/api/chat' });\n * return <Chat {...chat} />;\n * }\n * ```\n */\nexport const Chat = React.forwardRef<HTMLDivElement, ChatProps>(\n (\n {\n messages,\n input,\n onChange,\n handleInputChange,\n onSubmit,\n handleSubmit,\n isLoading,\n error,\n placeholder = \"Type a message...\",\n maxHeight = \"100%\",\n className,\n theme: userTheme,\n renderMessage,\n renderTool: _renderTool,\n multiline = false,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n const messagesEndRef = React.useRef<HTMLDivElement>(null);\n\n // Support both naming conventions from useChat\n const inputChangeHandler = onChange || handleInputChange || (() => {});\n const submitHandler = onSubmit || handleSubmit;\n\n // Auto-scroll to bottom on new messages\n React.useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages]);\n\n return (\n <ChatContainer\n ref={ref}\n className={cn(theme.container, className)}\n style={{ maxHeight }}\n >\n {/* Message List */}\n <MessageList className=\"flex-1 overflow-y-auto p-4 space-y-4\">\n {messages.map((msg) =>\n renderMessage\n ? <React.Fragment key={msg.id}>{renderMessage(msg)}</React.Fragment>\n : (\n <MessageItem\n key={msg.id}\n role={msg.role}\n className={cn(\n \"flex\",\n msg.role === \"user\" ? \"justify-end\" : \"justify-start\",\n )}\n >\n <div className={theme.message?.[msg.role] || theme.message?.assistant}>\n {msg.content}\n </div>\n </MessageItem>\n )\n )}\n\n {/* Loading indicator */}\n {isLoading && (\n <div className=\"flex justify-start\">\n <div className=\"bg-gray-200 dark:bg-gray-800 rounded-lg px-4 py-2\">\n <LoadingIndicator className={theme.loading} />\n </div>\n </div>\n )}\n\n {/* Auto-scroll anchor */}\n <div ref={messagesEndRef} />\n </MessageList>\n\n {/* Error display */}\n {error && (\n <div className=\"px-4 py-2 bg-red-50 dark:bg-red-900/20 border-l-4 border-red-500 text-red-900 dark:text-red-100\">\n <p className=\"text-sm font-medium\">Error</p>\n <p className=\"text-sm\">{error.message}</p>\n </div>\n )}\n\n {/* Input area */}\n <form\n onSubmit={submitHandler}\n className=\"border-t border-gray-200 dark:border-gray-800 p-4\"\n >\n <div className=\"flex gap-2\">\n <InputBox\n value={input}\n onChange={inputChangeHandler}\n placeholder={placeholder}\n disabled={isLoading}\n multiline={multiline}\n className={theme.input}\n />\n <SubmitButton\n isLoading={isLoading}\n disabled={!input.trim() || isLoading}\n className={theme.button}\n >\n Send\n </SubmitButton>\n </div>\n </form>\n </ChatContainer>\n );\n },\n);\n\nChat.displayName = \"Chat\";\n\n// Composition API (for advanced usage)\nconst ChatHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-b border-gray-200 dark:border-gray-800 p-4 bg-gray-50 dark:bg-gray-900\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatHeader.displayName = \"ChatHeader\";\n\nconst ChatMessages = MessageList;\nChatMessages.displayName = \"ChatMessages\";\n\nconst ChatInput = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n React.ComponentProps<typeof InputBox>\n>(({ className, ...props }, ref) => {\n return (\n <div className=\"border-t border-gray-200 dark:border-gray-800 p-4\">\n <div className=\"flex gap-2\">\n <InputBox\n ref={ref}\n className={cn(defaultChatTheme.input, className)}\n {...props}\n />\n </div>\n </div>\n );\n});\nChatInput.displayName = \"ChatInput\";\n\nconst ChatFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n \"border-t border-gray-200 dark:border-gray-800 p-4 text-sm text-gray-500\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n});\nChatFooter.displayName = \"ChatFooter\";\n\n// Attach subcomponents for composition API\nexport const ChatComponents = Object.assign(Chat, {\n Header: ChatHeader,\n Messages: ChatMessages,\n Input: ChatInput,\n Footer: ChatFooter,\n});\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { Message } from \"../../types/agent.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: Message[\"role\"];\n\n /** Message content (can be children or prop) */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading state */\n isLoading?: boolean;\n\n children?: React.ReactNode;\n}\n\n/**\n * SubmitButton - Submit button primitive\n *\n * @example\n * ```tsx\n * <SubmitButton\n * onClick={handleSubmit}\n * isLoading={isLoading}\n * disabled={!input.trim()}\n * className=\"px-4 py-2 bg-blue-600 text-white rounded-lg\"\n * >\n * Send\n * </SubmitButton>\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>(({ className, isLoading, disabled, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n type=\"submit\"\n className={className}\n disabled={disabled || isLoading}\n data-submit-button=\"\"\n data-loading={isLoading}\n aria-label=\"Submit message\"\n {...props}\n >\n {children || \"Send\"}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { ToolCall } from \"../../types/agent.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args?: Record<string, unknown>;\n\n /** Tool status */\n status?: ToolCall[\"status\"];\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={tool.name}\n * args={tool.args}\n * status={tool.status}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>(({ className, name, args, status, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-status={status}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {status && <span data-tool-status=\"\">({status})</span>}\n </div>\n\n {args && (\n <div data-tool-args=\"\">\n <pre>{JSON.stringify(args, null, 2)}</pre>\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool result data */\n result: unknown;\n\n /** Custom renderer */\n renderResult?: (result: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display\n *\n * @example\n * ```tsx\n * <ToolResult\n * result={tool.result}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, result, renderResult, ...props }, ref) => {\n const content = renderResult ? renderResult(result) : JSON.stringify(result, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n\n /** Render each tool */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * ToolList - Display list of tool calls\n *\n * @example\n * ```tsx\n * <ToolList\n * toolCalls={agent.toolCalls}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation {...tool}>\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, toolCalls, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {toolCalls.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.id}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.id}\n name={tool.name}\n args={tool.args}\n status={tool.status}\n >\n {tool.result !== undefined && <ToolResult result={tool.result} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n", "/**\n * AgentCard Component - Layer 3 (Styled)\n *\n * Production-ready agent status and tool visualization.\n * Built on Layer 2 primitives.\n */\n\nimport * as React from \"react\";\nimport {\n AgentContainer,\n AgentStatus as AgentStatusPrimitive,\n ThinkingIndicator,\n ToolInvocation,\n ToolList,\n ToolResult,\n} from \"../primitives/index.ts\";\nimport type { AgentStatus, Message, ToolCall } from \"../../types/agent.ts\";\nimport { type AgentTheme, cn, defaultAgentTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface AgentCardProps {\n /** Agent messages */\n messages?: Message[];\n\n /** Tool calls */\n toolCalls?: ToolCall[];\n\n /** Agent status */\n status: AgentStatus;\n\n /** Thinking/reasoning text */\n thinking?: string;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<AgentTheme>;\n\n /** Custom tool renderer */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * AgentCard - Agent status and tool visualization\n *\n * @example\n * ```tsx\n * import { AgentCard } from 'veryfront/ai/components';\n * import { useAgent } from 'veryfront/ai/react';\n *\n * export default function AgentInterface() {\n * const agent = useAgent({ agent: 'support' });\n * return <AgentCard {...agent} />;\n * }\n * ```\n */\nexport const AgentCard = React.forwardRef<HTMLDivElement, AgentCardProps>(\n (\n {\n messages,\n toolCalls = [],\n status,\n thinking,\n className,\n theme: userTheme,\n renderTool,\n },\n ref,\n ) => {\n const theme = mergeThemes(defaultAgentTheme, userTheme);\n\n return (\n <AgentContainer ref={ref} className={cn(theme.container, className)}>\n {/* Status */}\n <AgentStatusPrimitive\n status={status}\n className={cn(theme.status, getStatusColor(status))}\n />\n\n {/* Thinking indicator */}\n {thinking && (\n <ThinkingIndicator className={theme.thinking}>\n <span className=\"font-semibold\">Thinking:</span>\n {thinking}\n </ThinkingIndicator>\n )}\n\n {/* Tool calls */}\n {toolCalls.length > 0 && (\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-gray-700 dark:text-gray-300\">\n Tool Calls\n </h3>\n <ToolList\n toolCalls={toolCalls}\n className=\"space-y-2\"\n renderTool={renderTool ||\n ((tool) => (\n <ToolInvocation\n name={tool.name}\n args={tool.args}\n status={tool.status}\n className={theme.tool}\n >\n {tool.result !== undefined && (\n <ToolResult result={tool.result} className={theme.toolResult} />\n )}\n {tool.error && (\n <div className=\"mt-2 p-2 bg-red-50 dark:bg-red-900/20 text-red-900 dark:text-red-100 rounded text-sm\">\n Error: {tool.error}\n </div>\n )}\n </ToolInvocation>\n ))}\n />\n </div>\n )}\n\n {/* Messages (if provided) */}\n {messages && messages.length > 0 && (\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-gray-700 dark:text-gray-300\">\n Messages\n </h3>\n <div className=\"space-y-2 max-h-96 overflow-y-auto\">\n {messages.map((msg) => (\n <div\n key={msg.id}\n className=\"text-sm p-2 rounded bg-gray-50 dark:bg-gray-900\"\n >\n <span className=\"font-semibold capitalize\">{msg.role}:</span>\n <span>{msg.content.substring(0, 200)}...</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </AgentContainer>\n );\n },\n);\n\nAgentCard.displayName = \"AgentCard\";\n\n/**\n * Get status color classes\n */\nfunction getStatusColor(status: AgentStatus): string {\n switch (status) {\n case \"idle\":\n return \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\";\n case \"thinking\":\n return \"bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300\";\n case \"tool_execution\":\n return \"bg-purple-100 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300\";\n case \"streaming\":\n return \"bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300\";\n case \"completed\":\n return \"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300\";\n case \"error\":\n return \"bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-300\";\n default:\n return \"bg-gray-100 text-gray-700 dark:bg-gray-800 dark:text-gray-300\";\n }\n}\n", "/**\n * Message Component - Layer 3 (Styled)\n *\n * Production-ready message display.\n */\n\nimport * as React from \"react\";\nimport { MessageContent, MessageItem, MessageRole } from \"../primitives/index.ts\";\nimport type { Message as MessageType } from \"../../types/agent.ts\";\nimport { type ChatTheme, cn, defaultChatTheme, mergeThemes } from \"./theme.ts\";\n\nexport interface MessageProps {\n /** Message to display */\n message: MessageType;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n\n /** Show role label */\n showRole?: boolean;\n\n /** Show timestamp */\n showTimestamp?: boolean;\n}\n\n/**\n * Message - Styled message component\n *\n * @example\n * ```tsx\n * import { Message } from 'veryfront/ai/components';\n *\n * <Message message={msg} showRole={true} />\n * ```\n */\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n (\n { message, className, theme: userTheme, showRole = false, showTimestamp = false },\n ref,\n ) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n\n return (\n <MessageItem\n ref={ref}\n role={message.role}\n className={cn(\n \"flex\",\n message.role === \"user\" ? \"justify-end\" : \"justify-start\",\n className,\n )}\n >\n <div className={theme.message?.[message.role] || theme.message?.assistant}>\n {showRole && (\n <MessageRole className=\"block text-xs font-semibold mb-1 opacity-75 uppercase\">\n {message.role}\n </MessageRole>\n )}\n\n <MessageContent>{message.content}</MessageContent>\n\n {showTimestamp && message.timestamp && (\n <div className=\"text-xs opacity-60 mt-1\">\n {new Date(message.timestamp).toLocaleTimeString()}\n </div>\n )}\n </div>\n </MessageItem>\n );\n },\n);\n\nMessage.displayName = \"Message\";\n\nexport interface StreamingMessageProps {\n /** Streaming content */\n content: string;\n\n /** Show typing cursor */\n showCursor?: boolean;\n\n /** Additional class name */\n className?: string;\n\n /** Theme customization */\n theme?: Partial<ChatTheme>;\n}\n\n/**\n * StreamingMessage - Display streaming text\n *\n * @example\n * ```tsx\n * import { StreamingMessage } from 'veryfront/ai/components';\n *\n * {streamingText && (\n * <StreamingMessage content={streamingText} showCursor={true} />\n * )}\n * ```\n */\nexport const StreamingMessage = React.forwardRef<\n HTMLDivElement,\n StreamingMessageProps\n>(({ content, showCursor = true, className, theme: userTheme }, ref) => {\n const theme = mergeThemes(defaultChatTheme, userTheme);\n\n return (\n <MessageItem\n ref={ref}\n role=\"assistant\"\n className={cn(\"flex justify-start\", className)}\n >\n <div className={theme.message?.assistant}>\n <MessageContent>\n {content}\n {showCursor && <span className=\"inline-block w-1 h-4 bg-current ml-1 animate-pulse\" />}\n </MessageContent>\n </div>\n </MessageItem>\n );\n});\n\nStreamingMessage.displayName = \"StreamingMessage\";\n", "/**\n * Error Boundary for AI Components\n *\n * React error boundary specifically designed for AI component errors.\n */\n\nimport * as React from \"react\";\n\nexport interface AIErrorBoundaryProps {\n /** Children to wrap */\n children: React.ReactNode;\n\n /** Fallback UI when error occurs */\n fallback?: React.ReactNode | ((error: Error, reset: () => void) => React.ReactNode);\n\n /** Callback when error occurs */\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\ninterface AIErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\n/**\n * AIErrorBoundary - Error boundary for AI components\n *\n * @example\n * ```tsx\n * import { AIErrorBoundary } from 'veryfront/ai/components';\n *\n * <AIErrorBoundary\n * fallback={(error, reset) => (\n * <div>\n * <p>Error: {error.message}</p>\n * <button onClick={reset}>Try Again</button>\n * </div>\n * )}\n * >\n * <Chat {...chat} />\n * </AIErrorBoundary>\n * ```\n */\nexport class AIErrorBoundary extends React.Component<\n AIErrorBoundaryProps,\n AIErrorBoundaryState\n> {\n constructor(props: AIErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): AIErrorBoundaryState {\n return { hasError: true, error };\n }\n\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n // Log error\n console.error(\"[AIErrorBoundary] Caught error:\", error, errorInfo);\n\n // Call error callback\n if (this.props.onError) {\n this.props.onError(error, errorInfo);\n }\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n override render() {\n if (this.state.hasError && this.state.error) {\n // Custom fallback\n if (this.props.fallback) {\n if (typeof this.props.fallback === \"function\") {\n return this.props.fallback(this.state.error, this.reset);\n }\n return this.props.fallback;\n }\n\n // Default fallback UI\n return (\n <div\n className=\"border border-red-200 bg-red-50 dark:bg-red-900/20 rounded-lg p-6\"\n role=\"alert\"\n >\n <div className=\"flex items-start gap-3\">\n <svg\n className=\"w-5 h-5 text-red-600 dark:text-red-400 mt-0.5\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n\n <div className=\"flex-1\">\n <h3 className=\"text-sm font-semibold text-red-900 dark:text-red-100\">\n {this.props.errorMessage || \"An error occurred in the AI component\"}\n </h3>\n\n <p className=\"mt-2 text-sm text-red-700 dark:text-red-300\">\n {this.state.error.message}\n </p>\n\n <button\n type=\"button\"\n onClick={this.reset}\n className=\"mt-4 px-4 py-2 text-sm font-medium text-red-900 dark:text-red-100 bg-red-100 dark:bg-red-900/40 hover:bg-red-200 dark:hover:bg-red-900/60 rounded-lg transition-colors\"\n >\n Try Again\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Hook version of error boundary\n */\nexport function useAIErrorHandler() {\n const [error, setError] = React.useState<Error | null>(null);\n\n const handleError = React.useCallback((error: Error) => {\n console.error(\"[useAIErrorHandler] Error:\", error);\n setError(error);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n error,\n handleError,\n clearError,\n hasError: error !== null,\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "React", "jsx", "React", "jsx", "React", "jsx", "React", "jsx", "jsx", "jsxs", "React", "jsx", "jsxs", "React", "jsx", "jsxs", "React", "jsx", "jsxs", "error"]
7
7
  }
package/dist/ai/index.js CHANGED
@@ -1675,7 +1675,7 @@ var LRU_DEFAULT_MAX_SIZE_BYTES = 50 * 1024 * 1024;
1675
1675
  // deno.json
1676
1676
  var deno_default = {
1677
1677
  name: "veryfront",
1678
- version: "0.0.37",
1678
+ version: "0.0.38",
1679
1679
  exclude: [
1680
1680
  "npm/",
1681
1681
  "dist/",