@mastra/react 1.12.0-alpha.10 → 1.12.0-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/{accumulator-C8kIc450.js → accumulator-BfvVnXJr.js} +1 -2
  2. package/dist/{accumulator-C8kIc450.js.map → accumulator-BfvVnXJr.js.map} +1 -1
  3. package/dist/{accumulator-BQGsraqS.cjs → accumulator-CgLQ_3q3.cjs} +1 -2
  4. package/dist/{accumulator-BQGsraqS.cjs.map → accumulator-CgLQ_3q3.cjs.map} +1 -1
  5. package/dist/chat/index.cjs +1 -1
  6. package/dist/chat/index.js +1 -2
  7. package/dist/combine-by-ids-D_lp6Dvq.cjs.map +1 -1
  8. package/dist/hooks/agents/index.cjs +2 -2
  9. package/dist/hooks/agents/index.cjs.map +1 -1
  10. package/dist/hooks/agents/index.js +2 -2
  11. package/dist/hooks/agents/index.js.map +1 -1
  12. package/dist/hooks/auth/index.cjs +2 -2
  13. package/dist/hooks/auth/index.cjs.map +1 -1
  14. package/dist/hooks/auth/index.js +2 -2
  15. package/dist/hooks/auth/index.js.map +1 -1
  16. package/dist/hooks/capabilities/index.cjs +1 -1
  17. package/dist/hooks/capabilities/index.cjs.map +1 -1
  18. package/dist/hooks/capabilities/index.js +1 -1
  19. package/dist/hooks/capabilities/index.js.map +1 -1
  20. package/dist/hooks/configuration/index.cjs.map +1 -1
  21. package/dist/hooks/datasets/index.cjs +1 -1
  22. package/dist/hooks/datasets/index.cjs.map +1 -1
  23. package/dist/hooks/datasets/index.js +1 -1
  24. package/dist/hooks/datasets/index.js.map +1 -1
  25. package/dist/hooks/embedders/index.cjs.map +1 -1
  26. package/dist/hooks/experiments/index.cjs.map +1 -1
  27. package/dist/hooks/feedback/index.cjs.map +1 -1
  28. package/dist/hooks/llm/index.cjs.map +1 -1
  29. package/dist/hooks/logs/index.cjs.map +1 -1
  30. package/dist/hooks/mcps/index.cjs.map +1 -1
  31. package/dist/hooks/memory/index.cjs +10 -10
  32. package/dist/hooks/memory/index.cjs.map +1 -1
  33. package/dist/hooks/memory/index.js +10 -10
  34. package/dist/hooks/memory/index.js.map +1 -1
  35. package/dist/hooks/metrics/index.cjs +13 -11
  36. package/dist/hooks/metrics/index.cjs.map +1 -1
  37. package/dist/hooks/metrics/index.js +13 -11
  38. package/dist/hooks/metrics/index.js.map +1 -1
  39. package/dist/hooks/processors/index.cjs.map +1 -1
  40. package/dist/hooks/prompt-blocks/index.cjs.map +1 -1
  41. package/dist/hooks/query/index.cjs.map +1 -1
  42. package/dist/hooks/review/index.cjs.map +1 -1
  43. package/dist/hooks/schedules/index.cjs.map +1 -1
  44. package/dist/hooks/scores/index.cjs.map +1 -1
  45. package/dist/hooks/templates/index.cjs +20 -18
  46. package/dist/hooks/templates/index.cjs.map +1 -1
  47. package/dist/hooks/templates/index.js +20 -18
  48. package/dist/hooks/templates/index.js.map +1 -1
  49. package/dist/hooks/tool-providers/index.cjs +1 -1
  50. package/dist/hooks/tool-providers/index.cjs.map +1 -1
  51. package/dist/hooks/tool-providers/index.js +1 -1
  52. package/dist/hooks/tool-providers/index.js.map +1 -1
  53. package/dist/hooks/tools/index.cjs.map +1 -1
  54. package/dist/hooks/traces/index.cjs +4 -4
  55. package/dist/hooks/traces/index.cjs.map +1 -1
  56. package/dist/hooks/traces/index.js +4 -4
  57. package/dist/hooks/traces/index.js.map +1 -1
  58. package/dist/hooks/vectors/index.cjs.map +1 -1
  59. package/dist/hooks/voice/index.cjs.map +1 -1
  60. package/dist/hooks/workflows/index.cjs +1 -1
  61. package/dist/hooks/workflows/index.cjs.map +1 -1
  62. package/dist/hooks/workflows/index.js +1 -1
  63. package/dist/hooks/workspace/index.cjs +1 -1
  64. package/dist/hooks/workspace/index.cjs.map +1 -1
  65. package/dist/hooks/workspace/index.js +1 -1
  66. package/dist/hooks/workspace/index.js.map +1 -1
  67. package/dist/{hooks-CIutb3DO.cjs → hooks-B1i-oHae.cjs} +6 -4
  68. package/dist/hooks-B1i-oHae.cjs.map +1 -0
  69. package/dist/{hooks-FVbeHlov.js → hooks-CLfMO5cH.js} +6 -4
  70. package/dist/{hooks-FVbeHlov.js.map → hooks-CLfMO5cH.js.map} +1 -1
  71. package/dist/{hooks-_YevKidX.cjs → hooks-D8nOYPUd.cjs} +2 -2
  72. package/dist/hooks-D8nOYPUd.cjs.map +1 -0
  73. package/dist/{hooks-0L0RNfau.js → hooks-NaZLZreZ.js} +2 -2
  74. package/dist/{hooks-0L0RNfau.js.map → hooks-NaZLZreZ.js.map} +1 -1
  75. package/dist/index.cjs +3 -3
  76. package/dist/index.cjs.map +1 -1
  77. package/dist/index.js +3 -3
  78. package/dist/mastra-client-context-DzX3f0RF.cjs.map +1 -1
  79. package/dist/ui/index.cjs +4 -4
  80. package/dist/ui/index.cjs.map +1 -1
  81. package/dist/ui/index.js +3 -3
  82. package/dist/ui/index.js.map +1 -1
  83. package/dist/use-in-view-B6eJO9Zi.cjs.map +1 -1
  84. package/dist/voice-BOtUdMi8.cjs.map +1 -1
  85. package/package.json +4 -4
  86. package/dist/hooks-CIutb3DO.cjs.map +0 -1
  87. package/dist/hooks-_YevKidX.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["RTooltipProvider","RTooltipRoot","RTooltipPortal","RTooltipContent","RTooltipTrigger"],"sources":["../../src/ui/Icon/Icon.tsx","../../src/ui/Entity/context.tsx","../../src/ui/Entity/Entity.tsx","../../src/ui/Entity/ToolApproval.tsx","../../src/ui/Entity/Entry.tsx","../../src/ui/Tooltip/Tooltip.tsx","../../src/ui/IconButton/IconButton.tsx","../../src/ui/Code/highlight.ts","../../src/ui/Code/Code.tsx","../../src/ui/Icons/AgentIcon.tsx","../../src/ui/Icons/ToolsIcon.tsx","../../src/ui/Icons/WorkflowIcon.tsx","../../src/ui/Message/Message.tsx","../../src/ui/MessageFactory/MessageFactory.tsx"],"sourcesContent":["import React from 'react';\n\nexport interface IconProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const IconSizes = {\n sm: 'mastra:[&>svg]:size-3',\n md: 'mastra:[&>svg]:size-4',\n lg: 'mastra:[&>svg]:size-5',\n};\n\nexport const Icon = ({ children, className, size = 'md', ...props }: IconProps) => {\n return (\n <div className={className || IconSizes[size]} {...props}>\n {children}\n </div>\n );\n};\n","import { createContext, useContext } from 'react';\nimport type { EntityVariant } from './types';\n\nexport type EntityContextType = {\n expanded: boolean;\n setExpanded: (expanded: boolean) => void;\n variant: EntityVariant;\n disabled: boolean;\n};\n\nexport const EntityContext = createContext<EntityContextType>({\n expanded: false,\n setExpanded: () => {},\n variant: 'initial',\n disabled: false,\n});\n\nexport const EntityProvider = EntityContext.Provider;\n\nexport const useEntity = () => useContext(EntityContext);\n","import { ChevronDownIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { Icon } from '../Icon/Icon';\nimport { EntityProvider, useEntity } from './context';\n\nimport type { EntityVariant } from './types';\n\nexport interface EntityProps extends React.ComponentPropsWithoutRef<'div'> {\n variant?: EntityVariant;\n initialExpanded?: boolean;\n disabled?: boolean;\n}\n\nexport const Entity = ({\n className,\n variant = 'initial',\n initialExpanded = false,\n disabled = false,\n ...props\n}: EntityProps) => {\n const [expanded, setExpanded] = useState(initialExpanded);\n\n return (\n <EntityProvider value={{ expanded, setExpanded, variant, disabled }}>\n <div className={className} {...props} />\n </EntityProvider>\n );\n};\n\nexport const EntityTriggerClass = twMerge(\n 'mastra:aria-disabled:cursor-not-allowed mastra:aria-disabled:bg-surface5 mastra:aria-disabled:text-text3',\n 'mastra:aria-expanded:rounded-b-none mastra:aria-expanded:border-b-0',\n 'mastra:bg-surface3 mastra:text-text6 mastra:hover:bg-surface4 mastra:active:bg-surface5',\n 'mastra:rounded-lg mastra:py-2 mastra:px-4 mastra:border mastra:border-border1',\n 'mastra:cursor-pointer mastra:inline-flex mastra:items-center mastra:gap-1 mastra:font-mono',\n);\n\nexport const EntityTriggerVariantClasses: Record<EntityVariant, string> = {\n agent: 'mastra:[&_svg.mastra-icon]:text-accent1',\n workflow: 'mastra:[&_svg.mastra-icon]:text-accent3',\n tool: 'mastra:[&_svg.mastra-icon]:text-accent6',\n memory: 'mastra:[&_svg.mastra-icon]:text-accent2',\n initial: 'mastra:[&_svg.mastra-icon]:text-text3',\n};\n\nexport const EntityTrigger = ({ className, children, ...props }: React.ComponentPropsWithoutRef<'button'>) => {\n const { expanded, setExpanded, variant, disabled } = useEntity();\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n setExpanded(!expanded);\n props?.onClick?.(e);\n };\n\n return (\n <button\n className={className || twMerge(EntityTriggerClass, !disabled && EntityTriggerVariantClasses[variant])}\n {...props}\n onClick={handleClick}\n aria-expanded={expanded}\n aria-disabled={disabled}\n >\n {children}\n </button>\n );\n};\n\nexport const EntityContentClass = twMerge(\n 'mastra:space-y-4',\n 'mastra:rounded-lg mastra:rounded-tl-none mastra:p-4 mastra:border mastra:border-border1 mastra:-mt-[0.5px]',\n 'mastra:bg-surface3 mastra:text-text6',\n);\n\nexport const EntityContent = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n const { expanded } = useEntity();\n\n if (!expanded) return null;\n\n return <div className={className || EntityContentClass} {...props} />;\n};\n\nexport const EntityCaret = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n const { expanded } = useEntity();\n\n return (\n <Icon>\n <ChevronDownIcon\n className={twMerge(\n `mastra:text-text3 mastra:transition-transform mastra:duration-200 mastra:ease-in-out`,\n expanded ? 'mastra:rotate-0' : 'mastra:-rotate-90',\n className,\n )}\n {...props}\n />\n </Icon>\n );\n};\n","import { twMerge } from 'tailwind-merge';\n\nexport const ToolApprovalClass = twMerge(\n 'mastra:rounded-lg mastra:border mastra:border-border1 mastra:max-w-1/2 mastra:mt-2',\n 'mastra:bg-surface3 mastra:text-text6',\n);\n\nexport const ToolApproval = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalClass} {...props} />;\n};\n\nexport const ToolApprovalTitleClass = twMerge('mastra:text-text6 mastra:inline-flex mastra:items-center mastra:gap-1');\nexport const ToolApprovalTitle = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalTitleClass} {...props} />;\n};\n\nexport const ToolApprovalHeaderClass = twMerge(\n 'mastra:flex mastra:justify-between mastra:items-center mastra:gap-2',\n 'mastra:border-b mastra:border-border1 mastra:px-4 mastra:py-2',\n);\nexport const ToolApprovalHeader = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalHeaderClass} {...props} />;\n};\n\nexport const ToolApprovalContentClass = twMerge('mastra:text-text6 mastra:p-4');\nexport const ToolApprovalContent = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalContentClass} {...props} />;\n};\n\nexport const ToolApprovalActionsClass = twMerge('mastra:flex mastra:gap-2 mastra:items-center');\nexport const ToolApprovalActions = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalActionsClass} {...props} />;\n};\n","import type { ElementType } from 'react';\n\nexport const EntryClass = 'mastra:space-y-2';\nexport const Entry = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || EntryClass} {...props} />;\n};\n\ntype EntryTitleProps = React.ComponentPropsWithoutRef<'div'> & {\n as?: ElementType;\n};\n\nexport const EntryTitleClass = 'mastra:font-mono mastra:text-sm mastra:text-text3';\nexport const EntryTitle = ({ className, as: Root = 'h3', ...props }: EntryTitleProps) => {\n return <Root className={className || EntryTitleClass} {...props} />;\n};\n","import type { TooltipTriggerProps, TooltipContentProps } from '@radix-ui/react-tooltip';\nimport {\n TooltipTrigger as RTooltipTrigger,\n TooltipProvider as RTooltipProvider,\n Root as RTooltipRoot,\n TooltipPortal as RTooltipPortal,\n TooltipContent as RTooltipContent,\n} from '@radix-ui/react-tooltip';\n\nexport interface TooltipProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n}\n\nexport const Tooltip = ({ children }: TooltipProps) => {\n return (\n <RTooltipProvider>\n <RTooltipRoot>{children}</RTooltipRoot>\n </RTooltipProvider>\n );\n};\n\nexport const TooltipContentClass =\n 'mastra:bg-surface4 mastra:text-text6 mastra mastra:rounded-lg mastra:py-1 mastra:px-2 mastra:text-xs mastra:border mastra:border-border1 mastra-tooltip-enter';\nexport const TooltipContent = ({ children, className, ...props }: TooltipContentProps) => {\n return (\n <RTooltipPortal>\n <RTooltipContent className={className || TooltipContentClass} {...props}>\n {children}\n </RTooltipContent>\n </RTooltipPortal>\n );\n};\n\nexport const TooltipTrigger = (props: TooltipTriggerProps) => {\n return <RTooltipTrigger {...props} asChild />;\n};\n","import { twMerge } from 'tailwind-merge';\nimport type { IconProps } from '../Icon/Icon';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../Tooltip/Tooltip';\n\nexport interface IconButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n children: React.ReactNode;\n tooltip: React.ReactNode;\n size?: IconProps['size'];\n}\n\nexport const IconButtonClass =\n 'mastra:text-text3 mastra:hover:text-text6 mastra:active:text-text6 mastra:hover:bg-surface4 mastra:active:bg-surface5 mastra:rounded-md mastra:cursor-pointer';\n\nexport const IconButton = ({ children, tooltip, size = 'md', className, ...props }: IconButtonProps) => {\n return (\n <Tooltip>\n <TooltipTrigger>\n <button\n {...props}\n className={\n className || twMerge(IconButtonClass, size === 'md' && 'mastra:p-0.5', size === 'lg' && 'mastra:p-1')\n }\n >\n <Icon size={size}>{children}</Icon>\n </button>\n </TooltipTrigger>\n\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n};\n","import { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport type { JSX } from 'react';\nimport { Fragment } from 'react';\nimport { jsx, jsxs } from 'react/jsx-runtime';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport { codeToHast } from 'shiki/bundle/web';\n\nexport async function highlight(code: string, lang: BundledLanguage) {\n const out = await codeToHast(code, {\n lang,\n theme: 'dracula-soft',\n });\n\n return toJsxRuntime(out, {\n Fragment,\n jsx,\n jsxs,\n }) as JSX.Element;\n}\n","import { CheckIcon, CopyIcon } from 'lucide-react';\nimport type { JSX } from 'react';\nimport { useLayoutEffect, useState } from 'react';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport { IconButton } from '../IconButton/IconButton';\nimport { highlight } from './highlight';\n\nexport interface CodeBlockProps {\n code: string;\n language: BundledLanguage;\n className?: string;\n cta?: React.ReactNode;\n}\n\nexport const CodeBlockClass =\n 'mastra:rounded-lg mastra:[&>pre]:p-4 mastra:overflow-hidden mastra:[&>pre]:!bg-surface4 mastra:[&>pre>code]:leading-5 mastra:relative';\n\nexport const CodeBlock = ({ code, language, className, cta }: CodeBlockProps) => {\n const [nodes, setNodes] = useState<JSX.Element | null>(null);\n\n useLayoutEffect(() => {\n void highlight(code, language).then(setNodes);\n }, [language]);\n\n return (\n <div className={className || CodeBlockClass}>\n {nodes ?? null}\n {cta}\n </div>\n );\n};\n\nexport interface CodeCopyButtonProps {\n code: string;\n}\n\nexport const CodeCopyButton = ({ code }: CodeCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n };\n return (\n <div className=\"mastra:absolute mastra:top-2 mastra:right-2\">\n <IconButton tooltip=\"Copy\" onClick={handleCopy}>\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n </IconButton>\n </div>\n );\n};\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport const AgentIcon = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n className={twMerge('mastra-icon', className)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8.5 15C10.3565 15 12.137 14.2625 13.4497 12.9497C14.7625 11.637 15.5 9.85652 15.5 8C15.5 6.14348 14.7625 4.36301 13.4497 3.05025C12.137 1.7375 10.3565 1 8.5 1C6.64348 1 4.86301 1.7375 3.55025 3.05025C2.2375 4.36301 1.5 6.14348 1.5 8C1.5 9.85652 2.2375 11.637 3.55025 12.9497C4.86301 14.2625 6.64348 15 8.5 15ZM5.621 10.879L4.611 11.889C3.84179 11.1198 3.31794 10.1398 3.1057 9.07291C2.89346 8.00601 3.00236 6.90013 3.41864 5.89512C3.83491 4.89012 4.53986 4.03112 5.44434 3.42676C6.34881 2.8224 7.41219 2.49983 8.5 2.49983C9.58781 2.49983 10.6512 2.8224 11.5557 3.42676C12.4601 4.03112 13.1651 4.89012 13.5814 5.89512C13.9976 6.90013 14.1065 8.00601 13.8943 9.07291C13.6821 10.1398 13.1582 11.1198 12.389 11.889L11.379 10.879C11.1004 10.6003 10.7696 10.3792 10.4055 10.2284C10.0414 10.0776 9.6511 9.99995 9.257 10H7.743C7.3489 9.99995 6.95865 10.0776 6.59455 10.2284C6.23045 10.3792 5.89963 10.6003 5.621 10.879Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M8.5 4C7.96957 4 7.46086 4.21071 7.08579 4.58579C6.71071 4.96086 6.5 5.46957 6.5 6V6.5C6.5 7.03043 6.71071 7.53914 7.08579 7.91421C7.46086 8.28929 7.96957 8.5 8.5 8.5C9.03043 8.5 9.53914 8.28929 9.91421 7.91421C10.2893 7.53914 10.5 7.03043 10.5 6.5V6C10.5 5.46957 10.2893 4.96086 9.91421 4.58579C9.53914 4.21071 9.03043 4 8.5 4Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport const ToolsIcon = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n className={twMerge('mastra-icon', className)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.5605 1.42351C8.0791 0.904904 8.92215 0.906157 9.4395 1.42351L10.6922 2.67617C11.2108 3.19477 11.2095 4.03782 10.6922 4.55517L9.4395 5.80783C8.9209 6.32643 8.07785 6.32518 7.5605 5.80783L6.30784 4.55517C5.78923 4.03656 5.79049 3.19352 6.30784 2.67617L7.5605 1.42351ZM3.17618 5.80783C3.69478 5.28923 4.53782 5.29048 5.05517 5.80783L6.30784 7.0605C6.82644 7.5791 6.82519 8.42214 6.30784 8.93949L5.05517 10.1922C4.53657 10.7108 3.69353 10.7095 3.17618 10.1922L1.92351 8.93949C1.40491 8.42089 1.40616 7.57785 1.92351 7.0605L3.17618 5.80783ZM11.9448 5.80783C12.4634 5.28923 13.3065 5.29048 13.8238 5.80783L15.0765 7.0605C15.5951 7.5791 15.5938 8.42214 15.0765 8.93949L13.8238 10.1922C13.3052 10.7108 12.4622 10.7095 11.9448 10.1922L10.6922 8.93949C10.1736 8.42089 10.1748 7.57785 10.6922 7.0605L11.9448 5.80783ZM7.5605 10.1922C8.0791 9.67355 8.92215 9.67481 9.4395 10.1922L10.6922 11.4448C11.2108 11.9634 11.2095 12.8065 10.6922 13.3238L9.4395 14.5765C8.9209 15.0951 8.07785 15.0938 7.5605 14.5765L6.30784 13.3238C5.78923 12.8052 5.79049 11.9622 6.30784 11.4448L7.5605 10.1922Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport const WorkflowIcon = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n className={twMerge('mastra-icon', className)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.24388 2.4018C6.24388 2.0394 6.53767 1.74561 6.90008 1.74561H10.0991C10.4614 1.74561 10.7553 2.0394 10.7553 2.4018V4.57546C10.7553 4.93787 10.4614 5.23166 10.0991 5.23166H9.31982V7.35469L10.0033 9.22664C9.90442 9.20146 9.80035 9.1761 9.6915 9.14986L9.62652 9.13422C9.30473 9.05687 8.92256 8.96501 8.61993 8.84491C8.5819 8.82981 8.54147 8.81292 8.49957 8.79391C8.45767 8.81292 8.41724 8.82981 8.3792 8.84491C8.07657 8.96501 7.6944 9.05687 7.37261 9.13422L7.30763 9.14986C7.19879 9.1761 7.09471 9.20146 6.99577 9.22664L7.67932 7.35469V5.23166H6.90008C6.53767 5.23166 6.24388 4.93787 6.24388 4.57546V2.4018ZM6.99577 9.22664C6.99577 9.22664 6.99578 9.22664 6.99577 9.22664L6.43283 10.7683H6.81806C7.18047 10.7683 7.47426 11.0622 7.47426 11.4245V13.5982C7.47426 13.9606 7.18047 14.2544 6.81806 14.2544H3.61909C3.25668 14.2544 2.96289 13.9606 2.96289 13.5982V11.4245C2.96289 11.0622 3.25668 10.7683 3.61909 10.7683H4.26617C4.2921 10.4663 4.32783 10.1494 4.37744 9.85171C4.43762 9.49063 4.52982 9.08135 4.68998 8.76102C4.93975 8.2615 5.44743 8.01751 5.7771 7.88788C6.14684 7.74249 6.57537 7.63889 6.92317 7.55505C7.24707 7.47696 7.49576 7.41679 7.67932 7.35469L6.99577 9.22664ZM6.43283 10.7683L6.99577 9.22664C6.75846 9.28705 6.55067 9.34646 6.37745 9.41458C6.22784 9.47341 6.1623 9.51712 6.14023 9.53254C6.09752 9.63631 6.04409 9.83055 5.99562 10.1214C5.96201 10.3231 5.93498 10.5439 5.91341 10.7683H6.43283ZM10.0033 9.22664L9.31982 7.35469C9.50338 7.41679 9.75206 7.47696 10.076 7.55505C10.4238 7.63889 10.8523 7.74249 11.2221 7.88788C11.5517 8.01751 12.0594 8.2615 12.3091 8.76102C12.4693 9.08135 12.5615 9.49063 12.6217 9.85171C12.6713 10.1494 12.707 10.4663 12.733 10.7683H13.38C13.7424 10.7683 14.0362 11.0622 14.0362 11.4245V13.5982C14.0362 13.9606 13.7424 14.2544 13.38 14.2544H10.1811C9.81867 14.2544 9.52488 13.9606 9.52488 13.5982V11.4245C9.52488 11.0622 9.81867 10.7683 10.1811 10.7683H10.5663L10.0033 9.22664ZM10.0033 9.22664L10.5663 10.7683H11.0857C11.0642 10.5439 11.0372 10.3231 11.0035 10.1214C10.9551 9.83055 10.9016 9.63631 10.8589 9.53254C10.8369 9.51712 10.7713 9.47341 10.6217 9.41458C10.4485 9.34646 10.2407 9.28705 10.0033 9.22664Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import type { HTMLAttributes } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport interface MessageProps extends HTMLAttributes<HTMLDivElement> {\n position: 'left' | 'right';\n}\n\nexport const MessageClass = 'mastra:flex mastra:flex-col mastra:w-full mastra:py-4 mastra:gap-2 mastra:group';\nexport const Message = ({ position, className, children, ...props }: MessageProps) => {\n return (\n <div\n className={\n className ||\n twMerge(\n MessageClass,\n position === 'left'\n ? ''\n : 'mastra:items-end mastra:[&_.mastra-message-content]:bg-surface4 mastra:[&_.mastra-message-content]:px-4',\n )\n }\n {...props}\n >\n {children}\n </div>\n );\n};\n\nexport interface MessageContentProps extends HTMLAttributes<HTMLDivElement> {\n isStreaming?: boolean;\n}\nexport const MessageContentClass =\n 'mastra:max-w-4/5 mastra:py-2 mastra:text-text6 mastra:rounded-lg mastra-message-content mastra:text-md';\nexport const MessageContent = ({ children, className, isStreaming, ...props }: MessageContentProps) => {\n return (\n <div className={className || MessageContentClass} {...props}>\n {children}\n {isStreaming && <MessageStreaming />}\n </div>\n );\n};\n\nexport const MessageActionsClass =\n 'mastra:gap-2 mastra:flex mastra:opacity-0 mastra:group-hover:opacity-100 mastra:group-focus-within:opacity-100 mastra:items-center';\nexport const MessageActions = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => {\n return (\n <div className={className || MessageActionsClass} {...props}>\n {children}\n </div>\n );\n};\n\nexport const MessageUsagesClass = 'mastra:flex mastra:gap-2 mastra:items-center';\nexport const MessageUsages = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => {\n return (\n <div className={className || MessageUsagesClass} {...props}>\n {children}\n </div>\n );\n};\n\nexport const MessageUsageClass =\n 'mastra:flex mastra:gap-2 mastra:items-center mastra:font-mono mastra:text-xs mastra:bg-surface3 mastra:rounded-lg mastra:px-2 mastra:py-1';\nexport const MessageUsage = ({ children, className, ...props }: HTMLAttributes<HTMLDListElement>) => {\n return (\n <dl className={className || MessageUsageClass} {...props}>\n {children}\n </dl>\n );\n};\n\nexport const MessageUsageEntryClass = 'mastra:text-text3 mastra:text-xs mastra:flex mastra:gap-1 mastra:items-center';\nexport const MessageUsageEntry = ({ children, className, ...props }: HTMLAttributes<HTMLSpanElement>) => {\n return (\n <dt className={className || MessageUsageEntryClass} {...props}>\n {children}\n </dt>\n );\n};\n\nexport const MessageUsageValueClass = 'mastra:text-text6 mastra:text-xs';\nexport const MessageUsageValue = ({ children, className, ...props }: HTMLAttributes<HTMLSpanElement>) => {\n return (\n <dd className={className || MessageUsageValueClass} {...props}>\n {children}\n </dd>\n );\n};\n\nexport const MessageListClass = 'mastra:overflow-y-auto mastra:h-full mastra-list';\n\nexport const MessageList = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n // Force scroll to bottom after DOM update\n const scrollToBottom = () => {\n if (!listRef.current) return;\n listRef.current.scrollTo({ top: listRef.current.scrollHeight, behavior: 'smooth' });\n };\n\n requestAnimationFrame(scrollToBottom);\n });\n\n return (\n <div className={className || MessageListClass} {...props} ref={listRef}>\n {children}\n </div>\n );\n};\n\nexport const MessageStreamingClass =\n 'mastra:inline-block mastra:w-[2px] mastra:h-[1em] mastra:bg-text5 mastra:ml-0.5 mastra:align-text-bottom mastra:animate-pulse';\n\nexport const MessageStreaming = ({ className, ...props }: HTMLAttributes<HTMLSpanElement>) => {\n return <span className={className || MessageStreamingClass} {...props} />;\n};\n","import type { MastraDBMessage, AIV5Type } from '@mastra/core/agent/message-list';\nimport type { ReactNode } from 'react';\nimport { memo } from 'react';\nimport type { AccumulatorPart, MastraDBMessageMetadata } from '../../lib/mastra-db';\nimport type {\n DataPart,\n DynamicToolPart,\n MessageFactoryPart,\n MessageRenderers,\n MessageRoleRendererProps,\n MessageRoleRenderers,\n MessageStatusRenderers,\n PartByType,\n} from './types';\n\nexport interface MessageFactoryProps extends MessageRenderers {\n /** The message whose `content.parts` are rendered. */\n message: MastraDBMessage;\n /** Optional wrappers keyed off `message.role`. */\n roles?: MessageRoleRenderers;\n /** Optional message-level slots dispatched off `message.content.metadata`. */\n status?: MessageStatusRenderers;\n /** Rendered for any part that has no matching renderer. Defaults to `null`. */\n fallback?: (part: AccumulatorPart | DynamicToolPart) => ReactNode;\n}\n\n/** A part as it actually appears at runtime, including boundary-cast tool parts. */\ntype RuntimePart = MessageFactoryPart;\n\nconst isDynamicToolPart = (part: RuntimePart): part is DynamicToolPart =>\n // `tool-invocation` is the v4 typed discriminant and must NOT be treated as a\n // v5 `tool-${string}` streaming part, even though it shares the `tool-` prefix.\n part.type === 'dynamic-tool' || (part.type.startsWith('tool-') && part.type !== 'tool-invocation');\n\nconst isDataPart = (part: RuntimePart): part is DataPart => part.type.startsWith('data-');\n\n/**\n * Normalize the legacy persisted `type: 'source'` part (nested\n * `source: { id, url, title }`) into the flat `AIV5Type.SourceUrlUIPart` shape\n * the runtime accumulator emits, so the `SourceUrl` renderer receives one\n * stable prop contract regardless of which discriminant produced the citation.\n */\nconst sourceToSourceUrl = (part: PartByType<'source'>): AIV5Type.SourceUrlUIPart => ({\n type: 'source-url',\n sourceId: part.source.id,\n url: part.source.url,\n title: part.source.title,\n providerMetadata: part.providerMetadata,\n});\n\n/**\n * Resolve a stable key for a part so unchanged parts keep their identity across\n * streaming updates (and don't needlessly re-render).\n */\nconst getPartKey = (part: RuntimePart, index: number): string => {\n if (isDynamicToolPart(part)) {\n return part.toolCallId ?? `${part.type}-${index}`;\n }\n switch (part.type) {\n case 'text': {\n // Intrinsic cast: the `'text'`-narrowed member is `(v4 text part) | MastraTextPart`;\n // only `MastraTextPart` carries `textId`, so this is an optional structural read.\n // Include index so two segments with the same textId (e.g. DeepSeek reuses txt-0)\n // get distinct keys after interleaved tool calls.\n // NOTE: mixing index into the key assumes parts are append-only during\n // streaming (they are today — the accumulator only pushes). If a part is\n // ever inserted ahead of a streaming text block, the trailing indices shift\n // and those text nodes remount. Revisit this key if insertion is added.\n const textId = (part as { textId?: string }).textId;\n return textId ? `${textId}-${index}` : `text-${index}`;\n }\n case 'reasoning':\n // Intrinsic cast: same as `textId` — only the Mastra reasoning member has `reasoningId`.\n return (part as { reasoningId?: string }).reasoningId ?? `reasoning-${index}`;\n case 'tool-invocation':\n return part.toolInvocation.toolCallId ?? `tool-invocation-${index}`;\n case 'source-url':\n return part.sourceId || `source-url-${index}`;\n case 'source':\n return part.source.id ?? `source-${index}`;\n default:\n break;\n }\n // Intrinsic cast: fallback key over a heterogeneous union whose members do not\n // share an `id` field; an optional structural read is the minimal honest form.\n const id = (part as { id?: string }).id;\n return id ?? `${part.type}-${index}`;\n};\n\n/**\n * Dispatch a single part to the one matching renderer. Only the renderer whose\n * discriminant matches `part.type` is invoked, so unrelated renderers never run\n * for a given part. Returns `fallback?.(part) ?? null` when no renderer matches.\n */\nconst renderPart = (\n part: RuntimePart,\n renderers: MessageRenderers,\n fallback?: MessageFactoryProps['fallback'],\n): ReactNode => {\n // Runtime-only tool parts (`dynamic-tool` / `tool-${string}`) are not in the\n // typed union, so they are dispatched explicitly before the typed switch.\n if (isDynamicToolPart(part)) {\n return renderers.DynamicTool?.(part) ?? fallback?.(part) ?? null;\n }\n\n // `data-${string}` cannot be a `case` label, so match it by prefix first.\n if (isDataPart(part)) {\n return renderers.Data?.(part) ?? fallback?.(part) ?? null;\n }\n\n switch (part.type) {\n case 'text':\n return renderers.Text?.(part) ?? fallback?.(part) ?? null;\n case 'reasoning':\n return renderers.Reasoning?.(part) ?? fallback?.(part) ?? null;\n case 'file':\n return renderers.File?.(part) ?? fallback?.(part) ?? null;\n case 'step-start':\n // `step-start` is an internal step-framing marker with no user-facing\n // content. Absent an explicit opt-in renderer it renders nothing and is\n // intentionally NOT routed to `fallback`.\n return renderers.StepStart?.(part) ?? null;\n case 'error':\n // Terminal errors are stored for history but have no built-in visual\n // treatment. Let consumers opt into rendering them through `fallback`.\n return renderers.Error?.(part) ?? fallback?.(part) ?? null;\n case 'tool-invocation':\n return renderers.ToolInvocation?.(part) ?? fallback?.(part) ?? null;\n case 'source':\n // Legacy nested `type: 'source'` part — normalize to the flat shape the\n // `SourceUrl` renderer expects so both discriminants share one contract.\n return renderers.SourceUrl?.(sourceToSourceUrl(part)) ?? fallback?.(part) ?? null;\n case 'source-url':\n // Flat runtime/V5 citation part emitted by the accumulator.\n return renderers.SourceUrl?.(part) ?? fallback?.(part) ?? null;\n case 'source-document':\n return renderers.SourceDocument?.(part) ?? fallback?.(part) ?? null;\n default: {\n // Compile-time exhaustiveness: if a new TYPED part discriminant is added\n // to the union and not handled above, this assignment fails to compile.\n const _exhaustive: never = part;\n void _exhaustive;\n // Runtime-only / unrecognized parts degrade gracefully.\n return fallback?.(part) ?? null;\n }\n }\n};\n\ninterface PartRendererProps {\n part: RuntimePart;\n renderers: MessageRenderers;\n fallback?: MessageFactoryProps['fallback'];\n}\n\n/**\n * Memoized per-part renderer. Keeping each part isolated means a streaming\n * update to one part does not re-render the completed parts around it.\n */\nconst PartRenderer = memo(({ part, renderers, fallback }: PartRendererProps) => (\n <>{renderPart(part, renderers, fallback)}</>\n));\nPartRenderer.displayName = 'PartRenderer';\n\n/**\n * Concatenate the text of every `text` part into a single string. Used as the\n * body forwarded to the replacement (`Tripwire`/`Warning`/`Error`) and adjacent\n * (`Task`) status slots, so consumers don't re-derive it from parts.\n */\nconst joinText = (parts: RuntimePart[]): string =>\n parts\n .filter((part): part is PartByType<'text'> => part.type === 'text')\n .map(part => part.text)\n .join('');\n\n/**\n * Normalize the two task-completion metadata fields into one\n * `{ passed, suppressFeedback }` verdict, or `undefined` when neither is set.\n * `completionResult` (network mode) takes precedence; `isTaskCompleteResult`\n * (supervisor mode) is the fallback. Both share the same persisted shape.\n */\nconst resolveTaskVerdict = (\n metadata: MastraDBMessageMetadata | undefined,\n): { passed: boolean; suppressFeedback?: boolean } | undefined => {\n const verdict = metadata?.completionResult ?? metadata?.isTaskCompleteResult;\n if (!verdict) return undefined;\n return { passed: !!verdict.passed, suppressFeedback: verdict.suppressFeedback };\n};\n\nconst roleRendererFor = (\n role: MastraDBMessage['role'],\n roles?: MessageRoleRenderers,\n): ((props: MessageRoleRendererProps) => ReactNode) | undefined => {\n switch (role) {\n case 'user':\n return roles?.User;\n case 'assistant':\n return roles?.Assistant;\n case 'system':\n return roles?.System;\n case 'signal':\n return roles?.Signal;\n default:\n return undefined;\n }\n};\n\nconst MessageFactoryComponent = ({ message, roles, status, fallback, ...renderers }: MessageFactoryProps) => {\n // `MastraMessagePart[]` widens into `RuntimePart[]` (`AccumulatorPart` is a\n // member of `MessageFactoryPart`), so no cast is needed here.\n const parts: RuntimePart[] = message.content.parts ?? [];\n // Intrinsic cast: core types `content.metadata` as `Record<string, unknown>`\n // (message-list/state/types.ts), so narrowing to the SDK's typed metadata\n // shape requires a cast. This matches the convention used across the accumulator.\n const metadata = message.content.metadata as MastraDBMessageMetadata | undefined;\n\n // Replacement status slots: when the message-level status matches and a slot\n // is provided, the slot renders *instead of* the parts walk. If the status\n // matches but no slot is provided, fall through to the normal parts walk.\n let content: ReactNode;\n if (metadata?.status === 'tripwire' && status?.Tripwire) {\n content = status.Tripwire({ text: joinText(parts), tripwire: metadata.tripwire, message });\n } else if (metadata?.status === 'warning' && status?.Warning) {\n content = status.Warning({ text: joinText(parts), message });\n } else if (metadata?.status === 'error' && status?.Error) {\n content = status.Error({ text: joinText(parts), message });\n } else {\n content = (\n <>\n {parts.map((part, index) => (\n <PartRenderer key={getPartKey(part, index)} part={part} renderers={renderers} fallback={fallback} />\n ))}\n </>\n );\n\n // Wrapping `Pending` slot: when the optimistic user bubble is still\n // \"sending\", wrap the parts walk so the consumer can apply a sending style\n // without the message disappearing from the list.\n if (metadata?.status === 'pending' && status?.Pending) {\n content = status.Pending({ children: content, text: joinText(parts), message });\n }\n\n // Adjacent `Task` slot: when a completion verdict exists it renders after\n // the parts. The factory always invokes `Task` when a verdict is present —\n // it does not filter on `suppressFeedback` (the consumer decides).\n const verdict = resolveTaskVerdict(metadata);\n if (verdict && status?.Task) {\n content = (\n <>\n {content}\n {status.Task({ ...verdict, text: joinText(parts), message })}\n </>\n );\n }\n }\n\n const RoleWrapper = roleRendererFor(message.role, roles);\n if (RoleWrapper) {\n return <>{RoleWrapper({ message, children: content })}</>;\n }\n\n return <>{content}</>;\n};\n\n/**\n * Renders a single {@link MastraDBMessage} by dispatching each part in\n * `content.parts` to an optional, type-safe, per-part-type render function.\n * Only the renderer matching a part's `type` is invoked, and each renderer\n * receives fully narrowed props.\n */\nexport const MessageFactory = memo(MessageFactoryComponent);\nMessageFactory.displayName = 'MessageFactory';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["RTooltipProvider","RTooltipRoot","RTooltipPortal","RTooltipContent","RTooltipTrigger"],"sources":["../../src/ui/Icon/Icon.tsx","../../src/ui/Entity/context.tsx","../../src/ui/Entity/Entity.tsx","../../src/ui/Entity/ToolApproval.tsx","../../src/ui/Entity/Entry.tsx","../../src/ui/Tooltip/Tooltip.tsx","../../src/ui/IconButton/IconButton.tsx","../../src/ui/Code/highlight.ts","../../src/ui/Code/Code.tsx","../../src/ui/Icons/AgentIcon.tsx","../../src/ui/Icons/ToolsIcon.tsx","../../src/ui/Icons/WorkflowIcon.tsx","../../src/ui/Message/Message.tsx","../../src/ui/MessageFactory/MessageFactory.tsx"],"sourcesContent":["import React from 'react';\n\nexport interface IconProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const IconSizes = {\n sm: 'mastra:[&>svg]:size-3',\n md: 'mastra:[&>svg]:size-4',\n lg: 'mastra:[&>svg]:size-5',\n};\n\nexport const Icon = ({ children, className, size = 'md', ...props }: IconProps) => {\n return (\n <div className={className || IconSizes[size]} {...props}>\n {children}\n </div>\n );\n};\n","import { createContext, useContext } from 'react';\nimport type { EntityVariant } from './types';\n\nexport type EntityContextType = {\n expanded: boolean;\n setExpanded: (expanded: boolean) => void;\n variant: EntityVariant;\n disabled: boolean;\n};\n\nexport const EntityContext = createContext<EntityContextType>({\n expanded: false,\n setExpanded: () => {},\n variant: 'initial',\n disabled: false,\n});\n\nexport const EntityProvider = EntityContext.Provider;\n\nexport const useEntity = () => useContext(EntityContext);\n","import { ChevronDownIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport { Icon } from '../Icon/Icon';\nimport { EntityProvider, useEntity } from './context';\n\nimport type { EntityVariant } from './types';\n\nexport interface EntityProps extends React.ComponentPropsWithoutRef<'div'> {\n variant?: EntityVariant;\n initialExpanded?: boolean;\n disabled?: boolean;\n}\n\nexport const Entity = ({\n className,\n variant = 'initial',\n initialExpanded = false,\n disabled = false,\n ...props\n}: EntityProps) => {\n const [expanded, setExpanded] = useState(initialExpanded);\n\n return (\n <EntityProvider value={{ expanded, setExpanded, variant, disabled }}>\n <div className={className} {...props} />\n </EntityProvider>\n );\n};\n\nexport const EntityTriggerClass = twMerge(\n 'mastra:aria-disabled:cursor-not-allowed mastra:aria-disabled:bg-surface5 mastra:aria-disabled:text-text3',\n 'mastra:aria-expanded:rounded-b-none mastra:aria-expanded:border-b-0',\n 'mastra:bg-surface3 mastra:text-text6 mastra:hover:bg-surface4 mastra:active:bg-surface5',\n 'mastra:rounded-lg mastra:py-2 mastra:px-4 mastra:border mastra:border-border1',\n 'mastra:cursor-pointer mastra:inline-flex mastra:items-center mastra:gap-1 mastra:font-mono',\n);\n\nexport const EntityTriggerVariantClasses: Record<EntityVariant, string> = {\n agent: 'mastra:[&_svg.mastra-icon]:text-accent1',\n workflow: 'mastra:[&_svg.mastra-icon]:text-accent3',\n tool: 'mastra:[&_svg.mastra-icon]:text-accent6',\n memory: 'mastra:[&_svg.mastra-icon]:text-accent2',\n initial: 'mastra:[&_svg.mastra-icon]:text-text3',\n};\n\nexport const EntityTrigger = ({ className, children, ...props }: React.ComponentPropsWithoutRef<'button'>) => {\n const { expanded, setExpanded, variant, disabled } = useEntity();\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return;\n setExpanded(!expanded);\n props?.onClick?.(e);\n };\n\n return (\n <button\n className={className || twMerge(EntityTriggerClass, !disabled && EntityTriggerVariantClasses[variant])}\n {...props}\n onClick={handleClick}\n aria-expanded={expanded}\n aria-disabled={disabled}\n >\n {children}\n </button>\n );\n};\n\nexport const EntityContentClass = twMerge(\n 'mastra:space-y-4',\n 'mastra:rounded-lg mastra:rounded-tl-none mastra:p-4 mastra:border mastra:border-border1 mastra:-mt-[0.5px]',\n 'mastra:bg-surface3 mastra:text-text6',\n);\n\nexport const EntityContent = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n const { expanded } = useEntity();\n\n if (!expanded) return null;\n\n return <div className={className || EntityContentClass} {...props} />;\n};\n\nexport const EntityCaret = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => {\n const { expanded } = useEntity();\n\n return (\n <Icon>\n <ChevronDownIcon\n className={twMerge(\n `mastra:text-text3 mastra:transition-transform mastra:duration-200 mastra:ease-in-out`,\n expanded ? 'mastra:rotate-0' : 'mastra:-rotate-90',\n className,\n )}\n {...props}\n />\n </Icon>\n );\n};\n","import { twMerge } from 'tailwind-merge';\n\nexport const ToolApprovalClass = twMerge(\n 'mastra:rounded-lg mastra:border mastra:border-border1 mastra:max-w-1/2 mastra:mt-2',\n 'mastra:bg-surface3 mastra:text-text6',\n);\n\nexport const ToolApproval = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalClass} {...props} />;\n};\n\nexport const ToolApprovalTitleClass = twMerge('mastra:text-text6 mastra:inline-flex mastra:items-center mastra:gap-1');\nexport const ToolApprovalTitle = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalTitleClass} {...props} />;\n};\n\nexport const ToolApprovalHeaderClass = twMerge(\n 'mastra:flex mastra:justify-between mastra:items-center mastra:gap-2',\n 'mastra:border-b mastra:border-border1 mastra:px-4 mastra:py-2',\n);\nexport const ToolApprovalHeader = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalHeaderClass} {...props} />;\n};\n\nexport const ToolApprovalContentClass = twMerge('mastra:text-text6 mastra:p-4');\nexport const ToolApprovalContent = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalContentClass} {...props} />;\n};\n\nexport const ToolApprovalActionsClass = twMerge('mastra:flex mastra:gap-2 mastra:items-center');\nexport const ToolApprovalActions = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || ToolApprovalActionsClass} {...props} />;\n};\n","import type { ElementType } from 'react';\n\nexport const EntryClass = 'mastra:space-y-2';\nexport const Entry = ({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) => {\n return <div className={className || EntryClass} {...props} />;\n};\n\ntype EntryTitleProps = React.ComponentPropsWithoutRef<'div'> & {\n as?: ElementType;\n};\n\nexport const EntryTitleClass = 'mastra:font-mono mastra:text-sm mastra:text-text3';\nexport const EntryTitle = ({ className, as: Root = 'h3', ...props }: EntryTitleProps) => {\n return <Root className={className || EntryTitleClass} {...props} />;\n};\n","import type { TooltipTriggerProps, TooltipContentProps } from '@radix-ui/react-tooltip';\nimport {\n TooltipTrigger as RTooltipTrigger,\n TooltipProvider as RTooltipProvider,\n Root as RTooltipRoot,\n TooltipPortal as RTooltipPortal,\n TooltipContent as RTooltipContent,\n} from '@radix-ui/react-tooltip';\n\nexport interface TooltipProps extends React.ComponentPropsWithoutRef<'div'> {\n children: React.ReactNode;\n}\n\nexport const Tooltip = ({ children }: TooltipProps) => {\n return (\n <RTooltipProvider>\n <RTooltipRoot>{children}</RTooltipRoot>\n </RTooltipProvider>\n );\n};\n\nexport const TooltipContentClass =\n 'mastra:bg-surface4 mastra:text-text6 mastra mastra:rounded-lg mastra:py-1 mastra:px-2 mastra:text-xs mastra:border mastra:border-border1 mastra-tooltip-enter';\nexport const TooltipContent = ({ children, className, ...props }: TooltipContentProps) => {\n return (\n <RTooltipPortal>\n <RTooltipContent className={className || TooltipContentClass} {...props}>\n {children}\n </RTooltipContent>\n </RTooltipPortal>\n );\n};\n\nexport const TooltipTrigger = (props: TooltipTriggerProps) => {\n return <RTooltipTrigger {...props} asChild />;\n};\n","import { twMerge } from 'tailwind-merge';\nimport type { IconProps } from '../Icon/Icon';\nimport { Icon } from '../Icon/Icon';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../Tooltip/Tooltip';\n\nexport interface IconButtonProps extends React.ComponentPropsWithoutRef<'button'> {\n children: React.ReactNode;\n tooltip: React.ReactNode;\n size?: IconProps['size'];\n}\n\nexport const IconButtonClass =\n 'mastra:text-text3 mastra:hover:text-text6 mastra:active:text-text6 mastra:hover:bg-surface4 mastra:active:bg-surface5 mastra:rounded-md mastra:cursor-pointer';\n\nexport const IconButton = ({ children, tooltip, size = 'md', className, ...props }: IconButtonProps) => {\n return (\n <Tooltip>\n <TooltipTrigger>\n <button\n {...props}\n className={\n className || twMerge(IconButtonClass, size === 'md' && 'mastra:p-0.5', size === 'lg' && 'mastra:p-1')\n }\n >\n <Icon size={size}>{children}</Icon>\n </button>\n </TooltipTrigger>\n\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n};\n","import { toJsxRuntime } from 'hast-util-to-jsx-runtime';\nimport type { JSX } from 'react';\nimport { Fragment } from 'react';\nimport { jsx, jsxs } from 'react/jsx-runtime';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport { codeToHast } from 'shiki/bundle/web';\n\nexport async function highlight(code: string, lang: BundledLanguage) {\n const out = await codeToHast(code, {\n lang,\n theme: 'dracula-soft',\n });\n\n return toJsxRuntime(out, {\n Fragment,\n jsx,\n jsxs,\n }) as JSX.Element;\n}\n","import { CheckIcon, CopyIcon } from 'lucide-react';\nimport type { JSX } from 'react';\nimport { useLayoutEffect, useState } from 'react';\nimport type { BundledLanguage } from 'shiki/bundle/web';\nimport { IconButton } from '../IconButton/IconButton';\nimport { highlight } from './highlight';\n\nexport interface CodeBlockProps {\n code: string;\n language: BundledLanguage;\n className?: string;\n cta?: React.ReactNode;\n}\n\nexport const CodeBlockClass =\n 'mastra:rounded-lg mastra:[&>pre]:p-4 mastra:overflow-hidden mastra:[&>pre]:!bg-surface4 mastra:[&>pre>code]:leading-5 mastra:relative';\n\nexport const CodeBlock = ({ code, language, className, cta }: CodeBlockProps) => {\n const [nodes, setNodes] = useState<JSX.Element | null>(null);\n\n useLayoutEffect(() => {\n void highlight(code, language).then(setNodes);\n }, [language]);\n\n return (\n <div className={className || CodeBlockClass}>\n {nodes ?? null}\n {cta}\n </div>\n );\n};\n\nexport interface CodeCopyButtonProps {\n code: string;\n}\n\nexport const CodeCopyButton = ({ code }: CodeCopyButtonProps) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const handleCopy = () => {\n void navigator.clipboard.writeText(code);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n };\n return (\n <div className=\"mastra:absolute mastra:top-2 mastra:right-2\">\n <IconButton tooltip=\"Copy\" onClick={handleCopy}>\n {isCopied ? <CheckIcon /> : <CopyIcon />}\n </IconButton>\n </div>\n );\n};\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport const AgentIcon = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n className={twMerge('mastra-icon', className)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8.5 15C10.3565 15 12.137 14.2625 13.4497 12.9497C14.7625 11.637 15.5 9.85652 15.5 8C15.5 6.14348 14.7625 4.36301 13.4497 3.05025C12.137 1.7375 10.3565 1 8.5 1C6.64348 1 4.86301 1.7375 3.55025 3.05025C2.2375 4.36301 1.5 6.14348 1.5 8C1.5 9.85652 2.2375 11.637 3.55025 12.9497C4.86301 14.2625 6.64348 15 8.5 15ZM5.621 10.879L4.611 11.889C3.84179 11.1198 3.31794 10.1398 3.1057 9.07291C2.89346 8.00601 3.00236 6.90013 3.41864 5.89512C3.83491 4.89012 4.53986 4.03112 5.44434 3.42676C6.34881 2.8224 7.41219 2.49983 8.5 2.49983C9.58781 2.49983 10.6512 2.8224 11.5557 3.42676C12.4601 4.03112 13.1651 4.89012 13.5814 5.89512C13.9976 6.90013 14.1065 8.00601 13.8943 9.07291C13.6821 10.1398 13.1582 11.1198 12.389 11.889L11.379 10.879C11.1004 10.6003 10.7696 10.3792 10.4055 10.2284C10.0414 10.0776 9.6511 9.99995 9.257 10H7.743C7.3489 9.99995 6.95865 10.0776 6.59455 10.2284C6.23045 10.3792 5.89963 10.6003 5.621 10.879Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M8.5 4C7.96957 4 7.46086 4.21071 7.08579 4.58579C6.71071 4.96086 6.5 5.46957 6.5 6V6.5C6.5 7.03043 6.71071 7.53914 7.08579 7.91421C7.46086 8.28929 7.96957 8.5 8.5 8.5C9.03043 8.5 9.53914 8.28929 9.91421 7.91421C10.2893 7.53914 10.5 7.03043 10.5 6.5V6C10.5 5.46957 10.2893 4.96086 9.91421 4.58579C9.53914 4.21071 9.03043 4 8.5 4Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport const ToolsIcon = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n className={twMerge('mastra-icon', className)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.5605 1.42351C8.0791 0.904904 8.92215 0.906157 9.4395 1.42351L10.6922 2.67617C11.2108 3.19477 11.2095 4.03782 10.6922 4.55517L9.4395 5.80783C8.9209 6.32643 8.07785 6.32518 7.5605 5.80783L6.30784 4.55517C5.78923 4.03656 5.79049 3.19352 6.30784 2.67617L7.5605 1.42351ZM3.17618 5.80783C3.69478 5.28923 4.53782 5.29048 5.05517 5.80783L6.30784 7.0605C6.82644 7.5791 6.82519 8.42214 6.30784 8.93949L5.05517 10.1922C4.53657 10.7108 3.69353 10.7095 3.17618 10.1922L1.92351 8.93949C1.40491 8.42089 1.40616 7.57785 1.92351 7.0605L3.17618 5.80783ZM11.9448 5.80783C12.4634 5.28923 13.3065 5.29048 13.8238 5.80783L15.0765 7.0605C15.5951 7.5791 15.5938 8.42214 15.0765 8.93949L13.8238 10.1922C13.3052 10.7108 12.4622 10.7095 11.9448 10.1922L10.6922 8.93949C10.1736 8.42089 10.1748 7.57785 10.6922 7.0605L11.9448 5.80783ZM7.5605 10.1922C8.0791 9.67355 8.92215 9.67481 9.4395 10.1922L10.6922 11.4448C11.2108 11.9634 11.2095 12.8065 10.6922 13.3238L9.4395 14.5765C8.9209 15.0951 8.07785 15.0938 7.5605 14.5765L6.30784 13.3238C5.78923 12.8052 5.79049 11.9622 6.30784 11.4448L7.5605 10.1922Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport const WorkflowIcon = ({ className, ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n className={twMerge('mastra-icon', className)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.24388 2.4018C6.24388 2.0394 6.53767 1.74561 6.90008 1.74561H10.0991C10.4614 1.74561 10.7553 2.0394 10.7553 2.4018V4.57546C10.7553 4.93787 10.4614 5.23166 10.0991 5.23166H9.31982V7.35469L10.0033 9.22664C9.90442 9.20146 9.80035 9.1761 9.6915 9.14986L9.62652 9.13422C9.30473 9.05687 8.92256 8.96501 8.61993 8.84491C8.5819 8.82981 8.54147 8.81292 8.49957 8.79391C8.45767 8.81292 8.41724 8.82981 8.3792 8.84491C8.07657 8.96501 7.6944 9.05687 7.37261 9.13422L7.30763 9.14986C7.19879 9.1761 7.09471 9.20146 6.99577 9.22664L7.67932 7.35469V5.23166H6.90008C6.53767 5.23166 6.24388 4.93787 6.24388 4.57546V2.4018ZM6.99577 9.22664C6.99577 9.22664 6.99578 9.22664 6.99577 9.22664L6.43283 10.7683H6.81806C7.18047 10.7683 7.47426 11.0622 7.47426 11.4245V13.5982C7.47426 13.9606 7.18047 14.2544 6.81806 14.2544H3.61909C3.25668 14.2544 2.96289 13.9606 2.96289 13.5982V11.4245C2.96289 11.0622 3.25668 10.7683 3.61909 10.7683H4.26617C4.2921 10.4663 4.32783 10.1494 4.37744 9.85171C4.43762 9.49063 4.52982 9.08135 4.68998 8.76102C4.93975 8.2615 5.44743 8.01751 5.7771 7.88788C6.14684 7.74249 6.57537 7.63889 6.92317 7.55505C7.24707 7.47696 7.49576 7.41679 7.67932 7.35469L6.99577 9.22664ZM6.43283 10.7683L6.99577 9.22664C6.75846 9.28705 6.55067 9.34646 6.37745 9.41458C6.22784 9.47341 6.1623 9.51712 6.14023 9.53254C6.09752 9.63631 6.04409 9.83055 5.99562 10.1214C5.96201 10.3231 5.93498 10.5439 5.91341 10.7683H6.43283ZM10.0033 9.22664L9.31982 7.35469C9.50338 7.41679 9.75206 7.47696 10.076 7.55505C10.4238 7.63889 10.8523 7.74249 11.2221 7.88788C11.5517 8.01751 12.0594 8.2615 12.3091 8.76102C12.4693 9.08135 12.5615 9.49063 12.6217 9.85171C12.6713 10.1494 12.707 10.4663 12.733 10.7683H13.38C13.7424 10.7683 14.0362 11.0622 14.0362 11.4245V13.5982C14.0362 13.9606 13.7424 14.2544 13.38 14.2544H10.1811C9.81867 14.2544 9.52488 13.9606 9.52488 13.5982V11.4245C9.52488 11.0622 9.81867 10.7683 10.1811 10.7683H10.5663L10.0033 9.22664ZM10.0033 9.22664L10.5663 10.7683H11.0857C11.0642 10.5439 11.0372 10.3231 11.0035 10.1214C10.9551 9.83055 10.9016 9.63631 10.8589 9.53254C10.8369 9.51712 10.7713 9.47341 10.6217 9.41458C10.4485 9.34646 10.2407 9.28705 10.0033 9.22664Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import type { HTMLAttributes } from 'react';\nimport { useEffect, useRef } from 'react';\nimport { twMerge } from 'tailwind-merge';\n\nexport interface MessageProps extends HTMLAttributes<HTMLDivElement> {\n position: 'left' | 'right';\n}\n\nexport const MessageClass = 'mastra:flex mastra:flex-col mastra:w-full mastra:py-4 mastra:gap-2 mastra:group';\nexport const Message = ({ position, className, children, ...props }: MessageProps) => {\n return (\n <div\n className={\n className ||\n twMerge(\n MessageClass,\n position === 'left'\n ? ''\n : 'mastra:items-end mastra:[&_.mastra-message-content]:bg-surface4 mastra:[&_.mastra-message-content]:px-4',\n )\n }\n {...props}\n >\n {children}\n </div>\n );\n};\n\nexport interface MessageContentProps extends HTMLAttributes<HTMLDivElement> {\n isStreaming?: boolean;\n}\nexport const MessageContentClass =\n 'mastra:max-w-4/5 mastra:py-2 mastra:text-text6 mastra:rounded-lg mastra-message-content mastra:text-md';\nexport const MessageContent = ({ children, className, isStreaming, ...props }: MessageContentProps) => {\n return (\n <div className={className || MessageContentClass} {...props}>\n {children}\n {isStreaming && <MessageStreaming />}\n </div>\n );\n};\n\nexport const MessageActionsClass =\n 'mastra:gap-2 mastra:flex mastra:opacity-0 mastra:group-hover:opacity-100 mastra:group-focus-within:opacity-100 mastra:items-center';\nexport const MessageActions = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => {\n return (\n <div className={className || MessageActionsClass} {...props}>\n {children}\n </div>\n );\n};\n\nexport const MessageUsagesClass = 'mastra:flex mastra:gap-2 mastra:items-center';\nexport const MessageUsages = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => {\n return (\n <div className={className || MessageUsagesClass} {...props}>\n {children}\n </div>\n );\n};\n\nexport const MessageUsageClass =\n 'mastra:flex mastra:gap-2 mastra:items-center mastra:font-mono mastra:text-xs mastra:bg-surface3 mastra:rounded-lg mastra:px-2 mastra:py-1';\nexport const MessageUsage = ({ children, className, ...props }: HTMLAttributes<HTMLDListElement>) => {\n return (\n <dl className={className || MessageUsageClass} {...props}>\n {children}\n </dl>\n );\n};\n\nexport const MessageUsageEntryClass = 'mastra:text-text3 mastra:text-xs mastra:flex mastra:gap-1 mastra:items-center';\nexport const MessageUsageEntry = ({ children, className, ...props }: HTMLAttributes<HTMLSpanElement>) => {\n return (\n <dt className={className || MessageUsageEntryClass} {...props}>\n {children}\n </dt>\n );\n};\n\nexport const MessageUsageValueClass = 'mastra:text-text6 mastra:text-xs';\nexport const MessageUsageValue = ({ children, className, ...props }: HTMLAttributes<HTMLSpanElement>) => {\n return (\n <dd className={className || MessageUsageValueClass} {...props}>\n {children}\n </dd>\n );\n};\n\nexport const MessageListClass = 'mastra:overflow-y-auto mastra:h-full mastra-list';\n\nexport const MessageList = ({ children, className, ...props }: HTMLAttributes<HTMLDivElement>) => {\n const listRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n // Force scroll to bottom after DOM update\n const scrollToBottom = () => {\n if (!listRef.current) return;\n listRef.current.scrollTo({ top: listRef.current.scrollHeight, behavior: 'smooth' });\n };\n\n requestAnimationFrame(scrollToBottom);\n });\n\n return (\n <div className={className || MessageListClass} {...props} ref={listRef}>\n {children}\n </div>\n );\n};\n\nexport const MessageStreamingClass =\n 'mastra:inline-block mastra:w-[2px] mastra:h-[1em] mastra:bg-text5 mastra:ml-0.5 mastra:align-text-bottom mastra:animate-pulse';\n\nexport const MessageStreaming = ({ className, ...props }: HTMLAttributes<HTMLSpanElement>) => {\n return <span className={className || MessageStreamingClass} {...props} />;\n};\n","import type { MastraDBMessage, AIV5Type } from '@mastra/core/agent/message-list';\nimport type { ReactNode } from 'react';\nimport { memo } from 'react';\nimport type { AccumulatorPart, MastraDBMessageMetadata } from '../../lib/mastra-db';\nimport type {\n DataPart,\n DynamicToolPart,\n MessageFactoryPart,\n MessageRenderers,\n MessageRoleRendererProps,\n MessageRoleRenderers,\n MessageStatusRenderers,\n PartByType,\n} from './types';\n\nexport interface MessageFactoryProps extends MessageRenderers {\n /** The message whose `content.parts` are rendered. */\n message: MastraDBMessage;\n /** Optional wrappers keyed off `message.role`. */\n roles?: MessageRoleRenderers;\n /** Optional message-level slots dispatched off `message.content.metadata`. */\n status?: MessageStatusRenderers;\n /** Rendered for any part that has no matching renderer. Defaults to `null`. */\n fallback?: (part: AccumulatorPart | DynamicToolPart) => ReactNode;\n}\n\n/** A part as it actually appears at runtime, including boundary-cast tool parts. */\ntype RuntimePart = MessageFactoryPart;\n\nconst isDynamicToolPart = (part: RuntimePart): part is DynamicToolPart =>\n // `tool-invocation` is the v4 typed discriminant and must NOT be treated as a\n // v5 `tool-${string}` streaming part, even though it shares the `tool-` prefix.\n part.type === 'dynamic-tool' || (part.type.startsWith('tool-') && part.type !== 'tool-invocation');\n\nconst isDataPart = (part: RuntimePart): part is DataPart => part.type.startsWith('data-');\n\n/**\n * Normalize the legacy persisted `type: 'source'` part (nested\n * `source: { id, url, title }`) into the flat `AIV5Type.SourceUrlUIPart` shape\n * the runtime accumulator emits, so the `SourceUrl` renderer receives one\n * stable prop contract regardless of which discriminant produced the citation.\n */\nconst sourceToSourceUrl = (part: PartByType<'source'>): AIV5Type.SourceUrlUIPart => ({\n type: 'source-url',\n sourceId: part.source.id,\n url: part.source.url,\n title: part.source.title,\n providerMetadata: part.providerMetadata,\n});\n\n/**\n * Resolve a stable key for a part so unchanged parts keep their identity across\n * streaming updates (and don't needlessly re-render).\n */\nconst getPartKey = (part: RuntimePart, index: number): string => {\n if (isDynamicToolPart(part)) {\n return part.toolCallId ?? `${part.type}-${index}`;\n }\n switch (part.type) {\n case 'text': {\n // Intrinsic cast: the `'text'`-narrowed member is `(v4 text part) | MastraTextPart`;\n // only `MastraTextPart` carries `textId`, so this is an optional structural read.\n // Include index so two segments with the same textId (e.g. DeepSeek reuses txt-0)\n // get distinct keys after interleaved tool calls.\n // NOTE: mixing index into the key assumes parts are append-only during\n // streaming (they are today — the accumulator only pushes). If a part is\n // ever inserted ahead of a streaming text block, the trailing indices shift\n // and those text nodes remount. Revisit this key if insertion is added.\n const textId = (part as { textId?: string }).textId;\n return textId ? `${textId}-${index}` : `text-${index}`;\n }\n case 'reasoning':\n // Intrinsic cast: same as `textId` — only the Mastra reasoning member has `reasoningId`.\n return (part as { reasoningId?: string }).reasoningId ?? `reasoning-${index}`;\n case 'tool-invocation':\n return part.toolInvocation.toolCallId ?? `tool-invocation-${index}`;\n case 'source-url':\n return part.sourceId || `source-url-${index}`;\n case 'source':\n return part.source.id ?? `source-${index}`;\n default:\n break;\n }\n // Intrinsic cast: fallback key over a heterogeneous union whose members do not\n // share an `id` field; an optional structural read is the minimal honest form.\n const id = (part as { id?: string }).id;\n return id ?? `${part.type}-${index}`;\n};\n\n/**\n * Dispatch a single part to the one matching renderer. Only the renderer whose\n * discriminant matches `part.type` is invoked, so unrelated renderers never run\n * for a given part. Returns `fallback?.(part) ?? null` when no renderer matches.\n */\nconst renderPart = (\n part: RuntimePart,\n renderers: MessageRenderers,\n fallback?: MessageFactoryProps['fallback'],\n): ReactNode => {\n // Runtime-only tool parts (`dynamic-tool` / `tool-${string}`) are not in the\n // typed union, so they are dispatched explicitly before the typed switch.\n if (isDynamicToolPart(part)) {\n return renderers.DynamicTool?.(part) ?? fallback?.(part) ?? null;\n }\n\n // `data-${string}` cannot be a `case` label, so match it by prefix first.\n if (isDataPart(part)) {\n return renderers.Data?.(part) ?? fallback?.(part) ?? null;\n }\n\n switch (part.type) {\n case 'text':\n return renderers.Text?.(part) ?? fallback?.(part) ?? null;\n case 'reasoning':\n return renderers.Reasoning?.(part) ?? fallback?.(part) ?? null;\n case 'file':\n return renderers.File?.(part) ?? fallback?.(part) ?? null;\n case 'step-start':\n // `step-start` is an internal step-framing marker with no user-facing\n // content. Absent an explicit opt-in renderer it renders nothing and is\n // intentionally NOT routed to `fallback`.\n return renderers.StepStart?.(part) ?? null;\n case 'error':\n // Terminal errors are stored for history but have no built-in visual\n // treatment. Let consumers opt into rendering them through `fallback`.\n return renderers.Error?.(part) ?? fallback?.(part) ?? null;\n case 'tool-invocation':\n return renderers.ToolInvocation?.(part) ?? fallback?.(part) ?? null;\n case 'source':\n // Legacy nested `type: 'source'` part — normalize to the flat shape the\n // `SourceUrl` renderer expects so both discriminants share one contract.\n return renderers.SourceUrl?.(sourceToSourceUrl(part)) ?? fallback?.(part) ?? null;\n case 'source-url':\n // Flat runtime/V5 citation part emitted by the accumulator.\n return renderers.SourceUrl?.(part) ?? fallback?.(part) ?? null;\n case 'source-document':\n return renderers.SourceDocument?.(part) ?? fallback?.(part) ?? null;\n default: {\n // Compile-time exhaustiveness: if a new TYPED part discriminant is added\n // to the union and not handled above, this assignment fails to compile.\n const _exhaustive: never = part;\n void _exhaustive;\n // Runtime-only / unrecognized parts degrade gracefully.\n return fallback?.(part) ?? null;\n }\n }\n};\n\ninterface PartRendererProps {\n part: RuntimePart;\n renderers: MessageRenderers;\n fallback?: MessageFactoryProps['fallback'];\n}\n\n/**\n * Memoized per-part renderer. Keeping each part isolated means a streaming\n * update to one part does not re-render the completed parts around it.\n */\nconst PartRenderer = memo(({ part, renderers, fallback }: PartRendererProps) => (\n <>{renderPart(part, renderers, fallback)}</>\n));\nPartRenderer.displayName = 'PartRenderer';\n\n/**\n * Concatenate the text of every `text` part into a single string. Used as the\n * body forwarded to the replacement (`Tripwire`/`Warning`/`Error`) and adjacent\n * (`Task`) status slots, so consumers don't re-derive it from parts.\n */\nconst joinText = (parts: RuntimePart[]): string =>\n parts\n .filter((part): part is PartByType<'text'> => part.type === 'text')\n .map(part => part.text)\n .join('');\n\n/**\n * Normalize the two task-completion metadata fields into one\n * `{ passed, suppressFeedback }` verdict, or `undefined` when neither is set.\n * `completionResult` (network mode) takes precedence; `isTaskCompleteResult`\n * (supervisor mode) is the fallback. Both share the same persisted shape.\n */\nconst resolveTaskVerdict = (\n metadata: MastraDBMessageMetadata | undefined,\n): { passed: boolean; suppressFeedback?: boolean } | undefined => {\n const verdict = metadata?.completionResult ?? metadata?.isTaskCompleteResult;\n if (!verdict) return undefined;\n return { passed: !!verdict.passed, suppressFeedback: verdict.suppressFeedback };\n};\n\nconst roleRendererFor = (\n role: MastraDBMessage['role'],\n roles?: MessageRoleRenderers,\n): ((props: MessageRoleRendererProps) => ReactNode) | undefined => {\n switch (role) {\n case 'user':\n return roles?.User;\n case 'assistant':\n return roles?.Assistant;\n case 'system':\n return roles?.System;\n case 'signal':\n return roles?.Signal;\n default:\n return undefined;\n }\n};\n\nconst MessageFactoryComponent = ({ message, roles, status, fallback, ...renderers }: MessageFactoryProps) => {\n // `MastraMessagePart[]` widens into `RuntimePart[]` (`AccumulatorPart` is a\n // member of `MessageFactoryPart`), so no cast is needed here.\n const parts: RuntimePart[] = message.content.parts ?? [];\n // Intrinsic cast: core types `content.metadata` as `Record<string, unknown>`\n // (message-list/state/types.ts), so narrowing to the SDK's typed metadata\n // shape requires a cast. This matches the convention used across the accumulator.\n const metadata = message.content.metadata as MastraDBMessageMetadata | undefined;\n\n // Replacement status slots: when the message-level status matches and a slot\n // is provided, the slot renders *instead of* the parts walk. If the status\n // matches but no slot is provided, fall through to the normal parts walk.\n let content: ReactNode;\n if (metadata?.status === 'tripwire' && status?.Tripwire) {\n content = status.Tripwire({ text: joinText(parts), tripwire: metadata.tripwire, message });\n } else if (metadata?.status === 'warning' && status?.Warning) {\n content = status.Warning({ text: joinText(parts), message });\n } else if (metadata?.status === 'error' && status?.Error) {\n content = status.Error({ text: joinText(parts), message });\n } else {\n content = (\n <>\n {parts.map((part, index) => (\n <PartRenderer key={getPartKey(part, index)} part={part} renderers={renderers} fallback={fallback} />\n ))}\n </>\n );\n\n // Wrapping `Pending` slot: when the optimistic user bubble is still\n // \"sending\", wrap the parts walk so the consumer can apply a sending style\n // without the message disappearing from the list.\n if (metadata?.status === 'pending' && status?.Pending) {\n content = status.Pending({ children: content, text: joinText(parts), message });\n }\n\n // Adjacent `Task` slot: when a completion verdict exists it renders after\n // the parts. The factory always invokes `Task` when a verdict is present —\n // it does not filter on `suppressFeedback` (the consumer decides).\n const verdict = resolveTaskVerdict(metadata);\n if (verdict && status?.Task) {\n content = (\n <>\n {content}\n {status.Task({ ...verdict, text: joinText(parts), message })}\n </>\n );\n }\n }\n\n const RoleWrapper = roleRendererFor(message.role, roles);\n if (RoleWrapper) {\n return <>{RoleWrapper({ message, children: content })}</>;\n }\n\n return <>{content}</>;\n};\n\n/**\n * Renders a single {@link MastraDBMessage} by dispatching each part in\n * `content.parts` to an optional, type-safe, per-part-type render function.\n * Only the renderer matching a part's `type` is invoked, and each renderer\n * receives fully narrowed props.\n */\nexport const MessageFactory = memo(MessageFactoryComponent);\nMessageFactory.displayName = 'MessageFactory';\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-in-view-B6eJO9Zi.cjs","names":[],"sources":["../src/hooks/shared/use-in-view.ts"],"sourcesContent":["import type { RefObject } from 'react';\nimport { useEffect, useState } from 'react';\n\nexport type UseInViewOptions = {\n /**\n * Scroll container to observe against. When omitted, the browser viewport is used.\n * Pass the list's own scroll viewport so the sentinel only fires when scrolled\n * into view inside that container.\n */\n root?: RefObject<HTMLElement | null>;\n};\n\n/**\n * Tracks whether or not the given element is currently in view.\n * This is to replace framer-motion's `useInView` which has issues\n * tracking a ref that is set at a time other than mount.\n *\n * The observer is created in an effect (not in the callback ref) so that an\n * ancestor `root` ref, which React assigns after descendant refs, is already\n * populated when the observer is constructed.\n */\nexport const useInView = ({ root }: UseInViewOptions = {}) => {\n const [inView, setInView] = useState(false);\n const [node, setRef] = useState<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!node) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry) return;\n setInView(entry.isIntersecting);\n },\n { root: root?.current ?? null },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, [node, root]);\n\n return { inView, setRef };\n};\n"],"mappings":";;;;;;;;;;;AAqBA,MAAa,aAAa,EAAE,SAA2B,CAAC,MAAM;CAC5D,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,SAAA,CAAsB,KAAK;CAC1C,MAAM,CAAC,MAAM,WAAA,GAAA,MAAA,SAAA,CAA0C,IAAI;CAE3D,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,MAAM;EAEX,MAAM,WAAW,IAAI,sBAClB,CAAC,WAAW;GACX,IAAI,CAAC,OAAO;GACZ,UAAU,MAAM,cAAc;EAChC,GACA,EAAE,MAAM,MAAM,WAAW,KAAK,CAChC;EACA,SAAS,QAAQ,IAAI;EACrB,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,MAAM,IAAI,CAAC;CAEf,OAAO;EAAE;EAAQ;CAAO;AAC1B"}
1
+ {"version":3,"file":"use-in-view-B6eJO9Zi.cjs","names":["useState"],"sources":["../src/hooks/shared/use-in-view.ts"],"sourcesContent":["import type { RefObject } from 'react';\nimport { useEffect, useState } from 'react';\n\nexport type UseInViewOptions = {\n /**\n * Scroll container to observe against. When omitted, the browser viewport is used.\n * Pass the list's own scroll viewport so the sentinel only fires when scrolled\n * into view inside that container.\n */\n root?: RefObject<HTMLElement | null>;\n};\n\n/**\n * Tracks whether or not the given element is currently in view.\n * This is to replace framer-motion's `useInView` which has issues\n * tracking a ref that is set at a time other than mount.\n *\n * The observer is created in an effect (not in the callback ref) so that an\n * ancestor `root` ref, which React assigns after descendant refs, is already\n * populated when the observer is constructed.\n */\nexport const useInView = ({ root }: UseInViewOptions = {}) => {\n const [inView, setInView] = useState(false);\n const [node, setRef] = useState<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!node) return;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry) return;\n setInView(entry.isIntersecting);\n },\n { root: root?.current ?? null },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, [node, root]);\n\n return { inView, setRef };\n};\n"],"mappings":";;;;;;;;;;;AAqBA,MAAa,aAAa,EAAE,SAA2B,CAAC,MAAM;CAC5D,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;CAC1C,MAAM,CAAC,MAAM,WAAA,GAAUA,MAAAA,SAAAA,CAAgC,IAAI;CAE3D,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,CAAC,MAAM;EAEX,MAAM,WAAW,IAAI,sBAClB,CAAC,WAAW;GACX,IAAI,CAAC,OAAO;GACZ,UAAU,MAAM,cAAc;EAChC,GACA,EAAE,MAAM,MAAM,WAAW,KAAK,CAChC;EACA,SAAS,QAAQ,IAAI;EACrB,aAAa,SAAS,WAAW;CACnC,GAAG,CAAC,MAAM,IAAI,CAAC;CAEf,OAAO;EAAE;EAAQ;CAAO;AAC1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"voice-BOtUdMi8.cjs","names":["useMastraClient"],"sources":["../src/voice/record-mic-to-file.ts","../src/voice/play-stream-with-web-audio.ts","../src/voice/use-speech-recognition.ts"],"sourcesContent":["export async function recordMicrophoneToFile(onFinish: (file: File) => void) {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mediaRecorder = new MediaRecorder(stream);\n\n let chunks: BlobPart[] = [];\n\n mediaRecorder.ondataavailable = e => {\n chunks.push(e.data);\n };\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunks, { type: 'audio/webm' });\n const file = new File([blob], `recording-${Date.now()}.webm`, {\n type: 'audio/webm',\n lastModified: Date.now(),\n });\n\n stream.getTracks().forEach(track => track.stop());\n onFinish(file);\n };\n\n return mediaRecorder;\n}\n","export async function playStreamWithWebAudio(stream: ReadableStream, onEnded?: () => void) {\n const audioContext = new window.AudioContext();\n\n const reader = stream.getReader();\n const chunks = [];\n\n try {\n // Read all chunks\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Combine chunks into single ArrayBuffer\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combinedBuffer = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combinedBuffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Decode and play\n const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);\n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.onended = onEnded ?? null;\n source.connect(audioContext.destination);\n source.start();\n\n return () => {\n source.onended = null;\n source.stop();\n void audioContext.close();\n };\n } catch (error) {\n await reader.cancel().catch(() => undefined);\n await audioContext.close().catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useEffect, useRef, useState } from 'react';\nimport { useMastraClient } from '../mastra-client-context';\nimport { recordMicrophoneToFile } from './record-mic-to-file';\n\ntype Agent = ReturnType<MastraClient['getAgent']>;\ntype VoiceRequestContext = Parameters<Agent['voice']['getSpeakers']>[0];\n\nexport interface SpeechRecognitionState {\n isListening: boolean;\n transcript: string;\n error: string | null;\n}\n\nexport interface UseSpeechRecognitionArgs {\n language?: string;\n agentId?: string;\n requestContext?: VoiceRequestContext;\n}\n\ntype SpeechRecognitionResult = SpeechRecognitionState & {\n start: () => void;\n stop: () => void;\n};\n\nexport const useSpeechRecognition = ({\n language = 'en-US',\n agentId,\n requestContext,\n}: UseSpeechRecognitionArgs): SpeechRecognitionResult => {\n const client = useMastraClient();\n const [agent, setAgent] = useState<Agent | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!agentId) {\n setAgent(null);\n return () => {\n cancelled = true;\n };\n }\n\n const agent = client.getAgent(agentId);\n\n const check = async () => {\n try {\n const speakers = await agent.voice.getSpeakers(requestContext);\n if (!cancelled) {\n setAgent(speakers.length > 0 ? agent : null);\n }\n } catch {\n if (!cancelled) {\n setAgent(null);\n }\n }\n };\n\n void check();\n\n return () => {\n cancelled = true;\n };\n }, [agentId, client, requestContext]);\n\n const browserSpeechRecognition = useBrowserSpeechRecognition({ language });\n const mastraSpeechRecognition = useMastraSpeechToText({ agent, language });\n\n if (!agent) {\n return browserSpeechRecognition;\n }\n\n return mastraSpeechRecognition;\n};\n\nconst useBrowserSpeechRecognition = ({ language = 'en-US' }: { language?: string }): SpeechRecognitionResult => {\n const speechRecognitionRef = useRef<any>(null);\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n\n const start = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.start();\n };\n\n const stop = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.stop();\n };\n\n useEffect(() => {\n if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {\n setState(prev => ({ ...prev, error: 'Speech Recognition not supported in this browser' }));\n return;\n }\n\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n const recognition = new SpeechRecognition();\n speechRecognitionRef.current = recognition;\n\n recognition.continuous = true;\n recognition.lang = language;\n\n recognition.onstart = () => {\n setState(prev => ({ ...prev, isListening: true, error: null, transcript: '' }));\n };\n\n recognition.onresult = (event: any) => {\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n finalTranscript += transcript + ' ';\n }\n }\n\n if (!finalTranscript) return;\n // Continuous mode emits one event per finalized phrase with an advancing\n // resultIndex, so append to the session transcript instead of replacing it.\n setState(prev => ({ ...prev, transcript: prev.transcript + finalTranscript }));\n };\n\n recognition.onerror = (event: any) => {\n setState(prev => ({ ...prev, error: `Error: ${event.error}` }));\n };\n\n recognition.onend = () => setState(prev => ({ ...prev, isListening: false }));\n\n return () => {\n try {\n recognition.stop();\n } catch {\n // ignore: recognition may not be running\n }\n recognition.onstart = null;\n recognition.onresult = null;\n recognition.onerror = null;\n recognition.onend = null;\n speechRecognitionRef.current = null;\n };\n }, [language]);\n\n return {\n ...state,\n start,\n stop,\n };\n};\n\nconst useMastraSpeechToText = ({\n agent,\n language,\n}: {\n agent: Agent | null;\n language: string;\n}): SpeechRecognitionResult => {\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n const recorderRef = useRef<MediaRecorder | null>(null);\n const sessionRef = useRef(0);\n const startInFlightRef = useRef(false);\n\n useEffect(() => {\n return () => {\n sessionRef.current += 1;\n startInFlightRef.current = false;\n recorderRef.current?.stop();\n recorderRef.current = null;\n };\n }, [agent]);\n\n const handleFinish = (session: number) => (file: File) => {\n if (!agent || session !== sessionRef.current) return;\n\n recorderRef.current = null;\n setState(prev => ({ ...prev, isListening: false }));\n\n void agent.voice\n .listen(file, { language })\n .then(res => {\n if (session !== sessionRef.current) return;\n setState(prev => ({ ...prev, transcript: res.text, error: null }));\n })\n .catch(error => {\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to transcribe speech';\n setState(prev => ({ ...prev, error: message }));\n });\n };\n\n const start = () => {\n if (!agent || startInFlightRef.current || recorderRef.current) return;\n\n startInFlightRef.current = true;\n // Bump the session here (not in stop()) so a normal stop's onstop callback\n // still matches sessionRef.current. Only a new start (or unmount) should\n // invalidate a prior in-flight recording's result.\n // See: https://github.com/mastra-ai/mastra/issues/19980\n sessionRef.current += 1;\n const session = sessionRef.current;\n\n void recordMicrophoneToFile(handleFinish(session))\n .then(recorder => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) {\n try {\n recorder.stop();\n } catch {\n // ignore: recorder was never started\n }\n return;\n }\n recorderRef.current = recorder;\n setState(prev => ({ ...prev, isListening: true, error: null }));\n recorder.start();\n })\n .catch(error => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to start speech recording';\n setState(prev => ({ ...prev, isListening: false, error: message }));\n });\n };\n\n const stop = () => {\n if (recorderRef.current) {\n // An active recording — its session was fixed at start() time and hasn't\n // changed, so its own onstop/handleFinish will complete normally.\n recorderRef.current.stop();\n recorderRef.current = null;\n } else if (startInFlightRef.current) {\n // No recorder yet but a start() is still in-flight. Invalidate the\n // session so that start's resolution knows to abort (stop the recorder\n // instead of assigning/starting it) rather than silently proceeding.\n sessionRef.current += 1;\n }\n // Otherwise the hook is idle, or a finished recording's transcription is\n // still in flight — bumping the session then would silently discard the\n // transcript (the same failure class as #19980, in a narrower window).\n startInFlightRef.current = false;\n setState(prev => ({ ...prev, isListening: false }));\n };\n\n return {\n ...state,\n start,\n stop,\n };\n};\n"],"mappings":";;;AAAA,eAAsB,uBAAuB,UAAgC;CAC3E,MAAM,SAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,KAAK,CAAC;CACxE,MAAM,gBAAgB,IAAI,cAAc,MAAM;CAE9C,IAAI,SAAqB,CAAC;CAE1B,cAAc,mBAAkB,MAAK;EACnC,OAAO,KAAK,EAAE,IAAI;CACpB;CAEA,cAAc,eAAe;EAC3B,MAAM,OAAO,IAAI,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;EACpD,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,aAAa,KAAK,IAAI,EAAE,QAAQ;GAC5D,MAAM;GACN,cAAc,KAAK,IAAI;EACzB,CAAC;EAED,OAAO,UAAU,CAAC,CAAC,SAAQ,UAAS,MAAM,KAAK,CAAC;EAChD,SAAS,IAAI;CACf;CAEA,OAAO;AACT;;;ACtBA,eAAsB,uBAAuB,QAAwB,SAAsB;CACzF,MAAM,eAAe,IAAI,OAAO,aAAa;CAE7C,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,SAAS,CAAC;CAEhB,IAAI;EAEF,OAAO,MAAM;GACX,MAAM,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK;GAC1C,IAAI,MAAM;GACV,OAAO,KAAK,KAAK;EACnB;EAGA,MAAM,cAAc,OAAO,QAAQ,KAAK,UAAU,MAAM,MAAM,QAAQ,CAAC;EACvE,MAAM,iBAAiB,IAAI,WAAW,WAAW;EACjD,IAAI,SAAS;EAEb,KAAK,MAAM,SAAS,QAAQ;GAC1B,eAAe,IAAI,OAAO,MAAM;GAChC,UAAU,MAAM;EAClB;EAGA,MAAM,cAAc,MAAM,aAAa,gBAAgB,eAAe,MAAM;EAC5E,MAAM,SAAS,aAAa,mBAAmB;EAC/C,OAAO,SAAS;EAChB,OAAO,UAAU,WAAW;EAC5B,OAAO,QAAQ,aAAa,WAAW;EACvC,OAAO,MAAM;EAEb,aAAa;GACX,OAAO,UAAU;GACjB,OAAO,KAAK;GACZ,aAAkB,MAAM;EAC1B;CACF,SAAS,OAAO;EACd,MAAM,OAAO,OAAO,CAAC,CAAC,YAAY,KAAA,CAAS;EAC3C,MAAM,aAAa,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS;EAChD,MAAM;CACR,UAAU;EACR,OAAO,YAAY;CACrB;AACF;;;ACnBA,MAAa,wBAAwB,EACnC,WAAW,SACX,SACA,qBACuD;CACvD,MAAM,SAASA,8BAAAA,gBAAgB;CAC/B,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAmC,IAAI;CAErD,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,YAAY;EAEhB,IAAI,CAAC,SAAS;GACZ,SAAS,IAAI;GACb,aAAa;IACX,YAAY;GACd;EACF;EAEA,MAAM,QAAQ,OAAO,SAAS,OAAO;EAErC,MAAM,QAAQ,YAAY;GACxB,IAAI;IACF,MAAM,WAAW,MAAM,MAAM,MAAM,YAAY,cAAc;IAC7D,IAAI,CAAC,WACH,SAAS,SAAS,SAAS,IAAI,QAAQ,IAAI;GAE/C,QAAQ;IACN,IAAI,CAAC,WACH,SAAS,IAAI;GAEjB;EACF;EAEA,MAAW;EAEX,aAAa;GACX,YAAY;EACd;CACF,GAAG;EAAC;EAAS;EAAQ;CAAc,CAAC;CAEpC,MAAM,2BAA2B,4BAA4B,EAAE,SAAS,CAAC;CACzE,MAAM,0BAA0B,sBAAsB;EAAE;EAAO;CAAS,CAAC;CAEzE,IAAI,CAAC,OACH,OAAO;CAGT,OAAO;AACT;AAEA,MAAM,+BAA+B,EAAE,WAAW,cAA8D;CAC9G,MAAM,wBAAA,GAAA,MAAA,OAAA,CAAmC,IAAI;CAC7C,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA6C;EACzD,aAAa;EACb,YAAY;EACZ,OAAO;CACT,CAAC;CAED,MAAM,cAAc;EAClB,IAAI,CAAC,qBAAqB,SAAS;EACnC,qBAAqB,QAAQ,MAAM;CACrC;CAEA,MAAM,aAAa;EACjB,IAAI,CAAC,qBAAqB,SAAS;EACnC,qBAAqB,QAAQ,KAAK;CACpC;CAEA,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,IAAI,EAAE,6BAA6B,WAAW,EAAE,uBAAuB,SAAS;GAC9E,UAAS,UAAS;IAAE,GAAG;IAAM,OAAO;GAAmD,EAAE;GACzF;EACF;EAGA,MAAM,cAAc,KADO,OAAe,qBAAsB,OAAe,yBACrC;EAC1C,qBAAqB,UAAU;EAE/B,YAAY,aAAa;EACzB,YAAY,OAAO;EAEnB,YAAY,gBAAgB;GAC1B,UAAS,UAAS;IAAE,GAAG;IAAM,aAAa;IAAM,OAAO;IAAM,YAAY;GAAG,EAAE;EAChF;EAEA,YAAY,YAAY,UAAe;GACrC,IAAI,kBAAkB;GAEtB,KAAK,IAAI,IAAI,MAAM,aAAa,IAAI,MAAM,QAAQ,QAAQ,KAAK;IAC7D,MAAM,aAAa,MAAM,QAAQ,EAAE,CAAC,EAAE,CAAC;IACvC,IAAI,MAAM,QAAQ,EAAE,CAAC,SACnB,mBAAmB,aAAa;GAEpC;GAEA,IAAI,CAAC,iBAAiB;GAGtB,UAAS,UAAS;IAAE,GAAG;IAAM,YAAY,KAAK,aAAa;GAAgB,EAAE;EAC/E;EAEA,YAAY,WAAW,UAAe;GACpC,UAAS,UAAS;IAAE,GAAG;IAAM,OAAO,UAAU,MAAM;GAAQ,EAAE;EAChE;EAEA,YAAY,cAAc,UAAS,UAAS;GAAE,GAAG;GAAM,aAAa;EAAM,EAAE;EAE5E,aAAa;GACX,IAAI;IACF,YAAY,KAAK;GACnB,QAAQ,CAER;GACA,YAAY,UAAU;GACtB,YAAY,WAAW;GACvB,YAAY,UAAU;GACtB,YAAY,QAAQ;GACpB,qBAAqB,UAAU;EACjC;CACF,GAAG,CAAC,QAAQ,CAAC;CAEb,OAAO;EACL,GAAG;EACH;EACA;CACF;AACF;AAEA,MAAM,yBAAyB,EAC7B,OACA,eAI6B;CAC7B,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAA6C;EACzD,aAAa;EACb,YAAY;EACZ,OAAO;CACT,CAAC;CACD,MAAM,eAAA,GAAA,MAAA,OAAA,CAA2C,IAAI;CACrD,MAAM,cAAA,GAAA,MAAA,OAAA,CAAoB,CAAC;CAC3B,MAAM,oBAAA,GAAA,MAAA,OAAA,CAA0B,KAAK;CAErC,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,aAAa;GACX,WAAW,WAAW;GACtB,iBAAiB,UAAU;GAC3B,YAAY,SAAS,KAAK;GAC1B,YAAY,UAAU;EACxB;CACF,GAAG,CAAC,KAAK,CAAC;CAEV,MAAM,gBAAgB,aAAqB,SAAe;EACxD,IAAI,CAAC,SAAS,YAAY,WAAW,SAAS;EAE9C,YAAY,UAAU;EACtB,UAAS,UAAS;GAAE,GAAG;GAAM,aAAa;EAAM,EAAE;EAElD,MAAW,MACR,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC,CAC1B,MAAK,QAAO;GACX,IAAI,YAAY,WAAW,SAAS;GACpC,UAAS,UAAS;IAAE,GAAG;IAAM,YAAY,IAAI;IAAM,OAAO;GAAK,EAAE;EACnE,CAAC,CAAC,CACD,OAAM,UAAS;GACd,IAAI,YAAY,WAAW,SAAS;GACpC,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;GACzD,UAAS,UAAS;IAAE,GAAG;IAAM,OAAO;GAAQ,EAAE;EAChD,CAAC;CACL;CAEA,MAAM,cAAc;EAClB,IAAI,CAAC,SAAS,iBAAiB,WAAW,YAAY,SAAS;EAE/D,iBAAiB,UAAU;EAK3B,WAAW,WAAW;EACtB,MAAM,UAAU,WAAW;EAE3B,uBAA4B,aAAa,OAAO,CAAC,CAAC,CAC/C,MAAK,aAAY;GAChB,iBAAiB,UAAU;GAC3B,IAAI,YAAY,WAAW,SAAS;IAClC,IAAI;KACF,SAAS,KAAK;IAChB,QAAQ,CAER;IACA;GACF;GACA,YAAY,UAAU;GACtB,UAAS,UAAS;IAAE,GAAG;IAAM,aAAa;IAAM,OAAO;GAAK,EAAE;GAC9D,SAAS,MAAM;EACjB,CAAC,CAAC,CACD,OAAM,UAAS;GACd,iBAAiB,UAAU;GAC3B,IAAI,YAAY,WAAW,SAAS;GACpC,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;GACzD,UAAS,UAAS;IAAE,GAAG;IAAM,aAAa;IAAO,OAAO;GAAQ,EAAE;EACpE,CAAC;CACL;CAEA,MAAM,aAAa;EACjB,IAAI,YAAY,SAAS;GAGvB,YAAY,QAAQ,KAAK;GACzB,YAAY,UAAU;EACxB,OAAO,IAAI,iBAAiB,SAI1B,WAAW,WAAW;EAKxB,iBAAiB,UAAU;EAC3B,UAAS,UAAS;GAAE,GAAG;GAAM,aAAa;EAAM,EAAE;CACpD;CAEA,OAAO;EACL,GAAG;EACH;EACA;CACF;AACF"}
1
+ {"version":3,"file":"voice-BOtUdMi8.cjs","names":["useMastraClient","useState","useRef"],"sources":["../src/voice/record-mic-to-file.ts","../src/voice/play-stream-with-web-audio.ts","../src/voice/use-speech-recognition.ts"],"sourcesContent":["export async function recordMicrophoneToFile(onFinish: (file: File) => void) {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const mediaRecorder = new MediaRecorder(stream);\n\n let chunks: BlobPart[] = [];\n\n mediaRecorder.ondataavailable = e => {\n chunks.push(e.data);\n };\n\n mediaRecorder.onstop = () => {\n const blob = new Blob(chunks, { type: 'audio/webm' });\n const file = new File([blob], `recording-${Date.now()}.webm`, {\n type: 'audio/webm',\n lastModified: Date.now(),\n });\n\n stream.getTracks().forEach(track => track.stop());\n onFinish(file);\n };\n\n return mediaRecorder;\n}\n","export async function playStreamWithWebAudio(stream: ReadableStream, onEnded?: () => void) {\n const audioContext = new window.AudioContext();\n\n const reader = stream.getReader();\n const chunks = [];\n\n try {\n // Read all chunks\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n }\n\n // Combine chunks into single ArrayBuffer\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combinedBuffer = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combinedBuffer.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Decode and play\n const audioBuffer = await audioContext.decodeAudioData(combinedBuffer.buffer);\n const source = audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.onended = onEnded ?? null;\n source.connect(audioContext.destination);\n source.start();\n\n return () => {\n source.onended = null;\n source.stop();\n void audioContext.close();\n };\n } catch (error) {\n await reader.cancel().catch(() => undefined);\n await audioContext.close().catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n}\n","import type { MastraClient } from '@mastra/client-js';\nimport { useEffect, useRef, useState } from 'react';\nimport { useMastraClient } from '../mastra-client-context';\nimport { recordMicrophoneToFile } from './record-mic-to-file';\n\ntype Agent = ReturnType<MastraClient['getAgent']>;\ntype VoiceRequestContext = Parameters<Agent['voice']['getSpeakers']>[0];\n\nexport interface SpeechRecognitionState {\n isListening: boolean;\n transcript: string;\n error: string | null;\n}\n\nexport interface UseSpeechRecognitionArgs {\n language?: string;\n agentId?: string;\n requestContext?: VoiceRequestContext;\n}\n\ntype SpeechRecognitionResult = SpeechRecognitionState & {\n start: () => void;\n stop: () => void;\n};\n\nexport const useSpeechRecognition = ({\n language = 'en-US',\n agentId,\n requestContext,\n}: UseSpeechRecognitionArgs): SpeechRecognitionResult => {\n const client = useMastraClient();\n const [agent, setAgent] = useState<Agent | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!agentId) {\n setAgent(null);\n return () => {\n cancelled = true;\n };\n }\n\n const agent = client.getAgent(agentId);\n\n const check = async () => {\n try {\n const speakers = await agent.voice.getSpeakers(requestContext);\n if (!cancelled) {\n setAgent(speakers.length > 0 ? agent : null);\n }\n } catch {\n if (!cancelled) {\n setAgent(null);\n }\n }\n };\n\n void check();\n\n return () => {\n cancelled = true;\n };\n }, [agentId, client, requestContext]);\n\n const browserSpeechRecognition = useBrowserSpeechRecognition({ language });\n const mastraSpeechRecognition = useMastraSpeechToText({ agent, language });\n\n if (!agent) {\n return browserSpeechRecognition;\n }\n\n return mastraSpeechRecognition;\n};\n\nconst useBrowserSpeechRecognition = ({ language = 'en-US' }: { language?: string }): SpeechRecognitionResult => {\n const speechRecognitionRef = useRef<any>(null);\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n\n const start = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.start();\n };\n\n const stop = () => {\n if (!speechRecognitionRef.current) return;\n speechRecognitionRef.current.stop();\n };\n\n useEffect(() => {\n if (!('webkitSpeechRecognition' in window) && !('SpeechRecognition' in window)) {\n setState(prev => ({ ...prev, error: 'Speech Recognition not supported in this browser' }));\n return;\n }\n\n const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition;\n const recognition = new SpeechRecognition();\n speechRecognitionRef.current = recognition;\n\n recognition.continuous = true;\n recognition.lang = language;\n\n recognition.onstart = () => {\n setState(prev => ({ ...prev, isListening: true, error: null, transcript: '' }));\n };\n\n recognition.onresult = (event: any) => {\n let finalTranscript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const transcript = event.results[i][0].transcript;\n if (event.results[i].isFinal) {\n finalTranscript += transcript + ' ';\n }\n }\n\n if (!finalTranscript) return;\n // Continuous mode emits one event per finalized phrase with an advancing\n // resultIndex, so append to the session transcript instead of replacing it.\n setState(prev => ({ ...prev, transcript: prev.transcript + finalTranscript }));\n };\n\n recognition.onerror = (event: any) => {\n setState(prev => ({ ...prev, error: `Error: ${event.error}` }));\n };\n\n recognition.onend = () => setState(prev => ({ ...prev, isListening: false }));\n\n return () => {\n try {\n recognition.stop();\n } catch {\n // ignore: recognition may not be running\n }\n recognition.onstart = null;\n recognition.onresult = null;\n recognition.onerror = null;\n recognition.onend = null;\n speechRecognitionRef.current = null;\n };\n }, [language]);\n\n return {\n ...state,\n start,\n stop,\n };\n};\n\nconst useMastraSpeechToText = ({\n agent,\n language,\n}: {\n agent: Agent | null;\n language: string;\n}): SpeechRecognitionResult => {\n const [state, setState] = useState<SpeechRecognitionState>({\n isListening: false,\n transcript: '',\n error: null,\n });\n const recorderRef = useRef<MediaRecorder | null>(null);\n const sessionRef = useRef(0);\n const startInFlightRef = useRef(false);\n\n useEffect(() => {\n return () => {\n sessionRef.current += 1;\n startInFlightRef.current = false;\n recorderRef.current?.stop();\n recorderRef.current = null;\n };\n }, [agent]);\n\n const handleFinish = (session: number) => (file: File) => {\n if (!agent || session !== sessionRef.current) return;\n\n recorderRef.current = null;\n setState(prev => ({ ...prev, isListening: false }));\n\n void agent.voice\n .listen(file, { language })\n .then(res => {\n if (session !== sessionRef.current) return;\n setState(prev => ({ ...prev, transcript: res.text, error: null }));\n })\n .catch(error => {\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to transcribe speech';\n setState(prev => ({ ...prev, error: message }));\n });\n };\n\n const start = () => {\n if (!agent || startInFlightRef.current || recorderRef.current) return;\n\n startInFlightRef.current = true;\n // Bump the session here (not in stop()) so a normal stop's onstop callback\n // still matches sessionRef.current. Only a new start (or unmount) should\n // invalidate a prior in-flight recording's result.\n // See: https://github.com/mastra-ai/mastra/issues/19980\n sessionRef.current += 1;\n const session = sessionRef.current;\n\n void recordMicrophoneToFile(handleFinish(session))\n .then(recorder => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) {\n try {\n recorder.stop();\n } catch {\n // ignore: recorder was never started\n }\n return;\n }\n recorderRef.current = recorder;\n setState(prev => ({ ...prev, isListening: true, error: null }));\n recorder.start();\n })\n .catch(error => {\n startInFlightRef.current = false;\n if (session !== sessionRef.current) return;\n const message = error instanceof Error ? error.message : 'Failed to start speech recording';\n setState(prev => ({ ...prev, isListening: false, error: message }));\n });\n };\n\n const stop = () => {\n if (recorderRef.current) {\n // An active recording — its session was fixed at start() time and hasn't\n // changed, so its own onstop/handleFinish will complete normally.\n recorderRef.current.stop();\n recorderRef.current = null;\n } else if (startInFlightRef.current) {\n // No recorder yet but a start() is still in-flight. Invalidate the\n // session so that start's resolution knows to abort (stop the recorder\n // instead of assigning/starting it) rather than silently proceeding.\n sessionRef.current += 1;\n }\n // Otherwise the hook is idle, or a finished recording's transcription is\n // still in flight — bumping the session then would silently discard the\n // transcript (the same failure class as #19980, in a narrower window).\n startInFlightRef.current = false;\n setState(prev => ({ ...prev, isListening: false }));\n };\n\n return {\n ...state,\n start,\n stop,\n };\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mastra/react",
3
- "version": "1.12.0-alpha.10",
3
+ "version": "1.12.0-alpha.11",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/mastra-ai/mastra.git",
@@ -69,7 +69,7 @@
69
69
  "lucide-react": "^1.37.0",
70
70
  "shiki": "^1.29.2",
71
71
  "tailwind-merge": "^3.5.0",
72
- "@mastra/client-js": "1.56.0-alpha.10"
72
+ "@mastra/client-js": "1.56.0-alpha.11"
73
73
  },
74
74
  "peerDependencies": {
75
75
  "@mastra/core": ">=1.67.0-0 <2.0.0-0",
@@ -100,9 +100,9 @@
100
100
  "vite": "^7.3.1",
101
101
  "vitest": "4.1.11",
102
102
  "zod": "^3.25.76",
103
- "@internal/lint": "0.0.144",
104
103
  "@internal/types-builder": "0.0.119",
105
- "@mastra/core": "1.79.0-alpha.10"
104
+ "@mastra/core": "1.79.0-alpha.11",
105
+ "@internal/lint": "0.0.144"
106
106
  },
107
107
  "engines": {
108
108
  "node": ">=22.13.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"hooks-CIutb3DO.cjs","names":["encodeFilePartDataForStorage","exhaustiveCheck","isDataChunk","isRecord","CLIENT_MESSAGE_ID_KEY","isRecord","CLIENT_MESSAGE_ID_KEY","AIV5Adapter","useMastraClient","convertSignalDataToBase64String","accumulateChunk","MastraClient","accumulateNetworkChunk","finishStreamingAssistantMessage"],"sources":["../src/lib/mastra-db/fromCoreUserMessage.ts","../src/agent/extract-tasks.ts","../src/agent/extractRunIdFromMessages.ts","../src/agent/merge-history.ts","../src/agent/user-message.ts","../src/agent/hooks.ts"],"sourcesContent":["import type { MastraDBMessage, MastraMessagePart } from '@mastra/core/agent/message-list';\nimport type { CoreUserMessage } from '@mastra/core/llm';\nimport { encodeFilePartDataForStorage } from '../../agent/signal-data';\n\n/**\n * Convert a CoreUserMessage into a canonical `MastraDBMessage` (`format: 2`).\n *\n * Image and file inputs are emitted as the canonical V4 `file` part shape\n * (`{ type: 'file', mimeType, data }`) — the exact shape memory resolves on\n * reload (see `AIV4Adapter`), so optimistic-send and reload render identically.\n *\n * Handles all CoreUserMessage content types:\n * - String content → single text part\n * - Array content with text/image/file parts → corresponding `MastraMessagePart`s\n */\nconst coreUserMessageToParts = (coreUserMessage: CoreUserMessage): MastraMessagePart[] =>\n typeof coreUserMessage.content === 'string'\n ? [{ type: 'text' as const, text: coreUserMessage.content }]\n : coreUserMessage.content.map((part): MastraMessagePart => {\n switch (part.type) {\n case 'text': {\n return { type: 'text' as const, text: part.text };\n }\n case 'image': {\n const mimeType = part.mimeType ?? 'image/*';\n return {\n type: 'file' as const,\n mimeType,\n data: encodeFilePartDataForStorage(part.image, mimeType),\n };\n }\n case 'file': {\n return {\n type: 'file' as const,\n mimeType: part.mimeType,\n data: encodeFilePartDataForStorage(part.data, part.mimeType),\n ...(part.filename !== undefined ? { filename: part.filename } : {}),\n };\n }\n default: {\n const exhaustiveCheck: never = part;\n throw new Error(`Unhandled content part type: ${(exhaustiveCheck as { type: string }).type}`);\n }\n }\n });\n\nconst newUserMessage = (parts: MastraMessagePart[]): MastraDBMessage => ({\n id: `user-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`,\n role: 'user',\n createdAt: new Date(),\n content: {\n format: 2,\n parts,\n },\n});\n\nexport const fromCoreUserMessageToMastraDBMessage = (coreUserMessage: CoreUserMessage): MastraDBMessage =>\n newUserMessage(coreUserMessageToParts(coreUserMessage));\n\n/**\n * Merge multiple `CoreUserMessage`s into a single canonical `MastraDBMessage`.\n *\n * A user turn that carries attachments arrives as several `CoreUserMessage`s\n * (one for the text, one per attachment). Flatten their parts for the optimistic\n * display. The send path must also submit a single multipart message: this\n * display conversion alone cannot combine separately persisted messages.\n */\nexport const fromCoreUserMessagesToMastraDBMessage = (coreUserMessages: CoreUserMessage[]): MastraDBMessage =>\n newUserMessage(coreUserMessages.flatMap(coreUserMessageToParts));\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { TaskItem } from '@mastra/core/signals';\nimport type { ChunkType, DataChunkType } from '@mastra/core/stream';\n\nexport const TASK_TOOL_NAMES = new Set(['task_write', 'task_update', 'task_complete', 'task_check']);\nconst TASK_SIGNAL_ID = 'tasks';\nconst TASK_TAG_NAMES = new Set(['current-task-list', 'task-list-update']);\nconst TASK_STATUSES = new Set(['pending', 'in_progress', 'completed']);\n\ntype DataChunk = Extract<ChunkType, DataChunkType>;\n\nconst isDataChunk = (chunk: ChunkType): chunk is DataChunk =>\n typeof chunk.type === 'string' && chunk.type.startsWith('data-');\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nconst isTaskStatus = (value: unknown): value is TaskItem['status'] =>\n typeof value === 'string' && TASK_STATUSES.has(value);\n\nexport const isTaskItemArray = (value: unknown): value is TaskItem[] =>\n Array.isArray(value) &&\n value.every(\n item =>\n isRecord(item) &&\n typeof item.id === 'string' &&\n typeof item.content === 'string' &&\n isTaskStatus(item.status) &&\n typeof item.activeForm === 'string',\n );\n\nconst isTaskSignal = (value: unknown): boolean => {\n if (!isRecord(value)) return false;\n return value.id === TASK_SIGNAL_ID || (typeof value.tagName === 'string' && TASK_TAG_NAMES.has(value.tagName));\n};\n\nconst extractTasksFromSignalData = (data: unknown): TaskItem[] | undefined => {\n if (!isTaskSignal(data) || !isRecord(data)) return undefined;\n const metadata = data.metadata;\n if (!isRecord(metadata)) return undefined;\n const value = metadata.value;\n if (!isRecord(value)) return undefined;\n return isTaskItemArray(value.tasks) ? value.tasks : undefined;\n};\n\nconst parseTasksFromResult = (raw: unknown): TaskItem[] | undefined => {\n if (isRecord(raw) && isTaskItemArray(raw.tasks)) return raw.tasks;\n\n if (typeof raw !== 'string') return undefined;\n\n try {\n const parsed: unknown = JSON.parse(raw);\n return isRecord(parsed) && isTaskItemArray(parsed.tasks) ? parsed.tasks : undefined;\n } catch {\n return undefined;\n }\n};\n\nexport const extractTasksFromSignalChunk = (chunk: ChunkType): TaskItem[] | undefined => {\n if (!isDataChunk(chunk)) return undefined;\n return extractTasksFromSignalData(chunk.data);\n};\n\nexport const extractTasksFromToolResultChunk = (chunk: ChunkType): TaskItem[] | undefined => {\n if (chunk.type !== 'tool-result') return undefined;\n const payload = chunk.payload;\n if (!isRecord(payload) || typeof payload.toolName !== 'string' || !TASK_TOOL_NAMES.has(payload.toolName)) {\n return undefined;\n }\n return parseTasksFromResult(payload.result);\n};\n\nconst extractTasksFromToolInvocationPart = (part: unknown): TaskItem[] | undefined => {\n if (!isRecord(part) || part.type !== 'tool-invocation' || !isRecord(part.toolInvocation)) return undefined;\n const toolInvocation = part.toolInvocation;\n if (typeof toolInvocation.toolName !== 'string' || !TASK_TOOL_NAMES.has(toolInvocation.toolName)) return undefined;\n return parseTasksFromResult(toolInvocation.result);\n};\n\nconst extractTasksFromDataPart = (part: unknown): TaskItem[] | undefined => {\n if (!isRecord(part) || typeof part.type !== 'string' || !part.type.startsWith('data-')) return undefined;\n return extractTasksFromSignalData(part.data);\n};\n\nconst extractTasksFromSignalMessage = (message: MastraDBMessage): TaskItem[] | undefined => {\n if (message.role !== 'signal') return undefined;\n const metadata = message.content?.metadata;\n if (!isRecord(metadata)) return undefined;\n return extractTasksFromSignalData(metadata.signal);\n};\n\nexport const extractLatestTasksFromMessages = (messages: MastraDBMessage[]): TaskItem[] => {\n let latest: TaskItem[] | undefined;\n\n for (const message of messages) {\n for (const part of message.content?.parts ?? []) {\n const toolTasks = extractTasksFromToolInvocationPart(part);\n if (toolTasks !== undefined) latest = toolTasks;\n }\n\n const signalTasks = extractTasksFromSignalMessage(message);\n if (signalTasks !== undefined) latest = signalTasks;\n\n for (const part of message.content?.parts ?? []) {\n const dataTasks = extractTasksFromDataPart(part);\n if (dataTasks !== undefined) latest = dataTasks;\n }\n }\n\n return latest ?? [];\n};\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\n\ntype RunIdMetadataEntry = { runId?: unknown };\ntype RunIdMetadataSource = Record<string, RunIdMetadataEntry>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === 'object';\n\nconst runIdMetadataKeys = ['pendingToolApprovals', 'requireApprovalMetadata', 'suspendedTools'] as const;\n\nconst isRunIdMetadataSource = (value: unknown): value is RunIdMetadataSource =>\n isRecord(value) && Object.values(value).every(entry => isRecord(entry));\n\nconst getRunIdMetadataSources = (metadata: unknown): RunIdMetadataSource[] => {\n if (!isRecord(metadata)) return [];\n\n const sources: RunIdMetadataSource[] = [];\n for (const key of runIdMetadataKeys) {\n const source = metadata[key];\n if (isRunIdMetadataSource(source)) {\n sources.push(source);\n }\n }\n return sources;\n};\n\n/**\n * Scan initial DB-shape messages for any pending approvals, suspended tools, or\n * `requireApprovalMetadata` entries and return the first non-empty `runId`.\n *\n * Metadata is read off `message.content.metadata`, the canonical location for\n * MastraDBMessage UX hints.\n */\nexport const extractRunIdFromMessages = (messages: MastraDBMessage[]): string | undefined => {\n for (const message of messages) {\n for (const source of getRunIdMetadataSources(message.content?.metadata)) {\n for (const entry of Object.values(source)) {\n if (isRecord(entry) && typeof entry.runId === 'string' && entry.runId.length > 0) {\n return entry.runId;\n }\n }\n }\n }\n\n return undefined;\n};\n","import type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport { CLIENT_MESSAGE_ID_KEY } from '../lib/mastra-db';\nimport { isRecord } from './extract-tasks';\n\nconst liveClientMessageId = (message: MastraDBMessage): string | undefined => {\n const clientMessageId = message.content.metadata?.[CLIENT_MESSAGE_ID_KEY];\n return typeof clientMessageId === 'string' ? clientMessageId : undefined;\n};\n\n// A stored user signal keeps the sender's metadata under `metadata.signal.metadata`.\nconst storedClientMessageId = (message: MastraDBMessage): string | undefined => {\n const signal = message.content.metadata?.signal;\n const clientMessageId =\n isRecord(signal) && isRecord(signal.metadata) ? signal.metadata[CLIENT_MESSAGE_ID_KEY] : undefined;\n return typeof clientMessageId === 'string' ? clientMessageId : undefined;\n};\n\nexport const mergeHistoryIntoConversation = ({\n conversation,\n history,\n previousHistory,\n}: {\n conversation: MastraDBMessage[];\n history: MastraDBMessage[];\n previousHistory: MastraDBMessage[];\n}): MastraDBMessage[] => {\n const previousById = new Map(previousHistory.map(message => [message.id, message]));\n const live = conversation.filter(message => previousById.get(message.id) !== message);\n const liveById = new Map(live.map(message => [message.id, message]));\n const liveClientMessageIds = new Set(live.flatMap(message => liveClientMessageId(message) ?? []));\n const historyIds = new Set(history.map(message => message.id));\n const storedClientMessageIds = new Set(history.flatMap(message => storedClientMessageId(message) ?? []));\n\n const mergedHistory = history.map(message => {\n const liveCopy = liveById.get(message.id);\n if (liveCopy) return liveCopy;\n const clientMessageId = storedClientMessageId(message);\n if (!clientMessageId || !liveClientMessageIds.has(clientMessageId)) return message;\n // Rows key on the client id; keeping it stops the user row remounting mid-answer.\n return {\n ...message,\n content: {\n ...message.content,\n metadata: { ...message.content.metadata, [CLIENT_MESSAGE_ID_KEY]: clientMessageId },\n },\n };\n });\n const unstoredLive = live.filter(message => {\n const clientMessageId = liveClientMessageId(message);\n return !historyIds.has(message.id) && !(clientMessageId && storedClientMessageIds.has(clientMessageId));\n });\n\n return [...mergedHistory, ...unstoredLive];\n};\n","import type { CoreUserMessage } from '@mastra/core/llm';\n\ntype UserPart = Exclude<CoreUserMessage['content'], string>[number];\n\nconst messageParts = (message: CoreUserMessage): UserPart[] => {\n const parts: UserPart[] =\n typeof message.content === 'string' ? [{ type: 'text', text: message.content }] : message.content;\n const inheritedOptions = message.providerOptions ?? message.experimental_providerMetadata;\n if (!inheritedOptions) return parts;\n\n return parts.map(part => {\n const providerOptions = { ...inheritedOptions };\n for (const [provider, options] of Object.entries(\n part.providerOptions ?? part.experimental_providerMetadata ?? {},\n )) {\n providerOptions[provider] = { ...providerOptions[provider], ...options };\n }\n return { ...part, providerOptions };\n });\n};\n\n/** One send is one user message, with each attachment retained as a content part. */\nexport const createUserMessage = (text: string, attachments: CoreUserMessage[] = []): CoreUserMessage => ({\n role: 'user',\n content: [\n ...(text || attachments.length === 0 ? [{ type: 'text' as const, text }] : []),\n ...attachments.flatMap(messageParts),\n ],\n});\n","import { v4 as uuid } from '@lukeed/uuid';\nimport { MastraClient } from '@mastra/client-js';\nimport type { SendAgentSignalParams } from '@mastra/client-js';\nimport type { AIV5Type, MastraDBMessage, MastraToolInvocationPart } from '@mastra/core/agent/message-list';\nimport { AIV5Adapter } from '@mastra/core/agent/message-list';\nimport type { CoreUserMessage } from '@mastra/core/llm';\nimport type { TracingOptions } from '@mastra/core/observability';\nimport type { RequestContext } from '@mastra/core/request-context';\nimport type { TaskItem } from '@mastra/core/signals';\nimport type { ChunkType, DataChunkType, NetworkChunkType } from '@mastra/core/stream';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n accumulateChunk,\n accumulateNetworkChunk,\n CLIENT_MESSAGE_ID_KEY,\n finishStreamingAssistantMessage,\n fromCoreUserMessagesToMastraDBMessage,\n} from '../lib/mastra-db';\nimport type { MastraDBMessageMetadata } from '../lib/mastra-db';\nimport { useMastraClient } from '../mastra-client-context';\nimport {\n extractLatestTasksFromMessages,\n extractTasksFromSignalChunk,\n extractTasksFromToolResultChunk,\n} from './extract-tasks';\nimport { extractRunIdFromMessages } from './extractRunIdFromMessages';\nimport { mergeHistoryIntoConversation } from './merge-history';\nimport { convertSignalDataToBase64String } from './signal-data';\nimport type { ClientToolsInput, ClientToolsResolver, ModelSettings } from './types';\nimport { createUserMessage } from './user-message';\n\nconst extractPendingToolApprovalIdsFromMessages = (messages: MastraDBMessage[], runId?: string) => {\n const pendingToolApprovalIds = new Set<string>();\n\n for (const message of messages) {\n const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n if (!metadata) continue;\n\n const metadataSources = [\n metadata.pendingToolApprovals,\n metadata.requireApprovalMetadata,\n metadata.suspendedTools,\n ] as Array<Record<string, { toolCallId?: unknown; runId?: unknown }> | undefined>;\n\n for (const source of metadataSources) {\n if (!source || typeof source !== 'object') continue;\n\n for (const suspensionData of Object.values(source)) {\n if (runId && suspensionData?.runId !== runId) continue;\n const toolCallId = suspensionData?.toolCallId;\n if (typeof toolCallId === 'string' && toolCallId.length > 0) {\n pendingToolApprovalIds.add(toolCallId);\n }\n }\n }\n }\n\n return pendingToolApprovalIds;\n};\n\nconst toolCallHasOutput = (parts: MastraDBMessage['content']['parts'], toolCallId: string): boolean =>\n parts.some(part => {\n if (part.type !== 'tool-invocation') return false;\n const invocation = (part as MastraToolInvocationPart).toolInvocation;\n if (invocation.toolCallId !== toolCallId) return false;\n return invocation.state === 'result' || (invocation as { result?: unknown }).result != null;\n });\n\nconst filterUnresolvedApprovals = <T extends { toolCallId: string }>(\n entries: Record<string, T> | undefined,\n parts: MastraDBMessage['content']['parts'],\n): Record<string, T> | undefined => {\n if (!entries || typeof entries !== 'object') return undefined;\n const pending = Object.fromEntries(\n Object.entries(entries).filter(\n ([, approval]) =>\n approval &&\n typeof approval === 'object' &&\n typeof approval.toolCallId === 'string' &&\n !toolCallHasOutput(parts, approval.toolCallId),\n ),\n );\n return Object.keys(pending).length ? pending : undefined;\n};\n\n/**\n * Normalize persisted initial messages back into the stream-friendly shape the\n * UI renders from. Mirrors `main`'s `resolveInitialMessages`:\n *\n * - Converts persisted `pendingToolApprovals` (DB shape) into\n * `requireApprovalMetadata` (stream shape) so reloaded threads still render\n * approve/decline buttons, filtering out approvals whose tool already\n * produced output, and marks the message `mode: 'stream'`.\n * - Drops assistant completion messages flagged `suppressFeedback`, which are\n * persisted by the supervisor agent but must stay hidden on reload.\n */\nconst resolveInitialMessages = (messages: MastraDBMessage[]): MastraDBMessage[] =>\n messages\n .filter(message => {\n const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n if (metadata?.completionResult?.suppressFeedback || metadata?.isTaskCompleteResult?.suppressFeedback) {\n return false;\n }\n return true;\n })\n .map(message => {\n const metadata = message.content?.metadata as MastraDBMessageMetadata | undefined;\n\n // A persisted/refetched thread must never show a stuck \"sending\" bubble\n // and must never carry the optimistic correlation key: the pending status\n // and its `clientMessageId` are transient UI state. The `clientMessageId`\n // can survive into storage (it is sent to the server with the message), so\n // strip it on every reload regardless of pending status; the rendered row\n // key falls back to the stable server `id`.\n const normalizedMessage =\n metadata && (metadata.status === 'pending' || CLIENT_MESSAGE_ID_KEY in metadata)\n ? (() => {\n const { [CLIENT_MESSAGE_ID_KEY]: _omitClientMessageId, ...rest } = metadata;\n const { status: _omitStatus, ...restWithoutStatus } = rest;\n return {\n ...message,\n content: {\n ...message.content,\n metadata: metadata.status === 'pending' ? restWithoutStatus : rest,\n },\n };\n })()\n : message;\n\n const normalizedMetadata = normalizedMessage.content?.metadata as MastraDBMessageMetadata | undefined;\n if (\n !normalizedMetadata?.pendingToolApprovals &&\n !normalizedMetadata?.requireApprovalMetadata &&\n !normalizedMetadata?.suspendedTools\n ) {\n return normalizedMessage;\n }\n\n const { pendingToolApprovals, requireApprovalMetadata, suspendedTools, ...restMetadata } = normalizedMetadata;\n const parts = normalizedMessage.content.parts;\n const pending = filterUnresolvedApprovals(pendingToolApprovals, parts);\n const required = { ...filterUnresolvedApprovals(requireApprovalMetadata, parts), ...pending };\n const suspended = filterUnresolvedApprovals(suspendedTools, parts);\n\n return {\n ...normalizedMessage,\n content: {\n ...normalizedMessage.content,\n metadata: {\n ...restMetadata,\n ...(pendingToolApprovals ? { mode: 'stream' as const } : {}),\n ...(pending ? { pendingToolApprovals: pending } : {}),\n ...(Object.keys(required).length ? { requireApprovalMetadata: required } : {}),\n ...(suspended ? { suspendedTools: suspended } : {}),\n },\n },\n };\n });\n\ntype SignalContinuationOptions = {\n model?: string;\n maxSteps?: number;\n modelSettings?: {\n frequencyPenalty?: number;\n presencePenalty?: number;\n maxRetries?: number;\n maxOutputTokens?: number;\n temperature?: number;\n topK?: number;\n topP?: number;\n };\n instructions?: ModelSettings['instructions'];\n system?: ModelSettings['system'];\n providerOptions?: ModelSettings['providerOptions'];\n requireToolApproval?: boolean;\n tracingOptions?: TracingOptions;\n};\n\ntype ActiveContinuation = {\n model?: string;\n requestContext?: RequestContext;\n};\n\nexport interface MastraChatProps {\n agentId: string;\n resourceId?: string;\n threadId?: string;\n initialMessages?: MastraDBMessage[];\n /** Persistent request context used for tool approval/decline calls (e.g. agentVersionId). */\n requestContext?: RequestContext;\n /**\n * Client-side tool definitions. Forwarded once to `subscribeToThread` so\n * the client-js subscription drives the full client-tool execution loop\n * (execute, emit tool-result, continuation) without any logic in React.\n */\n clientTools?: ClientToolsInput;\n onSignalSent?: (signalId: string, preview: string) => void;\n onSignalEcho?: (signalId: string) => void;\n onThreadSignalsUnsupported?: () => void;\n /**\n * Use the agent-signals streaming path (sendSignal + subscribeToThread).\n * Defaults to `false`; set to `true` to opt into thread signals.\n */\n enableThreadSignals?: boolean;\n /** Override the legacy stream route for editor-owned hidden agents. */\n streamPath?: string;\n /**\n * Load stored thread messages through the thread subscription instead of\n * `initialMessages`. The subscription sends them as one `thread-history`\n * chunk and skips run parts already covered by it. Requires thread signals.\n */\n withInitialHistory?: boolean | { perPage?: number };\n}\n\ninterface SharedArgs {\n coreUserMessages: CoreUserMessage[];\n model?: string;\n requestContext?: RequestContext;\n threadId?: string;\n modelSettings?: ModelSettings;\n signal?: AbortSignal;\n tracingOptions?: TracingOptions;\n}\n\n/** JSON-serializable metadata attached to a user message sent through `useChat`. */\nexport type UserMessageMetadata = NonNullable<SendAgentSignalParams['signal']['metadata']>;\n\nexport type SendMessageArgs = {\n message: string;\n coreUserMessages?: CoreUserMessage[];\n /**\n * Custom metadata for the user message. It is merged into the optimistic\n * message's `content.metadata` and, on the thread-signals path, sent with the\n * outgoing message. Internal keys (`mode`, `status`, `clientMessageId`) take\n * precedence over user-supplied values.\n */\n metadata?: UserMessageMetadata;\n} & (\n | ({ mode: 'generate' } & Omit<GenerateArgs, 'coreUserMessages'>)\n | ({ mode: 'stream' } & Omit<StreamArgs, 'coreUserMessages'>)\n | ({ mode: 'network' } & Omit<NetworkArgs, 'coreUserMessages'>)\n | ({ mode?: undefined } & Omit<StreamArgs, 'coreUserMessages'>)\n);\n\nexport type GenerateArgs = SharedArgs & {\n onFinish?: (messages: MastraDBMessage[]) => Promise<void>;\n clientTools?: ClientToolsInput;\n clientToolsResolver?: ClientToolsResolver;\n};\n\nexport type StreamArgs = SharedArgs & {\n onChunk?: (chunk: ChunkType) => Promise<void>;\n clientTools?: ClientToolsInput;\n clientToolsResolver?: ClientToolsResolver;\n signalId?: string;\n /**\n * Client-generated correlation id stamped on the optimistic pending bubble\n * and the outgoing message metadata so the server echo can reconcile them.\n */\n clientMessageId?: string;\n /** Custom user-message metadata sent alongside the thread signal. */\n metadata?: UserMessageMetadata;\n};\n\nexport type NetworkArgs = SharedArgs & {\n onNetworkChunk?: (chunk: NetworkChunkType) => Promise<void>;\n};\n\nconst isObject = (value: unknown): value is Record<string, unknown> => typeof value === 'object' && value !== null;\n\nconst getErrorName = (error: unknown) => (isObject(error) && typeof error.name === 'string' ? error.name : undefined);\n\nconst isAbortError = (error: unknown) => getErrorName(error) === 'AbortError';\n\nconst isThreadSignalUnsupportedError = (error: unknown) => {\n if (!isObject(error)) return false;\n\n const status = error.status;\n if (status === 404 || status === 405 || status === 501) {\n return true;\n }\n\n return (\n status === 400 &&\n typeof error.message === 'string' &&\n error.message.includes('No active agent run found for signal target')\n );\n};\n\ntype DataChunk = Extract<ChunkType, DataChunkType>;\n\nconst isDataChunk = (chunk: ChunkType): chunk is DataChunk =>\n typeof chunk.type === 'string' && chunk.type.startsWith('data-');\n\n/**\n * Convert AI-SDK v5 UIMessages returned by the server (generate mode) into\n * `MastraDBMessage[]`, stamping the supplied metadata onto each message's\n * `content.metadata`. Private helper — `useChat` never exposes the AI-SDK\n * shape to consumers.\n */\nconst dbFromServerUiMessages = (\n uiMessages: AIV5Type.UIMessage[],\n metadata: MastraDBMessageMetadata,\n): MastraDBMessage[] =>\n uiMessages.map(uiMsg => {\n const dbMsg = AIV5Adapter.fromUIMessage(uiMsg);\n return {\n ...dbMsg,\n content: {\n ...dbMsg.content,\n metadata: {\n ...(dbMsg.content.metadata ?? {}),\n ...metadata,\n },\n },\n };\n });\n\nexport const useChat = ({\n agentId,\n resourceId,\n threadId,\n initialMessages,\n requestContext: propsRequestContext,\n clientTools: hookClientTools,\n onSignalSent,\n onSignalEcho,\n onThreadSignalsUnsupported,\n enableThreadSignals = false,\n streamPath,\n withInitialHistory,\n}: MastraChatProps) => {\n const threadSignalsDisabled = enableThreadSignals === false;\n const _currentRunId = useRef<string | undefined>(undefined);\n const _onChunk = useRef<((chunk: ChunkType) => Promise<void>) | undefined>(undefined);\n const _networkRunId = useRef<string | undefined>(undefined);\n const _onNetworkChunk = useRef<((chunk: NetworkChunkType) => Promise<void>) | undefined>(undefined);\n const _activeContinuation = useRef<ActiveContinuation>({ requestContext: propsRequestContext });\n // Tracks the active stream (untilIdle) request so a subsequent stream() call\n // can abort the previous one. Without this, a still-open prior stream keeps\n // its background-task pubsub subscription alive and fans events into a second\n // concurrent UI consumer, producing duplicate bg-task events and duplicate\n // continuation turns on the server.\n const _streamAbortRef = useRef<AbortController | null>(null);\n const _threadSubscriptionAbortRef = useRef<AbortController | null>(null);\n const _threadSubscriptionRef = useRef<{ abort?: () => Promise<boolean> | boolean; unsubscribe?: () => void } | null>(\n null,\n );\n const _threadSubscriptionKeyRef = useRef<string | undefined>(undefined);\n const _threadSubscriptionPromiseRef = useRef<Promise<void> | null>(null);\n const _threadSignalsUnsupportedRef = useRef(false);\n const [messages, setMessages] = useState<MastraDBMessage[]>([]);\n const [tasks, setTasks] = useState<TaskItem[]>([]);\n const liveTasks = useRef<TaskItem[] | undefined>(undefined);\n const [toolCallApprovals, setToolCallApprovals] = useState<{\n [toolCallId: string]: { status: 'approved' | 'declined' };\n }>({});\n const [networkToolCallApprovals, setNetworkToolCallApprovals] = useState<{\n [toolName: string]: { status: 'approved' | 'declined' };\n }>({});\n const pendingToolApprovalIdsRef = useRef(new Set<string>());\n const liveApprovalIds = useRef(new Set<string>());\n const liveRunId = useRef<string | undefined>(undefined);\n const liveRunFinished = useRef(false);\n const [isAwaitingToolApproval, setIsAwaitingToolApproval] = useState(false);\n\n const baseClient = useMastraClient();\n const [isRunning, setIsRunning] = useState(false);\n const [subscriptionHistory, setSubscriptionHistory] = useState<\n { key: string; messages: MastraDBMessage[] } | undefined\n >(undefined);\n // `hasMore` from the initial `thread-history` chunk, keyed by the subscription\n // that delivered it so a stale page never describes a different thread or config.\n const [subscriptionPagination, setSubscriptionPagination] = useState<\n { key: string; pagination: { hasMore: boolean } } | undefined\n >(undefined);\n const historyKey = `${agentId}:${resourceId ?? ''}:${threadId ?? ''}`;\n const historyConfigKey = !withInitialHistory\n ? ''\n : withInitialHistory === true\n ? 'history'\n : `history:${withInitialHistory.perPage ?? ''}`;\n const initialHistoryPagination: { hasMore: boolean } | undefined =\n withInitialHistory &&\n !threadSignalsDisabled &&\n threadId &&\n subscriptionPagination?.key ===\n `${agentId}:${resourceId || agentId}:${threadId}:${streamPath ?? ''}:${historyConfigKey}`\n ? subscriptionPagination.pagination\n : undefined;\n const hydratedMessages =\n withInitialHistory && subscriptionHistory?.key === historyKey ? subscriptionHistory.messages : initialMessages;\n\n const lastHydration = useRef<\n | {\n agentId: string;\n resourceId?: string;\n threadId?: string;\n initialMessages: MastraChatProps['initialMessages'];\n formattedMessages: MastraDBMessage[];\n }\n | undefined\n >(undefined);\n\n useEffect(() => {\n const previous = lastHydration.current;\n const sameThread =\n previous?.agentId === agentId && previous.resourceId === resourceId && previous.threadId === threadId;\n if (sameThread && previous.initialMessages === hydratedMessages) return;\n const formattedMessages = resolveInitialMessages(hydratedMessages ?? []);\n lastHydration.current = { agentId, resourceId, threadId, initialMessages: hydratedMessages, formattedMessages };\n\n if (sameThread) {\n setMessages(current =>\n mergeHistoryIntoConversation({\n conversation: current,\n history: formattedMessages,\n previousHistory: previous.formattedMessages,\n }),\n );\n setTasks(liveTasks.current ?? extractLatestTasksFromMessages(formattedMessages));\n // History may arrive before the live approval event, but must not undo\n // a live approval decision or terminal event, nor switch the active run.\n const historyRunId = extractRunIdFromMessages(formattedMessages);\n if (liveRunFinished.current) return;\n if (!liveRunId.current && isRunning && historyRunId !== _currentRunId.current) return;\n } else {\n liveTasks.current = undefined;\n liveApprovalIds.current.clear();\n liveRunId.current = undefined;\n liveRunFinished.current = false;\n if (previous) setIsRunning(false);\n setMessages(formattedMessages);\n setTasks(extractLatestTasksFromMessages(formattedMessages));\n }\n const pendingApprovals = extractPendingToolApprovalIdsFromMessages(formattedMessages, liveRunId.current);\n for (const toolCallId of liveApprovalIds.current) {\n if (pendingToolApprovalIdsRef.current.has(toolCallId)) pendingApprovals.add(toolCallId);\n else pendingApprovals.delete(toolCallId);\n }\n pendingToolApprovalIdsRef.current = pendingApprovals;\n setIsAwaitingToolApproval(pendingApprovals.size > 0);\n _currentRunId.current = liveRunId.current ?? extractRunIdFromMessages(formattedMessages);\n }, [agentId, resourceId, threadId, hydratedMessages, isRunning, isAwaitingToolApproval]);\n\n useEffect(() => {\n _activeContinuation.current = {\n ..._activeContinuation.current,\n requestContext: propsRequestContext,\n };\n }, [propsRequestContext]);\n\n type SignalContentPart =\n | { type: 'text'; text: string }\n | { type: 'file'; data: string; mediaType: string; filename?: string };\n type UserMessageSignalContents = string | SignalContentPart[];\n\n const normalizeSignalFileData = (data: string | URL | ArrayBuffer | Uint8Array) => {\n if (data instanceof URL) return data.toString();\n return convertSignalDataToBase64String(data);\n };\n\n const getSignalContents = (coreUserMessages: CoreUserMessage[]): UserMessageSignalContents => {\n const parts = coreUserMessages.reduce<SignalContentPart[]>((allParts, message) => {\n if (typeof message.content === 'string') {\n allParts.push({ type: 'text', text: message.content });\n return allParts;\n }\n\n for (const part of message.content) {\n if (part.type === 'text') {\n allParts.push({ type: 'text', text: part.text });\n } else if (part.type === 'file') {\n allParts.push({\n type: 'file',\n data: normalizeSignalFileData(part.data),\n mediaType: part.mimeType,\n ...(part.filename ? { filename: part.filename } : {}),\n });\n } else if (part.type === 'image') {\n allParts.push({\n type: 'file',\n data: normalizeSignalFileData(part.image),\n mediaType: part.mimeType ?? 'image/png',\n });\n }\n }\n\n return allParts;\n }, []);\n\n return parts.length === 1 && parts[0]?.type === 'text' ? parts[0].text : parts;\n };\n\n const markThreadSignalsUnsupported = useCallback(() => {\n _threadSignalsUnsupportedRef.current = true;\n onThreadSignalsUnsupported?.();\n }, [onThreadSignalsUnsupported]);\n\n const getSignalPreview = (coreUserMessages: CoreUserMessage[]) => {\n const preview = coreUserMessages\n .flatMap(message => {\n if (typeof message.content === 'string') {\n return [message.content];\n }\n\n return message.content.map(part => {\n if (part.type === 'text') return part.text;\n if (part.type === 'image') return 'Image';\n return part.filename ? `File: ${part.filename}` : 'File';\n });\n })\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n return preview || 'Attachment';\n };\n\n const closeThreadSubscription = useCallback(() => {\n const subscription = _threadSubscriptionRef.current;\n if (subscription?.unsubscribe) {\n subscription.unsubscribe();\n } else {\n _threadSubscriptionAbortRef.current?.abort();\n }\n _threadSubscriptionRef.current = null;\n _threadSubscriptionAbortRef.current = null;\n _threadSubscriptionKeyRef.current = undefined;\n _threadSubscriptionPromiseRef.current = null;\n setSubscriptionPagination(undefined);\n }, []);\n\n const processStreamChunk = useCallback(\n async (chunk: ChunkType, onChunk?: (chunk: ChunkType) => Promise<void>) => {\n const isTerminal = chunk.type === 'finish' || chunk.type === 'abort' || chunk.type === 'error';\n // A delayed terminal event must not finish another run's message, clear\n // its approvals, or trigger its completion callback.\n if (isTerminal && liveRunId.current && chunk.runId !== liveRunId.current) return;\n const runId = 'runId' in chunk && typeof chunk.runId === 'string' ? chunk.runId : undefined;\n setMessages(prev => {\n const metadata = { mode: 'stream' as const, runId };\n const next = accumulateChunk({ chunk, conversation: prev, metadata });\n // A resumed response can already exist in history; explicit framing\n // establishes ownership even when the accumulator deduplicates it.\n if ((chunk.type === 'start' || chunk.type === 'step-start') && chunk.payload?.messageId && runId) {\n return next.map(message =>\n message.id === chunk.payload.messageId && message.role === 'assistant'\n ? { ...message, content: { ...message.content, metadata: { ...message.content.metadata, ...metadata } } }\n : message,\n );\n }\n return next;\n });\n\n const streamedTasks = extractTasksFromToolResultChunk(chunk) ?? extractTasksFromSignalChunk(chunk);\n if (streamedTasks !== undefined) {\n liveTasks.current = streamedTasks;\n setTasks(streamedTasks);\n }\n\n if (\n chunk.type === 'data-user-message' &&\n isDataChunk(chunk) &&\n (chunk.data?.type === 'user-message' || chunk.data?.type === 'user') &&\n typeof chunk.data?.id === 'string'\n ) {\n onSignalEcho?.(chunk.data.id);\n }\n\n if (chunk.type === 'start') {\n setIsRunning(true);\n if ('runId' in chunk && typeof chunk.runId === 'string') {\n if (liveRunId.current !== chunk.runId) liveApprovalIds.current.clear();\n liveRunFinished.current = false;\n liveRunId.current = chunk.runId;\n _currentRunId.current = chunk.runId;\n }\n }\n\n if (chunk.type === 'tool-call-approval' || chunk.type === 'tool-call-suspended') {\n const toolCallId = chunk.payload?.toolCallId;\n if (typeof toolCallId === 'string') {\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.add(toolCallId);\n setIsAwaitingToolApproval(true);\n }\n // Some runs (e.g. Inngest durable agents) emit no `start` chunk, so the\n // approval chunk is the only place the run ID reaches the client.\n if (runId) {\n if (!liveRunId.current || liveRunFinished.current) {\n liveRunId.current = runId;\n liveRunFinished.current = false;\n }\n if (liveRunId.current === runId) {\n _currentRunId.current = runId;\n }\n }\n setIsRunning(false);\n }\n\n if (chunk.type === 'tool-call-resumed') {\n const toolCallId = chunk.payload?.toolCallId;\n if (typeof toolCallId === 'string') {\n // Keep it as a live decision so stale hydrated history can't re-mark it pending.\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.delete(toolCallId);\n setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n }\n }\n\n if (isTerminal) {\n if (chunk.runId === liveRunId.current) liveRunFinished.current = true;\n for (const toolCallId of pendingToolApprovalIdsRef.current) liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.clear();\n setIsAwaitingToolApproval(false);\n setIsRunning(false);\n }\n\n void (onChunk ?? _onChunk.current)?.(chunk);\n },\n [onSignalEcho],\n );\n\n const ensureThreadSubscription = useCallback(\n async ({ threadId, resourceId }: { threadId: string; resourceId?: string }) => {\n const subscriptionKey = `${agentId}:${resourceId ?? ''}:${threadId}:${streamPath ?? ''}:${historyConfigKey}`;\n if (_threadSubscriptionKeyRef.current === subscriptionKey && _threadSubscriptionPromiseRef.current) {\n await _threadSubscriptionPromiseRef.current;\n return;\n }\n\n closeThreadSubscription();\n const subscriptionAbort = new AbortController();\n _threadSubscriptionAbortRef.current = subscriptionAbort;\n _threadSubscriptionKeyRef.current = subscriptionKey;\n\n // Release the cached subscription state, but only while this attempt\n // still owns it — a newer attempt cleans up after itself.\n const releaseSubscriptionRefs = () => {\n if (_threadSubscriptionAbortRef.current !== subscriptionAbort) return;\n _threadSubscriptionRef.current = null;\n _threadSubscriptionAbortRef.current = null;\n _threadSubscriptionKeyRef.current = undefined;\n _threadSubscriptionPromiseRef.current = null;\n setSubscriptionPagination(undefined);\n };\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: subscriptionAbort.signal,\n });\n const subscriptionAgent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n _threadSubscriptionPromiseRef.current = subscriptionAgent\n .subscribeToThread({ resourceId, threadId, ...(withInitialHistory ? { withInitialHistory } : {}) })\n .then(response => {\n const subscription = response;\n if (_threadSubscriptionAbortRef.current !== subscriptionAbort) {\n subscription.unsubscribe();\n return;\n }\n\n _threadSubscriptionRef.current = subscription;\n void subscription\n .processDataStream({\n onChunk: chunk => {\n if (chunk.type === 'thread-history') {\n if (_threadSubscriptionAbortRef.current === subscriptionAbort) {\n const { hasMore } = chunk.payload;\n setSubscriptionPagination(\n typeof hasMore === 'boolean' ? { key: subscriptionKey, pagination: { hasMore } } : undefined,\n );\n }\n // Merge history into `messages` now, as a queued update, so the\n // live chunks right behind it accumulate onto the stored parts.\n const history = resolveInitialMessages(chunk.payload.messages);\n const previousHistory = lastHydration.current?.formattedMessages ?? [];\n setMessages(current =>\n mergeHistoryIntoConversation({ conversation: current, history, previousHistory }),\n );\n setSubscriptionHistory({\n key: `${agentId}:${resourceId ?? ''}:${threadId}`,\n messages: chunk.payload.messages,\n });\n return;\n }\n return processStreamChunk(chunk);\n },\n })\n .catch(error => {\n if (!isAbortError(error)) {\n console.error('[useChat] Thread subscription failed', error);\n setIsRunning(false);\n }\n })\n .finally(() => {\n if (_threadSubscriptionRef.current === subscription) {\n _threadSubscriptionRef.current = null;\n }\n releaseSubscriptionRefs();\n });\n })\n .catch(error => {\n // Release on every failure so the next call retries with a fresh\n // fetch instead of re-awaiting this rejected promise. Without this,\n // an aborted mount-time subscribe strands the channel and the reply\n // never arrives until reload (issue #18768).\n releaseSubscriptionRefs();\n\n if (isThreadSignalUnsupportedError(error)) {\n markThreadSignalsUnsupported();\n return;\n }\n if (!isAbortError(error)) {\n console.error('[useChat] Thread subscription failed', error);\n setIsRunning(false);\n }\n throw error;\n });\n\n await _threadSubscriptionPromiseRef.current;\n },\n [\n agentId,\n baseClient,\n closeThreadSubscription,\n historyConfigKey,\n markThreadSignalsUnsupported,\n processStreamChunk,\n streamPath,\n withInitialHistory,\n ],\n );\n\n useEffect(() => {\n _threadSignalsUnsupportedRef.current = false;\n return closeThreadSubscription;\n }, [agentId, resourceId, threadId, closeThreadSubscription]);\n\n useEffect(() => {\n if (!threadId || threadSignalsDisabled) {\n closeThreadSubscription();\n return;\n }\n\n void ensureThreadSubscription({ threadId, resourceId: resourceId || agentId }).catch(error => {\n if (!isAbortError(error)) {\n console.error('[useChat] Thread subscription failed', error);\n }\n });\n }, [agentId, closeThreadSubscription, ensureThreadSubscription, resourceId, threadId, threadSignalsDisabled]);\n\n const generate = async ({\n coreUserMessages,\n model,\n requestContext,\n threadId,\n modelSettings,\n signal,\n onFinish,\n tracingOptions,\n clientTools,\n clientToolsResolver,\n }: GenerateArgs) => {\n const {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxTokens,\n temperature,\n topK,\n topP,\n instructions,\n system,\n providerOptions,\n maxSteps,\n requireToolApproval,\n } = modelSettings || {};\n const resolvedRequestContext = requestContext ?? propsRequestContext;\n const resolvedClientTools = clientTools ?? hookClientTools;\n _activeContinuation.current = {\n model,\n requestContext: resolvedRequestContext,\n };\n setIsRunning(true);\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: signal,\n });\n\n const agent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n const runId = uuid();\n _currentRunId.current = runId;\n\n const response = await agent.generate(coreUserMessages, {\n model,\n runId,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n requestContext: resolvedRequestContext,\n ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n providerOptions,\n tracingOptions,\n requireToolApproval,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n });\n\n // Check if suspended for tool approval\n if (response.finishReason === 'suspended' && response.suspendPayload) {\n const { toolCallId, toolName, args } = response.suspendPayload;\n\n // Add uiMessages with requireApprovalMetadata so UI shows approval buttons\n if (response.response?.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, {\n mode: 'generate',\n requireApprovalMetadata: {\n [toolName]: { toolCallId, toolName, args },\n },\n });\n\n setMessages(prev => [...prev, ...dbMessages]);\n }\n\n // Set isRunning to false so approval buttons are enabled\n // The approval/decline functions will set isRunning to true when clicked\n setIsRunning(false);\n return;\n }\n\n setIsRunning(false);\n\n if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n void onFinish?.(dbMessages);\n setMessages(prev => [...prev, ...dbMessages]);\n }\n };\n\n const stream = async ({\n coreUserMessages,\n model,\n requestContext,\n threadId,\n onChunk,\n modelSettings,\n signal,\n tracingOptions,\n clientTools,\n clientToolsResolver,\n signalId,\n clientMessageId,\n metadata,\n }: StreamArgs) => {\n const {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxTokens,\n temperature,\n topK,\n topP,\n instructions,\n system,\n providerOptions,\n maxSteps,\n requireToolApproval,\n } = modelSettings || {};\n\n const resolvedRequestContext = requestContext ?? propsRequestContext;\n const resolvedClientTools = clientTools ?? hookClientTools;\n const signalContinuationOptions: SignalContinuationOptions = {\n model,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n providerOptions,\n requireToolApproval,\n tracingOptions,\n };\n _activeContinuation.current = {\n model,\n requestContext: resolvedRequestContext,\n };\n setIsRunning(true);\n\n _streamAbortRef.current?.abort();\n const internalAbort = new AbortController();\n _streamAbortRef.current = internalAbort;\n\n if (signal) {\n if (signal.aborted) internalAbort.abort();\n else signal.addEventListener('abort', () => internalAbort.abort(), { once: true });\n }\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: internalAbort.signal,\n });\n\n const agent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n const streamWithLegacyRoute = async () => {\n const runId = uuid();\n const response = await agent.stream(coreUserMessages, {\n model,\n runId,\n maxSteps,\n untilIdle: true,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n requestContext: resolvedRequestContext,\n ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n providerOptions,\n requireToolApproval,\n tracingOptions,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n });\n\n _onChunk.current = onChunk;\n _currentRunId.current = runId;\n\n await response.processDataStream({\n onChunk: chunk => processStreamChunk(chunk, onChunk),\n });\n\n if (_streamAbortRef.current === internalAbort) {\n _streamAbortRef.current = null;\n }\n setIsRunning(false);\n };\n\n if (!threadId || _threadSignalsUnsupportedRef.current || threadSignalsDisabled) {\n await streamWithLegacyRoute();\n return;\n }\n\n _onChunk.current = onChunk;\n\n await ensureThreadSubscription({ threadId, resourceId: resourceId || agentId });\n\n if (_threadSignalsUnsupportedRef.current) {\n await streamWithLegacyRoute();\n return;\n }\n\n const resolvedSignalId = signalId ?? uuid();\n const messageContents = getSignalContents(coreUserMessages);\n // RequestContext serializes to a plain record via its toJSON(), but the class has no\n // index signature, so it isn't assignable to the generated `Record<string, unknown>` body type.\n const requestContextRecord = resolvedRequestContext as Record<string, unknown> | undefined;\n const streamOptions = {\n model,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n instructions,\n system,\n requestContext: requestContextRecord,\n providerOptions: providerOptions as any,\n requireToolApproval,\n tracingOptions,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n };\n\n try {\n const result = await agent.sendMessage({\n message:\n clientMessageId || metadata\n ? {\n contents: messageContents,\n metadata: { ...metadata, ...(clientMessageId ? { [CLIENT_MESSAGE_ID_KEY]: clientMessageId } : {}) },\n }\n : messageContents,\n resourceId: resourceId || agentId,\n threadId,\n ifIdle: {\n streamOptions: {\n ...signalContinuationOptions,\n requestContext: requestContextRecord,\n clientTools: resolvedClientTools,\n clientToolsResolver,\n },\n },\n });\n const echoedSignalId =\n result.signal &&\n typeof result.signal === 'object' &&\n 'id' in result.signal &&\n typeof result.signal.id === 'string'\n ? result.signal.id\n : resolvedSignalId;\n onSignalSent?.(echoedSignalId, getSignalPreview(coreUserMessages));\n if (pendingToolApprovalIdsRef.current.size > 0) {\n setIsRunning(false);\n }\n } catch (error) {\n if (isThreadSignalUnsupportedError(error)) {\n try {\n await agent.sendSignal({\n signal: {\n id: resolvedSignalId,\n type: 'user-message',\n contents: messageContents,\n ...(metadata ? { metadata } : {}),\n },\n resourceId: resourceId || agentId,\n threadId,\n ifIdle: { streamOptions },\n });\n onSignalSent?.(resolvedSignalId, getSignalPreview(coreUserMessages));\n return;\n } catch (signalError) {\n onSignalEcho?.(resolvedSignalId);\n if (isThreadSignalUnsupportedError(signalError)) {\n markThreadSignalsUnsupported();\n setMessages(prev => [...prev, fromCoreUserMessagesToMastraDBMessage(coreUserMessages)]);\n await streamWithLegacyRoute();\n return;\n }\n throw signalError;\n }\n }\n throw error;\n }\n\n if (_streamAbortRef.current === internalAbort) {\n _streamAbortRef.current = null;\n }\n };\n\n const network = async ({\n coreUserMessages,\n model,\n requestContext,\n threadId,\n onNetworkChunk,\n modelSettings,\n signal,\n tracingOptions,\n }: NetworkArgs) => {\n const { frequencyPenalty, presencePenalty, maxRetries, maxTokens, temperature, topK, topP, maxSteps } =\n modelSettings || {};\n\n const resolvedRequestContext = requestContext ?? propsRequestContext;\n _activeContinuation.current = {\n model,\n requestContext: resolvedRequestContext,\n };\n setIsRunning(true);\n\n const clientWithAbort = new MastraClient({\n ...baseClient!.options,\n abortSignal: signal,\n });\n\n const agent = clientWithAbort.getAgent(agentId, undefined, { stream: streamPath });\n\n const runId = uuid();\n _currentRunId.current = runId;\n\n const response = await agent.network(coreUserMessages, {\n model,\n maxSteps,\n modelSettings: {\n frequencyPenalty,\n presencePenalty,\n maxRetries,\n maxOutputTokens: maxTokens,\n temperature,\n topK,\n topP,\n },\n runId,\n requestContext: resolvedRequestContext,\n ...(threadId ? { memory: { thread: threadId, resource: resourceId || agentId } } : {}),\n tracingOptions,\n });\n\n _onNetworkChunk.current = onNetworkChunk;\n _networkRunId.current = runId;\n\n // Accumulate network chunks into `messages` as `MastraDBMessage` (temporary\n // bridge until the next major), while still forwarding chunks to the\n // consumer for side-effects (OM, working memory, thread list, errors).\n await response.processDataStream({\n onChunk: async (chunk: NetworkChunkType) => {\n setMessages(prev =>\n accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network', runId } }),\n );\n void onNetworkChunk?.(chunk);\n },\n });\n\n setMessages(prev => finishStreamingAssistantMessage(prev));\n setIsRunning(false);\n };\n\n const handleCancelRun = () => {\n _streamAbortRef.current?.abort();\n _streamAbortRef.current = null;\n const threadSubscription = _threadSubscriptionRef.current;\n void Promise.resolve(threadSubscription?.abort?.()).catch(error => {\n console.error('[useChat] Failed to abort thread subscription', error);\n });\n closeThreadSubscription();\n setMessages(prev => finishStreamingAssistantMessage(prev));\n liveRunFinished.current = true;\n pendingToolApprovalIdsRef.current.clear();\n setIsAwaitingToolApproval(false);\n setIsRunning(false);\n _currentRunId.current = undefined;\n _onChunk.current = undefined;\n _networkRunId.current = undefined;\n _onNetworkChunk.current = undefined;\n _activeContinuation.current = {};\n };\n\n const approveToolCall = async (toolCallId: string, resumeData?: unknown) => {\n const onChunk = _onChunk.current;\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info('[approveToolCall] approveToolCall can only be called after a stream has started');\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'approved' } }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n if (_threadSubscriptionKeyRef.current && threadId) {\n try {\n await agent.sendToolApproval({\n resourceId: resourceId || agentId,\n threadId,\n toolCallId,\n approved: true,\n ...(continuation.model !== undefined ? { streamOptions: { model: continuation.model } } : {}),\n ...(resumeData !== undefined ? { resumeData } : {}),\n requestContext: continuation.requestContext,\n });\n liveRunId.current ??= currentRunId;\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.delete(toolCallId);\n setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n setIsRunning(false);\n } catch (error) {\n setToolCallApprovals(prev => {\n const next = { ...prev };\n delete next[toolCallId];\n return next;\n });\n setIsRunning(false);\n throw error;\n }\n return;\n }\n\n try {\n const response =\n resumeData !== undefined\n ? await agent.resumeStream(resumeData as Parameters<typeof agent.resumeStream>[0], {\n runId: currentRunId,\n toolCallId,\n ...continuation,\n })\n : await agent.approveToolCall({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: ChunkType) => {\n await processStreamChunk(chunk, onChunk);\n },\n });\n setIsRunning(false);\n } catch (error) {\n setToolCallApprovals(prev => {\n const next = { ...prev };\n delete next[toolCallId];\n return next;\n });\n setIsRunning(false);\n throw error;\n }\n };\n\n const declineToolCall = async (toolCallId: string) => {\n const onChunk = _onChunk.current;\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info('[declineToolCall] declineToolCall can only be called after a stream has started');\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'declined' } }));\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n if (_threadSubscriptionKeyRef.current && threadId) {\n try {\n await agent.sendToolApproval({\n resourceId: resourceId || agentId,\n threadId,\n toolCallId,\n approved: false,\n ...(continuation.model !== undefined ? { streamOptions: { model: continuation.model } } : {}),\n requestContext: continuation.requestContext,\n });\n liveRunId.current ??= currentRunId;\n liveApprovalIds.current.add(toolCallId);\n pendingToolApprovalIdsRef.current.delete(toolCallId);\n setIsAwaitingToolApproval(pendingToolApprovalIdsRef.current.size > 0);\n setIsRunning(false);\n } catch (error) {\n setToolCallApprovals(prev => {\n const next = { ...prev };\n delete next[toolCallId];\n return next;\n });\n setIsRunning(false);\n throw error;\n }\n return;\n }\n\n const response = await agent.declineToolCall({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: ChunkType) => {\n await processStreamChunk(chunk, onChunk);\n },\n });\n setIsRunning(false);\n };\n\n const approveToolCallGenerate = async (toolCallId: string) => {\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info(\n '[approveToolCallGenerate] approveToolCallGenerate can only be called after a generate has started',\n );\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'approved' } }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.approveToolCallGenerate({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n setMessages(prev => [...prev, ...dbMessages]);\n }\n\n setIsRunning(false);\n };\n\n const declineToolCallGenerate = async (toolCallId: string) => {\n const currentRunId = _currentRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!currentRunId)\n return console.info(\n '[declineToolCallGenerate] declineToolCallGenerate can only be called after a generate has started',\n );\n\n setIsRunning(true);\n setToolCallApprovals(prev => ({ ...prev, [toolCallId]: { status: 'declined' } }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.declineToolCallGenerate({\n runId: currentRunId,\n toolCallId,\n ...continuation,\n });\n\n if (response && 'uiMessages' in response.response && response.response.uiMessages) {\n const dbMessages = dbFromServerUiMessages(response.response.uiMessages, { mode: 'generate' });\n setMessages(prev => [...prev, ...dbMessages]);\n }\n\n setIsRunning(false);\n };\n\n const approveNetworkToolCall = async (toolName: string, runId?: string) => {\n const onNetworkChunk = _onNetworkChunk.current;\n const networkRunId = runId || _networkRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!networkRunId)\n return console.info(\n '[approveNetworkToolCall] approveNetworkToolCall can only be called after a network stream has started',\n );\n\n _currentRunId.current = networkRunId;\n setIsRunning(true);\n setNetworkToolCallApprovals(prev => ({\n ...prev,\n [runId ? `${runId}-${toolName}` : toolName]: { status: 'approved' },\n }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.approveNetworkToolCall({\n runId: networkRunId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: NetworkChunkType) => {\n setMessages(prev =>\n accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network', runId: networkRunId } }),\n );\n void onNetworkChunk?.(chunk);\n },\n });\n\n setMessages(prev => finishStreamingAssistantMessage(prev));\n setIsRunning(false);\n };\n\n const declineNetworkToolCall = async (toolName: string, runId?: string) => {\n const onNetworkChunk = _onNetworkChunk.current;\n const networkRunId = runId || _networkRunId.current;\n const continuation = _activeContinuation.current;\n\n if (!networkRunId)\n return console.info(\n '[declineNetworkToolCall] declineNetworkToolCall can only be called after a network stream has started',\n );\n\n _currentRunId.current = networkRunId;\n setIsRunning(true);\n setNetworkToolCallApprovals(prev => ({\n ...prev,\n [runId ? `${runId}-${toolName}` : toolName]: { status: 'declined' },\n }));\n\n const agent = baseClient.getAgent(agentId, undefined, { stream: streamPath });\n const response = await agent.declineNetworkToolCall({\n runId: networkRunId,\n ...continuation,\n });\n\n await response.processDataStream({\n onChunk: async (chunk: NetworkChunkType) => {\n setMessages(prev =>\n accumulateNetworkChunk({ chunk, conversation: prev, metadata: { mode: 'network', runId: networkRunId } }),\n );\n void onNetworkChunk?.(chunk);\n },\n });\n\n setMessages(prev => finishStreamingAssistantMessage(prev));\n setIsRunning(false);\n };\n\n const sendMessage = async ({ mode = 'stream', metadata: userMetadata, ...args }: SendMessageArgs) => {\n if (!isRunning && !isAwaitingToolApproval) _currentRunId.current = undefined;\n const coreUserMessages = [createUserMessage(args.message, args.coreUserMessages)];\n\n // Use the same multipart message for the request and optimistic display.\n // Sending separate attachment messages would persist separate rows on reload.\n const coreDbUserMessage = fromCoreUserMessagesToMastraDBMessage(coreUserMessages);\n const dbUserMessage: MastraDBMessage = userMetadata\n ? {\n ...coreDbUserMessage,\n content: {\n ...coreDbUserMessage.content,\n metadata: { ...coreDbUserMessage.content.metadata, ...userMetadata },\n },\n }\n : coreDbUserMessage;\n const clientSetId =\n mode === 'stream' && args.threadId && !_threadSignalsUnsupportedRef.current && !threadSignalsDisabled\n ? `client-set-${uuid()}`\n : undefined;\n const signalId = clientSetId;\n const clientMessageId = clientSetId;\n\n if (signalId) {\n // Signal path: append the user turn optimistically as `pending` with a\n // visibly client-owned id. The server echo can replace the final message\n // id while the matching client id reconciles the pending bubble.\n const metadata: MastraDBMessageMetadata = {\n ...dbUserMessage.content.metadata,\n mode: 'stream',\n status: 'pending',\n [CLIENT_MESSAGE_ID_KEY]: clientMessageId,\n };\n const pendingMessage = { ...dbUserMessage, id: clientSetId, content: { ...dbUserMessage.content, metadata } };\n setMessages(s => [...s, pendingMessage]);\n } else {\n setMessages(s => [...s, dbUserMessage]);\n }\n\n try {\n if (mode === 'generate') {\n await generate({ ...args, coreUserMessages });\n } else if (mode === 'stream') {\n await stream({ ...args, coreUserMessages, signalId, clientMessageId, metadata: userMetadata });\n } else if (mode === 'network') {\n await network({ ...args, coreUserMessages });\n }\n } catch (error) {\n // A failed send (subscription setup, request, or stream) must not leave\n // the chat stranded in a \"running\" state until reload (issue #18768).\n setIsRunning(false);\n // Drop the optimistic bubble instead of leaving it pending until reload\n // (issue #26831). If the server did accept the turn before the response\n // was lost, the message can still reappear through the live subscription\n // echo or when the caller reloads thread history.\n if (signalId) {\n setMessages(s => s.filter(m => !(m.id === signalId && m.content.metadata?.status === 'pending')));\n }\n throw error;\n }\n };\n\n return {\n setMessages,\n sendMessage,\n isRunning,\n activeRunId: isRunning || isAwaitingToolApproval ? _currentRunId.current : undefined,\n isAwaitingToolApproval,\n messages,\n /**\n * Pagination of the initial `thread-history` page from `withInitialHistory`:\n * `hasMore: true` when older messages exist, `false` when the page reached the\n * start of the thread, and `undefined` while history is disabled, pending, or\n * the subscription for the current agent/resource/thread/config has ended.\n */\n initialHistoryPagination,\n tasks,\n approveToolCall,\n declineToolCall,\n approveToolCallGenerate,\n declineToolCallGenerate,\n cancelRun: handleCancelRun,\n toolCallApprovals,\n approveNetworkToolCall,\n declineNetworkToolCall,\n networkToolCallApprovals,\n };\n};\n"],"mappings":"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"}