@mieweb/ui 0.11.0-dev.49 → 0.11.0-dev.50
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.
- package/dist/{chunk-HIYQ3M5V.cjs → chunk-2Y2O2PRZ.cjs} +3 -3
- package/dist/chunk-2Y2O2PRZ.cjs.map +1 -0
- package/dist/{chunk-O2EAHOXM.cjs → chunk-G56OUIGH.cjs} +482 -29
- package/dist/chunk-G56OUIGH.cjs.map +1 -0
- package/dist/chunk-GEXYN6AS.cjs +56 -0
- package/dist/chunk-GEXYN6AS.cjs.map +1 -0
- package/dist/{chunk-OGNADPM4.cjs → chunk-GQONYSGI.cjs} +10 -2
- package/dist/chunk-GQONYSGI.cjs.map +1 -0
- package/dist/{chunk-IZY4CMOO.js → chunk-H7L45BLY.js} +13 -24
- package/dist/chunk-H7L45BLY.js.map +1 -0
- package/dist/{chunk-MZA2LDS4.js → chunk-I65QJMFB.js} +4 -4
- package/dist/{chunk-MZA2LDS4.js.map → chunk-I65QJMFB.js.map} +1 -1
- package/dist/{chunk-NB2C6FSI.js → chunk-L3JA7EDU.js} +20 -3
- package/dist/{chunk-NB2C6FSI.js.map → chunk-L3JA7EDU.js.map} +1 -1
- package/dist/{chunk-UIFN2LYT.js → chunk-O3MN3TYS.js} +483 -32
- package/dist/chunk-O3MN3TYS.js.map +1 -0
- package/dist/{chunk-74ENCTIK.js → chunk-R25E7SYN.js} +9 -3
- package/dist/chunk-R25E7SYN.js.map +1 -0
- package/dist/{chunk-TRZLN32I.cjs → chunk-RDERYV5M.cjs} +14 -25
- package/dist/chunk-RDERYV5M.cjs.map +1 -0
- package/dist/{chunk-BFVYM6IT.cjs → chunk-TLXQ2E57.cjs} +6 -6
- package/dist/{chunk-BFVYM6IT.cjs.map → chunk-TLXQ2E57.cjs.map} +1 -1
- package/dist/{chunk-MQOYDQTF.js → chunk-URHUNFFC.js} +3 -3
- package/dist/chunk-URHUNFFC.js.map +1 -0
- package/dist/chunk-WSLKELR2.js +51 -0
- package/dist/chunk-WSLKELR2.js.map +1 -0
- package/dist/{chunk-5UKGOBCZ.cjs → chunk-XWGPEIVB.cjs} +20 -3
- package/dist/{chunk-5UKGOBCZ.cjs.map → chunk-XWGPEIVB.cjs.map} +1 -1
- package/dist/components/DictationButton/index.cjs +5 -5
- package/dist/components/DictationButton/index.js +2 -2
- package/dist/components/RecordButton/index.cjs +4 -4
- package/dist/components/RecordButton/index.d.cts +2 -2
- package/dist/components/RecordButton/index.d.ts +2 -2
- package/dist/components/RecordButton/index.js +1 -1
- package/dist/components/SuperChat/index.cjs +9 -7
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.d.cts +2 -2
- package/dist/components/SuperChat/index.d.ts +2 -2
- package/dist/components/SuperChat/index.js +3 -1
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.d.cts +2 -2
- package/dist/components/SuperChat/plugins/index.d.ts +2 -2
- package/dist/{hey-buddy-AHUHCDBC.js → hey-buddy-6HXWNHK2.js} +12 -7
- package/dist/hey-buddy-6HXWNHK2.js.map +1 -0
- package/dist/{hey-buddy-5WOBYZRJ.cjs → hey-buddy-BAS5O4AY.cjs} +12 -7
- package/dist/hey-buddy-BAS5O4AY.cjs.map +1 -0
- package/dist/index.cjs +2037 -1255
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +207 -14
- package/dist/index.d.ts +207 -14
- package/dist/index.js +1851 -1082
- package/dist/index.js.map +1 -1
- package/dist/{speaker-verify-4NEJAK6C.cjs → speaker-verify-PWTYV4JZ.cjs} +10 -10
- package/dist/{speaker-verify-4NEJAK6C.cjs.map → speaker-verify-PWTYV4JZ.cjs.map} +1 -1
- package/dist/{speaker-verify-AWSKI6DI.js → speaker-verify-REFWMPTD.js} +3 -3
- package/dist/{speaker-verify-AWSKI6DI.js.map → speaker-verify-REFWMPTD.js.map} +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/{types-BfVolads.d.ts → types-ByK_dbT7.d.cts} +13 -2
- package/dist/{types-BfVolads.d.cts → types-ByK_dbT7.d.ts} +13 -2
- package/dist/whisperTranscribe-QV2EQRCD.js +5 -0
- package/dist/{whisperTranscribe-UBNUWXUQ.js.map → whisperTranscribe-QV2EQRCD.js.map} +1 -1
- package/dist/{whisperTranscribe-AV752TZI.cjs → whisperTranscribe-XL365FM4.cjs} +26 -21
- package/dist/{whisperTranscribe-AV752TZI.cjs.map → whisperTranscribe-XL365FM4.cjs.map} +1 -1
- package/package.json +2 -2
- package/dist/chunk-74ENCTIK.js.map +0 -1
- package/dist/chunk-HIYQ3M5V.cjs.map +0 -1
- package/dist/chunk-IZY4CMOO.js.map +0 -1
- package/dist/chunk-MQOYDQTF.js.map +0 -1
- package/dist/chunk-O2EAHOXM.cjs.map +0 -1
- package/dist/chunk-OGNADPM4.cjs.map +0 -1
- package/dist/chunk-TRZLN32I.cjs.map +0 -1
- package/dist/chunk-UIFN2LYT.js.map +0 -1
- package/dist/hey-buddy-5WOBYZRJ.cjs.map +0 -1
- package/dist/hey-buddy-AHUHCDBC.js.map +0 -1
- package/dist/whisperTranscribe-UBNUWXUQ.js +0 -4
|
@@ -1 +0,0 @@
|
|
|
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/ChatComposer/JumpToBottomButton.tsx"],"names":["React","jsxs","jsx","cva","ArrowDownIcon"],"mappings":"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","file":"chunk-UIFN2LYT.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 // Set once on the streaming → done transition so the pill auto-collapses\n // when thinking finishes; the user can still re-expand it afterwards.\n const [autoCollapsed, setAutoCollapsed] = React.useState(false);\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 setAutoCollapsed(true);\n } else if (!prevStreaming.current && streaming) {\n // Re-streaming in the same block: re-expand for the new thinking pass.\n startedAt.current = Date.now();\n setAutoCollapsed(false);\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 && !autoCollapsed}\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 inline-start border accent color. Used by multi-participant\n * surfaces (e.g. SuperChat) to tint a speaker's bubble; AI chat leaves it\n * 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={\n accent\n ? { borderInlineStart: `3px solid ${accent}`, ...style }\n : style\n }\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. `tool` messages never show one. */\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 // Tool messages render just the tool call: no bubble and no avatar. They sit\n // between the assistant's own messages, so a per-call avatar only repeats\n // who is speaking and pushes the conversation out of view.\n if (message.role === 'tool') {\n return (\n <div\n data-slot=\"ai-message\"\n className={cn(messageVariants({ role: message.role }), className)}\n >\n <div className=\"min-w-0 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","/**\n * Jump-to-bottom — shared scroll-anchoring affordance for chat threads.\n *\n * Lives in the ChatComposer module (the shared chat infrastructure) so both\n * SuperChat and AIChat — and eventually Messaging — can use it without\n * reaching into another module's internals. Pairs with the\n * `useStickToBottom` hook (`src/hooks/useStickToBottom.ts`).\n */\n\nimport * as React from 'react';\nimport { ArrowDown as ArrowDownIcon } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\ninterface JumpToBottomButtonProps {\n /** Show the \"New messages\" hint — unseen messages arrived below. */\n hasNewMessages: boolean;\n onClick: () => void;\n /**\n * `data-slot` attribute — each chat surface keeps its own slot namespace\n * (e.g. `superchat-jump-to-bottom`, `ai-chat-jump-to-bottom`).\n */\n dataSlot: string;\n}\n\n/**\n * Floating control shown over the thread whenever the user has scrolled up:\n * more content exists below (possibly still streaming in), and activating the\n * button returns to the newest message and resumes bottom-pinning. Absolutely\n * positioned within the thread viewport wrapper — never `fixed`, so it stays\n * inside embedded layouts.\n */\nexport function JumpToBottomButton({\n hasNewMessages,\n onClick,\n dataSlot,\n}: JumpToBottomButtonProps) {\n return (\n <button\n type=\"button\"\n data-slot={dataSlot}\n onClick={onClick}\n aria-label={\n hasNewMessages ? 'New messages — scroll to bottom' : 'Scroll to bottom'\n }\n className={cn(\n 'absolute bottom-3 left-1/2 z-20 -translate-x-1/2',\n 'flex items-center gap-1.5 rounded-full border border-neutral-200 bg-white p-2 text-xs font-medium text-neutral-600 shadow-lg',\n 'hover:bg-neutral-50 hover:text-neutral-800',\n 'focus-visible:ring-primary-500 focus:outline-none focus-visible:ring-2',\n 'dark:border-neutral-700 dark:bg-neutral-800 dark:text-neutral-300 dark:hover:bg-neutral-700 dark:hover:text-neutral-100',\n hasNewMessages && 'ps-3'\n )}\n >\n {hasNewMessages && <span>New messages</span>}\n <ArrowDownIcon size={16} aria-hidden=\"true\" />\n </button>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AI/HeyOzwell/WakeWord/lib/helpers.js","../src/components/AI/HeyOzwell/WakeWord/lib/onnx.js","../src/components/AI/HeyOzwell/WakeWord/lib/audio.js","../src/components/AI/HeyOzwell/WakeWord/lib/models/base.js","../src/components/AI/HeyOzwell/WakeWord/lib/models/vad.js","../src/components/AI/HeyOzwell/WakeWord/lib/models/mel-spectrogram.js","../src/components/AI/HeyOzwell/WakeWord/lib/models/speech-embedding.js","../src/components/AI/HeyOzwell/WakeWord/lib/models/wake-word.js","../src/components/AI/HeyOzwell/WakeWord/lib/hey-buddy.js"],"names":["getModelBytes"],"mappings":"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","file":"hey-buddy-5WOBYZRJ.cjs","sourcesContent":["/**\n * Check if an object is 'empty'.\n *\n * @param {*} o The object to check.\n * @returns {boolean} True if the object is empty.\n */\nexport let isEmpty = (o) => {\n return (\n o === null ||\n o === undefined ||\n o === '' ||\n o === 'null' ||\n (Array.isArray(o) && o.length === 0) ||\n (typeof o === 'object' &&\n o.constructor.name === 'Object' &&\n Object.getOwnPropertyNames(o).length === 0)\n );\n};\n\n/**\n * Returns a promise that resolves after a given number of milliseconds.\n */\nexport let sleep = (ms) => {\n return new Promise(resolve => setTimeout(resolve, ms));\n};\n","/** @module onnx */\nimport { sleep } from \"./helpers.js\";\n\nlet initialized = false, initError = null, Tensor, InferenceSession;\n\nif (typeof ort !== \"undefined\") {\n initialized = true;\n Tensor = ort.Tensor;\n InferenceSession = ort.InferenceSession;\n} else {\n // onnxruntime-web is a real dependency here, so let the bundler resolve it.\n // (The original also had a local-file fallback \"./onnxruntime-web/ort.mjs\" that Vite can't\n // resolve at build time — removed; not needed when the package is installed.)\n import(\"onnxruntime-web\").then((module) => {\n try {\n // The engine's .wasm files aren't served by the bundler, so fetch them from the CDN\n // matching the installed version — but ONLY if a host hasn't already configured wasmPaths\n // (so a strict-CSP / self-hosting host can point it at its own copy). Force single-threaded —\n // localhost has no COOP/COEP headers, so the threaded build (SharedArrayBuffer) can't load.\n if (!module.env.wasm.wasmPaths) {\n const v = (module.env && module.env.versions && module.env.versions.web) || \"\";\n module.env.wasm.wasmPaths = \"https://cdn.jsdelivr.net/npm/onnxruntime-web\" + (v ? \"@\" + v : \"\") + \"/dist/\";\n }\n module.env.wasm.numThreads = 1;\n } catch (e) { /* fall back to engine defaults */ }\n initialized = true;\n Tensor = module.Tensor;\n InferenceSession = module.InferenceSession;\n }).catch((e) => {\n // Surface a load failure (CSP/network/missing dep) instead of spinning forever below.\n initError = e instanceof Error ? e : new Error(String(e));\n });\n}\n\n/**\n * Wrapper for ONNX Runtime Web API.\n */\nexport class ONNX {\n /**\n * Wait for the ONNX Runtime Web API to be initialized.\n * @returns {Promise<void>} A promise that resolves when the ONNX Runtime Web API is initialized.\n */\n static async waitForInitialization() {\n while (!initialized) {\n if (initError) throw new Error(\"ONNX Runtime Web failed to load: \" + initError.message);\n await sleep(10);\n }\n }\n\n /**\n * Create a new tensor.\n * @param {string} dtype The data type of the tensor.\n * @param {Array<number>} data The data of the tensor.\n * @param {Array<number>} dims The dimensions of the tensor.\n * @returns {Promise<Tensor>} A promise that resolves to a new tensor.\n */\n static async createTensor(dtype, data, dims) {\n await ONNX.waitForInitialization();\n return new Tensor(dtype, data, dims);\n }\n\n /**\n * Create a new inference session.\n * @param {ArrayBuffer} model The model to load.\n * @param {Object} [options] The options for the inference session.\n * @returns {Promise<InferenceSession>} A promise that resolves to a new inference session.\n */\n static async createInferenceSession(model, options = {}) {\n await ONNX.waitForInitialization();\n return await InferenceSession.create(model, options);\n }\n}\n\n// Wait for the ONNX Runtime Web API to be initialized, then replace the static methods.\n// The static methods can still potentially be used, depending on the order of execution.\n// This only saves a cycle or two, but it's better than nothing.\nONNX.waitForInitialization().then(() => {\n ONNX.createTensor = (dtype, data, dims) => new Tensor(dtype, data, dims);\n ONNX.createInferenceSession = (model, options = {}) => InferenceSession.create(model, options);\n}).catch(() => {\n // Initialization can fail (CSP / offline / dynamic-import error). Swallow it here so it doesn't become\n // an unhandled rejection at load — the static methods await waitForInitialization() and surface the\n // real error to actual callers.\n});\n","/** @module audio */\n// Minified worklet code\nconst workletName = \"hey-buddy\";\nconst workletBlob = new Blob([`(()=>{class t extends AudioWorkletProcessor{constructor(t){super(t),this.targetSampleRate=t.processorOptions.targetSampleRate,this.inputBuffer=new Float32Array(this.inputFrameSize),this.inputBufferSize=0,this.outputBuffer=new Float32Array(this.targetFrameSize)}get inputFrameSize(){return Math.round(sampleRate/50)}get targetFrameSize(){return Math.round(this.targetSampleRate/50)}async flush(){const t=sampleRate/this.targetSampleRate;this.outputBuffer.fill(0);for(let e=0;e<this.targetFrameSize;e++){const i=e*t,r=Math.floor(i),s=Math.min(r+1,this.inputFrameSize-1),u=i-r;this.outputBuffer[e]=this.inputBuffer[r]*(1-u)+this.inputBuffer[s]*u}await this.port.postMessage(this.outputBuffer)}pushAudio(t){const e=t.length,i=this.inputFrameSize-this.inputBufferSize;if(e<i)return this.inputBuffer.set(t,this.inputBufferSize),void(this.inputBufferSize+=e);this.inputBuffer.set(t.subarray(0,i),this.inputBufferSize),this.flush(),this.inputBufferSize=0,this.pushAudio(t.subarray(i))}process(t,e,i){return this.pushAudio(t[0][0]),!0}}registerProcessor(\"${workletName}\",t)})();`], {type: \"application/javascript\"});\nconst workletUrl = URL.createObjectURL(workletBlob);\n\n/**\n * A class that batches audio samples and calls a callback with the batch.\n */\nexport class AudioBatcher {\n /**\n * @param {number} batchSeconds - The number of seconds to batch.\n * @param {number} batchIntervalSeconds - The number of seconds to wait before calling the callback.\n * @param {number} targetSampleRate - The target sample rate of the worklet.\n */\n constructor(\n batchSeconds=2.0,\n batchIntervalSeconds=0.05, // 50ms\n targetSampleRate=16000,\n ) {\n this.initialized = false;\n this.initError = null;\n this.callbacks = [];\n this.batchSeconds = batchSeconds;\n this.batchIntervalSeconds = batchIntervalSeconds;\n this.batchIntervalCount = 0;\n this.targetSampleRate = targetSampleRate;\n this.buffer = new Float32Array(this.batchSamples);\n this.buffer.fill(0);\n // initialize() is async (getUserMedia + worklet addModule); catch so a denied mic / failed\n // worklet surfaces as a stored error instead of an unhandled promise rejection.\n this.initialize().catch((e) => {\n this.initError = e;\n console.error(\"[AudioBatcher] initialization failed\", e);\n });\n }\n\n /**\n * The number of samples in a batch.\n * @type {number}\n */\n get batchSamples() {\n return Math.floor(this.batchSeconds * this.targetSampleRate);\n }\n\n /**\n * The number of samples in a batch interval.\n * @type {number}\n */\n get batchIntervalSamples() {\n return Math.floor(this.batchIntervalSeconds * this.targetSampleRate);\n }\n\n /**\n * Clears the buffer.\n */\n clearBuffer() {\n this.buffer.fill(0);\n }\n\n /**\n * Pushes new audio samples into the buffer.\n * @param {Float32Array} data - The new audio samples.\n */\n push(data) {\n const dataLength = data.length;\n if (dataLength >= this.buffer.length) {\n // Chunk larger than the ring buffer — keep only its most recent samples (a plain shift+append\n // would compute a negative offset and throw, permanently breaking the detector).\n this.buffer.set(data.subarray(dataLength - this.buffer.length));\n } else {\n // Shift the buffer back by this much\n this.buffer.set(this.buffer.subarray(dataLength));\n // Append the new data\n this.buffer.set(data, this.buffer.length - dataLength);\n }\n this.batchIntervalCount += dataLength;\n // If we have enough samples, call the callbacks and reset the interval count\n if (this.batchIntervalCount >= this.batchIntervalSamples) {\n this.callbacks.forEach(callback => callback(this.buffer));\n this.batchIntervalCount = 0;\n }\n }\n\n /**\n * Adds a callback to be called with each batch.\n * @param {Function} callback - The callback to add.\n */\n onBatch(callback) {\n this.callbacks.push(callback);\n }\n\n /**\n * Removes a callback from the list of callbacks.\n * @param {Function} callback - The callback to remove.\n */\n offBatch(callback) {\n this.callbacks = this.callbacks.filter(c => c !== callback);\n }\n\n /**\n * Initializes the audio batcher.\n */\n async initialize() {\n if (this.initialized) {\n return;\n }\n // KEEP the browser's audio DSP ON. We tried turning it off (for voiceprint consistency across rooms)\n // but it badly hurt RECALL — without noise-suppression/auto-gain the model needs loud/clear speech to\n // fire (normal-volume \"hey ozwell\" wouldn't even enroll). The DSP cleans+levels the speech so the\n // model fires at normal volume. The cross-environment voiceprint drift is handled the right way:\n // RE-ENROLL in the environment you use (proven to restore ~0.9 scores) / multi-condition enrollment.\n this.stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n channelCount: 1,\n echoCancellation: true,\n autoGainControl: true,\n noiseSuppression: true,\n }\n });\n this.audioContext = new AudioContext();\n this.audioContext.resume().catch(() => {}); // may start suspended under autoplay policy\n this.sourceNode = new MediaStreamAudioSourceNode(\n this.audioContext,\n { mediaStream: this.stream }\n );\n this.workerNode = await AudioNode.create(\n this.audioContext,\n this.targetSampleRate,\n );\n this.sourceNode.connect(this.workerNode.worker);\n this.workerNode.worker.port.onmessage = (event) => {\n this.push(event.data);\n }\n this.clearBuffer();\n this.initialized = true;\n }\n}\n\n/**\n * A class that wraps an AudioWorkletNode.\n */\nexport class AudioNode {\n /**\n * @param {AudioContext} context - The audio context.\n * @param {AudioWorkletNode} worker - The audio worklet node.\n */\n constructor(context, worker) {\n this.context = context;\n this.worker = worker;\n }\n\n /**\n * Creates an AudioNode.\n * @param {AudioContext} context - The audio context.\n * @param {number} targetSampleRate - The target sample rate of the worklet.\n * @returns {Promise<AudioNode>} The created AudioNode.\n */\n static async create(context, targetSampleRate) {\n await context.audioWorklet.addModule(workletUrl);\n const workletOptions = {\n processorOptions: {\n targetSampleRate: targetSampleRate,\n }\n };\n const worker = new AudioWorkletNode(context, workletName, workletOptions);\n return new AudioNode(context, worker);\n }\n}\n","/** @module models/base */\nimport { ONNX } from \"../onnx.js\";\nimport { getModelBytes } from \"../opfs.js\";\n\n/**\n * Base class for ONNX models\n */\nexport class ONNXModel {\n /**\n * Constructor\n * @param {string} modelPath - Path to the ONNX model\n * @param {Object} options - Options\n */\n constructor(\n modelPath,\n power = 0,\n webnn = 1,\n webgpu = 2,\n webgl = 3,\n wasm = 4,\n ) {\n this.modelPath = modelPath;\n this.session = null;\n this.loadError = null;\n this.duration = 0.0; // EMA duration\n this.ema = 0.1; // EMA coefficient\n this.lastTime = 0.0; // Last time the model was run\n this.webnn = webnn;\n this.webgpu = webgpu;\n this.webgl = webgl;\n this.wasm = wasm;\n // 0 for default, -1 for low power, 1 for high power\n this.power = power;\n // Track the load so failures surface (an unhandled rejection here would leave `session` null and\n // hang waitUntilLoaded()/run() forever). waitUntilLoaded() awaits this and rethrows the error.\n this.loadPromise = this.load().catch((e) => {\n this.loadError = e;\n console.warn(\"[ONNXModel] load failed:\", e);\n });\n }\n\n /**\n * Get the power preference\n * @returns {string} - Power preference\n */\n get powerPreference() {\n switch (this.power) {\n case -1:\n return \"low-power\";\n case 1:\n return \"high-performance\";\n default:\n return \"default\";\n }\n }\n\n /**\n * Get the execution providers\n * @returns {Array} - Execution providers\n */\n get executionProviders() {\n const providerIndexes = [];\n if (Number.isInteger(this.webnn)) {\n providerIndexes.push([{\n name: \"webnn\",\n device: \"gpu\",\n powerPreference: this.powerPreference,\n }, this.webnn]);\n }\n if (Number.isInteger(this.webgpu)) {\n providerIndexes.push([\"webgpu\", this.webgpu]);\n }\n if (Number.isInteger(this.webgl)) {\n providerIndexes.push([\"webgl\", this.webgl]);\n }\n if (Number.isInteger(this.wasm)) {\n providerIndexes.push([\"wasm\", this.wasm]);\n }\n providerIndexes.sort((a, b) => a[1] - b[1]);\n return providerIndexes.map((providerIndex) => providerIndex[0]);\n }\n\n /**\n * Get the session options\n * @returns {Object} - Session options\n * @see https://onnxruntime.ai/docs/tutorials/web/env-flags-and-session-options.html#session-options\n */\n get sessionOptions() {\n // Intentionally wasm-only. The webnn/webgpu/webgl preferences computed in `executionProviders`\n // broke inference in this pipeline, so they're deliberately NOT applied here (the getter is kept\n // for reference / future investigation). This is the working configuration, not an oversight.\n return {\n executionProviders: [\"wasm\"],\n };\n }\n\n /**\n * Initialize the model\n */\n async load() {\n // Model files live in OPFS (app-private, offline, versioned) per the storage breakdown — fetch the\n // bytes ourselves (OPFS-first, network on miss) and hand ORT the bytes instead of the URL.\n const bytes = await getModelBytes(this.modelPath);\n this.session = await ONNX.createInferenceSession(bytes, this.sessionOptions);\n }\n\n /**\n * Waits until the model is loaded\n */\n async waitUntilLoaded() {\n await this.loadPromise;\n if (this.loadError) throw this.loadError; // fail fast instead of spinning forever on a load failure\n }\n\n /**\n * Execute the model\n * @param {Mixed} input - Input data\n * @returns {Promise} - Promise that resolves with the output of the model\n * @throws {Error} - If the method is not implemented\n */\n async execute(input) {\n throw new Error(\"Not Implemented\");\n }\n\n /**\n * Run the model\n * @param {Mixed} input - Input data\n * @returns {Promise} - Promise that resolves with the output of the model\n */\n async run(input) {\n await this.waitUntilLoaded();\n const currentTime = new Date().getTime();\n const result = await this.execute(input);\n const executionDuration = new Date().getTime() - currentTime;\n // Update EMA\n if (this.duration === 0.0) {\n this.duration = executionDuration;\n } else {\n this.duration = (1.0 - this.ema) * this.duration + this.ema * executionDuration;\n }\n this.lastTime = currentTime;\n return result;\n }\n}\n","/** @module models/vad */\nimport { ONNX } from \"../onnx.js\";\nimport { ONNXModel } from \"./base.js\";\n\n/**\n * Silero VAD model\n * @extends ONNXModel\n */\nexport class SileroVAD extends ONNXModel {\n /**\n * Constructor\n * @param {string} modelPath - Path to the ONNX model\n * @param {number} sampleRate - Sample rate of the input audio\n * @param {number} speechVadThreshold - Threshold for speech detection (default: 0.65)\n * @param {number} silenceVadThreshold - Threshold for silence detection (default: 0.4)\n * @param {number} silentFramesCount - Number of silent frames to consider speech ended (default: 10)\n */\n constructor(\n modelPath = \"/pretrained/silero-vad.onnx\",\n sampleRate = 16000,\n speechVadThreshold = 0.65,\n silenceVadThreshold = 0.4,\n silentFramesCount = 10,\n power = 0,\n webnn = 1,\n webgpu = 2,\n webgl = 3,\n wasm = 4,\n ) {\n super(\n modelPath,\n power,\n webnn,\n webgpu,\n webgl,\n wasm,\n );\n this.sampleRate = sampleRate || 16000;\n this.speechVadThreshold = speechVadThreshold;\n this.silenceVadThreshold = silenceVadThreshold;\n this.silentFramesCount = silentFramesCount;\n this.silentFrames = 0;\n this.isSpeaking = false;\n }\n\n /**\n * Test the model\n * @param {boolean} debug - If true, log the result to the console\n * @throws {Error} - If the model fails the test\n */\n async test(debug = false) {\n let result = await this.run(new Float32Array(16000).fill(0));\n if (!isNaN(result) && 0.0 <= result && result <= 1.0) {\n if (debug) {\n console.log(`VAD model OK, executed in ${this.duration} ms`);\n }\n } else {\n throw new Error(`VAD model failed - got ${result}`);\n }\n }\n\n /**\n * Execute the model\n * @param {Float32Array} input - Input data\n * @returns {Promise} - Promise that resolves with the output of the model, which is a single float\n * @throws {Error} - If the input data is not a Float32Array\n */\n async execute(input) {\n if (this.h === undefined || this.c === undefined || this.sr === undefined) {\n this.sr = await ONNX.createTensor(\"int64\", [this.sampleRate], [1]);\n this.h = await ONNX.createTensor(\"float32\", (new Array(128)).fill(0), [2, 1, 64]);\n this.c = await ONNX.createTensor(\"float32\", (new Array(128)).fill(0), [2, 1, 64]);\n }\n const inputTensor = await ONNX.createTensor(\"float32\", input, [1, input.length]);\n const output = await this.session.run({\n input: inputTensor,\n h: this.h,\n c: this.c,\n sr: this.sr,\n });\n this.c = output.cn;\n this.h = output.hn;\n return output.output.data[0];\n }\n\n /**\n * Determines if speech is present in the audio, with debouncing logic so a brief pause between\n * words doesn't split one utterance into two: if speech is followed by a short silence and then\n * more speech, the whole span (including the gap) is still treated as speech.\n *\n * @param {Float32Array} audio - Audio data to check for speech\n * @returns {Promise<Object>} - Promise that resolves with an object containing:\n * - isSpeaking: boolean - true if speech is detected, false otherwise\n * - probability: number - the raw VAD probability score (0-1)\n */\n async hasSpeechAudio(audio) {\n // Run VAD on the audio\n const speechProbability = await this.run(audio);\n const hasSpeech = speechProbability > this.speechVadThreshold;\n const hasSilence = speechProbability < this.silenceVadThreshold;\n let justStoppedSpeaking = false;\n let justStartedSpeaking = false;\n \n // Update speech state with debouncing\n if (!hasSpeech) {\n if (hasSilence) {\n this.silentFrames += 1;\n \n if (this.isSpeaking && this.silentFrames > this.silentFramesCount) {\n this.isSpeaking = false;\n justStoppedSpeaking = true;\n }\n }\n } else {\n this.silentFrames = 0;\n if(!this.isSpeaking){\n this.isSpeaking = true;\n justStartedSpeaking = true;\n }\n }\n \n // Return both the speech state and the probability\n return {\n isSpeaking: this.isSpeaking,\n speechProbability,\n justStoppedSpeaking,\n justStartedSpeaking\n };\n }\n}","/** @module models/mel-spectrogram */\nimport { ONNX } from \"../onnx.js\";\nimport { ONNXModel } from \"./base.js\";\n\n/**\n * Mel spectrogram model\n * @extends ONNXModel\n */\nexport class MelSpectrogram extends ONNXModel {\n /**\n * Constructor\n * @param {string} modelPath - Path to the ONNX model\n */\n constructor(\n modelPath = \"/pretrained/mel-spectrogram.onnx\",\n power = 0,\n webnn = 1,\n webgpu = 2,\n webgl = 3,\n wasm = 4,\n ) {\n super(\n modelPath,\n power,\n webnn,\n webgpu,\n webgl,\n wasm,\n );\n }\n\n /**\n * Test the model\n * @param {boolean} debug - If true, print debug information\n * @throws {Error} - If the model fails the test\n */\n async test(debug = false) {\n let result = await this.run(new Float32Array(12640).fill(1.0));\n if (result.dims.length === 4 && \n result.dims[2] === 76 &&\n result.dims[3] === 32\n ) {\n if (debug) {\n console.log(`Mel spectrogram model OK, executed in ${this.duration} ms`);\n }\n } else {\n throw new Error(\"Mel spectrogram model failed\");\n }\n }\n\n /**\n * Execute the model\n * @param {Float32Array} input - Input data\n * @returns {Promise} - Promise that resolves with the output of the model, which is a 2D array\n * @throws {Error} - If the input data is not a Float32Array\n */\n async execute(input) {\n // SCALE FIX (MIE 2026-06-09): peak-normalize each buffer to match training\n // (heybuddy/embeddings.py divides each clip by its peak). Without this, the browser\n // feeds un-normalized audio and the model separates by loudness, not content.\n let peak = 0;\n for (let i = 0; i < input.length; i++) {\n const a = Math.abs(input[i]);\n if (a > peak) peak = a;\n }\n if (peak > 1e-5) {\n const normed = new Float32Array(input.length);\n for (let i = 0; i < input.length; i++) normed[i] = input[i] / peak;\n input = normed;\n }\n const inputTensor = await ONNX.createTensor(\n \"float32\",\n input,\n [1, input.length]\n );\n const output = await this.session.run({ input: inputTensor });\n // Rescale in place — this runs every frame on the wake pipeline, so mutate the output buffer\n // instead of allocating a new array per call (.map).\n const data = output.output.data;\n for (let i = 0; i < data.length; i++) data[i] = data[i] / 10.0 + 2.0;\n return await ONNX.createTensor(\"float32\", data, output.output.dims);\n }\n}\n","/** @module models/speech-embedding */\nimport { ONNX } from \"../onnx.js\";\nimport { ONNXModel } from \"./base.js\";\nimport { MelSpectrogram } from \"./mel-spectrogram.js\";\n\n/**\n * Speech Embedding model\n * get the embeddings from a mel spectrogram\n * @extends ONNXModel\n */\nexport class SpeechEmbedding extends ONNXModel {\n /**\n * Constructor\n * @param {string} modelPath - Path to the ONNX model\n * @param {MelSpectrogram} spectrogramModel - Mel spectrogram model\n * @param {number} spectrogramMelBins - Number of Mel bins for the Mel spectrogram model\n * @param {number} embeddingDim - Dimension of the embeddings\n * @param {number} windowSize - Size of the window\n * @param {number} windowStride - Stride of the window\n */\n constructor(\n modelPath,\n embeddingDim = 96,\n windowSize = 76,\n windowStride = 8,\n power = 0,\n webnn = 1,\n webgpu = 2,\n webgl = 3,\n wasm = 4,\n ) {\n super(\n modelPath,\n power,\n webnn,\n webgpu,\n webgl,\n wasm\n );\n this.embeddingDim = embeddingDim;\n this.windowSize = windowSize;\n this.windowStride = windowStride;\n }\n\n /** \n * Test the model\n * @param {boolean} debug - Debug mode\n * @throws {Error} - If the model fails the test\n */\n async test(debug = false) {\n const melTensor = await ONNX.createTensor(\n \"float32\",\n new Float32Array(100 * 32), // already zero-initialized\n [100, 32]\n );\n let result = await this.run(melTensor);\n if (result.dims.length === 2 && \n result.dims[0] === 4 &&\n result.dims[1] === 96\n ) {\n if (debug) {\n console.log(`Speech embedding model OK, executed in ${this.duration} ms`);\n }\n } else {\n console.error(\"Unexpected speech embedding result\", result);\n throw new Error(\"Speech embedding model failed\");\n }\n }\n\n /**\n * Extracts speech embeddings from a mel spectrogram output\n * \n * This function takes the output from a mel spectrogram model, creates an ONNX tensor\n * with the appropriate dimensions, and runs it through the speech embedding model to\n * generate embeddings that can be used for wake word detection.\n * \n * @param {Object} melSpectogramOutput - The output tensor from a mel spectrogram model\n * @param {Float32Array} melSpectogramOutput.data - The raw data from the mel spectrogram\n * @param {Array<number>} melSpectogramOutput.dims - The dimensions of the mel spectrogram output\n * @returns {Promise<Object>} - A promise that resolves to an ONNX tensor containing the speech embeddings\n */\n async getEmbeddingFromMelSpectrogramOutput(melSpectogramOutput){\n const spectogramBuffer = await ONNX.createTensor(\n \"float32\",\n melSpectogramOutput.data,\n melSpectogramOutput.dims.slice(2)\n );\n\n return this.run(spectogramBuffer);\n }\n\n /**\n * Execute the model\n * @param {Float32Array} input - Input data\n * @returns {Promise} - Promise that resolves with the output of the model, which is a 2D array\n * @throws {Error} - If the input data is not a Float32Array\n */\n async execute(spectrograms) {\n const [numFrames, melBins] = spectrograms.dims;\n if (numFrames < this.windowSize) {\n throw new Error(`Audio is too short to process - require ${this.windowSize} samples, got ${numFrames}`);\n }\n // Calculate the number of batches\n const numTruncatedFrames = numFrames - (numFrames - this.windowSize) % this.windowStride;\n const numBatches = (numTruncatedFrames - this.windowSize) / this.windowStride + 1;\n\n // Create buffer for output\n const embeddings = await ONNX.createTensor(\n \"float32\",\n (new Array(numBatches * this.embeddingDim)).fill(0),\n [numBatches, this.embeddingDim]\n );\n\n // Iterate through windows\n const windowBatches = [];\n for (\n let windowStart = 0;\n windowStart < numTruncatedFrames - this.windowSize + this.windowStride;\n windowStart += this.windowStride\n ) {\n const windowEnd = windowStart + this.windowSize;\n const windowTensor = await ONNX.createTensor(\n \"float32\",\n spectrograms.data.slice(windowStart * melBins, windowEnd * melBins),\n [this.windowSize, melBins, 1]\n );\n windowBatches.push([windowStart, windowEnd, windowTensor]);\n }\n\n // Restack windows into a single tensor\n const stackedWindowTensor = await ONNX.createTensor(\n \"float32\",\n new Float32Array(numBatches * this.windowSize * melBins),\n [numBatches, this.windowSize, melBins, 1]\n );\n for (let i = 0; i < numBatches; i++) {\n stackedWindowTensor.data.set(windowBatches[i][2].data, i * this.windowSize * melBins);\n }\n\n // Execute the model\n // TODO: Determine why this takes so much longer in the browser than it does in python\n const output = await this.session.run({ input_1: stackedWindowTensor });\n\n for (let i = 0; i < numBatches; i++) {\n embeddings.data.set(\n output.conv2d_19.data.slice(\n i * this.embeddingDim,\n (i + 1) * this.embeddingDim\n ),\n i * this.embeddingDim\n );\n }\n return embeddings;\n }\n}\n","/** @module models/wake-word */\nimport { ONNX } from \"../onnx.js\";\nimport { ONNXModel } from \"./base.js\";\n\n/**\n * Wake Word model\n * @extends ONNXModel\n */\nexport class WakeWord extends ONNXModel {\n /**\n * Constructor\n * @param {string} modelPath - Path to the ONNX model\n * @param {number} threshold - Threshold for wake word detection (default: 0.5)\n */\n constructor(\n modelPath,\n threshold,\n power = 0,\n webnn = 1,\n webgpu = 2,\n webgl = 3,\n wasm = 4\n ) {\n super(modelPath, power, webnn, webgpu, webgl, wasm);\n this.threshold = threshold;\n }\n\n /**\n * Test the model\n * @param {boolean} debug - Whether to log debug messages\n * @throws {Error} - If the model test fails\n */\n async test(debug = false) {\n const embeddings = await ONNX.createTensor(\n \"float32\",\n new Float32Array(16*96).fill(0),\n [1, 16, 96]\n );\n const output = await this.run(embeddings);\n if (0.0 <= output && output <= 1.0) {\n if (debug) {\n console.log(`Wake Word model OK, executed in ${this.duration} ms`);\n }\n } else {\n throw new Error(`Wake Word model test failed - expected 0 <= x <= 1, got ${output}`);\n }\n }\n\n /**\n * Execute the model\n * @param {Float32Array} embeddings - Input embeddings\n * @returns {Promise} - Promise that resolves with the output of the model, which is a single float\n * @throws {Error} - If the input data is not a Float32Array\n */\n async execute(embeddings) {\n const input = {};\n if (embeddings.dims.length === 3) {\n input.input = embeddings;\n } else {\n input.input = await ONNX.createTensor(\n \"float32\",\n embeddings.data,\n [1, embeddings.dims[0], embeddings.dims[1]]\n );\n }\n const output = await this.session.run(input);\n return output.output.data[0] * 1;\n }\n\n /**\n * Check if the wake word is detected based on the threshold\n * @param {Float32Array} embeddings - Input embeddings\n * @returns {Promise<Object>} - Promise that resolves with an object containing probability and detected status\n */\n async checkWakeWordCalled(embeddings) {\n const probability = await this.run(embeddings);\n\n // Live base-threshold override for tuning without a rebuild: window.__baseThr can be a number\n // (all phrases) or a {name: thr} map. Falls back to the configured per-word threshold.\n let thr = this.threshold;\n const ov = (typeof window !== \"undefined\") ? window.__baseThr : undefined;\n if (typeof ov === \"number\") thr = ov;\n else if (ov && this.name && typeof ov[this.name] === \"number\") thr = ov[this.name];\n\n return {\n probability,\n detected: probability >= thr\n };\n }\n\n /**\n * Run wake word detection on audio.\n * @param {Float32Array} embeddings - Input embeddings\n * @returns {Promise} - Promise that resolves when wake word detection is complete.\n */\n async checkWakeWordPresent(embeddings) {\n return await this.execute(embeddings);\n }\n}\n","/** @module hey-buddy */\nimport { ONNX } from \"./onnx.js\";\nimport { AudioBatcher } from \"./audio.js\";\nimport {\n SileroVAD,\n SpeechEmbedding,\n MelSpectrogram,\n WakeWord\n} from \"./models.js\";\n\n/**\n * Combines an array of embedding buffers into a single embedding tensor.\n *\n * @async\n * @function\n * @param {Float32Array[]} embeddingBufferArray - An array of embedding buffers, where each buffer is a Float32Array.\n * @param {number} numFramesPerEmbedding - The number of frames per embedding.\n * @param {number} embeddingDim - The dimensionality of each embedding.\n * @returns {Promise<Object>} A promise that resolves to an ONNX tensor containing the combined embeddings.\n */\nasync function embeddingBufferArrayToEmbedding(embeddingBufferArray, numFramesPerEmbedding, embeddingDim){\n // Create empty buffer of the right size\n const combinedEmptyData = new Float32Array(numFramesPerEmbedding * embeddingBufferArray.length * embeddingDim);\n \n // Create tensor with the empty buffer\n const embeddingBuffer = await ONNX.createTensor(\n \"float32\",\n combinedEmptyData,\n [numFramesPerEmbedding * embeddingBufferArray.length, embeddingDim]\n );\n\n // Fill the buffer with data\n for (let i = 0; i < embeddingBufferArray.length; i++) {\n const embedding = embeddingBufferArray[i];\n embeddingBuffer.data.set(embedding.data, i * numFramesPerEmbedding * embeddingDim);\n }\n return embeddingBuffer;\n}\n\n/**\n * HeyBuddy class for running wake word detection.\n */\nexport class HeyBuddy {\n /**\n * Create a HeyBuddy instance.\n * @param {Object} [options] - Options object.\n * @param {number} [options.positiveVadThreshold=0.5] - VAD threshold for speech.\n * @param {number} [options.negativeVadThreshold=0.25] - VAD threshold for silence.\n * @param {number} [options.negativeVadCount=8] - Number of negative VADs to trigger silence.\n * @param {number} [options.wakeWordThreads=4] - Number of threads for wake word detection.\n * @param {number} [options.wakeWordThreshold=0.5] - Wake word detection threshold.\n * @param {string|string[]} [options.modelPath=\"/models/hey-buddy.onnx\"] - Path to wake word model.\n * @param {string} [options.vadModelPath=\"/pretrained/silero-vad.onnx\"] - Path to VAD model.\n * @param {string} [options.embeddingModelPath=\"/pretrained/speech-embedding.onnx\"] - Path to speech embedding model.\n * @param {string} [options.spectrogramModelPath=\"/pretrained/mel-spectrogram.onnx\"] - Path to mel spectrogram model.\n * @param {number} [options.batchSeconds=1.08] - Number of seconds per batch.\n * @param {number} [options.batchIntervalSeconds=0.12] - Number of seconds between batches.\n * @param {number} [options.targetSampleRate=16000] - Target sample rate for audio.\n * @param {number} [options.spectrogramMelBins=32] - Number of mel bins for spectrogram.\n * @param {number} [options.embeddingDim=96] - Dimension of speech embedding.\n * @param {number} [options.embeddingWindowSize=76] - Window size for speech embedding.\n * @param {number} [options.embeddingWindowStride=8] - Window stride for speech embedding.\n */\n constructor (options) {\n options = options || {};\n // Get options or use defaults for runtime\n this.debug = options.debug || false;\n options.positiveVadThreshold = options.positiveVadThreshold || 0.65;\n options.negativeVadThreshold = options.negativeVadThreshold || 0.4;\n options.negativeVadCount = options.negativeVadCount || 8;\n this.wakeWordThreads = options.wakeWordThreads || 4;\n this.wakeWordThreshold = options.wakeWordThreshold || 0.5;\n // Per-word thresholds (keyed by model file name, e.g. \"hey-ozwell\"); falls back to wakeWordThreshold.\n this.wakeWordThresholds = options.wakeWordThresholds || {};\n this.wakeWordInterval = options.wakeWordInterval || 2.0; // How often a wake word can be uttered\n\n // Get options or use defaults for models\n const modelPath = options.modelPath || \"/models/hey-buddy.onnx\";\n const modelArray = Array.isArray(modelPath) ? modelPath : [modelPath];\n const vadModelPath = options.vadModelPath || \"/pretrained/silero-vad.onnx\";\n const embeddingModelPath = options.embeddingModelPath || \"/pretrained/speech-embedding.onnx\";\n const spectrogramModelPath = options.spectrogramModelPath || \"/pretrained/mel-spectrogram.onnx\";\n const batchSeconds = options.batchSeconds || 1.08; // 1080ms * 16khz = 17280 samples\n const batchIntervalSeconds = options.batchIntervalSeconds || 0.12; // 120ms * 16khz = 1920 samples\n const targetSampleRate = options.targetSampleRate || 16000;\n const spectrogramMelBins = options.spectrogramMelBins || 32;\n const embeddingDim = options.embeddingDim || 96;\n const embeddingWindowSize = options.embeddingWindowSize || 76;\n const embeddingWindowStride = options.embeddingWindowStride || 8;\n const wakeWordEmbeddingFrames = options.wakeWordEmbeddingFrames || 16;\n\n // Initialize shared models\n this.vad = new SileroVAD(vadModelPath, targetSampleRate, options.positiveVadThreshold, options.negativeVadThreshold, options.negativeVadCount);\n this.vad.test(this.debug).catch((e) => console.warn(\"[HeyBuddy] vad.test failed\", e));\n\n this.spectrogram = new MelSpectrogram(spectrogramModelPath);\n this.spectrogram.test(this.debug).catch((e) => console.warn(\"[HeyBuddy] spectrogram.test failed\", e));\n this.spectrogramMelBins = spectrogramMelBins;\n\n this.embedding = new SpeechEmbedding(\n embeddingModelPath,\n embeddingDim,\n embeddingWindowSize,\n embeddingWindowStride,\n );\n this.embedding.test(this.debug).catch((e) => console.warn(\"[HeyBuddy] embedding.test failed\", e));\n this.embeddingDim = embeddingDim;\n this.embeddingWindowSize = embeddingWindowSize;\n this.embeddingWindowStride = embeddingWindowStride;\n this.embeddingBuffer = null;\n this.embeddingBufferArray = []\n\n // --- Voiceprint (per-user enrollment) layer ---\n // Stored voiceprints keyed by wake-word name; each is an array of Float32Array\n // (each a flattened [16x96] embedding window captured during enrollment). At\n // runtime we cosine-match the live embedding window against these.\n this.voiceprints = {};\n this.voiceprintThreshold = options.voiceprintThreshold ?? 0.85;\n this.voiceprintThresholds = options.voiceprintThresholds || {};\n // The voiceprint may only BOOST a phrase the general model already weakly hears, never\n // fire one it hears nothing of — this stops enrolling a DIFFERENT phrase (\"hey doug\").\n this.voiceprintGate = options.voiceprintGate ?? 0.3;\n this.embeddingMean = null; // running \"common-mode\" embedding, subtracted before cosine\n // RECALL use of the voiceprint (amplify a weak model fire). Default on for back-compat;\n // set false to use the voiceprint for PRECISION only (reject false fires in runWakeGate).\n this.voiceprintRecall = options.voiceprintRecall ?? true;\n // Debounce: require a phrase to clear its threshold for N CONSECUTIVE frames before firing.\n // Real wakes sustain (~4-9 frames in the browser pipeline); conversational false fires are brief\n // 1-2 frame spikes — so this cuts false fires ~30x at ~1pt recall cost (measured browser-faithful).\n // N=1 = off (legacy single-frame). Live-tunable via window.__debounceFrames.\n this.debounceFrames = options.debounceFrames ?? 1;\n this._consec = {}; // per-phrase consecutive-detected-frame counter\n this.lastWakeProb = 0; // peak fire confidence frozen at the last wake (the base level)\n this._peakProb = {}; // per-phrase peak probability within the current detection run\n this._peakEmb = {}; // per-phrase embedding window at that peak frame (used for the voiceprint)\n // The [16x96] embedding window at the moment a wake last fired — so the gate (runWakeGate)\n // and enrollment can reuse the exact window the model scored, no recompute.\n this.lastWakeEmbedding = null;\n\n // Initialize wake word models\n this.wakeWords = {};\n this.wakeWordTimes = {};\n this.wakeWordEmbeddingFrames = wakeWordEmbeddingFrames;\n for (let model of modelArray) {\n let modelName = model.split(\"/\").pop().split(\".\")[0];\n let modelThreshold = this.wakeWordThresholds[modelName] ?? this.wakeWordThreshold;\n this.wakeWords[modelName] = new WakeWord(model, modelThreshold);\n this.wakeWords[modelName].name = modelName; // for per-phrase window.__baseThr override\n this.wakeWords[modelName].test(this.debug).catch((e) => console.warn(`[HeyBuddy] ${modelName}.test failed`, e));\n }\n\n // Initialize state\n this.recording = false;\n this.audioBuffer = null;\n this.frameIntervalEma = 0;\n this.frameIntervalEmaWeight = 0.1;\n this.frameTimeEma = 0;\n this.frameTimeEmaWeight = 0.1;\n\n this.speechStartCallbacks = [];\n this.speechEndCallbacks = [];\n this.recordingCallbacks = [];\n this.processedCallbacks = [];\n this.detectedCallbacks = [];\n\n // Initialize batcher and add callback\n this._processing = false;\n this.batcher = new AudioBatcher(\n batchSeconds,\n batchIntervalSeconds,\n targetSampleRate\n );\n this.batcher.onBatch((batch) => this.processBatch(batch));\n }\n\n /**\n * Process a batch, dropping (never queueing) batches that arrive while one is still in flight —\n * the batcher doesn't await callbacks, so unguarded runs pile up and block the main thread.\n * @param {Float32Array} batch - The batcher's live rolling buffer (mutated after this call).\n */\n async processBatch(batch) {\n if (this._processing) return;\n this._processing = true;\n try {\n await this.process(batch.slice()); // snapshot: the batcher keeps shifting its buffer\n } catch (e) {\n console.warn(\"[HeyBuddy] process failed\", e);\n } finally {\n this._processing = false;\n }\n }\n\n /**\n * Set a user's enrolled voiceprint for a wake word.\n * @param {string} name - Wake-word name (e.g. \"hey-ozwell\").\n * @param {Float32Array[]} vectors - Flattened embedding windows captured at enrollment.\n */\n setVoiceprint(name, vectors) { this.voiceprints[name] = vectors || []; }\n clearVoiceprint(name) { delete this.voiceprints[name]; }\n hasVoiceprint(name) {\n return Array.isArray(this.voiceprints[name]) && this.voiceprints[name].length > 0;\n }\n\n /**\n * Max cosine similarity between a live embedding window and the stored voiceprint set.\n * Cosine compares DIRECTION not magnitude, so it ignores loudness and keys on what the\n * sound actually is. Returns 0..1 (1 = near-identical).\n */\n voiceprintSimilarity(name, liveVec) {\n const set = this.voiceprints[name];\n if (!Array.isArray(set) || set.length === 0 || !liveVec) return 0;\n const mean = this.embeddingMean; // subtract the common-mode so cosine reflects CONTENT\n let best = -1; // allow negative (poor-match) scores through, don't floor them at 0\n for (const ref of set) {\n let dot = 0, na = 0, nb = 0;\n const n = Math.min(ref.length, liveVec.length);\n for (let i = 0; i < n; i++) {\n const a = mean ? ref[i] - mean[i] : ref[i];\n const b = mean ? liveVec[i] - mean[i] : liveVec[i];\n dot += a * b; na += a * a; nb += b * b;\n }\n if (na > 0 && nb > 0) { const s = dot / (Math.sqrt(na) * Math.sqrt(nb)); if (s > best) best = s; }\n }\n return best;\n }\n\n /**\n * Gets the names of wake words, chunked for threaded wake word detection.\n * @returns {string[][]} - Names of wake words.\n */\n get chunkedWakeWords() {\n return Object.keys(this.wakeWords).reduce((carry, name, i) => {\n const chunkIndex = Math.floor(i / this.wakeWordThreads);\n if (!carry[chunkIndex]) {\n carry[chunkIndex] = [];\n }\n carry[chunkIndex].push(name);\n return carry;\n }, []);\n }\n\n /**\n * Add a callback for when a wake word is detected.\n * @param {string|string[]} names - Name of wake word.\n * @param {Function} callback - Callback function.\n */\n onDetected(names, callback) {\n this.detectedCallbacks.push({names, callback});\n }\n\n /**\n * Add a callback for processed data.\n * @param {Function} callback - Callback function.\n */\n onProcessed(callback) {\n this.processedCallbacks.push(callback);\n }\n\n /**\n * Add a callback for speech start.\n * @param {Function} callback - Callback function.\n */\n onSpeechStart(callback) {\n this.speechStartCallbacks.push(callback);\n }\n\n /**\n * Add a callback for speech end.\n * @param {Function} callback - Callback function.\n */\n onSpeechEnd(callback) {\n this.speechEndCallbacks.push(callback);\n }\n\n /**\n * Add a callback for recording.\n * @param {Function} callback - Callback function.\n */\n onRecording(callback) {\n this.recordingCallbacks.push(callback);\n }\n\n /**\n * Trigger speech start event.\n */\n speechStart() {\n if (this.debug) {\n console.log(\"Speech start\");\n }\n for (let callback of this.speechStartCallbacks) {\n callback();\n }\n }\n\n /**\n * Trigger speech end event.\n */\n speechEnd() {\n if (this.debug) {\n console.log(\"Speech end\");\n }\n for (let callback of this.speechEndCallbacks) {\n callback();\n }\n if (this.recording) {\n this.dispatchRecording();\n this.recording = false;\n }\n }\n\n /**\n * Dispatch recording to all recording callbacks.\n */ \n dispatchRecording() {\n if (this.audioBuffer === null) {\n console.error(\"No recording to dispatch\");\n return;\n }\n if (this.debug) {\n const recordingLength = this.audioBuffer.length;\n const recordedDuration = recordingLength / this.batcher.targetSampleRate;\n console.log(`Dispatching recording with ${recordingLength} frames (${recordedDuration} s)`);\n }\n for (let callback of this.recordingCallbacks) {\n callback(this.audioBuffer);\n }\n this.audioBuffer = null;\n }\n\n /**\n * Trigger wake word detection event.\n * @param {string} name - Name of wake word.\n */\n wakeWordDetected(name) {\n const now = Date.now();\n if (this.wakeWordTimes[name] && (now - this.wakeWordTimes[name]) < this.wakeWordInterval * 1000) {\n return;\n }\n if (this.debug) {\n console.log(\"Wake word detected:\", name);\n }\n this.recording = true;\n this.wakeWordTimes[name] = now;\n // How long the phrase was, from its detection run. `_consec[name]` = consecutive detected frames up\n // to this fire; each frame is one batch interval (~120ms), so this ≈ the spoken phrase's duration.\n // Purely additive readout (detection logic unchanged) — consumers use it to trim the phrase off the\n // recorded audio without relying on a silent pause before it.\n const frameSec = (this.batcher && this.batcher.batchIntervalSamples && this.batcher.targetSampleRate)\n ? this.batcher.batchIntervalSamples / this.batcher.targetSampleRate : 0.12;\n this.lastWakeDurationSec = (this._consec[name] || 0) * frameSec;\n // FREEZE the wake embedding at THIS fire moment = the peak of the current detection run up to the\n // fire. Captured ONCE per fire (this runs after the interval guard above), so it can't drift to\n // later low-confidence frames during the recording tail — that drift collapsed the gate/enrollment\n // cosine (esp. with a low base threshold, where weak frames keep counting as \"detected\").\n // Enrollment and the runtime gate both read this same frozen value -> their cosines stay comparable.\n this.lastWakeEmbedding = (this._peakEmb && this._peakEmb[name])\n ? this._peakEmb[name]\n : ((this.embeddingBuffer && this.embeddingBuffer.data) ? Float32Array.from(this.embeddingBuffer.data) : null);\n // freeze the peak fire confidence too (the live prob spikes then drops, so reading it later is stale)\n this.lastWakeProb = (this._peakProb && this._peakProb[name]) ? this._peakProb[name] : 0;\n\n for (let {names, callback} of this.detectedCallbacks) {\n if (Array.isArray(names) && names.includes(name) || names === name) {\n callback();\n }\n }\n }\n\n /**\n * Trigger processed event.\n * @param {Object} data - Processed data.\n */\n processed(data) {\n for (let callback of this.processedCallbacks) {\n callback(data);\n }\n }\n\n /**\n * Runs wake word detection on a subset of wake words.\n * @param {string[]} wakeWordNames - Names of wake words to check.\n * @returns {Promise} - Promise that resolves when wake word detection is complete.\n */\n async checkWakeWordSubset(wakeWordNames) {\n return await Promise.all(\n wakeWordNames.map(name => this.wakeWords[name].checkWakeWordCalled(this.embeddingBuffer))\n );\n }\n\n /**\n * Run wake word detection on audio.\n * @returns {Promise} - Promise that resolves when wake word detection is complete.\n */\n async checkWakeWords() {\n const returnMap = {};\n for (let nameChunk of this.chunkedWakeWords) {\n const wakeWordsCalled = await this.checkWakeWordSubset(nameChunk);\n for (let i = 0; i < nameChunk.length; i++) {\n const name = nameChunk[i];\n const wordCalled = wakeWordsCalled[i];\n returnMap[name] = wordCalled;\n }\n }\n // Winner-take-all (MIE 2026-06-09): the two phrases share the word \"ozwell\" and can\n // co-fire on a single utterance. Since start/stop are mutually exclusive, when more than\n // one wake word crosses its threshold in the same window, fire ONLY the most CONFIDENT one\n // (highest raw probability). NOTE: do NOT compare by margin (prob - threshold) — that biases\n // toward the lower-threshold word (ozwell-done @0.5 out-margins hey-ozwell @0.8 even when you\n // clearly said \"hey ozwell\"). Raw probability is the correct comparison here.\n // Voiceprint layer: cosine-match the live embedding window against each phrase's\n // enrolled voiceprint. Attach the score (for graphing) and use it as a FALLBACK so a\n // user the general model is weak on (e.g. their accent) still triggers on a match.\n const liveVec = this.embeddingBuffer ? this.embeddingBuffer.data : null;\n for (let name in returnMap) {\n returnMap[name].voiceprintSim = this.hasVoiceprint(name)\n ? this.voiceprintSimilarity(name, liveVec) : 0;\n }\n\n // Debounce + PEAK-CAPTURE (per phrase). Track consecutive detected frames (debounce), AND the\n // PEAK-confidence embedding within the current run — so the voiceprint is captured at the\n // best-aligned frame, not wherever debounce happens to commit. Critical for SHORT phrases like\n // \"hey ozwell\": the debounce-fire frame can land on the tail (low/variable cosine), but the peak\n // frame is the real phrase moment (consistent cosine).\n for (let name in returnMap) {\n if (returnMap[name].detected) {\n this._consec[name] = (this._consec[name] || 0) + 1;\n if (returnMap[name].probability > (this._peakProb[name] || 0) && this.embeddingBuffer && this.embeddingBuffer.data) {\n this._peakProb[name] = returnMap[name].probability;\n this._peakEmb[name] = Float32Array.from(this.embeddingBuffer.data);\n }\n } else {\n this._consec[name] = 0; this._peakProb[name] = 0; this._peakEmb[name] = null;\n }\n }\n // Per-phrase debounce: window.__debounceFrames (number) overrides all; else this.debounceFrames may\n // be a number (global) or a {phrase: N} object (per-phrase). Short phrases need a lower N.\n const minRunFor = (name) => {\n if (typeof window.__debounceFrames === \"number\") return window.__debounceFrames;\n if (this.debounceFrames && typeof this.debounceFrames === \"object\") return this.debounceFrames[name] ?? 1;\n return this.debounceFrames || 1;\n };\n // Model winner-take-all (highest raw probability among phrases that have cleared their debounce).\n let best = null;\n for (let name in returnMap) {\n if (returnMap[name].detected && this._consec[name] >= minRunFor(name)) {\n const prob = returnMap[name].probability;\n if (best === null || prob > best.prob) {\n best = { name, prob };\n }\n }\n }\n if (best !== null) {\n // NOTE: lastWakeEmbedding is captured (frozen) INSIDE wakeWordDetected, once per fire, from the\n // run's peak — NOT here every frame (that drifted to later low-confidence frames -> bad cosine).\n this.wakeWordDetected(best.name);\n } else if (this.voiceprintRecall) {\n // RECALL (optional): general model fired nothing -> fall back to the strongest voiceprint\n // match. Off by default in this build — the voiceprint is used for PRECISION (reject) instead.\n let vbest = null;\n for (let name in returnMap) {\n const sim = returnMap[name].voiceprintSim;\n const vt = this.voiceprintThresholds[name] ?? this.voiceprintThreshold;\n // GATE: require the model to at least weakly hear THIS phrase, so the voiceprint\n // can only amplify the real wake word — not fire a different one (\"hey doug\").\n const modelLit = returnMap[name].probability >= this.voiceprintGate;\n if (sim >= vt && modelLit && (vbest === null || sim > vbest.sim)) vbest = { name, sim };\n }\n if (vbest !== null) {\n this.wakeWordDetected(vbest.name);\n }\n }\n return returnMap;\n }\n\n /**\n * Process audio batch.\n * @param {Float32Array} audio - Audio samples.\n */\n async process(audio) {\n // Start timer\n this.frameStart = (new Date()).getTime();\n\n if (this.frameEnd !== undefined && this.frameEnd !== null) {\n this.frameInterval = this.frameStart - this.frameEnd;\n } else {\n this.frameInterval = 0;\n }\n if (this.frameIntervalEma === 0) {\n this.frameIntervalEma = this.frameInterval;\n } else {\n this.frameIntervalEma = this.frameIntervalEma * (1 - this.frameIntervalEmaWeight) + this.frameInterval * this.frameIntervalEmaWeight;\n }\n\n // Get the last batch of samples\n const lastBatch = audio.subarray(audio.length - this.batcher.batchIntervalSamples);\n\n // Calculate the spectrogram for this buffer, assert it is exactly one window\n const spectrograms = await this.spectrogram.run(audio);\n const embedding = await this.embedding.getEmbeddingFromMelSpectrogramOutput(spectrograms);\n const numFramesPerEmbedding = embedding.dims[0];\n const maxEmbeddings = this.wakeWordEmbeddingFrames/numFramesPerEmbedding;\n\n\n // We want to run it via a \"window\" of audio samples at a time\n // so we add a new element, remove the first element, then analyze the new section of audio\n // (or rather audio embeddings) to see if the voice keyword is detected there\n this.embeddingBufferArray.push(embedding);\n if (this.embeddingBufferArray.length > maxEmbeddings) this.embeddingBufferArray.shift();\n\n this.embeddingBuffer = await embeddingBufferArrayToEmbedding(this.embeddingBufferArray, numFramesPerEmbedding, this.embeddingDim);\n\n const {isSpeaking, speechProbability, justStoppedSpeaking, justStartedSpeaking} = await this.vad.hasSpeechAudio(lastBatch);\n\n // Running BACKGROUND mean embedding, updated ONLY during non-speech so it stays an\n // ambient baseline and can't get contaminated by the phrase you're testing. We\n // subtract it in voiceprintSimilarity so cosine reflects content, not the shared\n // common-mode that otherwise pins every comparison near 0.9.\n if (!isSpeaking && this.embeddingBuffer && this.embeddingBuffer.data) {\n const d = this.embeddingBuffer.data;\n if (!this.embeddingMean || this.embeddingMean.length !== d.length) this.embeddingMean = Float32Array.from(d);\n else for (let i = 0; i < d.length; i++) this.embeddingMean[i] += 0.02 * (d[i] - this.embeddingMean[i]);\n }\n\n if(justStartedSpeaking) this.speechStart();\n if(justStoppedSpeaking) this.speechEnd();\n\n if (isSpeaking && this.embeddingBuffer.dims[0] === this.wakeWordEmbeddingFrames) {\n // If we're listening, run wake word detection (overlap is prevented by processBatch).\n const wakeWordsCalled = await this.checkWakeWords();\n // Trigger callbacks with processed data\n this.processed({\n listening: true,\n recording: this.recording,\n speech: {probability: speechProbability, active: isSpeaking},\n wakeWords: wakeWordsCalled,\n // Live [16x96] embedding window (flattened) — what enrollment captures and\n // what the voiceprint layer matches against. Present only while listening.\n embedding: this.embeddingBuffer ? this.embeddingBuffer.data : null\n });\n } else {\n // Trigger callbacks right away if we're not listening\n this.processed({\n listening: false,\n recording: this.recording,\n speech: {probability: speechProbability, active: isSpeaking},\n wakeWords: Object.entries(this.wakeWords).reduce(\n (carry, [name, model]) => {\n carry[name] = {\n probability: 0.0,\n active: false\n };\n return carry;\n },\n {}\n ),\n embedding: this.embeddingBuffer ? this.embeddingBuffer.data : null\n });\n }\n\n // If we're recording, append audio to buffer\n if (this.recording) {\n if (this.audioBuffer === null) {\n this.audioBuffer = new Float32Array(audio.length);\n this.audioBuffer.set(audio);\n } else {\n const concatenated = new Float32Array(this.audioBuffer.length + lastBatch.length);\n concatenated.set(this.audioBuffer);\n concatenated.set(lastBatch, this.audioBuffer.length);\n this.audioBuffer = concatenated;\n }\n }\n\n // Stop timer\n this.frameEnd = (new Date()).getTime();\n this.frameTime = this.frameEnd - this.frameStart;\n if (this.frameTimeEma === 0) {\n this.frameTimeEma = this.frameTime;\n } else {\n this.frameTimeEma = this.frameTimeEma * (1 - this.frameTimeEmaWeight) + this.frameTime * this.frameTimeEmaWeight;\n }\n }\n};\n\nif (typeof window !== \"undefined\") {\n window.HeyBuddy = HeyBuddy;\n}"]}
|