@wix/legends-platform-sdk 1.32.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +2 -0
  2. package/dist/cjs/components/ChromaKey/ChromaKey.js +14 -4
  3. package/dist/cjs/components/ChromaKey/ChromaKey.js.map +1 -1
  4. package/dist/cjs/components/ChromaKey/chroma-key.js +3 -0
  5. package/dist/cjs/components/ChromaKey/chroma-key.js.map +1 -1
  6. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js +32 -7
  7. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  8. package/dist/cjs/components/Video/Video.js +16 -2
  9. package/dist/cjs/components/Video/Video.js.map +1 -1
  10. package/dist/cjs/components/Video/types.js.map +1 -1
  11. package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js +12 -3
  12. package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
  13. package/dist/cjs/hooks/useConversation/livekit/useConversation.js +24 -14
  14. package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
  15. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js +11 -3
  16. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  17. package/dist/cjs/hooks/useTextChat/streamChatMessage.js +3 -1
  18. package/dist/cjs/hooks/useTextChat/streamChatMessage.js.map +1 -1
  19. package/dist/cjs/hooks/useTextChat/useTextChat.js +3 -2
  20. package/dist/cjs/hooks/useTextChat/useTextChat.js.map +1 -1
  21. package/dist/cjs/hooks/useTextChat/useTextChatStream.js +3 -1
  22. package/dist/cjs/hooks/useTextChat/useTextChatStream.js.map +1 -1
  23. package/dist/cjs/hooks/useTextChat/useToolAwareSend.js +5 -3
  24. package/dist/cjs/hooks/useTextChat/useToolAwareSend.js.map +1 -1
  25. package/dist/cjs/sdk-consumer/context.js.map +1 -1
  26. package/dist/cjs/sdk.js +26 -0
  27. package/dist/cjs/sdk.js.map +1 -1
  28. package/dist/cjs/services/FetchPersonaChatService.js +5 -1
  29. package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
  30. package/dist/cjs/startup-telemetry/attempt.js +188 -0
  31. package/dist/cjs/startup-telemetry/attempt.js.map +1 -0
  32. package/dist/cjs/startup-telemetry/frame.js +83 -0
  33. package/dist/cjs/startup-telemetry/frame.js.map +1 -0
  34. package/dist/cjs/startup-telemetry/useStartupAttempt.js +15 -0
  35. package/dist/cjs/startup-telemetry/useStartupAttempt.js.map +1 -0
  36. package/dist/cjs/types/service.js.map +1 -1
  37. package/dist/esm/components/ChromaKey/ChromaKey.js +12 -2
  38. package/dist/esm/components/ChromaKey/ChromaKey.js.map +1 -1
  39. package/dist/esm/components/ChromaKey/chroma-key.js +3 -0
  40. package/dist/esm/components/ChromaKey/chroma-key.js.map +1 -1
  41. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js +28 -3
  42. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  43. package/dist/esm/components/Video/Video.js +16 -1
  44. package/dist/esm/components/Video/Video.js.map +1 -1
  45. package/dist/esm/components/Video/types.js.map +1 -1
  46. package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js +11 -2
  47. package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
  48. package/dist/esm/hooks/useConversation/livekit/useConversation.js +24 -14
  49. package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
  50. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js +11 -3
  51. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  52. package/dist/esm/hooks/useTextChat/streamChatMessage.js +3 -1
  53. package/dist/esm/hooks/useTextChat/streamChatMessage.js.map +1 -1
  54. package/dist/esm/hooks/useTextChat/useTextChat.js +3 -2
  55. package/dist/esm/hooks/useTextChat/useTextChat.js.map +1 -1
  56. package/dist/esm/hooks/useTextChat/useTextChatStream.js +3 -1
  57. package/dist/esm/hooks/useTextChat/useTextChatStream.js.map +1 -1
  58. package/dist/esm/hooks/useTextChat/useToolAwareSend.js +5 -3
  59. package/dist/esm/hooks/useTextChat/useToolAwareSend.js.map +1 -1
  60. package/dist/esm/sdk-consumer/context.js.map +1 -1
  61. package/dist/esm/sdk.js +1 -0
  62. package/dist/esm/sdk.js.map +1 -1
  63. package/dist/esm/services/FetchPersonaChatService.js +5 -1
  64. package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
  65. package/dist/esm/startup-telemetry/attempt.js +180 -0
  66. package/dist/esm/startup-telemetry/attempt.js.map +1 -0
  67. package/dist/esm/startup-telemetry/frame.js +77 -0
  68. package/dist/esm/startup-telemetry/frame.js.map +1 -0
  69. package/dist/esm/startup-telemetry/useStartupAttempt.js +10 -0
  70. package/dist/esm/startup-telemetry/useStartupAttempt.js.map +1 -0
  71. package/dist/esm/types/service.js.map +1 -1
  72. package/dist/types/components/ChromaKey/ChromaKey.d.ts +2 -0
  73. package/dist/types/components/ChromaKey/ChromaKey.d.ts.map +1 -1
  74. package/dist/types/components/ChromaKey/chroma-key.d.ts +1 -0
  75. package/dist/types/components/ChromaKey/chroma-key.d.ts.map +1 -1
  76. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts +2 -0
  77. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts.map +1 -1
  78. package/dist/types/components/Video/Video.d.ts +1 -0
  79. package/dist/types/components/Video/Video.d.ts.map +1 -1
  80. package/dist/types/components/Video/types.d.ts +2 -0
  81. package/dist/types/components/Video/types.d.ts.map +1 -1
  82. package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts +2 -0
  83. package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts.map +1 -1
  84. package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
  85. package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
  86. package/dist/types/hooks/useTextChat/streamChatMessage.d.ts +1 -0
  87. package/dist/types/hooks/useTextChat/streamChatMessage.d.ts.map +1 -1
  88. package/dist/types/hooks/useTextChat/useTextChat.d.ts +2 -0
  89. package/dist/types/hooks/useTextChat/useTextChat.d.ts.map +1 -1
  90. package/dist/types/hooks/useTextChat/useTextChatStream.d.ts +1 -0
  91. package/dist/types/hooks/useTextChat/useTextChatStream.d.ts.map +1 -1
  92. package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts +1 -1
  93. package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts.map +1 -1
  94. package/dist/types/sdk-consumer/context.d.ts +2 -0
  95. package/dist/types/sdk-consumer/context.d.ts.map +1 -1
  96. package/dist/types/sdk.d.ts +2 -0
  97. package/dist/types/sdk.d.ts.map +1 -1
  98. package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
  99. package/dist/types/startup-telemetry/attempt.d.ts +71 -0
  100. package/dist/types/startup-telemetry/attempt.d.ts.map +1 -0
  101. package/dist/types/startup-telemetry/frame.d.ts +6 -0
  102. package/dist/types/startup-telemetry/frame.d.ts.map +1 -0
  103. package/dist/types/startup-telemetry/useStartupAttempt.d.ts +2 -0
  104. package/dist/types/startup-telemetry/useStartupAttempt.d.ts.map +1 -0
  105. package/dist/types/types/service.d.ts +2 -0
  106. package/dist/types/types/service.d.ts.map +1 -1
  107. package/package.json +2 -2
@@ -44,10 +44,12 @@ function useConversation({
44
44
  const [microphone, setMicrophone] = (0, _jotai.useAtom)(_conversation.state.microphone);
45
45
  const [camera, setCamera] = (0, _jotai.useAtom)(_conversation.state.camera);
46
46
  const {
47
- tools: toolsRegistry = {}
47
+ tools: toolsRegistry = {},
48
+ startupTelemetrySession
48
49
  } = (0, _sdkConsumer.useSdkConsumer)();
49
50
  const toolRuntime = (0, _useToolCallingRuntime.useToolCallingRuntime)();
50
51
  const toolsRegistryRef = (0, _reactUse.useLatest)(toolsRegistry);
52
+ const startupSessionRef = (0, _reactUse.useLatest)(startupTelemetrySession);
51
53
 
52
54
  // for use in register/unregister room events
53
55
  const conversationRef = (0, _reactUse.useLatest)(conversation.data);
@@ -156,8 +158,11 @@ function useConversation({
156
158
  const url = new URL((conversation == null || (_conversation$data3 = conversation.data) == null ? void 0 : _conversation$data3.url) || '');
157
159
  const accessToken = url.searchParams.get('token');
158
160
  try {
161
+ var _startupTelemetrySess, _startupTelemetrySess2;
162
+ startupTelemetrySession == null || (_startupTelemetrySess = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess.mark('join_requested');
159
163
  setUserConnectionState('joining');
160
164
  await (room == null ? void 0 : room.connect(conversation.data.url, accessToken, {}));
165
+ startupTelemetrySession == null || (_startupTelemetrySess2 = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess2.mark('room_connected');
161
166
 
162
167
  // sometimes the agent is already joined before the user joins the conversation
163
168
  const remoteParticipant = (0, _utils.findJoinedAgentParticipant)(room, type);
@@ -166,6 +171,8 @@ function useConversation({
166
171
  }
167
172
  enableMediaDevices();
168
173
  } catch (error) {
174
+ var _startupTelemetrySess3;
175
+ startupTelemetrySession == null || (_startupTelemetrySess3 = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess3.finish('error', 'join_failed');
169
176
  console.error('Failed to join', error);
170
177
  setUserConnectionState('join-error');
171
178
  }
@@ -399,6 +406,8 @@ function useConversation({
399
406
  setConversationStatus('error');
400
407
  }
401
408
  function handleDisconnectedEvent(reason) {
409
+ var _startupSessionRef$cu, _conversationRef$curr0;
410
+ (_startupSessionRef$cu = startupSessionRef.current) == null || (_startupSessionRef$cu = _startupSessionRef$cu.get((_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id)) == null || _startupSessionRef$cu.finish(reason === _livekitClient.DisconnectReason.CLIENT_INITIATED ? 'cancelled' : 'error', 'disconnected_before_frame');
402
411
  isConnectedRef.current = false;
403
412
  acousticPhaseRef.current = 'idle';
404
413
  acousticT0Ref.current = null;
@@ -447,18 +456,19 @@ function useConversation({
447
456
  }
448
457
  }
449
458
  function handleAgentJoin(participant) {
450
- var _conversationRef$curr0;
459
+ var _startupSessionRef$cu2, _conversationRef$curr1, _conversationRef$curr10;
460
+ (_startupSessionRef$cu2 = startupSessionRef.current) == null || (_startupSessionRef$cu2 = _startupSessionRef$cu2.get((_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id)) == null || _startupSessionRef$cu2.mark('agent_joined');
451
461
  setAgentConnectionState('joined');
452
462
  emitEvent('agentJoined', {
453
- conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id,
463
+ conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
454
464
  participant
455
465
  });
456
466
  }
457
467
  function handleParticipantDisconnectedEvent(participant) {
458
- var _conversationRef$curr1;
468
+ var _conversationRef$curr11;
459
469
  setAgentConnectionState('left');
460
470
  emitEvent('agentLeft', {
461
- conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id,
471
+ conversationId: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.id,
462
472
  participant
463
473
  });
464
474
  }
@@ -467,13 +477,13 @@ function useConversation({
467
477
  return;
468
478
  }
469
479
  try {
470
- var _conversationRef$curr10;
480
+ var _conversationRef$curr12;
471
481
  setUserConnectionState('leaving');
472
482
  await (room == null ? void 0 : room.disconnect(true));
473
483
  setConversationStatus('destroyed');
474
484
  setJoinedAt(undefined);
475
485
  emitEvent('callEnded', {
476
- conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id
486
+ conversationId: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.id
477
487
  });
478
488
  } catch (error) {
479
489
  console.error('Failed to leave', error);
@@ -481,22 +491,22 @@ function useConversation({
481
491
  }
482
492
  }
483
493
  async function handleExpire() {
484
- var _conversationRef$curr11, _conversationRef$curr12;
494
+ var _conversationRef$curr13, _conversationRef$curr14;
485
495
  // The duration timer keeps running after the call ends.
486
496
  if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached' || conversationStatus === 'plan-minutes-exhausted') {
487
497
  return;
488
498
  }
489
499
  emitEvent('timeExceeded', {
490
- conversationId: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.id,
491
- limit: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.limit
500
+ conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id,
501
+ limit: (_conversationRef$curr14 = conversationRef.current) == null ? void 0 : _conversationRef$curr14.limit
492
502
  });
493
503
  await leave();
494
504
  setConversationStatus('exceeded');
495
505
  }
496
506
  async function interrupt() {
497
- var _conversationRef$curr13;
507
+ var _conversationRef$curr15;
498
508
  emitEvent('interrupt', {
499
- conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id
509
+ conversationId: (_conversationRef$curr15 = conversationRef.current) == null ? void 0 : _conversationRef$curr15.id
500
510
  });
501
511
  await (0, _utils.publishConversationDataMessage)(room, {}, 'interrupt');
502
512
  }
@@ -506,7 +516,7 @@ function useConversation({
506
516
  }, 'inactivity_dismiss');
507
517
  }
508
518
  async function send(message, attachments = []) {
509
- var _conversationRef$curr14;
519
+ var _conversationRef$curr16;
510
520
  await (room == null ? void 0 : room.localParticipant.sendText(message, {
511
521
  topic: 'lk.chat',
512
522
  attributes: {
@@ -514,7 +524,7 @@ function useConversation({
514
524
  }
515
525
  }));
516
526
  emitEvent('userSendMessage', {
517
- conversationId: (_conversationRef$curr14 = conversationRef.current) == null ? void 0 : _conversationRef$curr14.id,
527
+ conversationId: (_conversationRef$curr16 = conversationRef.current) == null ? void 0 : _conversationRef$curr16.id,
518
528
  message
519
529
  });
520
530
  }
@@ -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","conversationLanguage","_conversation$data2","setLogLevel","LogLevel","silent","conversation","useCreateConversation","room","useEnsureRoom","speaker","useAtomValue","state","microphone","setMicrophone","useAtom","camera","setCamera","tools","toolsRegistry","useSdkConsumer","toolRuntime","useToolCallingRuntime","toolsRegistryRef","useLatest","conversationRef","data","toolRuntimeRef","conversationStatus","setConversationStatus","userConnectionState","setUserConnectionState","joinedAt","setJoinedAt","setActiveMediaDevice","setMicrophoneDeviceId","useMediaDeviceSelect","kind","setSpeakerDeviceId","setCameraDeviceId","requestPermissions","enabled","setTranscriptions","useSetAtom","transcriptions","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","useEmitConversationEvent","inactivityTimeoutRef","useRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","useParticipantTrack","source","Source","Microphone","agentMicPublication","timer","useTimer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","useEffect","registerRoomEvents","unregisterRoomEvents","useUpdateEffect","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","invariant","url","URL","accessToken","searchParams","get","connect","remoteParticipant","findJoinedAgentParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","ParticipantKind","AGENT","old","mergeTranscriptions","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","ACOUSTIC_USER_HANGOVER_MS","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","userReport","agentReport","Promise","all","getTrackStats","userStats","parseTrackStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","useSpeechActivityDetector","onSpeechStart","onSpeechEnd","thresholdRms","ACOUSTIC_USER_THRESHOLD_RMS","hangoverMs","ACOUSTIC_AGENT_HANGOVER_MS","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","buildToolDefinitions","handleExecuteToolRpc","call","parseFunctionCallPayload","payload","functionCallId","result","executeToolCalls","extractToolErrorMessage","dataChannelHandlers","guard","checkIsTurnDetectionData","handle","checkIsInactivityWarningData","checkIsInactivityTimeoutData","handleDataReceivedEvent","_participant","_kind","topic","decoded","decodeDataPayload","checkIsCreditExhaustedMessage","_conversationRef$curr6","checkIsConversationLimitReachedMessage","_conversationRef$curr7","checkIsPlanMinutesExhaustedMessage","_conversationRef$curr8","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_conversationRef$curr0","handleParticipantDisconnectedEvent","_conversationRef$curr1","leave","_conversationRef$curr10","disconnect","_conversationRef$curr11","_conversationRef$curr12","interrupt","_conversationRef$curr13","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr14","sendText","attributes","safeStringify","on","unregisterRpcMethod","GET_TOOLS_RPC_METHOD","EXECUTE_TOOL_RPC_METHOD","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n checkIsPlanMinutesExhaustedMessage,\n buildToolDefinitions,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n parseFunctionCallPayload,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\nimport {\n ACOUSTIC_AGENT_HANGOVER_MS,\n ACOUSTIC_USER_HANGOVER_MS,\n ACOUSTIC_USER_THRESHOLD_RMS,\n EXECUTE_TOOL_RPC_METHOD,\n GET_TOOLS_RPC_METHOD,\n} from './constants';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({\n type,\n config,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const { tools: toolsRegistry = {} } = useSdkConsumer();\n const toolRuntime = useToolCallingRuntime();\n const toolsRegistryRef = useLatest(toolsRegistry);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const inactivityTimeoutRef = useRef(false);\n const creditExhaustedRef = useRef(false);\n const conversationLimitReachedRef = useRef(false);\n const planMinutesExhaustedRef = useRef(false);\n const acousticPhaseRef = useRef<'idle' | 'waitingForAgent' | 'busy'>('idle');\n const acousticT0Ref = useRef<number | null>(null);\n const latestTurnMetadataRef = useRef<{\n turnDetectionStrategy?: string;\n sequence?: number;\n speechId?: string;\n }>({});\n const isConnectedRef = useRef(false);\n const userCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n const agentCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n\n const userMicPublication = useParticipantTrack({\n type: 'user',\n source: Source.Microphone,\n });\n const agentMicPublication = useParticipantTrack({\n type: 'agent',\n source: Source.Microphone,\n });\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n latestTurnMetadataRef.current = {\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (data.speechId) {\n latestTurnMetadataRef.current = {\n ...latestTurnMetadataRef.current,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleAcousticUserOnset() {\n if (!isConnectedRef.current) {\n return;\n }\n if (acousticPhaseRef.current === 'waitingForAgent') {\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n }\n }\n\n function handleAcousticUserOffset(timestampMs: number) {\n if (!isConnectedRef.current || acousticPhaseRef.current !== 'idle') {\n return;\n }\n acousticT0Ref.current = timestampMs - ACOUSTIC_USER_HANGOVER_MS;\n acousticPhaseRef.current = 'waitingForAgent';\n }\n\n function handleAcousticAgentOnset(timestampMs: number) {\n if (\n !isConnectedRef.current ||\n acousticPhaseRef.current !== 'waitingForAgent' ||\n acousticT0Ref.current == null\n ) {\n return;\n }\n\n const latencyMs = timestampMs - acousticT0Ref.current;\n acousticT0Ref.current = null;\n acousticPhaseRef.current = 'busy';\n\n if (latencyMs < 0 || latencyMs > 15000) {\n return;\n }\n\n emitEvent('responseLatency', {\n conversationId: conversationRef.current?.id!,\n latencyMs,\n turnDetectionStrategy:\n latestTurnMetadataRef.current.turnDetectionStrategy!,\n sequence: latestTurnMetadataRef.current.sequence,\n speechId: latestTurnMetadataRef.current.speechId,\n });\n\n void emitConversationTurnLatency(latencyMs);\n }\n\n async function emitConversationTurnLatency(clientAcousticLatencyMs: number) {\n const [userReport, agentReport] = await Promise.all([\n getTrackStats(userMicPublication),\n getTrackStats(agentMicPublication),\n ]);\n const userStats = parseTrackStats(\n userReport,\n userCumulativeTrackStatsRef.current,\n );\n const agentStats = parseTrackStats(\n agentReport,\n agentCumulativeTrackStatsRef.current,\n );\n userCumulativeTrackStatsRef.current = userStats.cumulativeTrackStats;\n agentCumulativeTrackStatsRef.current = agentStats.cumulativeTrackStats;\n\n emitEvent('conversationTurnLatency', {\n conversationId: conversationRef.current?.id!,\n speechId: latestTurnMetadataRef.current.speechId,\n sequence: latestTurnMetadataRef.current.sequence,\n clientAcousticLatencyMs,\n rttMs: userStats.roundTripTimeMs,\n jitterBufferDelayMs: agentStats.jitterBufferDelayMs,\n userPacketsLost: userStats.packetsLost,\n agentPacketsLost: agentStats.packetsLost,\n });\n }\n\n function handleAcousticAgentOffset() {\n acousticPhaseRef.current = 'idle';\n }\n\n useSpeechActivityDetector({\n source: 'user',\n onSpeechStart: handleAcousticUserOnset,\n onSpeechEnd: handleAcousticUserOffset,\n thresholdRms: ACOUSTIC_USER_THRESHOLD_RMS,\n hangoverMs: ACOUSTIC_USER_HANGOVER_MS,\n });\n useSpeechActivityDetector({\n source: 'agent',\n onSpeechStart: handleAcousticAgentOnset,\n onSpeechEnd: handleAcousticAgentOffset,\n hangoverMs: ACOUSTIC_AGENT_HANGOVER_MS,\n });\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n function handleInactivityTimeoutEvent(_data: InactivityTimeoutData) {\n inactivityTimeoutRef.current = true;\n emitEvent('inactivityTimeout', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleGetToolsRpc() {\n return JSON.stringify(buildToolDefinitions(toolsRegistryRef.current));\n }\n\n async function handleExecuteToolRpc(data: RpcInvocationData) {\n const call = parseFunctionCallPayload(data.payload);\n if (!call) {\n return JSON.stringify({\n functionCallId: '',\n result: '',\n error: 'Malformed function call payload.',\n } satisfies FunctionCallResult);\n }\n try {\n const [result] = await toolRuntimeRef.current.executeToolCalls([call]);\n return JSON.stringify(result);\n } catch (error) {\n return JSON.stringify({\n functionCallId: call.functionCallId,\n result: '',\n error: extractToolErrorMessage(error),\n } satisfies FunctionCallResult);\n }\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityTimeoutData,\n handle: handleInactivityTimeoutEvent as (data: unknown) => void,\n },\n ];\n\n function handleDataReceivedEvent(\n payload: Uint8Array,\n _participant?: RemoteParticipant,\n _kind?: unknown,\n topic?: string,\n ) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n if (checkIsCreditExhaustedMessage(decoded, topic)) {\n creditExhaustedRef.current = true;\n emitEvent('creditExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsConversationLimitReachedMessage(decoded, topic)) {\n conversationLimitReachedRef.current = true;\n emitEvent('conversationLimitReached', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsPlanMinutesExhaustedMessage(decoded, topic)) {\n planMinutesExhaustedRef.current = true;\n emitEvent('planMinutesExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n isConnectedRef.current = true;\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n isConnectedRef.current = false;\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n latestTurnMetadataRef.current = {};\n userCumulativeTrackStatsRef.current = undefined;\n agentCumulativeTrackStatsRef.current = undefined;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n if (inactivityTimeoutRef.current) {\n inactivityTimeoutRef.current = false;\n setConversationStatus('inactivity-timeout');\n return;\n }\n\n if (creditExhaustedRef.current) {\n creditExhaustedRef.current = false;\n setConversationStatus('credit-exhausted');\n return;\n }\n\n if (conversationLimitReachedRef.current) {\n conversationLimitReachedRef.current = false;\n setConversationStatus('conversation-limit-reached');\n return;\n }\n\n if (planMinutesExhaustedRef.current) {\n planMinutesExhaustedRef.current = false;\n setConversationStatus('plan-minutes-exhausted');\n return;\n }\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n // The duration timer keeps running after the call ends.\n if (\n conversationStatus === 'credit-exhausted' ||\n conversationStatus === 'conversation-limit-reached' ||\n conversationStatus === 'plan-minutes-exhausted'\n ) {\n return;\n }\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.registerRpcMethod(GET_TOOLS_RPC_METHOD, handleGetToolsRpc);\n room.registerRpcMethod(EXECUTE_TOOL_RPC_METHOD, handleExecuteToolRpc);\n }\n\n function unregisterRoomEvents() {\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_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","conversationLanguage","_conversation$data2","setLogLevel","LogLevel","silent","conversation","useCreateConversation","room","useEnsureRoom","speaker","useAtomValue","state","microphone","setMicrophone","useAtom","camera","setCamera","tools","toolsRegistry","startupTelemetrySession","useSdkConsumer","toolRuntime","useToolCallingRuntime","toolsRegistryRef","useLatest","startupSessionRef","conversationRef","data","toolRuntimeRef","conversationStatus","setConversationStatus","userConnectionState","setUserConnectionState","joinedAt","setJoinedAt","setActiveMediaDevice","setMicrophoneDeviceId","useMediaDeviceSelect","kind","setSpeakerDeviceId","setCameraDeviceId","requestPermissions","enabled","setTranscriptions","useSetAtom","transcriptions","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","useEmitConversationEvent","inactivityTimeoutRef","useRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","useParticipantTrack","source","Source","Microphone","agentMicPublication","timer","useTimer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","useEffect","registerRoomEvents","unregisterRoomEvents","useUpdateEffect","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","invariant","url","URL","accessToken","searchParams","get","_startupTelemetrySess","_startupTelemetrySess2","id","mark","connect","remoteParticipant","findJoinedAgentParticipant","handleAgentJoin","enableMediaDevices","error","_startupTelemetrySess3","finish","console","handleTranscriptionReceivedEvent","segments","participant","map","s","message","text","ParticipantKind","AGENT","old","mergeTranscriptions","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","ACOUSTIC_USER_HANGOVER_MS","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","userReport","agentReport","Promise","all","getTrackStats","userStats","parseTrackStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","useSpeechActivityDetector","onSpeechStart","onSpeechEnd","thresholdRms","ACOUSTIC_USER_THRESHOLD_RMS","hangoverMs","ACOUSTIC_AGENT_HANGOVER_MS","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","buildToolDefinitions","handleExecuteToolRpc","call","parseFunctionCallPayload","payload","functionCallId","result","executeToolCalls","extractToolErrorMessage","dataChannelHandlers","guard","checkIsTurnDetectionData","handle","checkIsInactivityWarningData","checkIsInactivityTimeoutData","handleDataReceivedEvent","_participant","_kind","topic","decoded","decodeDataPayload","checkIsCreditExhaustedMessage","_conversationRef$curr6","checkIsConversationLimitReachedMessage","_conversationRef$curr7","checkIsPlanMinutesExhaustedMessage","_conversationRef$curr8","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","_startupSessionRef$cu","_conversationRef$curr0","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_startupSessionRef$cu2","_conversationRef$curr1","_conversationRef$curr10","handleParticipantDisconnectedEvent","_conversationRef$curr11","leave","_conversationRef$curr12","disconnect","_conversationRef$curr13","_conversationRef$curr14","interrupt","_conversationRef$curr15","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr16","sendText","attributes","safeStringify","on","unregisterRpcMethod","GET_TOOLS_RPC_METHOD","EXECUTE_TOOL_RPC_METHOD","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n checkIsPlanMinutesExhaustedMessage,\n buildToolDefinitions,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n parseFunctionCallPayload,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\nimport {\n ACOUSTIC_AGENT_HANGOVER_MS,\n ACOUSTIC_USER_HANGOVER_MS,\n ACOUSTIC_USER_THRESHOLD_RMS,\n EXECUTE_TOOL_RPC_METHOD,\n GET_TOOLS_RPC_METHOD,\n} from './constants';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({\n type,\n config,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const { tools: toolsRegistry = {}, startupTelemetrySession } =\n useSdkConsumer();\n const toolRuntime = useToolCallingRuntime();\n const toolsRegistryRef = useLatest(toolsRegistry);\n const startupSessionRef = useLatest(startupTelemetrySession);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const inactivityTimeoutRef = useRef(false);\n const creditExhaustedRef = useRef(false);\n const conversationLimitReachedRef = useRef(false);\n const planMinutesExhaustedRef = useRef(false);\n const acousticPhaseRef = useRef<'idle' | 'waitingForAgent' | 'busy'>('idle');\n const acousticT0Ref = useRef<number | null>(null);\n const latestTurnMetadataRef = useRef<{\n turnDetectionStrategy?: string;\n sequence?: number;\n speechId?: string;\n }>({});\n const isConnectedRef = useRef(false);\n const userCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n const agentCumulativeTrackStatsRef = useRef<CumulativeTrackStats | undefined>(\n undefined,\n );\n\n const userMicPublication = useParticipantTrack({\n type: 'user',\n source: Source.Microphone,\n });\n const agentMicPublication = useParticipantTrack({\n type: 'agent',\n source: Source.Microphone,\n });\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n startupTelemetrySession\n ?.get(conversation.data.id)\n ?.mark('join_requested');\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n startupTelemetrySession\n ?.get(conversation.data.id)\n ?.mark('room_connected');\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n startupTelemetrySession\n ?.get(conversation.data.id)\n ?.finish('error', 'join_failed');\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n latestTurnMetadataRef.current = {\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (data.speechId) {\n latestTurnMetadataRef.current = {\n ...latestTurnMetadataRef.current,\n speechId: data.speechId,\n };\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleAcousticUserOnset() {\n if (!isConnectedRef.current) {\n return;\n }\n if (acousticPhaseRef.current === 'waitingForAgent') {\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n }\n }\n\n function handleAcousticUserOffset(timestampMs: number) {\n if (!isConnectedRef.current || acousticPhaseRef.current !== 'idle') {\n return;\n }\n acousticT0Ref.current = timestampMs - ACOUSTIC_USER_HANGOVER_MS;\n acousticPhaseRef.current = 'waitingForAgent';\n }\n\n function handleAcousticAgentOnset(timestampMs: number) {\n if (\n !isConnectedRef.current ||\n acousticPhaseRef.current !== 'waitingForAgent' ||\n acousticT0Ref.current == null\n ) {\n return;\n }\n\n const latencyMs = timestampMs - acousticT0Ref.current;\n acousticT0Ref.current = null;\n acousticPhaseRef.current = 'busy';\n\n if (latencyMs < 0 || latencyMs > 15000) {\n return;\n }\n\n emitEvent('responseLatency', {\n conversationId: conversationRef.current?.id!,\n latencyMs,\n turnDetectionStrategy:\n latestTurnMetadataRef.current.turnDetectionStrategy!,\n sequence: latestTurnMetadataRef.current.sequence,\n speechId: latestTurnMetadataRef.current.speechId,\n });\n\n void emitConversationTurnLatency(latencyMs);\n }\n\n async function emitConversationTurnLatency(clientAcousticLatencyMs: number) {\n const [userReport, agentReport] = await Promise.all([\n getTrackStats(userMicPublication),\n getTrackStats(agentMicPublication),\n ]);\n const userStats = parseTrackStats(\n userReport,\n userCumulativeTrackStatsRef.current,\n );\n const agentStats = parseTrackStats(\n agentReport,\n agentCumulativeTrackStatsRef.current,\n );\n userCumulativeTrackStatsRef.current = userStats.cumulativeTrackStats;\n agentCumulativeTrackStatsRef.current = agentStats.cumulativeTrackStats;\n\n emitEvent('conversationTurnLatency', {\n conversationId: conversationRef.current?.id!,\n speechId: latestTurnMetadataRef.current.speechId,\n sequence: latestTurnMetadataRef.current.sequence,\n clientAcousticLatencyMs,\n rttMs: userStats.roundTripTimeMs,\n jitterBufferDelayMs: agentStats.jitterBufferDelayMs,\n userPacketsLost: userStats.packetsLost,\n agentPacketsLost: agentStats.packetsLost,\n });\n }\n\n function handleAcousticAgentOffset() {\n acousticPhaseRef.current = 'idle';\n }\n\n useSpeechActivityDetector({\n source: 'user',\n onSpeechStart: handleAcousticUserOnset,\n onSpeechEnd: handleAcousticUserOffset,\n thresholdRms: ACOUSTIC_USER_THRESHOLD_RMS,\n hangoverMs: ACOUSTIC_USER_HANGOVER_MS,\n });\n useSpeechActivityDetector({\n source: 'agent',\n onSpeechStart: handleAcousticAgentOnset,\n onSpeechEnd: handleAcousticAgentOffset,\n hangoverMs: ACOUSTIC_AGENT_HANGOVER_MS,\n });\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n function handleInactivityTimeoutEvent(_data: InactivityTimeoutData) {\n inactivityTimeoutRef.current = true;\n emitEvent('inactivityTimeout', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleGetToolsRpc() {\n return JSON.stringify(buildToolDefinitions(toolsRegistryRef.current));\n }\n\n async function handleExecuteToolRpc(data: RpcInvocationData) {\n const call = parseFunctionCallPayload(data.payload);\n if (!call) {\n return JSON.stringify({\n functionCallId: '',\n result: '',\n error: 'Malformed function call payload.',\n } satisfies FunctionCallResult);\n }\n try {\n const [result] = await toolRuntimeRef.current.executeToolCalls([call]);\n return JSON.stringify(result);\n } catch (error) {\n return JSON.stringify({\n functionCallId: call.functionCallId,\n result: '',\n error: extractToolErrorMessage(error),\n } satisfies FunctionCallResult);\n }\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityTimeoutData,\n handle: handleInactivityTimeoutEvent as (data: unknown) => void,\n },\n ];\n\n function handleDataReceivedEvent(\n payload: Uint8Array,\n _participant?: RemoteParticipant,\n _kind?: unknown,\n topic?: string,\n ) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n if (checkIsCreditExhaustedMessage(decoded, topic)) {\n creditExhaustedRef.current = true;\n emitEvent('creditExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsConversationLimitReachedMessage(decoded, topic)) {\n conversationLimitReachedRef.current = true;\n emitEvent('conversationLimitReached', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n if (checkIsPlanMinutesExhaustedMessage(decoded, topic)) {\n planMinutesExhaustedRef.current = true;\n emitEvent('planMinutesExhausted', {\n conversationId: conversationRef.current?.id!,\n });\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n isConnectedRef.current = true;\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n startupSessionRef.current\n ?.get(conversationRef.current?.id)\n ?.finish(\n reason === DisconnectReason.CLIENT_INITIATED ? 'cancelled' : 'error',\n 'disconnected_before_frame',\n );\n isConnectedRef.current = false;\n acousticPhaseRef.current = 'idle';\n acousticT0Ref.current = null;\n latestTurnMetadataRef.current = {};\n userCumulativeTrackStatsRef.current = undefined;\n agentCumulativeTrackStatsRef.current = undefined;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n if (inactivityTimeoutRef.current) {\n inactivityTimeoutRef.current = false;\n setConversationStatus('inactivity-timeout');\n return;\n }\n\n if (creditExhaustedRef.current) {\n creditExhaustedRef.current = false;\n setConversationStatus('credit-exhausted');\n return;\n }\n\n if (conversationLimitReachedRef.current) {\n conversationLimitReachedRef.current = false;\n setConversationStatus('conversation-limit-reached');\n return;\n }\n\n if (planMinutesExhaustedRef.current) {\n planMinutesExhaustedRef.current = false;\n setConversationStatus('plan-minutes-exhausted');\n return;\n }\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n startupSessionRef.current\n ?.get(conversationRef.current?.id)\n ?.mark('agent_joined');\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n // The duration timer keeps running after the call ends.\n if (\n conversationStatus === 'credit-exhausted' ||\n conversationStatus === 'conversation-limit-reached' ||\n conversationStatus === 'plan-minutes-exhausted'\n ) {\n return;\n }\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.registerRpcMethod(GET_TOOLS_RPC_METHOD, handleGetToolsRpc);\n room.registerRpcMethod(EXECUTE_TOOL_RPC_METHOD, handleExecuteToolRpc);\n }\n\n function unregisterRoomEvents() {\n room.unregisterRpcMethod(GET_TOOLS_RPC_METHOD);\n room.unregisterRpcMethod(EXECUTE_TOOL_RPC_METHOD);\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -23,19 +23,25 @@ function useCreateConversation(options) {
23
23
  const {
24
24
  chatId,
25
25
  namespace,
26
- personaChatService
26
+ personaChatService,
27
+ startupTelemetrySession
27
28
  } = (0, _sdkConsumer.useSdkConsumer)();
28
29
  const setConversationStatus = (0, _jotai.useSetAtom)(_conversation.state.conversationStatus);
29
30
  const [conversation, setConversation] = (0, _jotai.useAtom)(_conversation.state.conversation);
30
31
  const emitEvent = (0, _useEmitConversationEvent.useEmitConversationEvent)();
31
32
  (0, _react.useEffect)(() => {
32
- void create().then(() => setConversationStatus('created')).catch(error => {
33
+ const startupAttempt = type === 'video' ? startupTelemetrySession == null ? void 0 : startupTelemetrySession.start() : undefined;
34
+ startupAttempt == null || startupAttempt.mark('api_request');
35
+ void create(startupAttempt).then(() => setConversationStatus('created')).catch(error => {
36
+ startupAttempt == null || startupAttempt.finish('error', 'create_failed');
33
37
  const status = (0, _createConversationFailureStatus.createConversationFailureStatus)(error);
34
38
  if (status === 'plan-minutes-exhausted') {
35
39
  emitEvent('planMinutesExhausted', {});
36
40
  }
37
41
  setConversationStatus(status);
38
42
  });
43
+ return () => startupTelemetrySession == null ? void 0 : startupTelemetrySession.release(startupAttempt);
44
+ // Telemetry changes must not issue another create-conversation request.
39
45
  }, [type, chatId]);
40
46
  (0, _reactUse.useUnmount)(() => {
41
47
  if (!conversation) {
@@ -55,7 +61,7 @@ function useCreateConversation(options) {
55
61
  data: conversation,
56
62
  destroy
57
63
  };
58
- async function create() {
64
+ async function create(startupAttempt) {
59
65
  (0, _invariant.default)(personaChatService, 'personaChatService is required. Pass it as a prop to LegendsPlatform.');
60
66
  switch (type) {
61
67
  case 'video':
@@ -68,6 +74,8 @@ function useCreateConversation(options) {
68
74
  lastConversationTopic,
69
75
  conversationLanguage
70
76
  });
77
+ startupTelemetrySession == null || startupTelemetrySession.bind(startupAttempt, result.id);
78
+ startupAttempt == null || startupAttempt.mark('api_response');
71
79
  setConversation({
72
80
  type: 'video',
73
81
  url: result.url,
@@ -1 +1 @@
1
- {"version":3,"names":["_invariant","_interopRequireDefault","require","_react","_jotai","_reactUse","_conversation","_sdkConsumer","_useEmitConversationEvent","_createConversationFailureStatus","_helpers","useCreateConversation","options","type","config","chatConfig","firstConversation","lastConversationTopic","conversationLanguage","chatId","namespace","personaChatService","useSdkConsumer","setConversationStatus","useSetAtom","state","conversationStatus","conversation","setConversation","useAtom","emitEvent","useEmitConversationEvent","useEffect","create","then","catch","error","status","createConversationFailureStatus","useUnmount","destroy","limit","data","invariant","result","createInteractiveConversation","url","id","createVoiceConversation","Error","endInteractiveConversation","conversationId","undefined"],"sources":["../../../../src/hooks/useCreateConversation/useCreateConversation.ts"],"sourcesContent":["import invariant from 'invariant';\nimport { useEffect } from 'react';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { useUnmount } from 'react-use';\n\nimport {\n state,\n type ConversationType,\n type Conversation,\n} from '../../conversation';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { useEmitConversationEvent } from '../useConversationEvents/useEmitConversationEvent';\nimport { createConversationFailureStatus } from './createConversationFailureStatus';\nimport { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?: object;\n /** Whether this is the visitor's first-ever conversation with the persona (drives the opening message). */\n firstConversation?: boolean;\n /** Title of the visitor's last meaningful conversation, for a returning-visitor greeting. */\n lastConversationTopic?: string;\n /** Language or locale for a new voice/video call, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n};\n\nexport type UseCreateConversationResult = {\n data?: Conversation;\n destroy(): Promise<void>;\n};\n\nexport function useCreateConversation(\n options: UseCreateConversationOptions,\n): UseCreateConversationResult {\n const {\n type,\n config: chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const setConversationStatus = useSetAtom(state.conversationStatus);\n const [conversation, setConversation] = useAtom(state.conversation);\n const emitEvent = useEmitConversationEvent();\n\n useEffect(() => {\n void create()\n .then(() => setConversationStatus('created'))\n .catch((error: unknown) => {\n const status = createConversationFailureStatus(error);\n if (status === 'plan-minutes-exhausted') {\n emitEvent('planMinutesExhausted', {});\n }\n setConversationStatus(status);\n });\n }, [type, chatId]);\n\n useUnmount(() => {\n if (!conversation) {\n return;\n }\n void destroy();\n });\n\n useEffect(() => {\n if (!conversation) {\n return;\n }\n if (conversation.limit === 0) {\n setConversationStatus('exceeded');\n }\n }, [conversation]);\n\n return { data: conversation, destroy };\n\n async function create() {\n invariant(\n personaChatService,\n 'personaChatService is required. Pass it as a prop to LegendsPlatform.',\n );\n\n switch (type) {\n case 'video': {\n const result = await personaChatService.createInteractiveConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n setConversation({\n type: 'video',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n case 'audio': {\n const result = await personaChatService.createVoiceConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n setConversation({\n type: 'audio',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n default:\n throw new Error(`Unsupported conversation type: ${type}`);\n }\n }\n\n async function destroy() {\n invariant(conversation, 'Conversation is not ready');\n invariant(personaChatService, 'personaChatService is required.');\n\n setConversationStatus('destroying');\n\n if (conversation.type === 'video') {\n await personaChatService\n .endInteractiveConversation({\n chatId,\n conversationId: conversation.id,\n namespace,\n })\n .catch(() => {});\n }\n\n setConversationStatus('destroyed');\n setConversation(undefined);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_invariant","_interopRequireDefault","require","_react","_jotai","_reactUse","_conversation","_sdkConsumer","_useEmitConversationEvent","_createConversationFailureStatus","_helpers","useCreateConversation","options","type","config","chatConfig","firstConversation","lastConversationTopic","conversationLanguage","chatId","namespace","personaChatService","startupTelemetrySession","useSdkConsumer","setConversationStatus","useSetAtom","state","conversationStatus","conversation","setConversation","useAtom","emitEvent","useEmitConversationEvent","useEffect","startupAttempt","start","undefined","mark","create","then","catch","error","finish","status","createConversationFailureStatus","release","useUnmount","destroy","limit","data","invariant","result","createInteractiveConversation","bind","id","url","createVoiceConversation","Error","endInteractiveConversation","conversationId"],"sources":["../../../../src/hooks/useCreateConversation/useCreateConversation.ts"],"sourcesContent":["import invariant from 'invariant';\nimport { useEffect } from 'react';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { useUnmount } from 'react-use';\n\nimport {\n state,\n type ConversationType,\n type Conversation,\n} from '../../conversation';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { useEmitConversationEvent } from '../useConversationEvents/useEmitConversationEvent';\nimport { createConversationFailureStatus } from './createConversationFailureStatus';\nimport { limit } from './helpers';\nimport type { StartupAttempt } from '../../startup-telemetry/attempt';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?: object;\n /** Whether this is the visitor's first-ever conversation with the persona (drives the opening message). */\n firstConversation?: boolean;\n /** Title of the visitor's last meaningful conversation, for a returning-visitor greeting. */\n lastConversationTopic?: string;\n /** Language or locale for a new voice/video call, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n};\n\nexport type UseCreateConversationResult = {\n data?: Conversation;\n destroy(): Promise<void>;\n};\n\nexport function useCreateConversation(\n options: UseCreateConversationOptions,\n): UseCreateConversationResult {\n const {\n type,\n config: chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n } = options;\n\n const { chatId, namespace, personaChatService, startupTelemetrySession } =\n useSdkConsumer();\n\n const setConversationStatus = useSetAtom(state.conversationStatus);\n const [conversation, setConversation] = useAtom(state.conversation);\n const emitEvent = useEmitConversationEvent();\n\n useEffect(() => {\n const startupAttempt =\n type === 'video' ? startupTelemetrySession?.start() : undefined;\n startupAttempt?.mark('api_request');\n void create(startupAttempt)\n .then(() => setConversationStatus('created'))\n .catch((error: unknown) => {\n startupAttempt?.finish('error', 'create_failed');\n const status = createConversationFailureStatus(error);\n if (status === 'plan-minutes-exhausted') {\n emitEvent('planMinutesExhausted', {});\n }\n setConversationStatus(status);\n });\n return () => startupTelemetrySession?.release(startupAttempt);\n // Telemetry changes must not issue another create-conversation request.\n }, [type, chatId]);\n\n useUnmount(() => {\n if (!conversation) {\n return;\n }\n void destroy();\n });\n\n useEffect(() => {\n if (!conversation) {\n return;\n }\n if (conversation.limit === 0) {\n setConversationStatus('exceeded');\n }\n }, [conversation]);\n\n return { data: conversation, destroy };\n\n async function create(startupAttempt?: StartupAttempt) {\n invariant(\n personaChatService,\n 'personaChatService is required. Pass it as a prop to LegendsPlatform.',\n );\n\n switch (type) {\n case 'video': {\n const result = await personaChatService.createInteractiveConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n startupTelemetrySession?.bind(startupAttempt, result.id);\n startupAttempt?.mark('api_response');\n setConversation({\n type: 'video',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n case 'audio': {\n const result = await personaChatService.createVoiceConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n });\n setConversation({\n type: 'audio',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n default:\n throw new Error(`Unsupported conversation type: ${type}`);\n }\n }\n\n async function destroy() {\n invariant(conversation, 'Conversation is not ready');\n invariant(personaChatService, 'personaChatService is required.');\n\n setConversationStatus('destroying');\n\n if (conversation.type === 'video') {\n await personaChatService\n .endInteractiveConversation({\n chatId,\n conversationId: conversation.id,\n namespace,\n })\n .catch(() => {});\n }\n\n setConversationStatus('destroyed');\n setConversation(undefined);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -98,6 +98,7 @@ async function streamChatMessage(params, callbacks, signal) {
98
98
  chatConfig,
99
99
  attachments,
100
100
  metadata,
101
+ conversationLanguage,
101
102
  headers
102
103
  } = params;
103
104
  const {
@@ -126,7 +127,8 @@ async function streamChatMessage(params, callbacks, signal) {
126
127
  namespace,
127
128
  chatConfig,
128
129
  attachments,
129
- metadata
130
+ metadata,
131
+ conversationLanguage
130
132
  }),
131
133
  signal
132
134
  });
@@ -1 +1 @@
1
- {"version":3,"names":["DEFAULT_STREAM_PATH","readCookie","name","_document$cookie$spli","document","undefined","cookie","split","map","part","trim","find","startsWith","slice","length","extractContent","frame","parsed","JSON","parse","content","body","decoded","TextDecoder","decode","Uint8Array","from","atob","char","charCodeAt","inner","extractCanSendChatMessage","payload","canSendChatMessage","createObjectScanner","onObject","buffer","cursor","braceDepth","objectStart","inString","escaped","feed","text","streamChatMessage","params","callbacks","signal","chatId","message","namespace","chatConfig","attachments","metadata","headers","onChunk","onDone","onError","onCanSendChatMessage","xsrfToken","autoXsrf","response","fetch","method","credentials","stringify","ok","Error","status","scanForObjects","canSend","reader","getReader","decoder","done","value","read","stream","err"],"sources":["../../../../src/hooks/useTextChat/streamChatMessage.ts"],"sourcesContent":["// Same-origin Wix persona-chat gateway path. The transport always posts here\n// with `credentials: 'include'`, so the session cookie rides along and a\n// consumer needs no proxy route of its own.\nconst DEFAULT_STREAM_PATH =\n '/_api/persona-chat-service/v1/chat/messages/stream';\n\nexport type StreamCallbacks = {\n onChunk: (token: string) => void;\n onDone: () => void;\n onError: (err: Error) => void;\n onCanSendChatMessage?: (canSend: boolean) => void;\n};\n\nexport type StreamChatMessageParams = {\n chatId: string;\n message: string;\n namespace: string;\n chatConfig?: object;\n attachments?: object[];\n // Request metadata forwarded to the RPC (e.g. `additionalMetadata` carrying\n // opening-message context). Mirrors the top-level `metadata` object the unary\n // `sendChatMessage` request accepts, so a streamed send carries it identically.\n metadata?: object;\n // Extra request headers merged onto the POST. Lets the caller satisfy the\n // host's transport requirements the SDK can't know about — e.g. an\n // `x-xsrf-token` when the endpoint sits behind a CSRF-protected gateway.\n headers?: Record<string, string>;\n};\n\n// Read a cookie value by name in the browser. Returns undefined outside a\n// browser or when the cookie is absent.\nfunction readCookie(name: string): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n return document.cookie\n .split(';')\n .map((part) => part.trim())\n .find((part) => part.startsWith(`${name}=`))\n ?.slice(name.length + 1);\n}\n\n// Pull the assistant text out of one streamed frame. Two framings reach us: the\n// proxy route yields `{ content }` objects, while the gateway wraps each frame\n// as `{ body: base64(json) }`. Returns null for frames without content.\nexport function extractContent(frame: string): string | null {\n try {\n const parsed = JSON.parse(frame);\n if (typeof parsed.content === 'string') {\n return parsed.content;\n }\n if (typeof parsed.body === 'string') {\n const decoded = new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n );\n const inner = JSON.parse(decoded);\n return typeof inner.content === 'string' ? inner.content : null;\n }\n } catch {\n // Incomplete or non-object frame — skip it.\n }\n return null;\n}\n\n// Same lookup order as extractContent: top level first, then the gateway body.\nexport function extractCanSendChatMessage(frame: string): boolean | null {\n try {\n const parsed = JSON.parse(frame);\n const payload =\n typeof parsed.canSendChatMessage === 'boolean' ||\n typeof parsed.body !== 'string'\n ? parsed\n : JSON.parse(\n new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n ),\n );\n return typeof payload.canSendChatMessage === 'boolean'\n ? payload.canSendChatMessage\n : null;\n } catch {\n return null;\n }\n}\n\n// Feeds decoded text through a running scanner that emits each complete\n// top-level `{…}` object as its closing brace arrives.\nexport function createObjectScanner(onObject: (frame: string) => void) {\n let buffer = '';\n let cursor = 0;\n let braceDepth = 0;\n let objectStart = -1;\n let inString = false;\n let escaped = false;\n\n return function feed(text: string) {\n buffer += text;\n for (; cursor < buffer.length; cursor++) {\n const char = buffer[cursor];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n if (char === '\"') {\n inString = true;\n } else if (char === '{') {\n if (braceDepth === 0) {\n objectStart = cursor;\n }\n braceDepth++;\n } else if (char === '}' && braceDepth > 0) {\n braceDepth--;\n if (braceDepth === 0 && objectStart >= 0) {\n onObject(buffer.slice(objectStart, cursor + 1));\n objectStart = -1;\n }\n }\n }\n };\n}\n\nexport async function streamChatMessage(\n params: StreamChatMessageParams,\n callbacks: StreamCallbacks,\n signal?: AbortSignal,\n): Promise<void> {\n const {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n headers,\n } = params;\n const { onChunk, onDone, onError, onCanSendChatMessage } = callbacks;\n\n const xsrfToken = readCookie('XSRF-TOKEN');\n const autoXsrf =\n !headers?.['x-xsrf-token'] && xsrfToken\n ? { 'x-xsrf-token': xsrfToken }\n : undefined;\n\n try {\n // eslint-disable-next-line no-undef\n const response = await fetch(DEFAULT_STREAM_PATH, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json', ...autoXsrf, ...headers },\n body: JSON.stringify({\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n }),\n signal,\n });\n\n if (!response.ok || !response.body) {\n onError(new Error(`Stream request failed: ${response.status}`));\n return;\n }\n\n const scanForObjects = createObjectScanner((frame) => {\n const content = extractContent(frame);\n if (content !== null) {\n onChunk(content);\n }\n const canSend = extractCanSendChatMessage(frame);\n if (canSend !== null) {\n onCanSendChatMessage?.(canSend);\n }\n });\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n scanForObjects(decoder.decode(value, { stream: true }));\n }\n scanForObjects(decoder.decode());\n onDone();\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n onError(err as Error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["DEFAULT_STREAM_PATH","readCookie","name","_document$cookie$spli","document","undefined","cookie","split","map","part","trim","find","startsWith","slice","length","extractContent","frame","parsed","JSON","parse","content","body","decoded","TextDecoder","decode","Uint8Array","from","atob","char","charCodeAt","inner","extractCanSendChatMessage","payload","canSendChatMessage","createObjectScanner","onObject","buffer","cursor","braceDepth","objectStart","inString","escaped","feed","text","streamChatMessage","params","callbacks","signal","chatId","message","namespace","chatConfig","attachments","metadata","conversationLanguage","headers","onChunk","onDone","onError","onCanSendChatMessage","xsrfToken","autoXsrf","response","fetch","method","credentials","stringify","ok","Error","status","scanForObjects","canSend","reader","getReader","decoder","done","value","read","stream","err"],"sources":["../../../../src/hooks/useTextChat/streamChatMessage.ts"],"sourcesContent":["// Same-origin Wix persona-chat gateway path. The transport always posts here\n// with `credentials: 'include'`, so the session cookie rides along and a\n// consumer needs no proxy route of its own.\nconst DEFAULT_STREAM_PATH =\n '/_api/persona-chat-service/v1/chat/messages/stream';\n\nexport type StreamCallbacks = {\n onChunk: (token: string) => void;\n onDone: () => void;\n onError: (err: Error) => void;\n onCanSendChatMessage?: (canSend: boolean) => void;\n};\n\nexport type StreamChatMessageParams = {\n chatId: string;\n message: string;\n namespace: string;\n chatConfig?: object;\n attachments?: object[];\n // Request metadata forwarded to the RPC (e.g. `additionalMetadata` carrying\n // opening-message context). Mirrors the top-level `metadata` object the unary\n // `sendChatMessage` request accepts, so a streamed send carries it identically.\n metadata?: object;\n // Language or locale for the persona's text reply, e.g. es or en-GB.\n conversationLanguage?: string;\n // Extra request headers merged onto the POST. Lets the caller satisfy the\n // host's transport requirements the SDK can't know about — e.g. an\n // `x-xsrf-token` when the endpoint sits behind a CSRF-protected gateway.\n headers?: Record<string, string>;\n};\n\n// Read a cookie value by name in the browser. Returns undefined outside a\n// browser or when the cookie is absent.\nfunction readCookie(name: string): string | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n return document.cookie\n .split(';')\n .map((part) => part.trim())\n .find((part) => part.startsWith(`${name}=`))\n ?.slice(name.length + 1);\n}\n\n// Pull the assistant text out of one streamed frame. Two framings reach us: the\n// proxy route yields `{ content }` objects, while the gateway wraps each frame\n// as `{ body: base64(json) }`. Returns null for frames without content.\nexport function extractContent(frame: string): string | null {\n try {\n const parsed = JSON.parse(frame);\n if (typeof parsed.content === 'string') {\n return parsed.content;\n }\n if (typeof parsed.body === 'string') {\n const decoded = new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n );\n const inner = JSON.parse(decoded);\n return typeof inner.content === 'string' ? inner.content : null;\n }\n } catch {\n // Incomplete or non-object frame — skip it.\n }\n return null;\n}\n\n// Same lookup order as extractContent: top level first, then the gateway body.\nexport function extractCanSendChatMessage(frame: string): boolean | null {\n try {\n const parsed = JSON.parse(frame);\n const payload =\n typeof parsed.canSendChatMessage === 'boolean' ||\n typeof parsed.body !== 'string'\n ? parsed\n : JSON.parse(\n new TextDecoder().decode(\n Uint8Array.from(atob(parsed.body), (char) => char.charCodeAt(0)),\n ),\n );\n return typeof payload.canSendChatMessage === 'boolean'\n ? payload.canSendChatMessage\n : null;\n } catch {\n return null;\n }\n}\n\n// Feeds decoded text through a running scanner that emits each complete\n// top-level `{…}` object as its closing brace arrives.\nexport function createObjectScanner(onObject: (frame: string) => void) {\n let buffer = '';\n let cursor = 0;\n let braceDepth = 0;\n let objectStart = -1;\n let inString = false;\n let escaped = false;\n\n return function feed(text: string) {\n buffer += text;\n for (; cursor < buffer.length; cursor++) {\n const char = buffer[cursor];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n if (char === '\"') {\n inString = true;\n } else if (char === '{') {\n if (braceDepth === 0) {\n objectStart = cursor;\n }\n braceDepth++;\n } else if (char === '}' && braceDepth > 0) {\n braceDepth--;\n if (braceDepth === 0 && objectStart >= 0) {\n onObject(buffer.slice(objectStart, cursor + 1));\n objectStart = -1;\n }\n }\n }\n };\n}\n\nexport async function streamChatMessage(\n params: StreamChatMessageParams,\n callbacks: StreamCallbacks,\n signal?: AbortSignal,\n): Promise<void> {\n const {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n conversationLanguage,\n headers,\n } = params;\n const { onChunk, onDone, onError, onCanSendChatMessage } = callbacks;\n\n const xsrfToken = readCookie('XSRF-TOKEN');\n const autoXsrf =\n !headers?.['x-xsrf-token'] && xsrfToken\n ? { 'x-xsrf-token': xsrfToken }\n : undefined;\n\n try {\n // eslint-disable-next-line no-undef\n const response = await fetch(DEFAULT_STREAM_PATH, {\n method: 'POST',\n credentials: 'include',\n headers: { 'Content-Type': 'application/json', ...autoXsrf, ...headers },\n body: JSON.stringify({\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n conversationLanguage,\n }),\n signal,\n });\n\n if (!response.ok || !response.body) {\n onError(new Error(`Stream request failed: ${response.status}`));\n return;\n }\n\n const scanForObjects = createObjectScanner((frame) => {\n const content = extractContent(frame);\n if (content !== null) {\n onChunk(content);\n }\n const canSend = extractCanSendChatMessage(frame);\n if (canSend !== null) {\n onCanSendChatMessage?.(canSend);\n }\n });\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n scanForObjects(decoder.decode(value, { stream: true }));\n }\n scanForObjects(decoder.decode());\n onDone();\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n onError(err as Error);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,14 +8,15 @@ var _usePendingMessages = require("./usePendingMessages");
8
8
  var _useToolAwareSend = require("./useToolAwareSend");
9
9
  function useTextChat(options = {}) {
10
10
  const {
11
- limit = 100
11
+ limit = 100,
12
+ conversationLanguage
12
13
  } = options;
13
14
  const {
14
15
  chatId,
15
16
  namespace,
16
17
  personaChatService
17
18
  } = (0, _sdkConsumer.useSdkConsumer)();
18
- const send = (0, _useToolAwareSend.useToolAwareSend)(chatId, namespace);
19
+ const send = (0, _useToolAwareSend.useToolAwareSend)(chatId, namespace, conversationLanguage);
19
20
  const pending = (0, _usePendingMessages.usePendingMessages)();
20
21
  const {
21
22
  data: messages = [],
@@ -1 +1 @@
1
- {"version":3,"names":["_reactQuery","require","_sdkConsumer","_usePendingMessages","_useToolAwareSend","useTextChat","options","limit","chatId","namespace","personaChatService","useSdkConsumer","send","useToolAwareSend","pending","usePendingMessages","data","messages","status","fetchNextPage","refetch","useInfiniteQuery","queryKey","queryFn","pageParam","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","pages","flatMap","page","fetchNext","sendMessage","message"],"sources":["../../../../src/hooks/useTextChat/useTextChat.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport type {\n ChatMessage,\n ChatMessageAttachment,\n SendMessageMetadata,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { usePendingMessages } from './usePendingMessages';\nimport { useToolAwareSend } from './useToolAwareSend';\n\ninterface UseTextChatOptions {\n limit?: number;\n}\n\nexport function useTextChat(options: UseTextChatOptions = {}) {\n const { limit = 100 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const send = useToolAwareSend(chatId, namespace);\n const pending = usePendingMessages();\n\n const {\n data: messages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n return {\n status,\n pending,\n messages,\n fetchNext,\n refetch,\n send: sendMessage,\n };\n\n function sendMessage(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n }) {\n return send(message);\n }\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":";;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAMA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAMO,SAASI,WAAWA,CAACC,OAA2B,GAAG,CAAC,CAAC,EAAE;EAC5D,MAAM;IAAEC,KAAK,GAAG;EAAI,CAAC,GAAGD,OAAO;EAE/B,MAAM;IAAEE,MAAM;IAAEC,SAAS;IAAEC;EAAmB,CAAC,GAAG,IAAAC,2BAAc,EAAC,CAAC;EAElE,MAAMC,IAAI,GAAG,IAAAC,kCAAgB,EAACL,MAAM,EAAEC,SAAS,CAAC;EAChD,MAAMK,OAAO,GAAG,IAAAC,sCAAkB,EAAC,CAAC;EAEpC,MAAM;IACJC,IAAI,EAAEC,QAAQ,GAAG,EAAE;IACnBC,MAAM;IACNC,aAAa;IACbC;EACF,CAAC,GAAG,IAAAC,4BAAgB,EAAC;IACnBC,QAAQ,EAAE,CAAC,eAAe,EAAEd,MAAM,EAAEC,SAAS,CAAC;IAC9Cc,OAAO,EAAE,MAAAA,CAAO;MAAEC;IAAkC,CAAC,KAAK;MACxD,IAAI,CAACd,kBAAkB,EAAE;QACvB,OAAO;UAAEO,QAAQ,EAAE,EAAE;UAAEQ,UAAU,EAAEC;QAAU,CAAC;MAChD;MACA,OAAOhB,kBAAkB,CAACiB,iBAAiB,CAAC;QAC1CnB,MAAM;QACNC,SAAS;QACTF,KAAK;QACLqB,MAAM,EAAEJ;MACV,CAAC,CAAC;IACJ,CAAC;IACDK,gBAAgB,EAAGC,QAAQ,IAAKA,QAAQ,CAACL,UAAU;IACnDM,gBAAgB,EAAEL,SAA+B;IACjDM,MAAM,EAAGhB,IAAI,IACXA,IAAI,CAACiB,KAAK,CAACC,OAAO,CAAEC,IAAI,IAAKA,IAAI,CAAClB,QAAyB;EAC/D,CAAC,CAAC;EAEF,OAAO;IACLC,MAAM;IACNJ,OAAO;IACPG,QAAQ;IACRmB,SAAS;IACThB,OAAO;IACPR,IAAI,EAAEyB;EACR,CAAC;EAED,SAASA,WAAWA,CAACC,OAKpB,EAAE;IACD,OAAO1B,IAAI,CAAC0B,OAAO,CAAC;EACtB;EAEA,SAASF,SAASA,CAAA,EAAG;IACnB,KAAKjB,aAAa,CAAC,CAAC;EACtB;AACF","ignoreList":[]}
1
+ {"version":3,"names":["_reactQuery","require","_sdkConsumer","_usePendingMessages","_useToolAwareSend","useTextChat","options","limit","conversationLanguage","chatId","namespace","personaChatService","useSdkConsumer","send","useToolAwareSend","pending","usePendingMessages","data","messages","status","fetchNextPage","refetch","useInfiniteQuery","queryKey","queryFn","pageParam","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","pages","flatMap","page","fetchNext","sendMessage","message"],"sources":["../../../../src/hooks/useTextChat/useTextChat.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport type {\n ChatMessage,\n ChatMessageAttachment,\n SendMessageMetadata,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { usePendingMessages } from './usePendingMessages';\nimport { useToolAwareSend } from './useToolAwareSend';\n\ninterface UseTextChatOptions {\n limit?: number;\n /** Language or locale for the persona's text reply, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n}\n\nexport function useTextChat(options: UseTextChatOptions = {}) {\n const { limit = 100, conversationLanguage } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const send = useToolAwareSend(chatId, namespace, conversationLanguage);\n const pending = usePendingMessages();\n\n const {\n data: messages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n return {\n status,\n pending,\n messages,\n fetchNext,\n refetch,\n send: sendMessage,\n };\n\n function sendMessage(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n }) {\n return send(message);\n }\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":";;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAMA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,mBAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAQO,SAASI,WAAWA,CAACC,OAA2B,GAAG,CAAC,CAAC,EAAE;EAC5D,MAAM;IAAEC,KAAK,GAAG,GAAG;IAAEC;EAAqB,CAAC,GAAGF,OAAO;EAErD,MAAM;IAAEG,MAAM;IAAEC,SAAS;IAAEC;EAAmB,CAAC,GAAG,IAAAC,2BAAc,EAAC,CAAC;EAElE,MAAMC,IAAI,GAAG,IAAAC,kCAAgB,EAACL,MAAM,EAAEC,SAAS,EAAEF,oBAAoB,CAAC;EACtE,MAAMO,OAAO,GAAG,IAAAC,sCAAkB,EAAC,CAAC;EAEpC,MAAM;IACJC,IAAI,EAAEC,QAAQ,GAAG,EAAE;IACnBC,MAAM;IACNC,aAAa;IACbC;EACF,CAAC,GAAG,IAAAC,4BAAgB,EAAC;IACnBC,QAAQ,EAAE,CAAC,eAAe,EAAEd,MAAM,EAAEC,SAAS,CAAC;IAC9Cc,OAAO,EAAE,MAAAA,CAAO;MAAEC;IAAkC,CAAC,KAAK;MACxD,IAAI,CAACd,kBAAkB,EAAE;QACvB,OAAO;UAAEO,QAAQ,EAAE,EAAE;UAAEQ,UAAU,EAAEC;QAAU,CAAC;MAChD;MACA,OAAOhB,kBAAkB,CAACiB,iBAAiB,CAAC;QAC1CnB,MAAM;QACNC,SAAS;QACTH,KAAK;QACLsB,MAAM,EAAEJ;MACV,CAAC,CAAC;IACJ,CAAC;IACDK,gBAAgB,EAAGC,QAAQ,IAAKA,QAAQ,CAACL,UAAU;IACnDM,gBAAgB,EAAEL,SAA+B;IACjDM,MAAM,EAAGhB,IAAI,IACXA,IAAI,CAACiB,KAAK,CAACC,OAAO,CAAEC,IAAI,IAAKA,IAAI,CAAClB,QAAyB;EAC/D,CAAC,CAAC;EAEF,OAAO;IACLC,MAAM;IACNJ,OAAO;IACPG,QAAQ;IACRmB,SAAS;IACThB,OAAO;IACPR,IAAI,EAAEyB;EACR,CAAC;EAED,SAASA,WAAWA,CAACC,OAKpB,EAAE;IACD,OAAO1B,IAAI,CAAC0B,OAAO,CAAC;EACtB;EAEA,SAASF,SAASA,CAAA,EAAG;IACnB,KAAKjB,aAAa,CAAC,CAAC;EACtB;AACF","ignoreList":[]}
@@ -35,6 +35,7 @@ function useTextChatStream(options = {}) {
35
35
  const {
36
36
  limit = 50,
37
37
  headers,
38
+ conversationLanguage,
38
39
  onError,
39
40
  revealMsPerChar = 16
40
41
  } = options;
@@ -190,6 +191,7 @@ function useTextChatStream(options = {}) {
190
191
  chatConfig,
191
192
  attachments,
192
193
  metadata,
194
+ conversationLanguage,
193
195
  headers
194
196
  }, {
195
197
  onChunk: token => {
@@ -215,7 +217,7 @@ function useTextChatStream(options = {}) {
215
217
  aborted: !streamDone && !errored,
216
218
  canSendChatMessage
217
219
  };
218
- }, [chatId, namespace, headers, onError, refetch, revealMsPerChar, stopRaf]);
220
+ }, [chatId, namespace, headers, conversationLanguage, onError, refetch, revealMsPerChar, stopRaf]);
219
221
  return {
220
222
  status,
221
223
  pending: [],