@wix/legends-platform-sdk 1.32.0 → 1.33.0

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 (73) hide show
  1. package/dist/cjs/components/ChromaKey/ChromaKey.js +14 -4
  2. package/dist/cjs/components/ChromaKey/ChromaKey.js.map +1 -1
  3. package/dist/cjs/components/ChromaKey/chroma-key.js +3 -0
  4. package/dist/cjs/components/ChromaKey/chroma-key.js.map +1 -1
  5. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js +32 -7
  6. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  7. package/dist/cjs/components/Video/Video.js +16 -2
  8. package/dist/cjs/components/Video/Video.js.map +1 -1
  9. package/dist/cjs/components/Video/types.js.map +1 -1
  10. package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js +12 -3
  11. package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
  12. package/dist/cjs/hooks/useConversation/livekit/useConversation.js +24 -14
  13. package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
  14. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js +11 -3
  15. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  16. package/dist/cjs/sdk-consumer/context.js.map +1 -1
  17. package/dist/cjs/sdk.js +26 -0
  18. package/dist/cjs/sdk.js.map +1 -1
  19. package/dist/cjs/startup-telemetry/attempt.js +188 -0
  20. package/dist/cjs/startup-telemetry/attempt.js.map +1 -0
  21. package/dist/cjs/startup-telemetry/frame.js +83 -0
  22. package/dist/cjs/startup-telemetry/frame.js.map +1 -0
  23. package/dist/cjs/startup-telemetry/useStartupAttempt.js +15 -0
  24. package/dist/cjs/startup-telemetry/useStartupAttempt.js.map +1 -0
  25. package/dist/esm/components/ChromaKey/ChromaKey.js +12 -2
  26. package/dist/esm/components/ChromaKey/ChromaKey.js.map +1 -1
  27. package/dist/esm/components/ChromaKey/chroma-key.js +3 -0
  28. package/dist/esm/components/ChromaKey/chroma-key.js.map +1 -1
  29. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js +28 -3
  30. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  31. package/dist/esm/components/Video/Video.js +16 -1
  32. package/dist/esm/components/Video/Video.js.map +1 -1
  33. package/dist/esm/components/Video/types.js.map +1 -1
  34. package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js +11 -2
  35. package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
  36. package/dist/esm/hooks/useConversation/livekit/useConversation.js +24 -14
  37. package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
  38. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js +11 -3
  39. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  40. package/dist/esm/sdk-consumer/context.js.map +1 -1
  41. package/dist/esm/sdk.js +1 -0
  42. package/dist/esm/sdk.js.map +1 -1
  43. package/dist/esm/startup-telemetry/attempt.js +180 -0
  44. package/dist/esm/startup-telemetry/attempt.js.map +1 -0
  45. package/dist/esm/startup-telemetry/frame.js +77 -0
  46. package/dist/esm/startup-telemetry/frame.js.map +1 -0
  47. package/dist/esm/startup-telemetry/useStartupAttempt.js +10 -0
  48. package/dist/esm/startup-telemetry/useStartupAttempt.js.map +1 -0
  49. package/dist/types/components/ChromaKey/ChromaKey.d.ts +2 -0
  50. package/dist/types/components/ChromaKey/ChromaKey.d.ts.map +1 -1
  51. package/dist/types/components/ChromaKey/chroma-key.d.ts +1 -0
  52. package/dist/types/components/ChromaKey/chroma-key.d.ts.map +1 -1
  53. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts +2 -0
  54. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts.map +1 -1
  55. package/dist/types/components/Video/Video.d.ts +1 -0
  56. package/dist/types/components/Video/Video.d.ts.map +1 -1
  57. package/dist/types/components/Video/types.d.ts +2 -0
  58. package/dist/types/components/Video/types.d.ts.map +1 -1
  59. package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts +2 -0
  60. package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts.map +1 -1
  61. package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
  62. package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
  63. package/dist/types/sdk-consumer/context.d.ts +2 -0
  64. package/dist/types/sdk-consumer/context.d.ts.map +1 -1
  65. package/dist/types/sdk.d.ts +2 -0
  66. package/dist/types/sdk.d.ts.map +1 -1
  67. package/dist/types/startup-telemetry/attempt.d.ts +71 -0
  68. package/dist/types/startup-telemetry/attempt.d.ts.map +1 -0
  69. package/dist/types/startup-telemetry/frame.d.ts +6 -0
  70. package/dist/types/startup-telemetry/frame.d.ts.map +1 -0
  71. package/dist/types/startup-telemetry/useStartupAttempt.d.ts +2 -0
  72. package/dist/types/startup-telemetry/useStartupAttempt.d.ts.map +1 -0
  73. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","Provider","createStore","LiveKitRoom","QueryClientProvider","QueryClient","BusProvider","FetchPersonaChatService","SdkConsumerContext","LegendsPlatform","props","chatId","namespace","children","className","_props$tools","tools","apiKey","personaChatService","store","queryClient","defaultOptions","queries","refetchOnMount","refetchOnWindowFocus","resolvedService","undefined","consumer","createElement","value","client","serverUrl","token"],"sources":["../../../../src/components/LegendsPlatform/LegendsPlatform.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Provider, createStore } from 'jotai';\nimport { type Store } from 'jotai/vanilla/store';\nimport { LiveKitRoom } from '@livekit/components-react';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\nimport { Provider as BusProvider } from 'react-bus';\n\nimport type { ToolsRegistry } from '../../hooks/useTools/model/types';\nimport type { IPersonaChatService } from '../../types/service';\nimport { FetchPersonaChatService } from '../../services/FetchPersonaChatService';\nimport { SdkConsumerContext } from '../../sdk-consumer';\n\nexport type LegendsPlatformProps = {\n chatId: string;\n namespace: string;\n apiKey?: string;\n personaChatService?: IPersonaChatService;\n store?: Store;\n tools?: ToolsRegistry;\n children: React.ReactNode;\n queryClient?: QueryClient;\n className?: string;\n};\n\nexport function LegendsPlatform(props: LegendsPlatformProps) {\n const {\n chatId,\n namespace,\n children,\n className,\n tools = {},\n apiKey,\n personaChatService,\n } = props;\n\n const store = useMemo(() => props.store || createStore(), [props.store]);\n\n const queryClient = useMemo(\n () =>\n props.queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: { refetchOnMount: false, refetchOnWindowFocus: false },\n },\n }),\n [props.queryClient],\n );\n\n const resolvedService = useMemo<IPersonaChatService | undefined>(() => {\n if (personaChatService) {\n return personaChatService;\n }\n if (apiKey) {\n return new FetchPersonaChatService(apiKey);\n }\n return undefined;\n }, [personaChatService, apiKey]);\n\n const consumer = useMemo(\n () => ({ chatId, namespace, tools, personaChatService: resolvedService }),\n [chatId, namespace, tools, resolvedService],\n );\n\n return (\n <SdkConsumerContext.Provider value={consumer}>\n <QueryClientProvider client={queryClient}>\n <Provider store={store}>\n <BusProvider>\n <LiveKitRoom\n className={className}\n serverUrl={undefined}\n token={undefined}\n >\n {children}\n </LiveKitRoom>\n </BusProvider>\n </Provider>\n </QueryClientProvider>\n </SdkConsumerContext.Provider>\n );\n}\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,SAASC,QAAQ,EAAEC,WAAW,QAAQ,OAAO;AAE7C,SAASC,WAAW,QAAQ,2BAA2B;AACvD,SAASC,mBAAmB,EAAEC,WAAW,QAAQ,uBAAuB;AACxE,SAASJ,QAAQ,IAAIK,WAAW,QAAQ,WAAW;AAInD,SAASC,uBAAuB,QAAQ,wCAAwC;AAChF,SAASC,kBAAkB,QAAQ,oBAAoB;AAcvD,OAAO,SAASC,eAAeA,CAACC,KAA2B,EAAE;EAC3D,MACEC,MAAM,GAOJD,KAAK,CAPPC,MAAM;IACNC,SAAS,GAMPF,KAAK,CANPE,SAAS;IACTC,QAAQ,GAKNH,KAAK,CALPG,QAAQ;IACRC,SAAS,GAIPJ,KAAK,CAJPI,SAAS;IAAAC,YAAA,GAIPL,KAAK,CAHPM,KAAK;IAALA,KAAK,GAAAD,YAAA,cAAG,CAAC,CAAC,GAAAA,YAAA;IACVE,MAAM,GAEJP,KAAK,CAFPO,MAAM;IACNC,kBAAkB,GAChBR,KAAK,CADPQ,kBAAkB;EAGpB,MAAMC,KAAK,GAAGnB,OAAO,CAAC,MAAMU,KAAK,CAACS,KAAK,IAAIjB,WAAW,CAAC,CAAC,EAAE,CAACQ,KAAK,CAACS,KAAK,CAAC,CAAC;EAExE,MAAMC,WAAW,GAAGpB,OAAO,CACzB,MACEU,KAAK,CAACU,WAAW,IACjB,IAAIf,WAAW,CAAC;IACdgB,cAAc,EAAE;MACdC,OAAO,EAAE;QAAEC,cAAc,EAAE,KAAK;QAAEC,oBAAoB,EAAE;MAAM;IAChE;EACF,CAAC,CAAC,EACJ,CAACd,KAAK,CAACU,WAAW,CACpB,CAAC;EAED,MAAMK,eAAe,GAAGzB,OAAO,CAAkC,MAAM;IACrE,IAAIkB,kBAAkB,EAAE;MACtB,OAAOA,kBAAkB;IAC3B;IACA,IAAID,MAAM,EAAE;MACV,OAAO,IAAIV,uBAAuB,CAACU,MAAM,CAAC;IAC5C;IACA,OAAOS,SAAS;EAClB,CAAC,EAAE,CAACR,kBAAkB,EAAED,MAAM,CAAC,CAAC;EAEhC,MAAMU,QAAQ,GAAG3B,OAAO,CACtB,OAAO;IAAEW,MAAM;IAAEC,SAAS;IAAEI,KAAK;IAAEE,kBAAkB,EAAEO;EAAgB,CAAC,CAAC,EACzE,CAACd,MAAM,EAAEC,SAAS,EAAEI,KAAK,EAAES,eAAe,CAC5C,CAAC;EAED,oBACE1B,KAAA,CAAA6B,aAAA,CAACpB,kBAAkB,CAACP,QAAQ;IAAC4B,KAAK,EAAEF;EAAS,gBAC3C5B,KAAA,CAAA6B,aAAA,CAACxB,mBAAmB;IAAC0B,MAAM,EAAEV;EAAY,gBACvCrB,KAAA,CAAA6B,aAAA,CAAC3B,QAAQ;IAACkB,KAAK,EAAEA;EAAM,gBACrBpB,KAAA,CAAA6B,aAAA,CAACtB,WAAW,qBACVP,KAAA,CAAA6B,aAAA,CAACzB,WAAW;IACVW,SAAS,EAAEA,SAAU;IACrBiB,SAAS,EAAEL,SAAU;IACrBM,KAAK,EAAEN;EAAU,GAEhBb,QACU,CACF,CACL,CACS,CACM,CAAC;AAElC","ignoreList":[]}
1
+ {"version":3,"names":["React","useMemo","useRef","Provider","createStore","LiveKitRoom","QueryClientProvider","QueryClient","BusProvider","FetchPersonaChatService","SdkConsumerContext","StartupTelemetrySession","LegendsPlatform","props","_props$startupTelemet","_props$startupTelemet2","_props$startupTelemet3","chatId","namespace","children","className","_props$tools","tools","apiKey","personaChatService","store","queryClient","defaultOptions","queries","refetchOnMount","refetchOnWindowFocus","resolvedService","undefined","telemetryRef","startupTelemetry","current","telemetryEnabled","enabled","intentId","intent","id","attemptId","attempt","startupTelemetrySession","config","report","event","_telemetryRef$current","consumer","createElement","value","client","serverUrl","token"],"sources":["../../../../src/components/LegendsPlatform/LegendsPlatform.tsx"],"sourcesContent":["import React, { useMemo, useRef } from 'react';\nimport { Provider, createStore } from 'jotai';\nimport { type Store } from 'jotai/vanilla/store';\nimport { LiveKitRoom } from '@livekit/components-react';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\nimport { Provider as BusProvider } from 'react-bus';\n\nimport type { ToolsRegistry } from '../../hooks/useTools/model/types';\nimport type { IPersonaChatService } from '../../types/service';\nimport { FetchPersonaChatService } from '../../services/FetchPersonaChatService';\nimport { SdkConsumerContext } from '../../sdk-consumer';\nimport {\n StartupTelemetrySession,\n type StartupTelemetryOptions,\n} from '../../startup-telemetry/attempt';\n\nexport type LegendsPlatformProps = {\n startupTelemetry?: StartupTelemetryOptions;\n chatId: string;\n namespace: string;\n apiKey?: string;\n personaChatService?: IPersonaChatService;\n store?: Store;\n tools?: ToolsRegistry;\n children: React.ReactNode;\n queryClient?: QueryClient;\n className?: string;\n};\n\nexport function LegendsPlatform(props: LegendsPlatformProps) {\n const {\n chatId,\n namespace,\n children,\n className,\n tools = {},\n apiKey,\n personaChatService,\n } = props;\n\n const store = useMemo(() => props.store || createStore(), [props.store]);\n\n const queryClient = useMemo(\n () =>\n props.queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: { refetchOnMount: false, refetchOnWindowFocus: false },\n },\n }),\n [props.queryClient],\n );\n\n const resolvedService = useMemo<IPersonaChatService | undefined>(() => {\n if (personaChatService) {\n return personaChatService;\n }\n if (apiKey) {\n return new FetchPersonaChatService(apiKey);\n }\n return undefined;\n }, [personaChatService, apiKey]);\n\n const telemetryRef = useRef(props.startupTelemetry);\n telemetryRef.current = props.startupTelemetry;\n const telemetryEnabled = props.startupTelemetry?.enabled;\n const intentId = props.startupTelemetry?.intent?.id;\n const attemptId = props.startupTelemetry?.attempt?.id;\n const startupTelemetrySession = useMemo(() => {\n const config = telemetryRef.current;\n if (!telemetryEnabled || !config) {\n return undefined;\n }\n return new StartupTelemetrySession(\n {\n ...config,\n report: (event) => {\n if (telemetryRef.current?.enabled) {\n return telemetryRef.current.report?.(event);\n }\n return undefined;\n },\n },\n chatId,\n );\n // A new intent/attempt changes ownership; report callbacks stay live via the ref.\n }, [chatId, telemetryEnabled, intentId, attemptId]);\n\n const consumer = useMemo(\n () => ({\n chatId,\n namespace,\n tools,\n personaChatService: resolvedService,\n startupTelemetrySession,\n }),\n [chatId, namespace, tools, resolvedService, startupTelemetrySession],\n );\n\n return (\n <SdkConsumerContext.Provider value={consumer}>\n <QueryClientProvider client={queryClient}>\n <Provider store={store}>\n <BusProvider>\n <LiveKitRoom\n className={className}\n serverUrl={undefined}\n token={undefined}\n >\n {children}\n </LiveKitRoom>\n </BusProvider>\n </Provider>\n </QueryClientProvider>\n </SdkConsumerContext.Provider>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
3
- const _excluded = ["type", "fallback", "fit", "automirror", "pip", "onPiPEnter", "onPiPExit", "onPiPError", "pipFallback", "style"];
3
+ const _excluded = ["type", "startupRenderSurface", "fallback", "fit", "automirror", "pip", "onPiPEnter", "onPiPExit", "onPiPError", "pipFallback", "style"];
4
4
  import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
5
5
  import invariant from 'invariant';
6
6
  import { useAtomValue } from 'jotai';
@@ -8,8 +8,12 @@ import { state } from '../../conversation';
8
8
  import { useAttachVideo } from './useAttachVideo';
9
9
  import { useEmitConversationEvent } from '../../hooks/useConversationEvents/useEmitConversationEvent';
10
10
  import { usePictureInPictureAuto, pipActiveAtom } from '../../hooks/usePictureInPicture';
11
+ import { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';
12
+ import { observeVideoFrame } from '../../startup-telemetry/frame';
11
13
  export const Video = /*#__PURE__*/forwardRef((props, ref) => {
12
14
  const type = props.type,
15
+ _props$startupRenderS = props.startupRenderSurface,
16
+ startupRenderSurface = _props$startupRenderS === void 0 ? 'video' : _props$startupRenderS,
13
17
  _props$fallback = props.fallback,
14
18
  Fallback = _props$fallback === void 0 ? () => null : _props$fallback,
15
19
  _props$fit = props.fit,
@@ -29,6 +33,7 @@ export const Video = /*#__PURE__*/forwardRef((props, ref) => {
29
33
  setMirror = _useState[1];
30
34
  const conversation = useAtomValue(state.conversation);
31
35
  const emitEvent = useEmitConversationEvent();
36
+ const startupAttempt = useStartupAttempt();
32
37
  invariant(conversation, 'Conversation is not initialized');
33
38
  invariant(type === 'screen' ? true : conversation.type === 'video', 'Conversation type is not video');
34
39
  const _useAttachVideo = useAttachVideo({
@@ -55,6 +60,16 @@ export const Video = /*#__PURE__*/forwardRef((props, ref) => {
55
60
  });
56
61
  }
57
62
  }, [isVideoPlayable, type]);
63
+ useEffect(() => {
64
+ if (!startupAttempt || type !== 'agent' || !isVideoPlayable || !videoRef.current) {
65
+ return;
66
+ }
67
+ startupAttempt.mark('track_subscribed');
68
+ if (startupRenderSurface === 'video') {
69
+ return observeVideoFrame(startupAttempt, videoRef.current);
70
+ }
71
+ return undefined;
72
+ }, [startupAttempt, type, isVideoPlayable, startupRenderSurface, videoRef]);
58
73
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("video", _extends({
59
74
  ref: videoRef,
60
75
  muted: true,
@@ -1 +1 @@
1
- {"version":3,"names":["React","forwardRef","useEffect","useImperativeHandle","useState","invariant","useAtomValue","state","useAttachVideo","useEmitConversationEvent","usePictureInPictureAuto","pipActiveAtom","Video","props","ref","type","_props$fallback","fallback","Fallback","_props$fit","fit","_props$automirror","automirror","_props$pip","pip","onPiPEnter","onPiPExit","onPiPError","pipFallback","style","videoProps","_objectWithoutPropertiesLoose","_excluded","_useState","mirror","setMirror","conversation","emitEvent","_useAttachVideo","videoRef","isVideoPlayable","element","current","onEnter","onExit","onError","isPiPActive","showPipFallback","createElement","Fragment","_extends","muted","playsInline","autoPlay","objectFit","display","transform"],"sources":["../../../../src/components/Video/Video.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport invariant from 'invariant';\nimport { useAtomValue } from 'jotai';\nimport { state } from '../../conversation';\nimport { useAttachVideo } from './useAttachVideo';\nimport { useEmitConversationEvent } from '../../hooks/useConversationEvents/useEmitConversationEvent';\nimport {\n usePictureInPictureAuto,\n pipActiveAtom,\n} from '../../hooks/usePictureInPicture';\nimport { type VideoProps } from './types';\n\nexport const Video = forwardRef<HTMLVideoElement, VideoProps>((props, ref) => {\n const {\n type,\n fallback: Fallback = () => null,\n fit = 'cover',\n automirror = true,\n pip = false,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n pipFallback,\n style,\n ...videoProps\n } = props;\n\n const [mirror, setMirror] = useState(props.mirror);\n\n const conversation = useAtomValue(state.conversation);\n const emitEvent = useEmitConversationEvent();\n\n invariant(conversation, 'Conversation is not initialized');\n invariant(\n type === 'screen' ? true : conversation.type === 'video',\n 'Conversation type is not video',\n );\n\n const { videoRef, isVideoPlayable } = useAttachVideo({ type });\n\n usePictureInPictureAuto({\n element: pip && isVideoPlayable ? videoRef.current : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const isPiPActive = useAtomValue(pipActiveAtom);\n\n useImperativeHandle(ref, () => videoRef.current!);\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n setMirror(props.mirror ?? (automirror && type === 'user'));\n }, [automirror, type, props.mirror]);\n\n useEffect(() => {\n if (isVideoPlayable && type === 'agent') {\n emitEvent('agentVideoLoaded', {\n videoRef,\n });\n }\n }, [isVideoPlayable, type]);\n\n return (\n <>\n <video\n ref={videoRef}\n muted\n playsInline\n autoPlay\n style={{\n objectFit: fit,\n display: isVideoPlayable && !showPipFallback ? 'block' : 'none',\n transform: mirror ? 'scaleX(-1)' : 'none',\n ...style,\n }}\n {...videoProps}\n />\n {!isVideoPlayable && <Fallback style={style} />}\n {showPipFallback && pipFallback}\n </>\n );\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","forwardRef","useEffect","useImperativeHandle","useState","invariant","useAtomValue","state","useAttachVideo","useEmitConversationEvent","usePictureInPictureAuto","pipActiveAtom","useStartupAttempt","observeVideoFrame","Video","props","ref","type","_props$startupRenderS","startupRenderSurface","_props$fallback","fallback","Fallback","_props$fit","fit","_props$automirror","automirror","_props$pip","pip","onPiPEnter","onPiPExit","onPiPError","pipFallback","style","videoProps","_objectWithoutPropertiesLoose","_excluded","_useState","mirror","setMirror","conversation","emitEvent","startupAttempt","_useAttachVideo","videoRef","isVideoPlayable","element","current","onEnter","onExit","onError","isPiPActive","showPipFallback","mark","undefined","createElement","Fragment","_extends","muted","playsInline","autoPlay","objectFit","display","transform"],"sources":["../../../../src/components/Video/Video.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport invariant from 'invariant';\nimport { useAtomValue } from 'jotai';\nimport { state } from '../../conversation';\nimport { useAttachVideo } from './useAttachVideo';\nimport { useEmitConversationEvent } from '../../hooks/useConversationEvents/useEmitConversationEvent';\nimport {\n usePictureInPictureAuto,\n pipActiveAtom,\n} from '../../hooks/usePictureInPicture';\nimport { type VideoProps } from './types';\nimport { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';\nimport { observeVideoFrame } from '../../startup-telemetry/frame';\n\nexport const Video = forwardRef<HTMLVideoElement, VideoProps>((props, ref) => {\n const {\n type,\n startupRenderSurface = 'video',\n fallback: Fallback = () => null,\n fit = 'cover',\n automirror = true,\n pip = false,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n pipFallback,\n style,\n ...videoProps\n } = props;\n\n const [mirror, setMirror] = useState(props.mirror);\n\n const conversation = useAtomValue(state.conversation);\n const emitEvent = useEmitConversationEvent();\n const startupAttempt = useStartupAttempt();\n\n invariant(conversation, 'Conversation is not initialized');\n invariant(\n type === 'screen' ? true : conversation.type === 'video',\n 'Conversation type is not video',\n );\n\n const { videoRef, isVideoPlayable } = useAttachVideo({ type });\n\n usePictureInPictureAuto({\n element: pip && isVideoPlayable ? videoRef.current : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const isPiPActive = useAtomValue(pipActiveAtom);\n\n useImperativeHandle(ref, () => videoRef.current!);\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n setMirror(props.mirror ?? (automirror && type === 'user'));\n }, [automirror, type, props.mirror]);\n\n useEffect(() => {\n if (isVideoPlayable && type === 'agent') {\n emitEvent('agentVideoLoaded', {\n videoRef,\n });\n }\n }, [isVideoPlayable, type]);\n\n useEffect(() => {\n if (\n !startupAttempt ||\n type !== 'agent' ||\n !isVideoPlayable ||\n !videoRef.current\n ) {\n return;\n }\n startupAttempt.mark('track_subscribed');\n if (startupRenderSurface === 'video') {\n return observeVideoFrame(startupAttempt, videoRef.current);\n }\n return undefined;\n }, [startupAttempt, type, isVideoPlayable, startupRenderSurface, videoRef]);\n\n return (\n <>\n <video\n ref={videoRef}\n muted\n playsInline\n autoPlay\n style={{\n objectFit: fit,\n display: isVideoPlayable && !showPipFallback ? 'block' : 'none',\n transform: mirror ? 'scaleX(-1)' : 'none',\n ...style,\n }}\n {...videoProps}\n />\n {!isVideoPlayable && <Fallback style={style} />}\n {showPipFallback && pipFallback}\n </>\n );\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../../src/components/Video/types.ts"],"sourcesContent":["import React from 'react';\n\nexport type FallbackProps = {\n style?: React.CSSProperties;\n};\n\nexport type VideoProps = {\n mirror?: boolean;\n automirror?: boolean;\n type: 'user' | 'agent' | 'screen';\n fit?: 'contain' | 'cover';\n fallback?: React.ComponentType<FallbackProps>;\n /** Enable Picture-in-Picture mode */\n pip?: boolean;\n /** Callback when entering PiP */\n onPiPEnter?: () => void;\n /** Callback when exiting PiP */\n onPiPExit?: () => void;\n /** Callback when PiP error occurs */\n onPiPError?: (error: Error) => void;\n /** Content to render when PiP is active */\n pipFallback?: React.ReactNode;\n} & Omit<React.VideoHTMLAttributes<HTMLVideoElement>, 'onResize'>;\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../../src/components/Video/types.ts"],"sourcesContent":["import React from 'react';\n\nexport type FallbackProps = {\n style?: React.CSSProperties;\n};\n\nexport type VideoProps = {\n /** Internal: canvas wrappers own the final presentation milestone. */\n startupRenderSurface?: 'video' | 'canvas';\n mirror?: boolean;\n automirror?: boolean;\n type: 'user' | 'agent' | 'screen';\n fit?: 'contain' | 'cover';\n fallback?: React.ComponentType<FallbackProps>;\n /** Enable Picture-in-Picture mode */\n pip?: boolean;\n /** Callback when entering PiP */\n onPiPEnter?: () => void;\n /** Callback when exiting PiP */\n onPiPExit?: () => void;\n /** Callback when PiP error occurs */\n onPiPError?: (error: Error) => void;\n /** Content to render when PiP is active */\n pipFallback?: React.ReactNode;\n} & Omit<React.VideoHTMLAttributes<HTMLVideoElement>, 'onResize'>;\n"],"mappings":"","ignoreList":[]}
@@ -1,9 +1,16 @@
1
+ import { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';
2
+ import { recordCanvasFrame } from '../../startup-telemetry/frame';
1
3
  import React, { useEffect, useRef } from 'react';
2
4
  import { transparentBackground, render } from './effects';
3
5
  import invariant from 'invariant';
4
6
  export function VideoPostProcessor(_ref) {
5
7
  let effects = _ref.effects,
6
8
  children = _ref.children;
9
+ const startupAttempt = useStartupAttempt();
10
+ const visibleAttempt = children.props.type === 'agent' ? startupAttempt : undefined;
11
+ const effectsKey = effects.join(',');
12
+ const effectsRef = useRef(effects);
13
+ effectsRef.current = effects;
7
14
  const $video = useRef(null);
8
15
  const $canvas = useRef(null);
9
16
  useEffect(() => {
@@ -22,22 +29,24 @@ export function VideoPostProcessor(_ref) {
22
29
  invariant($video.current, 'Video is not initialized');
23
30
  invariant($canvas.current, 'Canvas is not initialized');
24
31
  render($video.current, $canvas.current);
25
- for (const effect of effects) {
32
+ for (const effect of effectsRef.current) {
26
33
  switch (effect) {
27
34
  case 'transparent-background':
28
35
  transparentBackground($canvas.current);
29
36
  break;
30
37
  }
31
38
  }
39
+ recordCanvasFrame(visibleAttempt, $canvas.current, $video.current);
32
40
  id = requestAnimationFrame(process);
33
41
  }
34
- }, [effects.join(',')]);
42
+ }, [effectsKey, visibleAttempt]);
35
43
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("canvas", {
36
44
  ref: $canvas,
37
45
  style: children.props.style,
38
46
  className: children.props.className
39
47
  }), /*#__PURE__*/React.cloneElement(children, {
40
48
  ...children.props,
49
+ startupRenderSurface: 'canvas',
41
50
  ref: $video,
42
51
  style: {
43
52
  display: 'none'
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useRef","transparentBackground","render","invariant","VideoPostProcessor","_ref","effects","children","$video","$canvas","id","requestAnimationFrame","init","cancelAnimationFrame","current","videoWidth","videoHeight","process","effect","join","createElement","Fragment","ref","style","props","className","cloneElement","display"],"sources":["../../../../src/components/VideoPostProcessor/VideoPostProcessor.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nimport { transparentBackground, render } from './effects';\nimport invariant from 'invariant';\n\ntype VideoPostProcessorEffect = 'transparent-background';\n\ninterface VideoPostProcessorProps {\n effects: VideoPostProcessorEffect[];\n\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref: React.RefObject<HTMLVideoElement>;\n }\n >;\n}\n\nexport function VideoPostProcessor({\n effects,\n children,\n}: VideoPostProcessorProps) {\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n let id = requestAnimationFrame(init);\n\n return () => {\n cancelAnimationFrame(id);\n };\n\n function init() {\n if (\n !$video.current ||\n !$canvas.current ||\n !$video.current.videoWidth ||\n !$video.current.videoHeight\n ) {\n id = requestAnimationFrame(init);\n return;\n }\n\n id = requestAnimationFrame(process);\n }\n\n function process() {\n invariant($video.current, 'Video is not initialized');\n invariant($canvas.current, 'Canvas is not initialized');\n\n render($video.current, $canvas.current);\n\n for (const effect of effects) {\n switch (effect) {\n case 'transparent-background':\n transparentBackground($canvas.current);\n break;\n }\n }\n\n id = requestAnimationFrame(process);\n }\n }, [effects.join(',')]);\n\n return (\n <>\n <canvas\n ref={$canvas}\n style={children.props.style}\n className={children.props.className}\n />\n\n {React.cloneElement(children, {\n ...children.props,\n ref: $video,\n style: { display: 'none' },\n })}\n </>\n );\n}\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEhD,SAASC,qBAAqB,EAAEC,MAAM,QAAQ,WAAW;AACzD,OAAOC,SAAS,MAAM,WAAW;AAcjC,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAGN;EAAA,IAF1BC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;EAER,MAAMC,MAAM,GAAGR,MAAM,CAAmB,IAAI,CAAC;EAC7C,MAAMS,OAAO,GAAGT,MAAM,CAAoB,IAAI,CAAC;EAE/CD,SAAS,CAAC,MAAM;IACd,IAAIW,EAAE,GAAGC,qBAAqB,CAACC,IAAI,CAAC;IAEpC,OAAO,MAAM;MACXC,oBAAoB,CAACH,EAAE,CAAC;IAC1B,CAAC;IAED,SAASE,IAAIA,CAAA,EAAG;MACd,IACE,CAACJ,MAAM,CAACM,OAAO,IACf,CAACL,OAAO,CAACK,OAAO,IAChB,CAACN,MAAM,CAACM,OAAO,CAACC,UAAU,IAC1B,CAACP,MAAM,CAACM,OAAO,CAACE,WAAW,EAC3B;QACAN,EAAE,GAAGC,qBAAqB,CAACC,IAAI,CAAC;QAChC;MACF;MAEAF,EAAE,GAAGC,qBAAqB,CAACM,OAAO,CAAC;IACrC;IAEA,SAASA,OAAOA,CAAA,EAAG;MACjBd,SAAS,CAACK,MAAM,CAACM,OAAO,EAAE,0BAA0B,CAAC;MACrDX,SAAS,CAACM,OAAO,CAACK,OAAO,EAAE,2BAA2B,CAAC;MAEvDZ,MAAM,CAACM,MAAM,CAACM,OAAO,EAAEL,OAAO,CAACK,OAAO,CAAC;MAEvC,KAAK,MAAMI,MAAM,IAAIZ,OAAO,EAAE;QAC5B,QAAQY,MAAM;UACZ,KAAK,wBAAwB;YAC3BjB,qBAAqB,CAACQ,OAAO,CAACK,OAAO,CAAC;YACtC;QACJ;MACF;MAEAJ,EAAE,GAAGC,qBAAqB,CAACM,OAAO,CAAC;IACrC;EACF,CAAC,EAAE,CAACX,OAAO,CAACa,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;EAEvB,oBACErB,KAAA,CAAAsB,aAAA,CAAAtB,KAAA,CAAAuB,QAAA,qBACEvB,KAAA,CAAAsB,aAAA;IACEE,GAAG,EAAEb,OAAQ;IACbc,KAAK,EAAEhB,QAAQ,CAACiB,KAAK,CAACD,KAAM;IAC5BE,SAAS,EAAElB,QAAQ,CAACiB,KAAK,CAACC;EAAU,CACrC,CAAC,eAED3B,KAAK,CAAC4B,YAAY,CAACnB,QAAQ,EAAE;IAC5B,GAAGA,QAAQ,CAACiB,KAAK;IACjBF,GAAG,EAAEd,MAAM;IACXe,KAAK,EAAE;MAAEI,OAAO,EAAE;IAAO;EAC3B,CAAC,CACD,CAAC;AAEP","ignoreList":[]}
1
+ {"version":3,"names":["useStartupAttempt","recordCanvasFrame","React","useEffect","useRef","transparentBackground","render","invariant","VideoPostProcessor","_ref","effects","children","startupAttempt","visibleAttempt","props","type","undefined","effectsKey","join","effectsRef","current","$video","$canvas","id","requestAnimationFrame","init","cancelAnimationFrame","videoWidth","videoHeight","process","effect","createElement","Fragment","ref","style","className","cloneElement","startupRenderSurface","display"],"sources":["../../../../src/components/VideoPostProcessor/VideoPostProcessor.tsx"],"sourcesContent":["import { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';\nimport { recordCanvasFrame } from '../../startup-telemetry/frame';\nimport React, { useEffect, useRef } from 'react';\n\nimport { transparentBackground, render } from './effects';\nimport invariant from 'invariant';\n\ntype VideoPostProcessorEffect = 'transparent-background';\n\ninterface VideoPostProcessorProps {\n effects: VideoPostProcessorEffect[];\n\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref: React.RefObject<HTMLVideoElement>;\n startupRenderSurface?: 'video' | 'canvas';\n type?: 'agent' | 'user' | 'screen';\n }\n >;\n}\n\nexport function VideoPostProcessor({\n effects,\n children,\n}: VideoPostProcessorProps) {\n const startupAttempt = useStartupAttempt();\n const visibleAttempt =\n children.props.type === 'agent' ? startupAttempt : undefined;\n const effectsKey = effects.join(',');\n const effectsRef = useRef(effects);\n effectsRef.current = effects;\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n let id = requestAnimationFrame(init);\n\n return () => {\n cancelAnimationFrame(id);\n };\n\n function init() {\n if (\n !$video.current ||\n !$canvas.current ||\n !$video.current.videoWidth ||\n !$video.current.videoHeight\n ) {\n id = requestAnimationFrame(init);\n return;\n }\n\n id = requestAnimationFrame(process);\n }\n\n function process() {\n invariant($video.current, 'Video is not initialized');\n invariant($canvas.current, 'Canvas is not initialized');\n\n render($video.current, $canvas.current);\n\n for (const effect of effectsRef.current) {\n switch (effect) {\n case 'transparent-background':\n transparentBackground($canvas.current);\n break;\n }\n }\n\n recordCanvasFrame(visibleAttempt, $canvas.current, $video.current);\n id = requestAnimationFrame(process);\n }\n }, [effectsKey, visibleAttempt]);\n\n return (\n <>\n <canvas\n ref={$canvas}\n style={children.props.style}\n className={children.props.className}\n />\n\n {React.cloneElement(children, {\n ...children.props,\n startupRenderSurface: 'canvas',\n ref: $video,\n style: { display: 'none' },\n })}\n </>\n );\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,2CAA2C;AAC7E,SAASC,iBAAiB,QAAQ,+BAA+B;AACjE,OAAOC,KAAK,IAAIC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEhD,SAASC,qBAAqB,EAAEC,MAAM,QAAQ,WAAW;AACzD,OAAOC,SAAS,MAAM,WAAW;AAgBjC,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAGN;EAAA,IAF1BC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;EAER,MAAMC,cAAc,GAAGZ,iBAAiB,CAAC,CAAC;EAC1C,MAAMa,cAAc,GAClBF,QAAQ,CAACG,KAAK,CAACC,IAAI,KAAK,OAAO,GAAGH,cAAc,GAAGI,SAAS;EAC9D,MAAMC,UAAU,GAAGP,OAAO,CAACQ,IAAI,CAAC,GAAG,CAAC;EACpC,MAAMC,UAAU,GAAGf,MAAM,CAACM,OAAO,CAAC;EAClCS,UAAU,CAACC,OAAO,GAAGV,OAAO;EAC5B,MAAMW,MAAM,GAAGjB,MAAM,CAAmB,IAAI,CAAC;EAC7C,MAAMkB,OAAO,GAAGlB,MAAM,CAAoB,IAAI,CAAC;EAE/CD,SAAS,CAAC,MAAM;IACd,IAAIoB,EAAE,GAAGC,qBAAqB,CAACC,IAAI,CAAC;IAEpC,OAAO,MAAM;MACXC,oBAAoB,CAACH,EAAE,CAAC;IAC1B,CAAC;IAED,SAASE,IAAIA,CAAA,EAAG;MACd,IACE,CAACJ,MAAM,CAACD,OAAO,IACf,CAACE,OAAO,CAACF,OAAO,IAChB,CAACC,MAAM,CAACD,OAAO,CAACO,UAAU,IAC1B,CAACN,MAAM,CAACD,OAAO,CAACQ,WAAW,EAC3B;QACAL,EAAE,GAAGC,qBAAqB,CAACC,IAAI,CAAC;QAChC;MACF;MAEAF,EAAE,GAAGC,qBAAqB,CAACK,OAAO,CAAC;IACrC;IAEA,SAASA,OAAOA,CAAA,EAAG;MACjBtB,SAAS,CAACc,MAAM,CAACD,OAAO,EAAE,0BAA0B,CAAC;MACrDb,SAAS,CAACe,OAAO,CAACF,OAAO,EAAE,2BAA2B,CAAC;MAEvDd,MAAM,CAACe,MAAM,CAACD,OAAO,EAAEE,OAAO,CAACF,OAAO,CAAC;MAEvC,KAAK,MAAMU,MAAM,IAAIX,UAAU,CAACC,OAAO,EAAE;QACvC,QAAQU,MAAM;UACZ,KAAK,wBAAwB;YAC3BzB,qBAAqB,CAACiB,OAAO,CAACF,OAAO,CAAC;YACtC;QACJ;MACF;MAEAnB,iBAAiB,CAACY,cAAc,EAAES,OAAO,CAACF,OAAO,EAAEC,MAAM,CAACD,OAAO,CAAC;MAClEG,EAAE,GAAGC,qBAAqB,CAACK,OAAO,CAAC;IACrC;EACF,CAAC,EAAE,CAACZ,UAAU,EAAEJ,cAAc,CAAC,CAAC;EAEhC,oBACEX,KAAA,CAAA6B,aAAA,CAAA7B,KAAA,CAAA8B,QAAA,qBACE9B,KAAA,CAAA6B,aAAA;IACEE,GAAG,EAAEX,OAAQ;IACbY,KAAK,EAAEvB,QAAQ,CAACG,KAAK,CAACoB,KAAM;IAC5BC,SAAS,EAAExB,QAAQ,CAACG,KAAK,CAACqB;EAAU,CACrC,CAAC,eAEDjC,KAAK,CAACkC,YAAY,CAACzB,QAAQ,EAAE;IAC5B,GAAGA,QAAQ,CAACG,KAAK;IACjBuB,oBAAoB,EAAE,QAAQ;IAC9BJ,GAAG,EAAEZ,MAAM;IACXa,KAAK,EAAE;MAAEI,OAAO,EAAE;IAAO;EAC3B,CAAC,CACD,CAAC;AAEP","ignoreList":[]}
@@ -46,9 +46,11 @@ export function useConversation(_ref) {
46
46
  setCamera = _useAtom2[1];
47
47
  const _useSdkConsumer = useSdkConsumer(),
48
48
  _useSdkConsumer$tools = _useSdkConsumer.tools,
49
- toolsRegistry = _useSdkConsumer$tools === void 0 ? {} : _useSdkConsumer$tools;
49
+ toolsRegistry = _useSdkConsumer$tools === void 0 ? {} : _useSdkConsumer$tools,
50
+ startupTelemetrySession = _useSdkConsumer.startupTelemetrySession;
50
51
  const toolRuntime = useToolCallingRuntime();
51
52
  const toolsRegistryRef = useLatest(toolsRegistry);
53
+ const startupSessionRef = useLatest(startupTelemetrySession);
52
54
 
53
55
  // for use in register/unregister room events
54
56
  const conversationRef = useLatest(conversation.data);
@@ -162,8 +164,11 @@ export function useConversation(_ref) {
162
164
  const url = new URL((conversation == null || (_conversation$data3 = conversation.data) == null ? void 0 : _conversation$data3.url) || '');
163
165
  const accessToken = url.searchParams.get('token');
164
166
  try {
167
+ var _startupTelemetrySess, _startupTelemetrySess2;
168
+ startupTelemetrySession == null || (_startupTelemetrySess = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess.mark('join_requested');
165
169
  setUserConnectionState('joining');
166
170
  await (room == null ? void 0 : room.connect(conversation.data.url, accessToken, {}));
171
+ startupTelemetrySession == null || (_startupTelemetrySess2 = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess2.mark('room_connected');
167
172
 
168
173
  // sometimes the agent is already joined before the user joins the conversation
169
174
  const remoteParticipant = findJoinedAgentParticipant(room, type);
@@ -172,6 +177,8 @@ export function useConversation(_ref) {
172
177
  }
173
178
  enableMediaDevices();
174
179
  } catch (error) {
180
+ var _startupTelemetrySess3;
181
+ startupTelemetrySession == null || (_startupTelemetrySess3 = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess3.finish('error', 'join_failed');
175
182
  console.error('Failed to join', error);
176
183
  setUserConnectionState('join-error');
177
184
  }
@@ -405,6 +412,8 @@ export function useConversation(_ref) {
405
412
  setConversationStatus('error');
406
413
  }
407
414
  function handleDisconnectedEvent(reason) {
415
+ var _startupSessionRef$cu, _conversationRef$curr0;
416
+ (_startupSessionRef$cu = startupSessionRef.current) == null || (_startupSessionRef$cu = _startupSessionRef$cu.get((_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id)) == null || _startupSessionRef$cu.finish(reason === DisconnectReason.CLIENT_INITIATED ? 'cancelled' : 'error', 'disconnected_before_frame');
408
417
  isConnectedRef.current = false;
409
418
  acousticPhaseRef.current = 'idle';
410
419
  acousticT0Ref.current = null;
@@ -453,18 +462,19 @@ export function useConversation(_ref) {
453
462
  }
454
463
  }
455
464
  function handleAgentJoin(participant) {
456
- var _conversationRef$curr0;
465
+ var _startupSessionRef$cu2, _conversationRef$curr1, _conversationRef$curr10;
466
+ (_startupSessionRef$cu2 = startupSessionRef.current) == null || (_startupSessionRef$cu2 = _startupSessionRef$cu2.get((_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id)) == null || _startupSessionRef$cu2.mark('agent_joined');
457
467
  setAgentConnectionState('joined');
458
468
  emitEvent('agentJoined', {
459
- conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id,
469
+ conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
460
470
  participant
461
471
  });
462
472
  }
463
473
  function handleParticipantDisconnectedEvent(participant) {
464
- var _conversationRef$curr1;
474
+ var _conversationRef$curr11;
465
475
  setAgentConnectionState('left');
466
476
  emitEvent('agentLeft', {
467
- conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id,
477
+ conversationId: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.id,
468
478
  participant
469
479
  });
470
480
  }
@@ -473,13 +483,13 @@ export function useConversation(_ref) {
473
483
  return;
474
484
  }
475
485
  try {
476
- var _conversationRef$curr10;
486
+ var _conversationRef$curr12;
477
487
  setUserConnectionState('leaving');
478
488
  await (room == null ? void 0 : room.disconnect(true));
479
489
  setConversationStatus('destroyed');
480
490
  setJoinedAt(undefined);
481
491
  emitEvent('callEnded', {
482
- conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id
492
+ conversationId: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.id
483
493
  });
484
494
  } catch (error) {
485
495
  console.error('Failed to leave', error);
@@ -487,22 +497,22 @@ export function useConversation(_ref) {
487
497
  }
488
498
  }
489
499
  async function handleExpire() {
490
- var _conversationRef$curr11, _conversationRef$curr12;
500
+ var _conversationRef$curr13, _conversationRef$curr14;
491
501
  // The duration timer keeps running after the call ends.
492
502
  if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached' || conversationStatus === 'plan-minutes-exhausted') {
493
503
  return;
494
504
  }
495
505
  emitEvent('timeExceeded', {
496
- conversationId: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.id,
497
- limit: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.limit
506
+ conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id,
507
+ limit: (_conversationRef$curr14 = conversationRef.current) == null ? void 0 : _conversationRef$curr14.limit
498
508
  });
499
509
  await leave();
500
510
  setConversationStatus('exceeded');
501
511
  }
502
512
  async function interrupt() {
503
- var _conversationRef$curr13;
513
+ var _conversationRef$curr15;
504
514
  emitEvent('interrupt', {
505
- conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id
515
+ conversationId: (_conversationRef$curr15 = conversationRef.current) == null ? void 0 : _conversationRef$curr15.id
506
516
  });
507
517
  await publishConversationDataMessage(room, {}, 'interrupt');
508
518
  }
@@ -512,7 +522,7 @@ export function useConversation(_ref) {
512
522
  }, 'inactivity_dismiss');
513
523
  }
514
524
  async function send(message, attachments) {
515
- var _conversationRef$curr14;
525
+ var _conversationRef$curr16;
516
526
  if (attachments === void 0) {
517
527
  attachments = [];
518
528
  }
@@ -523,7 +533,7 @@ export function useConversation(_ref) {
523
533
  }
524
534
  }));
525
535
  emitEvent('userSendMessage', {
526
- conversationId: (_conversationRef$curr14 = conversationRef.current) == null ? void 0 : _conversationRef$curr14.id,
536
+ conversationId: (_conversationRef$curr16 = conversationRef.current) == null ? void 0 : _conversationRef$curr16.id,
527
537
  message
528
538
  });
529
539
  }
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useSdkConsumer","useCreateConversation","useSpeechActivityDetector","useParticipantTrack","Source","getTrackStats","parseTrackStats","useEmitConversationEvent","useToolCallingRuntime","extractToolErrorMessage","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage","checkIsPlanMinutesExhaustedMessage","buildToolDefinitions","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","parseFunctionCallPayload","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","EXECUTE_TOOL_RPC_METHOD","GET_TOOLS_RPC_METHOD","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","firstConversation","lastConversationTopic","conversationLanguage","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","_useSdkConsumer","_useSdkConsumer$tools","tools","toolsRegistry","toolRuntime","toolsRegistryRef","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","inactivityTimeoutRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","source","Microphone","agentMicPublication","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","_await$Promise$all","Promise","all","userReport","agentReport","userStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","handleExecuteToolRpc","call","payload","functionCallId","result","_await$toolRuntimeRef","executeToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","_participant","_kind","topic","decoded","_conversationRef$curr6","_conversationRef$curr7","_conversationRef$curr8","_ref2","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr0","handleParticipantDisconnectedEvent","_conversationRef$curr1","leave","_conversationRef$curr10","disconnect","_conversationRef$curr11","_conversationRef$curr12","interrupt","_conversationRef$curr13","dismissInactivity","send","attachments","_conversationRef$curr14","sendText","attributes","on","unregisterRpcMethod","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n checkIsPlanMinutesExhaustedMessage,\n buildToolDefinitions,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n parseFunctionCallPayload,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\nimport {\n ACOUSTIC_AGENT_HANGOVER_MS,\n ACOUSTIC_USER_HANGOVER_MS,\n ACOUSTIC_USER_THRESHOLD_RMS,\n EXECUTE_TOOL_RPC_METHOD,\n GET_TOOLS_RPC_METHOD,\n} from './constants';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({\n type,\n config,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const { tools: toolsRegistry = {} } = useSdkConsumer();\n const toolRuntime = useToolCallingRuntime();\n const toolsRegistryRef = useLatest(toolsRegistry);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const inactivityTimeoutRef = useRef(false);\n const creditExhaustedRef = useRef(false);\n const conversationLimitReachedRef = useRef(false);\n const planMinutesExhaustedRef = useRef(false);\n const acousticPhaseRef = useRef<'idle' | 'waitingForAgent' | 'busy'>('idle');\n const acousticT0Ref = useRef<number | null>(null);\n const latestTurnMetadataRef = useRef<{\n turnDetectionStrategy?: string;\n sequence?: number;\n speechId?: string;\n }>({});\n const isConnectedRef = useRef(false);\n const userCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n const agentCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n\n const userMicPublication = useParticipantTrack({\n type: 'user',\n source: Source.Microphone,\n });\n const agentMicPublication = useParticipantTrack({\n type: 'agent',\n source: Source.Microphone,\n });\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n latestTurnMetadataRef.current = {\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (data.speechId) {\n latestTurnMetadataRef.current = {\n ...latestTurnMetadataRef.current,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleAcousticUserOnset() {\n if (!isConnectedRef.current) {\n return;\n }\n if (acousticPhaseRef.current === 'waitingForAgent') {\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n }\n }\n\n function handleAcousticUserOffset(timestampMs: number) {\n if (!isConnectedRef.current || acousticPhaseRef.current !== 'idle') {\n return;\n }\n acousticT0Ref.current = timestampMs - ACOUSTIC_USER_HANGOVER_MS;\n acousticPhaseRef.current = 'waitingForAgent';\n }\n\n function handleAcousticAgentOnset(timestampMs: number) {\n if (\n !isConnectedRef.current ||\n acousticPhaseRef.current !== 'waitingForAgent' ||\n acousticT0Ref.current == null\n ) {\n return;\n }\n\n const latencyMs = timestampMs - acousticT0Ref.current;\n acousticT0Ref.current = null;\n acousticPhaseRef.current = 'busy';\n\n if (latencyMs < 0 || latencyMs > 15000) {\n return;\n }\n\n emitEvent('responseLatency', {\n conversationId: conversationRef.current?.id!,\n latencyMs,\n turnDetectionStrategy:\n latestTurnMetadataRef.current.turnDetectionStrategy!,\n sequence: latestTurnMetadataRef.current.sequence,\n speechId: latestTurnMetadataRef.current.speechId,\n });\n\n void emitConversationTurnLatency(latencyMs);\n }\n\n async function emitConversationTurnLatency(clientAcousticLatencyMs: number) {\n const [userReport, agentReport] = await Promise.all([\n getTrackStats(userMicPublication),\n getTrackStats(agentMicPublication),\n ]);\n const userStats = parseTrackStats(\n userReport,\n userCumulativeTrackStatsRef.current,\n );\n const agentStats = parseTrackStats(\n agentReport,\n agentCumulativeTrackStatsRef.current,\n );\n userCumulativeTrackStatsRef.current = userStats.cumulativeTrackStats;\n agentCumulativeTrackStatsRef.current = agentStats.cumulativeTrackStats;\n\n emitEvent('conversationTurnLatency', {\n conversationId: conversationRef.current?.id!,\n speechId: latestTurnMetadataRef.current.speechId,\n sequence: latestTurnMetadataRef.current.sequence,\n clientAcousticLatencyMs,\n rttMs: userStats.roundTripTimeMs,\n jitterBufferDelayMs: agentStats.jitterBufferDelayMs,\n userPacketsLost: userStats.packetsLost,\n agentPacketsLost: agentStats.packetsLost,\n });\n }\n\n function handleAcousticAgentOffset() {\n acousticPhaseRef.current = 'idle';\n }\n\n useSpeechActivityDetector({\n source: 'user',\n onSpeechStart: handleAcousticUserOnset,\n onSpeechEnd: handleAcousticUserOffset,\n thresholdRms: ACOUSTIC_USER_THRESHOLD_RMS,\n hangoverMs: ACOUSTIC_USER_HANGOVER_MS,\n });\n useSpeechActivityDetector({\n source: 'agent',\n onSpeechStart: handleAcousticAgentOnset,\n onSpeechEnd: handleAcousticAgentOffset,\n hangoverMs: ACOUSTIC_AGENT_HANGOVER_MS,\n });\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n function handleInactivityTimeoutEvent(_data: InactivityTimeoutData) {\n inactivityTimeoutRef.current = true;\n emitEvent('inactivityTimeout', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleGetToolsRpc() {\n return JSON.stringify(buildToolDefinitions(toolsRegistryRef.current));\n }\n\n async function handleExecuteToolRpc(data: RpcInvocationData) {\n const call = parseFunctionCallPayload(data.payload);\n if (!call) {\n return JSON.stringify({\n functionCallId: '',\n result: '',\n error: 'Malformed function call payload.',\n } satisfies FunctionCallResult);\n }\n try {\n const [result] = await toolRuntimeRef.current.executeToolCalls([call]);\n return JSON.stringify(result);\n } catch (error) {\n return JSON.stringify({\n functionCallId: call.functionCallId,\n result: '',\n error: extractToolErrorMessage(error),\n } satisfies FunctionCallResult);\n }\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityTimeoutData,\n handle: handleInactivityTimeoutEvent as (data: unknown) => void,\n },\n ];\n\n function handleDataReceivedEvent(\n payload: Uint8Array,\n _participant?: RemoteParticipant,\n _kind?: unknown,\n topic?: string,\n ) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n if (checkIsCreditExhaustedMessage(decoded, topic)) {\n creditExhaustedRef.current = true;\n emitEvent('creditExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsConversationLimitReachedMessage(decoded, topic)) {\n conversationLimitReachedRef.current = true;\n emitEvent('conversationLimitReached', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsPlanMinutesExhaustedMessage(decoded, topic)) {\n planMinutesExhaustedRef.current = true;\n emitEvent('planMinutesExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n isConnectedRef.current = true;\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n isConnectedRef.current = false;\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n latestTurnMetadataRef.current = {};\n userCumulativeTrackStatsRef.current = undefined;\n agentCumulativeTrackStatsRef.current = undefined;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n if (inactivityTimeoutRef.current) {\n inactivityTimeoutRef.current = false;\n setConversationStatus('inactivity-timeout');\n return;\n }\n\n if (creditExhaustedRef.current) {\n creditExhaustedRef.current = false;\n setConversationStatus('credit-exhausted');\n return;\n }\n\n if (conversationLimitReachedRef.current) {\n conversationLimitReachedRef.current = false;\n setConversationStatus('conversation-limit-reached');\n return;\n }\n\n if (planMinutesExhaustedRef.current) {\n planMinutesExhaustedRef.current = false;\n setConversationStatus('plan-minutes-exhausted');\n return;\n }\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n // The duration timer keeps running after the call ends.\n if (\n conversationStatus === 'credit-exhausted' ||\n conversationStatus === 'conversation-limit-reached' ||\n conversationStatus === 'plan-minutes-exhausted'\n ) {\n return;\n }\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.registerRpcMethod(GET_TOOLS_RPC_METHOD, handleGetToolsRpc);\n room.registerRpcMethod(EXECUTE_TOOL_RPC_METHOD, handleExecuteToolRpc);\n }\n\n function unregisterRoomEvents() {\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useSdkConsumer","useCreateConversation","useSpeechActivityDetector","useParticipantTrack","Source","getTrackStats","parseTrackStats","useEmitConversationEvent","useToolCallingRuntime","extractToolErrorMessage","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage","checkIsPlanMinutesExhaustedMessage","buildToolDefinitions","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","parseFunctionCallPayload","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","EXECUTE_TOOL_RPC_METHOD","GET_TOOLS_RPC_METHOD","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","firstConversation","lastConversationTopic","conversationLanguage","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","_useSdkConsumer","_useSdkConsumer$tools","tools","toolsRegistry","startupTelemetrySession","toolRuntime","toolsRegistryRef","startupSessionRef","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","inactivityTimeoutRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","source","Microphone","agentMicPublication","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","_startupTelemetrySess","_startupTelemetrySess2","id","mark","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","_startupTelemetrySess3","finish","console","handleTranscriptionReceivedEvent","segments","participant","map","s","message","text","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","_await$Promise$all","Promise","all","userReport","agentReport","userStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","handleExecuteToolRpc","call","payload","functionCallId","result","_await$toolRuntimeRef","executeToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","_participant","_kind","topic","decoded","_conversationRef$curr6","_conversationRef$curr7","_conversationRef$curr8","_ref2","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","_startupSessionRef$cu","_conversationRef$curr0","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_startupSessionRef$cu2","_conversationRef$curr1","_conversationRef$curr10","handleParticipantDisconnectedEvent","_conversationRef$curr11","leave","_conversationRef$curr12","disconnect","_conversationRef$curr13","_conversationRef$curr14","interrupt","_conversationRef$curr15","dismissInactivity","send","attachments","_conversationRef$curr16","sendText","attributes","on","unregisterRpcMethod","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n checkIsPlanMinutesExhaustedMessage,\n buildToolDefinitions,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n parseFunctionCallPayload,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\nimport {\n ACOUSTIC_AGENT_HANGOVER_MS,\n ACOUSTIC_USER_HANGOVER_MS,\n ACOUSTIC_USER_THRESHOLD_RMS,\n EXECUTE_TOOL_RPC_METHOD,\n GET_TOOLS_RPC_METHOD,\n} from './constants';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({\n type,\n config,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const { tools: toolsRegistry = {}, startupTelemetrySession } =\n useSdkConsumer();\n const toolRuntime = useToolCallingRuntime();\n const toolsRegistryRef = useLatest(toolsRegistry);\n const startupSessionRef = useLatest(startupTelemetrySession);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const inactivityTimeoutRef = useRef(false);\n const creditExhaustedRef = useRef(false);\n const conversationLimitReachedRef = useRef(false);\n const planMinutesExhaustedRef = useRef(false);\n const acousticPhaseRef = useRef<'idle' | 'waitingForAgent' | 'busy'>('idle');\n const acousticT0Ref = useRef<number | null>(null);\n const latestTurnMetadataRef = useRef<{\n turnDetectionStrategy?: string;\n sequence?: number;\n speechId?: string;\n }>({});\n const isConnectedRef = useRef(false);\n const userCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n const agentCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n\n const userMicPublication = useParticipantTrack({\n type: 'user',\n source: Source.Microphone,\n });\n const agentMicPublication = useParticipantTrack({\n type: 'agent',\n source: Source.Microphone,\n });\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n startupTelemetrySession\n ?.get(conversation.data.id)\n ?.mark('join_requested');\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n startupTelemetrySession\n ?.get(conversation.data.id)\n ?.mark('room_connected');\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n startupTelemetrySession\n ?.get(conversation.data.id)\n ?.finish('error', 'join_failed');\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n latestTurnMetadataRef.current = {\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (data.speechId) {\n latestTurnMetadataRef.current = {\n ...latestTurnMetadataRef.current,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleAcousticUserOnset() {\n if (!isConnectedRef.current) {\n return;\n }\n if (acousticPhaseRef.current === 'waitingForAgent') {\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n }\n }\n\n function handleAcousticUserOffset(timestampMs: number) {\n if (!isConnectedRef.current || acousticPhaseRef.current !== 'idle') {\n return;\n }\n acousticT0Ref.current = timestampMs - ACOUSTIC_USER_HANGOVER_MS;\n acousticPhaseRef.current = 'waitingForAgent';\n }\n\n function handleAcousticAgentOnset(timestampMs: number) {\n if (\n !isConnectedRef.current ||\n acousticPhaseRef.current !== 'waitingForAgent' ||\n acousticT0Ref.current == null\n ) {\n return;\n }\n\n const latencyMs = timestampMs - acousticT0Ref.current;\n acousticT0Ref.current = null;\n acousticPhaseRef.current = 'busy';\n\n if (latencyMs < 0 || latencyMs > 15000) {\n return;\n }\n\n emitEvent('responseLatency', {\n conversationId: conversationRef.current?.id!,\n latencyMs,\n turnDetectionStrategy:\n latestTurnMetadataRef.current.turnDetectionStrategy!,\n sequence: latestTurnMetadataRef.current.sequence,\n speechId: latestTurnMetadataRef.current.speechId,\n });\n\n void emitConversationTurnLatency(latencyMs);\n }\n\n async function emitConversationTurnLatency(clientAcousticLatencyMs: number) {\n const [userReport, agentReport] = await Promise.all([\n getTrackStats(userMicPublication),\n getTrackStats(agentMicPublication),\n ]);\n const userStats = parseTrackStats(\n userReport,\n userCumulativeTrackStatsRef.current,\n );\n const agentStats = parseTrackStats(\n agentReport,\n agentCumulativeTrackStatsRef.current,\n );\n userCumulativeTrackStatsRef.current = userStats.cumulativeTrackStats;\n agentCumulativeTrackStatsRef.current = agentStats.cumulativeTrackStats;\n\n emitEvent('conversationTurnLatency', {\n conversationId: conversationRef.current?.id!,\n speechId: latestTurnMetadataRef.current.speechId,\n sequence: latestTurnMetadataRef.current.sequence,\n clientAcousticLatencyMs,\n rttMs: userStats.roundTripTimeMs,\n jitterBufferDelayMs: agentStats.jitterBufferDelayMs,\n userPacketsLost: userStats.packetsLost,\n agentPacketsLost: agentStats.packetsLost,\n });\n }\n\n function handleAcousticAgentOffset() {\n acousticPhaseRef.current = 'idle';\n }\n\n useSpeechActivityDetector({\n source: 'user',\n onSpeechStart: handleAcousticUserOnset,\n onSpeechEnd: handleAcousticUserOffset,\n thresholdRms: ACOUSTIC_USER_THRESHOLD_RMS,\n hangoverMs: ACOUSTIC_USER_HANGOVER_MS,\n });\n useSpeechActivityDetector({\n source: 'agent',\n onSpeechStart: handleAcousticAgentOnset,\n onSpeechEnd: handleAcousticAgentOffset,\n hangoverMs: ACOUSTIC_AGENT_HANGOVER_MS,\n });\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n function handleInactivityTimeoutEvent(_data: InactivityTimeoutData) {\n inactivityTimeoutRef.current = true;\n emitEvent('inactivityTimeout', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleGetToolsRpc() {\n return JSON.stringify(buildToolDefinitions(toolsRegistryRef.current));\n }\n\n async function handleExecuteToolRpc(data: RpcInvocationData) {\n const call = parseFunctionCallPayload(data.payload);\n if (!call) {\n return JSON.stringify({\n functionCallId: '',\n result: '',\n error: 'Malformed function call payload.',\n } satisfies FunctionCallResult);\n }\n try {\n const [result] = await toolRuntimeRef.current.executeToolCalls([call]);\n return JSON.stringify(result);\n } catch (error) {\n return JSON.stringify({\n functionCallId: call.functionCallId,\n result: '',\n error: extractToolErrorMessage(error),\n } satisfies FunctionCallResult);\n }\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityTimeoutData,\n handle: handleInactivityTimeoutEvent as (data: unknown) => void,\n },\n ];\n\n function handleDataReceivedEvent(\n payload: Uint8Array,\n _participant?: RemoteParticipant,\n _kind?: unknown,\n topic?: string,\n ) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n if (checkIsCreditExhaustedMessage(decoded, topic)) {\n creditExhaustedRef.current = true;\n emitEvent('creditExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsConversationLimitReachedMessage(decoded, topic)) {\n conversationLimitReachedRef.current = true;\n emitEvent('conversationLimitReached', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsPlanMinutesExhaustedMessage(decoded, topic)) {\n planMinutesExhaustedRef.current = true;\n emitEvent('planMinutesExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n isConnectedRef.current = true;\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n startupSessionRef.current\n ?.get(conversationRef.current?.id)\n ?.finish(\n reason === DisconnectReason.CLIENT_INITIATED ? 'cancelled' : 'error',\n 'disconnected_before_frame',\n );\n isConnectedRef.current = false;\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n latestTurnMetadataRef.current = {};\n userCumulativeTrackStatsRef.current = undefined;\n agentCumulativeTrackStatsRef.current = undefined;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n if (inactivityTimeoutRef.current) {\n inactivityTimeoutRef.current = false;\n setConversationStatus('inactivity-timeout');\n return;\n }\n\n if (creditExhaustedRef.current) {\n creditExhaustedRef.current = false;\n setConversationStatus('credit-exhausted');\n return;\n }\n\n if (conversationLimitReachedRef.current) {\n conversationLimitReachedRef.current = false;\n setConversationStatus('conversation-limit-reached');\n return;\n }\n\n if (planMinutesExhaustedRef.current) {\n planMinutesExhaustedRef.current = false;\n setConversationStatus('plan-minutes-exhausted');\n return;\n }\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n startupSessionRef.current\n ?.get(conversationRef.current?.id)\n ?.mark('agent_joined');\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n // The duration timer keeps running after the call ends.\n if (\n conversationStatus === 'credit-exhausted' ||\n conversationStatus === 'conversation-limit-reached' ||\n conversationStatus === 'plan-minutes-exhausted'\n ) {\n return;\n }\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.registerRpcMethod(GET_TOOLS_RPC_METHOD, handleGetToolsRpc);\n room.registerRpcMethod(EXECUTE_TOOL_RPC_METHOD, handleExecuteToolRpc);\n }\n\n function unregisterRoomEvents() {\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -16,20 +16,26 @@ export function useCreateConversation(options) {
16
16
  const _useSdkConsumer = useSdkConsumer(),
17
17
  chatId = _useSdkConsumer.chatId,
18
18
  namespace = _useSdkConsumer.namespace,
19
- personaChatService = _useSdkConsumer.personaChatService;
19
+ personaChatService = _useSdkConsumer.personaChatService,
20
+ startupTelemetrySession = _useSdkConsumer.startupTelemetrySession;
20
21
  const setConversationStatus = useSetAtom(state.conversationStatus);
21
22
  const _useAtom = useAtom(state.conversation),
22
23
  conversation = _useAtom[0],
23
24
  setConversation = _useAtom[1];
24
25
  const emitEvent = useEmitConversationEvent();
25
26
  useEffect(() => {
26
- void create().then(() => setConversationStatus('created')).catch(error => {
27
+ const startupAttempt = type === 'video' ? startupTelemetrySession == null ? void 0 : startupTelemetrySession.start() : undefined;
28
+ startupAttempt == null || startupAttempt.mark('api_request');
29
+ void create(startupAttempt).then(() => setConversationStatus('created')).catch(error => {
30
+ startupAttempt == null || startupAttempt.finish('error', 'create_failed');
27
31
  const status = createConversationFailureStatus(error);
28
32
  if (status === 'plan-minutes-exhausted') {
29
33
  emitEvent('planMinutesExhausted', {});
30
34
  }
31
35
  setConversationStatus(status);
32
36
  });
37
+ return () => startupTelemetrySession == null ? void 0 : startupTelemetrySession.release(startupAttempt);
38
+ // Telemetry changes must not issue another create-conversation request.
33
39
  }, [type, chatId]);
34
40
  useUnmount(() => {
35
41
  if (!conversation) {
@@ -49,7 +55,7 @@ export function useCreateConversation(options) {
49
55
  data: conversation,
50
56
  destroy
51
57
  };
52
- async function create() {
58
+ async function create(startupAttempt) {
53
59
  invariant(personaChatService, 'personaChatService is required. Pass it as a prop to LegendsPlatform.');
54
60
  switch (type) {
55
61
  case 'video':
@@ -62,6 +68,8 @@ export function useCreateConversation(options) {
62
68
  lastConversationTopic,
63
69
  conversationLanguage
64
70
  });
71
+ startupTelemetrySession == null || startupTelemetrySession.bind(startupAttempt, result.id);
72
+ startupAttempt == null || startupAttempt.mark('api_response');
65
73
  setConversation({
66
74
  type: 'video',
67
75
  url: result.url,