@wix/legends-platform-sdk 1.4.0 → 1.6.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.
- package/dist/cjs/hooks/index.js +6 -0
- package/dist/cjs/hooks/index.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/constants.js +4 -1
- package/dist/cjs/hooks/useConversation/livekit/constants.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js +87 -35
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/cjs/hooks/useSpeechActivityDetector/helpers.js +87 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/helpers.js.map +1 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/index.js +16 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/index.js.map +1 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/speechActivityProcessorSource.js +55 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/speechActivityProcessorSource.js.map +1 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/types.js +4 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/types.js.map +1 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/useSpeechActivityDetector.js +52 -0
- package/dist/cjs/hooks/useSpeechActivityDetector/useSpeechActivityDetector.js.map +1 -0
- package/dist/cjs/sdk.js +6 -0
- package/dist/cjs/sdk.js.map +1 -1
- package/dist/esm/hooks/index.js +1 -0
- package/dist/esm/hooks/index.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/constants.js +3 -0
- package/dist/esm/hooks/useConversation/livekit/constants.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/useConversation.js +87 -35
- package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/esm/hooks/useSpeechActivityDetector/helpers.js +83 -0
- package/dist/esm/hooks/useSpeechActivityDetector/helpers.js.map +1 -0
- package/dist/esm/hooks/useSpeechActivityDetector/index.js +3 -0
- package/dist/esm/hooks/useSpeechActivityDetector/index.js.map +1 -0
- package/dist/esm/hooks/useSpeechActivityDetector/speechActivityProcessorSource.js +51 -0
- package/dist/esm/hooks/useSpeechActivityDetector/speechActivityProcessorSource.js.map +1 -0
- package/dist/esm/hooks/useSpeechActivityDetector/types.js +2 -0
- package/dist/esm/hooks/useSpeechActivityDetector/types.js.map +1 -0
- package/dist/esm/hooks/useSpeechActivityDetector/useSpeechActivityDetector.js +44 -0
- package/dist/esm/hooks/useSpeechActivityDetector/useSpeechActivityDetector.js.map +1 -0
- package/dist/esm/sdk.js +1 -0
- package/dist/esm/sdk.js.map +1 -1
- package/dist/types/hooks/index.d.ts +1 -0
- package/dist/types/hooks/index.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/constants.d.ts +3 -0
- package/dist/types/hooks/useConversation/livekit/constants.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
- package/dist/types/hooks/useSpeechActivityDetector/helpers.d.ts +19 -0
- package/dist/types/hooks/useSpeechActivityDetector/helpers.d.ts.map +1 -0
- package/dist/types/hooks/useSpeechActivityDetector/index.d.ts +3 -0
- package/dist/types/hooks/useSpeechActivityDetector/index.d.ts.map +1 -0
- package/dist/types/hooks/useSpeechActivityDetector/speechActivityProcessorSource.d.ts +3 -0
- package/dist/types/hooks/useSpeechActivityDetector/speechActivityProcessorSource.d.ts.map +1 -0
- package/dist/types/hooks/useSpeechActivityDetector/types.d.ts +14 -0
- package/dist/types/hooks/useSpeechActivityDetector/types.d.ts.map +1 -0
- package/dist/types/hooks/useSpeechActivityDetector/useSpeechActivityDetector.d.ts +10 -0
- package/dist/types/hooks/useSpeechActivityDetector/useSpeechActivityDetector.d.ts.map +1 -0
- package/dist/types/sdk.d.ts +1 -0
- package/dist/types/sdk.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SPEECH_ACTIVITY_PROCESSOR_NAME","exports","SPEECH_ACTIVITY_PROCESSOR_SOURCE"],"sources":["../../../../src/hooks/useSpeechActivityDetector/speechActivityProcessorSource.ts"],"sourcesContent":["// AudioWorkletProcessor source, kept as a plain string and loaded via a Blob\n// URL (see helpers.ts). AudioWorkletGlobalScope runs isolated code on the\n// dedicated audio rendering thread — it is not throttled when the tab is\n// backgrounded, unlike requestAnimationFrame-driven analysis. Threshold\n// crossings are posted back to the main thread via `port.postMessage`.\nexport const SPEECH_ACTIVITY_PROCESSOR_NAME = 'speech-activity-processor';\n\nexport const SPEECH_ACTIVITY_PROCESSOR_SOURCE = `\nclass SpeechActivityProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n const opts = (options && options.processorOptions) || {};\n this.threshold = typeof opts.thresholdRms === 'number' ? opts.thresholdRms : 0.015;\n this.hangoverBlocks = typeof opts.hangoverBlocks === 'number' ? opts.hangoverBlocks : 8;\n this.speaking = false;\n this.silentBlockCount = 0;\n }\n\n process(inputs) {\n const input = inputs[0];\n const channel = input && input[0];\n if (!channel || channel.length === 0) {\n return true;\n }\n\n let sumSquares = 0;\n for (let i = 0; i < channel.length; i++) {\n sumSquares += channel[i] * channel[i];\n }\n const rms = Math.sqrt(sumSquares / channel.length);\n const isLoud = rms > this.threshold;\n\n if (isLoud) {\n this.silentBlockCount = 0;\n if (!this.speaking) {\n this.speaking = true;\n this.port.postMessage({ type: 'onset', rms: rms });\n }\n } else if (this.speaking) {\n this.silentBlockCount += 1;\n if (this.silentBlockCount >= this.hangoverBlocks) {\n this.speaking = false;\n this.port.postMessage({ type: 'offset', rms: rms });\n }\n }\n return true;\n }\n}\n\nregisterProcessor('${SPEECH_ACTIVITY_PROCESSOR_NAME}', SpeechActivityProcessor);\n`;\n"],"mappings":";;;;AAAA;AACA;AACA;AACA;AACA;AACO,MAAMA,8BAA8B,GAAAC,OAAA,CAAAD,8BAAA,GAAG,2BAA2B;AAElE,MAAME,gCAAgC,GAAAD,OAAA,CAAAC,gCAAA,GAAG;AAChD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqBF,8BAA8B;AACnD,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../src/hooks/useSpeechActivityDetector/types.ts"],"sourcesContent":["export type UseSpeechActivityDetectorOptions = {\n source: 'user' | 'agent';\n onSpeechStart?: (timestampMs: number) => void;\n onSpeechEnd?: (timestampMs: number) => void;\n /** Fired instead of onSpeechEnd when a segment was shorter than minSpeechMs. */\n onMisfire?: () => void;\n /** RMS threshold (0-1) above which a block counts as \"loud\". Default 0.015. */\n thresholdRms?: number;\n /** Consecutive silence duration before an \"offset\" fires. Default 300ms. */\n hangoverMs?: number;\n /** Minimum onset-to-offset duration to count as real speech, not a blip/echo. Default 0 (no filtering). */\n minSpeechMs?: number;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.useSpeechActivityDetector = useSpeechActivityDetector;
|
|
5
|
+
var _react = require("react");
|
|
6
|
+
var _useParticipantTrack = require("../useParticipantTrack");
|
|
7
|
+
var _helpers = require("./helpers");
|
|
8
|
+
/**
|
|
9
|
+
* Acoustic speech onset/offset detector for a participant's microphone
|
|
10
|
+
* track, driven by AudioWorkletNode rather than LiveKit's speaking-state
|
|
11
|
+
* events. Useful when the caller needs a timestamp tied to the actual audio
|
|
12
|
+
* signal (e.g. perceived end-to-end latency measurement) rather than a
|
|
13
|
+
* VAD/turn-detection-derived event.
|
|
14
|
+
*/
|
|
15
|
+
function useSpeechActivityDetector(options) {
|
|
16
|
+
const {
|
|
17
|
+
source,
|
|
18
|
+
onSpeechStart,
|
|
19
|
+
onSpeechEnd,
|
|
20
|
+
thresholdRms,
|
|
21
|
+
hangoverMs
|
|
22
|
+
} = options;
|
|
23
|
+
const {
|
|
24
|
+
track
|
|
25
|
+
} = (0, _useParticipantTrack.useParticipantTrack)({
|
|
26
|
+
type: source,
|
|
27
|
+
source: _useParticipantTrack.Source.Microphone
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
// Keep latest callbacks available to the effect without retriggering
|
|
31
|
+
// AudioContext/AudioWorkletNode setup on every render.
|
|
32
|
+
const callbacksRef = (0, _react.useRef)({
|
|
33
|
+
onSpeechStart,
|
|
34
|
+
onSpeechEnd
|
|
35
|
+
});
|
|
36
|
+
callbacksRef.current = {
|
|
37
|
+
onSpeechStart,
|
|
38
|
+
onSpeechEnd
|
|
39
|
+
};
|
|
40
|
+
(0, _react.useEffect)(() => {
|
|
41
|
+
const {
|
|
42
|
+
cleanup
|
|
43
|
+
} = (0, _helpers.setupSpeechActivityDetector)(track, {
|
|
44
|
+
thresholdRms,
|
|
45
|
+
hangoverMs,
|
|
46
|
+
onSpeechStart: timestampMs => callbacksRef.current.onSpeechStart == null ? void 0 : callbacksRef.current.onSpeechStart(timestampMs),
|
|
47
|
+
onSpeechEnd: timestampMs => callbacksRef.current.onSpeechEnd == null ? void 0 : callbacksRef.current.onSpeechEnd(timestampMs)
|
|
48
|
+
});
|
|
49
|
+
return cleanup;
|
|
50
|
+
}, [track == null ? void 0 : track.mediaStreamTrack, thresholdRms, hangoverMs]);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=useSpeechActivityDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_useParticipantTrack","_helpers","useSpeechActivityDetector","options","source","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","track","useParticipantTrack","type","Source","Microphone","callbacksRef","useRef","current","useEffect","cleanup","setupSpeechActivityDetector","timestampMs","mediaStreamTrack"],"sources":["../../../../src/hooks/useSpeechActivityDetector/useSpeechActivityDetector.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useParticipantTrack, Source } from '../useParticipantTrack';\nimport { setupSpeechActivityDetector } from './helpers';\nimport { type UseSpeechActivityDetectorOptions } from './types';\n\n/**\n * Acoustic speech onset/offset detector for a participant's microphone\n * track, driven by AudioWorkletNode rather than LiveKit's speaking-state\n * events. Useful when the caller needs a timestamp tied to the actual audio\n * signal (e.g. perceived end-to-end latency measurement) rather than a\n * VAD/turn-detection-derived event.\n */\nexport function useSpeechActivityDetector(\n options: UseSpeechActivityDetectorOptions,\n): void {\n const { source, onSpeechStart, onSpeechEnd, thresholdRms, hangoverMs } =\n options;\n const { track } = useParticipantTrack({\n type: source,\n source: Source.Microphone,\n });\n\n // Keep latest callbacks available to the effect without retriggering\n // AudioContext/AudioWorkletNode setup on every render.\n const callbacksRef = useRef({ onSpeechStart, onSpeechEnd });\n callbacksRef.current = { onSpeechStart, onSpeechEnd };\n\n useEffect(() => {\n const { cleanup } = setupSpeechActivityDetector(track, {\n thresholdRms,\n hangoverMs,\n onSpeechStart: (timestampMs) =>\n callbacksRef.current.onSpeechStart?.(timestampMs),\n onSpeechEnd: (timestampMs) =>\n callbacksRef.current.onSpeechEnd?.(timestampMs),\n });\n return cleanup;\n }, [track?.mediaStreamTrack, thresholdRms, hangoverMs]);\n}\n"],"mappings":";;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,yBAAyBA,CACvCC,OAAyC,EACnC;EACN,MAAM;IAAEC,MAAM;IAAEC,aAAa;IAAEC,WAAW;IAAEC,YAAY;IAAEC;EAAW,CAAC,GACpEL,OAAO;EACT,MAAM;IAAEM;EAAM,CAAC,GAAG,IAAAC,wCAAmB,EAAC;IACpCC,IAAI,EAAEP,MAAM;IACZA,MAAM,EAAEQ,2BAAM,CAACC;EACjB,CAAC,CAAC;;EAEF;EACA;EACA,MAAMC,YAAY,GAAG,IAAAC,aAAM,EAAC;IAAEV,aAAa;IAAEC;EAAY,CAAC,CAAC;EAC3DQ,YAAY,CAACE,OAAO,GAAG;IAAEX,aAAa;IAAEC;EAAY,CAAC;EAErD,IAAAW,gBAAS,EAAC,MAAM;IACd,MAAM;MAAEC;IAAQ,CAAC,GAAG,IAAAC,oCAA2B,EAACV,KAAK,EAAE;MACrDF,YAAY;MACZC,UAAU;MACVH,aAAa,EAAGe,WAAW,IACzBN,YAAY,CAACE,OAAO,CAACX,aAAa,oBAAlCS,YAAY,CAACE,OAAO,CAACX,aAAa,CAAGe,WAAW,CAAC;MACnDd,WAAW,EAAGc,WAAW,IACvBN,YAAY,CAACE,OAAO,CAACV,WAAW,oBAAhCQ,YAAY,CAACE,OAAO,CAACV,WAAW,CAAGc,WAAW;IAClD,CAAC,CAAC;IACF,OAAOF,OAAO;EAChB,CAAC,EAAE,CAACT,KAAK,oBAALA,KAAK,CAAEY,gBAAgB,EAAEd,YAAY,EAAEC,UAAU,CAAC,CAAC;AACzD","ignoreList":[]}
|
package/dist/cjs/sdk.js
CHANGED
|
@@ -139,6 +139,12 @@ Object.keys(_useParticipantTrack).forEach(function (key) {
|
|
|
139
139
|
if (key in exports && exports[key] === _useParticipantTrack[key]) return;
|
|
140
140
|
exports[key] = _useParticipantTrack[key];
|
|
141
141
|
});
|
|
142
|
+
var _useSpeechActivityDetector = require("./hooks/useSpeechActivityDetector");
|
|
143
|
+
Object.keys(_useSpeechActivityDetector).forEach(function (key) {
|
|
144
|
+
if (key === "default" || key === "__esModule") return;
|
|
145
|
+
if (key in exports && exports[key] === _useSpeechActivityDetector[key]) return;
|
|
146
|
+
exports[key] = _useSpeechActivityDetector[key];
|
|
147
|
+
});
|
|
142
148
|
var _types2 = require("./conversation/types");
|
|
143
149
|
Object.keys(_types2).forEach(function (key) {
|
|
144
150
|
if (key === "default" || key === "__esModule") return;
|
package/dist/cjs/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_types","require","Object","keys","forEach","key","exports","_LegendsPlatform","_LegendsPlatformQLess","_useTextChat","_useConversation","_useTranscriptions","_useConversationStatus","_useMicrophone","_useSpeaker","_useCamera","_useMediaRecorder","_useConversationTimer","_useAudioLevel","_useConversationEvents","_useUserActivity","_useAudio","_useScreenShare","_useConnectionState","_useActivityState","_usePictureInPicture","_useMediaPermissions","_useTools","_useParticipantTrack","_types2"],"sources":["../../src/sdk.ts"],"sourcesContent":["export * from './types';\nexport * from './components/LegendsPlatform';\nexport * from './components/LegendsPlatformQLess';\n\nexport * from './hooks/useTextChat';\nexport * from './hooks/useConversation';\nexport * from './hooks/useTranscriptions';\nexport * from './hooks/useConversationStatus';\nexport * from './hooks/useMicrophone';\nexport * from './hooks/useSpeaker';\nexport * from './hooks/useCamera';\nexport * from './hooks/useMediaRecorder';\nexport * from './hooks/useConversationTimer';\nexport * from './hooks/useAudioLevel';\nexport * from './hooks/useConversationEvents';\nexport * from './hooks/useUserActivity';\nexport * from './hooks/useAudio';\nexport * from './hooks/useScreenShare';\nexport * from './hooks/useConnectionState';\nexport * from './hooks/useActivityState';\nexport * from './hooks/usePictureInPicture';\nexport * from './hooks/useMediaPermissions';\nexport * from './hooks/useTools';\nexport * from './hooks/useParticipantTrack';\n\nexport * from './conversation/types';\n"],"mappings":"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
|
|
1
|
+
{"version":3,"names":["_types","require","Object","keys","forEach","key","exports","_LegendsPlatform","_LegendsPlatformQLess","_useTextChat","_useConversation","_useTranscriptions","_useConversationStatus","_useMicrophone","_useSpeaker","_useCamera","_useMediaRecorder","_useConversationTimer","_useAudioLevel","_useConversationEvents","_useUserActivity","_useAudio","_useScreenShare","_useConnectionState","_useActivityState","_usePictureInPicture","_useMediaPermissions","_useTools","_useParticipantTrack","_useSpeechActivityDetector","_types2"],"sources":["../../src/sdk.ts"],"sourcesContent":["export * from './types';\nexport * from './components/LegendsPlatform';\nexport * from './components/LegendsPlatformQLess';\n\nexport * from './hooks/useTextChat';\nexport * from './hooks/useConversation';\nexport * from './hooks/useTranscriptions';\nexport * from './hooks/useConversationStatus';\nexport * from './hooks/useMicrophone';\nexport * from './hooks/useSpeaker';\nexport * from './hooks/useCamera';\nexport * from './hooks/useMediaRecorder';\nexport * from './hooks/useConversationTimer';\nexport * from './hooks/useAudioLevel';\nexport * from './hooks/useConversationEvents';\nexport * from './hooks/useUserActivity';\nexport * from './hooks/useAudio';\nexport * from './hooks/useScreenShare';\nexport * from './hooks/useConnectionState';\nexport * from './hooks/useActivityState';\nexport * from './hooks/usePictureInPicture';\nexport * from './hooks/useMediaPermissions';\nexport * from './hooks/useTools';\nexport * from './hooks/useParticipantTrack';\nexport * from './hooks/useSpeechActivityDetector';\n\nexport * from './conversation/types';\n"],"mappings":"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","ignoreList":[]}
|
package/dist/esm/hooks/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export * from './useConversation';\nexport * from './useCreateConversation';\nexport * from './useConversationStatus';\nexport * from './useTextChat';\nexport * from './useConversationEvents';\nexport * from './useUserActivity';\nexport * from './useScreenShare';\nexport * from './usePictureInPicture';\nexport * from './useTools';\n"],"mappings":"AAAA,cAAc,mBAAmB;AACjC,cAAc,yBAAyB;AACvC,cAAc,yBAAyB;AACvC,cAAc,eAAe;AAC7B,cAAc,yBAAyB;AACvC,cAAc,mBAAmB;AACjC,cAAc,kBAAkB;AAChC,cAAc,uBAAuB;AACrC,cAAc,YAAY","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/hooks/index.ts"],"sourcesContent":["export * from './useConversation';\nexport * from './useCreateConversation';\nexport * from './useConversationStatus';\nexport * from './useTextChat';\nexport * from './useConversationEvents';\nexport * from './useUserActivity';\nexport * from './useScreenShare';\nexport * from './usePictureInPicture';\nexport * from './useTools';\nexport * from './useSpeechActivityDetector';\n"],"mappings":"AAAA,cAAc,mBAAmB;AACjC,cAAc,yBAAyB;AACvC,cAAc,yBAAyB;AACvC,cAAc,eAAe;AAC7B,cAAc,yBAAyB;AACvC,cAAc,mBAAmB;AACjC,cAAc,kBAAkB;AAChC,cAAc,uBAAuB;AACrC,cAAc,YAAY;AAC1B,cAAc,6BAA6B","ignoreList":[]}
|
|
@@ -8,4 +8,7 @@ export const SPEAKING_STATE_EVENT_MAP = {
|
|
|
8
8
|
listening: 'agentSpeakStop'
|
|
9
9
|
}
|
|
10
10
|
};
|
|
11
|
+
export const ACOUSTIC_USER_THRESHOLD_RMS = 0.025;
|
|
12
|
+
export const ACOUSTIC_USER_HANGOVER_MS = 400;
|
|
13
|
+
export const ACOUSTIC_AGENT_HANGOVER_MS = 900;
|
|
11
14
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SPEAKING_STATE_EVENT_MAP","STANDARD","speaking","listening","AGENT"],"sources":["../../../../../src/hooks/useConversation/livekit/constants.ts"],"sourcesContent":["import type { TurnDetectionData } from './types';\nimport type { ConversationEvent } from '../../useConversationEvents';\n\nexport const SPEAKING_STATE_EVENT_MAP: Record<\n TurnDetectionData['participantKind'],\n Record<TurnDetectionData['state'], ConversationEvent>\n> = {\n STANDARD: {\n speaking: 'userSpeakStart',\n listening: 'userSpeakStop',\n },\n AGENT: {\n speaking: 'agentSpeakStart',\n listening: 'agentSpeakStop',\n },\n};\n"],"mappings":"AAGA,OAAO,MAAMA,wBAGZ,GAAG;EACFC,QAAQ,EAAE;IACRC,QAAQ,EAAE,gBAAgB;IAC1BC,SAAS,EAAE;EACb,CAAC;EACDC,KAAK,EAAE;IACLF,QAAQ,EAAE,iBAAiB;IAC3BC,SAAS,EAAE;EACb;AACF,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["SPEAKING_STATE_EVENT_MAP","STANDARD","speaking","listening","AGENT","ACOUSTIC_USER_THRESHOLD_RMS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_AGENT_HANGOVER_MS"],"sources":["../../../../../src/hooks/useConversation/livekit/constants.ts"],"sourcesContent":["import type { TurnDetectionData } from './types';\nimport type { ConversationEvent } from '../../useConversationEvents';\n\nexport const SPEAKING_STATE_EVENT_MAP: Record<\n TurnDetectionData['participantKind'],\n Record<TurnDetectionData['state'], ConversationEvent>\n> = {\n STANDARD: {\n speaking: 'userSpeakStart',\n listening: 'userSpeakStop',\n },\n AGENT: {\n speaking: 'agentSpeakStart',\n listening: 'agentSpeakStop',\n },\n};\n\nexport const ACOUSTIC_USER_THRESHOLD_RMS = 0.025;\nexport const ACOUSTIC_USER_HANGOVER_MS = 400;\nexport const ACOUSTIC_AGENT_HANGOVER_MS = 900;\n"],"mappings":"AAGA,OAAO,MAAMA,wBAGZ,GAAG;EACFC,QAAQ,EAAE;IACRC,QAAQ,EAAE,gBAAgB;IAC1BC,SAAS,EAAE;EACb,CAAC;EACDC,KAAK,EAAE;IACLF,QAAQ,EAAE,iBAAiB;IAC3BC,SAAS,EAAE;EACb;AACF,CAAC;AAED,OAAO,MAAME,2BAA2B,GAAG,KAAK;AAChD,OAAO,MAAMC,yBAAyB,GAAG,GAAG;AAC5C,OAAO,MAAMC,0BAA0B,GAAG,GAAG","ignoreList":[]}
|
|
@@ -7,9 +7,11 @@ import { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';
|
|
|
7
7
|
import { useAtom, useAtomValue, useSetAtom } from 'jotai';
|
|
8
8
|
import { state } from '../../../conversation';
|
|
9
9
|
import { useCreateConversation } from '../../useCreateConversation';
|
|
10
|
+
import { useSpeechActivityDetector } from '../../useSpeechActivityDetector';
|
|
10
11
|
import { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';
|
|
11
12
|
import { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';
|
|
12
13
|
import { checkIsTurnDetectionData, checkIsInactivityWarningData, checkIsInactivityTimeoutData, checkIsToolCallsData, createLivekitToolAdapter, decodeDataPayload, findJoinedAgentParticipant, mergeTranscriptions, publishConversationDataMessage, safeStringify, shouldHandleParticipantConnected } from './utils';
|
|
14
|
+
import { ACOUSTIC_AGENT_HANGOVER_MS, ACOUSTIC_USER_HANGOVER_MS, ACOUSTIC_USER_THRESHOLD_RMS } from './constants';
|
|
13
15
|
export function useConversation(_ref) {
|
|
14
16
|
var _conversation$data2;
|
|
15
17
|
let _ref$autoJoin = _ref.autoJoin,
|
|
@@ -68,8 +70,11 @@ export function useConversation(_ref) {
|
|
|
68
70
|
const setAgentActivityState = useSetAtom(state.agentActivityState);
|
|
69
71
|
const setUserActivityState = useSetAtom(state.userActivityState);
|
|
70
72
|
const emitEvent = useEmitConversationEvent();
|
|
71
|
-
const userStopRef = useRef(null);
|
|
72
73
|
const inactivityTimeoutRef = useRef(false);
|
|
74
|
+
const acousticPhaseRef = useRef('idle');
|
|
75
|
+
const acousticT0Ref = useRef(null);
|
|
76
|
+
const latestTurnMetadataRef = useRef({});
|
|
77
|
+
const isConnectedRef = useRef(false);
|
|
73
78
|
const timer = useTimer({
|
|
74
79
|
autoStart: false,
|
|
75
80
|
onExpire: handleExpire,
|
|
@@ -176,14 +181,11 @@ export function useConversation(_ref) {
|
|
|
176
181
|
switch (participantKind) {
|
|
177
182
|
case 'STANDARD':
|
|
178
183
|
if (eventState === 'listening') {
|
|
179
|
-
|
|
180
|
-
ts: performance.now(),
|
|
184
|
+
latestTurnMetadataRef.current = {
|
|
181
185
|
turnDetectionStrategy: data.turnDetectionStrategy,
|
|
182
186
|
sequence: data.sequence,
|
|
183
187
|
speechId: data.speechId
|
|
184
188
|
};
|
|
185
|
-
} else {
|
|
186
|
-
userStopRef.current = null;
|
|
187
189
|
}
|
|
188
190
|
emitEvent(eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop', {
|
|
189
191
|
conversationId: conversationId
|
|
@@ -191,16 +193,11 @@ export function useConversation(_ref) {
|
|
|
191
193
|
setUserActivityState(eventState);
|
|
192
194
|
break;
|
|
193
195
|
case 'AGENT':
|
|
194
|
-
if (
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
turnDetectionStrategy: userStopRef.current.turnDetectionStrategy,
|
|
200
|
-
sequence: userStopRef.current.sequence,
|
|
201
|
-
speechId: data.speechId ?? userStopRef.current.speechId
|
|
202
|
-
});
|
|
203
|
-
userStopRef.current = null;
|
|
196
|
+
if (data.speechId) {
|
|
197
|
+
latestTurnMetadataRef.current = {
|
|
198
|
+
...latestTurnMetadataRef.current,
|
|
199
|
+
speechId: data.speechId
|
|
200
|
+
};
|
|
204
201
|
}
|
|
205
202
|
emitEvent(eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop', {
|
|
206
203
|
conversationId: conversationId
|
|
@@ -209,18 +206,69 @@ export function useConversation(_ref) {
|
|
|
209
206
|
break;
|
|
210
207
|
}
|
|
211
208
|
}
|
|
212
|
-
function
|
|
209
|
+
function handleAcousticUserOnset() {
|
|
210
|
+
if (!isConnectedRef.current) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (acousticPhaseRef.current === 'waitingForAgent') {
|
|
214
|
+
acousticPhaseRef.current = 'idle';
|
|
215
|
+
acousticT0Ref.current = null;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function handleAcousticUserOffset(timestampMs) {
|
|
219
|
+
if (!isConnectedRef.current || acousticPhaseRef.current !== 'idle') {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
acousticT0Ref.current = timestampMs - ACOUSTIC_USER_HANGOVER_MS;
|
|
223
|
+
acousticPhaseRef.current = 'waitingForAgent';
|
|
224
|
+
}
|
|
225
|
+
function handleAcousticAgentOnset(timestampMs) {
|
|
213
226
|
var _conversationRef$curr2;
|
|
214
|
-
|
|
227
|
+
if (!isConnectedRef.current || acousticPhaseRef.current !== 'waitingForAgent' || acousticT0Ref.current == null) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const latencyMs = timestampMs - acousticT0Ref.current;
|
|
231
|
+
acousticT0Ref.current = null;
|
|
232
|
+
acousticPhaseRef.current = 'busy';
|
|
233
|
+
if (latencyMs < 0 || latencyMs > 15000) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
emitEvent('responseLatency', {
|
|
215
237
|
conversationId: (_conversationRef$curr2 = conversationRef.current) == null ? void 0 : _conversationRef$curr2.id,
|
|
238
|
+
latencyMs,
|
|
239
|
+
turnDetectionStrategy: latestTurnMetadataRef.current.turnDetectionStrategy,
|
|
240
|
+
sequence: latestTurnMetadataRef.current.sequence,
|
|
241
|
+
speechId: latestTurnMetadataRef.current.speechId
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
function handleAcousticAgentOffset() {
|
|
245
|
+
acousticPhaseRef.current = 'idle';
|
|
246
|
+
}
|
|
247
|
+
useSpeechActivityDetector({
|
|
248
|
+
source: 'user',
|
|
249
|
+
onSpeechStart: handleAcousticUserOnset,
|
|
250
|
+
onSpeechEnd: handleAcousticUserOffset,
|
|
251
|
+
thresholdRms: ACOUSTIC_USER_THRESHOLD_RMS,
|
|
252
|
+
hangoverMs: ACOUSTIC_USER_HANGOVER_MS
|
|
253
|
+
});
|
|
254
|
+
useSpeechActivityDetector({
|
|
255
|
+
source: 'agent',
|
|
256
|
+
onSpeechStart: handleAcousticAgentOnset,
|
|
257
|
+
onSpeechEnd: handleAcousticAgentOffset,
|
|
258
|
+
hangoverMs: ACOUSTIC_AGENT_HANGOVER_MS
|
|
259
|
+
});
|
|
260
|
+
function handleInactivityWarningEvent(data) {
|
|
261
|
+
var _conversationRef$curr3;
|
|
262
|
+
emitEvent('inactivityWarning', {
|
|
263
|
+
conversationId: (_conversationRef$curr3 = conversationRef.current) == null ? void 0 : _conversationRef$curr3.id,
|
|
216
264
|
gracePeriodSec: data.grace_period_sec
|
|
217
265
|
});
|
|
218
266
|
}
|
|
219
267
|
function handleInactivityTimeoutEvent(_data) {
|
|
220
|
-
var _conversationRef$
|
|
268
|
+
var _conversationRef$curr4;
|
|
221
269
|
inactivityTimeoutRef.current = true;
|
|
222
270
|
emitEvent('inactivityTimeout', {
|
|
223
|
-
conversationId: (_conversationRef$
|
|
271
|
+
conversationId: (_conversationRef$curr4 = conversationRef.current) == null ? void 0 : _conversationRef$curr4.id
|
|
224
272
|
});
|
|
225
273
|
}
|
|
226
274
|
async function handleToolCallsEvent(data) {
|
|
@@ -256,11 +304,12 @@ export function useConversation(_ref) {
|
|
|
256
304
|
}
|
|
257
305
|
}
|
|
258
306
|
function handleConnectedEvent() {
|
|
259
|
-
var _conversationRef$
|
|
307
|
+
var _conversationRef$curr5;
|
|
308
|
+
isConnectedRef.current = true;
|
|
260
309
|
setUserConnectionState('joined');
|
|
261
310
|
setAgentConnectionState('joining');
|
|
262
311
|
emitEvent('callStarted', {
|
|
263
|
-
conversationId: (_conversationRef$
|
|
312
|
+
conversationId: (_conversationRef$curr5 = conversationRef.current) == null ? void 0 : _conversationRef$curr5.id
|
|
264
313
|
});
|
|
265
314
|
}
|
|
266
315
|
async function handleEncryptionErrorEvent(error) {
|
|
@@ -268,7 +317,10 @@ export function useConversation(_ref) {
|
|
|
268
317
|
setConversationStatus('error');
|
|
269
318
|
}
|
|
270
319
|
function handleDisconnectedEvent(reason) {
|
|
271
|
-
|
|
320
|
+
isConnectedRef.current = false;
|
|
321
|
+
acousticPhaseRef.current = 'idle';
|
|
322
|
+
acousticT0Ref.current = null;
|
|
323
|
+
latestTurnMetadataRef.current = {};
|
|
272
324
|
setAgentActivityState('idle');
|
|
273
325
|
setAgentConnectionState('idle');
|
|
274
326
|
setUserActivityState('idle');
|
|
@@ -296,18 +348,18 @@ export function useConversation(_ref) {
|
|
|
296
348
|
}
|
|
297
349
|
}
|
|
298
350
|
function handleAgentJoin(participant) {
|
|
299
|
-
var _conversationRef$
|
|
351
|
+
var _conversationRef$curr6;
|
|
300
352
|
setAgentConnectionState('joined');
|
|
301
353
|
emitEvent('agentJoined', {
|
|
302
|
-
conversationId: (_conversationRef$
|
|
354
|
+
conversationId: (_conversationRef$curr6 = conversationRef.current) == null ? void 0 : _conversationRef$curr6.id,
|
|
303
355
|
participant
|
|
304
356
|
});
|
|
305
357
|
}
|
|
306
358
|
function handleParticipantDisconnectedEvent(participant) {
|
|
307
|
-
var _conversationRef$
|
|
359
|
+
var _conversationRef$curr7;
|
|
308
360
|
setAgentConnectionState('left');
|
|
309
361
|
emitEvent('agentLeft', {
|
|
310
|
-
conversationId: (_conversationRef$
|
|
362
|
+
conversationId: (_conversationRef$curr7 = conversationRef.current) == null ? void 0 : _conversationRef$curr7.id,
|
|
311
363
|
participant
|
|
312
364
|
});
|
|
313
365
|
}
|
|
@@ -316,13 +368,13 @@ export function useConversation(_ref) {
|
|
|
316
368
|
return;
|
|
317
369
|
}
|
|
318
370
|
try {
|
|
319
|
-
var _conversationRef$
|
|
371
|
+
var _conversationRef$curr8;
|
|
320
372
|
setUserConnectionState('leaving');
|
|
321
373
|
await (room == null ? void 0 : room.disconnect(true));
|
|
322
374
|
setConversationStatus('destroyed');
|
|
323
375
|
setJoinedAt(undefined);
|
|
324
376
|
emitEvent('callEnded', {
|
|
325
|
-
conversationId: (_conversationRef$
|
|
377
|
+
conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id
|
|
326
378
|
});
|
|
327
379
|
} catch (error) {
|
|
328
380
|
console.error('Failed to leave', error);
|
|
@@ -330,18 +382,18 @@ export function useConversation(_ref) {
|
|
|
330
382
|
}
|
|
331
383
|
}
|
|
332
384
|
async function handleExpire() {
|
|
333
|
-
var _conversationRef$
|
|
385
|
+
var _conversationRef$curr9, _conversationRef$curr0;
|
|
334
386
|
emitEvent('timeExceeded', {
|
|
335
|
-
conversationId: (_conversationRef$
|
|
336
|
-
limit: (_conversationRef$
|
|
387
|
+
conversationId: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.id,
|
|
388
|
+
limit: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.limit
|
|
337
389
|
});
|
|
338
390
|
await leave();
|
|
339
391
|
setConversationStatus('exceeded');
|
|
340
392
|
}
|
|
341
393
|
async function interrupt() {
|
|
342
|
-
var _conversationRef$
|
|
394
|
+
var _conversationRef$curr1;
|
|
343
395
|
emitEvent('interrupt', {
|
|
344
|
-
conversationId: (_conversationRef$
|
|
396
|
+
conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id
|
|
345
397
|
});
|
|
346
398
|
await publishConversationDataMessage(room, {}, 'interrupt');
|
|
347
399
|
}
|
|
@@ -351,7 +403,7 @@ export function useConversation(_ref) {
|
|
|
351
403
|
}, 'inactivity_dismiss');
|
|
352
404
|
}
|
|
353
405
|
async function send(message, attachments) {
|
|
354
|
-
var _conversationRef$
|
|
406
|
+
var _conversationRef$curr10;
|
|
355
407
|
if (attachments === void 0) {
|
|
356
408
|
attachments = [];
|
|
357
409
|
}
|
|
@@ -362,7 +414,7 @@ export function useConversation(_ref) {
|
|
|
362
414
|
}
|
|
363
415
|
}));
|
|
364
416
|
emitEvent('userSendMessage', {
|
|
365
|
-
conversationId: (_conversationRef$
|
|
417
|
+
conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
|
|
366
418
|
message
|
|
367
419
|
});
|
|
368
420
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useCreateConversation","useEmitConversationEvent","useToolCallingRuntime","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsToolCallsData","createLivekitToolAdapter","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","toolRuntime","toolAdapter","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","userStopRef","inactivityTimeoutRef","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","undefined","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","source","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","ts","performance","now","turnDetectionStrategy","sequence","speechId","latencyMs","handleInactivityWarningEvent","_conversationRef$curr2","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr3","handleToolCallsEvent","resolveIncomingToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","payload","decoded","_ref2","Promise","resolve","catch","handleConnectedEvent","_conversationRef$curr4","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr5","handleParticipantDisconnectedEvent","_conversationRef$curr6","leave","_conversationRef$curr7","disconnect","_conversationRef$curr8","_conversationRef$curr9","interrupt","_conversationRef$curr0","dismissInactivity","send","attachments","_conversationRef$curr1","sendText","topic","attributes","on","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} 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 {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n ToolCallsData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsToolCallsData,\n createLivekitToolAdapter,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({ type, config });\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 toolRuntime = useToolCallingRuntime();\n const toolAdapter = createLivekitToolAdapter(room);\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\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\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 userStopRef = useRef<{\n ts: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n } | null>(null);\n const inactivityTimeoutRef = useRef(false);\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 userStopRef.current = {\n ts: performance.now(),\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n } else {\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (eventState === 'speaking' && userStopRef.current) {\n const latencyMs = performance.now() - userStopRef.current.ts;\n emitEvent('responseLatency', {\n conversationId: conversationId!,\n latencyMs,\n turnDetectionStrategy: userStopRef.current.turnDetectionStrategy,\n sequence: userStopRef.current.sequence,\n speechId: data.speechId ?? userStopRef.current.speechId,\n });\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\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 handleToolCallsEvent(data: ToolCallsData) {\n await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsToolCallsData,\n handle: handleToolCallsEvent as (data: unknown) => 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(payload: Uint8Array) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\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 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 userStopRef.current = null;\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 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 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 }\n\n function unregisterRoomEvents() {\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","useCreateConversation","useSpeechActivityDetector","useEmitConversationEvent","useToolCallingRuntime","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsToolCallsData","createLivekitToolAdapter","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","toolRuntime","toolAdapter","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","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","undefined","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","source","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr3","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr4","handleToolCallsEvent","resolveIncomingToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","payload","decoded","_ref2","Promise","resolve","catch","handleConnectedEvent","_conversationRef$curr5","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr6","handleParticipantDisconnectedEvent","_conversationRef$curr7","leave","_conversationRef$curr8","disconnect","_conversationRef$curr9","_conversationRef$curr0","interrupt","_conversationRef$curr1","dismissInactivity","send","attachments","_conversationRef$curr10","sendText","topic","attributes","on","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} 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 {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n ToolCallsData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsToolCallsData,\n createLivekitToolAdapter,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\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} from './constants';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({ type, config });\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 toolRuntime = useToolCallingRuntime();\n const toolAdapter = createLivekitToolAdapter(room);\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 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\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\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 handleToolCallsEvent(data: ToolCallsData) {\n await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsToolCallsData,\n handle: handleToolCallsEvent as (data: unknown) => 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(payload: Uint8Array) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\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 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 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 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 }\n\n function unregisterRoomEvents() {\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":[]}
|