@wix/legends-platform-sdk 1.27.0 → 1.28.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/README.md +2 -2
- package/dist/cjs/conversation/types.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js +30 -16
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js +8 -1
- package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
- package/dist/cjs/hooks/useConversationEvents/types.js.map +1 -1
- package/dist/esm/conversation/types.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/useConversation.js +31 -17
- package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js +7 -1
- package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
- package/dist/esm/hooks/useConversationEvents/types.js.map +1 -1
- package/dist/types/conversation/types.d.ts +1 -1
- package/dist/types/conversation/types.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts +1 -0
- package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts.map +1 -1
- package/dist/types/hooks/useConversationEvents/types.d.ts +4 -0
- package/dist/types/hooks/useConversationEvents/types.d.ts.map +1 -1
- package/package.json +2 -2
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' \| 'voice-not-found' \| 'initialization-error' \| 'error'` | Current conversation state |
|
|
108
|
+
| `status` | `'pending' \| 'created' \| 'destroying' \| 'destroyed' \| 'exceeded' \| 'inactivity-timeout' \| 'credit-exhausted' \| 'conversation-limit-reached' \| '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' | 'voice-not-found' | 'initialization-error' | 'error'
|
|
160
|
+
// | 'inactivity-timeout' | 'credit-exhausted' | 'conversation-limit-reached' | 'voice-not-found' | 'initialization-error' | 'error'
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
#### `useConversationTimer()`
|
|
@@ -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 // 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 // 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":[]}
|
|
@@ -76,6 +76,7 @@ function useConversation({
|
|
|
76
76
|
const emitEvent = (0, _useEmitConversationEvent.useEmitConversationEvent)();
|
|
77
77
|
const inactivityTimeoutRef = (0, _react.useRef)(false);
|
|
78
78
|
const creditExhaustedRef = (0, _react.useRef)(false);
|
|
79
|
+
const conversationLimitReachedRef = (0, _react.useRef)(false);
|
|
79
80
|
const acousticPhaseRef = (0, _react.useRef)('idle');
|
|
80
81
|
const acousticT0Ref = (0, _react.useRef)(null);
|
|
81
82
|
const latestTurnMetadataRef = (0, _react.useRef)({});
|
|
@@ -353,6 +354,14 @@ function useConversation({
|
|
|
353
354
|
});
|
|
354
355
|
return;
|
|
355
356
|
}
|
|
357
|
+
if ((0, _utils.checkIsConversationLimitReachedMessage)(decoded, topic)) {
|
|
358
|
+
var _conversationRef$curr7;
|
|
359
|
+
conversationLimitReachedRef.current = true;
|
|
360
|
+
emitEvent('conversationLimitReached', {
|
|
361
|
+
conversationId: (_conversationRef$curr7 = conversationRef.current) == null ? void 0 : _conversationRef$curr7.id
|
|
362
|
+
});
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
356
365
|
for (const {
|
|
357
366
|
guard,
|
|
358
367
|
handle
|
|
@@ -366,12 +375,12 @@ function useConversation({
|
|
|
366
375
|
}
|
|
367
376
|
}
|
|
368
377
|
function handleConnectedEvent() {
|
|
369
|
-
var _conversationRef$
|
|
378
|
+
var _conversationRef$curr8;
|
|
370
379
|
isConnectedRef.current = true;
|
|
371
380
|
setUserConnectionState('joined');
|
|
372
381
|
setAgentConnectionState('joining');
|
|
373
382
|
emitEvent('callStarted', {
|
|
374
|
-
conversationId: (_conversationRef$
|
|
383
|
+
conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id
|
|
375
384
|
});
|
|
376
385
|
}
|
|
377
386
|
async function handleEncryptionErrorEvent(error) {
|
|
@@ -399,6 +408,11 @@ function useConversation({
|
|
|
399
408
|
setConversationStatus('credit-exhausted');
|
|
400
409
|
return;
|
|
401
410
|
}
|
|
411
|
+
if (conversationLimitReachedRef.current) {
|
|
412
|
+
conversationLimitReachedRef.current = false;
|
|
413
|
+
setConversationStatus('conversation-limit-reached');
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
402
416
|
switch (reason) {
|
|
403
417
|
case _livekitClient.DisconnectReason.CLIENT_INITIATED:
|
|
404
418
|
break;
|
|
@@ -417,18 +431,18 @@ function useConversation({
|
|
|
417
431
|
}
|
|
418
432
|
}
|
|
419
433
|
function handleAgentJoin(participant) {
|
|
420
|
-
var _conversationRef$
|
|
434
|
+
var _conversationRef$curr9;
|
|
421
435
|
setAgentConnectionState('joined');
|
|
422
436
|
emitEvent('agentJoined', {
|
|
423
|
-
conversationId: (_conversationRef$
|
|
437
|
+
conversationId: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.id,
|
|
424
438
|
participant
|
|
425
439
|
});
|
|
426
440
|
}
|
|
427
441
|
function handleParticipantDisconnectedEvent(participant) {
|
|
428
|
-
var _conversationRef$
|
|
442
|
+
var _conversationRef$curr0;
|
|
429
443
|
setAgentConnectionState('left');
|
|
430
444
|
emitEvent('agentLeft', {
|
|
431
|
-
conversationId: (_conversationRef$
|
|
445
|
+
conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id,
|
|
432
446
|
participant
|
|
433
447
|
});
|
|
434
448
|
}
|
|
@@ -437,13 +451,13 @@ function useConversation({
|
|
|
437
451
|
return;
|
|
438
452
|
}
|
|
439
453
|
try {
|
|
440
|
-
var _conversationRef$
|
|
454
|
+
var _conversationRef$curr1;
|
|
441
455
|
setUserConnectionState('leaving');
|
|
442
456
|
await (room == null ? void 0 : room.disconnect(true));
|
|
443
457
|
setConversationStatus('destroyed');
|
|
444
458
|
setJoinedAt(undefined);
|
|
445
459
|
emitEvent('callEnded', {
|
|
446
|
-
conversationId: (_conversationRef$
|
|
460
|
+
conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id
|
|
447
461
|
});
|
|
448
462
|
} catch (error) {
|
|
449
463
|
console.error('Failed to leave', error);
|
|
@@ -451,22 +465,22 @@ function useConversation({
|
|
|
451
465
|
}
|
|
452
466
|
}
|
|
453
467
|
async function handleExpire() {
|
|
454
|
-
var _conversationRef$
|
|
468
|
+
var _conversationRef$curr10, _conversationRef$curr11;
|
|
455
469
|
// The duration timer keeps running after the call ends.
|
|
456
|
-
if (conversationStatus === 'credit-exhausted') {
|
|
470
|
+
if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached') {
|
|
457
471
|
return;
|
|
458
472
|
}
|
|
459
473
|
emitEvent('timeExceeded', {
|
|
460
|
-
conversationId: (_conversationRef$
|
|
461
|
-
limit: (_conversationRef$
|
|
474
|
+
conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
|
|
475
|
+
limit: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.limit
|
|
462
476
|
});
|
|
463
477
|
await leave();
|
|
464
478
|
setConversationStatus('exceeded');
|
|
465
479
|
}
|
|
466
480
|
async function interrupt() {
|
|
467
|
-
var _conversationRef$
|
|
481
|
+
var _conversationRef$curr12;
|
|
468
482
|
emitEvent('interrupt', {
|
|
469
|
-
conversationId: (_conversationRef$
|
|
483
|
+
conversationId: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.id
|
|
470
484
|
});
|
|
471
485
|
await (0, _utils.publishConversationDataMessage)(room, {}, 'interrupt');
|
|
472
486
|
}
|
|
@@ -476,7 +490,7 @@ function useConversation({
|
|
|
476
490
|
}, 'inactivity_dismiss');
|
|
477
491
|
}
|
|
478
492
|
async function send(message, attachments = []) {
|
|
479
|
-
var _conversationRef$
|
|
493
|
+
var _conversationRef$curr13;
|
|
480
494
|
await (room == null ? void 0 : room.localParticipant.sendText(message, {
|
|
481
495
|
topic: 'lk.chat',
|
|
482
496
|
attributes: {
|
|
@@ -484,7 +498,7 @@ function useConversation({
|
|
|
484
498
|
}
|
|
485
499
|
}));
|
|
486
500
|
emitEvent('userSendMessage', {
|
|
487
|
-
conversationId: (_conversationRef$
|
|
501
|
+
conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id,
|
|
488
502
|
message
|
|
489
503
|
});
|
|
490
504
|
}
|
|
@@ -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","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","resolve","catch","handleConnectedEvent","_conversationRef$curr7","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_conversationRef$curr8","handleParticipantDisconnectedEvent","_conversationRef$curr9","leave","_conversationRef$curr0","disconnect","_conversationRef$curr1","_conversationRef$curr10","interrupt","_conversationRef$curr11","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr12","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 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 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 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 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 (conversationStatus === 'credit-exhausted') {\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","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,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
+
exports.checkIsConversationLimitReachedMessage = checkIsConversationLimitReachedMessage;
|
|
4
5
|
exports.checkIsCreditExhaustedMessage = checkIsCreditExhaustedMessage;
|
|
5
6
|
exports.checkIsInactivityTimeoutData = checkIsInactivityTimeoutData;
|
|
6
7
|
exports.checkIsInactivityWarningData = checkIsInactivityWarningData;
|
|
@@ -23,7 +24,13 @@ function checkIsInactivityWarningData(data) {
|
|
|
23
24
|
function checkIsInactivityTimeoutData(data) {
|
|
24
25
|
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'inactivity_timeout';
|
|
25
26
|
}
|
|
27
|
+
function checkIsBillingEndedMessage(data, topic, reason) {
|
|
28
|
+
return topic === 'billing' && typeof data === 'object' && data !== null && data.type === 'ended' && data.reason === reason;
|
|
29
|
+
}
|
|
26
30
|
function checkIsCreditExhaustedMessage(data, topic) {
|
|
27
|
-
return
|
|
31
|
+
return checkIsBillingEndedMessage(data, topic, 'insufficient_credit');
|
|
32
|
+
}
|
|
33
|
+
function checkIsConversationLimitReachedMessage(data, topic) {
|
|
34
|
+
return checkIsBillingEndedMessage(data, topic, 'limit_reached');
|
|
28
35
|
}
|
|
29
36
|
//# sourceMappingURL=dataChannel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","
|
|
1
|
+
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","checkIsBillingEndedMessage","topic","reason","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsInactivityTimeoutData(\n data: unknown,\n): data is InactivityTimeoutData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_timeout'\n );\n}\n\nfunction checkIsBillingEndedMessage(\n data: unknown,\n topic: string | undefined,\n reason: string,\n): boolean {\n return (\n topic === 'billing' &&\n typeof data === 'object' &&\n data !== null &&\n (data as Record<string, unknown>).type === 'ended' &&\n (data as Record<string, unknown>).reason === reason\n );\n}\n\nexport function checkIsCreditExhaustedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'insufficient_credit');\n}\n\nexport function checkIsConversationLimitReachedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'limit_reached');\n}\n"],"mappings":";;;;;;;;;AAMO,SAASA,iBAAiBA,CAACC,IAAgB,EAAW;EAC3D,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EACnD,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,IAAI;EACb;AACF;AAEO,SAASE,wBAAwBA,CACtCP,IAAa,EACc;EAC3B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,iBAAiB,IAAIA,IAAI,IACzB,OAAO,IAAIA,IAAI;AAEnB;AAEO,SAASQ,4BAA4BA,CAC1CR,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB,IAC/D,kBAAkB,IAAIT,IAAI,IAC1B,OAAQA,IAAI,CAA6BU,gBAAgB,KAAK,QAAQ;AAE1E;AAEO,SAASC,4BAA4BA,CAC1CX,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB;AAEnE;AAEA,SAASG,0BAA0BA,CACjCZ,IAAa,EACba,KAAyB,EACzBC,MAAc,EACL;EACT,OACED,KAAK,KAAK,SAAS,IACnB,OAAOb,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACZA,IAAI,CAA6BS,IAAI,KAAK,OAAO,IACjDT,IAAI,CAA6Bc,MAAM,KAAKA,MAAM;AAEvD;AAEO,SAASC,6BAA6BA,CAC3Cf,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,qBAAqB,CAAC;AACvE;AAEO,SAASG,sCAAsCA,CACpDhB,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,eAAe,CAAC;AACjE","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport type { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type ConversationTurnLatencyPayload = {\n conversationId: string;\n speechId?: string;\n sequence?: number;\n clientAcousticLatencyMs: number;\n rttMs?: number;\n jitterBufferDelayMs?: number;\n userPacketsLost?: number;\n agentPacketsLost?: number;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type CreditExhaustedPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n conversationTurnLatency: ConversationTurnLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n creditExhausted: CreditExhaustedPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport type { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type ConversationTurnLatencyPayload = {\n conversationId: string;\n speechId?: string;\n sequence?: number;\n clientAcousticLatencyMs: number;\n rttMs?: number;\n jitterBufferDelayMs?: number;\n userPacketsLost?: number;\n agentPacketsLost?: number;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type CreditExhaustedPayload = {\n conversationId: string;\n};\n\nexport type ConversationLimitReachedPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n conversationTurnLatency: ConversationTurnLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n creditExhausted: CreditExhaustedPayload;\n conversationLimitReached: ConversationLimitReachedPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","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 // 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 // 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":[]}
|
|
@@ -13,7 +13,7 @@ import { useParticipantTrack, Source, getTrackStats, parseTrackStats } from '../
|
|
|
13
13
|
import { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';
|
|
14
14
|
import { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';
|
|
15
15
|
import { extractToolErrorMessage } from '../../useTools/utils/serialize';
|
|
16
|
-
import { checkIsTurnDetectionData, checkIsInactivityWarningData, checkIsInactivityTimeoutData, checkIsCreditExhaustedMessage, buildToolDefinitions, decodeDataPayload, findJoinedAgentParticipant, mergeTranscriptions, parseFunctionCallPayload, publishConversationDataMessage, safeStringify, shouldHandleParticipantConnected } from './utils';
|
|
16
|
+
import { checkIsTurnDetectionData, checkIsInactivityWarningData, checkIsInactivityTimeoutData, checkIsCreditExhaustedMessage, checkIsConversationLimitReachedMessage, buildToolDefinitions, decodeDataPayload, findJoinedAgentParticipant, mergeTranscriptions, parseFunctionCallPayload, publishConversationDataMessage, safeStringify, shouldHandleParticipantConnected } from './utils';
|
|
17
17
|
import { ACOUSTIC_AGENT_HANGOVER_MS, ACOUSTIC_USER_HANGOVER_MS, ACOUSTIC_USER_THRESHOLD_RMS, EXECUTE_TOOL_RPC_METHOD, GET_TOOLS_RPC_METHOD } from './constants';
|
|
18
18
|
export function useConversation(_ref) {
|
|
19
19
|
var _conversation$data2;
|
|
@@ -82,6 +82,7 @@ export function useConversation(_ref) {
|
|
|
82
82
|
const emitEvent = useEmitConversationEvent();
|
|
83
83
|
const inactivityTimeoutRef = useRef(false);
|
|
84
84
|
const creditExhaustedRef = useRef(false);
|
|
85
|
+
const conversationLimitReachedRef = useRef(false);
|
|
85
86
|
const acousticPhaseRef = useRef('idle');
|
|
86
87
|
const acousticT0Ref = useRef(null);
|
|
87
88
|
const latestTurnMetadataRef = useRef({});
|
|
@@ -360,6 +361,14 @@ export function useConversation(_ref) {
|
|
|
360
361
|
});
|
|
361
362
|
return;
|
|
362
363
|
}
|
|
364
|
+
if (checkIsConversationLimitReachedMessage(decoded, topic)) {
|
|
365
|
+
var _conversationRef$curr7;
|
|
366
|
+
conversationLimitReachedRef.current = true;
|
|
367
|
+
emitEvent('conversationLimitReached', {
|
|
368
|
+
conversationId: (_conversationRef$curr7 = conversationRef.current) == null ? void 0 : _conversationRef$curr7.id
|
|
369
|
+
});
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
363
372
|
for (const _ref2 of dataChannelHandlers) {
|
|
364
373
|
const guard = _ref2.guard;
|
|
365
374
|
const handle = _ref2.handle;
|
|
@@ -372,12 +381,12 @@ export function useConversation(_ref) {
|
|
|
372
381
|
}
|
|
373
382
|
}
|
|
374
383
|
function handleConnectedEvent() {
|
|
375
|
-
var _conversationRef$
|
|
384
|
+
var _conversationRef$curr8;
|
|
376
385
|
isConnectedRef.current = true;
|
|
377
386
|
setUserConnectionState('joined');
|
|
378
387
|
setAgentConnectionState('joining');
|
|
379
388
|
emitEvent('callStarted', {
|
|
380
|
-
conversationId: (_conversationRef$
|
|
389
|
+
conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id
|
|
381
390
|
});
|
|
382
391
|
}
|
|
383
392
|
async function handleEncryptionErrorEvent(error) {
|
|
@@ -405,6 +414,11 @@ export function useConversation(_ref) {
|
|
|
405
414
|
setConversationStatus('credit-exhausted');
|
|
406
415
|
return;
|
|
407
416
|
}
|
|
417
|
+
if (conversationLimitReachedRef.current) {
|
|
418
|
+
conversationLimitReachedRef.current = false;
|
|
419
|
+
setConversationStatus('conversation-limit-reached');
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
408
422
|
switch (reason) {
|
|
409
423
|
case DisconnectReason.CLIENT_INITIATED:
|
|
410
424
|
break;
|
|
@@ -423,18 +437,18 @@ export function useConversation(_ref) {
|
|
|
423
437
|
}
|
|
424
438
|
}
|
|
425
439
|
function handleAgentJoin(participant) {
|
|
426
|
-
var _conversationRef$
|
|
440
|
+
var _conversationRef$curr9;
|
|
427
441
|
setAgentConnectionState('joined');
|
|
428
442
|
emitEvent('agentJoined', {
|
|
429
|
-
conversationId: (_conversationRef$
|
|
443
|
+
conversationId: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.id,
|
|
430
444
|
participant
|
|
431
445
|
});
|
|
432
446
|
}
|
|
433
447
|
function handleParticipantDisconnectedEvent(participant) {
|
|
434
|
-
var _conversationRef$
|
|
448
|
+
var _conversationRef$curr0;
|
|
435
449
|
setAgentConnectionState('left');
|
|
436
450
|
emitEvent('agentLeft', {
|
|
437
|
-
conversationId: (_conversationRef$
|
|
451
|
+
conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id,
|
|
438
452
|
participant
|
|
439
453
|
});
|
|
440
454
|
}
|
|
@@ -443,13 +457,13 @@ export function useConversation(_ref) {
|
|
|
443
457
|
return;
|
|
444
458
|
}
|
|
445
459
|
try {
|
|
446
|
-
var _conversationRef$
|
|
460
|
+
var _conversationRef$curr1;
|
|
447
461
|
setUserConnectionState('leaving');
|
|
448
462
|
await (room == null ? void 0 : room.disconnect(true));
|
|
449
463
|
setConversationStatus('destroyed');
|
|
450
464
|
setJoinedAt(undefined);
|
|
451
465
|
emitEvent('callEnded', {
|
|
452
|
-
conversationId: (_conversationRef$
|
|
466
|
+
conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id
|
|
453
467
|
});
|
|
454
468
|
} catch (error) {
|
|
455
469
|
console.error('Failed to leave', error);
|
|
@@ -457,22 +471,22 @@ export function useConversation(_ref) {
|
|
|
457
471
|
}
|
|
458
472
|
}
|
|
459
473
|
async function handleExpire() {
|
|
460
|
-
var _conversationRef$
|
|
474
|
+
var _conversationRef$curr10, _conversationRef$curr11;
|
|
461
475
|
// The duration timer keeps running after the call ends.
|
|
462
|
-
if (conversationStatus === 'credit-exhausted') {
|
|
476
|
+
if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached') {
|
|
463
477
|
return;
|
|
464
478
|
}
|
|
465
479
|
emitEvent('timeExceeded', {
|
|
466
|
-
conversationId: (_conversationRef$
|
|
467
|
-
limit: (_conversationRef$
|
|
480
|
+
conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
|
|
481
|
+
limit: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.limit
|
|
468
482
|
});
|
|
469
483
|
await leave();
|
|
470
484
|
setConversationStatus('exceeded');
|
|
471
485
|
}
|
|
472
486
|
async function interrupt() {
|
|
473
|
-
var _conversationRef$
|
|
487
|
+
var _conversationRef$curr12;
|
|
474
488
|
emitEvent('interrupt', {
|
|
475
|
-
conversationId: (_conversationRef$
|
|
489
|
+
conversationId: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.id
|
|
476
490
|
});
|
|
477
491
|
await publishConversationDataMessage(room, {}, 'interrupt');
|
|
478
492
|
}
|
|
@@ -482,7 +496,7 @@ export function useConversation(_ref) {
|
|
|
482
496
|
}, 'inactivity_dismiss');
|
|
483
497
|
}
|
|
484
498
|
async function send(message, attachments) {
|
|
485
|
-
var _conversationRef$
|
|
499
|
+
var _conversationRef$curr13;
|
|
486
500
|
if (attachments === void 0) {
|
|
487
501
|
attachments = [];
|
|
488
502
|
}
|
|
@@ -493,7 +507,7 @@ export function useConversation(_ref) {
|
|
|
493
507
|
}
|
|
494
508
|
}));
|
|
495
509
|
emitEvent('userSendMessage', {
|
|
496
|
-
conversationId: (_conversationRef$
|
|
510
|
+
conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id,
|
|
497
511
|
message
|
|
498
512
|
});
|
|
499
513
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useSdkConsumer","useCreateConversation","useSpeechActivityDetector","useParticipantTrack","Source","getTrackStats","parseTrackStats","useEmitConversationEvent","useToolCallingRuntime","extractToolErrorMessage","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsCreditExhaustedMessage","buildToolDefinitions","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","parseFunctionCallPayload","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","EXECUTE_TOOL_RPC_METHOD","GET_TOOLS_RPC_METHOD","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","firstConversation","lastConversationTopic","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","_useSdkConsumer","_useSdkConsumer$tools","tools","toolsRegistry","toolRuntime","toolsRegistryRef","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","inactivityTimeoutRef","creditExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","source","Microphone","agentMicPublication","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","_await$Promise$all","Promise","all","userReport","agentReport","userStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","handleExecuteToolRpc","call","payload","functionCallId","result","_await$toolRuntimeRef","executeToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","_participant","_kind","topic","decoded","_conversationRef$curr6","_ref2","resolve","catch","handleConnectedEvent","_conversationRef$curr7","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr8","handleParticipantDisconnectedEvent","_conversationRef$curr9","leave","_conversationRef$curr0","disconnect","_conversationRef$curr1","_conversationRef$curr10","interrupt","_conversationRef$curr11","dismissInactivity","send","attachments","_conversationRef$curr12","sendText","attributes","on","unregisterRpcMethod","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n 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 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 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 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 (conversationStatus === 'credit-exhausted') {\n return;\n }\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.registerRpcMethod(GET_TOOLS_RPC_METHOD, handleGetToolsRpc);\n room.registerRpcMethod(EXECUTE_TOOL_RPC_METHOD, handleExecuteToolRpc);\n }\n\n function unregisterRoomEvents() {\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useSdkConsumer","useCreateConversation","useSpeechActivityDetector","useParticipantTrack","Source","getTrackStats","parseTrackStats","useEmitConversationEvent","useToolCallingRuntime","extractToolErrorMessage","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage","buildToolDefinitions","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","parseFunctionCallPayload","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","EXECUTE_TOOL_RPC_METHOD","GET_TOOLS_RPC_METHOD","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","firstConversation","lastConversationTopic","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","_useSdkConsumer","_useSdkConsumer$tools","tools","toolsRegistry","toolRuntime","toolsRegistryRef","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","inactivityTimeoutRef","creditExhaustedRef","conversationLimitReachedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","source","Microphone","agentMicPublication","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","_await$Promise$all","Promise","all","userReport","agentReport","userStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","handleExecuteToolRpc","call","payload","functionCallId","result","_await$toolRuntimeRef","executeToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","_participant","_kind","topic","decoded","_conversationRef$curr6","_conversationRef$curr7","_ref2","resolve","catch","handleConnectedEvent","_conversationRef$curr8","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr9","handleParticipantDisconnectedEvent","_conversationRef$curr0","leave","_conversationRef$curr1","disconnect","_conversationRef$curr10","_conversationRef$curr11","interrupt","_conversationRef$curr12","dismissInactivity","send","attachments","_conversationRef$curr13","sendText","attributes","on","unregisterRpcMethod","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n 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":"AAAA,SAASA,SAAS,EAAEC,MAAM,QAAQ,OAAO;AACzC,SACEC,gBAAgB,EAEhBC,WAAW,EACXC,eAAe,EAGfC,QAAQ,QAEH,gBAAgB;AACvB,OAAOC,SAAS,MAAM,WAAW;AACjC,SAASC,QAAQ,QAAQ,kBAAkB;AAC3C,SAASC,SAAS,EAAEC,eAAe,QAAQ,WAAW;AACtD,SAASC,aAAa,EAAEC,oBAAoB,QAAQ,2BAA2B;AAC/E,SAASC,OAAO,EAAEC,YAAY,EAAEC,UAAU,QAAQ,OAAO;AACzD,SAEEC,KAAK,QAEA,uBAAuB;AAO9B,SAASC,cAAc,QAAQ,uBAAuB;AAMtD,SAASC,qBAAqB,QAAQ,6BAA6B;AACnE,SAASC,yBAAyB,QAAQ,iCAAiC;AAC3E,SACEC,mBAAmB,EACnBC,MAAM,EACNC,aAAa,EACbC,eAAe,QAEV,2BAA2B;AAElC,SAASC,wBAAwB,QAAQ,sDAAsD;AAC/F,SAASC,qBAAqB,QAAQ,8CAA8C;AACpF,SAASC,uBAAuB,QAAQ,gCAAgC;AACxE,SACEC,wBAAwB,EACxBC,4BAA4B,EAC5BC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,sCAAsC,EACtCC,oBAAoB,EACpBC,iBAAiB,EACjBC,0BAA0B,EAC1BC,mBAAmB,EACnBC,wBAAwB,EACxBC,8BAA8B,EAC9BC,aAAa,EACbC,gCAAgC,QAC3B,SAAS;AAChB,SACEC,0BAA0B,EAC1BC,yBAAyB,EACzBC,2BAA2B,EAC3BC,uBAAuB,EACvBC,oBAAoB,QACf,aAAa;AAEpB,OAAO,SAASC,eAAeA,CAAAC,IAAA,EAQmB;EAAA,IAAAC,mBAAA;EAAA,IAAAC,aAAA,GAAAF,IAAA,CAPhDG,QAAQ;IAARA,QAAQ,GAAAD,aAAA,cAAG,IAAI,GAAAA,aAAA;IACfE,IAAI,GAAAJ,IAAA,CAAJI,IAAI;IACJC,MAAM,GAAAL,IAAA,CAANK,MAAM;IAAAC,qBAAA,GAAAN,IAAA,CACNO,mBAAmB;IAAnBA,mBAAmB,GAAAD,qBAAA,cAAG,KAAK,GAAAA,qBAAA;IAAAE,oBAAA,GAAAR,IAAA,CAC3BS,eAAe;IAAfA,eAAe,GAAAD,oBAAA,cAAG,KAAK,GAAAA,oBAAA;IACvBE,iBAAiB,GAAAV,IAAA,CAAjBU,iBAAiB;IACjBC,qBAAqB,GAAAX,IAAA,CAArBW,qBAAqB;EAErBrD,WAAW,CAACE,QAAQ,CAACoD,MAAM,CAAC;EAE5B,MAAMC,YAAY,GAAGzC,qBAAqB,CAAC;IACzCgC,IAAI;IACJC,MAAM;IACNK,iBAAiB;IACjBC;EACF,CAAC,CAAC;EACF,MAAMG,IAAI,GAAGjD,aAAa,CAAC,CAAC;EAC5B,MAAMkD,OAAO,GAAG/C,YAAY,CAACE,KAAK,CAAC6C,OAAO,CAAC;EAC3C,MAAAC,QAAA,GAAoCjD,OAAO,CAACG,KAAK,CAAC+C,UAAU,CAAC;IAAtDA,UAAU,GAAAD,QAAA;IAAEE,aAAa,GAAAF,QAAA;EAChC,MAAAG,SAAA,GAA4BpD,OAAO,CAACG,KAAK,CAACkD,MAAM,CAAC;IAA1CA,MAAM,GAAAD,SAAA;IAAEE,SAAS,GAAAF,SAAA;EACxB,MAAAG,eAAA,GAAsCnD,cAAc,CAAC,CAAC;IAAAoD,qBAAA,GAAAD,eAAA,CAA9CE,KAAK;IAAEC,aAAa,GAAAF,qBAAA,cAAG,CAAC,CAAC,GAAAA,qBAAA;EACjC,MAAMG,WAAW,GAAG/C,qBAAqB,CAAC,CAAC;EAC3C,MAAMgD,gBAAgB,GAAGhE,SAAS,CAAC8D,aAAa,CAAC;;EAEjD;EACA,MAAMG,eAAe,GAAGjE,SAAS,CAC/BkD,YAAY,CAACgB,IACf,CAAC;EACD,MAAMC,cAAc,GAAGnE,SAAS,CAAC+D,WAAW,CAAC;EAE7C,MAAAK,SAAA,GAAoDhE,OAAO,CACzDG,KAAK,CAAC8D,kBACR,CAAC;IAFMA,kBAAkB,GAAAD,SAAA;IAAEE,qBAAqB,GAAAF,SAAA;EAIhD,MAAAG,SAAA,GAAsDnE,OAAO,CAC3DG,KAAK,CAACiE,mBACR,CAAC;IAFMA,mBAAmB,GAAAD,SAAA;IAAEE,sBAAsB,GAAAF,SAAA;EAIlD,MAAAG,SAAA,GAAgCtE,OAAO,CAACG,KAAK,CAACoE,QAAQ,CAAC;IAAhDA,QAAQ,GAAAD,SAAA;IAAEE,WAAW,GAAAF,SAAA;EAE5B,MAAAG,qBAAA,GAAwD1E,oBAAoB,CAAC;MAC3E2E,IAAI,EAAE;IACR,CAAC,CAAC;IAF4BC,qBAAqB,GAAAF,qBAAA,CAA3CG,oBAAoB;EAG5B,MAAAC,sBAAA,GAAqD9E,oBAAoB,CAAC;MACxE2E,IAAI,EAAE;IACR,CAAC,CAAC;IAF4BI,kBAAkB,GAAAD,sBAAA,CAAxCD,oBAAoB;EAG5B,MAAAG,sBAAA,GAAoDhF,oBAAoB,CAAC;MACvE2E,IAAI,EAAE,YAAY;MAClBM,kBAAkB,EAAE3B,MAAM,CAAC4B;IAC7B,CAAC,CAAC;IAH4BC,iBAAiB,GAAAH,sBAAA,CAAvCH,oBAAoB;EAK5B,MAAMO,iBAAiB,GAAGjF,UAAU,CAACC,KAAK,CAACiF,cAAc,CAAC;EAC1D,MAAAC,SAAA,GAAwDrF,OAAO,CAC7DG,KAAK,CAACmF,oBACR,CAAC;IAFMA,oBAAoB,GAAAD,SAAA;IAAEE,uBAAuB,GAAAF,SAAA;EAGpD,MAAMG,qBAAqB,GAAGtF,UAAU,CAACC,KAAK,CAACsF,kBAAkB,CAAC;EAClE,MAAMC,oBAAoB,GAAGxF,UAAU,CAACC,KAAK,CAACwF,iBAAiB,CAAC;EAChE,MAAMC,SAAS,GAAGjF,wBAAwB,CAAC,CAAC;EAE5C,MAAMkF,oBAAoB,GAAGxG,MAAM,CAAC,KAAK,CAAC;EAC1C,MAAMyG,kBAAkB,GAAGzG,MAAM,CAAC,KAAK,CAAC;EACxC,MAAM0G,2BAA2B,GAAG1G,MAAM,CAAC,KAAK,CAAC;EACjD,MAAM2G,gBAAgB,GAAG3G,MAAM,CAAsC,MAAM,CAAC;EAC5E,MAAM4G,aAAa,GAAG5G,MAAM,CAAgB,IAAI,CAAC;EACjD,MAAM6G,qBAAqB,GAAG7G,MAAM,CAIjC,CAAC,CAAC,CAAC;EACN,MAAM8G,cAAc,GAAG9G,MAAM,CAAC,KAAK,CAAC;EACpC,MAAM+G,2BAA2B,GAAG/G,MAAM,CACxCgH,SACF,CAAC;EACD,MAAMC,4BAA4B,GAAGjH,MAAM,CACzCgH,SACF,CAAC;EAED,MAAME,kBAAkB,GAAGhG,mBAAmB,CAAC;IAC7C8B,IAAI,EAAE,MAAM;IACZmE,MAAM,EAAEhG,MAAM,CAACiG;EACjB,CAAC,CAAC;EACF,MAAMC,mBAAmB,GAAGnG,mBAAmB,CAAC;IAC9C8B,IAAI,EAAE,OAAO;IACbmE,MAAM,EAAEhG,MAAM,CAACiG;EACjB,CAAC,CAAC;EAEF,MAAME,KAAK,GAAGhH,QAAQ,CAAC;IACrBiH,SAAS,EAAE,KAAK;IAChBC,QAAQ,EAAEC,YAAY;IACtBC,eAAe,EAAE,IAAIC,IAAI,CAAC;EAC5B,CAAC,CAAC;EAEF5H,SAAS,CAAC,MAAM;IACd,IAAI,CAAC2D,IAAI,EAAE;MACT;IACF;IACAkE,kBAAkB,CAAC,CAAC;IAEpB,OAAO,MAAM;MACXC,oBAAoB,CAAC,CAAC;IACxB,CAAC;EACH,CAAC,EAAE,CAACnE,IAAI,CAAC,CAAC;EAEVlD,eAAe,CAAC,MAAM;IACpB8E,qBAAqB,CAACzB,UAAU,CAACiE,QAAQ,CAAC;EAC5C,CAAC,EAAE,CAACjE,UAAU,CAACiE,QAAQ,CAAC,CAAC;EAEzBtH,eAAe,CAAC,MAAM;IACpBiF,kBAAkB,CAAC9B,OAAO,CAACmE,QAAQ,CAAC;EACtC,CAAC,EAAE,CAACnE,OAAO,CAACmE,QAAQ,CAAC,CAAC;EAEtBtH,eAAe,CAAC,MAAM;IACpBqF,iBAAiB,CAAC7B,MAAM,CAAC8D,QAAQ,CAAC;EACpC,CAAC,EAAE,CAAC9D,MAAM,CAAC8D,QAAQ,CAAC,CAAC;EAErBtH,eAAe,CAAC,MAAM;IACpB,IAAIyF,oBAAoB,KAAK,QAAQ,EAAE;MACrC;IACF;IACAvC,IAAI,CAACqE,gBAAgB,CAACC,oBAAoB,CAACnE,UAAU,CAAC+B,OAAO,CAAC;EAChE,CAAC,EAAE,CAAC/B,UAAU,CAAC+B,OAAO,EAAEK,oBAAoB,CAAC,CAAC;EAE9CzF,eAAe,CAAC,MAAM;IACpB,IAAIyF,oBAAoB,KAAK,QAAQ,EAAE;MACrC;IACF;IACAvC,IAAI,CAACqE,gBAAgB,CAACE,gBAAgB,CAACjE,MAAM,CAAC4B,OAAO,EAAE;MACrDsC,UAAU,EAAE;QAAEC,KAAK,EAAE,IAAI;QAAEC,MAAM,EAAE;MAAK;IAC1C,CAAC,CAAC;EACJ,CAAC,EAAE,CAACpE,MAAM,CAAC4B,OAAO,EAAEK,oBAAoB,CAAC,CAAC;EAE1ClG,SAAS,CAAC,MAAM;IACd,IAAI,CAACgD,QAAQ,EAAE;MACb;IACF;IAEA,IAAI6B,kBAAkB,KAAK,SAAS,EAAE;MACpC,KAAKyD,IAAI,CAAC,CAAC;IACb;EACF,CAAC,EAAE,CAACzD,kBAAkB,EAAE7B,QAAQ,CAAC,CAAC;EAElChD,SAAS,CAAC,MAAM;IAAA,IAAAuI,kBAAA;IACd,IAAI,CAACpD,QAAQ,IAAI,EAAAoD,kBAAA,GAAA7E,YAAY,CAACgB,IAAI,qBAAjB6D,kBAAA,CAAmBC,KAAK,MAAKvB,SAAS,EAAE;MACvD;IACF;IAEAM,KAAK,CAACkB,OAAO,CAAC,IAAIb,IAAI,CAACzC,QAAQ,CAACuD,OAAO,CAAC,CAAC,GAAGhF,YAAY,CAACgB,IAAI,CAAE8D,KAAM,CAAC,CAAC;EACzE,CAAC,EAAE,CAACrD,QAAQ,GAAArC,mBAAA,GAAEY,YAAY,CAACgB,IAAI,qBAAjB5B,mBAAA,CAAmB0F,KAAK,CAAC,CAAC;EAExC,eAAeF,IAAIA,CAAA,EAAG;IAAA,IAAAK,mBAAA;IACpBrI,SAAS,CAAC0E,mBAAmB,KAAK,MAAM,EAAE,gBAAgB,CAAC;IAC3D1E,SAAS,CAACoD,YAAY,CAACgB,IAAI,EAAE,2BAA2B,CAAC;IACzD,MAAMkE,GAAG,GAAG,IAAIC,GAAG,CAAC,CAAAnF,YAAY,aAAAiF,mBAAA,GAAZjF,YAAY,CAAEgB,IAAI,qBAAlBiE,mBAAA,CAAoBC,GAAG,KAAI,EAAE,CAAC;IAClD,MAAME,WAAW,GAAGF,GAAG,CAACG,YAAY,CAACC,GAAG,CAAC,OAAO,CAAC;IACjD,IAAI;MACF/D,sBAAsB,CAAC,SAAS,CAAC;MACjC,OAAMtB,IAAI,oBAAJA,IAAI,CAAEsF,OAAO,CAACvF,YAAY,CAACgB,IAAI,CAACkE,GAAG,EAAEE,WAAW,EAAG,CAAC,CAAC,CAAC;;MAE5D;MACA,MAAMI,iBAAiB,GAAGjH,0BAA0B,CAAC0B,IAAI,EAAEV,IAAI,CAAC;MAChE,IAAIiG,iBAAiB,IAAIhD,oBAAoB,KAAK,QAAQ,EAAE;QAC1DiD,eAAe,CAACD,iBAAiB,CAAC;MACpC;MAEAE,kBAAkB,CAAC,CAAC;IACtB,CAAC,CAAC,OAAOC,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,gBAAgB,EAAEA,KAAK,CAAC;MACtCpE,sBAAsB,CAAC,YAAY,CAAC;IACtC;EACF;EAEA,SAASmE,kBAAkBA,CAAA,EAAG;IAC5B,IAAIhG,mBAAmB,EAAE;MACvBW,aAAa,CAAC;QAAE,GAAGD,UAAU;QAAE+B,OAAO,EAAE;MAAK,CAAC,CAAC;IACjD;IACA,IAAIvC,eAAe,IAAIL,IAAI,KAAK,OAAO,EAAE;MACvCiB,SAAS,CAAC;QAAE,GAAGD,MAAM;QAAE4B,OAAO,EAAE;MAAK,CAAC,CAAC;IACzC;EACF;EAEA,SAAS0D,gCAAgCA,CACvCC,QAAgC,EAChCC,WAAyB,EACzB;IACA,MAAMzD,cAA2C,GAAGwD,QAAQ,CAACE,GAAG,CAAEC,CAAC,KAAM;MACvEC,EAAE,EAAED,CAAC,CAACC,EAAE;MACRC,OAAO,EAAEF,CAAC,CAACG,IAAI;MACf1C,MAAM,EAAE,CAAAqC,WAAW,oBAAXA,WAAW,CAAEnE,IAAI,MAAKlF,eAAe,CAAC2J,KAAK,GAAG,OAAO,GAAG;IAClE,CAAC,CAAC,CAAC;IAEHhE,iBAAiB,CAAEiE,GAAG,IAAK9H,mBAAmB,CAAC8D,cAAc,EAAEgE,GAAG,CAAC,CAAC;EACtE;EAEA,SAASC,wBAAwBA,CAACvF,IAAuB,EAAE;IAAA,IAAAwF,qBAAA;IACzD,MAAMC,cAAc,IAAAD,qBAAA,GAAGzF,eAAe,CAAC2F,OAAO,qBAAvBF,qBAAA,CAAyBN,EAAE;IAClD,MAAQS,eAAe,GAAwB3F,IAAI,CAA3C2F,eAAe;MAASC,UAAU,GAAK5F,IAAI,CAA1B3D,KAAK;IAC9B,QAAQsJ,eAAe;MACrB,KAAK,UAAU;QACb,IAAIC,UAAU,KAAK,WAAW,EAAE;UAC9BxD,qBAAqB,CAACsD,OAAO,GAAG;YAC9BG,qBAAqB,EAAE7F,IAAI,CAAC6F,qBAAqB;YACjDC,QAAQ,EAAE9F,IAAI,CAAC8F,QAAQ;YACvBC,QAAQ,EAAE/F,IAAI,CAAC+F;UACjB,CAAC;QACH;QACAjE,SAAS,CACP8D,UAAU,KAAK,UAAU,GAAG,gBAAgB,GAAG,eAAe,EAC9D;UAAEH,cAAc,EAAEA;QAAgB,CACpC,CAAC;QACD7D,oBAAoB,CAACgE,UAAU,CAAC;QAChC;MACF,KAAK,OAAO;QACV,IAAI5F,IAAI,CAAC+F,QAAQ,EAAE;UACjB3D,qBAAqB,CAACsD,OAAO,GAAG;YAC9B,GAAGtD,qBAAqB,CAACsD,OAAO;YAChCK,QAAQ,EAAE/F,IAAI,CAAC+F;UACjB,CAAC;QACH;QACAjE,SAAS,CACP8D,UAAU,KAAK,UAAU,GAAG,iBAAiB,GAAG,gBAAgB,EAChE;UAAEH,cAAc,EAAEA;QAAgB,CACpC,CAAC;QACD/D,qBAAqB,CAACkE,UAAU,CAAC;QACjC;IACJ;EACF;EAEA,SAASI,uBAAuBA,CAAA,EAAG;IACjC,IAAI,CAAC3D,cAAc,CAACqD,OAAO,EAAE;MAC3B;IACF;IACA,IAAIxD,gBAAgB,CAACwD,OAAO,KAAK,iBAAiB,EAAE;MAClDxD,gBAAgB,CAACwD,OAAO,GAAG,MAAM;MACjCvD,aAAa,CAACuD,OAAO,GAAG,IAAI;IAC9B;EACF;EAEA,SAASO,wBAAwBA,CAACC,WAAmB,EAAE;IACrD,IAAI,CAAC7D,cAAc,CAACqD,OAAO,IAAIxD,gBAAgB,CAACwD,OAAO,KAAK,MAAM,EAAE;MAClE;IACF;IACAvD,aAAa,CAACuD,OAAO,GAAGQ,WAAW,GAAGpI,yBAAyB;IAC/DoE,gBAAgB,CAACwD,OAAO,GAAG,iBAAiB;EAC9C;EAEA,SAASS,wBAAwBA,CAACD,WAAmB,EAAE;IAAA,IAAAE,sBAAA;IACrD,IACE,CAAC/D,cAAc,CAACqD,OAAO,IACvBxD,gBAAgB,CAACwD,OAAO,KAAK,iBAAiB,IAC9CvD,aAAa,CAACuD,OAAO,IAAI,IAAI,EAC7B;MACA;IACF;IAEA,MAAMW,SAAS,GAAGH,WAAW,GAAG/D,aAAa,CAACuD,OAAO;IACrDvD,aAAa,CAACuD,OAAO,GAAG,IAAI;IAC5BxD,gBAAgB,CAACwD,OAAO,GAAG,MAAM;IAEjC,IAAIW,SAAS,GAAG,CAAC,IAAIA,SAAS,GAAG,KAAK,EAAE;MACtC;IACF;IAEAvE,SAAS,CAAC,iBAAiB,EAAE;MAC3B2D,cAAc,GAAAW,sBAAA,GAAErG,eAAe,CAAC2F,OAAO,qBAAvBU,sBAAA,CAAyBlB,EAAG;MAC5CmB,SAAS;MACTR,qBAAqB,EACnBzD,qBAAqB,CAACsD,OAAO,CAACG,qBAAsB;MACtDC,QAAQ,EAAE1D,qBAAqB,CAACsD,OAAO,CAACI,QAAQ;MAChDC,QAAQ,EAAE3D,qBAAqB,CAACsD,OAAO,CAACK;IAC1C,CAAC,CAAC;IAEF,KAAKO,2BAA2B,CAACD,SAAS,CAAC;EAC7C;EAEA,eAAeC,2BAA2BA,CAACC,uBAA+B,EAAE;IAAA,IAAAC,sBAAA;IAC1E,MAAAC,kBAAA,GAAkC,MAAMC,OAAO,CAACC,GAAG,CAAC,CAClDhK,aAAa,CAAC8F,kBAAkB,CAAC,EACjC9F,aAAa,CAACiG,mBAAmB,CAAC,CACnC,CAAC;MAHKgE,UAAU,GAAAH,kBAAA;MAAEI,WAAW,GAAAJ,kBAAA;IAI9B,MAAMK,SAAS,GAAGlK,eAAe,CAC/BgK,UAAU,EACVtE,2BAA2B,CAACoD,OAC9B,CAAC;IACD,MAAMqB,UAAU,GAAGnK,eAAe,CAChCiK,WAAW,EACXrE,4BAA4B,CAACkD,OAC/B,CAAC;IACDpD,2BAA2B,CAACoD,OAAO,GAAGoB,SAAS,CAACE,oBAAoB;IACpExE,4BAA4B,CAACkD,OAAO,GAAGqB,UAAU,CAACC,oBAAoB;IAEtElF,SAAS,CAAC,yBAAyB,EAAE;MACnC2D,cAAc,GAAAe,sBAAA,GAAEzG,eAAe,CAAC2F,OAAO,qBAAvBc,sBAAA,CAAyBtB,EAAG;MAC5Ca,QAAQ,EAAE3D,qBAAqB,CAACsD,OAAO,CAACK,QAAQ;MAChDD,QAAQ,EAAE1D,qBAAqB,CAACsD,OAAO,CAACI,QAAQ;MAChDS,uBAAuB;MACvBU,KAAK,EAAEH,SAAS,CAACI,eAAe;MAChCC,mBAAmB,EAAEJ,UAAU,CAACI,mBAAmB;MACnDC,eAAe,EAAEN,SAAS,CAACO,WAAW;MACtCC,gBAAgB,EAAEP,UAAU,CAACM;IAC/B,CAAC,CAAC;EACJ;EAEA,SAASE,yBAAyBA,CAAA,EAAG;IACnCrF,gBAAgB,CAACwD,OAAO,GAAG,MAAM;EACnC;EAEAlJ,yBAAyB,CAAC;IACxBkG,MAAM,EAAE,MAAM;IACd8E,aAAa,EAAExB,uBAAuB;IACtCyB,WAAW,EAAExB,wBAAwB;IACrCyB,YAAY,EAAE3J,2BAA2B;IACzC4J,UAAU,EAAE7J;EACd,CAAC,CAAC;EACFtB,yBAAyB,CAAC;IACxBkG,MAAM,EAAE,OAAO;IACf8E,aAAa,EAAErB,wBAAwB;IACvCsB,WAAW,EAAEF,yBAAyB;IACtCI,UAAU,EAAE9J;EACd,CAAC,CAAC;EAEF,SAAS+J,4BAA4BA,CAAC5H,IAA2B,EAAE;IAAA,IAAA6H,sBAAA;IACjE/F,SAAS,CAAC,mBAAmB,EAAE;MAC7B2D,cAAc,GAAAoC,sBAAA,GAAE9H,eAAe,CAAC2F,OAAO,qBAAvBmC,sBAAA,CAAyB3C,EAAG;MAC5C4C,cAAc,EAAE9H,IAAI,CAAC+H;IACvB,CAAC,CAAC;EACJ;EAEA,SAASC,4BAA4BA,CAACC,KAA4B,EAAE;IAAA,IAAAC,sBAAA;IAClEnG,oBAAoB,CAAC2D,OAAO,GAAG,IAAI;IACnC5D,SAAS,CAAC,mBAAmB,EAAE;MAC7B2D,cAAc,GAAAyC,sBAAA,GAAEnI,eAAe,CAAC2F,OAAO,qBAAvBwC,sBAAA,CAAyBhD;IAC3C,CAAC,CAAC;EACJ;EAEA,eAAeiD,iBAAiBA,CAAA,EAAG;IACjC,OAAOC,IAAI,CAACC,SAAS,CAAChL,oBAAoB,CAACyC,gBAAgB,CAAC4F,OAAO,CAAC,CAAC;EACvE;EAEA,eAAe4C,oBAAoBA,CAACtI,IAAuB,EAAE;IAC3D,MAAMuI,IAAI,GAAG9K,wBAAwB,CAACuC,IAAI,CAACwI,OAAO,CAAC;IACnD,IAAI,CAACD,IAAI,EAAE;MACT,OAAOH,IAAI,CAACC,SAAS,CAAC;QACpBI,cAAc,EAAE,EAAE;QAClBC,MAAM,EAAE,EAAE;QACV/D,KAAK,EAAE;MACT,CAA8B,CAAC;IACjC;IACA,IAAI;MACF,MAAAgE,qBAAA,GAAiB,MAAM1I,cAAc,CAACyF,OAAO,CAACkD,gBAAgB,CAAC,CAACL,IAAI,CAAC,CAAC;QAA/DG,MAAM,GAAAC,qBAAA;MACb,OAAOP,IAAI,CAACC,SAAS,CAACK,MAAM,CAAC;IAC/B,CAAC,CAAC,OAAO/D,KAAK,EAAE;MACd,OAAOyD,IAAI,CAACC,SAAS,CAAC;QACpBI,cAAc,EAAEF,IAAI,CAACE,cAAc;QACnCC,MAAM,EAAE,EAAE;QACV/D,KAAK,EAAE5H,uBAAuB,CAAC4H,KAAK;MACtC,CAA8B,CAAC;IACjC;EACF;EAEA,MAAMkE,mBAGH,GAAG,CACJ;IACEC,KAAK,EAAE9L,wBAAwB;IAC/B+L,MAAM,EAAExD;EACV,CAAC,EACD;IACEuD,KAAK,EAAE7L,4BAA4B;IACnC8L,MAAM,EAAEnB;EACV,CAAC,EACD;IACEkB,KAAK,EAAE5L,4BAA4B;IACnC6L,MAAM,EAAEf;EACV,CAAC,CACF;EAED,SAASgB,uBAAuBA,CAC9BR,OAAmB,EACnBS,YAAgC,EAChCC,KAAe,EACfC,KAAc,EACd;IACA,MAAMC,OAAO,GAAG9L,iBAAiB,CAACkL,OAAO,CAAC;IAC1C,IAAIY,OAAO,KAAK,IAAI,EAAE;MACpB;IACF;IACA,IAAIjM,6BAA6B,CAACiM,OAAO,EAAED,KAAK,CAAC,EAAE;MAAA,IAAAE,sBAAA;MACjDrH,kBAAkB,CAAC0D,OAAO,GAAG,IAAI;MACjC5D,SAAS,CAAC,iBAAiB,EAAE;QAC3B2D,cAAc,GAAA4D,sBAAA,GAAEtJ,eAAe,CAAC2F,OAAO,qBAAvB2D,sBAAA,CAAyBnE;MAC3C,CAAC,CAAC;MACF;IACF;IACA,IAAI9H,sCAAsC,CAACgM,OAAO,EAAED,KAAK,CAAC,EAAE;MAAA,IAAAG,sBAAA;MAC1DrH,2BAA2B,CAACyD,OAAO,GAAG,IAAI;MAC1C5D,SAAS,CAAC,0BAA0B,EAAE;QACpC2D,cAAc,GAAA6D,sBAAA,GAAEvJ,eAAe,CAAC2F,OAAO,qBAAvB4D,sBAAA,CAAyBpE;MAC3C,CAAC,CAAC;MACF;IACF;IACA,WAAAqE,KAAA,IAAgCV,mBAAmB,EAAE;MAAA,MAAxCC,KAAK,GAAAS,KAAA,CAALT,KAAK;MAAA,MAAEC,MAAM,GAAAQ,KAAA,CAANR,MAAM;MACxB,IAAID,KAAK,CAACM,OAAO,CAAC,EAAE;QAClB,KAAK1C,OAAO,CAAC8C,OAAO,CAACT,MAAM,CAACK,OAAO,CAAC,CAAC,CAACK,KAAK,CAAE9E,KAAK,IAAK;UACrDC,OAAO,CAACD,KAAK,CAAC,uCAAuC,EAAEA,KAAK,CAAC;QAC/D,CAAC,CAAC;QACF;MACF;IACF;EACF;EAEA,SAAS+E,oBAAoBA,CAAA,EAAG;IAAA,IAAAC,sBAAA;IAC9BtH,cAAc,CAACqD,OAAO,GAAG,IAAI;IAC7BnF,sBAAsB,CAAC,QAAQ,CAAC;IAChCkB,uBAAuB,CAAC,SAAS,CAAC;IAClCK,SAAS,CAAC,aAAa,EAAE;MACvB2D,cAAc,GAAAkE,sBAAA,GAAE5J,eAAe,CAAC2F,OAAO,qBAAvBiE,sBAAA,CAAyBzE;IAC3C,CAAC,CAAC;EACJ;EAEA,eAAe0E,0BAA0BA,CAACjF,KAAY,EAAE;IACtDC,OAAO,CAACD,KAAK,CAAC,kBAAkB,EAAEA,KAAK,CAAC;IACxCvE,qBAAqB,CAAC,OAAO,CAAC;EAChC;EAEA,SAASyJ,uBAAuBA,CAACC,MAAyB,EAAE;IAC1DzH,cAAc,CAACqD,OAAO,GAAG,KAAK;IAC9BxD,gBAAgB,CAACwD,OAAO,GAAG,MAAM;IACjCvD,aAAa,CAACuD,OAAO,GAAG,IAAI;IAC5BtD,qBAAqB,CAACsD,OAAO,GAAG,CAAC,CAAC;IAClCpD,2BAA2B,CAACoD,OAAO,GAAGnD,SAAS;IAC/CC,4BAA4B,CAACkD,OAAO,GAAGnD,SAAS;IAChDb,qBAAqB,CAAC,MAAM,CAAC;IAC7BD,uBAAuB,CAAC,MAAM,CAAC;IAC/BG,oBAAoB,CAAC,MAAM,CAAC;IAC5BrB,sBAAsB,CAAC,MAAM,CAAC;IAE9B,IAAIwB,oBAAoB,CAAC2D,OAAO,EAAE;MAChC3D,oBAAoB,CAAC2D,OAAO,GAAG,KAAK;MACpCtF,qBAAqB,CAAC,oBAAoB,CAAC;MAC3C;IACF;IAEA,IAAI4B,kBAAkB,CAAC0D,OAAO,EAAE;MAC9B1D,kBAAkB,CAAC0D,OAAO,GAAG,KAAK;MAClCtF,qBAAqB,CAAC,kBAAkB,CAAC;MACzC;IACF;IAEA,IAAI6B,2BAA2B,CAACyD,OAAO,EAAE;MACvCzD,2BAA2B,CAACyD,OAAO,GAAG,KAAK;MAC3CtF,qBAAqB,CAAC,4BAA4B,CAAC;MACnD;IACF;IAEA,QAAQ0J,MAAM;MACZ,KAAKtO,gBAAgB,CAACuO,gBAAgB;QACpC;MACF,KAAKvO,gBAAgB,CAACwO,WAAW;QAC/B5J,qBAAqB,CAAC,WAAW,CAAC;QAClC;MACF;QACEwE,OAAO,CAACD,KAAK,CAAC,uCAAuC,EAAEmF,MAAM,CAAC;QAC9D1J,qBAAqB,CAAC,OAAO,CAAC;QAC9B;IACJ;EACF;EAEA,SAAS6J,+BAA+BA,CAAClF,WAA8B,EAAE;IACvE,IAAInH,gCAAgC,CAACmH,WAAW,EAAExG,IAAI,CAAC,EAAE;MACvDkG,eAAe,CAACM,WAAW,CAAC;IAC9B;EACF;EAEA,SAASN,eAAeA,CAACM,WAA8B,EAAE;IAAA,IAAAmF,sBAAA;IACvDzI,uBAAuB,CAAC,QAAQ,CAAC;IACjCK,SAAS,CAAC,aAAa,EAAE;MACvB2D,cAAc,GAAAyE,sBAAA,GAAEnK,eAAe,CAAC2F,OAAO,qBAAvBwE,sBAAA,CAAyBhF,EAAG;MAC5CH;IACF,CAAC,CAAC;EACJ;EAEA,SAASoF,kCAAkCA,CAACpF,WAA8B,EAAE;IAAA,IAAAqF,sBAAA;IAC1E3I,uBAAuB,CAAC,MAAM,CAAC;IAC/BK,SAAS,CAAC,WAAW,EAAE;MACrB2D,cAAc,GAAA2E,sBAAA,GAAErK,eAAe,CAAC2F,OAAO,qBAAvB0E,sBAAA,CAAyBlF,EAAG;MAC5CH;IACF,CAAC,CAAC;EACJ;EAEA,eAAesF,KAAKA,CAAA,EAAG;IACrB,IAAI/J,mBAAmB,KAAK,QAAQ,IAAIA,mBAAmB,KAAK,SAAS,EAAE;MACzE;IACF;IAEA,IAAI;MAAA,IAAAgK,sBAAA;MACF/J,sBAAsB,CAAC,SAAS,CAAC;MACjC,OAAMtB,IAAI,oBAAJA,IAAI,CAAEsL,UAAU,CAAC,IAAI,CAAC;MAC5BnK,qBAAqB,CAAC,WAAW,CAAC;MAClCM,WAAW,CAAC6B,SAAS,CAAC;MACtBT,SAAS,CAAC,WAAW,EAAE;QACrB2D,cAAc,GAAA6E,sBAAA,GAAEvK,eAAe,CAAC2F,OAAO,qBAAvB4E,sBAAA,CAAyBpF;MAC3C,CAAC,CAAC;IACJ,CAAC,CAAC,OAAOP,KAAK,EAAE;MACdC,OAAO,CAACD,KAAK,CAAC,iBAAiB,EAAEA,KAAK,CAAC;MACvCvE,qBAAqB,CAAC,OAAO,CAAC;IAChC;EACF;EAEA,eAAe4C,YAAYA,CAAA,EAAG;IAAA,IAAAwH,uBAAA,EAAAC,uBAAA;IAC5B;IACA,IACEtK,kBAAkB,KAAK,kBAAkB,IACzCA,kBAAkB,KAAK,4BAA4B,EACnD;MACA;IACF;IACA2B,SAAS,CAAC,cAAc,EAAE;MACxB2D,cAAc,GAAA+E,uBAAA,GAAEzK,eAAe,CAAC2F,OAAO,qBAAvB8E,uBAAA,CAAyBtF,EAAG;MAC5CpB,KAAK,GAAA2G,uBAAA,GAAE1K,eAAe,CAAC2F,OAAO,qBAAvB+E,uBAAA,CAAyB3G;IAClC,CAAC,CAAC;IACF,MAAMuG,KAAK,CAAC,CAAC;IACbjK,qBAAqB,CAAC,UAAU,CAAC;EACnC;EAEA,eAAesK,SAASA,CAAA,EAAG;IAAA,IAAAC,uBAAA;IACzB7I,SAAS,CAAC,WAAW,EAAE;MACrB2D,cAAc,GAAAkF,uBAAA,GAAE5K,eAAe,CAAC2F,OAAO,qBAAvBiF,uBAAA,CAAyBzF;IAC3C,CAAC,CAAC;IAEF,MAAMxH,8BAA8B,CAACuB,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC;EAC7D;EAEA,eAAe2L,iBAAiBA,CAAA,EAAG;IACjC,MAAMlN,8BAA8B,CAClCuB,IAAI,EACJ;MAAEV,IAAI,EAAE;IAAqB,CAAC,EAC9B,oBACF,CAAC;EACH;EAEA,eAAesM,IAAIA,CAAC1F,OAAe,EAAE2F,WAAyB,EAAO;IAAA,IAAAC,uBAAA;IAAA,IAAhCD,WAAyB;MAAzBA,WAAyB,GAAG,EAAE;IAAA;IACjE,OAAM7L,IAAI,oBAAJA,IAAI,CAAEqE,gBAAgB,CAAC0H,QAAQ,CAAC7F,OAAO,EAAE;MAC7CgE,KAAK,EAAE,SAAS;MAChB8B,UAAU,EAAE;QACVH,WAAW,EAAEnN,aAAa,CAACmN,WAAW;MACxC;IACF,CAAC,CAAC;IACFhJ,SAAS,CAAC,iBAAiB,EAAE;MAC3B2D,cAAc,GAAAsF,uBAAA,GAAEhL,eAAe,CAAC2F,OAAO,qBAAvBqF,uBAAA,CAAyB7F,EAAG;MAC5CC;IACF,CAAC,CAAC;EACJ;EAEA,SAAShC,kBAAkBA,CAAA,EAAG;IAC5BlE,IAAI,CACDiM,EAAE,CAAC,WAAW,EAAExB,oBAAoB,CAAC,CACrCwB,EAAE,CAAC,iBAAiB,EAAEtB,0BAA0B,CAAC,CACjDsB,EAAE,CAAC,cAAc,EAAErB,uBAAuB,CAAC,CAC3CqB,EAAE,CAAC,uBAAuB,EAAErG,gCAAgC,CAAC,CAC7DqG,EAAE,CAAC,sBAAsB,EAAEjB,+BAA+B,CAAC,CAC3DiB,EAAE,CAAC,yBAAyB,EAAEf,kCAAkC,CAAC,CACjEe,EAAE,CAAC,cAAc,EAAElC,uBAAuB,CAAC;IAC9C/J,IAAI,CAACkM,mBAAmB,CAAClN,oBAAoB,CAAC;IAC9CgB,IAAI,CAACkM,mBAAmB,CAACnN,uBAAuB,CAAC;IACjDiB,IAAI,CAACmM,iBAAiB,CAACnN,oBAAoB,EAAEkK,iBAAiB,CAAC;IAC/DlJ,IAAI,CAACmM,iBAAiB,CAACpN,uBAAuB,EAAEsK,oBAAoB,CAAC;EACvE;EAEA,SAASlF,oBAAoBA,CAAA,EAAG;IAC9BnE,IAAI,CAACkM,mBAAmB,CAAClN,oBAAoB,CAAC;IAC9CgB,IAAI,CAACkM,mBAAmB,CAACnN,uBAAuB,CAAC;IACjDiB,IAAI,CAACoM,GAAG,CAAC,WAAW,EAAE3B,oBAAoB,CAAC;IAC3CzK,IAAI,CAACoM,GAAG,CAAC,iBAAiB,EAAEzB,0BAA0B,CAAC;IACvD3K,IAAI,CAACoM,GAAG,CAAC,cAAc,EAAExB,uBAAuB,CAAC;IACjD5K,IAAI,CAACoM,GAAG,CAAC,uBAAuB,EAAExG,gCAAgC,CAAC;IACnE5F,IAAI,CAACoM,GAAG,CAAC,sBAAsB,EAAEpB,+BAA+B,CAAC;IACjEhL,IAAI,CAACoM,GAAG,CAAC,yBAAyB,EAAElB,kCAAkC,CAAC;IACvElL,IAAI,CAACoM,GAAG,CAAC,cAAc,EAAErC,uBAAuB,CAAC;EACnD;EAEA,OAAO;IACLsC,MAAM,EAAEnL,kBAAkB;IAC1BnB,YAAY,EAAEA,YAAY,CAACgB,IAAI;IAC/B4D,IAAI;IACJiH,IAAI;IACJH,SAAS;IACTE,iBAAiB;IACjBP;EACF,CAAC;AACH","ignoreList":[]}
|
|
@@ -15,7 +15,13 @@ export function checkIsInactivityWarningData(data) {
|
|
|
15
15
|
export function checkIsInactivityTimeoutData(data) {
|
|
16
16
|
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'inactivity_timeout';
|
|
17
17
|
}
|
|
18
|
+
function checkIsBillingEndedMessage(data, topic, reason) {
|
|
19
|
+
return topic === 'billing' && typeof data === 'object' && data !== null && data.type === 'ended' && data.reason === reason;
|
|
20
|
+
}
|
|
18
21
|
export function checkIsCreditExhaustedMessage(data, topic) {
|
|
19
|
-
return
|
|
22
|
+
return checkIsBillingEndedMessage(data, topic, 'insufficient_credit');
|
|
23
|
+
}
|
|
24
|
+
export function checkIsConversationLimitReachedMessage(data, topic) {
|
|
25
|
+
return checkIsBillingEndedMessage(data, topic, 'limit_reached');
|
|
20
26
|
}
|
|
21
27
|
//# sourceMappingURL=dataChannel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","
|
|
1
|
+
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","checkIsBillingEndedMessage","topic","reason","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsInactivityTimeoutData(\n data: unknown,\n): data is InactivityTimeoutData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_timeout'\n );\n}\n\nfunction checkIsBillingEndedMessage(\n data: unknown,\n topic: string | undefined,\n reason: string,\n): boolean {\n return (\n topic === 'billing' &&\n typeof data === 'object' &&\n data !== null &&\n (data as Record<string, unknown>).type === 'ended' &&\n (data as Record<string, unknown>).reason === reason\n );\n}\n\nexport function checkIsCreditExhaustedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'insufficient_credit');\n}\n\nexport function checkIsConversationLimitReachedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'limit_reached');\n}\n"],"mappings":"AAMA,OAAO,SAASA,iBAAiBA,CAACC,IAAgB,EAAW;EAC3D,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EACnD,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,IAAI;EACb;AACF;AAEA,OAAO,SAASE,wBAAwBA,CACtCP,IAAa,EACc;EAC3B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,iBAAiB,IAAIA,IAAI,IACzB,OAAO,IAAIA,IAAI;AAEnB;AAEA,OAAO,SAASQ,4BAA4BA,CAC1CR,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB,IAC/D,kBAAkB,IAAIT,IAAI,IAC1B,OAAQA,IAAI,CAA6BU,gBAAgB,KAAK,QAAQ;AAE1E;AAEA,OAAO,SAASC,4BAA4BA,CAC1CX,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB;AAEnE;AAEA,SAASG,0BAA0BA,CACjCZ,IAAa,EACba,KAAyB,EACzBC,MAAc,EACL;EACT,OACED,KAAK,KAAK,SAAS,IACnB,OAAOb,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACZA,IAAI,CAA6BS,IAAI,KAAK,OAAO,IACjDT,IAAI,CAA6Bc,MAAM,KAAKA,MAAM;AAEvD;AAEA,OAAO,SAASC,6BAA6BA,CAC3Cf,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,qBAAqB,CAAC;AACvE;AAEA,OAAO,SAASG,sCAAsCA,CACpDhB,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,eAAe,CAAC;AACjE","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport type { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type ConversationTurnLatencyPayload = {\n conversationId: string;\n speechId?: string;\n sequence?: number;\n clientAcousticLatencyMs: number;\n rttMs?: number;\n jitterBufferDelayMs?: number;\n userPacketsLost?: number;\n agentPacketsLost?: number;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type CreditExhaustedPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n conversationTurnLatency: ConversationTurnLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n creditExhausted: CreditExhaustedPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport type { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type ConversationTurnLatencyPayload = {\n conversationId: string;\n speechId?: string;\n sequence?: number;\n clientAcousticLatencyMs: number;\n rttMs?: number;\n jitterBufferDelayMs?: number;\n userPacketsLost?: number;\n agentPacketsLost?: number;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type CreditExhaustedPayload = {\n conversationId: string;\n};\n\nexport type ConversationLimitReachedPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n conversationTurnLatency: ConversationTurnLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n creditExhausted: CreditExhaustedPayload;\n conversationLimitReached: ConversationLimitReachedPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@ export type ConversationVendor = 'LIVEKIT' | 'DAILY' | 'HUME' | 'ELEVEN_LABS' |
|
|
|
4
4
|
export type AgentConnectionState = 'joined' | 'joining' | 'left' | 'idle';
|
|
5
5
|
export type UserConnectionState = 'joined' | 'joining' | 'idle' | 'leaving' | 'join-error';
|
|
6
6
|
export type ActivityState = 'idle' | 'speaking' | 'listening';
|
|
7
|
-
export type ConversationStatus = 'pending' | 'created' | 'destroying' | 'destroyed' | 'exceeded' | 'inactivity-timeout' | 'credit-exhausted' | 'voice-not-found' | 'initialization-error' | 'error';
|
|
7
|
+
export type ConversationStatus = 'pending' | 'created' | 'destroying' | 'destroyed' | 'exceeded' | 'inactivity-timeout' | 'credit-exhausted' | 'conversation-limit-reached' | 'voice-not-found' | 'initialization-error' | 'error';
|
|
8
8
|
export type Conversation = {
|
|
9
9
|
id: string;
|
|
10
10
|
url: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,OAAO,GACP,MAAM,GACN,aAAa,GACb,gBAAgB,CAAC;AAErB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,SAAS,GACT,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,SAAS,GACT,MAAM,GACN,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAE1B,SAAS,GAET,SAAS,GACT,YAAY,GACZ,WAAW,GACX,UAAU,GACV,oBAAoB,GACpB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,CAAC;AAEjD,MAAM,MAAM,2BAA2B,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,OAAO,GACP,MAAM,GACN,aAAa,GACb,gBAAgB,CAAC;AAErB,MAAM,MAAM,oBAAoB,GAC5B,QAAQ,GACR,SAAS,GACT,MAAM,GACN,MAAM,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,SAAS,GACT,MAAM,GACN,SAAS,GACT,YAAY,CAAC;AAEjB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAE1B,SAAS,GAET,SAAS,GACT,YAAY,GACZ,WAAW,GACX,UAAU,GACV,oBAAoB,GACpB,kBAAkB,GAClB,4BAA4B,GAE5B,iBAAiB,GACjB,sBAAsB,GACtB,OAAO,CAAC;AAEZ,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,2BAA2B,CAAC;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAE9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,UAAU,CAAC;AA4ClB,wBAAgB,eAAe,CAAC,EAC9B,QAAe,EACf,IAAI,EACJ,MAAM,EACN,mBAA2B,EAC3B,eAAuB,EACvB,iBAAiB,EACjB,qBAAqB,GACtB,EAAE,sBAAsB,GAAG,qBAAqB,CAukBhD"}
|
|
@@ -4,4 +4,5 @@ export declare function checkIsTurnDetectionData(data: unknown): data is TurnDet
|
|
|
4
4
|
export declare function checkIsInactivityWarningData(data: unknown): data is InactivityWarningData;
|
|
5
5
|
export declare function checkIsInactivityTimeoutData(data: unknown): data is InactivityTimeoutData;
|
|
6
6
|
export declare function checkIsCreditExhaustedMessage(data: unknown, topic: string | undefined): boolean;
|
|
7
|
+
export declare function checkIsConversationLimitReachedMessage(data: unknown, topic: string | undefined): boolean;
|
|
7
8
|
//# sourceMappingURL=dataChannel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataChannel.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAO3D;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,iBAAiB,CAO3B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAS/B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAO/B;
|
|
1
|
+
{"version":3,"file":"dataChannel.d.ts","sourceRoot":"","sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAO3D;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,iBAAiB,CAO3B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAS/B;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,IAAI,IAAI,qBAAqB,CAO/B;AAgBD,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAET;AAED,wBAAgB,sCAAsC,CACpD,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAET"}
|
|
@@ -67,6 +67,9 @@ export type InactivityTimeoutPayload = {
|
|
|
67
67
|
export type CreditExhaustedPayload = {
|
|
68
68
|
conversationId: string;
|
|
69
69
|
};
|
|
70
|
+
export type ConversationLimitReachedPayload = {
|
|
71
|
+
conversationId: string;
|
|
72
|
+
};
|
|
70
73
|
export type ConversationEventMap = {
|
|
71
74
|
userSpeakStart: UserSpeakStartPayload;
|
|
72
75
|
userSpeakStop: UserSpeakStopPayload;
|
|
@@ -85,6 +88,7 @@ export type ConversationEventMap = {
|
|
|
85
88
|
inactivityWarning: InactivityWarningPayload;
|
|
86
89
|
inactivityTimeout: InactivityTimeoutPayload;
|
|
87
90
|
creditExhausted: CreditExhaustedPayload;
|
|
91
|
+
conversationLimitReached: ConversationLimitReachedPayload;
|
|
88
92
|
};
|
|
89
93
|
export type ConversationEvent = keyof ConversationEventMap;
|
|
90
94
|
export type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uBAAuB,EAAE,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,EAAE,qBAAqB,CAAC;IACtC,aAAa,EAAE,oBAAoB,CAAC;IACpC,eAAe,EAAE,sBAAsB,CAAC;IACxC,cAAc,EAAE,qBAAqB,CAAC;IACtC,eAAe,EAAE,sBAAsB,CAAC;IACxC,uBAAuB,EAAE,8BAA8B,CAAC;IACxD,SAAS,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,eAAe,EAAE,sBAAsB,CAAC;IACxC,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,YAAY,EAAE,mBAAmB,CAAC;IAClC,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,iBAAiB,EAAE,wBAAwB,CAAC;IAC5C,eAAe,EAAE,sBAAsB,CAAC;IACxC,wBAAwB,EAAE,+BAA+B,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC;AAE3D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,iBAAiB,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.
|
|
2
|
+
"version": "1.28.0",
|
|
3
3
|
"name": "@wix/legends-platform-sdk",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": {
|
|
@@ -103,5 +103,5 @@
|
|
|
103
103
|
"wallaby": {
|
|
104
104
|
"autoDetect": true
|
|
105
105
|
},
|
|
106
|
-
"falconPackageHash": "
|
|
106
|
+
"falconPackageHash": "cd4e2ed8b483ab881fd7e37c70b3c2e37eafb383adf2e66a8b41145e"
|
|
107
107
|
}
|