@wix/legends-platform-sdk 1.1.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -4
- package/dist/cjs/conversation/types.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/types.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js +32 -18
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js +4 -0
- package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
- package/dist/cjs/hooks/useConversationEvents/types.js.map +1 -1
- package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/helpers.js +37 -0
- package/dist/cjs/hooks/useTextChat/helpers.js.map +1 -0
- package/dist/cjs/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js +34 -8
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/cjs/services/FetchPersonaChatService.js +13 -3
- package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/service.js.map +1 -1
- package/dist/esm/conversation/types.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/types.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/useConversation.js +33 -19
- package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js +3 -0
- package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
- package/dist/esm/hooks/useConversationEvents/types.js.map +1 -1
- package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
- package/dist/esm/hooks/useTextChat/helpers.js +35 -0
- package/dist/esm/hooks/useTextChat/helpers.js.map +1 -0
- package/dist/esm/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js +33 -7
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/esm/services/FetchPersonaChatService.js +13 -3
- package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
- package/dist/esm/types/index.js.map +1 -1
- package/dist/esm/types/service.js.map +1 -1
- package/dist/types/conversation/types.d.ts +1 -1
- package/dist/types/conversation/types.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/types.d.ts +3 -0
- package/dist/types/hooks/useConversation/livekit/types.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts +2 -1
- package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts.map +1 -1
- package/dist/types/hooks/useConversationEvents/types.d.ts +4 -0
- package/dist/types/hooks/useConversationEvents/types.d.ts.map +1 -1
- package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts +1 -1
- package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/helpers.d.ts +7 -0
- package/dist/types/hooks/useTextChat/helpers.d.ts.map +1 -0
- package/dist/types/hooks/useTextChat/useTextChat.d.ts +3 -1
- package/dist/types/hooks/useTextChat/useTextChat.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts +3 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts.map +1 -1
- package/dist/types/services/FetchPersonaChatService.d.ts +2 -1
- package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
- package/dist/types/types/index.d.ts +1 -1
- package/dist/types/types/index.d.ts.map +1 -1
- package/dist/types/types/service.d.ts +11 -1
- package/dist/types/types/service.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,7 +12,15 @@ yarn add @wix/legends-platform-sdk
|
|
|
12
12
|
|
|
13
13
|
## Quick Start
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Store the raw namespace API key returned by MCP onboarding in `.env.local`:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
VITE_LEGENDS_NAMESPACE=your-namespace
|
|
19
|
+
VITE_LEGENDS_API_KEY=lp_your_raw_api_key
|
|
20
|
+
VITE_LEGENDS_CHAT_ID=your-chat-id
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Wrap your app with `LegendsPlatform` and pass those values:
|
|
16
24
|
|
|
17
25
|
```tsx
|
|
18
26
|
import { LegendsPlatform, useConversation, useMicrophone } from '@wix/legends-platform-sdk';
|
|
@@ -40,9 +48,9 @@ function VoiceButton() {
|
|
|
40
48
|
export default function App() {
|
|
41
49
|
return (
|
|
42
50
|
<LegendsPlatform
|
|
43
|
-
chatId=
|
|
44
|
-
namespace=
|
|
45
|
-
apiKey=
|
|
51
|
+
chatId={import.meta.env.VITE_LEGENDS_CHAT_ID}
|
|
52
|
+
namespace={import.meta.env.VITE_LEGENDS_NAMESPACE}
|
|
53
|
+
apiKey={import.meta.env.VITE_LEGENDS_API_KEY}
|
|
46
54
|
>
|
|
47
55
|
<VoiceButton />
|
|
48
56
|
</LegendsPlatform>
|
|
@@ -67,6 +75,8 @@ The root context provider. Must wrap all SDK hooks and components.
|
|
|
67
75
|
|
|
68
76
|
Either `apiKey` or `personaChatService` must be provided.
|
|
69
77
|
|
|
78
|
+
Pass the raw namespace key as `apiKey`, for example `lp_...`. The SDK sends it as `Authorization: Api-Key <token>`.
|
|
79
|
+
|
|
70
80
|
---
|
|
71
81
|
|
|
72
82
|
### Hooks
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n | 'inactivity-timeout' // conversation ended due to inactivity\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../../../src/hooks/useConversation/livekit/types.ts"],"sourcesContent":["import type { FunctionCall, FunctionCallResult } from '../../../types/service';\nimport type {\n ToolCallEnvelope,\n ToolRuntimeAdapter,\n} from '../../useTools/runtime/types';\n\nexport type InactivityWarningData = {\n type: 'inactivity_warning';\n grace_period_sec: number;\n};\n\nexport type ToolRuntimeLike = {\n handleIncoming(\n envelope: ToolCallEnvelope,\n adapter: ToolRuntimeAdapter,\n ): Promise<void>;\n};\n\nexport type TurnDetectionData = {\n createdAt: number;\n participantIdentity: string;\n sequence: number;\n source: string;\n state: 'listening' | 'speaking';\n turnDetectionStrategy: 'livekit_turn_detector' | 'silero_vad';\n type: string;\n version: number;\n participantKind: 'STANDARD' | 'AGENT';\n speechId?: string;\n};\n\nexport type ToolCallsData = {\n type: 'tool_calls';\n requestId: string;\n functionCalls: FunctionCall[];\n};\n\nexport type ToolResultsData = {\n type: 'tool_results';\n requestId: string;\n functionCallResults: FunctionCallResult[];\n};\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../../src/hooks/useConversation/livekit/types.ts"],"sourcesContent":["import type { FunctionCall, FunctionCallResult } from '../../../types/service';\nimport type {\n ToolCallEnvelope,\n ToolRuntimeAdapter,\n} from '../../useTools/runtime/types';\n\nexport type InactivityWarningData = {\n type: 'inactivity_warning';\n grace_period_sec: number;\n};\n\nexport type InactivityTimeoutData = {\n type: 'inactivity_timeout';\n};\n\nexport type ToolRuntimeLike = {\n handleIncoming(\n envelope: ToolCallEnvelope,\n adapter: ToolRuntimeAdapter,\n ): Promise<void>;\n};\n\nexport type TurnDetectionData = {\n createdAt: number;\n participantIdentity: string;\n sequence: number;\n source: string;\n state: 'listening' | 'speaking';\n turnDetectionStrategy: 'livekit_turn_detector' | 'silero_vad';\n type: string;\n version: number;\n participantKind: 'STANDARD' | 'AGENT';\n speechId?: string;\n};\n\nexport type ToolCallsData = {\n type: 'tool_calls';\n requestId: string;\n functionCalls: FunctionCall[];\n};\n\nexport type ToolResultsData = {\n type: 'tool_results';\n requestId: string;\n functionCallResults: FunctionCallResult[];\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -63,6 +63,7 @@ function useConversation({
|
|
|
63
63
|
const setUserActivityState = (0, _jotai.useSetAtom)(_conversation.state.userActivityState);
|
|
64
64
|
const emitEvent = (0, _useEmitConversationEvent.useEmitConversationEvent)();
|
|
65
65
|
const userStopRef = (0, _react.useRef)(null);
|
|
66
|
+
const inactivityTimeoutRef = (0, _react.useRef)(false);
|
|
66
67
|
const timer = (0, _reactTimerHook.useTimer)({
|
|
67
68
|
autoStart: false,
|
|
68
69
|
onExpire: handleExpire,
|
|
@@ -211,6 +212,13 @@ function useConversation({
|
|
|
211
212
|
gracePeriodSec: data.grace_period_sec
|
|
212
213
|
});
|
|
213
214
|
}
|
|
215
|
+
function handleInactivityTimeoutEvent(_data) {
|
|
216
|
+
var _conversationRef$curr3;
|
|
217
|
+
inactivityTimeoutRef.current = true;
|
|
218
|
+
emitEvent('inactivityTimeout', {
|
|
219
|
+
conversationId: (_conversationRef$curr3 = conversationRef.current) == null ? void 0 : _conversationRef$curr3.id
|
|
220
|
+
});
|
|
221
|
+
}
|
|
214
222
|
async function handleToolCallsEvent(data) {
|
|
215
223
|
await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);
|
|
216
224
|
}
|
|
@@ -223,9 +231,10 @@ function useConversation({
|
|
|
223
231
|
}, {
|
|
224
232
|
guard: _utils.checkIsInactivityWarningData,
|
|
225
233
|
handle: handleInactivityWarningEvent
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
|
|
234
|
+
}, {
|
|
235
|
+
guard: _utils.checkIsInactivityTimeoutData,
|
|
236
|
+
handle: handleInactivityTimeoutEvent
|
|
237
|
+
}];
|
|
229
238
|
function handleDataReceivedEvent(payload) {
|
|
230
239
|
const decoded = (0, _utils.decodeDataPayload)(payload);
|
|
231
240
|
if (decoded === null) {
|
|
@@ -244,11 +253,11 @@ function useConversation({
|
|
|
244
253
|
}
|
|
245
254
|
}
|
|
246
255
|
function handleConnectedEvent() {
|
|
247
|
-
var _conversationRef$
|
|
256
|
+
var _conversationRef$curr4;
|
|
248
257
|
setUserConnectionState('joined');
|
|
249
258
|
setAgentConnectionState('joining');
|
|
250
259
|
emitEvent('callStarted', {
|
|
251
|
-
conversationId: (_conversationRef$
|
|
260
|
+
conversationId: (_conversationRef$curr4 = conversationRef.current) == null ? void 0 : _conversationRef$curr4.id
|
|
252
261
|
});
|
|
253
262
|
}
|
|
254
263
|
async function handleEncryptionErrorEvent(error) {
|
|
@@ -261,6 +270,11 @@ function useConversation({
|
|
|
261
270
|
setAgentConnectionState('idle');
|
|
262
271
|
setUserActivityState('idle');
|
|
263
272
|
setUserConnectionState('idle');
|
|
273
|
+
if (inactivityTimeoutRef.current) {
|
|
274
|
+
inactivityTimeoutRef.current = false;
|
|
275
|
+
setConversationStatus('inactivity-timeout');
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
264
278
|
switch (reason) {
|
|
265
279
|
case _livekitClient.DisconnectReason.CLIENT_INITIATED:
|
|
266
280
|
break;
|
|
@@ -279,18 +293,18 @@ function useConversation({
|
|
|
279
293
|
}
|
|
280
294
|
}
|
|
281
295
|
function handleAgentJoin(participant) {
|
|
282
|
-
var _conversationRef$
|
|
296
|
+
var _conversationRef$curr5;
|
|
283
297
|
setAgentConnectionState('joined');
|
|
284
298
|
emitEvent('agentJoined', {
|
|
285
|
-
conversationId: (_conversationRef$
|
|
299
|
+
conversationId: (_conversationRef$curr5 = conversationRef.current) == null ? void 0 : _conversationRef$curr5.id,
|
|
286
300
|
participant
|
|
287
301
|
});
|
|
288
302
|
}
|
|
289
303
|
function handleParticipantDisconnectedEvent(participant) {
|
|
290
|
-
var _conversationRef$
|
|
304
|
+
var _conversationRef$curr6;
|
|
291
305
|
setAgentConnectionState('left');
|
|
292
306
|
emitEvent('agentLeft', {
|
|
293
|
-
conversationId: (_conversationRef$
|
|
307
|
+
conversationId: (_conversationRef$curr6 = conversationRef.current) == null ? void 0 : _conversationRef$curr6.id,
|
|
294
308
|
participant
|
|
295
309
|
});
|
|
296
310
|
}
|
|
@@ -299,13 +313,13 @@ function useConversation({
|
|
|
299
313
|
return;
|
|
300
314
|
}
|
|
301
315
|
try {
|
|
302
|
-
var _conversationRef$
|
|
316
|
+
var _conversationRef$curr7;
|
|
303
317
|
setUserConnectionState('leaving');
|
|
304
318
|
await (room == null ? void 0 : room.disconnect(true));
|
|
305
319
|
setConversationStatus('destroyed');
|
|
306
320
|
setJoinedAt(undefined);
|
|
307
321
|
emitEvent('callEnded', {
|
|
308
|
-
conversationId: (_conversationRef$
|
|
322
|
+
conversationId: (_conversationRef$curr7 = conversationRef.current) == null ? void 0 : _conversationRef$curr7.id
|
|
309
323
|
});
|
|
310
324
|
} catch (error) {
|
|
311
325
|
console.error('Failed to leave', error);
|
|
@@ -313,18 +327,18 @@ function useConversation({
|
|
|
313
327
|
}
|
|
314
328
|
}
|
|
315
329
|
async function handleExpire() {
|
|
316
|
-
var _conversationRef$
|
|
330
|
+
var _conversationRef$curr8, _conversationRef$curr9;
|
|
317
331
|
emitEvent('timeExceeded', {
|
|
318
|
-
conversationId: (_conversationRef$
|
|
319
|
-
limit: (_conversationRef$
|
|
332
|
+
conversationId: (_conversationRef$curr8 = conversationRef.current) == null ? void 0 : _conversationRef$curr8.id,
|
|
333
|
+
limit: (_conversationRef$curr9 = conversationRef.current) == null ? void 0 : _conversationRef$curr9.limit
|
|
320
334
|
});
|
|
321
335
|
await leave();
|
|
322
336
|
setConversationStatus('exceeded');
|
|
323
337
|
}
|
|
324
338
|
async function interrupt() {
|
|
325
|
-
var _conversationRef$
|
|
339
|
+
var _conversationRef$curr0;
|
|
326
340
|
emitEvent('interrupt', {
|
|
327
|
-
conversationId: (_conversationRef$
|
|
341
|
+
conversationId: (_conversationRef$curr0 = conversationRef.current) == null ? void 0 : _conversationRef$curr0.id
|
|
328
342
|
});
|
|
329
343
|
await (0, _utils.publishConversationDataMessage)(room, {}, 'interrupt');
|
|
330
344
|
}
|
|
@@ -334,7 +348,7 @@ function useConversation({
|
|
|
334
348
|
}, 'inactivity_dismiss');
|
|
335
349
|
}
|
|
336
350
|
async function send(message, attachments = []) {
|
|
337
|
-
var _conversationRef$
|
|
351
|
+
var _conversationRef$curr1;
|
|
338
352
|
await (room == null ? void 0 : room.localParticipant.sendText(message, {
|
|
339
353
|
topic: 'lk.chat',
|
|
340
354
|
attributes: {
|
|
@@ -342,7 +356,7 @@ function useConversation({
|
|
|
342
356
|
}
|
|
343
357
|
}));
|
|
344
358
|
emitEvent('userSendMessage', {
|
|
345
|
-
conversationId: (_conversationRef$
|
|
359
|
+
conversationId: (_conversationRef$curr1 = conversationRef.current) == null ? void 0 : _conversationRef$curr1.id,
|
|
346
360
|
message
|
|
347
361
|
});
|
|
348
362
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_livekitClient","_invariant","_interopRequireDefault","_reactTimerHook","_reactUse","_componentsReact","_jotai","_conversation","_useCreateConversation","_useEmitConversationEvent","_useToolCallingRuntime","_utils","useConversation","autoJoin","type","config","startWithMicrophone","startWithCamera","_conversation$data2","setLogLevel","LogLevel","silent","conversation","useCreateConversation","room","useEnsureRoom","speaker","useAtomValue","state","microphone","setMicrophone","useAtom","camera","setCamera","toolRuntime","useToolCallingRuntime","toolAdapter","createLivekitToolAdapter","conversationRef","useLatest","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","userStopRef","useRef","timer","useTimer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","useEffect","registerRoomEvents","unregisterRoomEvents","useUpdateEffect","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","undefined","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","source","ParticipantKind","AGENT","old","mergeTranscriptions","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","ts","performance","now","turnDetectionStrategy","sequence","speechId","latencyMs","handleInactivityWarningEvent","_conversationRef$curr2","gracePeriodSec","grace_period_sec","handleToolCallsEvent","resolveIncomingToolCalls","dataChannelHandlers","guard","checkIsToolCallsData","handle","checkIsTurnDetectionData","checkIsInactivityWarningData","handleDataReceivedEvent","payload","decoded","decodeDataPayload","Promise","resolve","catch","handleConnectedEvent","_conversationRef$curr3","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_conversationRef$curr4","handleParticipantDisconnectedEvent","_conversationRef$curr5","leave","_conversationRef$curr6","disconnect","_conversationRef$curr7","_conversationRef$curr8","interrupt","_conversationRef$curr9","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr0","sendText","topic","attributes","safeStringify","on","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type {\n InactivityWarningData,\n TurnDetectionData,\n ToolCallsData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsToolCallsData,\n createLivekitToolAdapter,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({ type, config });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const toolRuntime = useToolCallingRuntime();\n const toolAdapter = createLivekitToolAdapter(room);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const userStopRef = useRef<{\n ts: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n } | null>(null);\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n userStopRef.current = {\n ts: performance.now(),\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n } else {\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (eventState === 'speaking' && userStopRef.current) {\n const latencyMs = performance.now() - userStopRef.current.ts;\n emitEvent('responseLatency', {\n conversationId: conversationId!,\n latencyMs,\n turnDetectionStrategy: userStopRef.current.turnDetectionStrategy,\n sequence: userStopRef.current.sequence,\n speechId: data.speechId ?? userStopRef.current.speechId,\n });\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n async function handleToolCallsEvent(data: ToolCallsData) {\n await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsToolCallsData,\n handle: handleToolCallsEvent as (data: unknown) => Promise<void>,\n },\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n // ... other data channel handlers\n ];\n\n function handleDataReceivedEvent(payload: Uint8Array) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n userStopRef.current = null;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n }\n\n function unregisterRoomEvents() {\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","require","_livekitClient","_invariant","_interopRequireDefault","_reactTimerHook","_reactUse","_componentsReact","_jotai","_conversation","_useCreateConversation","_useEmitConversationEvent","_useToolCallingRuntime","_utils","useConversation","autoJoin","type","config","startWithMicrophone","startWithCamera","_conversation$data2","setLogLevel","LogLevel","silent","conversation","useCreateConversation","room","useEnsureRoom","speaker","useAtomValue","state","microphone","setMicrophone","useAtom","camera","setCamera","toolRuntime","useToolCallingRuntime","toolAdapter","createLivekitToolAdapter","conversationRef","useLatest","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","userStopRef","useRef","inactivityTimeoutRef","timer","useTimer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","useEffect","registerRoomEvents","unregisterRoomEvents","useUpdateEffect","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","undefined","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","source","ParticipantKind","AGENT","old","mergeTranscriptions","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","ts","performance","now","turnDetectionStrategy","sequence","speechId","latencyMs","handleInactivityWarningEvent","_conversationRef$curr2","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr3","handleToolCallsEvent","resolveIncomingToolCalls","dataChannelHandlers","guard","checkIsToolCallsData","handle","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","handleDataReceivedEvent","payload","decoded","decodeDataPayload","Promise","resolve","catch","handleConnectedEvent","_conversationRef$curr4","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","DisconnectReason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","shouldHandleParticipantConnected","_conversationRef$curr5","handleParticipantDisconnectedEvent","_conversationRef$curr6","leave","_conversationRef$curr7","disconnect","_conversationRef$curr8","_conversationRef$curr9","interrupt","_conversationRef$curr0","publishConversationDataMessage","dismissInactivity","send","attachments","_conversationRef$curr1","sendText","topic","attributes","safeStringify","on","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n ToolCallsData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsToolCallsData,\n createLivekitToolAdapter,\n decodeDataPayload,\n findJoinedAgentParticipant,\n mergeTranscriptions,\n publishConversationDataMessage,\n safeStringify,\n shouldHandleParticipantConnected,\n} from './utils';\n\nexport function useConversation({\n autoJoin = true,\n type,\n config,\n startWithMicrophone = false,\n startWithCamera = false,\n}: UseConversationOptions): UseConversationResult {\n setLogLevel(LogLevel.silent);\n\n const conversation = useCreateConversation({ type, config });\n const room = useEnsureRoom();\n const speaker = useAtomValue(state.speaker);\n const [microphone, setMicrophone] = useAtom(state.microphone);\n const [camera, setCamera] = useAtom(state.camera);\n const toolRuntime = useToolCallingRuntime();\n const toolAdapter = createLivekitToolAdapter(room);\n\n // for use in register/unregister room events\n const conversationRef = useLatest<Conversation | undefined>(\n conversation.data,\n );\n const toolRuntimeRef = useLatest(toolRuntime);\n\n const [conversationStatus, setConversationStatus] = useAtom(\n state.conversationStatus,\n );\n\n const [userConnectionState, setUserConnectionState] = useAtom(\n state.userConnectionState,\n );\n\n const [joinedAt, setJoinedAt] = useAtom(state.joinedAt);\n\n const { setActiveMediaDevice: setMicrophoneDeviceId } = useMediaDeviceSelect({\n kind: 'audioinput',\n });\n\n const { setActiveMediaDevice: setSpeakerDeviceId } = useMediaDeviceSelect({\n kind: 'audiooutput',\n });\n\n const { setActiveMediaDevice: setCameraDeviceId } = useMediaDeviceSelect({\n kind: 'videoinput',\n requestPermissions: camera.enabled,\n });\n\n const setTranscriptions = useSetAtom(state.transcriptions);\n const [agentConnectionState, setAgentConnectionState] = useAtom(\n state.agentConnectionState,\n );\n const setAgentActivityState = useSetAtom(state.agentActivityState);\n const setUserActivityState = useSetAtom(state.userActivityState);\n const emitEvent = useEmitConversationEvent();\n\n const userStopRef = useRef<{\n ts: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n } | null>(null);\n const inactivityTimeoutRef = useRef(false);\n\n const timer = useTimer({\n autoStart: false,\n onExpire: handleExpire,\n expiryTimestamp: new Date(),\n });\n\n useEffect(() => {\n if (!room) {\n return;\n }\n registerRoomEvents();\n\n return () => {\n unregisterRoomEvents();\n };\n }, [room]);\n\n useUpdateEffect(() => {\n setMicrophoneDeviceId(microphone.deviceId);\n }, [microphone.deviceId]);\n\n useUpdateEffect(() => {\n setSpeakerDeviceId(speaker.deviceId);\n }, [speaker.deviceId]);\n\n useUpdateEffect(() => {\n setCameraDeviceId(camera.deviceId);\n }, [camera.deviceId]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setMicrophoneEnabled(microphone.enabled);\n }, [microphone.enabled, agentConnectionState]);\n\n useUpdateEffect(() => {\n if (agentConnectionState !== 'joined') {\n return;\n }\n room.localParticipant.setCameraEnabled(camera.enabled, {\n resolution: { width: 1920, height: 1080 },\n });\n }, [camera.enabled, agentConnectionState]);\n\n useEffect(() => {\n if (!autoJoin) {\n return;\n }\n\n if (conversationStatus === 'created') {\n void join();\n }\n }, [conversationStatus, autoJoin]);\n\n useEffect(() => {\n if (!joinedAt || conversation.data?.limit === undefined) {\n return;\n }\n\n timer.restart(new Date(joinedAt.getTime() + conversation.data!.limit!));\n }, [joinedAt, conversation.data?.limit]);\n\n async function join() {\n invariant(userConnectionState === 'idle', 'Already joined');\n invariant(conversation.data, 'Conversation is not ready');\n const url = new URL(conversation?.data?.url || '');\n const accessToken = url.searchParams.get('token');\n try {\n setUserConnectionState('joining');\n await room?.connect(conversation.data.url, accessToken!, {});\n\n // sometimes the agent is already joined before the user joins the conversation\n const remoteParticipant = findJoinedAgentParticipant(room, type);\n if (remoteParticipant && agentConnectionState !== 'joined') {\n handleAgentJoin(remoteParticipant);\n }\n\n enableMediaDevices();\n } catch (error) {\n console.error('Failed to join', error);\n setUserConnectionState('join-error');\n }\n }\n\n function enableMediaDevices() {\n if (startWithMicrophone) {\n setMicrophone({ ...microphone, enabled: true });\n }\n if (startWithCamera && type === 'video') {\n setCamera({ ...camera, enabled: true });\n }\n }\n\n function handleTranscriptionReceivedEvent(\n segments: TranscriptionSegment[],\n participant?: Participant,\n ) {\n const transcriptions: ConversationTranscription[] = segments.map((s) => ({\n id: s.id,\n message: s.text,\n source: participant?.kind === ParticipantKind.AGENT ? 'agent' : 'user',\n }));\n\n setTranscriptions((old) => mergeTranscriptions(transcriptions, old));\n }\n\n function handleTurnDetectionEvent(data: TurnDetectionData) {\n const conversationId = conversationRef.current?.id;\n const { participantKind, state: eventState } = data;\n switch (participantKind) {\n case 'STANDARD':\n if (eventState === 'listening') {\n userStopRef.current = {\n ts: performance.now(),\n turnDetectionStrategy: data.turnDetectionStrategy,\n sequence: data.sequence,\n speechId: data.speechId,\n };\n } else {\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'userSpeakStart' : 'userSpeakStop',\n { conversationId: conversationId! },\n );\n setUserActivityState(eventState);\n break;\n case 'AGENT':\n if (eventState === 'speaking' && userStopRef.current) {\n const latencyMs = performance.now() - userStopRef.current.ts;\n emitEvent('responseLatency', {\n conversationId: conversationId!,\n latencyMs,\n turnDetectionStrategy: userStopRef.current.turnDetectionStrategy,\n sequence: userStopRef.current.sequence,\n speechId: data.speechId ?? userStopRef.current.speechId,\n });\n userStopRef.current = null;\n }\n emitEvent(\n eventState === 'speaking' ? 'agentSpeakStart' : 'agentSpeakStop',\n { conversationId: conversationId! },\n );\n setAgentActivityState(eventState);\n break;\n }\n }\n\n function handleInactivityWarningEvent(data: InactivityWarningData) {\n emitEvent('inactivityWarning', {\n conversationId: conversationRef.current?.id!,\n gracePeriodSec: data.grace_period_sec,\n });\n }\n\n function handleInactivityTimeoutEvent(_data: InactivityTimeoutData) {\n inactivityTimeoutRef.current = true;\n emitEvent('inactivityTimeout', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleToolCallsEvent(data: ToolCallsData) {\n await toolRuntimeRef.current.resolveIncomingToolCalls(data, toolAdapter);\n }\n\n const dataChannelHandlers: {\n guard: (data: unknown) => boolean;\n handle: (data: unknown) => void | Promise<void>;\n }[] = [\n {\n guard: checkIsToolCallsData,\n handle: handleToolCallsEvent as (data: unknown) => Promise<void>,\n },\n {\n guard: checkIsTurnDetectionData,\n handle: handleTurnDetectionEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityWarningData,\n handle: handleInactivityWarningEvent as (data: unknown) => void,\n },\n {\n guard: checkIsInactivityTimeoutData,\n handle: handleInactivityTimeoutEvent as (data: unknown) => void,\n },\n ];\n\n function handleDataReceivedEvent(payload: Uint8Array) {\n const decoded = decodeDataPayload(payload);\n if (decoded === null) {\n return;\n }\n for (const { guard, handle } of dataChannelHandlers) {\n if (guard(decoded)) {\n void Promise.resolve(handle(decoded)).catch((error) => {\n console.error('Failed to handle data channel payload', error);\n });\n return;\n }\n }\n }\n\n function handleConnectedEvent() {\n setUserConnectionState('joined');\n setAgentConnectionState('joining');\n emitEvent('callStarted', {\n conversationId: conversationRef.current?.id!,\n });\n }\n\n async function handleEncryptionErrorEvent(error: Error) {\n console.error('Encryption error', error);\n setConversationStatus('error');\n }\n\n function handleDisconnectedEvent(reason?: DisconnectReason) {\n userStopRef.current = null;\n setAgentActivityState('idle');\n setAgentConnectionState('idle');\n setUserActivityState('idle');\n setUserConnectionState('idle');\n\n if (inactivityTimeoutRef.current) {\n inactivityTimeoutRef.current = false;\n setConversationStatus('inactivity-timeout');\n return;\n }\n\n switch (reason) {\n case DisconnectReason.CLIENT_INITIATED:\n break;\n case DisconnectReason.ROOM_CLOSED:\n setConversationStatus('destroyed');\n break;\n default:\n console.error('Conversation disconnected with reason', reason);\n setConversationStatus('error');\n break;\n }\n }\n\n function handleParticipantConnectedEvent(participant: RemoteParticipant) {\n if (shouldHandleParticipantConnected(participant, type)) {\n handleAgentJoin(participant);\n }\n }\n\n function handleAgentJoin(participant: RemoteParticipant) {\n setAgentConnectionState('joined');\n emitEvent('agentJoined', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n function handleParticipantDisconnectedEvent(participant: RemoteParticipant) {\n setAgentConnectionState('left');\n emitEvent('agentLeft', {\n conversationId: conversationRef.current?.id!,\n participant,\n });\n }\n\n async function leave() {\n if (userConnectionState !== 'joined' && userConnectionState !== 'joining') {\n return;\n }\n\n try {\n setUserConnectionState('leaving');\n await room?.disconnect(true);\n setConversationStatus('destroyed');\n setJoinedAt(undefined);\n emitEvent('callEnded', {\n conversationId: conversationRef.current?.id!,\n });\n } catch (error) {\n console.error('Failed to leave', error);\n setConversationStatus('error');\n }\n }\n\n async function handleExpire() {\n emitEvent('timeExceeded', {\n conversationId: conversationRef.current?.id!,\n limit: conversationRef.current?.limit!,\n });\n await leave();\n setConversationStatus('exceeded');\n }\n\n async function interrupt() {\n emitEvent('interrupt', {\n conversationId: conversationRef.current?.id!,\n });\n\n await publishConversationDataMessage(room, {}, 'interrupt');\n }\n\n async function dismissInactivity() {\n await publishConversationDataMessage(\n room,\n { type: 'inactivity_dismiss' },\n 'inactivity_dismiss',\n );\n }\n\n async function send(message: string, attachments: Attachment[] = []) {\n await room?.localParticipant.sendText(message, {\n topic: 'lk.chat',\n attributes: {\n attachments: safeStringify(attachments),\n },\n });\n emitEvent('userSendMessage', {\n conversationId: conversationRef.current?.id!,\n message,\n });\n }\n\n function registerRoomEvents() {\n room\n .on('connected', handleConnectedEvent)\n .on('encryptionError', handleEncryptionErrorEvent)\n .on('disconnected', handleDisconnectedEvent)\n .on('transcriptionReceived', handleTranscriptionReceivedEvent)\n .on('participantConnected', handleParticipantConnectedEvent)\n .on('participantDisconnected', handleParticipantDisconnectedEvent)\n .on('dataReceived', handleDataReceivedEvent);\n }\n\n function unregisterRoomEvents() {\n room.off('connected', handleConnectedEvent);\n room.off('encryptionError', handleEncryptionErrorEvent);\n room.off('disconnected', handleDisconnectedEvent);\n room.off('transcriptionReceived', handleTranscriptionReceivedEvent);\n room.off('participantConnected', handleParticipantConnectedEvent);\n room.off('participantDisconnected', handleParticipantDisconnectedEvent);\n room.off('dataReceived', handleDataReceivedEvent);\n }\n\n return {\n status: conversationStatus,\n conversation: conversation.data,\n join,\n send,\n interrupt,\n dismissInactivity,\n leave,\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
|
+
exports.checkIsInactivityTimeoutData = checkIsInactivityTimeoutData;
|
|
4
5
|
exports.checkIsInactivityWarningData = checkIsInactivityWarningData;
|
|
5
6
|
exports.checkIsToolCallsData = checkIsToolCallsData;
|
|
6
7
|
exports.checkIsTurnDetectionData = checkIsTurnDetectionData;
|
|
@@ -19,6 +20,9 @@ function checkIsTurnDetectionData(data) {
|
|
|
19
20
|
function checkIsInactivityWarningData(data) {
|
|
20
21
|
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'inactivity_warning' && 'grace_period_sec' in data && typeof data.grace_period_sec === 'number';
|
|
21
22
|
}
|
|
23
|
+
function checkIsInactivityTimeoutData(data) {
|
|
24
|
+
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'inactivity_timeout';
|
|
25
|
+
}
|
|
22
26
|
function checkIsToolCallsData(data) {
|
|
23
27
|
return typeof data === 'object' && data !== null && 'type' in data && data.type === 'tool_calls' && 'requestId' in data && typeof data.requestId === 'string' && 'functionCalls' in data && Array.isArray(data.functionCalls);
|
|
24
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsToolCallsData","requestId","Array","isArray","functionCalls"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n ToolCallsData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsToolCallsData(data: unknown): data is ToolCallsData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'tool_calls' &&\n 'requestId' in data &&\n typeof (data as Record<string, unknown>).requestId === 'string' &&\n 'functionCalls' in data &&\n Array.isArray((data as Record<string, unknown>).functionCalls)\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","checkIsToolCallsData","requestId","Array","isArray","functionCalls"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n InactivityTimeoutData,\n ToolCallsData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsInactivityTimeoutData(\n data: unknown,\n): data is InactivityTimeoutData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_timeout'\n );\n}\n\nexport function checkIsToolCallsData(data: unknown): data is ToolCallsData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'tool_calls' &&\n 'requestId' in data &&\n typeof (data as Record<string, unknown>).requestId === 'string' &&\n 'functionCalls' in data &&\n Array.isArray((data as Record<string, unknown>).functionCalls)\n );\n}\n"],"mappings":";;;;;;;;AAOO,SAASA,iBAAiBA,CAACC,IAAgB,EAAW;EAC3D,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EACnD,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,IAAI;EACb;AACF;AAEO,SAASE,wBAAwBA,CACtCP,IAAa,EACc;EAC3B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,iBAAiB,IAAIA,IAAI,IACzB,OAAO,IAAIA,IAAI;AAEnB;AAEO,SAASQ,4BAA4BA,CAC1CR,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB,IAC/D,kBAAkB,IAAIT,IAAI,IAC1B,OAAQA,IAAI,CAA6BU,gBAAgB,KAAK,QAAQ;AAE1E;AAEO,SAASC,4BAA4BA,CAC1CX,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB;AAEnE;AAEO,SAASG,oBAAoBA,CAACZ,IAAa,EAAyB;EACzE,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,YAAY,IACvD,WAAW,IAAIT,IAAI,IACnB,OAAQA,IAAI,CAA6Ba,SAAS,KAAK,QAAQ,IAC/D,eAAe,IAAIb,IAAI,IACvBc,KAAK,CAACC,OAAO,CAAEf,IAAI,CAA6BgB,aAAa,CAAC;AAElE","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_invariant","_interopRequireDefault","require","_react","_jotai","_reactUse","_conversation","_sdkConsumer","_helpers","useCreateConversation","options","type","config","chatConfig","chatId","namespace","personaChatService","useSdkConsumer","setConversationStatus","useSetAtom","state","conversationStatus","conversation","setConversation","useAtom","useEffect","create","then","catch","error","_err$message","err","status","message","includes","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 { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?:
|
|
1
|
+
{"version":3,"names":["_invariant","_interopRequireDefault","require","_react","_jotai","_reactUse","_conversation","_sdkConsumer","_helpers","useCreateConversation","options","type","config","chatConfig","chatId","namespace","personaChatService","useSdkConsumer","setConversationStatus","useSetAtom","state","conversationStatus","conversation","setConversation","useAtom","useEffect","create","then","catch","error","_err$message","err","status","message","includes","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 { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?: object;\n};\n\nexport type UseCreateConversationResult = {\n data?: Conversation;\n destroy(): Promise<void>;\n};\n\nexport function useCreateConversation(\n options: UseCreateConversationOptions,\n): UseCreateConversationResult {\n const { type, config: chatConfig } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const setConversationStatus = useSetAtom(state.conversationStatus);\n const [conversation, setConversation] = useAtom(state.conversation);\n\n useEffect(() => {\n void create()\n .then(() => setConversationStatus('created'))\n .catch((error: unknown) => {\n const err = error as { status?: number; message?: string };\n if (err.status === 404 && err.message?.includes('not found')) {\n setConversationStatus('voice-not-found');\n } else {\n setConversationStatus('initialization-error');\n }\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 });\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 });\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 await personaChatService\n .endInteractiveConversation({\n chatId,\n conversationId: conversation.id,\n namespace,\n })\n .catch(() => {});\n\n setConversationStatus('destroyed');\n setConversation(undefined);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.append = append;
|
|
5
|
+
exports.appendMany = appendMany;
|
|
6
|
+
function append(message) {
|
|
7
|
+
return data => {
|
|
8
|
+
if (!data) {
|
|
9
|
+
return {
|
|
10
|
+
pages: [{
|
|
11
|
+
messages: [message]
|
|
12
|
+
}],
|
|
13
|
+
pageParams: [undefined]
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const [page, ...rest] = data.pages;
|
|
17
|
+
return {
|
|
18
|
+
...data,
|
|
19
|
+
pages: [{
|
|
20
|
+
...page,
|
|
21
|
+
messages: [message, ...((page == null ? void 0 : page.messages) ?? [])]
|
|
22
|
+
}, ...rest]
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function appendMany(messages) {
|
|
27
|
+
return data => {
|
|
28
|
+
if (!data || !messages.length) {
|
|
29
|
+
return data ?? {
|
|
30
|
+
pages: [],
|
|
31
|
+
pageParams: []
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
return messages.reduceRight((acc, message) => append(message)(acc), data);
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["append","message","data","pages","messages","pageParams","undefined","page","rest","appendMany","length","reduceRight","acc"],"sources":["../../../../src/hooks/useTextChat/helpers.ts"],"sourcesContent":["import type { InfiniteData } from '@tanstack/react-query';\nimport type { ChatMessage, QueryMessagesResult } from '../../types';\n\ntype MessagesCache = InfiniteData<QueryMessagesResult>;\n\nexport function append(message: ChatMessage) {\n return (data: MessagesCache | undefined): MessagesCache => {\n if (!data) {\n return { pages: [{ messages: [message] }], pageParams: [undefined] };\n }\n const [page, ...rest] = data.pages;\n return {\n ...data,\n pages: [\n { ...page, messages: [message, ...(page?.messages ?? [])] },\n ...rest,\n ],\n };\n };\n}\n\nexport function appendMany(messages: ChatMessage[]) {\n return (data: MessagesCache | undefined): MessagesCache => {\n if (!data || !messages.length) {\n return data ?? { pages: [], pageParams: [] };\n }\n return messages.reduceRight(\n (acc: MessagesCache, message) => append(message)(acc),\n data,\n );\n };\n}\n"],"mappings":";;;;;AAKO,SAASA,MAAMA,CAACC,OAAoB,EAAE;EAC3C,OAAQC,IAA+B,IAAoB;IACzD,IAAI,CAACA,IAAI,EAAE;MACT,OAAO;QAAEC,KAAK,EAAE,CAAC;UAAEC,QAAQ,EAAE,CAACH,OAAO;QAAE,CAAC,CAAC;QAAEI,UAAU,EAAE,CAACC,SAAS;MAAE,CAAC;IACtE;IACA,MAAM,CAACC,IAAI,EAAE,GAAGC,IAAI,CAAC,GAAGN,IAAI,CAACC,KAAK;IAClC,OAAO;MACL,GAAGD,IAAI;MACPC,KAAK,EAAE,CACL;QAAE,GAAGI,IAAI;QAAEH,QAAQ,EAAE,CAACH,OAAO,EAAE,IAAI,CAAAM,IAAI,oBAAJA,IAAI,CAAEH,QAAQ,KAAI,EAAE,CAAC;MAAE,CAAC,EAC3D,GAAGI,IAAI;IAEX,CAAC;EACH,CAAC;AACH;AAEO,SAASC,UAAUA,CAACL,QAAuB,EAAE;EAClD,OAAQF,IAA+B,IAAoB;IACzD,IAAI,CAACA,IAAI,IAAI,CAACE,QAAQ,CAACM,MAAM,EAAE;MAC7B,OAAOR,IAAI,IAAI;QAAEC,KAAK,EAAE,EAAE;QAAEE,UAAU,EAAE;MAAG,CAAC;IAC9C;IACA,OAAOD,QAAQ,CAACO,WAAW,CACzB,CAACC,GAAkB,EAAEX,OAAO,KAAKD,MAAM,CAACC,OAAO,CAAC,CAACW,GAAG,CAAC,EACrDV,IACF,CAAC;EACH,CAAC;AACH","ignoreList":[]}
|
|
@@ -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 { ChatMessage } 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: {
|
|
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 { ChatMessage, ChatMessageAttachment } 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 }) {\n return send(message);\n }\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":";;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEA,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,OAIpB,EAAE;IACD,OAAO1B,IAAI,CAAC0B,OAAO,CAAC;EACtB;EAEA,SAASF,SAASA,CAAA,EAAG;IACnB,KAAKjB,aAAa,CAAC,CAAC;EACtB;AACF","ignoreList":[]}
|
|
@@ -2,27 +2,53 @@
|
|
|
2
2
|
|
|
3
3
|
exports.__esModule = true;
|
|
4
4
|
exports.useToolAwareSend = useToolAwareSend;
|
|
5
|
+
var _reactQuery = require("@tanstack/react-query");
|
|
5
6
|
var _sdkConsumer = require("../../sdk-consumer");
|
|
6
|
-
var
|
|
7
|
+
var _useTools = require("../useTools");
|
|
7
8
|
var _useToolCallingRuntime = require("../useTools/runtime/useToolCallingRuntime");
|
|
9
|
+
var _helpers = require("./helpers");
|
|
8
10
|
function useToolAwareSend(chatId, namespace) {
|
|
9
11
|
const {
|
|
10
12
|
personaChatService
|
|
11
13
|
} = (0, _sdkConsumer.useSdkConsumer)();
|
|
12
14
|
const toolRuntime = (0, _useToolCallingRuntime.useToolCallingRuntime)();
|
|
15
|
+
const queryClient = (0, _reactQuery.useQueryClient)();
|
|
16
|
+
const mutation = (0, _reactQuery.useMutation)({
|
|
17
|
+
mutationKey: ['pending-chat-message'],
|
|
18
|
+
mutationFn: params => {
|
|
19
|
+
if (!personaChatService) {
|
|
20
|
+
throw new Error('personaChatService is required to send messages.');
|
|
21
|
+
}
|
|
22
|
+
return personaChatService.sendChatMessage(params);
|
|
23
|
+
},
|
|
24
|
+
onSuccess(data, variables) {
|
|
25
|
+
var _data$messages;
|
|
26
|
+
const queryKey = ['chat-messages', chatId, namespace];
|
|
27
|
+
if (variables.message) {
|
|
28
|
+
queryClient.setQueryData(queryKey, (0, _helpers.append)({
|
|
29
|
+
id: Date.now().toString(),
|
|
30
|
+
content: variables.message,
|
|
31
|
+
role: 'user',
|
|
32
|
+
attachments: variables.attachments
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
if ((_data$messages = data.messages) != null && _data$messages.length) {
|
|
36
|
+
queryClient.setQueryData(queryKey, (0, _helpers.appendMany)(data.messages));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
13
40
|
return async function send(message) {
|
|
14
41
|
if (toolRuntime.isRunning) {
|
|
15
|
-
throw new
|
|
16
|
-
}
|
|
17
|
-
if (!personaChatService) {
|
|
18
|
-
throw new Error('personaChatService is required to send messages.');
|
|
42
|
+
throw new _useTools.ToolExecutionInProgressError();
|
|
19
43
|
}
|
|
20
|
-
const initialResponse = await
|
|
44
|
+
const initialResponse = await mutation.mutateAsync({
|
|
21
45
|
chatId,
|
|
22
46
|
namespace,
|
|
23
|
-
message: message.message ?? ''
|
|
47
|
+
message: message.message ?? '',
|
|
48
|
+
chatConfig: message.chatConfig,
|
|
49
|
+
attachments: message.attachments
|
|
24
50
|
});
|
|
25
|
-
return toolRuntime.resolveResponseToolCalls(initialResponse, functionCallResults =>
|
|
51
|
+
return toolRuntime.resolveResponseToolCalls(initialResponse, functionCallResults => mutation.mutateAsync({
|
|
26
52
|
chatId,
|
|
27
53
|
namespace,
|
|
28
54
|
message: '',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_reactQuery","require","_sdkConsumer","_useTools","_useToolCallingRuntime","_helpers","useToolAwareSend","chatId","namespace","personaChatService","useSdkConsumer","toolRuntime","useToolCallingRuntime","queryClient","useQueryClient","mutation","useMutation","mutationKey","mutationFn","params","Error","sendChatMessage","onSuccess","data","variables","_data$messages","queryKey","message","setQueryData","append","id","Date","now","toString","content","role","attachments","messages","length","appendMany","send","isRunning","ToolExecutionInProgressError","initialResponse","mutateAsync","chatConfig","resolveResponseToolCalls","functionCallResults"],"sources":["../../../../src/hooks/useTextChat/useToolAwareSend.ts"],"sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type {\n FunctionCall,\n ChatMessageAttachment,\n SendMessageParams,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { ToolExecutionInProgressError } from '../useTools';\nimport { useToolCallingRuntime } from '../useTools/runtime/useToolCallingRuntime';\nimport { append, appendMany } from './helpers';\n\nexport interface SendChatMessageResponse {\n functionCalls?: FunctionCall[];\n}\n\nexport function useToolAwareSend(chatId: string, namespace: string) {\n const { personaChatService } = useSdkConsumer();\n const toolRuntime = useToolCallingRuntime<SendChatMessageResponse>();\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationKey: ['pending-chat-message'],\n mutationFn: (params: SendMessageParams) => {\n if (!personaChatService) {\n throw new Error('personaChatService is required to send messages.');\n }\n return personaChatService.sendChatMessage(params);\n },\n onSuccess(data, variables) {\n const queryKey = ['chat-messages', chatId, namespace];\n\n if (variables.message) {\n queryClient.setQueryData(\n queryKey,\n append({\n id: Date.now().toString(),\n content: variables.message,\n role: 'user',\n attachments: variables.attachments,\n }),\n );\n }\n\n if (data.messages?.length) {\n queryClient.setQueryData(queryKey, appendMany(data.messages));\n }\n },\n });\n\n return async function send(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n }) {\n if (toolRuntime.isRunning) {\n throw new ToolExecutionInProgressError();\n }\n\n const initialResponse = await mutation.mutateAsync({\n chatId,\n namespace,\n message: message.message ?? '',\n chatConfig: message.chatConfig,\n attachments: message.attachments,\n });\n\n return toolRuntime.resolveResponseToolCalls(\n initialResponse,\n (functionCallResults) =>\n mutation.mutateAsync({\n chatId,\n namespace,\n message: '',\n functionCallResults,\n }),\n );\n };\n}\n"],"mappings":";;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAMA,IAAAC,YAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,QAAA,GAAAJ,OAAA;AAMO,SAASK,gBAAgBA,CAACC,MAAc,EAAEC,SAAiB,EAAE;EAClE,MAAM;IAAEC;EAAmB,CAAC,GAAG,IAAAC,2BAAc,EAAC,CAAC;EAC/C,MAAMC,WAAW,GAAG,IAAAC,4CAAqB,EAA0B,CAAC;EACpE,MAAMC,WAAW,GAAG,IAAAC,0BAAc,EAAC,CAAC;EAEpC,MAAMC,QAAQ,GAAG,IAAAC,uBAAW,EAAC;IAC3BC,WAAW,EAAE,CAAC,sBAAsB,CAAC;IACrCC,UAAU,EAAGC,MAAyB,IAAK;MACzC,IAAI,CAACV,kBAAkB,EAAE;QACvB,MAAM,IAAIW,KAAK,CAAC,kDAAkD,CAAC;MACrE;MACA,OAAOX,kBAAkB,CAACY,eAAe,CAACF,MAAM,CAAC;IACnD,CAAC;IACDG,SAASA,CAACC,IAAI,EAAEC,SAAS,EAAE;MAAA,IAAAC,cAAA;MACzB,MAAMC,QAAQ,GAAG,CAAC,eAAe,EAAEnB,MAAM,EAAEC,SAAS,CAAC;MAErD,IAAIgB,SAAS,CAACG,OAAO,EAAE;QACrBd,WAAW,CAACe,YAAY,CACtBF,QAAQ,EACR,IAAAG,eAAM,EAAC;UACLC,EAAE,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;UACzBC,OAAO,EAAEV,SAAS,CAACG,OAAO;UAC1BQ,IAAI,EAAE,MAAM;UACZC,WAAW,EAAEZ,SAAS,CAACY;QACzB,CAAC,CACH,CAAC;MACH;MAEA,KAAAX,cAAA,GAAIF,IAAI,CAACc,QAAQ,aAAbZ,cAAA,CAAea,MAAM,EAAE;QACzBzB,WAAW,CAACe,YAAY,CAACF,QAAQ,EAAE,IAAAa,mBAAU,EAAChB,IAAI,CAACc,QAAQ,CAAC,CAAC;MAC/D;IACF;EACF,CAAC,CAAC;EAEF,OAAO,eAAeG,IAAIA,CAACb,OAI1B,EAAE;IACD,IAAIhB,WAAW,CAAC8B,SAAS,EAAE;MACzB,MAAM,IAAIC,sCAA4B,CAAC,CAAC;IAC1C;IAEA,MAAMC,eAAe,GAAG,MAAM5B,QAAQ,CAAC6B,WAAW,CAAC;MACjDrC,MAAM;MACNC,SAAS;MACTmB,OAAO,EAAEA,OAAO,CAACA,OAAO,IAAI,EAAE;MAC9BkB,UAAU,EAAElB,OAAO,CAACkB,UAAU;MAC9BT,WAAW,EAAET,OAAO,CAACS;IACvB,CAAC,CAAC;IAEF,OAAOzB,WAAW,CAACmC,wBAAwB,CACzCH,eAAe,EACdI,mBAAmB,IAClBhC,QAAQ,CAAC6B,WAAW,CAAC;MACnBrC,MAAM;MACNC,SAAS;MACTmB,OAAO,EAAE,EAAE;MACXoB;IACF,CAAC,CACL,CAAC;EACH,CAAC;AACH","ignoreList":[]}
|