@wix/legends-platform-sdk 1.28.0 → 1.30.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 (54) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/components/ChromaKey/ChromaKey.js +25 -6
  3. package/dist/cjs/components/ChromaKey/ChromaKey.js.map +1 -1
  4. package/dist/cjs/components/ChromaKey/chroma-key.js +3 -1
  5. package/dist/cjs/components/ChromaKey/chroma-key.js.map +1 -1
  6. package/dist/cjs/conversation/types.js.map +1 -1
  7. package/dist/cjs/hooks/useConversation/livekit/useConversation.js +30 -16
  8. package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
  9. package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js +4 -0
  10. package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
  11. package/dist/cjs/hooks/useConversationEvents/types.js.map +1 -1
  12. package/dist/cjs/hooks/useCreateConversation/createConversationFailureStatus.js +20 -0
  13. package/dist/cjs/hooks/useCreateConversation/createConversationFailureStatus.js.map +1 -0
  14. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js +7 -6
  15. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  16. package/dist/cjs/hooks/usePictureInPicture/usePictureInPictureAuto.js +10 -9
  17. package/dist/cjs/hooks/usePictureInPicture/usePictureInPictureAuto.js.map +1 -1
  18. package/dist/cjs/services/FetchPersonaChatService.js +8 -1
  19. package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
  20. package/dist/esm/components/ChromaKey/ChromaKey.js +26 -5
  21. package/dist/esm/components/ChromaKey/ChromaKey.js.map +1 -1
  22. package/dist/esm/components/ChromaKey/chroma-key.js +3 -1
  23. package/dist/esm/components/ChromaKey/chroma-key.js.map +1 -1
  24. package/dist/esm/conversation/types.js.map +1 -1
  25. package/dist/esm/hooks/useConversation/livekit/useConversation.js +31 -17
  26. package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
  27. package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js +3 -0
  28. package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
  29. package/dist/esm/hooks/useConversationEvents/types.js.map +1 -1
  30. package/dist/esm/hooks/useCreateConversation/createConversationFailureStatus.js +16 -0
  31. package/dist/esm/hooks/useCreateConversation/createConversationFailureStatus.js.map +1 -0
  32. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js +7 -6
  33. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  34. package/dist/esm/hooks/usePictureInPicture/usePictureInPictureAuto.js +10 -9
  35. package/dist/esm/hooks/usePictureInPicture/usePictureInPictureAuto.js.map +1 -1
  36. package/dist/esm/services/FetchPersonaChatService.js +8 -1
  37. package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
  38. package/dist/types/components/ChromaKey/ChromaKey.d.ts +1 -0
  39. package/dist/types/components/ChromaKey/ChromaKey.d.ts.map +1 -1
  40. package/dist/types/components/ChromaKey/chroma-key.d.ts +1 -1
  41. package/dist/types/components/ChromaKey/chroma-key.d.ts.map +1 -1
  42. package/dist/types/conversation/types.d.ts +1 -1
  43. package/dist/types/conversation/types.d.ts.map +1 -1
  44. package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
  45. package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts +1 -0
  46. package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts.map +1 -1
  47. package/dist/types/hooks/useConversationEvents/types.d.ts +5 -0
  48. package/dist/types/hooks/useConversationEvents/types.d.ts.map +1 -1
  49. package/dist/types/hooks/useCreateConversation/createConversationFailureStatus.d.ts +5 -0
  50. package/dist/types/hooks/useCreateConversation/createConversationFailureStatus.d.ts.map +1 -0
  51. package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
  52. package/dist/types/hooks/usePictureInPicture/usePictureInPictureAuto.d.ts.map +1 -1
  53. package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
  54. package/package.json +6 -6
package/README.md CHANGED
@@ -105,7 +105,7 @@ const { status, join, leave } = useConversation({
105
105
 
106
106
  | Return | Type | Description |
107
107
  |--------|------|-------------|
108
- | `status` | `'pending' \| 'created' \| 'destroying' \| 'destroyed' \| 'exceeded' \| 'inactivity-timeout' \| 'credit-exhausted' \| 'conversation-limit-reached' \| 'voice-not-found' \| 'initialization-error' \| 'error'` | Current conversation state |
108
+ | `status` | `'pending' \| 'created' \| 'destroying' \| 'destroyed' \| 'exceeded' \| 'inactivity-timeout' \| 'credit-exhausted' \| 'conversation-limit-reached' \| 'plan-minutes-exhausted' \| 'voice-not-found' \| 'initialization-error' \| 'error'` | Current conversation state |
109
109
  | `join()` | `() => void` | Start the conversation |
110
110
  | `leave()` | `(destroy?: boolean) => Promise<void>` | End the conversation |
111
111
 
@@ -157,7 +157,7 @@ const result = await send({ message: 'Hello' });
157
157
  ```tsx
158
158
  const status = useConversationStatus();
159
159
  // 'pending' | 'created' | 'destroying' | 'destroyed' | 'exceeded'
160
- // | 'inactivity-timeout' | 'credit-exhausted' | 'conversation-limit-reached' | 'voice-not-found' | 'initialization-error' | 'error'
160
+ // | 'inactivity-timeout' | 'credit-exhausted' | 'conversation-limit-reached' | 'plan-minutes-exhausted' | 'voice-not-found' | 'initialization-error' | 'error'
161
161
  ```
162
162
 
163
163
  #### `useConversationTimer()`
@@ -25,19 +25,23 @@ function ChromaKey(props) {
25
25
  width,
26
26
  height,
27
27
  pip,
28
+ pipFallback,
28
29
  onPiPEnter,
29
30
  onPiPExit,
30
31
  onPiPError,
31
32
  ...restVideoProps
32
33
  } = children.props;
33
34
  const [isPlayable, setIsPlayable] = (0, _react.useState)(false);
35
+ const [isWebGLAvailable, setIsWebGLAvailable] = (0, _react.useState)(null);
34
36
  const $video = (0, _react.useRef)(null);
35
37
  const $canvas = (0, _react.useRef)(null);
36
38
  const isPiPActive = (0, _jotai.useAtomValue)(_usePictureInPicture.pipActiveAtom);
39
+ const useVideoFallback = isWebGLAvailable === false;
40
+ const pipElement = isWebGLAvailable === null ? null : useVideoFallback ? $video.current : $canvas.current;
37
41
 
38
42
  // Setup PiP - hook handles canvas → video conversion internally
39
43
  (0, _usePictureInPicture.usePictureInPictureAuto)({
40
- element: pip && isPlayable ? $canvas.current : null,
44
+ element: pip && isPlayable ? pipElement : null,
41
45
  onEnter: onPiPEnter,
42
46
  onExit: onPiPExit,
43
47
  onError: onPiPError
@@ -55,6 +59,10 @@ function ChromaKey(props) {
55
59
  smoothness,
56
60
  background
57
61
  });
62
+ setIsWebGLAvailable(process !== null);
63
+ if (!process) {
64
+ return;
65
+ }
58
66
  debug && console.log('Chroma key initialized', $video.current, $canvas.current, {
59
67
  color,
60
68
  spill,
@@ -87,7 +95,7 @@ function ChromaKey(props) {
87
95
  __self: this,
88
96
  __source: {
89
97
  fileName: _jsxFileName,
90
- lineNumber: 112,
98
+ lineNumber: 128,
91
99
  columnNumber: 5
92
100
  }
93
101
  }, /*#__PURE__*/_react.default.createElement("canvas", {
@@ -95,7 +103,7 @@ function ChromaKey(props) {
95
103
  style: {
96
104
  width: '100%',
97
105
  height: '100%',
98
- display: showPipFallback ? 'none' : 'block',
106
+ display: useVideoFallback || showPipFallback ? 'none' : 'block',
99
107
  ...(isPlayable ? {} : {
100
108
  position: 'absolute',
101
109
  opacity: 0,
@@ -107,13 +115,24 @@ function ChromaKey(props) {
107
115
  __self: this,
108
116
  __source: {
109
117
  fileName: _jsxFileName,
110
- lineNumber: 120,
118
+ lineNumber: 136,
111
119
  columnNumber: 7
112
120
  }
113
- }), !isPlayable && fallback, /*#__PURE__*/_react.default.cloneElement(children, {
121
+ }), !isPlayable && fallback, showPipFallback && pipFallback, /*#__PURE__*/_react.default.cloneElement(children, {
114
122
  ...restVideoProps,
123
+ // cloneElement retains original props; only ChromaKey should own PiP.
124
+ pip: false,
125
+ pipFallback: undefined,
126
+ onPiPEnter: undefined,
127
+ onPiPExit: undefined,
128
+ onPiPError: undefined,
115
129
  ref: $video,
116
- style: {
130
+ style: useVideoFallback ? {
131
+ width: '100%',
132
+ height: '100%',
133
+ ...style,
134
+ display: isPlayable && !showPipFallback ? style == null ? void 0 : style.display : 'none'
135
+ } : {
117
136
  display: 'none'
118
137
  },
119
138
  onCanPlay: checkPlayable,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_chromaKey","_usePictureInPicture","_jotai","_jsxFileName","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ChromaKey","props","debug","children","color","spill","smoothness","similarity","fallback","background","className","style","width","height","pip","onPiPEnter","onPiPExit","onPiPError","restVideoProps","isPlayable","setIsPlayable","useState","$video","useRef","$canvas","isPiPActive","useAtomValue","pipActiveAtom","usePictureInPictureAuto","element","current","onEnter","onExit","onError","showPipFallback","useEffect","console","warn","process","chromaKey","log","rafId","isActive","loop","requestAnimationFrame","cancelAnimationFrame","createElement","__self","__source","fileName","lineNumber","columnNumber","ref","display","position","opacity","pointerEvents","visibility","zIndex","React","cloneElement","onCanPlay","checkPlayable","onLoadedMetadata","event","readyState","currentTarget","HTMLMediaElement","HAVE_FUTURE_DATA"],"sources":["../../../../src/components/ChromaKey/ChromaKey.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport { chromaKey } from './chroma-key';\nimport {\n pipActiveAtom,\n usePictureInPictureAuto,\n} from '../../hooks/usePictureInPicture';\nimport { useAtomValue } from 'jotai';\n\ninterface ChromaKeyProps extends React.HTMLAttributes<HTMLCanvasElement> {\n debug?: boolean;\n color?: string;\n spill?: number;\n similarity?: number;\n smoothness?: number;\n fallback?: React.ReactNode;\n background?: string | null;\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref?: React.Ref<HTMLVideoElement>;\n pip?: boolean;\n onPiPEnter?: () => void;\n onPiPExit?: () => void;\n onPiPError?: (error: Error) => void;\n }\n >;\n}\n\nexport function ChromaKey(props: ChromaKeyProps) {\n const {\n debug = false,\n children,\n color = '#03ff9c',\n spill = 0.1,\n smoothness = 0.15,\n similarity = 0.3,\n fallback,\n background,\n } = props;\n\n const {\n className,\n style,\n width,\n height,\n pip,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n ...restVideoProps\n } = children.props;\n const [isPlayable, setIsPlayable] = useState(false);\n\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n const isPiPActive = useAtomValue(pipActiveAtom);\n\n // Setup PiP - hook handles canvas → video conversion internally\n usePictureInPictureAuto({\n element: pip && isPlayable ? $canvas.current : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n if (!$video.current || !$canvas.current || !isPlayable) {\n debug && console.warn('Video or canvas is not initialized');\n\n return;\n }\n\n const process = chromaKey($video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n background,\n });\n\n debug &&\n console.log('Chroma key initialized', $video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n });\n\n let rafId: number;\n let isActive = true;\n\n function loop() {\n if (!isActive) {\n return;\n }\n process?.();\n rafId = requestAnimationFrame(loop);\n }\n\n rafId = requestAnimationFrame(loop);\n\n return () => {\n debug && console.log('Chroma key process cleanup');\n isActive = false;\n cancelAnimationFrame(rafId);\n };\n }, [color, spill, similarity, smoothness, isPlayable, debug, background]);\n\n return (\n <div\n className={className}\n style={{\n ...style,\n width,\n height,\n }}\n >\n <canvas\n ref={$canvas}\n style={{\n width: '100%',\n height: '100%',\n display: showPipFallback ? 'none' : 'block',\n ...(isPlayable\n ? {}\n : {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n zIndex: -1,\n }),\n }}\n />\n {!isPlayable && fallback}\n\n {React.cloneElement(children, {\n ...restVideoProps,\n ref: $video,\n style: { display: 'none' },\n onCanPlay: checkPlayable,\n onLoadedMetadata: checkPlayable,\n })}\n </div>\n );\n\n function checkPlayable(event: React.SyntheticEvent<HTMLVideoElement>) {\n const readyState = event.currentTarget.readyState;\n\n setIsPlayable(readyState >= HTMLMediaElement.HAVE_FUTURE_DATA);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_chromaKey","_usePictureInPicture","_jotai","_jsxFileName","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ChromaKey","props","debug","children","color","spill","smoothness","similarity","fallback","background","className","style","width","height","pip","pipFallback","onPiPEnter","onPiPExit","onPiPError","restVideoProps","isPlayable","setIsPlayable","useState","isWebGLAvailable","setIsWebGLAvailable","$video","useRef","$canvas","isPiPActive","useAtomValue","pipActiveAtom","useVideoFallback","pipElement","current","usePictureInPictureAuto","element","onEnter","onExit","onError","showPipFallback","useEffect","console","warn","process","chromaKey","log","rafId","isActive","loop","requestAnimationFrame","cancelAnimationFrame","createElement","__self","__source","fileName","lineNumber","columnNumber","ref","display","position","opacity","pointerEvents","visibility","zIndex","React","cloneElement","undefined","onCanPlay","checkPlayable","onLoadedMetadata","event","readyState","currentTarget","HTMLMediaElement","HAVE_FUTURE_DATA"],"sources":["../../../../src/components/ChromaKey/ChromaKey.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport { chromaKey } from './chroma-key';\nimport {\n pipActiveAtom,\n usePictureInPictureAuto,\n} from '../../hooks/usePictureInPicture';\nimport { useAtomValue } from 'jotai';\n\ninterface ChromaKeyProps extends React.HTMLAttributes<HTMLCanvasElement> {\n debug?: boolean;\n color?: string;\n spill?: number;\n similarity?: number;\n smoothness?: number;\n fallback?: React.ReactNode;\n background?: string | null;\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref?: React.Ref<HTMLVideoElement>;\n pip?: boolean;\n pipFallback?: React.ReactNode;\n onPiPEnter?: () => void;\n onPiPExit?: () => void;\n onPiPError?: (error: Error) => void;\n }\n >;\n}\n\nexport function ChromaKey(props: ChromaKeyProps) {\n const {\n debug = false,\n children,\n color = '#03ff9c',\n spill = 0.1,\n smoothness = 0.15,\n similarity = 0.3,\n fallback,\n background,\n } = props;\n\n const {\n className,\n style,\n width,\n height,\n pip,\n pipFallback,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n ...restVideoProps\n } = children.props;\n const [isPlayable, setIsPlayable] = useState(false);\n const [isWebGLAvailable, setIsWebGLAvailable] = useState<boolean | null>(\n null,\n );\n\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n const isPiPActive = useAtomValue(pipActiveAtom);\n const useVideoFallback = isWebGLAvailable === false;\n const pipElement =\n isWebGLAvailable === null\n ? null\n : useVideoFallback\n ? $video.current\n : $canvas.current;\n\n // Setup PiP - hook handles canvas → video conversion internally\n usePictureInPictureAuto({\n element: pip && isPlayable ? pipElement : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n if (!$video.current || !$canvas.current || !isPlayable) {\n debug && console.warn('Video or canvas is not initialized');\n\n return;\n }\n\n const process = chromaKey($video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n background,\n });\n setIsWebGLAvailable(process !== null);\n if (!process) {\n return;\n }\n\n debug &&\n console.log('Chroma key initialized', $video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n });\n\n let rafId: number;\n let isActive = true;\n\n function loop() {\n if (!isActive) {\n return;\n }\n process?.();\n rafId = requestAnimationFrame(loop);\n }\n\n rafId = requestAnimationFrame(loop);\n\n return () => {\n debug && console.log('Chroma key process cleanup');\n isActive = false;\n cancelAnimationFrame(rafId);\n };\n }, [color, spill, similarity, smoothness, isPlayable, debug, background]);\n\n return (\n <div\n className={className}\n style={{\n ...style,\n width,\n height,\n }}\n >\n <canvas\n ref={$canvas}\n style={{\n width: '100%',\n height: '100%',\n display: useVideoFallback || showPipFallback ? 'none' : 'block',\n ...(isPlayable\n ? {}\n : {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n zIndex: -1,\n }),\n }}\n />\n {!isPlayable && fallback}\n {showPipFallback && pipFallback}\n\n {React.cloneElement(children, {\n ...restVideoProps,\n // cloneElement retains original props; only ChromaKey should own PiP.\n pip: false,\n pipFallback: undefined,\n onPiPEnter: undefined,\n onPiPExit: undefined,\n onPiPError: undefined,\n ref: $video,\n style: useVideoFallback\n ? {\n width: '100%',\n height: '100%',\n ...style,\n display: isPlayable && !showPipFallback ? style?.display : 'none',\n }\n : { display: 'none' },\n onCanPlay: checkPlayable,\n onLoadedMetadata: checkPlayable,\n })}\n </div>\n );\n\n function checkPlayable(event: React.SyntheticEvent<HTMLVideoElement>) {\n const readyState = event.currentTarget.readyState;\n\n setIsPlayable(readyState >= HTMLMediaElement.HAVE_FUTURE_DATA);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -12,7 +12,9 @@ function chromaKey($video, $canvas, options) {
12
12
  premultipliedAlpha: false,
13
13
  preserveDrawingBuffer: true
14
14
  });
15
- (0, _invariant.default)(gl, 'WebGL context is not initialized');
15
+ if (!gl) {
16
+ return null;
17
+ }
16
18
  const BUFFER = gl.createBuffer();
17
19
  const TEXTURE = gl.createTexture();
18
20
  const program = gl.createProgram();
@@ -1 +1 @@
1
- {"version":3,"names":["_invariant","_interopRequireDefault","require","shaders","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","chromaKey","$video","$canvas","options","gl","getContext","alpha","premultipliedAlpha","preserveDrawingBuffer","invariant","BUFFER","createBuffer","TEXTURE","createTexture","program","createProgram","_VS_","createShader","VERTEX_SHADER","_FS_","FRAGMENT_SHADER","shaderSource","VertexAlign","ChromaKey","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","attachShader","linkProgram","useProgram","bindTexture","TEXTURE_2D","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","texParameteri","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","$coords$","getAttribLocation","$texture$","getUniformLocation","$width$","$height$","$color$","$similarity$","$smoothness$","$spill$","vertexAttribPointer","FLOAT","enableVertexAttribArray","activeTexture","TEXTURE0","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","process","color","spill","similarity","smoothness","background","videoWidth","videoHeight","width","window","devicePixelRatio","height","viewport","parseInt","substring","g","b","clearColor","clear","COLOR_BUFFER_BIT","uniform1i","uniform1f","uniform3f","substr","texImage2D","RGB","UNSIGNED_BYTE","drawArrays","TRIANGLE_FAN"],"sources":["../../../../src/components/ChromaKey/chroma-key.ts"],"sourcesContent":["import invariant from 'invariant';\n\nimport * as shaders from './shaders';\n\nexport type ProcessCallback = () => void;\n\nexport function chromaKey(\n $video: HTMLVideoElement,\n $canvas: HTMLCanvasElement,\n options: {\n color: string;\n spill: number;\n similarity: number;\n smoothness: number;\n background?: string | null;\n },\n): ProcessCallback {\n const gl = $canvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n\n invariant(gl, 'WebGL context is not initialized');\n\n const BUFFER = gl.createBuffer();\n const TEXTURE = gl.createTexture();\n const program = gl.createProgram();\n const _VS_ = gl.createShader(gl.VERTEX_SHADER);\n const _FS_ = gl.createShader(gl.FRAGMENT_SHADER);\n\n invariant(program, 'Program is not initialized');\n invariant(_VS_, 'Vertex shader is not initialized');\n invariant(_FS_, 'Fragment shader is not initialized');\n\n gl.shaderSource(_VS_, shaders.VertexAlign);\n gl.shaderSource(_FS_, shaders.ChromaKey);\n\n gl.compileShader(_VS_);\n gl.compileShader(_FS_);\n\n if (!gl.getShaderParameter(_FS_, gl.COMPILE_STATUS)) {\n console.error(\n 'Fragment shader compilation failed',\n gl.getShaderInfoLog(_FS_),\n );\n }\n\n gl.attachShader(program, _VS_);\n gl.attachShader(program, _FS_);\n\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.bindTexture(gl.TEXTURE_2D, TEXTURE);\n gl.bindBuffer(gl.ARRAY_BUFFER, BUFFER);\n\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const $coords$ = gl.getAttribLocation(program, 'coords');\n const $texture$ = gl.getUniformLocation(program, 'tex');\n const $width$ = gl.getUniformLocation(program, 'texWidth');\n const $height$ = gl.getUniformLocation(program, 'texHeight');\n const $color$ = gl.getUniformLocation(program, 'keyColor');\n const $similarity$ = gl.getUniformLocation(program, 'similarity');\n const $smoothness$ = gl.getUniformLocation(program, 'smoothness');\n const $spill$ = gl.getUniformLocation(program, 'spill');\n\n gl.vertexAttribPointer($coords$, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray($coords$);\n\n gl.activeTexture(gl.TEXTURE0);\n\n // Enable blending for transparency (critical for Safari)\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n return function process() {\n const { color, spill, similarity, smoothness, background } = options;\n\n // Use video dimensions directly instead of metadata (for Safari compatibility)\n const videoWidth = $video.videoWidth;\n const videoHeight = $video.videoHeight;\n\n if (!videoWidth || !videoHeight) {\n return; // Video not ready yet\n }\n\n const width = videoWidth * window.devicePixelRatio;\n const height = videoHeight * window.devicePixelRatio;\n\n $canvas.width = width;\n $canvas.height = height;\n\n gl.viewport(0, 0, width, height);\n\n // Clear with background color or transparent\n if (background) {\n const r = parseInt(background.substring(1, 3), 16) / 255;\n const g = parseInt(background.substring(3, 5), 16) / 255;\n const b = parseInt(background.substring(5, 7), 16) / 255;\n gl.clearColor(r, g, b, 1);\n } else {\n gl.clearColor(0, 0, 0, 0);\n }\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n\n gl.uniform1i($texture$, 0);\n gl.uniform1f($width$, width);\n gl.uniform1f($height$, height);\n gl.uniform1f($spill$, spill);\n gl.uniform1f($similarity$, similarity);\n gl.uniform1f($smoothness$, smoothness);\n gl.uniform3f(\n $color$,\n parseInt(color.substr(1, 2), 16) / 255,\n parseInt(color.substr(3, 2), 16) / 255,\n parseInt(color.substr(5, 2), 16) / 255,\n );\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_invariant","_interopRequireDefault","require","shaders","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","chromaKey","$video","$canvas","options","gl","getContext","alpha","premultipliedAlpha","preserveDrawingBuffer","BUFFER","createBuffer","TEXTURE","createTexture","program","createProgram","_VS_","createShader","VERTEX_SHADER","_FS_","FRAGMENT_SHADER","invariant","shaderSource","VertexAlign","ChromaKey","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","attachShader","linkProgram","useProgram","bindTexture","TEXTURE_2D","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","texParameteri","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","$coords$","getAttribLocation","$texture$","getUniformLocation","$width$","$height$","$color$","$similarity$","$smoothness$","$spill$","vertexAttribPointer","FLOAT","enableVertexAttribArray","activeTexture","TEXTURE0","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","process","color","spill","similarity","smoothness","background","videoWidth","videoHeight","width","window","devicePixelRatio","height","viewport","parseInt","substring","g","b","clearColor","clear","COLOR_BUFFER_BIT","uniform1i","uniform1f","uniform3f","substr","texImage2D","RGB","UNSIGNED_BYTE","drawArrays","TRIANGLE_FAN"],"sources":["../../../../src/components/ChromaKey/chroma-key.ts"],"sourcesContent":["import invariant from 'invariant';\n\nimport * as shaders from './shaders';\n\nexport type ProcessCallback = () => void;\n\nexport function chromaKey(\n $video: HTMLVideoElement,\n $canvas: HTMLCanvasElement,\n options: {\n color: string;\n spill: number;\n similarity: number;\n smoothness: number;\n background?: string | null;\n },\n): ProcessCallback | null {\n const gl = $canvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n\n if (!gl) {\n return null;\n }\n\n const BUFFER = gl.createBuffer();\n const TEXTURE = gl.createTexture();\n const program = gl.createProgram();\n const _VS_ = gl.createShader(gl.VERTEX_SHADER);\n const _FS_ = gl.createShader(gl.FRAGMENT_SHADER);\n\n invariant(program, 'Program is not initialized');\n invariant(_VS_, 'Vertex shader is not initialized');\n invariant(_FS_, 'Fragment shader is not initialized');\n\n gl.shaderSource(_VS_, shaders.VertexAlign);\n gl.shaderSource(_FS_, shaders.ChromaKey);\n\n gl.compileShader(_VS_);\n gl.compileShader(_FS_);\n\n if (!gl.getShaderParameter(_FS_, gl.COMPILE_STATUS)) {\n console.error(\n 'Fragment shader compilation failed',\n gl.getShaderInfoLog(_FS_),\n );\n }\n\n gl.attachShader(program, _VS_);\n gl.attachShader(program, _FS_);\n\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.bindTexture(gl.TEXTURE_2D, TEXTURE);\n gl.bindBuffer(gl.ARRAY_BUFFER, BUFFER);\n\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const $coords$ = gl.getAttribLocation(program, 'coords');\n const $texture$ = gl.getUniformLocation(program, 'tex');\n const $width$ = gl.getUniformLocation(program, 'texWidth');\n const $height$ = gl.getUniformLocation(program, 'texHeight');\n const $color$ = gl.getUniformLocation(program, 'keyColor');\n const $similarity$ = gl.getUniformLocation(program, 'similarity');\n const $smoothness$ = gl.getUniformLocation(program, 'smoothness');\n const $spill$ = gl.getUniformLocation(program, 'spill');\n\n gl.vertexAttribPointer($coords$, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray($coords$);\n\n gl.activeTexture(gl.TEXTURE0);\n\n // Enable blending for transparency (critical for Safari)\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n return function process() {\n const { color, spill, similarity, smoothness, background } = options;\n\n // Use video dimensions directly instead of metadata (for Safari compatibility)\n const videoWidth = $video.videoWidth;\n const videoHeight = $video.videoHeight;\n\n if (!videoWidth || !videoHeight) {\n return; // Video not ready yet\n }\n\n const width = videoWidth * window.devicePixelRatio;\n const height = videoHeight * window.devicePixelRatio;\n\n $canvas.width = width;\n $canvas.height = height;\n\n gl.viewport(0, 0, width, height);\n\n // Clear with background color or transparent\n if (background) {\n const r = parseInt(background.substring(1, 3), 16) / 255;\n const g = parseInt(background.substring(3, 5), 16) / 255;\n const b = parseInt(background.substring(5, 7), 16) / 255;\n gl.clearColor(r, g, b, 1);\n } else {\n gl.clearColor(0, 0, 0, 0);\n }\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n\n gl.uniform1i($texture$, 0);\n gl.uniform1f($width$, width);\n gl.uniform1f($height$, height);\n gl.uniform1f($spill$, spill);\n gl.uniform1f($similarity$, similarity);\n gl.uniform1f($smoothness$, smoothness);\n gl.uniform3f(\n $color$,\n parseInt(color.substr(1, 2), 16) / 255,\n parseInt(color.substr(3, 2), 16) / 255,\n parseInt(color.substr(5, 2), 16) / 255,\n );\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n | 'inactivity-timeout' // conversation ended due to inactivity\n | 'credit-exhausted' // the server ended the conversation because the Legend owner ran out of credit\n | 'conversation-limit-reached' // the server ended the conversation because the caller reached the Legend's daily conversation limit\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n | 'inactivity-timeout' // conversation ended due to inactivity\n | 'credit-exhausted' // the server ended the conversation because the Legend owner ran out of credit\n | 'conversation-limit-reached' // the server ended the conversation because the caller reached the Legend's daily conversation limit\n | 'plan-minutes-exhausted' // the server ended the conversation because the member used up their plan's minutes\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
@@ -77,6 +77,7 @@ function useConversation({
77
77
  const inactivityTimeoutRef = (0, _react.useRef)(false);
78
78
  const creditExhaustedRef = (0, _react.useRef)(false);
79
79
  const conversationLimitReachedRef = (0, _react.useRef)(false);
80
+ const planMinutesExhaustedRef = (0, _react.useRef)(false);
80
81
  const acousticPhaseRef = (0, _react.useRef)('idle');
81
82
  const acousticT0Ref = (0, _react.useRef)(null);
82
83
  const latestTurnMetadataRef = (0, _react.useRef)({});
@@ -362,6 +363,14 @@ function useConversation({
362
363
  });
363
364
  return;
364
365
  }
366
+ if ((0, _utils.checkIsPlanMinutesExhaustedMessage)(decoded, topic)) {
367
+ var _conversationRef$curr8;
368
+ planMinutesExhaustedRef.current = true;
369
+ emitEvent('planMinutesExhausted', {
370
+ conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id
371
+ });
372
+ return;
373
+ }
365
374
  for (const {
366
375
  guard,
367
376
  handle
@@ -375,12 +384,12 @@ function useConversation({
375
384
  }
376
385
  }
377
386
  function handleConnectedEvent() {
378
- var _conversationRef$curr8;
387
+ var _conversationRef$curr9;
379
388
  isConnectedRef.current = true;
380
389
  setUserConnectionState('joined');
381
390
  setAgentConnectionState('joining');
382
391
  emitEvent('callStarted', {
383
- conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id
392
+ conversationId: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.id
384
393
  });
385
394
  }
386
395
  async function handleEncryptionErrorEvent(error) {
@@ -413,6 +422,11 @@ function useConversation({
413
422
  setConversationStatus('conversation-limit-reached');
414
423
  return;
415
424
  }
425
+ if (planMinutesExhaustedRef.current) {
426
+ planMinutesExhaustedRef.current = false;
427
+ setConversationStatus('plan-minutes-exhausted');
428
+ return;
429
+ }
416
430
  switch (reason) {
417
431
  case _livekitClient.DisconnectReason.CLIENT_INITIATED:
418
432
  break;
@@ -431,18 +445,18 @@ function useConversation({
431
445
  }
432
446
  }
433
447
  function handleAgentJoin(participant) {
434
- var _conversationRef$curr9;
448
+ var _conversationRef$curr0;
435
449
  setAgentConnectionState('joined');
436
450
  emitEvent('agentJoined', {
437
- conversationId: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.id,
451
+ conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id,
438
452
  participant
439
453
  });
440
454
  }
441
455
  function handleParticipantDisconnectedEvent(participant) {
442
- var _conversationRef$curr0;
456
+ var _conversationRef$curr1;
443
457
  setAgentConnectionState('left');
444
458
  emitEvent('agentLeft', {
445
- conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id,
459
+ conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id,
446
460
  participant
447
461
  });
448
462
  }
@@ -451,13 +465,13 @@ function useConversation({
451
465
  return;
452
466
  }
453
467
  try {
454
- var _conversationRef$curr1;
468
+ var _conversationRef$curr10;
455
469
  setUserConnectionState('leaving');
456
470
  await (room == null ? void 0 : room.disconnect(true));
457
471
  setConversationStatus('destroyed');
458
472
  setJoinedAt(undefined);
459
473
  emitEvent('callEnded', {
460
- conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id
474
+ conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id
461
475
  });
462
476
  } catch (error) {
463
477
  console.error('Failed to leave', error);
@@ -465,22 +479,22 @@ function useConversation({
465
479
  }
466
480
  }
467
481
  async function handleExpire() {
468
- var _conversationRef$curr10, _conversationRef$curr11;
482
+ var _conversationRef$curr11, _conversationRef$curr12;
469
483
  // The duration timer keeps running after the call ends.
470
- if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached') {
484
+ if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached' || conversationStatus === 'plan-minutes-exhausted') {
471
485
  return;
472
486
  }
473
487
  emitEvent('timeExceeded', {
474
- conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
475
- limit: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.limit
488
+ conversationId: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.id,
489
+ limit: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.limit
476
490
  });
477
491
  await leave();
478
492
  setConversationStatus('exceeded');
479
493
  }
480
494
  async function interrupt() {
481
- var _conversationRef$curr12;
495
+ var _conversationRef$curr13;
482
496
  emitEvent('interrupt', {
483
- conversationId: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.id
497
+ conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id
484
498
  });
485
499
  await (0, _utils.publishConversationDataMessage)(room, {}, 'interrupt');
486
500
  }
@@ -490,7 +504,7 @@ function useConversation({
490
504
  }, 'inactivity_dismiss');
491
505
  }
492
506
  async function send(message, attachments = []) {
493
- var _conversationRef$curr13;
507
+ var _conversationRef$curr14;
494
508
  await (room == null ? void 0 : room.localParticipant.sendText(message, {
495
509
  topic: 'lk.chat',
496
510
  attributes: {
@@ -498,7 +512,7 @@ function useConversation({
498
512
  }
499
513
  }));
500
514
  emitEvent('userSendMessage', {
501
- conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id,
515
+ conversationId: (_conversationRef$curr14 = conversationRef.current) == null ? void 0 : _conversationRef$curr14.id,
502
516
  message
503
517
  });
504
518
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_livekitClient","_invariant","_interopRequireDefault","_reactTimerHook","_reactUse","_componentsReact","_jotai","_conversation","_sdkConsumer","_useCreateConversation","_useSpeechActivityDetector","_useParticipantTrack","_useEmitConversationEvent","_useToolCallingRuntime","_serialize","_utils","_constants","useConversation","autoJoin","type","config","startWithMicrophone","startWithCamera","firstConversation","lastConversationTopic","_conversation$data2","setLogLevel","LogLevel","silent","conversation","useCreateConversation","room","useEnsureRoom","speaker","useAtomValue","state","microphone","setMicrophone","useAtom","camera","setCamera","tools","toolsRegistry","useSdkConsumer","toolRuntime","useToolCallingRuntime","toolsRegistryRef","useLatest","conversationRef","data","toolRuntimeRef","conversationStatus","setConversationStatus","userConnectionState","setUserConnectionState","joinedAt","setJoinedAt","setActiveMediaDevice","setMicrophoneDeviceId","useMediaDeviceSelect","kind","setSpeakerDeviceId","setCameraDeviceId","requestPermissions","enabled","setTranscriptions","useSetAtom","transcriptions","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","useEmitConversationEvent","inactivityTimeoutRef","useRef","creditExhaustedRef","conversationLimitReachedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","useParticipantTrack","source","Source","Microphone","agentMicPublication","timer","useTimer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","useEffect","registerRoomEvents","unregisterRoomEvents","useUpdateEffect","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","invariant","url","URL","accessToken","searchParams","get","connect","remoteParticipant","findJoinedAgentParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","ParticipantKind","AGENT","old","mergeTranscriptions","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","ACOUSTIC_USER_HANGOVER_MS","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","userReport","agentReport","Promise","all","getTrackStats","userStats","parseTrackStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","useSpeechActivityDetector","onSpeechStart","onSpeechEnd","thresholdRms","ACOUSTIC_USER_THRESHOLD_RMS","hangoverMs","ACOUSTIC_AGENT_HANGOVER_MS","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","buildToolDefinitions","handleExecuteToolRpc","call","parseFunctionCallPayload","payload","functionCallId","result","executeToolCalls","extractToolErrorMessage","dataChannelHandlers","guard","checkIsTurnDetectionData","handle","checkIsInactivityWarningData","checkIsInactivityTimeoutData","handleDataReceivedEvent","_participant","_kind","topic","decoded","decodeDataPayload","checkIsCreditExhaustedMessage","_conversationRef$curr6","checkIsConversationLimitReachedMessage","_conversationRef$curr7","resolve","catch","handleConnectedEvent","_conversationRef$curr8","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_conversationRef$curr9","handleParticipantDisconnectedEvent","_conversationRef$curr0","leave","_conversationRef$curr1","disconnect","_conversationRef$curr10","_conversationRef$curr11","interrupt","_conversationRef$curr12","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr13","sendText","attributes","safeStringify","on","unregisterRpcMethod","GET_TOOLS_RPC_METHOD","EXECUTE_TOOL_RPC_METHOD","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 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}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({\n type,\n config,\n firstConversation,\n lastConversationTopic,\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 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 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 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 ) {\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":["_react","require","_livekitClient","_invariant","_interopRequireDefault","_reactTimerHook","_reactUse","_componentsReact","_jotai","_conversation","_sdkConsumer","_useCreateConversation","_useSpeechActivityDetector","_useParticipantTrack","_useEmitConversationEvent","_useToolCallingRuntime","_serialize","_utils","_constants","useConversation","autoJoin","type","config","startWithMicrophone","startWithCamera","firstConversation","lastConversationTopic","_conversation$data2","setLogLevel","LogLevel","silent","conversation","useCreateConversation","room","useEnsureRoom","speaker","useAtomValue","state","microphone","setMicrophone","useAtom","camera","setCamera","tools","toolsRegistry","useSdkConsumer","toolRuntime","useToolCallingRuntime","toolsRegistryRef","useLatest","conversationRef","data","toolRuntimeRef","conversationStatus","setConversationStatus","userConnectionState","setUserConnectionState","joinedAt","setJoinedAt","setActiveMediaDevice","setMicrophoneDeviceId","useMediaDeviceSelect","kind","setSpeakerDeviceId","setCameraDeviceId","requestPermissions","enabled","setTranscriptions","useSetAtom","transcriptions","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","useEmitConversationEvent","inactivityTimeoutRef","useRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","useParticipantTrack","source","Source","Microphone","agentMicPublication","timer","useTimer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","useEffect","registerRoomEvents","unregisterRoomEvents","useUpdateEffect","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","invariant","url","URL","accessToken","searchParams","get","connect","remoteParticipant","findJoinedAgentParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","ParticipantKind","AGENT","old","mergeTranscriptions","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","ACOUSTIC_USER_HANGOVER_MS","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","userReport","agentReport","Promise","all","getTrackStats","userStats","parseTrackStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","useSpeechActivityDetector","onSpeechStart","onSpeechEnd","thresholdRms","ACOUSTIC_USER_THRESHOLD_RMS","hangoverMs","ACOUSTIC_AGENT_HANGOVER_MS","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","buildToolDefinitions","handleExecuteToolRpc","call","parseFunctionCallPayload","payload","functionCallId","result","executeToolCalls","extractToolErrorMessage","dataChannelHandlers","guard","checkIsTurnDetectionData","handle","checkIsInactivityWarningData","checkIsInactivityTimeoutData","handleDataReceivedEvent","_participant","_kind","topic","decoded","decodeDataPayload","checkIsCreditExhaustedMessage","_conversationRef$curr6","checkIsConversationLimitReachedMessage","_conversationRef$curr7","checkIsPlanMinutesExhaustedMessage","_conversationRef$curr8","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_conversationRef$curr0","handleParticipantDisconnectedEvent","_conversationRef$curr1","leave","_conversationRef$curr10","disconnect","_conversationRef$curr11","_conversationRef$curr12","interrupt","_conversationRef$curr13","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr14","sendText","attributes","safeStringify","on","unregisterRpcMethod","GET_TOOLS_RPC_METHOD","EXECUTE_TOOL_RPC_METHOD","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}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({\n type,\n config,\n firstConversation,\n lastConversationTopic,\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":[]}
@@ -5,6 +5,7 @@ exports.checkIsConversationLimitReachedMessage = checkIsConversationLimitReached
5
5
  exports.checkIsCreditExhaustedMessage = checkIsCreditExhaustedMessage;
6
6
  exports.checkIsInactivityTimeoutData = checkIsInactivityTimeoutData;
7
7
  exports.checkIsInactivityWarningData = checkIsInactivityWarningData;
8
+ exports.checkIsPlanMinutesExhaustedMessage = checkIsPlanMinutesExhaustedMessage;
8
9
  exports.checkIsTurnDetectionData = checkIsTurnDetectionData;
9
10
  exports.decodeDataPayload = decodeDataPayload;
10
11
  function decodeDataPayload(data) {
@@ -33,4 +34,7 @@ function checkIsCreditExhaustedMessage(data, topic) {
33
34
  function checkIsConversationLimitReachedMessage(data, topic) {
34
35
  return checkIsBillingEndedMessage(data, topic, 'limit_reached');
35
36
  }
37
+ function checkIsPlanMinutesExhaustedMessage(data, topic) {
38
+ return checkIsBillingEndedMessage(data, topic, 'plan_minutes_exhausted');
39
+ }
36
40
  //# sourceMappingURL=dataChannel.js.map