{"version":3,"sources":["../src/lib/useMicrophone.ts","../src/lib/generateEmptyFft.ts","../src/lib/useSoundPlayer.ts","../src/lib/convertFrequencyScale.ts","../src/lib/useVoiceClient.ts","../src/lib/VoiceProvider.tsx","../src/lib/noop.ts","../src/lib/useCallDuration.ts","../src/lib/useEncoding.ts","../src/lib/useMessages.ts","../src/utils/index.ts","../src/lib/useToolStatus.ts","../src/lib/errors.ts","../src/lib/messages.ts","../src/lib/audio-message.ts","../src/models/audio.ts","../src/models/llm.ts","../src/models/messages.ts","../src/models/ttsService.ts"],"sourcesContent":["// cspell:ignore dataavailable\r\nimport type { MimeType } from 'hume';\r\nimport { getBrowserSupportedMimeType } from 'hume';\r\nimport Meyda from 'meyda';\r\nimport type { MeydaFeaturesObject } from 'meyda';\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\nimport type { MutableRefObject } from 'react';\r\n\r\nimport { generateEmptyFft } from './generateEmptyFft';\r\n\r\nexport type MicrophoneProps = {\r\n  streamRef: MutableRefObject<MediaStream | null>;\r\n  onAudioCaptured: (b: ArrayBuffer) => void;\r\n  onStartRecording?: () => void;\r\n  onStopRecording?: () => void;\r\n  onError: (message: string) => void;\r\n  withMicrophone: boolean;\r\n};\r\n\r\nexport const useMicrophone = (props: MicrophoneProps) => {\r\n  const { streamRef, onAudioCaptured, onError, withMicrophone } = props;\r\n  const [isMuted, setIsMuted] = useState(false);\r\n  const isMutedRef = useRef(isMuted);\r\n  const [fft, setFft] = useState<number[]>(generateEmptyFft());\r\n  const currentAnalyzer = useRef<Meyda.MeydaAnalyzer | null>(null);\r\n  const mimeTypeRef = useRef<MimeType | null>(null);\r\n  const audioContext = useRef<AudioContext | null>(null);\r\n  const recorder = useRef<MediaRecorder | null>(null);\r\n  const sendAudio = useRef(onAudioCaptured);\r\n  sendAudio.current = onAudioCaptured;\r\n\r\n  const dataHandler = useCallback(\r\n    (event: BlobEvent) => {\r\n      if (!withMicrophone) return;\r\n\r\n      const blob = event.data;\r\n      blob\r\n        .arrayBuffer()\r\n        .then((buffer) => {\r\n          if (buffer.byteLength > 0) {\r\n            sendAudio.current?.(buffer);\r\n          }\r\n        })\r\n        .catch((err) => {\r\n          console.log(err);\r\n        });\r\n    },\r\n    [withMicrophone],\r\n  );\r\n\r\n  const start = useCallback(() => {\r\n    if (!withMicrophone) return;\r\n\r\n    const stream = streamRef.current;\r\n    if (!stream) {\r\n      throw new Error('No stream connected');\r\n    }\r\n\r\n    const context = new AudioContext();\r\n    audioContext.current = context;\r\n    const input = context.createMediaStreamSource(stream);\r\n\r\n    try {\r\n      currentAnalyzer.current = Meyda.createMeydaAnalyzer({\r\n        audioContext: context,\r\n        source: input,\r\n        featureExtractors: ['loudness'],\r\n        callback: (features: MeydaFeaturesObject) => {\r\n          const newFft = features.loudness.specific || [];\r\n          setFft(() => Array.from(newFft));\r\n        },\r\n      });\r\n\r\n      currentAnalyzer.current.start();\r\n    } catch (e: unknown) {\r\n      const message = e instanceof Error ? e.message : 'Unknown error';\r\n      console.error(`Failed to start mic analyzer: ${message}`);\r\n    }\r\n\r\n    const mimeType = mimeTypeRef.current;\r\n    if (!mimeType) {\r\n      throw new Error('No MimeType specified');\r\n    }\r\n\r\n    recorder.current = new MediaRecorder(stream, {\r\n      mimeType,\r\n    });\r\n    recorder.current.addEventListener('dataavailable', dataHandler);\r\n    recorder.current.start(100);\r\n  }, [dataHandler, streamRef, withMicrophone]);\r\n\r\n  const stop = useCallback(() => {\r\n    if (!withMicrophone) return;\r\n\r\n    try {\r\n      if (currentAnalyzer.current) {\r\n        currentAnalyzer.current.stop();\r\n        currentAnalyzer.current = null;\r\n      }\r\n\r\n      if (audioContext.current) {\r\n        void audioContext.current\r\n          .close()\r\n          .then(() => {\r\n            audioContext.current = null;\r\n          })\r\n          .catch(() => {\r\n            return null;\r\n          });\r\n      }\r\n\r\n      recorder.current?.stop();\r\n      recorder.current?.removeEventListener('dataavailable', dataHandler);\r\n      recorder.current = null;\r\n      streamRef.current?.getTracks().forEach((track) => track.stop());\r\n\r\n      setIsMuted(false);\r\n    } catch (e) {\r\n      const message = e instanceof Error ? e.message : 'Unknown error';\r\n      onError(`Error stopping microphone: ${message}`);\r\n      console.log(e);\r\n    }\r\n  }, [dataHandler, onError, streamRef, withMicrophone]);\r\n\r\n  const mute = useCallback(() => {\r\n    if (!withMicrophone) return;\r\n\r\n    if (currentAnalyzer.current) {\r\n      currentAnalyzer.current.stop();\r\n      setFft(generateEmptyFft());\r\n    }\r\n\r\n    streamRef.current?.getTracks().forEach((track) => {\r\n      track.enabled = false;\r\n    });\r\n\r\n    isMutedRef.current = true;\r\n    setIsMuted(true);\r\n  }, [streamRef, withMicrophone]);\r\n\r\n  const unmute = useCallback(() => {\r\n    if (!withMicrophone) return;\r\n\r\n    if (currentAnalyzer.current) {\r\n      currentAnalyzer.current.start();\r\n    }\r\n\r\n    streamRef.current?.getTracks().forEach((track) => {\r\n      track.enabled = true;\r\n    });\r\n\r\n    isMutedRef.current = false;\r\n    setIsMuted(false);\r\n  }, [streamRef, withMicrophone]);\r\n\r\n  useEffect(() => {\r\n    if (!withMicrophone) return;\r\n\r\n    const mimeTypeResult = getBrowserSupportedMimeType();\r\n    if (mimeTypeResult.success) {\r\n      mimeTypeRef.current = mimeTypeResult.mimeType;\r\n    } else {\r\n      onError(mimeTypeResult.error.message);\r\n    }\r\n  }, [onError, withMicrophone]);\r\n\r\n  useEffect(() => {\r\n    if (!withMicrophone) return;\r\n\r\n    return () => {\r\n      try {\r\n        recorder.current?.stop();\r\n        recorder.current?.removeEventListener('dataavailable', dataHandler);\r\n\r\n        if (currentAnalyzer.current) {\r\n          currentAnalyzer.current.stop();\r\n          currentAnalyzer.current = null;\r\n        }\r\n\r\n        streamRef.current?.getTracks().forEach((track) => track.stop());\r\n        streamRef.current = null;\r\n      } catch (e) {\r\n        console.log(e);\r\n        void true;\r\n      }\r\n    };\r\n  }, [dataHandler, streamRef, withMicrophone]);\r\n\r\n  return {\r\n    start,\r\n    stop,\r\n    mute,\r\n    unmute,\r\n    isMuted,\r\n    fft,\r\n  };\r\n};\r\n","export function generateEmptyFft(): number[] {\r\n  return Array.from({ length: 24 }).map(() => 0);\r\n}\r\n","import { convertBase64ToBlob } from 'hume';\r\nimport { useCallback, useRef, useState } from 'react';\r\n\r\nimport { convertLinearFrequenciesToBark } from './convertFrequencyScale';\r\nimport { generateEmptyFft } from './generateEmptyFft';\r\nimport type { AudioOutputMessage } from '../models/messages';\r\n\r\nexport const useSoundPlayer = (props: {\r\n  onError: (message: string) => void;\r\n  onPlayAudio: (id: string) => void;\r\n  onStopAudio: (id: string) => void;\r\n}) => {\r\n  const [isPlaying, setIsPlaying] = useState(false);\r\n  const [isAudioMuted, setIsAudioMuted] = useState(false);\r\n  const [fft, setFft] = useState<number[]>(generateEmptyFft());\r\n\r\n  const audioContext = useRef<AudioContext | null>(null);\r\n  const analyserNode = useRef<AnalyserNode | null>(null);\r\n  const gainNode = useRef<GainNode | null>(null);\r\n  const isInitialized = useRef(false);\r\n\r\n  const clipQueue = useRef<\r\n    Array<{\r\n      id: string;\r\n      buffer: AudioBuffer;\r\n    }>\r\n  >([]);\r\n  const [queueLength, setQueueLength] = useState(0);\r\n\r\n  const isProcessing = useRef(false);\r\n  const currentlyPlayingAudioBuffer = useRef<AudioBufferSourceNode | null>(\r\n    null,\r\n  );\r\n  const frequencyDataIntervalId = useRef<number | null>(null);\r\n\r\n  const onPlayAudio = useRef<typeof props.onPlayAudio>(props.onPlayAudio);\r\n  onPlayAudio.current = props.onPlayAudio;\r\n\r\n  const onStopAudio = useRef<typeof props.onStopAudio>(props.onStopAudio);\r\n  onStopAudio.current = props.onStopAudio;\r\n\r\n  const onError = useRef<typeof props.onError>(props.onError);\r\n  onError.current = props.onError;\r\n\r\n  const playNextClip = useCallback(() => {\r\n    if (analyserNode.current === null || audioContext.current === null) {\r\n      onError.current('Audio environment is not initialized');\r\n      return;\r\n    }\r\n\r\n    if (clipQueue.current.length === 0 || isProcessing.current) {\r\n      setQueueLength(0);\r\n      return;\r\n    }\r\n\r\n    const nextClip = clipQueue.current.shift();\r\n    setQueueLength(clipQueue.current.length);\r\n\r\n    if (!nextClip) return;\r\n\r\n    isProcessing.current = true;\r\n    setIsPlaying(true);\r\n\r\n    // Use AudioBufferSourceNode for audio playback.\r\n    // Safari suffered a truncation issue using HTML5 audio playback\r\n    const bufferSource = audioContext.current.createBufferSource();\r\n\r\n    bufferSource.buffer = nextClip.buffer;\r\n\r\n    bufferSource.connect(analyserNode.current);\r\n\r\n    currentlyPlayingAudioBuffer.current = bufferSource;\r\n\r\n    const updateFrequencyData = () => {\r\n      try {\r\n        const bufferSampleRate = bufferSource.buffer?.sampleRate;\r\n\r\n        if (!analyserNode.current || typeof bufferSampleRate === 'undefined')\r\n          return;\r\n\r\n        const dataArray = new Uint8Array(\r\n          analyserNode.current.frequencyBinCount,\r\n        ); // frequencyBinCount is 1/2 of fftSize\r\n        analyserNode.current.getByteFrequencyData(dataArray); // Using getByteFrequencyData for performance\r\n\r\n        const barkFrequencies = convertLinearFrequenciesToBark(\r\n          dataArray,\r\n          bufferSampleRate,\r\n        );\r\n        setFft(() => barkFrequencies);\r\n      } catch (e) {\r\n        setFft(generateEmptyFft());\r\n      }\r\n    };\r\n\r\n    frequencyDataIntervalId.current = window.setInterval(\r\n      updateFrequencyData,\r\n      5,\r\n    );\r\n\r\n    bufferSource.start(0);\r\n    onPlayAudio.current(nextClip.id);\r\n\r\n    bufferSource.onended = () => {\r\n      if (frequencyDataIntervalId.current) {\r\n        clearInterval(frequencyDataIntervalId.current);\r\n      }\r\n      setFft(generateEmptyFft());\r\n      bufferSource.disconnect();\r\n      isProcessing.current = false;\r\n      setIsPlaying(false);\r\n      onStopAudio.current(nextClip.id);\r\n      currentlyPlayingAudioBuffer.current = null;\r\n      playNextClip();\r\n    };\r\n  }, []);\r\n\r\n  const initPlayer = useCallback(() => {\r\n    const initAudioContext = new AudioContext();\r\n    audioContext.current = initAudioContext;\r\n\r\n    // Use AnalyserNode to get fft frequency data for visualizations\r\n    const analyser = initAudioContext.createAnalyser();\r\n    // Use GainNode to adjust volume\r\n    const gain = initAudioContext.createGain();\r\n\r\n    analyser.fftSize = 2048; // Must be a power of 2\r\n    analyser.connect(gain);\r\n    gain.connect(initAudioContext.destination);\r\n\r\n    analyserNode.current = analyser;\r\n    gainNode.current = gain;\r\n\r\n    isInitialized.current = true;\r\n  }, []);\r\n\r\n  const addToQueue = useCallback(\r\n    async (message: AudioOutputMessage) => {\r\n      if (!isInitialized.current || !audioContext.current) {\r\n        onError.current('Audio player has not been initialized');\r\n        return;\r\n      }\r\n\r\n      try {\r\n        const blob = convertBase64ToBlob(message.data, 'audio/mp3');\r\n        const arrayBuffer = await blob.arrayBuffer();\r\n        const audioBuffer =\r\n          await audioContext.current.decodeAudioData(arrayBuffer);\r\n\r\n        clipQueue.current.push({\r\n          id: message.id,\r\n          buffer: audioBuffer,\r\n        });\r\n        setQueueLength(clipQueue.current.length);\r\n\r\n        // playNextClip will iterate the clipQueue upon finishing the playback of the current audio clip, so we can\r\n        // just call playNextClip here if it's the only one in the queue\r\n        if (clipQueue.current.length === 1) {\r\n          playNextClip();\r\n        }\r\n      } catch (e) {\r\n        const eMessage = e instanceof Error ? e.message : 'Unknown error';\r\n        onError.current(`Failed to add clip to queue: ${eMessage}`);\r\n      }\r\n    },\r\n    [playNextClip],\r\n  );\r\n\r\n  const stopAll = useCallback(() => {\r\n    isInitialized.current = false;\r\n    isProcessing.current = false;\r\n    setIsPlaying(false);\r\n    setIsAudioMuted(false);\r\n\r\n    if (frequencyDataIntervalId.current) {\r\n      window.clearInterval(frequencyDataIntervalId.current);\r\n    }\r\n\r\n    if (currentlyPlayingAudioBuffer.current) {\r\n      currentlyPlayingAudioBuffer.current.disconnect();\r\n      currentlyPlayingAudioBuffer.current = null;\r\n    }\r\n\r\n    if (analyserNode.current) {\r\n      analyserNode.current.disconnect();\r\n      analyserNode.current = null;\r\n    }\r\n\r\n    if (audioContext.current) {\r\n      void audioContext.current\r\n        .close()\r\n        .then(() => {\r\n          audioContext.current = null;\r\n        })\r\n        .catch(() => {\r\n          // .close() rejects if the audio context is already closed.\r\n          // Therefore, we just need to catch the error, but we don't need to\r\n          // do anything with it.\r\n          return null;\r\n        });\r\n    }\r\n\r\n    clipQueue.current = [];\r\n    setQueueLength(0);\r\n    setFft(generateEmptyFft());\r\n  }, []);\r\n\r\n  const clearQueue = useCallback(() => {\r\n    if (currentlyPlayingAudioBuffer.current) {\r\n      currentlyPlayingAudioBuffer.current.stop();\r\n      currentlyPlayingAudioBuffer.current = null;\r\n    }\r\n\r\n    clipQueue.current = [];\r\n    setQueueLength(0);\r\n    isProcessing.current = false;\r\n    setIsPlaying(false);\r\n    setFft(generateEmptyFft());\r\n  }, []);\r\n\r\n  const muteAudio = useCallback(() => {\r\n    if (gainNode.current && audioContext.current) {\r\n      gainNode.current.gain.setValueAtTime(0, audioContext.current.currentTime);\r\n      setIsAudioMuted(true);\r\n    }\r\n  }, []);\r\n\r\n  const unmuteAudio = useCallback(() => {\r\n    if (gainNode.current && audioContext.current) {\r\n      gainNode.current.gain.setValueAtTime(1, audioContext.current.currentTime);\r\n      setIsAudioMuted(false);\r\n    }\r\n  }, []);\r\n\r\n  return {\r\n    addToQueue,\r\n    fft,\r\n    initPlayer,\r\n    isPlaying,\r\n    isAudioMuted,\r\n    muteAudio,\r\n    unmuteAudio,\r\n    stopAll,\r\n    clearQueue,\r\n    queueLength,\r\n  };\r\n};\r\n","// This function converts linear-scaled frequency decibels from an AnalyserNode's frequncy data to Bark scale [https://en.wikipedia.org/wiki/Bark_scale]\r\n// This implementation uses a simple approach of mapping indices in the linear-scaled array to the closest\r\n// Bark scale center frequency and is not intended to be an accurate representation, but rather \"close-enough\" for visualization purposes\r\nconst barkCenterFrequencies = [\r\n  50, 150, 250, 350, 450, 570, 700, 840, 1000, 1170, 1370, 1600, 1850, 2150,\r\n  2500, 2900, 3400, 4000, 4800, 5800, 7000, 8500, 10500, 13500,\r\n]; // Center frequency value in Hz\r\n\r\n// Min/max values from https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/getByteFrequencyData\r\nconst minValue = 0;\r\nconst maxValue = 255;\r\n\r\nexport function convertLinearFrequenciesToBark(\r\n  linearData: Uint8Array,\r\n  sampleRate: number,\r\n): number[] {\r\n  const maxFrequency = sampleRate / 2;\r\n  const frequencyResolution = maxFrequency / linearData.length;\r\n\r\n  const barkFrequencies = barkCenterFrequencies.map((barkFreq) => {\r\n    const linearDataIndex = Math.round(barkFreq / frequencyResolution);\r\n    if (linearDataIndex >= 0 && linearDataIndex < linearData.length) {\r\n      return (\r\n        (((linearData[linearDataIndex] ?? 0) - minValue) /\r\n          (maxValue - minValue)) *\r\n        2\r\n      );\r\n    } else {\r\n      return 0;\r\n    }\r\n  });\r\n\r\n  return barkFrequencies;\r\n}\r\n","import { Hume, HumeClient } from 'hume';\r\nimport { useCallback, useRef, useState } from 'react';\r\nimport { type Simplify } from 'type-fest';\r\n\r\nimport { type AuthStrategy } from './auth';\r\nimport type {\r\n  AudioOutputMessage,\r\n  JSONMessage,\r\n  ToolCall,\r\n} from '../models/messages';\r\n\r\nconst isNever = (_n: never) => {\r\n  return;\r\n};\r\n\r\nexport type SocketConfig = {\r\n  auth: AuthStrategy;\r\n  hostname?: string;\r\n} & Hume.empathicVoice.chat.Chat.ConnectArgs;\r\n\r\nexport enum VoiceReadyState {\r\n  IDLE = 'idle',\r\n  CONNECTING = 'connecting',\r\n  OPEN = 'open',\r\n  CLOSED = 'closed',\r\n}\r\n\r\nexport type ToolCallHandler = (\r\n  // message will always be a tool call message where toolType === 'function'\r\n  message: Simplify<\r\n    ToolCall & {\r\n      // caveat: this doesn't actually do what it appears to, since ToolType is\r\n      // exported as both an interface and a value, this ends up being a constant\r\n      // that doesn't share an type identity with the actual ToolType enum\r\n      toolType: typeof Hume.empathicVoice.ToolType.Function;\r\n    }\r\n  >,\r\n  send: {\r\n    success: (content: unknown) => Hume.empathicVoice.ToolResponseMessage;\r\n    error: (e: {\r\n      error: string;\r\n      code: string;\r\n      level: string;\r\n      content: string;\r\n    }) => Hume.empathicVoice.ToolErrorMessage;\r\n  },\r\n) => Promise<\r\n  Hume.empathicVoice.ToolResponseMessage | Hume.empathicVoice.ToolErrorMessage\r\n>;\r\n\r\nexport const useVoiceClient = (props: {\r\n  onAudioMessage?: (message: AudioOutputMessage) => void;\r\n  onMessage?: (message: JSONMessage) => void;\r\n  onToolCall?: ToolCallHandler;\r\n  onError?: (message: string, error?: Error) => void;\r\n  onOpen?: () => void;\r\n  onClose?: Hume.empathicVoice.chat.ChatSocket.EventHandlers['close'];\r\n}) => {\r\n  const client = useRef<Hume.empathicVoice.chat.ChatSocket | null>(null);\r\n\r\n  const [readyState, setReadyState] = useState<VoiceReadyState>(\r\n    VoiceReadyState.IDLE,\r\n  );\r\n\r\n  // this pattern might look hacky but it allows us to use the latest props\r\n  // in callbacks set up inside useEffect without re-rendering the useEffect\r\n  const onAudioMessage = useRef<typeof props.onAudioMessage>(\r\n    props.onAudioMessage,\r\n  );\r\n  onAudioMessage.current = props.onAudioMessage;\r\n\r\n  const onMessage = useRef<typeof props.onMessage>(props.onMessage);\r\n  onMessage.current = props.onMessage;\r\n\r\n  const onToolCall = useRef<typeof props.onToolCall>(props.onToolCall);\r\n  onToolCall.current = props.onToolCall;\r\n\r\n  const onError = useRef<typeof props.onError>(props.onError);\r\n  onError.current = props.onError;\r\n\r\n  const onOpen = useRef<typeof props.onOpen>(props.onOpen);\r\n  onOpen.current = props.onOpen;\r\n\r\n  const onClose = useRef<typeof props.onClose>(props.onClose);\r\n  onClose.current = props.onClose;\r\n\r\n  const connect = useCallback((config: SocketConfig) => {\r\n    return new Promise((resolve, reject) => {\r\n      const hume = new HumeClient(\r\n        config.auth.type === 'apiKey'\r\n          ? {\r\n              apiKey: config.auth.value,\r\n              environment: config.hostname,\r\n            }\r\n          : {\r\n              accessToken: config.auth.value,\r\n              environment: config.hostname,\r\n            },\r\n      );\r\n\r\n      client.current = hume.empathicVoice.chat.connect(config);\r\n\r\n      client.current.on('open', () => {\r\n        onOpen.current?.();\r\n        setReadyState(VoiceReadyState.OPEN);\r\n        resolve(VoiceReadyState.OPEN);\r\n      });\r\n\r\n      client.current.on('message', (message) => {\r\n        if (message.type === 'audio_output') {\r\n          const messageWithReceivedAt = { ...message, receivedAt: new Date() };\r\n          onAudioMessage.current?.(messageWithReceivedAt);\r\n          return;\r\n        }\r\n\r\n        if (\r\n          message.type === 'assistant_message' ||\r\n          message.type === 'user_message' ||\r\n          message.type === 'user_interruption' ||\r\n          message.type === 'error' ||\r\n          message.type === 'tool_response' ||\r\n          message.type === 'tool_error' ||\r\n          message.type === 'chat_metadata' ||\r\n          message.type === 'assistant_end'\r\n        ) {\r\n          const messageWithReceivedAt = { ...message, receivedAt: new Date() };\r\n          onMessage.current?.(messageWithReceivedAt);\r\n          return;\r\n        }\r\n\r\n        if (message.type === 'tool_call') {\r\n          const messageWithReceivedAt = { ...message, receivedAt: new Date() };\r\n          onMessage.current?.(messageWithReceivedAt);\r\n\r\n          // only pass tool call messages for user defined tools\r\n          if (message.toolType === Hume.empathicVoice.ToolType.Function) {\r\n            void onToolCall\r\n              .current?.(\r\n                {\r\n                  ...messageWithReceivedAt,\r\n                  // we have to do this because even though we are using the correct\r\n                  // enum on line 30 for the type definition\r\n                  // fern exports an interface and a value using the same `ToolType`\r\n                  // identifier so the type comparisons will always fail\r\n                  toolType: 'function',\r\n                },\r\n                {\r\n                  success: (content: unknown) => ({\r\n                    type: 'tool_response',\r\n                    toolCallId: messageWithReceivedAt.toolCallId,\r\n                    content: JSON.stringify(content),\r\n                  }),\r\n                  error: ({\r\n                    error,\r\n                    code,\r\n                    level,\r\n                    content,\r\n                  }: {\r\n                    error: string;\r\n                    code: string;\r\n                    level: string;\r\n                    content: string;\r\n                  }) => ({\r\n                    type: 'tool_error',\r\n                    toolCallId: messageWithReceivedAt.toolCallId,\r\n                    error,\r\n                    code,\r\n                    level: level !== null ? 'warn' : undefined, // level can only be warn\r\n                    content,\r\n                  }),\r\n                },\r\n              )\r\n              .then((response) => {\r\n                // if valid send it to the socket\r\n                // otherwise, report error\r\n                if (response.type === 'tool_response') {\r\n                  client.current?.sendToolResponseMessage(response);\r\n                } else if (response.type === 'tool_error') {\r\n                  client.current?.sendToolErrorMessage(response);\r\n                } else {\r\n                  onError.current?.('Invalid response from tool call');\r\n                }\r\n              });\r\n          }\r\n          return;\r\n        }\r\n\r\n        // asserts that all message types are handled\r\n        isNever(message);\r\n        return;\r\n      });\r\n\r\n      client.current.on('close', (event) => {\r\n        onClose.current?.(event);\r\n        setReadyState(VoiceReadyState.CLOSED);\r\n      });\r\n\r\n      client.current.on('error', (e) => {\r\n        const message = e instanceof Error ? e.message : 'Unknown error';\r\n        onError.current?.(message, e instanceof Error ? e : undefined);\r\n        reject(e);\r\n      });\r\n\r\n      setReadyState(VoiceReadyState.CONNECTING);\r\n    });\r\n  }, []);\r\n\r\n  const disconnect = useCallback(() => {\r\n    setReadyState(VoiceReadyState.IDLE);\r\n    client.current?.close();\r\n  }, []);\r\n\r\n  const sendSessionSettings = useCallback(\r\n    (sessionSettings: Hume.empathicVoice.SessionSettings) => {\r\n      if (readyState !== VoiceReadyState.OPEN) {\r\n        throw new Error('Socket is not open');\r\n      }\r\n      client.current?.sendSessionSettings(sessionSettings);\r\n    },\r\n    [readyState],\r\n  );\r\n\r\n  const sendAudio = useCallback(\r\n    (arrayBuffer: ArrayBufferLike) => {\r\n      if (readyState !== VoiceReadyState.OPEN) {\r\n        throw new Error('Socket is not open');\r\n      }\r\n      client.current?.socket?.send(arrayBuffer);\r\n    },\r\n    [readyState],\r\n  );\r\n\r\n  const sendUserInput = useCallback(\r\n    (text: string) => {\r\n      if (readyState !== VoiceReadyState.OPEN) {\r\n        throw new Error('Socket is not open');\r\n      }\r\n      client.current?.sendUserInput(text);\r\n    },\r\n    [readyState],\r\n  );\r\n\r\n  const sendAssistantInput = useCallback(\r\n    (text: string) => {\r\n      if (readyState !== VoiceReadyState.OPEN) {\r\n        throw new Error('Socket is not open');\r\n      }\r\n      client.current?.sendAssistantInput({\r\n        text,\r\n      });\r\n    },\r\n    [readyState],\r\n  );\r\n\r\n  const sendToolMessage = useCallback(\r\n    (\r\n      // type definitions for toolMessage come from the Hume SDK because messages that are sent from the client\r\n      // to the backend do not have the extended `receivedAt` field\r\n      toolMessage:\r\n        | Hume.empathicVoice.ToolResponseMessage\r\n        | Hume.empathicVoice.ToolErrorMessage,\r\n    ) => {\r\n      if (readyState !== VoiceReadyState.OPEN) {\r\n        throw new Error('Socket is not open');\r\n      }\r\n      if (toolMessage.type === 'tool_error') {\r\n        client.current?.sendToolErrorMessage(toolMessage);\r\n      } else {\r\n        client.current?.sendToolResponseMessage(toolMessage);\r\n      }\r\n    },\r\n    [readyState],\r\n  );\r\n\r\n  const sendPauseAssistantMessage = useCallback(() => {\r\n    if (readyState !== VoiceReadyState.OPEN) {\r\n      throw new Error('Socket is not open');\r\n    }\r\n    client.current?.pauseAssistant({});\r\n  }, [readyState]);\r\n  const sendResumeAssistantMessage = useCallback(() => {\r\n    if (readyState !== VoiceReadyState.OPEN) {\r\n      throw new Error('Socket is not open');\r\n    }\r\n    client.current?.resumeAssistant({});\r\n  }, [readyState]);\r\n\r\n  return {\r\n    readyState,\r\n    sendSessionSettings,\r\n    sendAudio,\r\n    connect,\r\n    disconnect,\r\n    sendUserInput,\r\n    sendAssistantInput,\r\n    sendToolMessage,\r\n    sendPauseAssistantMessage,\r\n    sendResumeAssistantMessage,\r\n  };\r\n};\r\n","import { type Hume } from 'hume';\r\nimport React, {\r\n  createContext,\r\n  FC,\r\n  PropsWithChildren,\r\n  useCallback,\r\n  useContext,\r\n  useEffect,\r\n  useMemo,\r\n  useRef,\r\n  useState,\r\n} from 'react';\r\n\r\nimport { ConnectionMessage } from './connection-message';\r\nimport { noop } from './noop';\r\nimport { useCallDuration } from './useCallDuration';\r\nimport { useEncoding } from './useEncoding';\r\nimport { useMessages } from './useMessages';\r\nimport { useMicrophone } from './useMicrophone';\r\nimport { useSoundPlayer } from './useSoundPlayer';\r\nimport { useToolStatus } from './useToolStatus';\r\nimport {\r\n  SocketConfig,\r\n  ToolCallHandler,\r\n  useVoiceClient,\r\n  VoiceReadyState,\r\n} from './useVoiceClient';\r\nimport {\r\n  AssistantTranscriptMessage,\r\n  AudioOutputMessage,\r\n  ChatMetadataMessage,\r\n  JSONMessage,\r\n  UserInterruptionMessage,\r\n  UserTranscriptMessage,\r\n} from '../models/messages';\r\n\r\ntype VoiceError =\r\n  | { type: 'socket_error'; message: string; error?: Error }\r\n  | { type: 'audio_error'; message: string; error?: Error }\r\n  | { type: 'mic_error'; message: string; error?: Error };\r\n\r\ntype VoiceStatus =\r\n  | {\r\n      value: 'disconnected' | 'connecting' | 'connected';\r\n      reason?: never;\r\n    }\r\n  | {\r\n      value: 'error';\r\n      reason: string;\r\n    };\r\n\r\nexport type VoiceContextType = {\r\n  connect: () => Promise<void>;\r\n  disconnect: () => void;\r\n  fft: number[];\r\n  isMuted: boolean;\r\n  isAudioMuted: boolean;\r\n  isPlaying: boolean;\r\n  messages: (JSONMessage | ConnectionMessage)[];\r\n  lastVoiceMessage: AssistantTranscriptMessage | null;\r\n  lastUserMessage: UserTranscriptMessage | null;\r\n  clearMessages: () => void;\r\n  mute: () => void;\r\n  unmute: () => void;\r\n  muteAudio: () => void;\r\n  unmuteAudio: () => void;\r\n  readyState: VoiceReadyState;\r\n  sendUserInput: (text: string) => void;\r\n  sendAssistantInput: (text: string) => void;\r\n  sendSessionSettings: Hume.empathicVoice.chat.ChatSocket['sendSessionSettings'];\r\n  sendToolMessage: (\r\n    type:\r\n      | Hume.empathicVoice.ToolResponseMessage\r\n      | Hume.empathicVoice.ToolErrorMessage,\r\n  ) => void;\r\n  pauseAssistant: () => void;\r\n  resumeAssistant: () => void;\r\n  status: VoiceStatus;\r\n  micFft: number[];\r\n  error: VoiceError | null;\r\n  isAudioError: boolean;\r\n  isError: boolean;\r\n  isMicrophoneError: boolean;\r\n  isSocketError: boolean;\r\n  callDurationTimestamp: string | null;\r\n  toolStatusStore: ReturnType<typeof useToolStatus>['store'];\r\n  chatMetadata: ChatMetadataMessage | null;\r\n  playerQueueLength: number;\r\n  isPaused: boolean;\r\n};\r\n\r\nconst VoiceContext = createContext<VoiceContextType | null>(null);\r\n\r\nexport type VoiceProviderProps = PropsWithChildren<SocketConfig> & {\r\n  sessionSettings?: Hume.empathicVoice.SessionSettings;\r\n  onMessage?: (message: JSONMessage) => void;\r\n  onError?: (err: VoiceError) => void;\r\n  onOpen?: () => void;\r\n  onClose?: Hume.empathicVoice.chat.ChatSocket.EventHandlers['close'];\r\n  onToolCall?: ToolCallHandler;\r\n  onAudioStart?: (clipId: string) => void;\r\n  onAudioEnd?: (clipId: string) => void;\r\n  onInterruption?: (\r\n    message: UserTranscriptMessage | UserInterruptionMessage,\r\n  ) => void;\r\n  /**\r\n   * @default true\r\n   * @description Clear messages when the voice is disconnected.\r\n   */\r\n  clearMessagesOnDisconnect?: boolean;\r\n  /**\r\n   * @default 100\r\n   * @description The maximum number of messages to keep in memory.\r\n   */\r\n  messageHistoryLimit?: number;\r\n  /**\r\n   * @default true\r\n   * @description Whether to use microphone input for the voice call\r\n   */\r\n  withMicrophone?: boolean;\r\n};\r\n\r\nexport const useVoice = () => {\r\n  const ctx = useContext(VoiceContext);\r\n  if (!ctx) {\r\n    throw new Error('useVoice must be used within an VoiceProvider');\r\n  }\r\n  return ctx;\r\n};\r\n\r\nexport const VoiceProvider: FC<VoiceProviderProps> = ({\r\n  children,\r\n  clearMessagesOnDisconnect = true,\r\n  messageHistoryLimit = 100,\r\n  sessionSettings,\r\n  verboseTranscription = true,\r\n  withMicrophone = true,\r\n  ...props\r\n}) => {\r\n  const {\r\n    timestamp: callDurationTimestamp,\r\n    start: startTimer,\r\n    stop: stopTimer,\r\n  } = useCallDuration();\r\n\r\n  const [status, setStatus] = useState<VoiceStatus>({\r\n    value: 'disconnected',\r\n  });\r\n\r\n  const [isPaused, setIsPaused] = useState(false);\r\n\r\n  // error handling\r\n  const [error, setError] = useState<VoiceError | null>(null);\r\n  const isError = error !== null;\r\n  const isMicrophoneError = error?.type === 'mic_error';\r\n  const isSocketError = error?.type === 'socket_error';\r\n  const isAudioError = error?.type === 'audio_error';\r\n\r\n  const onError = useRef(props.onError ?? noop);\r\n  onError.current = props.onError ?? noop;\r\n\r\n  const onClose = useRef(props.onClose ?? noop);\r\n  onClose.current = props.onClose ?? noop;\r\n\r\n  const onMessage = useRef(props.onMessage ?? noop);\r\n  onMessage.current = props.onMessage ?? noop;\r\n\r\n  const onAudioStart = useRef(props.onAudioStart ?? noop);\r\n  onAudioStart.current = props.onAudioStart ?? noop;\r\n\r\n  const onAudioEnd = useRef(props.onAudioEnd ?? noop);\r\n  onAudioEnd.current = props.onAudioEnd ?? noop;\r\n\r\n  const onInterruption = useRef(props.onInterruption ?? noop);\r\n  onInterruption.current = props.onInterruption ?? noop;\r\n\r\n  const toolStatus = useToolStatus();\r\n\r\n  const messageStore = useMessages({\r\n    sendMessageToParent: onMessage.current,\r\n    messageHistoryLimit,\r\n  });\r\n\r\n  const updateError = useCallback((err: VoiceError | null) => {\r\n    setError(err);\r\n    if (err !== null) {\r\n      onError.current?.(err);\r\n    }\r\n  }, []);\r\n\r\n  const onClientError: NonNullable<\r\n    Parameters<typeof useVoiceClient>[0]['onError']\r\n  > = useCallback(\r\n    (message, err) => {\r\n      stopTimer();\r\n      updateError({ type: 'socket_error', message, error: err });\r\n    },\r\n    [stopTimer, updateError],\r\n  );\r\n\r\n  const config = props;\r\n\r\n  const player = useSoundPlayer({\r\n    onError: (message) => {\r\n      updateError({ type: 'audio_error', message });\r\n    },\r\n    onPlayAudio: (id: string) => {\r\n      messageStore.onPlayAudio(id);\r\n      onAudioStart.current(id);\r\n    },\r\n    onStopAudio: (id: string) => {\r\n      onAudioEnd.current(id);\r\n    },\r\n  });\r\n\r\n  const {\r\n    streamRef,\r\n    getStream,\r\n    permission: micPermission,\r\n  } = useEncoding({\r\n    withMicrophone,\r\n  });\r\n\r\n  const client = useVoiceClient({\r\n    onAudioMessage: (message: AudioOutputMessage) => {\r\n      player.addToQueue(message);\r\n    },\r\n    onMessage: useCallback(\r\n      (message: JSONMessage) => {\r\n        // store message\r\n        messageStore.onMessage(message);\r\n\r\n        if (\r\n          message.type === 'user_interruption' ||\r\n          message.type === 'user_message'\r\n        ) {\r\n          if (player.isPlaying) {\r\n            onInterruption.current(message);\r\n          }\r\n          player.clearQueue();\r\n        }\r\n\r\n        if (\r\n          message.type === 'tool_call' ||\r\n          message.type === 'tool_response' ||\r\n          message.type === 'tool_error'\r\n        ) {\r\n          toolStatus.addToStore(message);\r\n        }\r\n      },\r\n      [messageStore, player, toolStatus],\r\n    ),\r\n    onError: onClientError,\r\n    onOpen: useCallback(() => {\r\n      startTimer();\r\n      messageStore.createConnectMessage();\r\n      props.onOpen?.();\r\n    }, [messageStore, props, startTimer]),\r\n    onClose: useCallback<\r\n      NonNullable<Hume.empathicVoice.chat.ChatSocket.EventHandlers['close']>\r\n    >(\r\n      (event) => {\r\n        stopTimer();\r\n        messageStore.createDisconnectMessage(event);\r\n        onClose.current?.(event);\r\n      },\r\n      [messageStore, stopTimer],\r\n    ),\r\n    onToolCall: props.onToolCall,\r\n  });\r\n\r\n  const {\r\n    sendAudio: clientSendAudio,\r\n    sendUserInput: clientSendUserInput,\r\n    sendAssistantInput: clientSendAssistantInput,\r\n    sendSessionSettings: clientSendSessionSettings,\r\n    sendToolMessage: clientSendToolMessage,\r\n    sendPauseAssistantMessage,\r\n    sendResumeAssistantMessage,\r\n  } = client;\r\n\r\n  const mic = useMicrophone({\r\n    streamRef,\r\n    withMicrophone,\r\n    onAudioCaptured: useCallback(\r\n      (arrayBuffer) => {\r\n        try {\r\n          clientSendAudio(arrayBuffer);\r\n        } catch (e) {\r\n          const message = e instanceof Error ? e.message : 'Unknown error';\r\n          updateError({ type: 'socket_error', message });\r\n        }\r\n      },\r\n      [clientSendAudio, updateError],\r\n    ),\r\n    onError: useCallback(\r\n      (message) => {\r\n        updateError({ type: 'mic_error', message });\r\n      },\r\n      [updateError],\r\n    ),\r\n  });\r\n\r\n  const { clearQueue } = player;\r\n\r\n  const pauseAssistant = useCallback(() => {\r\n    try {\r\n      sendPauseAssistantMessage();\r\n      setIsPaused(true);\r\n    } catch (e) {\r\n      const message = e instanceof Error ? e.message : 'Unknown error';\r\n      updateError({ type: 'socket_error', message });\r\n    }\r\n    clearQueue();\r\n  }, [sendPauseAssistantMessage, clearQueue, updateError]);\r\n\r\n  const resumeAssistant = useCallback(() => {\r\n    try {\r\n      sendResumeAssistantMessage();\r\n      setIsPaused(false);\r\n    } catch (e) {\r\n      const message = e instanceof Error ? e.message : 'Unknown error';\r\n      updateError({ type: 'socket_error', message });\r\n    }\r\n  }, [sendResumeAssistantMessage, updateError]);\r\n\r\n  const connect = useCallback(async () => {\r\n    updateError(null);\r\n    setStatus({ value: 'connecting' });\r\n\r\n    // Only get microphone permission if withMicrophone is true\r\n    if (withMicrophone) {\r\n      const permission = await getStream();\r\n      if (permission === 'denied') {\r\n        const error: VoiceError = {\r\n          type: 'mic_error',\r\n          message: 'Microphone permission denied',\r\n        };\r\n        updateError(error);\r\n        return Promise.reject(error);\r\n      }\r\n    }\r\n\r\n    try {\r\n      await client.connect({\r\n        ...config,\r\n        verboseTranscription: true,\r\n      });\r\n    } catch (e) {\r\n      const error: VoiceError = {\r\n        type: 'socket_error',\r\n        message: 'We could not connect to the voice. Please try again.',\r\n      };\r\n      updateError(error);\r\n      return Promise.reject(error);\r\n    }\r\n\r\n    try {\r\n      // Only start microphone if withMicrophone is true\r\n      const promises = withMicrophone\r\n        ? [mic.start(), player.initPlayer()]\r\n        : [player.initPlayer()];\r\n\r\n      const results = await Promise.allSettled(promises);\r\n\r\n      if (results.every((result) => result.status === 'fulfilled')) {\r\n        setStatus({ value: 'connected' });\r\n      }\r\n    } catch (e) {\r\n      const error: VoiceError = {\r\n        type: 'audio_error',\r\n        message:\r\n          e instanceof Error\r\n            ? e.message\r\n            : 'We could not connect to audio. Please try again.',\r\n      };\r\n      updateError(error);\r\n    }\r\n  }, [client, config, getStream, mic, player, updateError, withMicrophone]);\r\n\r\n  const disconnectFromVoice = useCallback(() => {\r\n    if (client.readyState !== VoiceReadyState.CLOSED) {\r\n      client.disconnect();\r\n    }\r\n    player.stopAll();\r\n    mic.stop();\r\n    if (clearMessagesOnDisconnect) {\r\n      messageStore.clearMessages();\r\n    }\r\n    toolStatus.clearStore();\r\n    setIsPaused(false);\r\n  }, [\r\n    client,\r\n    player,\r\n    mic,\r\n    clearMessagesOnDisconnect,\r\n    toolStatus,\r\n    messageStore,\r\n  ]);\r\n\r\n  const disconnect = useCallback(\r\n    (disconnectOnError?: boolean) => {\r\n      if (micPermission === 'denied') {\r\n        setStatus({ value: 'error', reason: 'Microphone permission denied' });\r\n      }\r\n\r\n      stopTimer();\r\n\r\n      disconnectFromVoice();\r\n\r\n      if (status.value !== 'error' && !disconnectOnError) {\r\n        // if status was 'error', keep the error status so we can show the error message to the end user.\r\n        // otherwise, set status to 'disconnected'\r\n        setStatus({ value: 'disconnected' });\r\n      }\r\n    },\r\n    [micPermission, stopTimer, disconnectFromVoice, status.value],\r\n  );\r\n\r\n  useEffect(() => {\r\n    if (\r\n      error !== null &&\r\n      status.value !== 'error' &&\r\n      status.value !== 'disconnected'\r\n    ) {\r\n      // If the status is ever set to `error`, disconnect the voice.\r\n      setStatus({ value: 'error', reason: error.message });\r\n      disconnectFromVoice();\r\n    }\r\n  }, [status.value, disconnect, disconnectFromVoice, error]);\r\n\r\n  useEffect(() => {\r\n    // disconnect from socket when the voice provider component unmounts\r\n    return () => {\r\n      disconnectFromVoice();\r\n    };\r\n    // eslint-disable-next-line react-hooks/exhaustive-deps\r\n  }, []);\r\n\r\n  const sendUserInput = useCallback(\r\n    (text: string) => {\r\n      try {\r\n        clientSendUserInput(text);\r\n      } catch (e) {\r\n        const message = e instanceof Error ? e.message : 'Unknown error';\r\n        updateError({ type: 'socket_error', message });\r\n      }\r\n    },\r\n    [clientSendUserInput, updateError],\r\n  );\r\n\r\n  const sendAssistantInput = useCallback(\r\n    (text: string) => {\r\n      try {\r\n        clientSendAssistantInput(text);\r\n      } catch (e) {\r\n        const message = e instanceof Error ? e.message : 'Unknown error';\r\n        updateError({ type: 'socket_error', message });\r\n      }\r\n    },\r\n    [clientSendAssistantInput, updateError],\r\n  );\r\n\r\n  const sendSessionSettings = useCallback(\r\n    (sessionSettings: Hume.empathicVoice.SessionSettings) => {\r\n      try {\r\n        clientSendSessionSettings(sessionSettings);\r\n      } catch (e) {\r\n        const message = e instanceof Error ? e.message : 'Unknown error';\r\n        updateError({ type: 'socket_error', message });\r\n      }\r\n    },\r\n    [clientSendSessionSettings, updateError],\r\n  );\r\n\r\n  useEffect(() => {\r\n    if (\r\n      client.readyState === VoiceReadyState.OPEN &&\r\n      sessionSettings !== undefined &&\r\n      Object.keys(sessionSettings).length > 0\r\n    ) {\r\n      clientSendSessionSettings(sessionSettings);\r\n    }\r\n  }, [client.readyState, clientSendSessionSettings, sessionSettings]);\r\n\r\n  const sendToolMessage = useCallback(\r\n    (\r\n      message:\r\n        | Hume.empathicVoice.ToolResponseMessage\r\n        | Hume.empathicVoice.ToolErrorMessage,\r\n    ) => {\r\n      try {\r\n        clientSendToolMessage(message);\r\n      } catch (e) {\r\n        const message = e instanceof Error ? e.message : 'Unknown error';\r\n        updateError({ type: 'socket_error', message });\r\n      }\r\n    },\r\n    [clientSendToolMessage, updateError],\r\n  );\r\n\r\n  const ctx = useMemo(\r\n    () =>\r\n      ({\r\n        connect,\r\n        disconnect,\r\n        fft: player.fft,\r\n        micFft: mic.fft,\r\n        isMuted: mic.isMuted,\r\n        isAudioMuted: player.isAudioMuted,\r\n        isPlaying: player.isPlaying,\r\n        messages: messageStore.messages,\r\n        lastVoiceMessage: messageStore.lastVoiceMessage,\r\n        lastUserMessage: messageStore.lastUserMessage,\r\n        clearMessages: messageStore.clearMessages,\r\n        mute: mic.mute,\r\n        muteAudio: player.muteAudio,\r\n        readyState: client.readyState,\r\n        sendUserInput,\r\n        sendAssistantInput,\r\n        sendSessionSettings,\r\n        pauseAssistant,\r\n        resumeAssistant,\r\n        sendToolMessage,\r\n        status,\r\n        unmute: mic.unmute,\r\n        unmuteAudio: player.unmuteAudio,\r\n        error,\r\n        isAudioError,\r\n        isError,\r\n        isMicrophoneError,\r\n        isSocketError,\r\n        callDurationTimestamp,\r\n        toolStatusStore: toolStatus.store,\r\n        chatMetadata: messageStore.chatMetadata,\r\n        playerQueueLength: player.queueLength,\r\n        isPaused,\r\n      }) satisfies VoiceContextType,\r\n    [\r\n      connect,\r\n      disconnect,\r\n      player.fft,\r\n      player.isAudioMuted,\r\n      player.isPlaying,\r\n      player.muteAudio,\r\n      player.unmuteAudio,\r\n      player.queueLength,\r\n      mic.fft,\r\n      mic.isMuted,\r\n      mic.mute,\r\n      mic.unmute,\r\n      messageStore.messages,\r\n      messageStore.lastVoiceMessage,\r\n      messageStore.lastUserMessage,\r\n      messageStore.clearMessages,\r\n      messageStore.chatMetadata,\r\n      client.readyState,\r\n      sendUserInput,\r\n      sendAssistantInput,\r\n      sendSessionSettings,\r\n      pauseAssistant,\r\n      resumeAssistant,\r\n      sendToolMessage,\r\n      status,\r\n      error,\r\n      isAudioError,\r\n      isError,\r\n      isMicrophoneError,\r\n      isSocketError,\r\n      callDurationTimestamp,\r\n      toolStatus.store,\r\n      isPaused,\r\n    ],\r\n  );\r\n\r\n  return <VoiceContext.Provider value={ctx}>{children}</VoiceContext.Provider>;\r\n};\r\n","export const noop = () => {};\r\n","import { intervalToDuration } from 'date-fns';\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\n\r\nexport const useCallDuration = () => {\r\n  const interval = useRef<number | null>(null);\r\n  const startTime = useRef<number | null>(null);\r\n\r\n  const [timestamp, setTimestamp] = useState<string | null>(null);\r\n\r\n  const start = useCallback(() => {\r\n    startTime.current = Date.now();\r\n\r\n    setTimestamp('00:00:00');\r\n\r\n    interval.current = window.setInterval(() => {\r\n      if (startTime.current) {\r\n        const duration = intervalToDuration({\r\n          start: startTime.current,\r\n          end: Date.now(),\r\n        });\r\n\r\n        const hours = (duration.hours ?? 0).toString().padStart(2, '0');\r\n        const minutes = (duration.minutes ?? 0).toString().padStart(2, '0');\r\n        const seconds = (duration.seconds ?? 0).toString().padStart(2, '0');\r\n\r\n        setTimestamp(`${hours}:${minutes}:${seconds}`);\r\n      }\r\n    }, 500);\r\n  }, []);\r\n\r\n  const stop = useCallback(() => {\r\n    if (interval.current) {\r\n      window.clearInterval(interval.current);\r\n      interval.current = null;\r\n    }\r\n  }, []);\r\n\r\n  const reset = useCallback(() => {\r\n    setTimestamp(null);\r\n  }, []);\r\n\r\n  useEffect(() => {\r\n    // clean up on unmount\r\n    return () => {\r\n      if (interval.current) {\r\n        window.clearInterval(interval.current);\r\n        interval.current = null;\r\n      }\r\n    };\r\n  }, []);\r\n\r\n  return { timestamp, start, stop, reset };\r\n};\r\n","// cspell:ignore dataavailable\r\nimport { checkForAudioTracks, getAudioStream } from 'hume';\r\nimport { useCallback, useRef, useState } from 'react';\r\n\r\ntype PermissionStatus = 'prompt' | 'granted' | 'denied';\r\n\r\ntype UseEncodingProps = {\r\n  withMicrophone: boolean;\r\n};\r\n\r\nconst useEncoding = (\r\n  { withMicrophone }: UseEncodingProps = { withMicrophone: true },\r\n) => {\r\n  const [permission, setPermission] = useState<PermissionStatus>('prompt');\r\n  const streamRef = useRef<MediaStream | null>(null);\r\n\r\n  const getStream = useCallback(async () => {\r\n    if (!withMicrophone) {\r\n      setPermission('granted');\r\n      return 'granted' as const;\r\n    }\r\n\r\n    try {\r\n      const stream = await getAudioStream();\r\n      setPermission('granted');\r\n      streamRef.current = stream;\r\n      checkForAudioTracks(stream);\r\n      return 'granted' as const;\r\n    } catch (e) {\r\n      setPermission('denied');\r\n      streamRef.current = null;\r\n      return 'denied' as const;\r\n    }\r\n  }, [withMicrophone]);\r\n\r\n  return {\r\n    streamRef,\r\n    getStream,\r\n    permission,\r\n  };\r\n};\r\n\r\nexport { useEncoding };\r\n","import type { CloseEvent } from 'hume/core';\r\nimport { useCallback, useState } from 'react';\r\n\r\nimport type { ConnectionMessage } from './connection-message';\r\nimport type {\r\n  AssistantTranscriptMessage,\r\n  ChatMetadataMessage,\r\n  JSONMessage,\r\n  UserTranscriptMessage,\r\n} from '../models/messages';\r\nimport { keepLastN } from '../utils';\r\n\r\nexport const useMessages = ({\r\n  sendMessageToParent,\r\n  messageHistoryLimit,\r\n}: {\r\n  sendMessageToParent?: (message: JSONMessage) => void;\r\n  messageHistoryLimit: number;\r\n}) => {\r\n  const [voiceMessageMap, setVoiceMessageMap] = useState<\r\n    Record<string, AssistantTranscriptMessage>\r\n  >({});\r\n\r\n  const [messages, setMessages] = useState<\r\n    Array<JSONMessage | ConnectionMessage>\r\n  >([]);\r\n\r\n  const [lastVoiceMessage, setLastVoiceMessage] =\r\n    useState<AssistantTranscriptMessage | null>(null);\r\n  const [lastUserMessage, setLastUserMessage] =\r\n    useState<UserTranscriptMessage | null>(null);\r\n\r\n  const [chatMetadata, setChatMetadata] = useState<ChatMetadataMessage | null>(\r\n    null,\r\n  );\r\n\r\n  const createConnectMessage = useCallback(() => {\r\n    setMessages((prev) =>\r\n      prev.concat([\r\n        {\r\n          type: 'socket_connected',\r\n          receivedAt: new Date(),\r\n        },\r\n      ]),\r\n    );\r\n  }, []);\r\n\r\n  const createDisconnectMessage = useCallback((event: CloseEvent) => {\r\n    setMessages((prev) =>\r\n      prev.concat([\r\n        {\r\n          type: 'socket_disconnected',\r\n          code: event.code,\r\n          reason: event.reason,\r\n          receivedAt: new Date(),\r\n        },\r\n      ]),\r\n    );\r\n  }, []);\r\n\r\n  const onMessage = useCallback(\r\n    (message: JSONMessage) => {\r\n      /* \r\n      1. message comes in from the backend\r\n        - if the message IS NOT AssistantTranscriptMessage, store in `messages` immediately  \r\n        - if the message is an AssistantTranscriptMessage, stored in `voiceMessageMap`\r\n      2. audio clip plays\r\n        - find the AssistantTranscriptMessage with a matching ID, and store it in `messages`\r\n        - remove the AssistantTranscriptMessage from `voiceMessageMap`\r\n    */\r\n      switch (message.type) {\r\n        case 'assistant_message':\r\n          // for assistant messages, `sendMessageToParent` is called in `onPlayAudio`\r\n          // in order to line up the transcript event with the correct audio clip\r\n          setVoiceMessageMap((prev) => ({\r\n            ...prev,\r\n            [`${message.id}`]: message,\r\n          }));\r\n          break;\r\n        case 'user_message':\r\n          sendMessageToParent?.(message);\r\n\r\n          // Exclude interim messages from the messages array.\r\n          // If end users want to see interim messages, they can use the onMessage\r\n          // callback because we are still sending them via `sendMessageToParent`.\r\n          if (message.interim === false) {\r\n            setLastUserMessage(message);\r\n            setMessages((prev) => {\r\n              return keepLastN(messageHistoryLimit, prev.concat([message]));\r\n            });\r\n          }\r\n\r\n          break;\r\n        case 'user_interruption':\r\n        case 'error':\r\n        case 'tool_call':\r\n        case 'tool_response':\r\n        case 'tool_error':\r\n        case 'assistant_end':\r\n          sendMessageToParent?.(message);\r\n          setMessages((prev) => {\r\n            return keepLastN(messageHistoryLimit, prev.concat([message]));\r\n          });\r\n          break;\r\n        case 'chat_metadata':\r\n          sendMessageToParent?.(message);\r\n          setMessages((prev) => {\r\n            return keepLastN(messageHistoryLimit, prev.concat([message]));\r\n          });\r\n          setChatMetadata(message);\r\n          break;\r\n        default:\r\n          break;\r\n      }\r\n    },\r\n    [messageHistoryLimit, sendMessageToParent],\r\n  );\r\n\r\n  const onPlayAudio = useCallback(\r\n    (id: string) => {\r\n      const matchingTranscript = voiceMessageMap[id];\r\n      if (matchingTranscript) {\r\n        sendMessageToParent?.(matchingTranscript);\r\n        setLastVoiceMessage(matchingTranscript);\r\n        setMessages((prev) => {\r\n          return keepLastN(\r\n            messageHistoryLimit,\r\n            prev.concat([matchingTranscript]),\r\n          );\r\n        });\r\n        // remove the message from the map to ensure we don't\r\n        // accidentally push it to the messages array more than once\r\n        setVoiceMessageMap((prev) => {\r\n          const newMap = { ...prev };\r\n          delete newMap[id];\r\n          return newMap;\r\n        });\r\n      }\r\n    },\r\n    [voiceMessageMap, sendMessageToParent, messageHistoryLimit],\r\n  );\r\n\r\n  const clearMessages = useCallback(() => {\r\n    setMessages([]);\r\n    setLastVoiceMessage(null);\r\n    setLastUserMessage(null);\r\n    setVoiceMessageMap({});\r\n  }, []);\r\n\r\n  return {\r\n    createConnectMessage,\r\n    createDisconnectMessage,\r\n    onMessage,\r\n    onPlayAudio,\r\n    clearMessages,\r\n    messages,\r\n    lastVoiceMessage,\r\n    lastUserMessage,\r\n    chatMetadata,\r\n  };\r\n};\r\n","export const keepLastN = <T>(n: number, arr: T[]): T[] => {\r\n  if (arr.length <= n) {\r\n    return arr;\r\n  }\r\n  return arr.slice(arr.length - n);\r\n};\r\n","import { useCallback, useState } from 'react';\r\n\r\nimport type { ToolCall, ToolError, ToolResponse } from '../models/messages';\r\n\r\nexport const useToolStatus = () => {\r\n  const [store, setStore] = useState<\r\n    Record<\r\n      string,\r\n      {\r\n        call?: ToolCall;\r\n        resolved?: ToolResponse | ToolError;\r\n      }\r\n    >\r\n  >({});\r\n\r\n  const addToStore = useCallback(\r\n    (message: ToolCall | ToolResponse | ToolError) => {\r\n      setStore((prev) => {\r\n        const entry = {\r\n          ...prev[message.toolCallId],\r\n        };\r\n\r\n        if (message.type === 'tool_call') {\r\n          entry.call = message;\r\n        }\r\n\r\n        if (message.type === 'tool_response' || message.type === 'tool_error') {\r\n          entry.resolved = message;\r\n        }\r\n\r\n        return {\r\n          ...prev,\r\n          [message.toolCallId]: entry,\r\n        };\r\n      });\r\n    },\r\n    [],\r\n  );\r\n\r\n  const clearStore = useCallback(() => {\r\n    setStore({});\r\n  }, []);\r\n\r\n  return {\r\n    store,\r\n    addToStore,\r\n    clearStore,\r\n  };\r\n};\r\n","export class SocketUnknownMessageError extends Error {\r\n  constructor(message?: string) {\r\n    super(`Unknown message type.${message ? ' ' + message : ''}`);\r\n    this.name = 'SocketUnknownMessageError';\r\n  }\r\n}\r\n\r\n/**\r\n * @name isSocketUnknownMessageError\r\n * @description\r\n * Check if an error is a SocketUnknownMessageError.\r\n * @param err - The error to check.\r\n * @returns\r\n * `true` if the error is a SocketUnknownMessageError.\r\n * @example\r\n * ```ts\r\n * if (isSocketUnknownMessageError(err)) {\r\n * console.error('Unknown message type');\r\n * }\r\n * ```\r\n */\r\nexport const isSocketUnknownMessageError = (\r\n  err: unknown,\r\n): err is SocketUnknownMessageError => {\r\n  return err instanceof SocketUnknownMessageError;\r\n};\r\n\r\nexport class SocketFailedToParseMessageError extends Error {\r\n  constructor(message?: string) {\r\n    super(\r\n      `Failed to parse message from socket.${message ? ' ' + message : ''}`,\r\n    );\r\n    this.name = 'SocketFailedToParseMessageError';\r\n  }\r\n}\r\n\r\n/**\r\n * @name isSocketFailedToParseMessageError\r\n * @description\r\n * Check if an error is a SocketFailedToParseMessageError.\r\n * @param err - The error to check.\r\n * @returns\r\n * `true` if the error is a SocketFailedToParseMessageError.\r\n * @example\r\n * ```ts\r\n * if (isSocketFailedToParseMessageError(err)) {\r\n * console.error('Failed to parse message from socket');\r\n * }\r\n * ```\r\n */\r\nexport const isSocketFailedToParseMessageError = (\r\n  err: unknown,\r\n): err is SocketFailedToParseMessageError => {\r\n  return err instanceof SocketFailedToParseMessageError;\r\n};\r\n","import { type Hume } from 'hume';\r\nimport { SubscribeEvent } from 'hume/serialization/resources/empathicVoice/index.js';\r\n\r\nimport { type AudioMessage, parseAudioMessage } from './audio-message';\r\nimport {\r\n  SocketFailedToParseMessageError,\r\n  SocketUnknownMessageError,\r\n} from './errors';\r\n\r\n/**\r\n * @name parseMessageData\r\n * @description\r\n * Parse the data of a message from the socket.\r\n * @param data - The data to parse.\r\n * @returns\r\n * The parsed message data.\r\n * @example\r\n * ```ts\r\n * const message = await parseMessageData(data);\r\n * ```\r\n */\r\nexport const parseMessageData = async (\r\n  data: unknown,\r\n): Promise<\r\n  | {\r\n      success: true;\r\n      message: Hume.empathicVoice.SubscribeEvent | AudioMessage;\r\n    }\r\n  | {\r\n      success: false;\r\n      error: Error;\r\n    }\r\n> => {\r\n  if (data instanceof Blob) {\r\n    const message = await parseAudioMessage(data);\r\n\r\n    if (message) {\r\n      return {\r\n        success: true,\r\n        message,\r\n      };\r\n    } else {\r\n      return {\r\n        success: false,\r\n        error: new SocketFailedToParseMessageError(\r\n          `Received blob was unable to be converted to ArrayBuffer.`,\r\n        ),\r\n      };\r\n    }\r\n  }\r\n\r\n  if (typeof data !== 'string') {\r\n    return {\r\n      success: false,\r\n      error: new SocketFailedToParseMessageError(\r\n        `Expected a string but received ${typeof data}.`,\r\n      ),\r\n    };\r\n  }\r\n\r\n  const parseResponse = SubscribeEvent.parse(data);\r\n\r\n  if (!parseResponse.ok) {\r\n    return {\r\n      success: false,\r\n      error: new SocketUnknownMessageError(\r\n        `Received JSON was not a known message type.`,\r\n      ),\r\n    };\r\n  }\r\n\r\n  return {\r\n    success: true,\r\n    message: parseResponse.value,\r\n  };\r\n};\r\n\r\n/**\r\n * @name parseMessageType\r\n * @description\r\n * Parse the type of a message from the socket.\r\n * @param event - The event to parse.\r\n * @returns\r\n * The parsed message type.\r\n * @example\r\n * ```ts\r\n * const message = await parseMessageType(event);\r\n * ```\r\n */\r\nexport const parseMessageType = async (\r\n  event: MessageEvent,\r\n): Promise<\r\n  | {\r\n      success: true;\r\n      message: Hume.empathicVoice.SubscribeEvent | AudioMessage;\r\n    }\r\n  | {\r\n      success: false;\r\n      error: Error;\r\n    }\r\n> => {\r\n  const data: unknown = event.data;\r\n  return parseMessageData(data);\r\n};\r\n","import z from 'zod';\r\n\r\nexport const AudioMessageSchema = z\r\n  .object({\r\n    type: z.literal('audio'),\r\n    data: z.instanceof(ArrayBuffer),\r\n  })\r\n  .transform((obj) => {\r\n    return Object.assign(obj, {\r\n      receivedAt: new Date(),\r\n    });\r\n  });\r\n\r\nexport type AudioMessage = z.infer<typeof AudioMessageSchema>;\r\n\r\nexport const parseAudioMessage = async (\r\n  blob: Blob,\r\n): Promise<AudioMessage | null> => {\r\n  return blob\r\n    .arrayBuffer()\r\n    .then((buffer) => {\r\n      return {\r\n        type: 'audio' as const,\r\n        data: buffer,\r\n        receivedAt: new Date(),\r\n      };\r\n    })\r\n    .catch(() => {\r\n      return null;\r\n    });\r\n};\r\n","export enum Channels {\r\n  /** Mono */\r\n  MONO = 1,\r\n  /** Stereo */\r\n  STEREO = 2,\r\n}\r\n\r\nexport enum AudioEncoding {\r\n  /** 16-bit signed little-endian (PCM) */\r\n  LINEAR16 = 'linear16',\r\n  /** Ogg Opus */\r\n  OPUS = 'opus',\r\n}\r\n","export enum LanguageModelOption {\r\n  CLAUDE_3_OPUS = 'CLAUDE_3_OPUS',\r\n  CLAUDE_3_SONNET = 'CLAUDE_3_SONNET',\r\n  CLAUDE_3_HAIKU = 'CLAUDE_3_HAIKU',\r\n  CLAUDE_21 = 'CLAUDE_21',\r\n  CLAUDE_INSTANT_12 = 'CLAUDE_INSTANT_12',\r\n  GPT_4_TURBO_PREVIEW = 'GPT_4_TURBO_PREVIEW',\r\n  GPT_35_TURBO_0125 = 'GPT_35_TURBO_0125',\r\n  GPT_35_TURBO = 'GPT_35_TURBO',\r\n  FIREWORKS_MIXTRAL_8X7B = 'FIREWORKS_MIXTRAL_8X7B',\r\n}\r\n","import type {\r\n  AssistantEnd,\r\n  AssistantMessage,\r\n  AudioInput,\r\n  AudioOutput,\r\n  ChatMetadata,\r\n  JsonMessage,\r\n  ToolCallMessage,\r\n  ToolErrorMessage,\r\n  ToolResponseMessage,\r\n  UserInterruption,\r\n  UserMessage,\r\n  WebSocketError,\r\n} from 'hume/api/resources/empathicVoice';\r\nimport z from 'zod';\r\n\r\ntype WithReceivedAt<T> = T & { receivedAt: Date };\r\n\r\nexport type AssistantEndMessage = WithReceivedAt<AssistantEnd>;\r\nexport type AssistantTranscriptMessage = WithReceivedAt<AssistantMessage>;\r\nexport type AudioMessage = WithReceivedAt<AudioInput>;\r\nexport type AudioOutputMessage = WithReceivedAt<AudioOutput>;\r\nexport type ChatMetadataMessage = WithReceivedAt<ChatMetadata>;\r\nexport type JSONErrorMessage = WithReceivedAt<WebSocketError>;\r\nexport type JSONMessage = WithReceivedAt<JsonMessage>;\r\nexport type ToolCall = WithReceivedAt<ToolCallMessage>;\r\nexport type ToolError = WithReceivedAt<ToolErrorMessage>;\r\nexport type ToolResponse = WithReceivedAt<ToolResponseMessage>;\r\nexport type UserInterruptionMessage = WithReceivedAt<UserInterruption>;\r\nexport type UserTranscriptMessage = WithReceivedAt<UserMessage>;\r\n\r\nexport const TimeSliceSchema = z.object({\r\n  begin: z.number(),\r\n  end: z.number(),\r\n});\r\n\r\nexport type TimeSlice = z.infer<typeof TimeSliceSchema>;\r\n","export enum TTSService {\r\n  /** Hume's Text-To-Speech */\r\n  DEFAULT = 'hume_ai',\r\n  /** ElevenLab's Text-To-Speech */\r\n  ELEVEN_LABS = 'eleven_labs',\r\n  /** Play HT's Text-To-Speech */\r\n  PLAY_HT = 'play_ht',\r\n}\r\n"],"mappings":"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","names":["useCallback","useRef","useState","useState","useRef","useCallback","useCallback","useRef","useState","VoiceReadyState","useCallback","useEffect","useRef","useState","useCallback","useEffect","useRef","useState","useCallback","useRef","useState","useCallback","useState","useState","useCallback","useCallback","useState","useState","useRef","useCallback","error","useEffect","sessionSettings","message","Channels","AudioEncoding","LanguageModelOption","z","TTSService"]}