@mieweb/ui 0.9.0-dev.1 → 0.9.0-dev.3

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 (98) hide show
  1. package/dist/{Animated-Cs-naa2g.d.cts → Animated-XmH6k8pZ.d.cts} +16 -3
  2. package/dist/{Animated-Cs-naa2g.d.ts → Animated-XmH6k8pZ.d.ts} +16 -3
  3. package/dist/{chunk-XUVEF2RQ.js → chunk-24SEAAOH.js} +2 -2
  4. package/dist/{chunk-XUVEF2RQ.js.map → chunk-24SEAAOH.js.map} +1 -1
  5. package/dist/{chunk-FUFBRKOG.cjs → chunk-2WBPNXO2.cjs} +21 -21
  6. package/dist/{chunk-FUFBRKOG.cjs.map → chunk-2WBPNXO2.cjs.map} +1 -1
  7. package/dist/{chunk-IUDY6S7I.cjs → chunk-37UZHCLM.cjs} +35 -14
  8. package/dist/chunk-37UZHCLM.cjs.map +1 -0
  9. package/dist/{chunk-L52N6BEN.cjs → chunk-AUOTJQGO.cjs} +7 -7
  10. package/dist/{chunk-L52N6BEN.cjs.map → chunk-AUOTJQGO.cjs.map} +1 -1
  11. package/dist/{chunk-2A2FLQJC.cjs → chunk-B67VPJCZ.cjs} +9 -9
  12. package/dist/{chunk-2A2FLQJC.cjs.map → chunk-B67VPJCZ.cjs.map} +1 -1
  13. package/dist/{chunk-6XDPJWSC.cjs → chunk-E7G22IQM.cjs} +32 -28
  14. package/dist/chunk-E7G22IQM.cjs.map +1 -0
  15. package/dist/{chunk-ONNY7UO4.js → chunk-JDJQTKTX.js} +3 -3
  16. package/dist/{chunk-ONNY7UO4.js.map → chunk-JDJQTKTX.js.map} +1 -1
  17. package/dist/{chunk-BJKAVWED.js → chunk-MBWF36DJ.js} +35 -14
  18. package/dist/chunk-MBWF36DJ.js.map +1 -0
  19. package/dist/{chunk-CXDMZT45.cjs → chunk-NPHZUCF3.cjs} +25 -2
  20. package/dist/chunk-NPHZUCF3.cjs.map +1 -0
  21. package/dist/chunk-NV2CWBI2.cjs +290 -0
  22. package/dist/chunk-NV2CWBI2.cjs.map +1 -0
  23. package/dist/{chunk-7KN6J7XV.cjs → chunk-OMAACCFW.cjs} +7 -7
  24. package/dist/{chunk-7KN6J7XV.cjs.map → chunk-OMAACCFW.cjs.map} +1 -1
  25. package/dist/{chunk-YJP6DUFO.cjs → chunk-PKD3JLS2.cjs} +6 -6
  26. package/dist/{chunk-YJP6DUFO.cjs.map → chunk-PKD3JLS2.cjs.map} +1 -1
  27. package/dist/{chunk-5H7SAEQO.js → chunk-QKFJDQEK.js} +3 -3
  28. package/dist/{chunk-5H7SAEQO.js.map → chunk-QKFJDQEK.js.map} +1 -1
  29. package/dist/{chunk-XJTFZLWH.cjs → chunk-QO6PRHDX.cjs} +2 -2
  30. package/dist/{chunk-XJTFZLWH.cjs.map → chunk-QO6PRHDX.cjs.map} +1 -1
  31. package/dist/{chunk-OHDIJOGG.js → chunk-RD3JDFYJ.js} +3 -3
  32. package/dist/{chunk-OHDIJOGG.js.map → chunk-RD3JDFYJ.js.map} +1 -1
  33. package/dist/{chunk-4SM3I7WE.cjs → chunk-RXPEZXAB.cjs} +67 -38
  34. package/dist/chunk-RXPEZXAB.cjs.map +1 -0
  35. package/dist/{chunk-VTR2KGLY.cjs → chunk-S3BCHPXT.cjs} +9 -9
  36. package/dist/{chunk-VTR2KGLY.cjs.map → chunk-S3BCHPXT.cjs.map} +1 -1
  37. package/dist/{chunk-KU3XRHWA.js → chunk-TZX76ZNZ.js} +67 -38
  38. package/dist/chunk-TZX76ZNZ.js.map +1 -0
  39. package/dist/{chunk-DGRXAIWK.js → chunk-UHHYJ42E.js} +25 -2
  40. package/dist/chunk-UHHYJ42E.js.map +1 -0
  41. package/dist/{chunk-KATEJG2F.js → chunk-VMQZAOFM.js} +3 -3
  42. package/dist/{chunk-KATEJG2F.js.map → chunk-VMQZAOFM.js.map} +1 -1
  43. package/dist/{chunk-Q7G56ZIO.js → chunk-WUBMDOTG.js} +3 -3
  44. package/dist/{chunk-Q7G56ZIO.js.map → chunk-WUBMDOTG.js.map} +1 -1
  45. package/dist/chunk-XCP454Q6.js +263 -0
  46. package/dist/chunk-XCP454Q6.js.map +1 -0
  47. package/dist/{chunk-I3DQXUSC.js → chunk-Y6DFMDMH.js} +3 -3
  48. package/dist/{chunk-I3DQXUSC.js.map → chunk-Y6DFMDMH.js.map} +1 -1
  49. package/dist/{chunk-ODYQYLO2.js → chunk-YSEMAI4I.js} +8 -4
  50. package/dist/chunk-YSEMAI4I.js.map +1 -0
  51. package/dist/components/AlertDialog/index.cjs +4 -4
  52. package/dist/components/AlertDialog/index.js +3 -3
  53. package/dist/components/Collapsible/index.cjs +6 -4
  54. package/dist/components/Collapsible/index.js +3 -1
  55. package/dist/components/Dropdown/index.cjs +9 -8
  56. package/dist/components/Dropdown/index.js +2 -1
  57. package/dist/components/KeyboardShortcutsOverlay/index.cjs +5 -5
  58. package/dist/components/KeyboardShortcutsOverlay/index.js +3 -3
  59. package/dist/components/MediaEditor/index.cjs +8 -8
  60. package/dist/components/MediaEditor/index.js +3 -3
  61. package/dist/components/Modal/index.cjs +10 -10
  62. package/dist/components/Modal/index.js +2 -2
  63. package/dist/components/RichTextEditor/index.cjs +6 -5
  64. package/dist/components/RichTextEditor/index.js +3 -2
  65. package/dist/components/SuperChat/index.cjs +14 -13
  66. package/dist/components/SuperChat/index.cjs.map +1 -1
  67. package/dist/components/SuperChat/index.js +3 -2
  68. package/dist/components/SuperChat/index.js.map +1 -1
  69. package/dist/esheet.cjs +6 -6
  70. package/dist/esheet.js +3 -3
  71. package/dist/hooks/index.cjs +13 -13
  72. package/dist/hooks/index.js +1 -1
  73. package/dist/index.cjs +1339 -1224
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.d.cts +19 -4
  76. package/dist/index.d.ts +19 -4
  77. package/dist/index.js +998 -884
  78. package/dist/index.js.map +1 -1
  79. package/dist/motion.cjs +7 -7
  80. package/dist/motion.d.cts +1 -1
  81. package/dist/motion.d.ts +1 -1
  82. package/dist/motion.js +2 -2
  83. package/dist/styles.css +1 -1
  84. package/dist/tailwind-preset.cjs +4 -4
  85. package/dist/tailwind-preset.js +1 -1
  86. package/package.json +1 -1
  87. package/dist/chunk-4SM3I7WE.cjs.map +0 -1
  88. package/dist/chunk-6XDPJWSC.cjs.map +0 -1
  89. package/dist/chunk-BJKAVWED.js.map +0 -1
  90. package/dist/chunk-BN75TLUN.cjs +0 -163
  91. package/dist/chunk-BN75TLUN.cjs.map +0 -1
  92. package/dist/chunk-CXDMZT45.cjs.map +0 -1
  93. package/dist/chunk-DGRXAIWK.js.map +0 -1
  94. package/dist/chunk-IUDY6S7I.cjs.map +0 -1
  95. package/dist/chunk-KU3XRHWA.js.map +0 -1
  96. package/dist/chunk-ODYQYLO2.js.map +0 -1
  97. package/dist/chunk-WYMO3IIK.js +0 -136
  98. package/dist/chunk-WYMO3IIK.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AI/icons.tsx","../src/components/AI/CollapsiblePill.tsx","../src/components/AI/MCPToolCall.tsx","../src/components/AI/AIMessage.tsx","../src/components/AI/ComposerModelSelector.tsx","../src/components/ChatComposer/ChatComposer.tsx"],"names":["React","jsxs","jsx","cva","React2","value","ChevronUp","Check","React4","ChatComposer","Fragment"],"mappings":"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","file":"chunk-KATEJG2F.js","sourcesContent":["/**\n * AI Component Icons\n *\n * Shared icon components for AI features to follow DRY principles.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Sparkles Icon (Modern AI Symbol)\n// ============================================================================\n\nexport interface SparklesIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-7 w-7',\n};\n\n/**\n * Sparkles icon - the modern symbol for AI features\n * Used by ChatGPT, GitHub Copilot, Google Gemini, etc.\n */\nexport function SparklesIcon({ className, size = 'md' }: SparklesIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n {/* Large sparkle */}\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n {/* Small sparkle */}\n <path\n d=\"M20 3v4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 5h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// AI Logo Icon (Stack/Layers) - Legacy\n// ============================================================================\n\nexport interface AILogoIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * The AI assistant logo - a stacked layers/prism icon\n * @deprecated Use SparklesIcon for a more recognizable AI symbol\n */\nexport function AILogoIcon({ className, size = 'md' }: AILogoIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"currentColor\"\n fillOpacity=\"0.2\"\n />\n <path\n d=\"M2 17L12 22L22 17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12L12 17L22 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nexport interface CloseIconProps {\n className?: string;\n}\n\nexport function CloseIcon({ className }: CloseIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Refresh/Clear Icon\n// ============================================================================\n\nexport interface RefreshIconProps {\n className?: string;\n}\n\nexport function RefreshIcon({ className }: RefreshIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Chevron Icon\n// ============================================================================\n\nexport interface ChevronIconProps {\n className?: string;\n direction?: 'up' | 'down' | 'left' | 'right';\n}\n\nconst chevronRotation = {\n up: '-rotate-180',\n down: '',\n left: 'rotate-90',\n right: '-rotate-90',\n};\n\nexport function ChevronIcon({\n className,\n direction = 'down',\n}: ChevronIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-4 w-4', chevronRotation[direction], className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Send Icon\n// ============================================================================\n\nexport interface SendIconProps {\n className?: string;\n}\n\nexport function SendIcon({ className }: SendIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\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 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Spinner Icon\n// ============================================================================\n\nexport interface SpinnerIconProps {\n className?: string;\n}\n\nexport function SpinnerIcon({ className }: SpinnerIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5 animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { ChevronIcon } from './icons';\n\nexport interface CollapsiblePillProps {\n label: string;\n leadingIcon?: React.ReactNode;\n density?: 'standard' | 'condensed';\n defaultOpen?: boolean;\n pillClassName?: string;\n className?: string;\n /** Native tooltip shown on hover (e.g. \"Show details\") */\n title?: string;\n children?: React.ReactNode;\n}\n\nexport function CollapsiblePill({\n label,\n leadingIcon,\n density = 'standard',\n defaultOpen = false,\n pillClassName,\n className,\n title,\n children,\n}: CollapsiblePillProps) {\n const hasContent = Boolean(children);\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\n const contentId = React.useId();\n\n React.useEffect(() => {\n setIsOpen(defaultOpen);\n }, [defaultOpen]);\n\n const toggle = () => {\n setIsOpen((open) => !open);\n };\n\n return (\n <div data-slot=\"collapsible-pill\" className={className}>\n <button\n type=\"button\"\n onClick={hasContent ? toggle : undefined}\n aria-expanded={hasContent ? isOpen : undefined}\n aria-controls={hasContent ? contentId : undefined}\n title={title}\n disabled={!hasContent}\n className={cn(\n 'focus-visible:ring-ring inline-flex items-center gap-1.5 border font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n density === 'condensed'\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n pillClassName\n )}\n >\n {leadingIcon}\n <span>{label}</span>\n {hasContent && (\n <ChevronIcon\n direction={isOpen ? 'down' : 'right'}\n className={\n density === 'condensed'\n ? 'h-2.5 w-2.5 opacity-60'\n : 'h-3 w-3 opacity-60'\n }\n />\n )}\n </button>\n {hasContent && (\n <div\n id={contentId}\n aria-hidden={!isOpen}\n inert={!isOpen || undefined}\n className={cn(\n 'overflow-hidden transition-[max-height,opacity] duration-300 ease-in-out',\n isOpen\n ? 'max-h-[500px] overflow-y-auto opacity-100'\n : 'max-h-0 opacity-0'\n )}\n >\n <div className=\"mt-1.5\">{children}</div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * MCP Tool Call Display Component\n *\n * Renders an MCP tool invocation with status, parameters, and results.\n */\n\nimport * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport type {\n MCPToolCall,\n MCPToolStatus,\n MCPToolResult,\n MCPResourceLink,\n MCPToolParameter,\n} from './types';\n\n// ============================================================================\n// Status Icon Component\n// ============================================================================\n\nconst statusIconVariants = cva(\n 'flex h-5 w-5 items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-neutral-200 dark:bg-neutral-700',\n running: 'bg-primary-100 dark:bg-primary-900/50',\n success: 'bg-green-100 dark:bg-green-900/50',\n error: 'bg-red-100 dark:bg-red-900/50',\n cancelled: 'bg-neutral-200 dark:bg-neutral-700',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\ninterface ToolStatusIconProps {\n status: MCPToolStatus;\n className?: string;\n}\n\nfunction ToolStatusIcon({ status, className }: ToolStatusIconProps) {\n return (\n <span\n data-slot=\"ai-tool-status-icon\"\n className={cn(statusIconVariants({ status }), className)}\n >\n {status === 'pending' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\n </svg>\n )}\n {status === 'running' && (\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 dark:text-primary-400 h-3 w-3 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {status === 'success' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {status === 'error' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )}\n {status === 'cancelled' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 12H6\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Tool Icon Component\n// ============================================================================\n\nconst TOOL_ICONS: Record<string, React.ReactNode> = {\n // Patient tools\n create_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M18 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM3 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 019.374 21c-2.331 0-4.512-.645-6.374-1.766z\"\n />\n </svg>\n ),\n get_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n search_patients: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n ),\n // Appointment tools\n schedule_appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z\"\n />\n </svg>\n ),\n // Document tools\n create_document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n // Provider tools\n search_providers: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n // Default tool icon\n default: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n ),\n};\n\nfunction getToolIcon(toolName: string): React.ReactNode {\n return TOOL_ICONS[toolName] || TOOL_ICONS.default;\n}\n\n// ============================================================================\n// Resource Link Component\n// ============================================================================\n\nexport interface ResourceLinkProps {\n link: MCPResourceLink;\n onClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nexport function ResourceLink({ link, onClick, className }: ResourceLinkProps) {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault();\n onClick(link);\n }\n };\n\n const linkTypeIcons: Record<string, React.ReactNode> = {\n patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\"\n />\n </svg>\n ),\n order: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25z\"\n />\n </svg>\n ),\n provider: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n external: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n />\n </svg>\n ),\n internal: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\"\n />\n </svg>\n ),\n };\n\n const icon = link.type ? linkTypeIcons[link.type] : linkTypeIcons.internal;\n\n return (\n <a\n href={link.href}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5',\n 'bg-primary-50 text-primary-900 hover:bg-primary-100',\n 'dark:bg-primary-900/30 dark:text-primary-300 dark:hover:bg-primary-900/50',\n 'text-sm font-medium transition-colors',\n 'focus:ring-primary-500 focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'dark:focus:ring-offset-neutral-900',\n className\n )}\n >\n {icon}\n <span>{link.label}</span>\n {link.type === 'external' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 opacity-60\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.5 19.5l15-15m0 0H8.25m11.25 0v11.25\"\n />\n </svg>\n )}\n </a>\n );\n}\n\n// ============================================================================\n// Tool Result Component\n// ============================================================================\n\ninterface ToolResultDisplayProps {\n result: MCPToolResult;\n onLinkClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nfunction ToolResultDisplay({\n result,\n onLinkClick,\n className,\n}: ToolResultDisplayProps) {\n if (result.type === 'error') {\n return (\n <div\n className={cn(\n 'mt-2 rounded-md bg-red-50 p-3 dark:bg-red-900/20',\n className\n )}\n >\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {typeof result.data === 'string'\n ? String(result.data)\n : 'An error occurred'}\n </p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {result.summary && (\n <p className=\"text-sm text-neutral-700 dark:text-neutral-300\">\n {result.summary}\n </p>\n )}\n\n {result.link && <ResourceLink link={result.link} onClick={onLinkClick} />}\n\n {result.resources && result.resources.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {result.resources.map((resource) => (\n <ResourceLink\n key={resource.id}\n link={{\n href: resource.uri || '#',\n label: resource.name,\n type: resource.type as MCPResourceLink['type'],\n }}\n onClick={onLinkClick}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// MCP Tool Call Component\n// ============================================================================\n\n// Human-readable tool names\nconst TOOL_FRIENDLY_NAMES: Record<string, string> = {\n create_patient: 'Creating patient',\n get_patient: 'Looking up patient',\n search_patients: 'Searching patients',\n update_patient: 'Updating patient',\n delete_patient: 'Removing patient',\n schedule_appointment: 'Scheduling appointment',\n cancel_appointment: 'Canceling appointment',\n update_appointment: 'Updating appointment',\n create_document: 'Creating document',\n upload_document: 'Uploading document',\n get_document: 'Retrieving document',\n search_documents: 'Searching documents',\n create_order: 'Creating order',\n send_message: 'Sending message',\n search: 'Searching',\n search_providers: 'Searching for providers',\n};\n\nfunction getToolFriendlyName(toolName: string, status: MCPToolStatus): string {\n const baseName = TOOL_FRIENDLY_NAMES[toolName] || toolName.replace(/_/g, ' ');\n\n // Adjust tense based on status\n if (status === 'success') {\n // Past tense approximation — check longer prefixes first to avoid\n // partial matches (e.g. \"Searching for\" before \"Searching\")\n if (baseName.startsWith('Creating'))\n return baseName.replace('Creating', 'Created');\n if (baseName.startsWith('Scheduling'))\n return baseName.replace('Scheduling', 'Scheduled');\n if (baseName.startsWith('Searching for'))\n return baseName.replace('Searching for', 'Found');\n if (baseName.startsWith('Searching'))\n return baseName.replace('Searching', 'Found');\n if (baseName.startsWith('Looking'))\n return baseName.replace('Looking', 'Found');\n if (baseName.startsWith('Updating'))\n return baseName.replace('Updating', 'Updated');\n if (baseName.startsWith('Removing'))\n return baseName.replace('Removing', 'Removed');\n if (baseName.startsWith('Canceling'))\n return baseName.replace('Canceling', 'Canceled');\n if (baseName.startsWith('Retrieving'))\n return baseName.replace('Retrieving', 'Retrieved');\n if (baseName.startsWith('Uploading'))\n return baseName.replace('Uploading', 'Uploaded');\n if (baseName.startsWith('Sending'))\n return baseName.replace('Sending', 'Sent');\n }\n return baseName;\n}\n\n// Generate a user-friendly summary from parameters\nfunction getParameterSummary(\n toolName: string,\n params: MCPToolParameter[]\n): string | null {\n const paramMap = Object.fromEntries(params.map((p) => [p.name, p.value]));\n\n // Patient creation\n if (\n toolName === 'create_patient' &&\n paramMap.firstName &&\n paramMap.lastName\n ) {\n return `${paramMap.firstName} ${paramMap.lastName}`;\n }\n\n // Search\n if (toolName.includes('search') && paramMap.query) {\n return `\"${paramMap.query}\"`;\n }\n\n // Appointment\n if (toolName.includes('appointment') && paramMap.patientName) {\n const date = paramMap.preferredDate || paramMap.date;\n return date\n ? `${paramMap.patientName} on ${date}`\n : String(paramMap.patientName);\n }\n\n // Provider search\n if (toolName === 'search_providers' && paramMap.zipcode) {\n const service = paramMap.service;\n return service\n ? `${service} near ${paramMap.zipcode}`\n : `near ${paramMap.zipcode}`;\n }\n\n return null;\n}\n\n// Pill header colors per status (Ozwell-style status pill)\nconst statusPillClasses: Record<MCPToolStatus, string> = {\n pending:\n 'bg-neutral-100 border-neutral-200 text-neutral-600 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n running:\n 'bg-primary-50 border-primary-200 text-primary-800 dark:bg-primary-900/20 dark:border-primary-800 dark:text-primary-300',\n success:\n 'bg-green-50 border-green-200 text-green-700 dark:bg-green-900/20 dark:border-green-800 dark:text-green-300',\n error:\n 'bg-red-50 border-red-200 text-red-700 dark:bg-red-900/20 dark:border-red-800 dark:text-red-300',\n cancelled:\n 'bg-neutral-100 border-neutral-200 text-neutral-400 opacity-60 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n};\n\nexport interface MCPToolCallDisplayProps {\n /** The tool call to display */\n toolCall: MCPToolCall;\n /** Compact (condensed) sizing — tighter pill and box */\n compact?: boolean;\n /** Whether to include raw parameters inside the detail box */\n showParameters?: boolean;\n /** Whether clicking the pill can expand/collapse the entire detail box */\n collapsible?: boolean;\n /** Default collapsed state. By default, completed tool calls start expanded. */\n defaultCollapsed?: boolean;\n /** Hide the whole tool-call display (mirrors Ozwell's debug flag) */\n hidden?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an MCP tool call with its status, parameters, and results.\n * Shows a user-friendly summary by default, with technical details available on expand.\n */\nexport function MCPToolCallDisplay({\n toolCall,\n showParameters = true,\n collapsible = true,\n defaultCollapsed,\n compact,\n hidden = false,\n onLinkClick,\n className,\n}: MCPToolCallDisplayProps) {\n const formatDuration = (ms?: number) => {\n if (!ms) return null;\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n const friendlyName = getToolFriendlyName(toolCall.toolName, toolCall.status);\n const durationLabel = formatDuration(toolCall.duration);\n const paramSummary = getParameterSummary(\n toolCall.toolName,\n toolCall.parameters\n );\n\n // While running, show the input summary in the pill (e.g. \"Creating patient\n // · John Smith\"). On success the name already appears as the result link, so\n // show the duration instead to avoid duplication.\n const detailBit =\n toolCall.status === 'success'\n ? durationLabel\n : (paramSummary ?? durationLabel);\n const pillLabel = detailBit ? `${friendlyName} · ${detailBit}` : friendlyName;\n\n const hasParams = showParameters && toolCall.parameters.length > 0;\n const hasBoxContent = Boolean(toolCall.result || toolCall.error || hasParams);\n const isCompleted =\n toolCall.status === 'success' || toolCall.status === 'error';\n const effectiveDefaultCollapsed = defaultCollapsed ?? !isCompleted;\n\n if (hidden) return null;\n\n // Everything the pill reveals in one click: result, links, and raw params.\n const box = (\n <div\n className={cn(\n 'w-full max-w-md space-y-2 rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50',\n compact ? 'p-2' : 'p-3'\n )}\n >\n {/* Result Summary & Links */}\n {toolCall.result && (\n <div data-slot=\"ai-tool-result\">\n <ToolResultDisplay\n result={toolCall.result}\n onLinkClick={onLinkClick}\n />\n </div>\n )}\n\n {/* Error */}\n {toolCall.error && (\n <div className=\"rounded-md bg-red-100 p-2 dark:bg-red-900/30\">\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {toolCall.error}\n </p>\n </div>\n )}\n\n {/* Raw parameters — revealed together with the box */}\n {hasParams && (\n <div\n data-slot=\"ai-tool-parameters\"\n className=\"rounded-md bg-neutral-100 p-2 dark:bg-neutral-800\"\n >\n <h4 className=\"mb-1.5 text-xs font-medium tracking-wide text-neutral-600 uppercase dark:text-neutral-400\">\n Parameters\n </h4>\n <div className=\"space-y-0.5\">\n {toolCall.parameters.map((param) => (\n <div key={param.name} className=\"flex items-start gap-2 text-xs\">\n <span className=\"font-mono text-neutral-600 dark:text-neutral-400\">\n {param.name}:\n </span>\n <span className=\"font-mono text-neutral-700 dark:text-neutral-300\">\n {typeof param.value === 'string'\n ? param.value\n : JSON.stringify(param.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n const staticPill = (\n <span\n data-slot=\"ai-tool-pill\"\n className={cn(\n 'inline-flex items-center gap-1.5 border font-medium',\n compact\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n statusPillClasses[toolCall.status]\n )}\n >\n <ToolStatusIcon status={toolCall.status} />\n <span>{pillLabel}</span>\n </span>\n );\n\n return (\n <div data-slot=\"ai-tool-call\" className={className}>\n {!hasBoxContent ? (\n staticPill\n ) : collapsible ? (\n // Pill click reveals the whole box (result + params) in one go.\n <CollapsiblePill\n label={pillLabel}\n leadingIcon={<ToolStatusIcon status={toolCall.status} />}\n density={compact ? 'condensed' : 'standard'}\n defaultOpen={!effectiveDefaultCollapsed}\n pillClassName={statusPillClasses[toolCall.status]}\n title=\"Toggle details\"\n >\n {box}\n </CollapsiblePill>\n ) : (\n // Non-collapsible: pill + box always visible.\n <div className=\"space-y-1.5\">\n {staticPill}\n {box}\n </div>\n )}\n </div>\n );\n}\n\nexport { ToolStatusIcon, getToolIcon };\n","/**\n * AI Message Component\n *\n * Renders AI chat messages with support for text, tool calls, and streaming.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n AIMessage,\n AIMessageContent,\n AIRenderMessageFooter,\n AIRenderTextContent,\n MCPResourceLink,\n} from './types';\nimport { MCPToolCallDisplay } from './MCPToolCall';\nimport { SparklesIcon } from './icons';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport { AudioPlayer } from '../AudioPlayer';\n\n// ============================================================================\n// Avatar Component\n// ============================================================================\n\nconst avatarVariants = cva(\n 'flex shrink-0 items-center justify-center rounded-full',\n {\n variants: {\n role: {\n user: 'bg-primary-100 text-primary-900 dark:bg-primary-900/50 dark:text-primary-300',\n assistant: 'bg-primary-800 text-white dark:bg-primary-800',\n system:\n 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-400',\n tool: 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300',\n },\n size: {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n },\n },\n defaultVariants: {\n role: 'user',\n size: 'md',\n },\n }\n);\n\ninterface MessageAvatarProps extends VariantProps<typeof avatarVariants> {\n userName?: string;\n className?: string;\n}\n\nfunction MessageAvatar({\n role,\n size,\n userName,\n className,\n}: MessageAvatarProps) {\n const getInitials = (name?: string) => {\n if (!name) return '?';\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n };\n\n return (\n <div\n data-slot=\"ai-message-avatar\"\n className={cn(avatarVariants({ role, size }), className)}\n >\n {role === 'assistant' ? (\n <SparklesIcon size=\"md\" />\n ) : role === 'user' ? (\n <span className=\"font-medium\">{getInitials(userName)}</span>\n ) : role === 'system' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Typing Indicator\n// ============================================================================\n\nfunction AITypingIndicator({ className }: { className?: string }) {\n const dotStyle = {\n width: '6px',\n height: '6px',\n minWidth: '6px',\n minHeight: '6px',\n flexShrink: 0,\n };\n\n return (\n <div\n data-slot=\"ai-typing-indicator\"\n className={cn('inline-flex items-center justify-center gap-2', className)}\n >\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.32s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.16s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n }}\n />\n <style>{`\n @keyframes typing-dot {\n 0%, 80%, 100% { opacity: 0.4; }\n 40% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\n// ============================================================================\n// Thinking Block\n// ============================================================================\n\nfunction ThinkingBlock({\n text,\n streaming,\n defaultCollapsed = false,\n}: {\n text: string;\n streaming: boolean;\n defaultCollapsed?: boolean;\n}) {\n const startedAt = React.useRef(Date.now());\n const [elapsed, setElapsed] = React.useState<number | null>(null);\n const prevStreaming = React.useRef(streaming);\n\n React.useEffect(() => {\n if (prevStreaming.current && !streaming) {\n setElapsed(Math.round((Date.now() - startedAt.current) / 1000));\n }\n prevStreaming.current = streaming;\n }, [streaming]);\n\n const label = streaming\n ? 'Thinking'\n : elapsed !== null && elapsed > 0\n ? `Thought for ${elapsed}s`\n : 'Thought';\n\n const dot = streaming ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-violet-500 dark:bg-violet-400\"\n />\n ) : null;\n\n return (\n <div data-slot=\"ai-message-thinking\">\n <CollapsiblePill\n label={label}\n leadingIcon={dot}\n defaultOpen={!defaultCollapsed}\n pillClassName=\"bg-violet-50 border-violet-200 text-violet-600 hover:bg-violet-100 dark:bg-violet-950/30 dark:border-violet-800 dark:text-violet-400 dark:hover:bg-violet-950/50 focus-visible:ring-violet-500\"\n >\n <div className=\"border-s-2 border-violet-200 ps-3 text-[13px] leading-relaxed text-neutral-600 italic dark:border-violet-700 dark:text-neutral-400\">\n {text}\n </div>\n </CollapsiblePill>\n </div>\n );\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\ninterface ContentBlockProps {\n content: AIMessageContent;\n onLinkClick?: (link: MCPResourceLink) => void;\n messageId: string;\n streaming: boolean;\n role: AIMessage['role'];\n renderTextContent?: AIRenderTextContent;\n}\n\nfunction ContentBlock({\n content,\n onLinkClick,\n messageId,\n streaming,\n role,\n renderTextContent,\n}: ContentBlockProps) {\n if (content.type === 'text' && content.text) {\n if (renderTextContent) {\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n {renderTextContent(content.text, { messageId, streaming, role })}\n </div>\n );\n }\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <p className=\"whitespace-pre-wrap\">{content.text}</p>\n </div>\n );\n }\n\n if (content.type === 'tool_use' && content.toolCall) {\n return (\n <MCPToolCallDisplay\n toolCall={content.toolCall}\n onLinkClick={onLinkClick}\n defaultCollapsed={content.collapsed}\n />\n );\n }\n\n if (content.type === 'thinking' && content.text) {\n return (\n <ThinkingBlock\n text={content.text}\n streaming={streaming}\n defaultCollapsed={content.collapsed ?? false}\n />\n );\n }\n\n if (content.type === 'code' && content.text) {\n return (\n <pre\n data-slot=\"ai-message-code\"\n className=\"rounded-lg bg-neutral-900 p-3 text-sm dark:bg-neutral-950\"\n >\n <code\n className={content.language ? `language-${content.language}` : ''}\n >\n {content.text}\n </code>\n </pre>\n );\n }\n\n if (content.type === 'audio' && content.audioUrl) {\n // Guard against `javascript:` URLs, mirroring the image/file blocks.\n if (/^\\s*javascript:/i.test(content.audioUrl)) {\n return null;\n }\n return (\n <AudioPlayer\n src={content.audioUrl}\n title={content.text || 'Audio recording'}\n variant=\"waveform\"\n showTime\n showPlaybackRate\n fallbackDuration={content.duration}\n />\n );\n }\n\n if (content.type === 'video' && content.videoUrl) {\n // Guard against `javascript:` URLs, mirroring the audio/image/file blocks.\n if (/^\\s*javascript:/i.test(content.videoUrl)) {\n return null;\n }\n return (\n <video\n src={content.videoUrl}\n controls\n preload=\"metadata\"\n aria-label={content.text || 'Video recording'}\n className=\"my-1 max-h-80 w-full rounded-lg bg-black\"\n >\n {/* Recorded clips carry no caption track; present for a11y compliance. */}\n <track kind=\"captions\" />\n </video>\n );\n }\n\n if (content.type === 'image' && content.imageUrl) {\n const safeHref = /^\\s*javascript:/i.test(content.imageUrl)\n ? undefined\n : content.imageUrl;\n return (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit transition-transform hover:scale-[1.02]\"\n aria-label={`View ${content.name || 'Uploaded image'}`}\n >\n <img\n src={content.imageUrl}\n alt={content.name || 'Uploaded image'}\n loading=\"lazy\"\n className=\"my-1 max-h-64 w-auto rounded-lg object-cover\"\n />\n </a>\n );\n }\n\n if (content.type === 'file') {\n const sizeLabel =\n typeof content.fileSize === 'number'\n ? formatFileSize(content.fileSize)\n : undefined;\n const card = (\n <div className=\"my-1 flex items-center gap-3 rounded-lg bg-neutral-100 p-3 transition-colors dark:bg-neutral-800\">\n <div className=\"rounded-lg bg-neutral-200 p-2 dark:bg-neutral-700\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {content.name || 'Document'}\n </p>\n {sizeLabel && <p className=\"text-xs opacity-70\">{sizeLabel}</p>}\n </div>\n </div>\n );\n\n if (content.fileUrl) {\n const safeFileHref = /^\\s*javascript:/i.test(content.fileUrl)\n ? undefined\n : content.fileUrl;\n return (\n <a\n href={safeFileHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit no-underline\"\n >\n {card}\n </a>\n );\n }\n return card;\n }\n\n return null;\n}\n\n/** Human-readable file size (e.g. \"1.2 MB\"). */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// AI Message Component\n// ============================================================================\n\nconst messageVariants = cva('flex gap-3', {\n variants: {\n role: {\n user: 'flex-row-reverse',\n assistant: 'flex-row',\n system: 'flex-row justify-center',\n tool: 'flex-row',\n },\n },\n defaultVariants: {\n role: 'assistant',\n },\n});\n\nconst bubbleVariants = cva('rounded-2xl px-4 py-2.5 w-fit max-w-[85%]', {\n variants: {\n variant: {\n user: 'bg-primary-800 text-white dark:bg-primary-800',\n assistant:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-white',\n system:\n 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400 text-center text-sm max-w-[95%]',\n tool: 'bg-transparent p-0 max-w-full w-full',\n },\n },\n defaultVariants: {\n variant: 'assistant',\n },\n});\n\nexport interface ChatBubbleProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof bubbleVariants> {\n /** Show error styling (red border). */\n hasError?: boolean;\n /**\n * Optional left-border accent color. Used by multi-participant surfaces\n * (e.g. SuperChat) to tint a speaker's bubble; AI chat leaves it unset.\n */\n accent?: string;\n}\n\n/**\n * The shared chat bubble shell. This is the single source of truth for how a\n * chat message bubble looks across the library (AI chat, SuperChat, etc.).\n * Presentational only — callers render their own content inside.\n */\nconst ChatBubble = React.forwardRef<HTMLDivElement, ChatBubbleProps>(\n (\n { className, variant, hasError, accent, style, children, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"chat-bubble\"\n className={cn(\n bubbleVariants({ variant }),\n hasError && 'border border-red-300 dark:border-red-700',\n className\n )}\n style={accent ? { borderLeft: `3px solid ${accent}`, ...style } : style}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nChatBubble.displayName = 'ChatBubble';\n\nexport interface AIMessageDisplayProps {\n /** The message to display */\n message: AIMessage;\n /** User name for user messages */\n userName?: string;\n /** Whether to show the avatar */\n showAvatar?: boolean;\n /** Whether to show timestamp */\n showTimestamp?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /**\n * Optional renderer for `text` content blocks (e.g. Markdown). Called per\n * text block with `{ messageId, streaming, role }`. Host must sanitize.\n */\n renderTextContent?: AIRenderTextContent;\n /**\n * Optional renderer for a per-message footer shown below the bubble (e.g.\n * message action controls). Aligned with the message (right for user, left\n * for assistant).\n */\n renderMessageFooter?: AIRenderMessageFooter;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an AI chat message with support for text, tool calls, and streaming.\n */\nexport function AIMessageDisplay({\n message,\n userName,\n showAvatar = true,\n showTimestamp = false,\n onLinkClick,\n renderTextContent,\n renderMessageFooter,\n className,\n}: AIMessageDisplayProps) {\n const isStreaming = message.status === 'streaming';\n const hasContent = message.content.length > 0;\n const messageFooter = renderMessageFooter?.(message);\n\n const formatTime = (timestamp: Date | string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n };\n\n // For tool messages, render just the tool call without bubble\n if (message.role === 'tool') {\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && <MessageAvatar role={message.role} />}\n <div className=\"flex-1 space-y-2\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && message.role !== 'system' && (\n <MessageAvatar role={message.role} userName={userName} />\n )}\n\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-1',\n message.role === 'user' && 'items-end'\n )}\n >\n <ChatBubble\n data-slot=\"ai-message-bubble\"\n variant={message.role}\n hasError={message.status === 'error'}\n >\n {hasContent ? (\n <div className=\"space-y-3\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n ) : isStreaming ? (\n <div className=\"flex items-center justify-center\">\n <AITypingIndicator />\n </div>\n ) : null}\n </ChatBubble>\n\n {messageFooter != null && messageFooter !== false && (\n <div data-slot=\"ai-message-footer\" className=\"w-fit max-w-[85%]\">\n {messageFooter}\n </div>\n )}\n\n {showTimestamp && (\n <span\n data-slot=\"ai-message-timestamp\"\n className=\"px-2 text-xs text-neutral-500\"\n >\n {formatTime(message.timestamp)}\n </span>\n )}\n\n {message.status === 'error' && (\n <span className=\"px-2 text-xs text-red-500\">\n {message.role === 'user' ? 'Failed to send' : 'An error occurred'}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport { MessageAvatar, AITypingIndicator, ChatBubble, bubbleVariants };\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nexport type ProviderModelValue = {\n provider: string;\n model: string;\n};\n\nexport type ProviderModelOption = ProviderModelValue & {\n label?: string;\n providerLabel?: string;\n id?: string;\n};\n\n/** A reasoning-effort level offered alongside the model. */\nexport type ComposerEffortOption = {\n value: string;\n label: string;\n /** Optional secondary line, e.g. a caveat about cost or latency. */\n description?: string;\n};\n\ntype ComposerModelSelectorBaseProps = {\n models: ProviderModelOption[];\n value: ProviderModelValue | null;\n onChange: (value: ProviderModelValue) => void;\n disabled?: boolean;\n /**\n * Trigger appearance: 'default' is the bordered pill; 'ghost' is a quiet\n * text trigger that matches ChatComposer's selector-row controls.\n */\n variant?: 'default' | 'ghost';\n className?: string;\n boundaryRef?: React.RefObject<HTMLElement | null>;\n placeholder?: string;\n anyLabel?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /**\n * Reasoning-effort levels for the selected model. Omit or pass an empty\n * array to hide the effort row entirely, which is what a model that cannot\n * reason should resolve to — the levels are provider-specific, so the caller\n * owns deciding which apply.\n */\n effortOptions?: ComposerEffortOption[];\n /** Currently selected effort. */\n effort?: string | null;\n /** Effort marked with a \"default\" badge in the list. */\n defaultEffort?: string;\n onEffortChange?: (value: string) => void;\n effortLabel?: string;\n effortHint?: string;\n defaultBadgeLabel?: string;\n backLabel?: string;\n};\n\ntype ControlledProviderFilterProps = {\n providerFilter: string | null;\n onProviderFilterChange: (provider: string | null) => void;\n};\n\ntype UncontrolledProviderFilterProps = {\n providerFilter?: undefined;\n onProviderFilterChange?: (provider: string | null) => void;\n};\n\nexport type ComposerModelSelectorProps = ComposerModelSelectorBaseProps &\n (ControlledProviderFilterProps | UncontrolledProviderFilterProps);\n\nconst MENU_OFFSET_PX = 6;\nconst MENU_MAX_HEIGHT_PX = 320;\n\nfunction optionKey(option: ProviderModelValue) {\n return `${option.provider}\\u0000${option.model}`;\n}\n\nfunction renderedOptionKey(option: ProviderModelOption, index: number) {\n return `${option.id ?? optionKey(option)}\\u0000${index}`;\n}\n\ntype RenderedModelOption = {\n option: ProviderModelOption;\n index: number;\n key: string;\n};\n\nfunction groupByProvider(models: ProviderModelOption[]) {\n const groups = new Map<string, ProviderModelOption[]>();\n\n for (const model of models) {\n const group = groups.get(model.provider);\n if (group) {\n group.push(model);\n } else {\n groups.set(model.provider, [model]);\n }\n }\n\n return Array.from(groups, ([provider, options]) => ({ provider, options }));\n}\n\nfunction getProviderLabel(models: ProviderModelOption[], provider: string) {\n return (\n models.find((model) => model.provider === provider && model.providerLabel)\n ?.providerLabel ?? provider\n );\n}\n\nexport function ComposerModelSelector({\n models,\n value,\n providerFilter,\n onProviderFilterChange,\n onChange,\n disabled = false,\n variant = 'default',\n className,\n boundaryRef,\n placeholder = 'Model',\n anyLabel = 'Any',\n emptyLabel = 'No models',\n ariaLabel = 'Model',\n effortOptions,\n effort = null,\n defaultEffort,\n onEffortChange,\n effortLabel = 'Effort',\n effortHint,\n defaultBadgeLabel = 'Default',\n backLabel = 'Back',\n}: ComposerModelSelectorProps) {\n const [open, setOpen] = React.useState(false);\n // The menu drills down rather than opening a side panel: one anchored\n // surface is far less fragile near the viewport edge, which is exactly where\n // a composer sits.\n const [view, setView] = React.useState<'models' | 'effort'>('models');\n const [effortHighlight, setEffortHighlight] = React.useState(0);\n const [internalProviderFilter, setInternalProviderFilter] = React.useState<\n string | null\n >(null);\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const listRef = React.useRef<HTMLDivElement>(null);\n const effortListRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n const {\n anchorRef: triggerRef,\n floatingRef: menuRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open,\n placement: 'top-start',\n offset: MENU_OFFSET_PX,\n matchMinWidth: true,\n maxHeight: MENU_MAX_HEIGHT_PX,\n allowFlip: false,\n boundaryRef,\n });\n\n const activeProviderFilter =\n providerFilter === undefined ? internalProviderFilter : providerFilter;\n const selectedKey = value ? optionKey(value) : null;\n const selectedOption = models.find(\n (model) => optionKey(model) === selectedKey\n );\n const providers = React.useMemo(\n () => Array.from(new Set(models.map((model) => model.provider))),\n [models]\n );\n const providerLabels = React.useMemo(\n () =>\n new Map(\n providers.map((provider) => [\n provider,\n getProviderLabel(models, provider),\n ])\n ),\n [models, providers]\n );\n const filteredModels = React.useMemo(\n () =>\n activeProviderFilter === null\n ? models\n : models.filter((model) => model.provider === activeProviderFilter),\n [activeProviderFilter, models]\n );\n const groupedModels = React.useMemo(\n () => groupByProvider(filteredModels),\n [filteredModels]\n );\n const groupedRenderedModels = React.useMemo(() => {\n let index = 0;\n return groupedModels.map((group) => ({\n provider: group.provider,\n options: group.options.map((option) => {\n const rendered: RenderedModelOption = {\n option,\n index,\n key: renderedOptionKey(option, index),\n };\n index += 1;\n return rendered;\n }),\n }));\n }, [groupedModels]);\n const renderedModels = React.useMemo(\n () => groupedRenderedModels.flatMap((group) => group.options),\n [groupedRenderedModels]\n );\n const getOptionId = React.useCallback(\n (index: number) => `${menuId}-option-${index}`,\n [menuId]\n );\n // The two views are mutually exclusive, so both listboxes carry `menuId` and\n // the trigger's `aria-controls` stays pointed at whichever one is rendered.\n // Option ids are namespaced per view so they cannot collide.\n const getEffortOptionId = React.useCallback(\n (index: number) => `${menuId}-effort-option-${index}`,\n [menuId]\n );\n const activeOptionId =\n open && renderedModels[highlightedIndex]\n ? getOptionId(highlightedIndex)\n : undefined;\n const selectedRenderedIndex = React.useMemo(\n () =>\n selectedKey\n ? renderedModels.findIndex(\n (renderedModel) => optionKey(renderedModel.option) === selectedKey\n )\n : -1,\n [renderedModels, selectedKey]\n );\n\n const setProvider = React.useCallback(\n (provider: string | null) => {\n if (providerFilter === undefined) {\n setInternalProviderFilter(provider);\n }\n onProviderFilterChange?.(provider);\n },\n [onProviderFilterChange, providerFilter]\n );\n\n const close = React.useCallback(\n (restoreFocus = true) => {\n setOpen(false);\n if (restoreFocus) {\n triggerRef.current?.focus({ preventScroll: true });\n }\n },\n [triggerRef]\n );\n\n const selectModel = React.useCallback(\n (model: ProviderModelOption) => {\n onChange({ provider: model.provider, model: model.model });\n close();\n },\n [close, onChange]\n );\n\n const efforts = React.useMemo(() => effortOptions ?? [], [effortOptions]);\n const activeEffortOptionId =\n open && efforts[effortHighlight]\n ? getEffortOptionId(effortHighlight)\n : undefined;\n const selectedEffortOption = efforts.find(\n (option) => option.value === effort\n );\n\n const selectEffort = React.useCallback(\n (value: string) => {\n onEffortChange?.(value);\n close();\n },\n [close, onEffortChange]\n );\n\n const handleEffortKeyDown = (event: React.KeyboardEvent) => {\n if (efforts.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setEffortHighlight((current) => (current + 1) % efforts.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setEffortHighlight(\n (current) => (current - 1 + efforts.length) % efforts.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setEffortHighlight(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setEffortHighlight(efforts.length - 1);\n }\n // Left/Backspace mirrors the drill-down affordance so keyboard users can\n // get back to the model list without reaching for the mouse.\n if (event.key === 'ArrowLeft' || event.key === 'Backspace') {\n event.preventDefault();\n setView('models');\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlighted = efforts[effortHighlight];\n if (highlighted) selectEffort(highlighted.value);\n }\n };\n\n const outsideRefs = React.useMemo(\n () => [triggerRef, menuRef],\n [triggerRef, menuRef]\n );\n\n useClickOutside(outsideRefs, () => close(false), open);\n\n useEscapeKey(close, open);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex(selectedRenderedIndex >= 0 ? selectedRenderedIndex : 0);\n }, [activeProviderFilter, open, selectedRenderedIndex]);\n\n // Every open starts on the model list. Deliberately keyed on `open` alone:\n // callers commonly derive `effortOptions` from the selected model, so the\n // array identity changes on every parent render, and folding that into this\n // effect would drop the user back to the model list mid-interaction.\n React.useEffect(() => {\n if (!open) return;\n setView('models');\n }, [open]);\n\n // The effort list starts on the current value so Enter is a no-op rather\n // than a surprise change.\n React.useEffect(() => {\n if (!open) return;\n const current = efforts.findIndex((option) => option.value === effort);\n setEffortHighlight(current >= 0 ? current : 0);\n }, [effort, efforts, open]);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex((current) =>\n Math.min(current, Math.max(renderedModels.length - 1, 0))\n );\n }, [open, renderedModels.length]);\n\n React.useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => {\n const target =\n view === 'effort' ? effortListRef.current : listRef.current;\n target?.focus({ preventScroll: true });\n });\n }, [open, view]);\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const handleMenuKeyDown = (event: React.KeyboardEvent) => {\n if (renderedModels.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex((current) => (current + 1) % renderedModels.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex(\n (current) =>\n (current - 1 + renderedModels.length) % renderedModels.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightedIndex(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setHighlightedIndex(renderedModels.length - 1);\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlightedModel = renderedModels[highlightedIndex]?.option;\n if (highlightedModel) {\n selectModel(highlightedModel);\n }\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleTriggerKeyDown}\n data-slot=\"composer-model-selector-trigger\"\n className={cn(\n variant === 'ghost'\n ? [\n 'inline-flex max-w-full min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:ring-primary-500 focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:pointer-events-none disabled:opacity-40',\n ]\n : [\n 'inline-flex h-8 max-w-full items-center gap-1.5 rounded-full border px-2.5 text-sm font-medium',\n 'border-border bg-background text-foreground shadow-sm',\n 'hover:bg-muted/50',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n className\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedOption?.label ?? selectedOption?.model ?? placeholder}\n </span>\n {selectedEffortOption && (\n <span\n data-slot=\"composer-model-selector-trigger-effort\"\n className=\"text-muted-foreground min-w-0 truncate font-normal\"\n >\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronUp\n aria-hidden=\"true\"\n className={cn(\n 'shrink-0',\n variant === 'ghost' ? 'h-3 w-3' : 'h-3.5 w-3.5'\n )}\n />\n </button>\n\n {open &&\n createPortal(\n <div\n ref={menuRef}\n style={menuStyle}\n data-slot=\"composer-model-selector-menu\"\n className={cn(\n 'border-border bg-card text-card-foreground flex w-80 max-w-full flex-col rounded-lg border shadow-lg',\n 'animate-in fade-in overflow-hidden duration-100'\n )}\n >\n {view === 'models' && (\n <>\n <div\n data-slot=\"composer-model-selector-provider-filter\"\n className=\"border-border flex min-h-9 items-center gap-1 overflow-x-auto overflow-y-hidden border-b p-2\"\n >\n {[null, ...providers].map((provider) => {\n const selected = activeProviderFilter === provider;\n return (\n <button\n key={provider ?? 'all-providers'}\n type=\"button\"\n aria-pressed={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setProvider(provider)}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center justify-center rounded-full px-2.5 text-xs font-medium whitespace-nowrap transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n selected\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n >\n {provider === null\n ? anyLabel\n : (providerLabels.get(provider) ?? provider)}\n </button>\n );\n })}\n </div>\n\n <div\n ref={listRef}\n id={menuId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleMenuKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {groupedModels.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n {emptyLabel}\n </div>\n ) : (\n groupedRenderedModels.map((group) => (\n <div\n key={group.provider}\n role=\"group\"\n aria-label={\n providerLabels.get(group.provider) ?? group.provider\n }\n >\n <div className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold uppercase\">\n {providerLabels.get(group.provider) ?? group.provider}\n </div>\n {group.options.map((renderedModel) => {\n const { index, key, option: model } = renderedModel;\n\n const selected = optionKey(model) === selectedKey;\n const highlighted = index === highlightedIndex;\n\n return (\n <button\n key={key}\n id={getOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectModel(model)}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {model.label ?? model.model}\n </span>\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {efforts.length > 0 && (\n <div className=\"border-border border-t p-1\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-row\"\n aria-haspopup=\"listbox\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('effort')}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {effortLabel}\n </span>\n {selectedEffortOption && (\n <span className=\"text-muted-foreground min-w-0 truncate\">\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronRight\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 shrink-0 rtl:-scale-x-100\"\n />\n </button>\n </div>\n )}\n </>\n )}\n\n {view === 'effort' && (\n <>\n <div className=\"border-border flex items-center gap-1 border-b p-2\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-back\"\n aria-label={backLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('models')}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-xs font-medium',\n 'text-muted-foreground hover:bg-muted hover:text-foreground transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 rtl:-scale-x-100\"\n />\n {effortLabel}\n </button>\n </div>\n\n {effortHint && (\n <p className=\"text-muted-foreground px-3 pt-2 text-xs\">\n {effortHint}\n </p>\n )}\n\n <div\n ref={effortListRef}\n id={menuId}\n role=\"listbox\"\n aria-label={effortLabel}\n aria-activedescendant={activeEffortOptionId}\n tabIndex={-1}\n onKeyDown={handleEffortKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {efforts.map((option, index) => {\n const selected = option.value === effort;\n const highlighted = index === effortHighlight;\n\n return (\n <button\n key={option.value}\n id={getEffortOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectEffort(option.value)}\n onMouseEnter={() => setEffortHighlight(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {option.description}\n </span>\n )}\n </span>\n {option.value === defaultEffort && (\n <span className=\"bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 text-xs\">\n {defaultBadgeLabel}\n </span>\n )}\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>,\n document.body\n )}\n </>\n );\n}\n\nComposerModelSelector.displayName = 'ComposerModelSelector';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport {\n ComposerModelSelector,\n type ComposerModelSelectorProps,\n} from '../AI/ComposerModelSelector';\nimport {\n AttachmentPreviewItem,\n DragDropZone,\n getFileType,\n validateFile,\n generateAttachmentId,\n} from '../Messaging/AttachmentPicker';\nimport {\n MentionMenu,\n useMentionAutocomplete,\n type MentionOption,\n} from '../Messaging/useMentionAutocomplete';\nimport type { AttachmentType, NewMessage } from '../Messaging/types';\nimport {\n AlertTriangleIcon,\n ArrowUpIcon,\n BotIcon,\n CheckIcon,\n ChevronUpIcon,\n LoaderIcon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n StopIcon,\n} from '../Icons';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A file staged for sending, with preview metadata. */\ninterface StagedAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n}\n\n/** An entry in the composer's `+` menu. */\nexport interface ChatComposerMenuItem {\n /** Stable id (used as the React key). */\n id: string;\n /** Display label. */\n label: React.ReactNode;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Whether the item is disabled. */\n disabled?: boolean;\n /**\n * Toggle state. When set (true or false) the item renders as a\n * `menuitemcheckbox` with `aria-checked` and a leading checkbox.\n */\n checked?: boolean;\n /** Danger styling for destructive actions. */\n variant?: 'default' | 'danger';\n /** Called when the item is selected. */\n onSelect?: () => void;\n}\n\n/** An agent shown in the composer's agent selector. */\nexport interface ChatComposerAgentOption {\n /** Stable id (returned via `onAgentChange`). */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (defaults to a bot glyph in the trigger). */\n icon?: React.ReactNode;\n /** Optional secondary text shown in the menu. */\n description?: string;\n}\n\n/** Imperative handle exposed via `ref` for host-level integrations. */\nexport interface ChatComposerHandle {\n /** Stage files programmatically (e.g. from a page-level drop zone). */\n addFiles: (files: File[]) => void;\n /** Focus the text input. */\n focus: () => void;\n /**\n * The underlying textarea element, for host integrations that need caret\n * access (e.g. mention insertion via `setSelectionRange`).\n */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\n/** Structured context passed to `onError` so hosts can localize by reason. */\nexport interface ChatComposerError {\n reason: 'file-type' | 'file-size' | 'attachment-limit' | 'send-failed';\n /** The rejected file, when the error concerns a single file. */\n file?: File;\n}\n\nexport interface ChatComposerProps {\n /** Called when the user sends a message. */\n onSend?: (message: NewMessage) => void | Promise<void>;\n /** Controlled input value. Leave undefined for uncontrolled usage. */\n value?: string;\n /** Called when the input value changes. */\n onValueChange?: (value: string) => void;\n /** Placeholder text for the input. */\n placeholder?: string;\n /**\n * Disables all built-in interaction. Custom content (`micSlot`,\n * `addMenuItems` icons) is rendered as-is — hosts must disable their own\n * controls when they disable the composer.\n */\n disabled?: boolean;\n /** Shows the send button in a busy state and prevents duplicate sends. */\n isSending?: boolean;\n /** Autofocus the input on mount. */\n autoFocus?: boolean;\n /** Maximum message length. Sends are blocked while over the limit. */\n maxLength?: number;\n /** Show a character counter (requires `maxLength`). */\n showCharacterCount?: boolean;\n /**\n * Allow sending while the composer itself is empty (e.g. when the host\n * stages attachments outside the composer). The host receives a message\n * with empty `content` and no attachments and owns any further guarding.\n * @default false\n */\n canSendWhenEmpty?: boolean;\n /**\n * Maximum height of the auto-growing input: a pixel number or any CSS\n * length (e.g. `'40vh'`).\n * @default 160\n */\n maxHeight?: number | string;\n /**\n * Extra props spread onto the underlying textarea. Event handlers run\n * before the composer's built-in handlers; call `event.preventDefault()`\n * in `onKeyDown` / `onPaste` to claim that event (e.g. for a mention\n * menu's arrow/Enter navigation). `className` and `style` are merged\n * with the composer's own.\n */\n textareaProps?: Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'value' | 'defaultValue'\n >;\n\n /** Extra entries for the `+` menu, rendered after the built-in items. */\n addMenuItems?: ChatComposerMenuItem[];\n /** Enable file attachments (built-in \"Attach files\" menu item, paste-to-attach, drag-and-drop, chips). @default true */\n allowAttachments?: boolean;\n /** Accepted file types for the picker/paste validation (native `accept` tokens). */\n acceptedFileTypes?: string[];\n /** Maximum file size in bytes. */\n maxFileSize?: number;\n /** Maximum number of staged attachments. @default 10 */\n maxAttachments?: number;\n\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a suggestion listbox (same behavior as `MessageComposer`).\n * Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n\n /** Show the built-in mic button. @default false */\n showMic?: boolean;\n /** Called when the built-in mic button is clicked. */\n onMicClick?: () => void;\n /**\n * Custom node rendered in place of the built-in mic button (e.g.\n * `RecordButton`). The slot is wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other composer controls; taller content overflows and\n * stays vertically centered without inflating the row. Interaction state is\n * not managed: pass your own disabled state when the composer is `disabled`.\n */\n micSlot?: React.ReactNode;\n /** When to show the mic: always, or only while the composer is empty. @default 'always' */\n micBehavior?: 'always' | 'whenEmpty';\n\n /** While true, the send button becomes a stop button (requires `onStop`). */\n isStreaming?: boolean;\n /** Called when the stop button is clicked during streaming. */\n onStop?: () => void;\n\n /** Show the agent selector in the bottom row. @default false */\n showAgentSelector?: boolean;\n /** Agents available in the agent selector. */\n agents?: ChatComposerAgentOption[];\n /** Selected agent id (controlled). */\n selectedAgent?: string | null;\n /** Called when an agent is selected. */\n onAgentChange?: (agentId: string) => void;\n\n /** Show the model selector in the bottom row. @default false */\n showModelSelector?: boolean;\n /** Props passed through to the embedded `ComposerModelSelector`. */\n modelSelectorProps?: ComposerModelSelectorProps;\n\n /** Replaces the composer with a read-only notice. */\n readOnly?: boolean;\n /** Notice text shown when `readOnly` is set. */\n readOnlyMessage?: string;\n\n /**\n * Called when a file is rejected or a send fails. `message` is a default\n * English string; `context.reason` lets hosts substitute localized copy.\n */\n onError?: (message: string, context?: ChatComposerError) => void;\n\n /** Message reported when the attachment limit is hit. Overrides the English default. */\n attachmentLimitLabel?: string;\n /** Message reported when an async `onSend` rejects. @default 'Failed to send message' */\n sendFailedLabel?: string;\n /** Accessible label for the send button while `isSending`. @default 'Sending message…' */\n sendingLabel?: string;\n\n /** Accessible label for the text input. @default 'Message input' */\n inputLabel?: string;\n /** Accessible label for the `+` menu trigger. @default 'Add to message' */\n addMenuLabel?: string;\n /** Label for the built-in attach menu item. @default 'Attach files' */\n attachFilesLabel?: string;\n /** Accessible label for the built-in mic button. @default 'Start voice input' */\n micLabel?: string;\n /** Accessible label for the send button. @default 'Send message' */\n sendLabel?: string;\n /** Accessible label for the stop button. @default 'Stop generating' */\n stopLabel?: string;\n /** Accessible label / empty-state text for the agent selector. @default 'Select agent' */\n agentSelectorLabel?: string;\n /** Accessible label for the `@mention` suggestion listbox. @default 'Mention' */\n mentionListLabel?: string;\n /** Overlay text shown while dragging files over the composer. @default 'Drop files here' */\n dropFilesLabel?: string;\n\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst iconButtonClasses = cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg',\n 'text-neutral-500 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst selectorTriggerClasses = cn(\n 'flex min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst MAX_INPUT_HEIGHT = 160;\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Standardized chat input. At `md+` it renders as a single-row pill — `+`\n * menu, text input and actions (mic, send/stop) side by side; below `md` the\n * input stacks above the icon row. The optional agent/model selector row\n * hangs below the card on the page background.\n */\nexport const ChatComposer = React.forwardRef<\n ChatComposerHandle,\n ChatComposerProps\n>(function ChatComposer(\n {\n onSend,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message…',\n disabled = false,\n isSending = false,\n autoFocus = false,\n maxLength,\n showCharacterCount = false,\n canSendWhenEmpty = false,\n maxHeight = MAX_INPUT_HEIGHT,\n textareaProps,\n addMenuItems,\n allowAttachments = true,\n acceptedFileTypes,\n maxFileSize,\n maxAttachments = 10,\n mentionOptions,\n showMic = false,\n onMicClick,\n micSlot,\n micBehavior = 'always',\n isStreaming = false,\n onStop,\n showAgentSelector = false,\n agents = [],\n selectedAgent = null,\n onAgentChange,\n showModelSelector = false,\n modelSelectorProps,\n readOnly = false,\n readOnlyMessage = 'You have read-only access and cannot send messages.',\n onError,\n attachmentLimitLabel,\n sendFailedLabel = 'Failed to send message',\n sendingLabel = 'Sending message…',\n inputLabel = 'Message input',\n addMenuLabel = 'Add to message',\n attachFilesLabel = 'Attach files',\n micLabel = 'Start voice input',\n sendLabel = 'Send message',\n stopLabel = 'Stop generating',\n agentSelectorLabel = 'Select agent',\n mentionListLabel = 'Mention',\n dropFilesLabel = 'Drop files here',\n className,\n },\n ref\n) {\n const [internalValue, setInternalValue] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const [attachments, setAttachments] = React.useState<StagedAttachment[]>([]);\n const attachmentsRef = React.useRef(attachments);\n attachmentsRef.current = attachments;\n\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const [addMenuOpen, setAddMenuOpen] = React.useState(false);\n const [agentMenuOpen, setAgentMenuOpen] = React.useState(false);\n\n const hasText = value.trim().length > 0;\n const hasContent = hasText || attachments.length > 0;\n const isOverLimit = maxLength !== undefined && value.length > maxLength;\n // Without an onSend handler, sending would silently discard the draft.\n const canSend =\n (hasContent || canSendWhenEmpty) &&\n onSend !== undefined &&\n !disabled &&\n !isSending &&\n !isStreaming &&\n !isOverLimit;\n\n // --------------------------------------------------------------------\n // Input handling\n // --------------------------------------------------------------------\n\n const setValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange]\n );\n\n // @mention autocomplete (opt-in via `mentionOptions`) — shared with\n // MessageComposer so both composers behave identically.\n const mention = useMentionAutocomplete({\n options: mentionOptions,\n value,\n setValue,\n textareaRef,\n });\n\n // Auto-grow the textarea. The cap is enforced with CSS max-height so it\n // can be any CSS length (e.g. '40vh'), not just a pixel number.\n const resizeTextarea = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n // While the textarea is not laid out (hidden container, e.g. a\n // just-mounted Storybook story or a closed panel) scrollHeight is 0 —\n // keep height auto and let the ResizeObserver below re-measure once\n // the element becomes visible.\n if (textarea.scrollHeight === 0) return;\n textarea.style.height = `${textarea.scrollHeight}px`;\n }, []);\n\n React.useLayoutEffect(resizeTextarea, [resizeTextarea, value]);\n\n // Re-measure when the textarea's box changes for reasons other than\n // typing: the container becoming visible, width changes, font loading,\n // or crossing the md breakpoint (different paddings).\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea || typeof ResizeObserver === 'undefined') return;\n // Defer the re-measure to the next frame: mutating the observed\n // element's height synchronously inside the observer callback triggers\n // the browser's \"ResizeObserver loop completed with undelivered\n // notifications\" error, which dev overlays surface as a runtime error.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(resizeTextarea);\n });\n observer.observe(textarea);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [resizeTextarea]);\n\n // --------------------------------------------------------------------\n // Attachments\n // --------------------------------------------------------------------\n\n const addFiles = React.useCallback(\n (files: File[]) => {\n if (!allowAttachments || files.length === 0) return;\n // Staging happens outside the state updater so object-URL creation,\n // id generation and onError stay out of a function React may re-invoke.\n const limitMessage =\n attachmentLimitLabel ??\n `Attachment limit reached (max ${maxAttachments})`;\n const room = maxAttachments - attachmentsRef.current.length;\n if (files.length > room) {\n onError?.(limitMessage, { reason: 'attachment-limit' });\n if (room <= 0) return;\n }\n const staged: StagedAttachment[] = [];\n for (const file of files.slice(0, Math.max(room, 0))) {\n const typeCheck = validateFile(file, acceptedFileTypes, undefined);\n if (!typeCheck.valid) {\n onError?.(`${file.name}: ${typeCheck.error}`, {\n reason: 'file-type',\n file,\n });\n continue;\n }\n const sizeCheck = validateFile(file, undefined, maxFileSize);\n if (!sizeCheck.valid) {\n onError?.(`${file.name}: ${sizeCheck.error}`, {\n reason: 'file-size',\n file,\n });\n continue;\n }\n const type = getFileType(file.type);\n staged.push({\n id: generateAttachmentId(),\n file,\n type,\n previewUrl:\n type === 'image' || type === 'video'\n ? URL.createObjectURL(file)\n : undefined,\n });\n }\n if (staged.length > 0) {\n // Reserve slots synchronously: a second addFiles call in the same\n // React batch reads attachmentsRef before re-render, so without this\n // both calls could see the same free room and overshoot the cap.\n attachmentsRef.current = [...attachmentsRef.current, ...staged];\n setAttachments((current) => [...current, ...staged]);\n }\n },\n [\n allowAttachments,\n maxAttachments,\n acceptedFileTypes,\n maxFileSize,\n onError,\n attachmentLimitLabel,\n ]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n // Same discipline as addFiles: revoke and update the ref synchronously,\n // keep the state updater pure (StrictMode may re-invoke it).\n const target = attachmentsRef.current.find(\n (attachment) => attachment.id === id\n );\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n attachmentsRef.current = attachmentsRef.current.filter(\n (attachment) => attachment.id !== id\n );\n setAttachments((current) =>\n current.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n // Revoke any outstanding preview URLs on unmount.\n React.useEffect(() => {\n return () => {\n for (const attachment of attachmentsRef.current) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n };\n }, []);\n\n const handleFileInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = Array.from(event.target.files ?? []);\n addFiles(files);\n event.target.value = '';\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!allowAttachments) return;\n const files = Array.from(event.clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n addFiles(files);\n }\n };\n\n React.useImperativeHandle(\n ref,\n () => ({\n addFiles,\n focus: () => textareaRef.current?.focus(),\n getTextarea: () => textareaRef.current,\n }),\n [addFiles]\n );\n\n // --------------------------------------------------------------------\n // Sending\n // --------------------------------------------------------------------\n\n const handleSend = () => {\n if (!canSend || !onSend) return;\n const message: NewMessage = {\n content: value.trim(),\n attachments: attachments.map((attachment) => attachment.file),\n };\n for (const attachment of attachments) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n // Clear the ref alongside the state: the unmount cleanup reads the ref,\n // so if onSend unmounts the composer synchronously it must not see (and\n // re-revoke) the already-revoked preview URLs.\n attachmentsRef.current = [];\n setAttachments([]);\n setValue('');\n // The draft is cleared optimistically; hosts own retry/restore. Both a\n // synchronous throw and a rejected promise surface through onError\n // instead of being swallowed.\n try {\n Promise.resolve(onSend(message)).catch(() => {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n });\n } catch {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n }\n textareaRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mention.handleKeyDown(event)) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n handleSend();\n }\n };\n\n // --------------------------------------------------------------------\n // Render\n // --------------------------------------------------------------------\n\n if (readOnly) {\n return (\n <div\n data-slot=\"chat-composer\"\n // A live status region (implicit aria-live=\"polite\"): readOnly can\n // flip at runtime (e.g. after permissions resolve), and screen-reader\n // users must be told the input became read-only.\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 rounded-xl border px-4 py-3 text-sm',\n 'border-amber-300 bg-amber-50 text-amber-900',\n 'dark:border-amber-700 dark:bg-amber-950 dark:text-amber-200',\n className\n )}\n >\n <AlertTriangleIcon className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span data-slot=\"chat-composer-readonly\">{readOnlyMessage}</span>\n </div>\n );\n }\n\n const showAddMenu =\n allowAttachments || (addMenuItems && addMenuItems.length > 0);\n const micVisible =\n (showMic || onMicClick !== undefined || micSlot !== undefined) &&\n (micBehavior === 'always' || !hasContent);\n const showSelectorRow = showAgentSelector || showModelSelector;\n const selectedAgentOption =\n agents.find((agent) => agent.id === selectedAgent) ?? null;\n\n // One responsive grid: below `md` the input sits on row 1 spanning all\n // columns with the `+`/actions on row 2; at `md+` the `+`, input and\n // actions sit side by side on row 1 as a single pill (actions pin to the\n // bottom via self-end as the input grows).\n const cells = {\n input:\n 'col-span-3 col-start-1 row-start-1 px-1 pt-1 md:col-span-1 md:col-start-2 md:self-end md:px-0 md:py-1.5',\n textarea: 'px-2 pt-2 pb-1 md:py-1.5',\n add: 'col-start-1 row-start-2 pb-2 ps-2 md:row-start-1 md:self-end md:p-1.5 md:pe-0.5',\n actions:\n 'col-start-3 row-start-2 flex items-center gap-1 pb-2 pe-2 md:row-start-1 md:self-end md:gap-0.5 md:p-1.5 md:ps-0.5',\n };\n\n const composerCard = (\n <>\n {attachments.length > 0 && (\n <div\n data-slot=\"chat-composer-attachments\"\n className=\"flex flex-wrap gap-2 px-3 pt-3\"\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={{ ...attachment, state: 'pending' }}\n onRemove={() => removeAttachment(attachment.id)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)_auto]\">\n {/* Inset cell: the textarea sits inside the card with a matching\n inner radius so focus outlines / a11y highlights render as a\n clean nested rounded rect instead of stacking on the card's\n border. The padding split (cell + textarea) keeps the text in\n place using only standard utilities. */}\n <div className={cells.input} ref={mention.anchorRef}>\n <MentionMenu\n mention={mention}\n label={mentionListLabel}\n dataSlot=\"chat-composer-mention-list\"\n />\n <textarea\n {...textareaProps}\n ref={textareaRef}\n data-slot=\"chat-composer-input\"\n value={value}\n onChange={(event) => {\n textareaProps?.onChange?.(event);\n setValue(event.target.value);\n mention.sync(\n event.target.value,\n event.target.selectionStart ?? event.target.value.length\n );\n }}\n // Host handlers run first; preventDefault() opts out of the\n // built-in behavior (mention menu, Enter-to-send,\n // paste-to-attach).\n onKeyDown={(event) => {\n textareaProps?.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n handleKeyDown(event);\n }}\n onClick={(event) => {\n textareaProps?.onClick?.(event);\n if (event.defaultPrevented) return;\n const el = event.currentTarget;\n mention.sync(el.value, el.selectionStart ?? el.value.length);\n }}\n onPaste={(event) => {\n textareaProps?.onPaste?.(event);\n if (event.defaultPrevented) return;\n handlePaste(event);\n }}\n placeholder={placeholder}\n disabled={disabled}\n // Host-opt-in only; off by default.\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n rows={1}\n aria-label={inputLabel}\n {...mention.inputProps}\n style={{\n ...textareaProps?.style,\n maxHeight:\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,\n }}\n className={cn(\n 'block w-full resize-none bg-transparent',\n 'rounded-lg text-sm',\n cells.textarea,\n 'text-neutral-900 placeholder:text-neutral-400 dark:text-white dark:placeholder:text-neutral-500',\n // Ring the input itself on focus rather than the whole shell.\n 'focus:ring-primary-500 focus:ring-1 focus:outline-none',\n 'disabled:cursor-not-allowed',\n textareaProps?.className\n )}\n />\n </div>\n\n {showAddMenu && (\n <div className={cells.add}>\n <Dropdown\n placement=\"top-start\"\n open={addMenuOpen}\n onOpenChange={setAddMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-add-button\"\n aria-label={addMenuLabel}\n disabled={disabled}\n className={iconButtonClasses}\n >\n <PlusIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n }\n >\n {allowAttachments && (\n <DropdownItem\n icon={\n <PaperclipIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n }\n onClick={() => {\n setAddMenuOpen(false);\n fileInputRef.current?.click();\n }}\n >\n {attachFilesLabel}\n </DropdownItem>\n )}\n {allowAttachments && addMenuItems && addMenuItems.length > 0 && (\n <DropdownSeparator />\n )}\n {addMenuItems?.map((item) => (\n <DropdownItem\n key={item.id}\n icon={item.icon}\n disabled={item.disabled}\n variant={item.variant}\n checked={item.checked}\n onClick={() => {\n setAddMenuOpen(false);\n item.onSelect?.();\n }}\n >\n <span className=\"min-w-0 truncate\">{item.label}</span>\n </DropdownItem>\n ))}\n </Dropdown>\n </div>\n )}\n\n {allowAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes?.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )}\n\n <div className={cells.actions}>\n {showCharacterCount && maxLength !== undefined && (\n <span\n data-slot=\"chat-composer-char-count\"\n aria-live=\"polite\"\n className={cn(\n 'pe-1 text-xs tabular-nums',\n isOverLimit\n ? 'font-medium text-red-700 dark:text-red-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {value.length}/{maxLength}\n </span>\n )}\n\n {micVisible &&\n (micSlot != null ? (\n // Normalize slot content (e.g. a RecordButton) to the 32px\n // control row: taller content overflow-centers instead of\n // inflating the pill and pushing the other cells apart. A div\n // so block-level slot content stays valid HTML.\n <div\n data-slot=\"chat-composer-mic-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {micSlot}\n </div>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-mic-button\"\n aria-label={micLabel}\n disabled={disabled}\n onClick={onMicClick}\n className={iconButtonClasses}\n >\n <MicIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n ))}\n\n {isStreaming && onStop ? (\n <button\n type=\"button\"\n data-slot=\"chat-composer-stop-button\"\n aria-label={stopLabel}\n disabled={disabled}\n onClick={onStop}\n className={cn(\n iconButtonClasses,\n 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n <StopIcon\n className=\"h-3.5 w-3.5 fill-current\"\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-send-button\"\n aria-label={isSending ? sendingLabel : sendLabel}\n aria-busy={isSending || undefined}\n disabled={!canSend}\n onClick={handleSend}\n className={cn(\n iconButtonClasses,\n canSend &&\n 'bg-primary-800 hover:bg-primary-700 dark:bg-primary-600 dark:hover:bg-primary-500 text-white hover:text-white dark:hover:text-white'\n )}\n >\n {isSending ? (\n <LoaderIcon\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n ) : (\n <ArrowUpIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </div>\n </div>\n </>\n );\n\n const selectorsRow = showSelectorRow && (\n <div\n data-slot=\"chat-composer-selectors\"\n className=\"flex items-center justify-between gap-2 px-2 pt-1\"\n >\n {showAgentSelector ? (\n <Dropdown\n placement=\"top-start\"\n open={agentMenuOpen}\n onOpenChange={setAgentMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-agent-trigger\"\n aria-label={\n selectedAgentOption\n ? `${agentSelectorLabel}: ${selectedAgentOption.label}`\n : agentSelectorLabel\n }\n disabled={disabled}\n className={selectorTriggerClasses}\n >\n {selectedAgentOption?.icon ?? (\n <BotIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 truncate\">\n {selectedAgentOption?.label ?? agentSelectorLabel}\n </span>\n <ChevronUpIcon className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n </button>\n }\n >\n {agents.map((agent) => (\n <DropdownItem\n key={agent.id}\n icon={agent.icon}\n role=\"menuitemradio\"\n aria-checked={agent.id === selectedAgent}\n onClick={() => {\n setAgentMenuOpen(false);\n onAgentChange?.(agent.id);\n }}\n >\n <span className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{agent.label}</span>\n {agent.description && (\n <span className=\"block truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {agent.description}\n </span>\n )}\n </span>\n {agent.id === selectedAgent && (\n <CheckIcon\n className=\"text-primary-600 dark:text-primary-400 h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </DropdownItem>\n ))}\n </Dropdown>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n\n {showModelSelector && modelSelectorProps && (\n <ComposerModelSelector\n variant=\"ghost\"\n {...modelSelectorProps}\n disabled={disabled || modelSelectorProps.disabled}\n />\n )}\n </div>\n );\n\n // The bordered card holds only the input row(s); the selector row hangs\n // below it on the page background. When attachments are enabled the card\n // doubles as a drop target; all dropped files run through `addFiles` so\n // validation and structured `onError` reporting stay in one place (the\n // zone itself does not validate).\n const card = (\n <div\n data-slot=\"chat-composer-card\"\n className={cn(\n 'rounded-2xl border border-neutral-200 bg-white shadow-sm',\n 'dark:border-[#2e2e30] dark:bg-[#1c1c1e]'\n )}\n >\n {composerCard}\n </div>\n );\n\n return (\n <div\n data-slot=\"chat-composer\"\n className={cn(\n 'flex w-full flex-col',\n disabled && 'opacity-60',\n className\n )}\n >\n {allowAttachments ? (\n <DragDropZone\n onFilesDropped={addFiles}\n maxFiles={Number.MAX_SAFE_INTEGER}\n disabled={disabled}\n overlayLabel={dropFilesLabel}\n >\n {card}\n </DragDropZone>\n ) : (\n card\n )}\n {selectorsRow}\n </div>\n );\n});\n\nChatComposer.displayName = 'ChatComposer';\n"]}
1
+ {"version":3,"sources":["../src/components/AI/icons.tsx","../src/components/AI/CollapsiblePill.tsx","../src/components/AI/MCPToolCall.tsx","../src/components/AI/AIMessage.tsx","../src/components/AI/ComposerModelSelector.tsx","../src/components/ChatComposer/ChatComposer.tsx"],"names":["React","jsxs","jsx","cva","React2","value","ChevronUp","Check","React4","ChatComposer","Fragment"],"mappings":"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","file":"chunk-VMQZAOFM.js","sourcesContent":["/**\n * AI Component Icons\n *\n * Shared icon components for AI features to follow DRY principles.\n */\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\n\n// ============================================================================\n// Sparkles Icon (Modern AI Symbol)\n// ============================================================================\n\nexport interface SparklesIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst sizeClasses = {\n sm: 'h-4 w-4',\n md: 'h-5 w-5',\n lg: 'h-7 w-7',\n};\n\n/**\n * Sparkles icon - the modern symbol for AI features\n * Used by ChatGPT, GitHub Copilot, Google Gemini, etc.\n */\nexport function SparklesIcon({ className, size = 'md' }: SparklesIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n {/* Large sparkle */}\n <path d=\"M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z\" />\n {/* Small sparkle */}\n <path\n d=\"M20 3v4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M22 5h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// AI Logo Icon (Stack/Layers) - Legacy\n// ============================================================================\n\nexport interface AILogoIconProps {\n className?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * The AI assistant logo - a stacked layers/prism icon\n * @deprecated Use SparklesIcon for a more recognizable AI symbol\n */\nexport function AILogoIcon({ className, size = 'md' }: AILogoIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn(sizeClasses[size], className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"currentColor\"\n fillOpacity=\"0.2\"\n />\n <path\n d=\"M2 17L12 22L22 17\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2 12L12 17L22 12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Close Icon\n// ============================================================================\n\nexport interface CloseIconProps {\n className?: string;\n}\n\nexport function CloseIcon({ className }: CloseIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Refresh/Clear Icon\n// ============================================================================\n\nexport interface RefreshIconProps {\n className?: string;\n}\n\nexport function RefreshIcon({ className }: RefreshIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Chevron Icon\n// ============================================================================\n\nexport interface ChevronIconProps {\n className?: string;\n direction?: 'up' | 'down' | 'left' | 'right';\n}\n\nconst chevronRotation = {\n up: '-rotate-180',\n down: '',\n left: 'rotate-90',\n right: '-rotate-90',\n};\n\nexport function ChevronIcon({\n className,\n direction = 'down',\n}: ChevronIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-4 w-4', chevronRotation[direction], className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\n// ============================================================================\n// Send Icon\n// ============================================================================\n\nexport interface SendIconProps {\n className?: string;\n}\n\nexport function SendIcon({ className }: SendIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5', className)}\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 19l9 2-9-18-9 18 9-2zm0 0v-8\"\n />\n </svg>\n );\n}\n\n// ============================================================================\n// Spinner Icon\n// ============================================================================\n\nexport interface SpinnerIconProps {\n className?: string;\n}\n\nexport function SpinnerIcon({ className }: SpinnerIconProps) {\n return (\n <svg\n aria-hidden=\"true\"\n className={cn('h-5 w-5 animate-spin', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { ChevronIcon } from './icons';\n\nexport interface CollapsiblePillProps {\n label: string;\n leadingIcon?: React.ReactNode;\n density?: 'standard' | 'condensed';\n defaultOpen?: boolean;\n pillClassName?: string;\n className?: string;\n /** Native tooltip shown on hover (e.g. \"Show details\") */\n title?: string;\n children?: React.ReactNode;\n}\n\nexport function CollapsiblePill({\n label,\n leadingIcon,\n density = 'standard',\n defaultOpen = false,\n pillClassName,\n className,\n title,\n children,\n}: CollapsiblePillProps) {\n const hasContent = Boolean(children);\n const [isOpen, setIsOpen] = React.useState(defaultOpen);\n const contentId = React.useId();\n\n React.useEffect(() => {\n setIsOpen(defaultOpen);\n }, [defaultOpen]);\n\n const toggle = () => {\n setIsOpen((open) => !open);\n };\n\n return (\n <div data-slot=\"collapsible-pill\" className={className}>\n <button\n type=\"button\"\n onClick={hasContent ? toggle : undefined}\n aria-expanded={hasContent ? isOpen : undefined}\n aria-controls={hasContent ? contentId : undefined}\n title={title}\n disabled={!hasContent}\n className={cn(\n 'focus-visible:ring-ring inline-flex items-center gap-1.5 border font-medium transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-1',\n density === 'condensed'\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n pillClassName\n )}\n >\n {leadingIcon}\n <span>{label}</span>\n {hasContent && (\n <ChevronIcon\n direction={isOpen ? 'down' : 'right'}\n className={\n density === 'condensed'\n ? 'h-2.5 w-2.5 opacity-60'\n : 'h-3 w-3 opacity-60'\n }\n />\n )}\n </button>\n {hasContent && (\n <div\n id={contentId}\n aria-hidden={!isOpen}\n inert={!isOpen || undefined}\n className={cn(\n 'overflow-hidden transition-[max-height,opacity] duration-300 ease-in-out',\n isOpen\n ? 'max-h-[500px] overflow-y-auto opacity-100'\n : 'max-h-0 opacity-0'\n )}\n >\n <div className=\"mt-1.5\">{children}</div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * MCP Tool Call Display Component\n *\n * Renders an MCP tool invocation with status, parameters, and results.\n */\n\nimport * as React from 'react';\nimport { cva } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport type {\n MCPToolCall,\n MCPToolStatus,\n MCPToolResult,\n MCPResourceLink,\n MCPToolParameter,\n} from './types';\n\n// ============================================================================\n// Status Icon Component\n// ============================================================================\n\nconst statusIconVariants = cva(\n 'flex h-5 w-5 items-center justify-center rounded-full',\n {\n variants: {\n status: {\n pending: 'bg-neutral-200 dark:bg-neutral-700',\n running: 'bg-primary-100 dark:bg-primary-900/50',\n success: 'bg-green-100 dark:bg-green-900/50',\n error: 'bg-red-100 dark:bg-red-900/50',\n cancelled: 'bg-neutral-200 dark:bg-neutral-700',\n },\n },\n defaultVariants: {\n status: 'pending',\n },\n }\n);\n\ninterface ToolStatusIconProps {\n status: MCPToolStatus;\n className?: string;\n}\n\nfunction ToolStatusIcon({ status, className }: ToolStatusIconProps) {\n return (\n <span\n data-slot=\"ai-tool-status-icon\"\n className={cn(statusIconVariants({ status }), className)}\n >\n {status === 'pending' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <circle cx=\"10\" cy=\"10\" r=\"3\" />\n </svg>\n )}\n {status === 'running' && (\n <svg\n aria-hidden=\"true\"\n className=\"text-primary-800 dark:text-primary-400 h-3 w-3 animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"\n />\n </svg>\n )}\n {status === 'success' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n )}\n {status === 'error' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n )}\n {status === 'cancelled' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 text-neutral-500\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 12H6\" />\n </svg>\n )}\n </span>\n );\n}\n\n// ============================================================================\n// Tool Icon Component\n// ============================================================================\n\nconst TOOL_ICONS: Record<string, React.ReactNode> = {\n // Patient tools\n create_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M18 7.5v3m0 0v3m0-3h3m-3 0h-3m-2.25-4.125a3.375 3.375 0 11-6.75 0 3.375 3.375 0 016.75 0zM3 19.235v-.11a6.375 6.375 0 0112.75 0v.109A12.318 12.318 0 019.374 21c-2.331 0-4.512-.645-6.374-1.766z\"\n />\n </svg>\n ),\n get_patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n search_patients: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z\"\n />\n </svg>\n ),\n // Appointment tools\n schedule_appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5m-9-6h.008v.008H12v-.008zM12 15h.008v.008H12V15zm0 2.25h.008v.008H12v-.008zM9.75 15h.008v.008H9.75V15zm0 2.25h.008v.008H9.75v-.008zM7.5 15h.008v.008H7.5V15zm0 2.25h.008v.008H7.5v-.008zm6.75-4.5h.008v.008h-.008v-.008zm0 2.25h.008v.008h-.008V15zm0 2.25h.008v.008h-.008v-.008zm2.25-4.5h.008v.008H16.5v-.008zm0 2.25h.008v.008H16.5V15z\"\n />\n </svg>\n ),\n // Document tools\n create_document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n // Provider tools\n search_providers: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n // Default tool icon\n default: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n ),\n};\n\nfunction getToolIcon(toolName: string): React.ReactNode {\n return TOOL_ICONS[toolName] || TOOL_ICONS.default;\n}\n\n// ============================================================================\n// Resource Link Component\n// ============================================================================\n\nexport interface ResourceLinkProps {\n link: MCPResourceLink;\n onClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nexport function ResourceLink({ link, onClick, className }: ResourceLinkProps) {\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.preventDefault();\n onClick(link);\n }\n };\n\n const linkTypeIcons: Record<string, React.ReactNode> = {\n patient: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15.75 6a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0zM4.501 20.118a7.5 7.5 0 0114.998 0A17.933 17.933 0 0112 21.75c-2.676 0-5.216-.584-7.499-1.632z\"\n />\n </svg>\n ),\n document: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\"\n />\n </svg>\n ),\n appointment: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5\"\n />\n </svg>\n ),\n order: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h3.75M9 15h3.75M9 18h3.75m3 .75H18a2.25 2.25 0 002.25-2.25V6.108c0-1.135-.845-2.098-1.976-2.192a48.424 48.424 0 00-1.123-.08m-5.801 0c-.065.21-.1.433-.1.664 0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75 2.25 2.25 0 00-.1-.664m-5.8 0A2.251 2.251 0 0113.5 2.25H15c1.012 0 1.867.668 2.15 1.586m-5.8 0c-.376.023-.75.05-1.124.08C9.095 4.01 8.25 4.973 8.25 6.108V8.25m0 0H4.875c-.621 0-1.125.504-1.125 1.125v11.25c0 .621.504 1.125 1.125 1.125h9.75c.621 0 1.125-.504 1.125-1.125V9.375c0-.621-.504-1.125-1.125-1.125H8.25z\"\n />\n </svg>\n ),\n provider: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M15 10.5a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M19.5 10.5c0 7.142-7.5 11.25-7.5 11.25S4.5 17.642 4.5 10.5a7.5 7.5 0 1115 0z\"\n />\n </svg>\n ),\n external: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n />\n </svg>\n ),\n internal: (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\"\n />\n </svg>\n ),\n };\n\n const icon = link.type ? linkTypeIcons[link.type] : linkTypeIcons.internal;\n\n return (\n <a\n href={link.href}\n onClick={handleClick}\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-md px-2.5 py-1.5',\n 'bg-primary-50 text-primary-900 hover:bg-primary-100',\n 'dark:bg-primary-900/30 dark:text-primary-300 dark:hover:bg-primary-900/50',\n 'text-sm font-medium transition-colors',\n 'focus:ring-primary-500 focus:ring-2 focus:ring-offset-2 focus:outline-none',\n 'dark:focus:ring-offset-neutral-900',\n className\n )}\n >\n {icon}\n <span>{link.label}</span>\n {link.type === 'external' && (\n <svg\n aria-hidden=\"true\"\n className=\"h-3 w-3 opacity-60\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M4.5 19.5l15-15m0 0H8.25m11.25 0v11.25\"\n />\n </svg>\n )}\n </a>\n );\n}\n\n// ============================================================================\n// Tool Result Component\n// ============================================================================\n\ninterface ToolResultDisplayProps {\n result: MCPToolResult;\n onLinkClick?: (link: MCPResourceLink) => void;\n className?: string;\n}\n\nfunction ToolResultDisplay({\n result,\n onLinkClick,\n className,\n}: ToolResultDisplayProps) {\n if (result.type === 'error') {\n return (\n <div\n className={cn(\n 'mt-2 rounded-md bg-red-50 p-3 dark:bg-red-900/20',\n className\n )}\n >\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {typeof result.data === 'string'\n ? String(result.data)\n : 'An error occurred'}\n </p>\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {result.summary && (\n <p className=\"text-sm text-neutral-700 dark:text-neutral-300\">\n {result.summary}\n </p>\n )}\n\n {result.link && <ResourceLink link={result.link} onClick={onLinkClick} />}\n\n {result.resources && result.resources.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {result.resources.map((resource) => (\n <ResourceLink\n key={resource.id}\n link={{\n href: resource.uri || '#',\n label: resource.name,\n type: resource.type as MCPResourceLink['type'],\n }}\n onClick={onLinkClick}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// MCP Tool Call Component\n// ============================================================================\n\n// Human-readable tool names\nconst TOOL_FRIENDLY_NAMES: Record<string, string> = {\n create_patient: 'Creating patient',\n get_patient: 'Looking up patient',\n search_patients: 'Searching patients',\n update_patient: 'Updating patient',\n delete_patient: 'Removing patient',\n schedule_appointment: 'Scheduling appointment',\n cancel_appointment: 'Canceling appointment',\n update_appointment: 'Updating appointment',\n create_document: 'Creating document',\n upload_document: 'Uploading document',\n get_document: 'Retrieving document',\n search_documents: 'Searching documents',\n create_order: 'Creating order',\n send_message: 'Sending message',\n search: 'Searching',\n search_providers: 'Searching for providers',\n};\n\nfunction getToolFriendlyName(toolName: string, status: MCPToolStatus): string {\n const baseName = TOOL_FRIENDLY_NAMES[toolName] || toolName.replace(/_/g, ' ');\n\n // Adjust tense based on status\n if (status === 'success') {\n // Past tense approximation — check longer prefixes first to avoid\n // partial matches (e.g. \"Searching for\" before \"Searching\")\n if (baseName.startsWith('Creating'))\n return baseName.replace('Creating', 'Created');\n if (baseName.startsWith('Scheduling'))\n return baseName.replace('Scheduling', 'Scheduled');\n if (baseName.startsWith('Searching for'))\n return baseName.replace('Searching for', 'Found');\n if (baseName.startsWith('Searching'))\n return baseName.replace('Searching', 'Found');\n if (baseName.startsWith('Looking'))\n return baseName.replace('Looking', 'Found');\n if (baseName.startsWith('Updating'))\n return baseName.replace('Updating', 'Updated');\n if (baseName.startsWith('Removing'))\n return baseName.replace('Removing', 'Removed');\n if (baseName.startsWith('Canceling'))\n return baseName.replace('Canceling', 'Canceled');\n if (baseName.startsWith('Retrieving'))\n return baseName.replace('Retrieving', 'Retrieved');\n if (baseName.startsWith('Uploading'))\n return baseName.replace('Uploading', 'Uploaded');\n if (baseName.startsWith('Sending'))\n return baseName.replace('Sending', 'Sent');\n }\n return baseName;\n}\n\n// Generate a user-friendly summary from parameters\nfunction getParameterSummary(\n toolName: string,\n params: MCPToolParameter[]\n): string | null {\n const paramMap = Object.fromEntries(params.map((p) => [p.name, p.value]));\n\n // Patient creation\n if (\n toolName === 'create_patient' &&\n paramMap.firstName &&\n paramMap.lastName\n ) {\n return `${paramMap.firstName} ${paramMap.lastName}`;\n }\n\n // Search\n if (toolName.includes('search') && paramMap.query) {\n return `\"${paramMap.query}\"`;\n }\n\n // Appointment\n if (toolName.includes('appointment') && paramMap.patientName) {\n const date = paramMap.preferredDate || paramMap.date;\n return date\n ? `${paramMap.patientName} on ${date}`\n : String(paramMap.patientName);\n }\n\n // Provider search\n if (toolName === 'search_providers' && paramMap.zipcode) {\n const service = paramMap.service;\n return service\n ? `${service} near ${paramMap.zipcode}`\n : `near ${paramMap.zipcode}`;\n }\n\n return null;\n}\n\n// Pill header colors per status (Ozwell-style status pill)\nconst statusPillClasses: Record<MCPToolStatus, string> = {\n pending:\n 'bg-neutral-100 border-neutral-200 text-neutral-600 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n running:\n 'bg-primary-50 border-primary-200 text-primary-800 dark:bg-primary-900/20 dark:border-primary-800 dark:text-primary-300',\n success:\n 'bg-green-50 border-green-200 text-green-700 dark:bg-green-900/20 dark:border-green-800 dark:text-green-300',\n error:\n 'bg-red-50 border-red-200 text-red-700 dark:bg-red-900/20 dark:border-red-800 dark:text-red-300',\n cancelled:\n 'bg-neutral-100 border-neutral-200 text-neutral-400 opacity-60 dark:bg-neutral-800 dark:border-neutral-700 dark:text-neutral-400',\n};\n\nexport interface MCPToolCallDisplayProps {\n /** The tool call to display */\n toolCall: MCPToolCall;\n /** Compact (condensed) sizing — tighter pill and box */\n compact?: boolean;\n /** Whether to include raw parameters inside the detail box */\n showParameters?: boolean;\n /** Whether clicking the pill can expand/collapse the entire detail box */\n collapsible?: boolean;\n /** Default collapsed state. By default, completed tool calls start expanded. */\n defaultCollapsed?: boolean;\n /** Hide the whole tool-call display (mirrors Ozwell's debug flag) */\n hidden?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an MCP tool call with its status, parameters, and results.\n * Shows a user-friendly summary by default, with technical details available on expand.\n */\nexport function MCPToolCallDisplay({\n toolCall,\n showParameters = true,\n collapsible = true,\n defaultCollapsed,\n compact,\n hidden = false,\n onLinkClick,\n className,\n}: MCPToolCallDisplayProps) {\n const formatDuration = (ms?: number) => {\n if (!ms) return null;\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(1)}s`;\n };\n\n const friendlyName = getToolFriendlyName(toolCall.toolName, toolCall.status);\n const durationLabel = formatDuration(toolCall.duration);\n const paramSummary = getParameterSummary(\n toolCall.toolName,\n toolCall.parameters\n );\n\n // While running, show the input summary in the pill (e.g. \"Creating patient\n // · John Smith\"). On success the name already appears as the result link, so\n // show the duration instead to avoid duplication.\n const detailBit =\n toolCall.status === 'success'\n ? durationLabel\n : (paramSummary ?? durationLabel);\n const pillLabel = detailBit ? `${friendlyName} · ${detailBit}` : friendlyName;\n\n const hasParams = showParameters && toolCall.parameters.length > 0;\n const hasBoxContent = Boolean(toolCall.result || toolCall.error || hasParams);\n const isCompleted =\n toolCall.status === 'success' || toolCall.status === 'error';\n const effectiveDefaultCollapsed = defaultCollapsed ?? !isCompleted;\n\n if (hidden) return null;\n\n // Everything the pill reveals in one click: result, links, and raw params.\n const box = (\n <div\n className={cn(\n 'w-full max-w-md space-y-2 rounded-lg border border-neutral-200 bg-neutral-50 dark:border-neutral-700 dark:bg-neutral-800/50',\n compact ? 'p-2' : 'p-3'\n )}\n >\n {/* Result Summary & Links */}\n {toolCall.result && (\n <div data-slot=\"ai-tool-result\">\n <ToolResultDisplay\n result={toolCall.result}\n onLinkClick={onLinkClick}\n />\n </div>\n )}\n\n {/* Error */}\n {toolCall.error && (\n <div className=\"rounded-md bg-red-100 p-2 dark:bg-red-900/30\">\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {toolCall.error}\n </p>\n </div>\n )}\n\n {/* Raw parameters — revealed together with the box */}\n {hasParams && (\n <div\n data-slot=\"ai-tool-parameters\"\n className=\"rounded-md bg-neutral-100 p-2 dark:bg-neutral-800\"\n >\n <h4 className=\"mb-1.5 text-xs font-medium tracking-wide text-neutral-600 uppercase dark:text-neutral-400\">\n Parameters\n </h4>\n <div className=\"space-y-0.5\">\n {toolCall.parameters.map((param) => (\n <div key={param.name} className=\"flex items-start gap-2 text-xs\">\n <span className=\"font-mono text-neutral-600 dark:text-neutral-400\">\n {param.name}:\n </span>\n <span className=\"font-mono text-neutral-700 dark:text-neutral-300\">\n {typeof param.value === 'string'\n ? param.value\n : JSON.stringify(param.value)}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n\n const staticPill = (\n <span\n data-slot=\"ai-tool-pill\"\n className={cn(\n 'inline-flex items-center gap-1.5 border font-medium',\n compact\n ? 'rounded-[8px] px-2 py-0.5 text-[10px]'\n : 'rounded-[10px] px-[11px] py-1 text-[11px]',\n statusPillClasses[toolCall.status]\n )}\n >\n <ToolStatusIcon status={toolCall.status} />\n <span>{pillLabel}</span>\n </span>\n );\n\n return (\n <div data-slot=\"ai-tool-call\" className={className}>\n {!hasBoxContent ? (\n staticPill\n ) : collapsible ? (\n // Pill click reveals the whole box (result + params) in one go.\n <CollapsiblePill\n label={pillLabel}\n leadingIcon={<ToolStatusIcon status={toolCall.status} />}\n density={compact ? 'condensed' : 'standard'}\n defaultOpen={!effectiveDefaultCollapsed}\n pillClassName={statusPillClasses[toolCall.status]}\n title=\"Toggle details\"\n >\n {box}\n </CollapsiblePill>\n ) : (\n // Non-collapsible: pill + box always visible.\n <div className=\"space-y-1.5\">\n {staticPill}\n {box}\n </div>\n )}\n </div>\n );\n}\n\nexport { ToolStatusIcon, getToolIcon };\n","/**\n * AI Message Component\n *\n * Renders AI chat messages with support for text, tool calls, and streaming.\n */\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\nimport type {\n AIMessage,\n AIMessageContent,\n AIRenderMessageFooter,\n AIRenderTextContent,\n MCPResourceLink,\n} from './types';\nimport { MCPToolCallDisplay } from './MCPToolCall';\nimport { SparklesIcon } from './icons';\nimport { CollapsiblePill } from './CollapsiblePill';\nimport { AudioPlayer } from '../AudioPlayer';\n\n// ============================================================================\n// Avatar Component\n// ============================================================================\n\nconst avatarVariants = cva(\n 'flex shrink-0 items-center justify-center rounded-full',\n {\n variants: {\n role: {\n user: 'bg-primary-100 text-primary-900 dark:bg-primary-900/50 dark:text-primary-300',\n assistant: 'bg-primary-800 text-white dark:bg-primary-800',\n system:\n 'bg-neutral-200 text-neutral-600 dark:bg-neutral-700 dark:text-neutral-400',\n tool: 'bg-amber-100 text-amber-700 dark:bg-amber-900/50 dark:text-amber-300',\n },\n size: {\n sm: 'h-6 w-6 text-xs',\n md: 'h-8 w-8 text-sm',\n lg: 'h-10 w-10 text-base',\n },\n },\n defaultVariants: {\n role: 'user',\n size: 'md',\n },\n }\n);\n\ninterface MessageAvatarProps extends VariantProps<typeof avatarVariants> {\n userName?: string;\n className?: string;\n}\n\nfunction MessageAvatar({\n role,\n size,\n userName,\n className,\n}: MessageAvatarProps) {\n const getInitials = (name?: string) => {\n if (!name) return '?';\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n };\n\n return (\n <div\n data-slot=\"ai-message-avatar\"\n className={cn(avatarVariants({ role, size }), className)}\n >\n {role === 'assistant' ? (\n <SparklesIcon size=\"md\" />\n ) : role === 'user' ? (\n <span className=\"font-medium\">{getInitials(userName)}</span>\n ) : role === 'system' ? (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n />\n </svg>\n ) : (\n <svg\n aria-hidden=\"true\"\n className=\"h-4 w-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M11.42 15.17L17.25 21A2.652 2.652 0 0021 17.25l-5.877-5.877M11.42 15.17l2.496-3.03c.317-.384.74-.626 1.208-.766M11.42 15.17l-4.655 5.653a2.548 2.548 0 11-3.586-3.586l6.837-5.63m5.108-.233c.55-.164 1.163-.188 1.743-.14a4.5 4.5 0 004.486-6.336l-3.276 3.277a3.004 3.004 0 01-2.25-2.25l3.276-3.276a4.5 4.5 0 00-6.336 4.486c.091 1.076-.071 2.264-.904 2.95l-.102.085m-1.745 1.437L5.909 7.5H4.5L2.25 3.75l1.5-1.5L7.5 4.5v1.409l4.26 4.26m-1.745 1.437l1.745-1.437m6.615 8.206L15.75 15.75M4.867 19.125h.008v.008h-.008v-.008z\"\n />\n </svg>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Typing Indicator\n// ============================================================================\n\nfunction AITypingIndicator({ className }: { className?: string }) {\n const dotStyle = {\n width: '6px',\n height: '6px',\n minWidth: '6px',\n minHeight: '6px',\n flexShrink: 0,\n };\n\n return (\n <div\n data-slot=\"ai-typing-indicator\"\n className={cn('inline-flex items-center justify-center gap-2', className)}\n >\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.32s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n animationDelay: '-0.16s',\n }}\n />\n <span\n className=\"rounded-full bg-neutral-500 dark:bg-neutral-400\"\n style={{\n ...dotStyle,\n animation: 'typing-dot 1.4s infinite ease-in-out both',\n }}\n />\n <style>{`\n @keyframes typing-dot {\n 0%, 80%, 100% { opacity: 0.4; }\n 40% { opacity: 1; }\n }\n `}</style>\n </div>\n );\n}\n\n// ============================================================================\n// Thinking Block\n// ============================================================================\n\nfunction ThinkingBlock({\n text,\n streaming,\n defaultCollapsed = false,\n}: {\n text: string;\n streaming: boolean;\n defaultCollapsed?: boolean;\n}) {\n const startedAt = React.useRef(Date.now());\n const [elapsed, setElapsed] = React.useState<number | null>(null);\n const prevStreaming = React.useRef(streaming);\n\n React.useEffect(() => {\n if (prevStreaming.current && !streaming) {\n setElapsed(Math.round((Date.now() - startedAt.current) / 1000));\n }\n prevStreaming.current = streaming;\n }, [streaming]);\n\n const label = streaming\n ? 'Thinking'\n : elapsed !== null && elapsed > 0\n ? `Thought for ${elapsed}s`\n : 'Thought';\n\n const dot = streaming ? (\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-1.5 w-1.5 animate-pulse rounded-full bg-violet-500 dark:bg-violet-400\"\n />\n ) : null;\n\n return (\n <div data-slot=\"ai-message-thinking\">\n <CollapsiblePill\n label={label}\n leadingIcon={dot}\n defaultOpen={!defaultCollapsed}\n pillClassName=\"bg-violet-50 border-violet-200 text-violet-600 hover:bg-violet-100 dark:bg-violet-950/30 dark:border-violet-800 dark:text-violet-400 dark:hover:bg-violet-950/50 focus-visible:ring-violet-500\"\n >\n <div className=\"border-s-2 border-violet-200 ps-3 text-[13px] leading-relaxed text-neutral-600 italic dark:border-violet-700 dark:text-neutral-400\">\n {text}\n </div>\n </CollapsiblePill>\n </div>\n );\n}\n\n// ============================================================================\n// Content Block Renderer\n// ============================================================================\n\ninterface ContentBlockProps {\n content: AIMessageContent;\n onLinkClick?: (link: MCPResourceLink) => void;\n messageId: string;\n streaming: boolean;\n role: AIMessage['role'];\n renderTextContent?: AIRenderTextContent;\n}\n\nfunction ContentBlock({\n content,\n onLinkClick,\n messageId,\n streaming,\n role,\n renderTextContent,\n}: ContentBlockProps) {\n if (content.type === 'text' && content.text) {\n if (renderTextContent) {\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n {renderTextContent(content.text, { messageId, streaming, role })}\n </div>\n );\n }\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <p className=\"whitespace-pre-wrap\">{content.text}</p>\n </div>\n );\n }\n\n if (content.type === 'tool_use' && content.toolCall) {\n return (\n <MCPToolCallDisplay\n toolCall={content.toolCall}\n onLinkClick={onLinkClick}\n defaultCollapsed={content.collapsed}\n />\n );\n }\n\n if (content.type === 'thinking' && content.text) {\n return (\n <ThinkingBlock\n text={content.text}\n streaming={streaming}\n defaultCollapsed={content.collapsed ?? false}\n />\n );\n }\n\n if (content.type === 'code' && content.text) {\n return (\n <pre\n data-slot=\"ai-message-code\"\n className=\"rounded-lg bg-neutral-900 p-3 text-sm dark:bg-neutral-950\"\n >\n <code\n className={content.language ? `language-${content.language}` : ''}\n >\n {content.text}\n </code>\n </pre>\n );\n }\n\n if (content.type === 'audio' && content.audioUrl) {\n // Guard against `javascript:` URLs, mirroring the image/file blocks.\n if (/^\\s*javascript:/i.test(content.audioUrl)) {\n return null;\n }\n return (\n <AudioPlayer\n src={content.audioUrl}\n title={content.text || 'Audio recording'}\n variant=\"waveform\"\n showTime\n showPlaybackRate\n fallbackDuration={content.duration}\n />\n );\n }\n\n if (content.type === 'video' && content.videoUrl) {\n // Guard against `javascript:` URLs, mirroring the audio/image/file blocks.\n if (/^\\s*javascript:/i.test(content.videoUrl)) {\n return null;\n }\n return (\n <video\n src={content.videoUrl}\n controls\n preload=\"metadata\"\n aria-label={content.text || 'Video recording'}\n className=\"my-1 max-h-80 w-full rounded-lg bg-black\"\n >\n {/* Recorded clips carry no caption track; present for a11y compliance. */}\n <track kind=\"captions\" />\n </video>\n );\n }\n\n if (content.type === 'image' && content.imageUrl) {\n const safeHref = /^\\s*javascript:/i.test(content.imageUrl)\n ? undefined\n : content.imageUrl;\n return (\n <a\n href={safeHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit transition-transform hover:scale-[1.02]\"\n aria-label={`View ${content.name || 'Uploaded image'}`}\n >\n <img\n src={content.imageUrl}\n alt={content.name || 'Uploaded image'}\n loading=\"lazy\"\n className=\"my-1 max-h-64 w-auto rounded-lg object-cover\"\n />\n </a>\n );\n }\n\n if (content.type === 'file') {\n const sizeLabel =\n typeof content.fileSize === 'number'\n ? formatFileSize(content.fileSize)\n : undefined;\n const card = (\n <div className=\"my-1 flex items-center gap-3 rounded-lg bg-neutral-100 p-3 transition-colors dark:bg-neutral-800\">\n <div className=\"rounded-lg bg-neutral-200 p-2 dark:bg-neutral-700\">\n <svg\n aria-hidden=\"true\"\n className=\"h-6 w-6\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </div>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">\n {content.name || 'Document'}\n </p>\n {sizeLabel && <p className=\"text-xs opacity-70\">{sizeLabel}</p>}\n </div>\n </div>\n );\n\n if (content.fileUrl) {\n const safeFileHref = /^\\s*javascript:/i.test(content.fileUrl)\n ? undefined\n : content.fileUrl;\n return (\n <a\n href={safeFileHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"block w-fit no-underline\"\n >\n {card}\n </a>\n );\n }\n return card;\n }\n\n return null;\n}\n\n/** Human-readable file size (e.g. \"1.2 MB\"). */\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ============================================================================\n// AI Message Component\n// ============================================================================\n\nconst messageVariants = cva('flex gap-3', {\n variants: {\n role: {\n user: 'flex-row-reverse',\n assistant: 'flex-row',\n system: 'flex-row justify-center',\n tool: 'flex-row',\n },\n },\n defaultVariants: {\n role: 'assistant',\n },\n});\n\nconst bubbleVariants = cva('rounded-2xl px-4 py-2.5 w-fit max-w-[85%]', {\n variants: {\n variant: {\n user: 'bg-primary-800 text-white dark:bg-primary-800',\n assistant:\n 'bg-neutral-100 text-neutral-900 dark:bg-neutral-800 dark:text-white',\n system:\n 'bg-neutral-100 text-neutral-600 dark:bg-neutral-800 dark:text-neutral-400 text-center text-sm max-w-[95%]',\n tool: 'bg-transparent p-0 max-w-full w-full',\n },\n },\n defaultVariants: {\n variant: 'assistant',\n },\n});\n\nexport interface ChatBubbleProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof bubbleVariants> {\n /** Show error styling (red border). */\n hasError?: boolean;\n /**\n * Optional left-border accent color. Used by multi-participant surfaces\n * (e.g. SuperChat) to tint a speaker's bubble; AI chat leaves it unset.\n */\n accent?: string;\n}\n\n/**\n * The shared chat bubble shell. This is the single source of truth for how a\n * chat message bubble looks across the library (AI chat, SuperChat, etc.).\n * Presentational only — callers render their own content inside.\n */\nconst ChatBubble = React.forwardRef<HTMLDivElement, ChatBubbleProps>(\n (\n { className, variant, hasError, accent, style, children, ...props },\n ref\n ) => {\n return (\n <div\n ref={ref}\n data-slot=\"chat-bubble\"\n className={cn(\n bubbleVariants({ variant }),\n hasError && 'border border-red-300 dark:border-red-700',\n className\n )}\n style={accent ? { borderLeft: `3px solid ${accent}`, ...style } : style}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nChatBubble.displayName = 'ChatBubble';\n\nexport interface AIMessageDisplayProps {\n /** The message to display */\n message: AIMessage;\n /** User name for user messages */\n userName?: string;\n /** Whether to show the avatar */\n showAvatar?: boolean;\n /** Whether to show timestamp */\n showTimestamp?: boolean;\n /** Callback when a resource link is clicked */\n onLinkClick?: (link: MCPResourceLink) => void;\n /**\n * Optional renderer for `text` content blocks (e.g. Markdown). Called per\n * text block with `{ messageId, streaming, role }`. Host must sanitize.\n */\n renderTextContent?: AIRenderTextContent;\n /**\n * Optional renderer for a per-message footer shown below the bubble (e.g.\n * message action controls). Aligned with the message (right for user, left\n * for assistant).\n */\n renderMessageFooter?: AIRenderMessageFooter;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Displays an AI chat message with support for text, tool calls, and streaming.\n */\nexport function AIMessageDisplay({\n message,\n userName,\n showAvatar = true,\n showTimestamp = false,\n onLinkClick,\n renderTextContent,\n renderMessageFooter,\n className,\n}: AIMessageDisplayProps) {\n const isStreaming = message.status === 'streaming';\n const hasContent = message.content.length > 0;\n const messageFooter = renderMessageFooter?.(message);\n\n const formatTime = (timestamp: Date | string) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString(undefined, {\n hour: 'numeric',\n minute: '2-digit',\n });\n };\n\n // For tool messages, render just the tool call without bubble\n if (message.role === 'tool') {\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && <MessageAvatar role={message.role} />}\n <div className=\"flex-1 space-y-2\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n {showAvatar && message.role !== 'system' && (\n <MessageAvatar role={message.role} userName={userName} />\n )}\n\n <div\n className={cn(\n 'flex min-w-0 flex-1 flex-col gap-1',\n message.role === 'user' && 'items-end'\n )}\n >\n <ChatBubble\n data-slot=\"ai-message-bubble\"\n variant={message.role}\n hasError={message.status === 'error'}\n >\n {hasContent ? (\n <div className=\"space-y-3\">\n {message.content.map((content, index) => (\n <ContentBlock\n key={index}\n content={content}\n onLinkClick={onLinkClick}\n messageId={message.id}\n streaming={isStreaming}\n role={message.role}\n renderTextContent={renderTextContent}\n />\n ))}\n </div>\n ) : isStreaming ? (\n <div className=\"flex items-center justify-center\">\n <AITypingIndicator />\n </div>\n ) : null}\n </ChatBubble>\n\n {messageFooter != null && messageFooter !== false && (\n <div data-slot=\"ai-message-footer\" className=\"w-fit max-w-[85%]\">\n {messageFooter}\n </div>\n )}\n\n {showTimestamp && (\n <span\n data-slot=\"ai-message-timestamp\"\n className=\"px-2 text-xs text-neutral-500\"\n >\n {formatTime(message.timestamp)}\n </span>\n )}\n\n {message.status === 'error' && (\n <span className=\"px-2 text-xs text-red-500\">\n {message.role === 'user' ? 'Failed to send' : 'An error occurred'}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nexport { MessageAvatar, AITypingIndicator, ChatBubble, bubbleVariants };\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { Check, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { useAnchoredPosition } from '../../hooks/useAnchoredPosition';\nimport { useClickOutside } from '../../hooks/useClickOutside';\nimport { useEscapeKey } from '../../hooks/useEscapeKey';\n\nexport type ProviderModelValue = {\n provider: string;\n model: string;\n};\n\nexport type ProviderModelOption = ProviderModelValue & {\n label?: string;\n providerLabel?: string;\n id?: string;\n};\n\n/** A reasoning-effort level offered alongside the model. */\nexport type ComposerEffortOption = {\n value: string;\n label: string;\n /** Optional secondary line, e.g. a caveat about cost or latency. */\n description?: string;\n};\n\ntype ComposerModelSelectorBaseProps = {\n models: ProviderModelOption[];\n value: ProviderModelValue | null;\n onChange: (value: ProviderModelValue) => void;\n disabled?: boolean;\n /**\n * Trigger appearance: 'default' is the bordered pill; 'ghost' is a quiet\n * text trigger that matches ChatComposer's selector-row controls.\n */\n variant?: 'default' | 'ghost';\n className?: string;\n boundaryRef?: React.RefObject<HTMLElement | null>;\n placeholder?: string;\n anyLabel?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /**\n * Reasoning-effort levels for the selected model. Omit or pass an empty\n * array to hide the effort row entirely, which is what a model that cannot\n * reason should resolve to — the levels are provider-specific, so the caller\n * owns deciding which apply.\n */\n effortOptions?: ComposerEffortOption[];\n /** Currently selected effort. */\n effort?: string | null;\n /** Effort marked with a \"default\" badge in the list. */\n defaultEffort?: string;\n onEffortChange?: (value: string) => void;\n effortLabel?: string;\n effortHint?: string;\n defaultBadgeLabel?: string;\n backLabel?: string;\n};\n\ntype ControlledProviderFilterProps = {\n providerFilter: string | null;\n onProviderFilterChange: (provider: string | null) => void;\n};\n\ntype UncontrolledProviderFilterProps = {\n providerFilter?: undefined;\n onProviderFilterChange?: (provider: string | null) => void;\n};\n\nexport type ComposerModelSelectorProps = ComposerModelSelectorBaseProps &\n (ControlledProviderFilterProps | UncontrolledProviderFilterProps);\n\nconst MENU_OFFSET_PX = 6;\nconst MENU_MAX_HEIGHT_PX = 320;\n\nfunction optionKey(option: ProviderModelValue) {\n return `${option.provider}\\u0000${option.model}`;\n}\n\nfunction renderedOptionKey(option: ProviderModelOption, index: number) {\n return `${option.id ?? optionKey(option)}\\u0000${index}`;\n}\n\ntype RenderedModelOption = {\n option: ProviderModelOption;\n index: number;\n key: string;\n};\n\nfunction groupByProvider(models: ProviderModelOption[]) {\n const groups = new Map<string, ProviderModelOption[]>();\n\n for (const model of models) {\n const group = groups.get(model.provider);\n if (group) {\n group.push(model);\n } else {\n groups.set(model.provider, [model]);\n }\n }\n\n return Array.from(groups, ([provider, options]) => ({ provider, options }));\n}\n\nfunction getProviderLabel(models: ProviderModelOption[], provider: string) {\n return (\n models.find((model) => model.provider === provider && model.providerLabel)\n ?.providerLabel ?? provider\n );\n}\n\nexport function ComposerModelSelector({\n models,\n value,\n providerFilter,\n onProviderFilterChange,\n onChange,\n disabled = false,\n variant = 'default',\n className,\n boundaryRef,\n placeholder = 'Model',\n anyLabel = 'Any',\n emptyLabel = 'No models',\n ariaLabel = 'Model',\n effortOptions,\n effort = null,\n defaultEffort,\n onEffortChange,\n effortLabel = 'Effort',\n effortHint,\n defaultBadgeLabel = 'Default',\n backLabel = 'Back',\n}: ComposerModelSelectorProps) {\n const [open, setOpen] = React.useState(false);\n // The menu drills down rather than opening a side panel: one anchored\n // surface is far less fragile near the viewport edge, which is exactly where\n // a composer sits.\n const [view, setView] = React.useState<'models' | 'effort'>('models');\n const [effortHighlight, setEffortHighlight] = React.useState(0);\n const [internalProviderFilter, setInternalProviderFilter] = React.useState<\n string | null\n >(null);\n const [highlightedIndex, setHighlightedIndex] = React.useState(0);\n const listRef = React.useRef<HTMLDivElement>(null);\n const effortListRef = React.useRef<HTMLDivElement>(null);\n const menuId = React.useId();\n const {\n anchorRef: triggerRef,\n floatingRef: menuRef,\n style: menuStyle,\n } = useAnchoredPosition<HTMLButtonElement, HTMLDivElement>({\n open,\n placement: 'top-start',\n offset: MENU_OFFSET_PX,\n matchMinWidth: true,\n maxHeight: MENU_MAX_HEIGHT_PX,\n allowFlip: false,\n boundaryRef,\n });\n\n const activeProviderFilter =\n providerFilter === undefined ? internalProviderFilter : providerFilter;\n const selectedKey = value ? optionKey(value) : null;\n const selectedOption = models.find(\n (model) => optionKey(model) === selectedKey\n );\n const providers = React.useMemo(\n () => Array.from(new Set(models.map((model) => model.provider))),\n [models]\n );\n const providerLabels = React.useMemo(\n () =>\n new Map(\n providers.map((provider) => [\n provider,\n getProviderLabel(models, provider),\n ])\n ),\n [models, providers]\n );\n const filteredModels = React.useMemo(\n () =>\n activeProviderFilter === null\n ? models\n : models.filter((model) => model.provider === activeProviderFilter),\n [activeProviderFilter, models]\n );\n const groupedModels = React.useMemo(\n () => groupByProvider(filteredModels),\n [filteredModels]\n );\n const groupedRenderedModels = React.useMemo(() => {\n let index = 0;\n return groupedModels.map((group) => ({\n provider: group.provider,\n options: group.options.map((option) => {\n const rendered: RenderedModelOption = {\n option,\n index,\n key: renderedOptionKey(option, index),\n };\n index += 1;\n return rendered;\n }),\n }));\n }, [groupedModels]);\n const renderedModels = React.useMemo(\n () => groupedRenderedModels.flatMap((group) => group.options),\n [groupedRenderedModels]\n );\n const getOptionId = React.useCallback(\n (index: number) => `${menuId}-option-${index}`,\n [menuId]\n );\n // The two views are mutually exclusive, so both listboxes carry `menuId` and\n // the trigger's `aria-controls` stays pointed at whichever one is rendered.\n // Option ids are namespaced per view so they cannot collide.\n const getEffortOptionId = React.useCallback(\n (index: number) => `${menuId}-effort-option-${index}`,\n [menuId]\n );\n const activeOptionId =\n open && renderedModels[highlightedIndex]\n ? getOptionId(highlightedIndex)\n : undefined;\n const selectedRenderedIndex = React.useMemo(\n () =>\n selectedKey\n ? renderedModels.findIndex(\n (renderedModel) => optionKey(renderedModel.option) === selectedKey\n )\n : -1,\n [renderedModels, selectedKey]\n );\n\n const setProvider = React.useCallback(\n (provider: string | null) => {\n if (providerFilter === undefined) {\n setInternalProviderFilter(provider);\n }\n onProviderFilterChange?.(provider);\n },\n [onProviderFilterChange, providerFilter]\n );\n\n const close = React.useCallback(\n (restoreFocus = true) => {\n setOpen(false);\n if (restoreFocus) {\n triggerRef.current?.focus({ preventScroll: true });\n }\n },\n [triggerRef]\n );\n\n const selectModel = React.useCallback(\n (model: ProviderModelOption) => {\n onChange({ provider: model.provider, model: model.model });\n close();\n },\n [close, onChange]\n );\n\n const efforts = React.useMemo(() => effortOptions ?? [], [effortOptions]);\n const activeEffortOptionId =\n open && efforts[effortHighlight]\n ? getEffortOptionId(effortHighlight)\n : undefined;\n const selectedEffortOption = efforts.find(\n (option) => option.value === effort\n );\n\n const selectEffort = React.useCallback(\n (value: string) => {\n onEffortChange?.(value);\n close();\n },\n [close, onEffortChange]\n );\n\n const handleEffortKeyDown = (event: React.KeyboardEvent) => {\n if (efforts.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setEffortHighlight((current) => (current + 1) % efforts.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setEffortHighlight(\n (current) => (current - 1 + efforts.length) % efforts.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setEffortHighlight(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setEffortHighlight(efforts.length - 1);\n }\n // Left/Backspace mirrors the drill-down affordance so keyboard users can\n // get back to the model list without reaching for the mouse.\n if (event.key === 'ArrowLeft' || event.key === 'Backspace') {\n event.preventDefault();\n setView('models');\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlighted = efforts[effortHighlight];\n if (highlighted) selectEffort(highlighted.value);\n }\n };\n\n const outsideRefs = React.useMemo(\n () => [triggerRef, menuRef],\n [triggerRef, menuRef]\n );\n\n useClickOutside(outsideRefs, () => close(false), open);\n\n useEscapeKey(close, open);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex(selectedRenderedIndex >= 0 ? selectedRenderedIndex : 0);\n }, [activeProviderFilter, open, selectedRenderedIndex]);\n\n // Every open starts on the model list. Deliberately keyed on `open` alone:\n // callers commonly derive `effortOptions` from the selected model, so the\n // array identity changes on every parent render, and folding that into this\n // effect would drop the user back to the model list mid-interaction.\n React.useEffect(() => {\n if (!open) return;\n setView('models');\n }, [open]);\n\n // The effort list starts on the current value so Enter is a no-op rather\n // than a surprise change.\n React.useEffect(() => {\n if (!open) return;\n const current = efforts.findIndex((option) => option.value === effort);\n setEffortHighlight(current >= 0 ? current : 0);\n }, [effort, efforts, open]);\n\n React.useEffect(() => {\n if (!open) return;\n setHighlightedIndex((current) =>\n Math.min(current, Math.max(renderedModels.length - 1, 0))\n );\n }, [open, renderedModels.length]);\n\n React.useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => {\n const target =\n view === 'effort' ? effortListRef.current : listRef.current;\n target?.focus({ preventScroll: true });\n });\n }, [open, view]);\n\n const handleTriggerKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n setOpen(true);\n }\n };\n\n const handleMenuKeyDown = (event: React.KeyboardEvent) => {\n if (renderedModels.length === 0) return;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n setHighlightedIndex((current) => (current + 1) % renderedModels.length);\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n setHighlightedIndex(\n (current) =>\n (current - 1 + renderedModels.length) % renderedModels.length\n );\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setHighlightedIndex(0);\n }\n if (event.key === 'End') {\n event.preventDefault();\n setHighlightedIndex(renderedModels.length - 1);\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const highlightedModel = renderedModels[highlightedIndex]?.option;\n if (highlightedModel) {\n selectModel(highlightedModel);\n }\n }\n };\n\n return (\n <>\n <button\n ref={triggerRef}\n type=\"button\"\n disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n onClick={() => setOpen((current) => !current)}\n onKeyDown={handleTriggerKeyDown}\n data-slot=\"composer-model-selector-trigger\"\n className={cn(\n variant === 'ghost'\n ? [\n 'inline-flex max-w-full min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:ring-primary-500 focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:pointer-events-none disabled:opacity-40',\n ]\n : [\n 'inline-flex h-8 max-w-full items-center gap-1.5 rounded-full border px-2.5 text-sm font-medium',\n 'border-border bg-background text-foreground shadow-sm',\n 'hover:bg-muted/50',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n className\n )}\n >\n <span className=\"min-w-0 truncate\">\n {selectedOption?.label ?? selectedOption?.model ?? placeholder}\n </span>\n {selectedEffortOption && (\n <span\n data-slot=\"composer-model-selector-trigger-effort\"\n className=\"text-muted-foreground min-w-0 truncate font-normal\"\n >\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronUp\n aria-hidden=\"true\"\n className={cn(\n 'shrink-0',\n variant === 'ghost' ? 'h-3 w-3' : 'h-3.5 w-3.5'\n )}\n />\n </button>\n\n {open &&\n createPortal(\n <div\n ref={menuRef}\n style={menuStyle}\n data-slot=\"composer-model-selector-menu\"\n className={cn(\n 'border-border bg-card text-card-foreground flex w-80 max-w-full flex-col rounded-lg border shadow-lg',\n 'animate-in fade-in overflow-hidden duration-100'\n )}\n >\n {view === 'models' && (\n <>\n <div\n data-slot=\"composer-model-selector-provider-filter\"\n className=\"border-border flex min-h-9 items-center gap-1 overflow-x-auto overflow-y-hidden border-b p-2\"\n >\n {[null, ...providers].map((provider) => {\n const selected = activeProviderFilter === provider;\n return (\n <button\n key={provider ?? 'all-providers'}\n type=\"button\"\n aria-pressed={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setProvider(provider)}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center justify-center rounded-full px-2.5 text-xs font-medium whitespace-nowrap transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n selected\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n >\n {provider === null\n ? anyLabel\n : (providerLabels.get(provider) ?? provider)}\n </button>\n );\n })}\n </div>\n\n <div\n ref={listRef}\n id={menuId}\n role=\"listbox\"\n aria-label={ariaLabel}\n aria-activedescendant={activeOptionId}\n tabIndex={-1}\n onKeyDown={handleMenuKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {groupedModels.length === 0 ? (\n <div className=\"text-muted-foreground px-3 py-4 text-center text-sm\">\n {emptyLabel}\n </div>\n ) : (\n groupedRenderedModels.map((group) => (\n <div\n key={group.provider}\n role=\"group\"\n aria-label={\n providerLabels.get(group.provider) ?? group.provider\n }\n >\n <div className=\"text-muted-foreground px-3 py-1.5 text-xs font-semibold uppercase\">\n {providerLabels.get(group.provider) ?? group.provider}\n </div>\n {group.options.map((renderedModel) => {\n const { index, key, option: model } = renderedModel;\n\n const selected = optionKey(model) === selectedKey;\n const highlighted = index === highlightedIndex;\n\n return (\n <button\n key={key}\n id={getOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectModel(model)}\n onMouseEnter={() => setHighlightedIndex(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {model.label ?? model.model}\n </span>\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {efforts.length > 0 && (\n <div className=\"border-border border-t p-1\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-row\"\n aria-haspopup=\"listbox\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('effort')}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'hover:bg-muted transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {effortLabel}\n </span>\n {selectedEffortOption && (\n <span className=\"text-muted-foreground min-w-0 truncate\">\n {selectedEffortOption.label}\n </span>\n )}\n <ChevronRight\n aria-hidden=\"true\"\n className=\"text-muted-foreground h-4 w-4 shrink-0 rtl:-scale-x-100\"\n />\n </button>\n </div>\n )}\n </>\n )}\n\n {view === 'effort' && (\n <>\n <div className=\"border-border flex items-center gap-1 border-b p-2\">\n <button\n type=\"button\"\n data-slot=\"composer-model-selector-effort-back\"\n aria-label={backLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setView('models')}\n className={cn(\n 'inline-flex h-6 shrink-0 items-center gap-1 rounded-full px-2 text-xs font-medium',\n 'text-muted-foreground hover:bg-muted hover:text-foreground transition-colors',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none'\n )}\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"h-3.5 w-3.5 rtl:-scale-x-100\"\n />\n {effortLabel}\n </button>\n </div>\n\n {effortHint && (\n <p className=\"text-muted-foreground px-3 pt-2 text-xs\">\n {effortHint}\n </p>\n )}\n\n <div\n ref={effortListRef}\n id={menuId}\n role=\"listbox\"\n aria-label={effortLabel}\n aria-activedescendant={activeEffortOptionId}\n tabIndex={-1}\n onKeyDown={handleEffortKeyDown}\n className=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n {efforts.map((option, index) => {\n const selected = option.value === effort;\n const highlighted = index === effortHighlight;\n\n return (\n <button\n key={option.value}\n id={getEffortOptionId(index)}\n type=\"button\"\n role=\"option\"\n aria-selected={selected}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => selectEffort(option.value)}\n onMouseEnter={() => setEffortHighlight(index)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-md px-3 py-2 text-start text-sm',\n 'focus-visible:ring-ring transition-colors focus-visible:ring-2 focus-visible:outline-none',\n highlighted && 'bg-muted',\n selected && 'bg-primary/10 text-primary'\n )}\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{option.label}</span>\n {option.description && (\n <span className=\"text-muted-foreground block truncate text-xs\">\n {option.description}\n </span>\n )}\n </span>\n {option.value === defaultEffort && (\n <span className=\"bg-muted text-muted-foreground shrink-0 rounded px-1.5 py-0.5 text-xs\">\n {defaultBadgeLabel}\n </span>\n )}\n {selected && (\n <Check\n aria-hidden=\"true\"\n className=\"text-primary h-4 w-4 shrink-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>,\n document.body\n )}\n </>\n );\n}\n\nComposerModelSelector.displayName = 'ComposerModelSelector';\n","import * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Dropdown, DropdownItem, DropdownSeparator } from '../Dropdown';\nimport {\n ComposerModelSelector,\n type ComposerModelSelectorProps,\n} from '../AI/ComposerModelSelector';\nimport {\n AttachmentPreviewItem,\n DragDropZone,\n getFileType,\n validateFile,\n generateAttachmentId,\n} from '../Messaging/AttachmentPicker';\nimport {\n MentionMenu,\n useMentionAutocomplete,\n type MentionOption,\n} from '../Messaging/useMentionAutocomplete';\nimport type { AttachmentType, NewMessage } from '../Messaging/types';\nimport {\n AlertTriangleIcon,\n ArrowUpIcon,\n BotIcon,\n CheckIcon,\n ChevronUpIcon,\n LoaderIcon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n StopIcon,\n} from '../Icons';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** A file staged for sending, with preview metadata. */\ninterface StagedAttachment {\n id: string;\n file: File;\n previewUrl?: string;\n type: AttachmentType;\n}\n\n/** An entry in the composer's `+` menu. */\nexport interface ChatComposerMenuItem {\n /** Stable id (used as the React key). */\n id: string;\n /** Display label. */\n label: React.ReactNode;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Whether the item is disabled. */\n disabled?: boolean;\n /**\n * Toggle state. When set (true or false) the item renders as a\n * `menuitemcheckbox` with `aria-checked` and a leading checkbox.\n */\n checked?: boolean;\n /** Danger styling for destructive actions. */\n variant?: 'default' | 'danger';\n /** Called when the item is selected. */\n onSelect?: () => void;\n}\n\n/** An agent shown in the composer's agent selector. */\nexport interface ChatComposerAgentOption {\n /** Stable id (returned via `onAgentChange`). */\n id: string;\n /** Display label. */\n label: string;\n /** Optional leading icon (defaults to a bot glyph in the trigger). */\n icon?: React.ReactNode;\n /** Optional secondary text shown in the menu. */\n description?: string;\n}\n\n/** Imperative handle exposed via `ref` for host-level integrations. */\nexport interface ChatComposerHandle {\n /** Stage files programmatically (e.g. from a page-level drop zone). */\n addFiles: (files: File[]) => void;\n /** Focus the text input. */\n focus: () => void;\n /**\n * The underlying textarea element, for host integrations that need caret\n * access (e.g. mention insertion via `setSelectionRange`).\n */\n getTextarea: () => HTMLTextAreaElement | null;\n}\n\n/** Structured context passed to `onError` so hosts can localize by reason. */\nexport interface ChatComposerError {\n reason: 'file-type' | 'file-size' | 'attachment-limit' | 'send-failed';\n /** The rejected file, when the error concerns a single file. */\n file?: File;\n}\n\nexport interface ChatComposerProps {\n /** Called when the user sends a message. */\n onSend?: (message: NewMessage) => void | Promise<void>;\n /** Controlled input value. Leave undefined for uncontrolled usage. */\n value?: string;\n /** Called when the input value changes. */\n onValueChange?: (value: string) => void;\n /** Placeholder text for the input. */\n placeholder?: string;\n /**\n * Disables all built-in interaction. Custom content (`micSlot`,\n * `addMenuItems` icons) is rendered as-is — hosts must disable their own\n * controls when they disable the composer.\n */\n disabled?: boolean;\n /** Shows the send button in a busy state and prevents duplicate sends. */\n isSending?: boolean;\n /** Autofocus the input on mount. */\n autoFocus?: boolean;\n /** Maximum message length. Sends are blocked while over the limit. */\n maxLength?: number;\n /** Show a character counter (requires `maxLength`). */\n showCharacterCount?: boolean;\n /**\n * Allow sending while the composer itself is empty (e.g. when the host\n * stages attachments outside the composer). The host receives a message\n * with empty `content` and no attachments and owns any further guarding.\n * @default false\n */\n canSendWhenEmpty?: boolean;\n /**\n * Maximum height of the auto-growing input: a pixel number or any CSS\n * length (e.g. `'40vh'`).\n * @default 160\n */\n maxHeight?: number | string;\n /**\n * Extra props spread onto the underlying textarea. Event handlers run\n * before the composer's built-in handlers; call `event.preventDefault()`\n * in `onKeyDown` / `onPaste` to claim that event (e.g. for a mention\n * menu's arrow/Enter navigation). `className` and `style` are merged\n * with the composer's own.\n */\n textareaProps?: Omit<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n 'value' | 'defaultValue'\n >;\n\n /** Extra entries for the `+` menu, rendered after the built-in items. */\n addMenuItems?: ChatComposerMenuItem[];\n /** Enable file attachments (built-in \"Attach files\" menu item, paste-to-attach, drag-and-drop, chips). @default true */\n allowAttachments?: boolean;\n /** Accepted file types for the picker/paste validation (native `accept` tokens). */\n acceptedFileTypes?: string[];\n /** Maximum file size in bytes. */\n maxFileSize?: number;\n /** Maximum number of staged attachments. @default 10 */\n maxAttachments?: number;\n\n /**\n * Candidates for `@mention` autocomplete. When provided (non-empty), typing\n * `@` opens a suggestion listbox (same behavior as `MessageComposer`).\n * Omit to disable mentions entirely (default).\n */\n mentionOptions?: MentionOption[];\n\n /** Show the built-in mic button. @default false */\n showMic?: boolean;\n /** Called when the built-in mic button is clicked. */\n onMicClick?: () => void;\n /**\n * Custom node rendered in place of the built-in mic button (e.g.\n * `RecordButton`). The slot is wrapped in a 32px-tall (`h-8`) flex row so it\n * aligns with the other composer controls; taller content overflows and\n * stays vertically centered without inflating the row. Interaction state is\n * not managed: pass your own disabled state when the composer is `disabled`.\n */\n micSlot?: React.ReactNode;\n /** When to show the mic: always, or only while the composer is empty. @default 'always' */\n micBehavior?: 'always' | 'whenEmpty';\n\n /** While true, the send button becomes a stop button (requires `onStop`). */\n isStreaming?: boolean;\n /** Called when the stop button is clicked during streaming. */\n onStop?: () => void;\n\n /** Show the agent selector in the bottom row. @default false */\n showAgentSelector?: boolean;\n /** Agents available in the agent selector. */\n agents?: ChatComposerAgentOption[];\n /** Selected agent id (controlled). */\n selectedAgent?: string | null;\n /** Called when an agent is selected. */\n onAgentChange?: (agentId: string) => void;\n\n /** Show the model selector in the bottom row. @default false */\n showModelSelector?: boolean;\n /** Props passed through to the embedded `ComposerModelSelector`. */\n modelSelectorProps?: ComposerModelSelectorProps;\n\n /** Replaces the composer with a read-only notice. */\n readOnly?: boolean;\n /** Notice text shown when `readOnly` is set. */\n readOnlyMessage?: string;\n\n /**\n * Called when a file is rejected or a send fails. `message` is a default\n * English string; `context.reason` lets hosts substitute localized copy.\n */\n onError?: (message: string, context?: ChatComposerError) => void;\n\n /** Message reported when the attachment limit is hit. Overrides the English default. */\n attachmentLimitLabel?: string;\n /** Message reported when an async `onSend` rejects. @default 'Failed to send message' */\n sendFailedLabel?: string;\n /** Accessible label for the send button while `isSending`. @default 'Sending message…' */\n sendingLabel?: string;\n\n /** Accessible label for the text input. @default 'Message input' */\n inputLabel?: string;\n /** Accessible label for the `+` menu trigger. @default 'Add to message' */\n addMenuLabel?: string;\n /** Label for the built-in attach menu item. @default 'Attach files' */\n attachFilesLabel?: string;\n /** Accessible label for the built-in mic button. @default 'Start voice input' */\n micLabel?: string;\n /** Accessible label for the send button. @default 'Send message' */\n sendLabel?: string;\n /** Accessible label for the stop button. @default 'Stop generating' */\n stopLabel?: string;\n /** Accessible label / empty-state text for the agent selector. @default 'Select agent' */\n agentSelectorLabel?: string;\n /** Accessible label for the `@mention` suggestion listbox. @default 'Mention' */\n mentionListLabel?: string;\n /** Overlay text shown while dragging files over the composer. @default 'Drop files here' */\n dropFilesLabel?: string;\n\n className?: string;\n}\n\n// ============================================================================\n// Styles\n// ============================================================================\n\nconst iconButtonClasses = cn(\n 'flex h-8 w-8 shrink-0 items-center justify-center rounded-lg',\n 'text-neutral-500 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst selectorTriggerClasses = cn(\n 'flex min-w-0 items-center gap-1 rounded-md px-2 py-1 text-xs',\n 'text-neutral-600 dark:text-neutral-400',\n 'transition-colors duration-150',\n 'hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-700 dark:hover:text-white',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-500',\n 'disabled:pointer-events-none disabled:opacity-40'\n);\n\nconst MAX_INPUT_HEIGHT = 160;\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * Standardized chat input. At `md+` it renders as a single-row pill — `+`\n * menu, text input and actions (mic, send/stop) side by side; below `md` the\n * input stacks above the icon row. The optional agent/model selector row\n * hangs below the card on the page background.\n */\nexport const ChatComposer = React.forwardRef<\n ChatComposerHandle,\n ChatComposerProps\n>(function ChatComposer(\n {\n onSend,\n value: controlledValue,\n onValueChange,\n placeholder = 'Type a message…',\n disabled = false,\n isSending = false,\n autoFocus = false,\n maxLength,\n showCharacterCount = false,\n canSendWhenEmpty = false,\n maxHeight = MAX_INPUT_HEIGHT,\n textareaProps,\n addMenuItems,\n allowAttachments = true,\n acceptedFileTypes,\n maxFileSize,\n maxAttachments = 10,\n mentionOptions,\n showMic = false,\n onMicClick,\n micSlot,\n micBehavior = 'always',\n isStreaming = false,\n onStop,\n showAgentSelector = false,\n agents = [],\n selectedAgent = null,\n onAgentChange,\n showModelSelector = false,\n modelSelectorProps,\n readOnly = false,\n readOnlyMessage = 'You have read-only access and cannot send messages.',\n onError,\n attachmentLimitLabel,\n sendFailedLabel = 'Failed to send message',\n sendingLabel = 'Sending message…',\n inputLabel = 'Message input',\n addMenuLabel = 'Add to message',\n attachFilesLabel = 'Attach files',\n micLabel = 'Start voice input',\n sendLabel = 'Send message',\n stopLabel = 'Stop generating',\n agentSelectorLabel = 'Select agent',\n mentionListLabel = 'Mention',\n dropFilesLabel = 'Drop files here',\n className,\n },\n ref\n) {\n const [internalValue, setInternalValue] = React.useState('');\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const [attachments, setAttachments] = React.useState<StagedAttachment[]>([]);\n const attachmentsRef = React.useRef(attachments);\n attachmentsRef.current = attachments;\n\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const [addMenuOpen, setAddMenuOpen] = React.useState(false);\n const [agentMenuOpen, setAgentMenuOpen] = React.useState(false);\n\n const hasText = value.trim().length > 0;\n const hasContent = hasText || attachments.length > 0;\n const isOverLimit = maxLength !== undefined && value.length > maxLength;\n // Without an onSend handler, sending would silently discard the draft.\n const canSend =\n (hasContent || canSendWhenEmpty) &&\n onSend !== undefined &&\n !disabled &&\n !isSending &&\n !isStreaming &&\n !isOverLimit;\n\n // --------------------------------------------------------------------\n // Input handling\n // --------------------------------------------------------------------\n\n const setValue = React.useCallback(\n (next: string) => {\n if (!isControlled) setInternalValue(next);\n onValueChange?.(next);\n },\n [isControlled, onValueChange]\n );\n\n // @mention autocomplete (opt-in via `mentionOptions`) — shared with\n // MessageComposer so both composers behave identically.\n const mention = useMentionAutocomplete({\n options: mentionOptions,\n value,\n setValue,\n textareaRef,\n });\n\n // Auto-grow the textarea. The cap is enforced with CSS max-height so it\n // can be any CSS length (e.g. '40vh'), not just a pixel number.\n const resizeTextarea = React.useCallback(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n textarea.style.height = 'auto';\n // While the textarea is not laid out (hidden container, e.g. a\n // just-mounted Storybook story or a closed panel) scrollHeight is 0 —\n // keep height auto and let the ResizeObserver below re-measure once\n // the element becomes visible.\n if (textarea.scrollHeight === 0) return;\n textarea.style.height = `${textarea.scrollHeight}px`;\n }, []);\n\n React.useLayoutEffect(resizeTextarea, [resizeTextarea, value]);\n\n // Re-measure when the textarea's box changes for reasons other than\n // typing: the container becoming visible, width changes, font loading,\n // or crossing the md breakpoint (different paddings).\n React.useEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea || typeof ResizeObserver === 'undefined') return;\n // Defer the re-measure to the next frame: mutating the observed\n // element's height synchronously inside the observer callback triggers\n // the browser's \"ResizeObserver loop completed with undelivered\n // notifications\" error, which dev overlays surface as a runtime error.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(resizeTextarea);\n });\n observer.observe(textarea);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [resizeTextarea]);\n\n // --------------------------------------------------------------------\n // Attachments\n // --------------------------------------------------------------------\n\n const addFiles = React.useCallback(\n (files: File[]) => {\n if (!allowAttachments || files.length === 0) return;\n // Staging happens outside the state updater so object-URL creation,\n // id generation and onError stay out of a function React may re-invoke.\n const limitMessage =\n attachmentLimitLabel ??\n `Attachment limit reached (max ${maxAttachments})`;\n const room = maxAttachments - attachmentsRef.current.length;\n if (files.length > room) {\n onError?.(limitMessage, { reason: 'attachment-limit' });\n if (room <= 0) return;\n }\n const staged: StagedAttachment[] = [];\n for (const file of files.slice(0, Math.max(room, 0))) {\n const typeCheck = validateFile(file, acceptedFileTypes, undefined);\n if (!typeCheck.valid) {\n onError?.(`${file.name}: ${typeCheck.error}`, {\n reason: 'file-type',\n file,\n });\n continue;\n }\n const sizeCheck = validateFile(file, undefined, maxFileSize);\n if (!sizeCheck.valid) {\n onError?.(`${file.name}: ${sizeCheck.error}`, {\n reason: 'file-size',\n file,\n });\n continue;\n }\n const type = getFileType(file.type);\n staged.push({\n id: generateAttachmentId(),\n file,\n type,\n previewUrl:\n type === 'image' || type === 'video'\n ? URL.createObjectURL(file)\n : undefined,\n });\n }\n if (staged.length > 0) {\n // Reserve slots synchronously: a second addFiles call in the same\n // React batch reads attachmentsRef before re-render, so without this\n // both calls could see the same free room and overshoot the cap.\n attachmentsRef.current = [...attachmentsRef.current, ...staged];\n setAttachments((current) => [...current, ...staged]);\n }\n },\n [\n allowAttachments,\n maxAttachments,\n acceptedFileTypes,\n maxFileSize,\n onError,\n attachmentLimitLabel,\n ]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n // Same discipline as addFiles: revoke and update the ref synchronously,\n // keep the state updater pure (StrictMode may re-invoke it).\n const target = attachmentsRef.current.find(\n (attachment) => attachment.id === id\n );\n if (target?.previewUrl) URL.revokeObjectURL(target.previewUrl);\n attachmentsRef.current = attachmentsRef.current.filter(\n (attachment) => attachment.id !== id\n );\n setAttachments((current) =>\n current.filter((attachment) => attachment.id !== id)\n );\n }, []);\n\n // Revoke any outstanding preview URLs on unmount.\n React.useEffect(() => {\n return () => {\n for (const attachment of attachmentsRef.current) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n };\n }, []);\n\n const handleFileInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = Array.from(event.target.files ?? []);\n addFiles(files);\n event.target.value = '';\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLTextAreaElement>) => {\n if (!allowAttachments) return;\n const files = Array.from(event.clipboardData.files);\n if (files.length > 0) {\n event.preventDefault();\n addFiles(files);\n }\n };\n\n React.useImperativeHandle(\n ref,\n () => ({\n addFiles,\n focus: () => textareaRef.current?.focus(),\n getTextarea: () => textareaRef.current,\n }),\n [addFiles]\n );\n\n // --------------------------------------------------------------------\n // Sending\n // --------------------------------------------------------------------\n\n const handleSend = () => {\n if (!canSend || !onSend) return;\n const message: NewMessage = {\n content: value.trim(),\n attachments: attachments.map((attachment) => attachment.file),\n };\n for (const attachment of attachments) {\n if (attachment.previewUrl) URL.revokeObjectURL(attachment.previewUrl);\n }\n // Clear the ref alongside the state: the unmount cleanup reads the ref,\n // so if onSend unmounts the composer synchronously it must not see (and\n // re-revoke) the already-revoked preview URLs.\n attachmentsRef.current = [];\n setAttachments([]);\n setValue('');\n // The draft is cleared optimistically; hosts own retry/restore. Both a\n // synchronous throw and a rejected promise surface through onError\n // instead of being swallowed.\n try {\n Promise.resolve(onSend(message)).catch(() => {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n });\n } catch {\n onError?.(sendFailedLabel, { reason: 'send-failed' });\n }\n textareaRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // @mention menu navigation takes priority over send.\n if (mention.handleKeyDown(event)) return;\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n handleSend();\n }\n };\n\n // --------------------------------------------------------------------\n // Render\n // --------------------------------------------------------------------\n\n if (readOnly) {\n return (\n <div\n data-slot=\"chat-composer\"\n // A live status region (implicit aria-live=\"polite\"): readOnly can\n // flip at runtime (e.g. after permissions resolve), and screen-reader\n // users must be told the input became read-only.\n role=\"status\"\n className={cn(\n 'flex items-center gap-2 rounded-xl border px-4 py-3 text-sm',\n 'border-amber-300 bg-amber-50 text-amber-900',\n 'dark:border-amber-700 dark:bg-amber-950 dark:text-amber-200',\n className\n )}\n >\n <AlertTriangleIcon className=\"h-4 w-4 shrink-0\" aria-hidden=\"true\" />\n <span data-slot=\"chat-composer-readonly\">{readOnlyMessage}</span>\n </div>\n );\n }\n\n const showAddMenu =\n allowAttachments || (addMenuItems && addMenuItems.length > 0);\n const micVisible =\n (showMic || onMicClick !== undefined || micSlot !== undefined) &&\n (micBehavior === 'always' || !hasContent);\n const showSelectorRow = showAgentSelector || showModelSelector;\n const selectedAgentOption =\n agents.find((agent) => agent.id === selectedAgent) ?? null;\n\n // One responsive grid: below `md` the input sits on row 1 spanning all\n // columns with the `+`/actions on row 2; at `md+` the `+`, input and\n // actions sit side by side on row 1 as a single pill (actions pin to the\n // bottom via self-end as the input grows).\n const cells = {\n input:\n 'col-span-3 col-start-1 row-start-1 px-1 pt-1 md:col-span-1 md:col-start-2 md:self-end md:px-0 md:py-1.5',\n textarea: 'px-2 pt-2 pb-1 md:py-1.5',\n add: 'col-start-1 row-start-2 pb-2 ps-2 md:row-start-1 md:self-end md:p-1.5 md:pe-0.5',\n actions:\n 'col-start-3 row-start-2 flex items-center gap-1 pb-2 pe-2 md:row-start-1 md:self-end md:gap-0.5 md:p-1.5 md:ps-0.5',\n };\n\n const composerCard = (\n <>\n {attachments.length > 0 && (\n <div\n data-slot=\"chat-composer-attachments\"\n className=\"flex flex-wrap gap-2 px-3 pt-3\"\n >\n {attachments.map((attachment) => (\n <AttachmentPreviewItem\n key={attachment.id}\n attachment={{ ...attachment, state: 'pending' }}\n onRemove={() => removeAttachment(attachment.id)}\n disabled={disabled}\n />\n ))}\n </div>\n )}\n\n <div className=\"grid grid-cols-[auto_minmax(0,1fr)_auto]\">\n {/* Inset cell: the textarea sits inside the card with a matching\n inner radius so focus outlines / a11y highlights render as a\n clean nested rounded rect instead of stacking on the card's\n border. The padding split (cell + textarea) keeps the text in\n place using only standard utilities. */}\n <div className={cells.input} ref={mention.anchorRef}>\n <MentionMenu\n mention={mention}\n label={mentionListLabel}\n dataSlot=\"chat-composer-mention-list\"\n />\n <textarea\n {...textareaProps}\n ref={textareaRef}\n data-slot=\"chat-composer-input\"\n value={value}\n onChange={(event) => {\n textareaProps?.onChange?.(event);\n setValue(event.target.value);\n mention.sync(\n event.target.value,\n event.target.selectionStart ?? event.target.value.length\n );\n }}\n // Host handlers run first; preventDefault() opts out of the\n // built-in behavior (mention menu, Enter-to-send,\n // paste-to-attach).\n onKeyDown={(event) => {\n textareaProps?.onKeyDown?.(event);\n if (event.defaultPrevented) return;\n handleKeyDown(event);\n }}\n onClick={(event) => {\n textareaProps?.onClick?.(event);\n if (event.defaultPrevented) return;\n const el = event.currentTarget;\n mention.sync(el.value, el.selectionStart ?? el.value.length);\n }}\n onPaste={(event) => {\n textareaProps?.onPaste?.(event);\n if (event.defaultPrevented) return;\n handlePaste(event);\n }}\n placeholder={placeholder}\n disabled={disabled}\n // Host-opt-in only; off by default.\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n rows={1}\n aria-label={inputLabel}\n {...mention.inputProps}\n style={{\n ...textareaProps?.style,\n maxHeight:\n typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight,\n }}\n className={cn(\n 'block w-full resize-none bg-transparent',\n 'rounded-lg text-sm',\n cells.textarea,\n 'text-neutral-900 placeholder:text-neutral-400 dark:text-white dark:placeholder:text-neutral-500',\n // Ring the input itself on focus rather than the whole shell.\n 'focus:ring-primary-500 focus:ring-1 focus:outline-none',\n 'disabled:cursor-not-allowed',\n textareaProps?.className\n )}\n />\n </div>\n\n {showAddMenu && (\n <div className={cells.add}>\n <Dropdown\n placement=\"top-start\"\n open={addMenuOpen}\n onOpenChange={setAddMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-add-button\"\n aria-label={addMenuLabel}\n disabled={disabled}\n className={iconButtonClasses}\n >\n <PlusIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n }\n >\n {allowAttachments && (\n <DropdownItem\n icon={\n <PaperclipIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n }\n onClick={() => {\n setAddMenuOpen(false);\n fileInputRef.current?.click();\n }}\n >\n {attachFilesLabel}\n </DropdownItem>\n )}\n {allowAttachments && addMenuItems && addMenuItems.length > 0 && (\n <DropdownSeparator />\n )}\n {addMenuItems?.map((item) => (\n <DropdownItem\n key={item.id}\n icon={item.icon}\n disabled={item.disabled}\n variant={item.variant}\n checked={item.checked}\n onClick={() => {\n setAddMenuOpen(false);\n item.onSelect?.();\n }}\n >\n <span className=\"min-w-0 truncate\">{item.label}</span>\n </DropdownItem>\n ))}\n </Dropdown>\n </div>\n )}\n\n {allowAttachments && (\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes?.join(',')}\n onChange={handleFileInputChange}\n className=\"hidden\"\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )}\n\n <div className={cells.actions}>\n {showCharacterCount && maxLength !== undefined && (\n <span\n data-slot=\"chat-composer-char-count\"\n aria-live=\"polite\"\n className={cn(\n 'pe-1 text-xs tabular-nums',\n isOverLimit\n ? 'font-medium text-red-700 dark:text-red-400'\n : 'text-neutral-500 dark:text-neutral-400'\n )}\n >\n {value.length}/{maxLength}\n </span>\n )}\n\n {micVisible &&\n (micSlot != null ? (\n // Normalize slot content (e.g. a RecordButton) to the 32px\n // control row: taller content overflow-centers instead of\n // inflating the pill and pushing the other cells apart. A div\n // so block-level slot content stays valid HTML.\n <div\n data-slot=\"chat-composer-mic-slot\"\n className=\"flex h-8 shrink-0 items-center\"\n >\n {micSlot}\n </div>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-mic-button\"\n aria-label={micLabel}\n disabled={disabled}\n onClick={onMicClick}\n className={iconButtonClasses}\n >\n <MicIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n ))}\n\n {isStreaming && onStop ? (\n <button\n type=\"button\"\n data-slot=\"chat-composer-stop-button\"\n aria-label={stopLabel}\n disabled={disabled}\n onClick={onStop}\n className={cn(\n iconButtonClasses,\n 'text-neutral-700 dark:text-neutral-200'\n )}\n >\n <StopIcon\n className=\"h-3.5 w-3.5 fill-current\"\n aria-hidden=\"true\"\n />\n </button>\n ) : (\n <button\n type=\"button\"\n data-slot=\"chat-composer-send-button\"\n aria-label={isSending ? sendingLabel : sendLabel}\n aria-busy={isSending || undefined}\n disabled={!canSend}\n onClick={handleSend}\n className={cn(\n iconButtonClasses,\n canSend &&\n 'bg-primary-800 hover:bg-primary-700 dark:bg-primary-600 dark:hover:bg-primary-500 text-white hover:text-white dark:hover:text-white'\n )}\n >\n {isSending ? (\n <LoaderIcon\n className=\"h-4 w-4 animate-spin\"\n aria-hidden=\"true\"\n />\n ) : (\n <ArrowUpIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n )}\n </div>\n </div>\n </>\n );\n\n const selectorsRow = showSelectorRow && (\n <div\n data-slot=\"chat-composer-selectors\"\n className=\"flex items-center justify-between gap-2 px-2 pt-1\"\n >\n {showAgentSelector ? (\n <Dropdown\n placement=\"top-start\"\n open={agentMenuOpen}\n onOpenChange={setAgentMenuOpen}\n trigger={\n <button\n type=\"button\"\n data-slot=\"chat-composer-agent-trigger\"\n aria-label={\n selectedAgentOption\n ? `${agentSelectorLabel}: ${selectedAgentOption.label}`\n : agentSelectorLabel\n }\n disabled={disabled}\n className={selectorTriggerClasses}\n >\n {selectedAgentOption?.icon ?? (\n <BotIcon className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n )}\n <span className=\"min-w-0 truncate\">\n {selectedAgentOption?.label ?? agentSelectorLabel}\n </span>\n <ChevronUpIcon className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n </button>\n }\n >\n {agents.map((agent) => (\n <DropdownItem\n key={agent.id}\n icon={agent.icon}\n role=\"menuitemradio\"\n aria-checked={agent.id === selectedAgent}\n onClick={() => {\n setAgentMenuOpen(false);\n onAgentChange?.(agent.id);\n }}\n >\n <span className=\"flex w-full items-center justify-between gap-2\">\n <span className=\"min-w-0\">\n <span className=\"block truncate\">{agent.label}</span>\n {agent.description && (\n <span className=\"block truncate text-xs text-neutral-500 dark:text-neutral-400\">\n {agent.description}\n </span>\n )}\n </span>\n {agent.id === selectedAgent && (\n <CheckIcon\n className=\"text-primary-600 dark:text-primary-400 h-4 w-4 shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n </span>\n </DropdownItem>\n ))}\n </Dropdown>\n ) : (\n <span aria-hidden=\"true\" />\n )}\n\n {showModelSelector && modelSelectorProps && (\n <ComposerModelSelector\n variant=\"ghost\"\n {...modelSelectorProps}\n disabled={disabled || modelSelectorProps.disabled}\n />\n )}\n </div>\n );\n\n // The bordered card holds only the input row(s); the selector row hangs\n // below it on the page background. When attachments are enabled the card\n // doubles as a drop target; all dropped files run through `addFiles` so\n // validation and structured `onError` reporting stay in one place (the\n // zone itself does not validate).\n const card = (\n <div\n data-slot=\"chat-composer-card\"\n className={cn(\n 'rounded-2xl border border-neutral-200 bg-white shadow-sm',\n 'dark:border-[#2e2e30] dark:bg-[#1c1c1e]'\n )}\n >\n {composerCard}\n </div>\n );\n\n return (\n <div\n data-slot=\"chat-composer\"\n className={cn(\n 'flex w-full flex-col',\n disabled && 'opacity-60',\n className\n )}\n >\n {allowAttachments ? (\n <DragDropZone\n onFilesDropped={addFiles}\n maxFiles={Number.MAX_SAFE_INTEGER}\n disabled={disabled}\n overlayLabel={dropFilesLabel}\n >\n {card}\n </DragDropZone>\n ) : (\n card\n )}\n {selectorsRow}\n </div>\n );\n});\n\nChatComposer.displayName = 'ChatComposer';\n"]}