@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.
- package/README.md +2 -0
- package/dist/cjs/components/ChromaKey/ChromaKey.js +14 -4
- package/dist/cjs/components/ChromaKey/ChromaKey.js.map +1 -1
- package/dist/cjs/components/ChromaKey/chroma-key.js +3 -0
- package/dist/cjs/components/ChromaKey/chroma-key.js.map +1 -1
- package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js +32 -7
- package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
- package/dist/cjs/components/Video/Video.js +16 -2
- package/dist/cjs/components/Video/Video.js.map +1 -1
- package/dist/cjs/components/Video/types.js.map +1 -1
- package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js +12 -3
- package/dist/cjs/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js +24 -14
- package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js +11 -3
- package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/streamChatMessage.js +3 -1
- package/dist/cjs/hooks/useTextChat/streamChatMessage.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useTextChat.js +3 -2
- package/dist/cjs/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useTextChatStream.js +3 -1
- package/dist/cjs/hooks/useTextChat/useTextChatStream.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js +5 -3
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/cjs/sdk-consumer/context.js.map +1 -1
- package/dist/cjs/sdk.js +26 -0
- package/dist/cjs/sdk.js.map +1 -1
- package/dist/cjs/services/FetchPersonaChatService.js +5 -1
- package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
- package/dist/cjs/startup-telemetry/attempt.js +188 -0
- package/dist/cjs/startup-telemetry/attempt.js.map +1 -0
- package/dist/cjs/startup-telemetry/frame.js +83 -0
- package/dist/cjs/startup-telemetry/frame.js.map +1 -0
- package/dist/cjs/startup-telemetry/useStartupAttempt.js +15 -0
- package/dist/cjs/startup-telemetry/useStartupAttempt.js.map +1 -0
- package/dist/cjs/types/service.js.map +1 -1
- package/dist/esm/components/ChromaKey/ChromaKey.js +12 -2
- package/dist/esm/components/ChromaKey/ChromaKey.js.map +1 -1
- package/dist/esm/components/ChromaKey/chroma-key.js +3 -0
- package/dist/esm/components/ChromaKey/chroma-key.js.map +1 -1
- package/dist/esm/components/LegendsPlatform/LegendsPlatform.js +28 -3
- package/dist/esm/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
- package/dist/esm/components/Video/Video.js +16 -1
- package/dist/esm/components/Video/Video.js.map +1 -1
- package/dist/esm/components/Video/types.js.map +1 -1
- package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js +11 -2
- package/dist/esm/components/VideoPostProcessor/VideoPostProcessor.js.map +1 -1
- package/dist/esm/hooks/useConversation/livekit/useConversation.js +24 -14
- package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
- package/dist/esm/hooks/useCreateConversation/useCreateConversation.js +11 -3
- package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
- package/dist/esm/hooks/useTextChat/streamChatMessage.js +3 -1
- package/dist/esm/hooks/useTextChat/streamChatMessage.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useTextChat.js +3 -2
- package/dist/esm/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useTextChatStream.js +3 -1
- package/dist/esm/hooks/useTextChat/useTextChatStream.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js +5 -3
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/esm/sdk-consumer/context.js.map +1 -1
- package/dist/esm/sdk.js +1 -0
- package/dist/esm/sdk.js.map +1 -1
- package/dist/esm/services/FetchPersonaChatService.js +5 -1
- package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
- package/dist/esm/startup-telemetry/attempt.js +180 -0
- package/dist/esm/startup-telemetry/attempt.js.map +1 -0
- package/dist/esm/startup-telemetry/frame.js +77 -0
- package/dist/esm/startup-telemetry/frame.js.map +1 -0
- package/dist/esm/startup-telemetry/useStartupAttempt.js +10 -0
- package/dist/esm/startup-telemetry/useStartupAttempt.js.map +1 -0
- package/dist/esm/types/service.js.map +1 -1
- package/dist/types/components/ChromaKey/ChromaKey.d.ts +2 -0
- package/dist/types/components/ChromaKey/ChromaKey.d.ts.map +1 -1
- package/dist/types/components/ChromaKey/chroma-key.d.ts +1 -0
- package/dist/types/components/ChromaKey/chroma-key.d.ts.map +1 -1
- package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts +2 -0
- package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts.map +1 -1
- package/dist/types/components/Video/Video.d.ts +1 -0
- package/dist/types/components/Video/Video.d.ts.map +1 -1
- package/dist/types/components/Video/types.d.ts +2 -0
- package/dist/types/components/Video/types.d.ts.map +1 -1
- package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts +2 -0
- package/dist/types/components/VideoPostProcessor/VideoPostProcessor.d.ts.map +1 -1
- package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
- package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/streamChatMessage.d.ts +1 -0
- package/dist/types/hooks/useTextChat/streamChatMessage.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useTextChat.d.ts +2 -0
- package/dist/types/hooks/useTextChat/useTextChat.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useTextChatStream.d.ts +1 -0
- package/dist/types/hooks/useTextChat/useTextChatStream.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts +1 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts.map +1 -1
- package/dist/types/sdk-consumer/context.d.ts +2 -0
- package/dist/types/sdk-consumer/context.d.ts.map +1 -1
- package/dist/types/sdk.d.ts +2 -0
- package/dist/types/sdk.d.ts.map +1 -1
- package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
- package/dist/types/startup-telemetry/attempt.d.ts +71 -0
- package/dist/types/startup-telemetry/attempt.d.ts.map +1 -0
- package/dist/types/startup-telemetry/frame.d.ts +6 -0
- package/dist/types/startup-telemetry/frame.d.ts.map +1 -0
- package/dist/types/startup-telemetry/useStartupAttempt.d.ts +2 -0
- package/dist/types/startup-telemetry/useStartupAttempt.d.ts.map +1 -0
- package/dist/types/types/service.d.ts +2 -0
- package/dist/types/types/service.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useEffect","useRef","transparentBackground","render","invariant","VideoPostProcessor","_ref","effects","children","$video","$canvas","id","requestAnimationFrame","init","cancelAnimationFrame","
|
|
1
|
+
{"version":3,"names":["useStartupAttempt","recordCanvasFrame","React","useEffect","useRef","transparentBackground","render","invariant","VideoPostProcessor","_ref","effects","children","startupAttempt","visibleAttempt","props","type","undefined","effectsKey","join","effectsRef","current","$video","$canvas","id","requestAnimationFrame","init","cancelAnimationFrame","videoWidth","videoHeight","process","effect","createElement","Fragment","ref","style","className","cloneElement","startupRenderSurface","display"],"sources":["../../../../src/components/VideoPostProcessor/VideoPostProcessor.tsx"],"sourcesContent":["import { useStartupAttempt } from '../../startup-telemetry/useStartupAttempt';\nimport { recordCanvasFrame } from '../../startup-telemetry/frame';\nimport React, { useEffect, useRef } from 'react';\n\nimport { transparentBackground, render } from './effects';\nimport invariant from 'invariant';\n\ntype VideoPostProcessorEffect = 'transparent-background';\n\ninterface VideoPostProcessorProps {\n effects: VideoPostProcessorEffect[];\n\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref: React.RefObject<HTMLVideoElement>;\n startupRenderSurface?: 'video' | 'canvas';\n type?: 'agent' | 'user' | 'screen';\n }\n >;\n}\n\nexport function VideoPostProcessor({\n effects,\n children,\n}: VideoPostProcessorProps) {\n const startupAttempt = useStartupAttempt();\n const visibleAttempt =\n children.props.type === 'agent' ? startupAttempt : undefined;\n const effectsKey = effects.join(',');\n const effectsRef = useRef(effects);\n effectsRef.current = effects;\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n let id = requestAnimationFrame(init);\n\n return () => {\n cancelAnimationFrame(id);\n };\n\n function init() {\n if (\n !$video.current ||\n !$canvas.current ||\n !$video.current.videoWidth ||\n !$video.current.videoHeight\n ) {\n id = requestAnimationFrame(init);\n return;\n }\n\n id = requestAnimationFrame(process);\n }\n\n function process() {\n invariant($video.current, 'Video is not initialized');\n invariant($canvas.current, 'Canvas is not initialized');\n\n render($video.current, $canvas.current);\n\n for (const effect of effectsRef.current) {\n switch (effect) {\n case 'transparent-background':\n transparentBackground($canvas.current);\n break;\n }\n }\n\n recordCanvasFrame(visibleAttempt, $canvas.current, $video.current);\n id = requestAnimationFrame(process);\n }\n }, [effectsKey, visibleAttempt]);\n\n return (\n <>\n <canvas\n ref={$canvas}\n style={children.props.style}\n className={children.props.className}\n />\n\n {React.cloneElement(children, {\n ...children.props,\n startupRenderSurface: 'canvas',\n ref: $video,\n style: { display: 'none' },\n })}\n </>\n );\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,2CAA2C;AAC7E,SAASC,iBAAiB,QAAQ,+BAA+B;AACjE,OAAOC,KAAK,IAAIC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEhD,SAASC,qBAAqB,EAAEC,MAAM,QAAQ,WAAW;AACzD,OAAOC,SAAS,MAAM,WAAW;AAgBjC,OAAO,SAASC,kBAAkBA,CAAAC,IAAA,EAGN;EAAA,IAF1BC,OAAO,GAAAD,IAAA,CAAPC,OAAO;IACPC,QAAQ,GAAAF,IAAA,CAARE,QAAQ;EAER,MAAMC,cAAc,GAAGZ,iBAAiB,CAAC,CAAC;EAC1C,MAAMa,cAAc,GAClBF,QAAQ,CAACG,KAAK,CAACC,IAAI,KAAK,OAAO,GAAGH,cAAc,GAAGI,SAAS;EAC9D,MAAMC,UAAU,GAAGP,OAAO,CAACQ,IAAI,CAAC,GAAG,CAAC;EACpC,MAAMC,UAAU,GAAGf,MAAM,CAACM,OAAO,CAAC;EAClCS,UAAU,CAACC,OAAO,GAAGV,OAAO;EAC5B,MAAMW,MAAM,GAAGjB,MAAM,CAAmB,IAAI,CAAC;EAC7C,MAAMkB,OAAO,GAAGlB,MAAM,CAAoB,IAAI,CAAC;EAE/CD,SAAS,CAAC,MAAM;IACd,IAAIoB,EAAE,GAAGC,qBAAqB,CAACC,IAAI,CAAC;IAEpC,OAAO,MAAM;MACXC,oBAAoB,CAACH,EAAE,CAAC;IAC1B,CAAC;IAED,SAASE,IAAIA,CAAA,EAAG;MACd,IACE,CAACJ,MAAM,CAACD,OAAO,IACf,CAACE,OAAO,CAACF,OAAO,IAChB,CAACC,MAAM,CAACD,OAAO,CAACO,UAAU,IAC1B,CAACN,MAAM,CAACD,OAAO,CAACQ,WAAW,EAC3B;QACAL,EAAE,GAAGC,qBAAqB,CAACC,IAAI,CAAC;QAChC;MACF;MAEAF,EAAE,GAAGC,qBAAqB,CAACK,OAAO,CAAC;IACrC;IAEA,SAASA,OAAOA,CAAA,EAAG;MACjBtB,SAAS,CAACc,MAAM,CAACD,OAAO,EAAE,0BAA0B,CAAC;MACrDb,SAAS,CAACe,OAAO,CAACF,OAAO,EAAE,2BAA2B,CAAC;MAEvDd,MAAM,CAACe,MAAM,CAACD,OAAO,EAAEE,OAAO,CAACF,OAAO,CAAC;MAEvC,KAAK,MAAMU,MAAM,IAAIX,UAAU,CAACC,OAAO,EAAE;QACvC,QAAQU,MAAM;UACZ,KAAK,wBAAwB;YAC3BzB,qBAAqB,CAACiB,OAAO,CAACF,OAAO,CAAC;YACtC;QACJ;MACF;MAEAnB,iBAAiB,CAACY,cAAc,EAAES,OAAO,CAACF,OAAO,EAAEC,MAAM,CAACD,OAAO,CAAC;MAClEG,EAAE,GAAGC,qBAAqB,CAACK,OAAO,CAAC;IACrC;EACF,CAAC,EAAE,CAACZ,UAAU,EAAEJ,cAAc,CAAC,CAAC;EAEhC,oBACEX,KAAA,CAAA6B,aAAA,CAAA7B,KAAA,CAAA8B,QAAA,qBACE9B,KAAA,CAAA6B,aAAA;IACEE,GAAG,EAAEX,OAAQ;IACbY,KAAK,EAAEvB,QAAQ,CAACG,KAAK,CAACoB,KAAM;IAC5BC,SAAS,EAAExB,QAAQ,CAACG,KAAK,CAACqB;EAAU,CACrC,CAAC,eAEDjC,KAAK,CAACkC,YAAY,CAACzB,QAAQ,EAAE;IAC5B,GAAGA,QAAQ,CAACG,KAAK;IACjBuB,oBAAoB,EAAE,QAAQ;IAC9BJ,GAAG,EAAEZ,MAAM;IACXa,KAAK,EAAE;MAAEI,OAAO,EAAE;IAAO;EAC3B,CAAC,CACD,CAAC;AAEP","ignoreList":[]}
|
|
@@ -46,9 +46,11 @@ export function useConversation(_ref) {
|
|
|
46
46
|
setCamera = _useAtom2[1];
|
|
47
47
|
const _useSdkConsumer = useSdkConsumer(),
|
|
48
48
|
_useSdkConsumer$tools = _useSdkConsumer.tools,
|
|
49
|
-
toolsRegistry = _useSdkConsumer$tools === void 0 ? {} : _useSdkConsumer$tools
|
|
49
|
+
toolsRegistry = _useSdkConsumer$tools === void 0 ? {} : _useSdkConsumer$tools,
|
|
50
|
+
startupTelemetrySession = _useSdkConsumer.startupTelemetrySession;
|
|
50
51
|
const toolRuntime = useToolCallingRuntime();
|
|
51
52
|
const toolsRegistryRef = useLatest(toolsRegistry);
|
|
53
|
+
const startupSessionRef = useLatest(startupTelemetrySession);
|
|
52
54
|
|
|
53
55
|
// for use in register/unregister room events
|
|
54
56
|
const conversationRef = useLatest(conversation.data);
|
|
@@ -162,8 +164,11 @@ export function useConversation(_ref) {
|
|
|
162
164
|
const url = new URL((conversation == null || (_conversation$data3 = conversation.data) == null ? void 0 : _conversation$data3.url) || '');
|
|
163
165
|
const accessToken = url.searchParams.get('token');
|
|
164
166
|
try {
|
|
167
|
+
var _startupTelemetrySess, _startupTelemetrySess2;
|
|
168
|
+
startupTelemetrySession == null || (_startupTelemetrySess = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess.mark('join_requested');
|
|
165
169
|
setUserConnectionState('joining');
|
|
166
170
|
await (room == null ? void 0 : room.connect(conversation.data.url, accessToken, {}));
|
|
171
|
+
startupTelemetrySession == null || (_startupTelemetrySess2 = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess2.mark('room_connected');
|
|
167
172
|
|
|
168
173
|
// sometimes the agent is already joined before the user joins the conversation
|
|
169
174
|
const remoteParticipant = findJoinedAgentParticipant(room, type);
|
|
@@ -172,6 +177,8 @@ export function useConversation(_ref) {
|
|
|
172
177
|
}
|
|
173
178
|
enableMediaDevices();
|
|
174
179
|
} catch (error) {
|
|
180
|
+
var _startupTelemetrySess3;
|
|
181
|
+
startupTelemetrySession == null || (_startupTelemetrySess3 = startupTelemetrySession.get(conversation.data.id)) == null || _startupTelemetrySess3.finish('error', 'join_failed');
|
|
175
182
|
console.error('Failed to join', error);
|
|
176
183
|
setUserConnectionState('join-error');
|
|
177
184
|
}
|
|
@@ -405,6 +412,8 @@ export function useConversation(_ref) {
|
|
|
405
412
|
setConversationStatus('error');
|
|
406
413
|
}
|
|
407
414
|
function handleDisconnectedEvent(reason) {
|
|
415
|
+
var _startupSessionRef$cu, _conversationRef$curr0;
|
|
416
|
+
(_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 === DisconnectReason.CLIENT_INITIATED ? 'cancelled' : 'error', 'disconnected_before_frame');
|
|
408
417
|
isConnectedRef.current = false;
|
|
409
418
|
acousticPhaseRef.current = 'idle';
|
|
410
419
|
acousticT0Ref.current = null;
|
|
@@ -453,18 +462,19 @@ export function useConversation(_ref) {
|
|
|
453
462
|
}
|
|
454
463
|
}
|
|
455
464
|
function handleAgentJoin(participant) {
|
|
456
|
-
var _conversationRef$
|
|
465
|
+
var _startupSessionRef$cu2, _conversationRef$curr1, _conversationRef$curr10;
|
|
466
|
+
(_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');
|
|
457
467
|
setAgentConnectionState('joined');
|
|
458
468
|
emitEvent('agentJoined', {
|
|
459
|
-
conversationId: (_conversationRef$
|
|
469
|
+
conversationId: (_conversationRef$curr10 = conversationRef.current) == null ? void 0 : _conversationRef$curr10.id,
|
|
460
470
|
participant
|
|
461
471
|
});
|
|
462
472
|
}
|
|
463
473
|
function handleParticipantDisconnectedEvent(participant) {
|
|
464
|
-
var _conversationRef$
|
|
474
|
+
var _conversationRef$curr11;
|
|
465
475
|
setAgentConnectionState('left');
|
|
466
476
|
emitEvent('agentLeft', {
|
|
467
|
-
conversationId: (_conversationRef$
|
|
477
|
+
conversationId: (_conversationRef$curr11 = conversationRef.current) == null ? void 0 : _conversationRef$curr11.id,
|
|
468
478
|
participant
|
|
469
479
|
});
|
|
470
480
|
}
|
|
@@ -473,13 +483,13 @@ export function useConversation(_ref) {
|
|
|
473
483
|
return;
|
|
474
484
|
}
|
|
475
485
|
try {
|
|
476
|
-
var _conversationRef$
|
|
486
|
+
var _conversationRef$curr12;
|
|
477
487
|
setUserConnectionState('leaving');
|
|
478
488
|
await (room == null ? void 0 : room.disconnect(true));
|
|
479
489
|
setConversationStatus('destroyed');
|
|
480
490
|
setJoinedAt(undefined);
|
|
481
491
|
emitEvent('callEnded', {
|
|
482
|
-
conversationId: (_conversationRef$
|
|
492
|
+
conversationId: (_conversationRef$curr12 = conversationRef.current) == null ? void 0 : _conversationRef$curr12.id
|
|
483
493
|
});
|
|
484
494
|
} catch (error) {
|
|
485
495
|
console.error('Failed to leave', error);
|
|
@@ -487,22 +497,22 @@ export function useConversation(_ref) {
|
|
|
487
497
|
}
|
|
488
498
|
}
|
|
489
499
|
async function handleExpire() {
|
|
490
|
-
var _conversationRef$
|
|
500
|
+
var _conversationRef$curr13, _conversationRef$curr14;
|
|
491
501
|
// The duration timer keeps running after the call ends.
|
|
492
502
|
if (conversationStatus === 'credit-exhausted' || conversationStatus === 'conversation-limit-reached' || conversationStatus === 'plan-minutes-exhausted') {
|
|
493
503
|
return;
|
|
494
504
|
}
|
|
495
505
|
emitEvent('timeExceeded', {
|
|
496
|
-
conversationId: (_conversationRef$
|
|
497
|
-
limit: (_conversationRef$
|
|
506
|
+
conversationId: (_conversationRef$curr13 = conversationRef.current) == null ? void 0 : _conversationRef$curr13.id,
|
|
507
|
+
limit: (_conversationRef$curr14 = conversationRef.current) == null ? void 0 : _conversationRef$curr14.limit
|
|
498
508
|
});
|
|
499
509
|
await leave();
|
|
500
510
|
setConversationStatus('exceeded');
|
|
501
511
|
}
|
|
502
512
|
async function interrupt() {
|
|
503
|
-
var _conversationRef$
|
|
513
|
+
var _conversationRef$curr15;
|
|
504
514
|
emitEvent('interrupt', {
|
|
505
|
-
conversationId: (_conversationRef$
|
|
515
|
+
conversationId: (_conversationRef$curr15 = conversationRef.current) == null ? void 0 : _conversationRef$curr15.id
|
|
506
516
|
});
|
|
507
517
|
await publishConversationDataMessage(room, {}, 'interrupt');
|
|
508
518
|
}
|
|
@@ -512,7 +522,7 @@ export function useConversation(_ref) {
|
|
|
512
522
|
}, 'inactivity_dismiss');
|
|
513
523
|
}
|
|
514
524
|
async function send(message, attachments) {
|
|
515
|
-
var _conversationRef$
|
|
525
|
+
var _conversationRef$curr16;
|
|
516
526
|
if (attachments === void 0) {
|
|
517
527
|
attachments = [];
|
|
518
528
|
}
|
|
@@ -523,7 +533,7 @@ export function useConversation(_ref) {
|
|
|
523
533
|
}
|
|
524
534
|
}));
|
|
525
535
|
emitEvent('userSendMessage', {
|
|
526
|
-
conversationId: (_conversationRef$
|
|
536
|
+
conversationId: (_conversationRef$curr16 = conversationRef.current) == null ? void 0 : _conversationRef$curr16.id,
|
|
527
537
|
message
|
|
528
538
|
});
|
|
529
539
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useSdkConsumer","useCreateConversation","useSpeechActivityDetector","useParticipantTrack","Source","getTrackStats","parseTrackStats","useEmitConversationEvent","useToolCallingRuntime","extractToolErrorMessage","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage","checkIsPlanMinutesExhaustedMessage","buildToolDefinitions","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","parseFunctionCallPayload","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","EXECUTE_TOOL_RPC_METHOD","GET_TOOLS_RPC_METHOD","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","firstConversation","lastConversationTopic","conversationLanguage","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","_useSdkConsumer","_useSdkConsumer$tools","tools","toolsRegistry","toolRuntime","toolsRegistryRef","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","inactivityTimeoutRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","source","Microphone","agentMicPublication","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","console","handleTranscriptionReceivedEvent","segments","participant","map","s","id","message","text","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","_await$Promise$all","Promise","all","userReport","agentReport","userStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","handleExecuteToolRpc","call","payload","functionCallId","result","_await$toolRuntimeRef","executeToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","_participant","_kind","topic","decoded","_conversationRef$curr6","_conversationRef$curr7","_conversationRef$curr8","_ref2","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_conversationRef$curr0","handleParticipantDisconnectedEvent","_conversationRef$curr1","leave","_conversationRef$curr10","disconnect","_conversationRef$curr11","_conversationRef$curr12","interrupt","_conversationRef$curr13","dismissInactivity","send","attachments","_conversationRef$curr14","sendText","attributes","on","unregisterRpcMethod","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n 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":["useEffect","useRef","DisconnectReason","setLogLevel","ParticipantKind","LogLevel","invariant","useTimer","useLatest","useUpdateEffect","useEnsureRoom","useMediaDeviceSelect","useAtom","useAtomValue","useSetAtom","state","useSdkConsumer","useCreateConversation","useSpeechActivityDetector","useParticipantTrack","Source","getTrackStats","parseTrackStats","useEmitConversationEvent","useToolCallingRuntime","extractToolErrorMessage","checkIsTurnDetectionData","checkIsInactivityWarningData","checkIsInactivityTimeoutData","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage","checkIsPlanMinutesExhaustedMessage","buildToolDefinitions","decodeDataPayload","findJoinedAgentParticipant","mergeTranscriptions","parseFunctionCallPayload","publishConversationDataMessage","safeStringify","shouldHandleParticipantConnected","ACOUSTIC_AGENT_HANGOVER_MS","ACOUSTIC_USER_HANGOVER_MS","ACOUSTIC_USER_THRESHOLD_RMS","EXECUTE_TOOL_RPC_METHOD","GET_TOOLS_RPC_METHOD","useConversation","_ref","_conversation$data2","_ref$autoJoin","autoJoin","type","config","_ref$startWithMicroph","startWithMicrophone","_ref$startWithCamera","startWithCamera","firstConversation","lastConversationTopic","conversationLanguage","silent","conversation","room","speaker","_useAtom","microphone","setMicrophone","_useAtom2","camera","setCamera","_useSdkConsumer","_useSdkConsumer$tools","tools","toolsRegistry","startupTelemetrySession","toolRuntime","toolsRegistryRef","startupSessionRef","conversationRef","data","toolRuntimeRef","_useAtom3","conversationStatus","setConversationStatus","_useAtom4","userConnectionState","setUserConnectionState","_useAtom5","joinedAt","setJoinedAt","_useMediaDeviceSelect","kind","setMicrophoneDeviceId","setActiveMediaDevice","_useMediaDeviceSelect2","setSpeakerDeviceId","_useMediaDeviceSelect3","requestPermissions","enabled","setCameraDeviceId","setTranscriptions","transcriptions","_useAtom6","agentConnectionState","setAgentConnectionState","setAgentActivityState","agentActivityState","setUserActivityState","userActivityState","emitEvent","inactivityTimeoutRef","creditExhaustedRef","conversationLimitReachedRef","planMinutesExhaustedRef","acousticPhaseRef","acousticT0Ref","latestTurnMetadataRef","isConnectedRef","userCumulativeTrackStatsRef","undefined","agentCumulativeTrackStatsRef","userMicPublication","source","Microphone","agentMicPublication","timer","autoStart","onExpire","handleExpire","expiryTimestamp","Date","registerRoomEvents","unregisterRoomEvents","deviceId","localParticipant","setMicrophoneEnabled","setCameraEnabled","resolution","width","height","join","_conversation$data","limit","restart","getTime","_conversation$data3","url","URL","accessToken","searchParams","get","_startupTelemetrySess","_startupTelemetrySess2","id","mark","connect","remoteParticipant","handleAgentJoin","enableMediaDevices","error","_startupTelemetrySess3","finish","console","handleTranscriptionReceivedEvent","segments","participant","map","s","message","text","AGENT","old","handleTurnDetectionEvent","_conversationRef$curr","conversationId","current","participantKind","eventState","turnDetectionStrategy","sequence","speechId","handleAcousticUserOnset","handleAcousticUserOffset","timestampMs","handleAcousticAgentOnset","_conversationRef$curr2","latencyMs","emitConversationTurnLatency","clientAcousticLatencyMs","_conversationRef$curr3","_await$Promise$all","Promise","all","userReport","agentReport","userStats","agentStats","cumulativeTrackStats","rttMs","roundTripTimeMs","jitterBufferDelayMs","userPacketsLost","packetsLost","agentPacketsLost","handleAcousticAgentOffset","onSpeechStart","onSpeechEnd","thresholdRms","hangoverMs","handleInactivityWarningEvent","_conversationRef$curr4","gracePeriodSec","grace_period_sec","handleInactivityTimeoutEvent","_data","_conversationRef$curr5","handleGetToolsRpc","JSON","stringify","handleExecuteToolRpc","call","payload","functionCallId","result","_await$toolRuntimeRef","executeToolCalls","dataChannelHandlers","guard","handle","handleDataReceivedEvent","_participant","_kind","topic","decoded","_conversationRef$curr6","_conversationRef$curr7","_conversationRef$curr8","_ref2","resolve","catch","handleConnectedEvent","_conversationRef$curr9","handleEncryptionErrorEvent","handleDisconnectedEvent","reason","_startupSessionRef$cu","_conversationRef$curr0","CLIENT_INITIATED","ROOM_CLOSED","handleParticipantConnectedEvent","_startupSessionRef$cu2","_conversationRef$curr1","_conversationRef$curr10","handleParticipantDisconnectedEvent","_conversationRef$curr11","leave","_conversationRef$curr12","disconnect","_conversationRef$curr13","_conversationRef$curr14","interrupt","_conversationRef$curr15","dismissInactivity","send","attachments","_conversationRef$curr16","sendText","attributes","on","unregisterRpcMethod","registerRpcMethod","off","status"],"sources":["../../../../../src/hooks/useConversation/livekit/useConversation.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n DisconnectReason,\n Participant,\n setLogLevel,\n ParticipantKind,\n RemoteParticipant,\n TranscriptionSegment,\n LogLevel,\n type RpcInvocationData,\n} from 'livekit-client';\nimport invariant from 'invariant';\nimport { useTimer } from 'react-timer-hook';\nimport { useLatest, useUpdateEffect } from 'react-use';\nimport { useEnsureRoom, useMediaDeviceSelect } from '@livekit/components-react';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\nimport {\n Conversation,\n state,\n type ConversationTranscription,\n} from '../../../conversation';\nimport type {\n UseConversationResult,\n UseConversationOptions,\n Attachment,\n} from '../types';\nimport type { FunctionCallResult } from '../../../types/service';\nimport { useSdkConsumer } from '../../../sdk-consumer';\nimport type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from './types';\nimport { useCreateConversation } from '../../useCreateConversation';\nimport { useSpeechActivityDetector } from '../../useSpeechActivityDetector';\nimport {\n useParticipantTrack,\n Source,\n getTrackStats,\n parseTrackStats,\n type CumulativeTrackStats,\n} from '../../useParticipantTrack';\n\nimport { useEmitConversationEvent } from '../../useConversationEvents/useEmitConversationEvent';\nimport { useToolCallingRuntime } from '../../useTools/runtime/useToolCallingRuntime';\nimport { extractToolErrorMessage } from '../../useTools/utils/serialize';\nimport {\n checkIsTurnDetectionData,\n checkIsInactivityWarningData,\n checkIsInactivityTimeoutData,\n checkIsCreditExhaustedMessage,\n checkIsConversationLimitReachedMessage,\n 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":[]}
|
|
@@ -16,20 +16,26 @@ export function useCreateConversation(options) {
|
|
|
16
16
|
const _useSdkConsumer = useSdkConsumer(),
|
|
17
17
|
chatId = _useSdkConsumer.chatId,
|
|
18
18
|
namespace = _useSdkConsumer.namespace,
|
|
19
|
-
personaChatService = _useSdkConsumer.personaChatService
|
|
19
|
+
personaChatService = _useSdkConsumer.personaChatService,
|
|
20
|
+
startupTelemetrySession = _useSdkConsumer.startupTelemetrySession;
|
|
20
21
|
const setConversationStatus = useSetAtom(state.conversationStatus);
|
|
21
22
|
const _useAtom = useAtom(state.conversation),
|
|
22
23
|
conversation = _useAtom[0],
|
|
23
24
|
setConversation = _useAtom[1];
|
|
24
25
|
const emitEvent = useEmitConversationEvent();
|
|
25
26
|
useEffect(() => {
|
|
26
|
-
|
|
27
|
+
const startupAttempt = type === 'video' ? startupTelemetrySession == null ? void 0 : startupTelemetrySession.start() : undefined;
|
|
28
|
+
startupAttempt == null || startupAttempt.mark('api_request');
|
|
29
|
+
void create(startupAttempt).then(() => setConversationStatus('created')).catch(error => {
|
|
30
|
+
startupAttempt == null || startupAttempt.finish('error', 'create_failed');
|
|
27
31
|
const status = createConversationFailureStatus(error);
|
|
28
32
|
if (status === 'plan-minutes-exhausted') {
|
|
29
33
|
emitEvent('planMinutesExhausted', {});
|
|
30
34
|
}
|
|
31
35
|
setConversationStatus(status);
|
|
32
36
|
});
|
|
37
|
+
return () => startupTelemetrySession == null ? void 0 : startupTelemetrySession.release(startupAttempt);
|
|
38
|
+
// Telemetry changes must not issue another create-conversation request.
|
|
33
39
|
}, [type, chatId]);
|
|
34
40
|
useUnmount(() => {
|
|
35
41
|
if (!conversation) {
|
|
@@ -49,7 +55,7 @@ export function useCreateConversation(options) {
|
|
|
49
55
|
data: conversation,
|
|
50
56
|
destroy
|
|
51
57
|
};
|
|
52
|
-
async function create() {
|
|
58
|
+
async function create(startupAttempt) {
|
|
53
59
|
invariant(personaChatService, 'personaChatService is required. Pass it as a prop to LegendsPlatform.');
|
|
54
60
|
switch (type) {
|
|
55
61
|
case 'video':
|
|
@@ -62,6 +68,8 @@ export function useCreateConversation(options) {
|
|
|
62
68
|
lastConversationTopic,
|
|
63
69
|
conversationLanguage
|
|
64
70
|
});
|
|
71
|
+
startupTelemetrySession == null || startupTelemetrySession.bind(startupAttempt, result.id);
|
|
72
|
+
startupAttempt == null || startupAttempt.mark('api_response');
|
|
65
73
|
setConversation({
|
|
66
74
|
type: 'video',
|
|
67
75
|
url: result.url,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["invariant","useEffect","useAtom","useSetAtom","useUnmount","state","useSdkConsumer","useEmitConversationEvent","createConversationFailureStatus","limit","useCreateConversation","options","type","chatConfig","config","firstConversation","lastConversationTopic","conversationLanguage","_useSdkConsumer","chatId","namespace","personaChatService","setConversationStatus","conversationStatus","_useAtom","conversation","setConversation","emitEvent","create","then","catch","error","status","destroy","data","result","createInteractiveConversation","
|
|
1
|
+
{"version":3,"names":["invariant","useEffect","useAtom","useSetAtom","useUnmount","state","useSdkConsumer","useEmitConversationEvent","createConversationFailureStatus","limit","useCreateConversation","options","type","chatConfig","config","firstConversation","lastConversationTopic","conversationLanguage","_useSdkConsumer","chatId","namespace","personaChatService","startupTelemetrySession","setConversationStatus","conversationStatus","_useAtom","conversation","setConversation","emitEvent","startupAttempt","start","undefined","mark","create","then","catch","error","finish","status","release","destroy","data","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":[]}
|
|
@@ -90,6 +90,7 @@ export async function streamChatMessage(params, callbacks, signal) {
|
|
|
90
90
|
chatConfig = params.chatConfig,
|
|
91
91
|
attachments = params.attachments,
|
|
92
92
|
metadata = params.metadata,
|
|
93
|
+
conversationLanguage = params.conversationLanguage,
|
|
93
94
|
headers = params.headers;
|
|
94
95
|
const onChunk = callbacks.onChunk,
|
|
95
96
|
onDone = callbacks.onDone,
|
|
@@ -115,7 +116,8 @@ export async function streamChatMessage(params, callbacks, signal) {
|
|
|
115
116
|
namespace,
|
|
116
117
|
chatConfig,
|
|
117
118
|
attachments,
|
|
118
|
-
metadata
|
|
119
|
+
metadata,
|
|
120
|
+
conversationLanguage
|
|
119
121
|
}),
|
|
120
122
|
signal
|
|
121
123
|
});
|
|
@@ -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","_await$reader$read","read","done","value","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","_await$reader$read","read","done","value","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,12 +8,13 @@ export function useTextChat(options) {
|
|
|
8
8
|
}
|
|
9
9
|
const _options = options,
|
|
10
10
|
_options$limit = _options.limit,
|
|
11
|
-
limit = _options$limit === void 0 ? 100 : _options$limit
|
|
11
|
+
limit = _options$limit === void 0 ? 100 : _options$limit,
|
|
12
|
+
conversationLanguage = _options.conversationLanguage;
|
|
12
13
|
const _useSdkConsumer = useSdkConsumer(),
|
|
13
14
|
chatId = _useSdkConsumer.chatId,
|
|
14
15
|
namespace = _useSdkConsumer.namespace,
|
|
15
16
|
personaChatService = _useSdkConsumer.personaChatService;
|
|
16
|
-
const send = useToolAwareSend(chatId, namespace);
|
|
17
|
+
const send = useToolAwareSend(chatId, namespace, conversationLanguage);
|
|
17
18
|
const pending = usePendingMessages();
|
|
18
19
|
const _useInfiniteQuery = useInfiniteQuery({
|
|
19
20
|
queryKey: ['chat-messages', chatId, namespace],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useInfiniteQuery","useSdkConsumer","usePendingMessages","useToolAwareSend","useTextChat","options","_options","_options$limit","limit","_useSdkConsumer","chatId","namespace","personaChatService","send","pending","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","status","fetchNextPage","refetch","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,SAASA,gBAAgB,QAAQ,uBAAuB;AAMxD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,kBAAkB,QAAQ,sBAAsB;AACzD,SAASC,gBAAgB,QAAQ,oBAAoB;
|
|
1
|
+
{"version":3,"names":["useInfiniteQuery","useSdkConsumer","usePendingMessages","useToolAwareSend","useTextChat","options","_options","_options$limit","limit","conversationLanguage","_useSdkConsumer","chatId","namespace","personaChatService","send","pending","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","status","fetchNextPage","refetch","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,SAASA,gBAAgB,QAAQ,uBAAuB;AAMxD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,kBAAkB,QAAQ,sBAAsB;AACzD,SAASC,gBAAgB,QAAQ,oBAAoB;AAQrD,OAAO,SAASC,WAAWA,CAACC,OAA2B,EAAO;EAAA,IAAlCA,OAA2B;IAA3BA,OAA2B,GAAG,CAAC,CAAC;EAAA;EAC1D,MAAAC,QAAA,GAA8CD,OAAO;IAAAE,cAAA,GAAAD,QAAA,CAA7CE,KAAK;IAALA,KAAK,GAAAD,cAAA,cAAG,GAAG,GAAAA,cAAA;IAAEE,oBAAoB,GAAAH,QAAA,CAApBG,oBAAoB;EAEzC,MAAAC,eAAA,GAAkDT,cAAc,CAAC,CAAC;IAA1DU,MAAM,GAAAD,eAAA,CAANC,MAAM;IAAEC,SAAS,GAAAF,eAAA,CAATE,SAAS;IAAEC,kBAAkB,GAAAH,eAAA,CAAlBG,kBAAkB;EAE7C,MAAMC,IAAI,GAAGX,gBAAgB,CAACQ,MAAM,EAAEC,SAAS,EAAEH,oBAAoB,CAAC;EACtE,MAAMM,OAAO,GAAGb,kBAAkB,CAAC,CAAC;EAEpC,MAAAc,iBAAA,GAKIhB,gBAAgB,CAAC;MACnBiB,QAAQ,EAAE,CAAC,eAAe,EAAEN,MAAM,EAAEC,SAAS,CAAC;MAC9CM,OAAO,EAAE,MAAAC,IAAA,IAAiD;QAAA,IAAxCC,SAAS,GAAAD,IAAA,CAATC,SAAS;QACzB,IAAI,CAACP,kBAAkB,EAAE;UACvB,OAAO;YAAEQ,QAAQ,EAAE,EAAE;YAAEC,UAAU,EAAEC;UAAU,CAAC;QAChD;QACA,OAAOV,kBAAkB,CAACW,iBAAiB,CAAC;UAC1Cb,MAAM;UACNC,SAAS;UACTJ,KAAK;UACLiB,MAAM,EAAEL;QACV,CAAC,CAAC;MACJ,CAAC;MACDM,gBAAgB,EAAGC,QAAQ,IAAKA,QAAQ,CAACL,UAAU;MACnDM,gBAAgB,EAAEL,SAA+B;MACjDM,MAAM,EAAGC,IAAI,IACXA,IAAI,CAACC,KAAK,CAACC,OAAO,CAAEC,IAAI,IAAKA,IAAI,CAACZ,QAAyB;IAC/D,CAAC,CAAC;IAAAa,qBAAA,GAAAlB,iBAAA,CArBAc,IAAI;IAAET,QAAQ,GAAAa,qBAAA,cAAG,EAAE,GAAAA,qBAAA;IACnBC,MAAM,GAAAnB,iBAAA,CAANmB,MAAM;IACNC,aAAa,GAAApB,iBAAA,CAAboB,aAAa;IACbC,OAAO,GAAArB,iBAAA,CAAPqB,OAAO;EAoBT,OAAO;IACLF,MAAM;IACNpB,OAAO;IACPM,QAAQ;IACRiB,SAAS;IACTD,OAAO;IACPvB,IAAI,EAAEyB;EACR,CAAC;EAED,SAASA,WAAWA,CAACC,OAKpB,EAAE;IACD,OAAO1B,IAAI,CAAC0B,OAAO,CAAC;EACtB;EAEA,SAASF,SAASA,CAAA,EAAG;IACnB,KAAKF,aAAa,CAAC,CAAC;EACtB;AACF","ignoreList":[]}
|