@wix/legends-platform-sdk 1.28.0 → 1.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/components/ChromaKey/ChromaKey.js +25 -6
  3. package/dist/cjs/components/ChromaKey/ChromaKey.js.map +1 -1
  4. package/dist/cjs/components/ChromaKey/chroma-key.js +3 -1
  5. package/dist/cjs/components/ChromaKey/chroma-key.js.map +1 -1
  6. package/dist/cjs/conversation/types.js.map +1 -1
  7. package/dist/cjs/hooks/useConversation/livekit/useConversation.js +30 -16
  8. package/dist/cjs/hooks/useConversation/livekit/useConversation.js.map +1 -1
  9. package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js +4 -0
  10. package/dist/cjs/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
  11. package/dist/cjs/hooks/useConversationEvents/types.js.map +1 -1
  12. package/dist/cjs/hooks/useCreateConversation/createConversationFailureStatus.js +20 -0
  13. package/dist/cjs/hooks/useCreateConversation/createConversationFailureStatus.js.map +1 -0
  14. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js +7 -6
  15. package/dist/cjs/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  16. package/dist/cjs/hooks/usePictureInPicture/usePictureInPictureAuto.js +10 -9
  17. package/dist/cjs/hooks/usePictureInPicture/usePictureInPictureAuto.js.map +1 -1
  18. package/dist/cjs/services/FetchPersonaChatService.js +8 -1
  19. package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
  20. package/dist/esm/components/ChromaKey/ChromaKey.js +26 -5
  21. package/dist/esm/components/ChromaKey/ChromaKey.js.map +1 -1
  22. package/dist/esm/components/ChromaKey/chroma-key.js +3 -1
  23. package/dist/esm/components/ChromaKey/chroma-key.js.map +1 -1
  24. package/dist/esm/conversation/types.js.map +1 -1
  25. package/dist/esm/hooks/useConversation/livekit/useConversation.js +31 -17
  26. package/dist/esm/hooks/useConversation/livekit/useConversation.js.map +1 -1
  27. package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js +3 -0
  28. package/dist/esm/hooks/useConversation/livekit/utils/dataChannel.js.map +1 -1
  29. package/dist/esm/hooks/useConversationEvents/types.js.map +1 -1
  30. package/dist/esm/hooks/useCreateConversation/createConversationFailureStatus.js +16 -0
  31. package/dist/esm/hooks/useCreateConversation/createConversationFailureStatus.js.map +1 -0
  32. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js +7 -6
  33. package/dist/esm/hooks/useCreateConversation/useCreateConversation.js.map +1 -1
  34. package/dist/esm/hooks/usePictureInPicture/usePictureInPictureAuto.js +10 -9
  35. package/dist/esm/hooks/usePictureInPicture/usePictureInPictureAuto.js.map +1 -1
  36. package/dist/esm/services/FetchPersonaChatService.js +8 -1
  37. package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
  38. package/dist/types/components/ChromaKey/ChromaKey.d.ts +1 -0
  39. package/dist/types/components/ChromaKey/ChromaKey.d.ts.map +1 -1
  40. package/dist/types/components/ChromaKey/chroma-key.d.ts +1 -1
  41. package/dist/types/components/ChromaKey/chroma-key.d.ts.map +1 -1
  42. package/dist/types/conversation/types.d.ts +1 -1
  43. package/dist/types/conversation/types.d.ts.map +1 -1
  44. package/dist/types/hooks/useConversation/livekit/useConversation.d.ts.map +1 -1
  45. package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts +1 -0
  46. package/dist/types/hooks/useConversation/livekit/utils/dataChannel.d.ts.map +1 -1
  47. package/dist/types/hooks/useConversationEvents/types.d.ts +5 -0
  48. package/dist/types/hooks/useConversationEvents/types.d.ts.map +1 -1
  49. package/dist/types/hooks/useCreateConversation/createConversationFailureStatus.d.ts +5 -0
  50. package/dist/types/hooks/useCreateConversation/createConversationFailureStatus.d.ts.map +1 -0
  51. package/dist/types/hooks/useCreateConversation/useCreateConversation.d.ts.map +1 -1
  52. package/dist/types/hooks/usePictureInPicture/usePictureInPictureAuto.d.ts.map +1 -1
  53. package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
  54. package/package.json +6 -6
@@ -1 +1 @@
1
- {"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","checkIsBillingEndedMessage","topic","reason","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsInactivityTimeoutData(\n data: unknown,\n): data is InactivityTimeoutData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_timeout'\n );\n}\n\nfunction checkIsBillingEndedMessage(\n data: unknown,\n topic: string | undefined,\n reason: string,\n): boolean {\n return (\n topic === 'billing' &&\n typeof data === 'object' &&\n data !== null &&\n (data as Record<string, unknown>).type === 'ended' &&\n (data as Record<string, unknown>).reason === reason\n );\n}\n\nexport function checkIsCreditExhaustedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'insufficient_credit');\n}\n\nexport function checkIsConversationLimitReachedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'limit_reached');\n}\n"],"mappings":";;;;;;;;;AAMO,SAASA,iBAAiBA,CAACC,IAAgB,EAAW;EAC3D,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EACnD,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,IAAI;EACb;AACF;AAEO,SAASE,wBAAwBA,CACtCP,IAAa,EACc;EAC3B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,iBAAiB,IAAIA,IAAI,IACzB,OAAO,IAAIA,IAAI;AAEnB;AAEO,SAASQ,4BAA4BA,CAC1CR,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB,IAC/D,kBAAkB,IAAIT,IAAI,IAC1B,OAAQA,IAAI,CAA6BU,gBAAgB,KAAK,QAAQ;AAE1E;AAEO,SAASC,4BAA4BA,CAC1CX,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB;AAEnE;AAEA,SAASG,0BAA0BA,CACjCZ,IAAa,EACba,KAAyB,EACzBC,MAAc,EACL;EACT,OACED,KAAK,KAAK,SAAS,IACnB,OAAOb,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACZA,IAAI,CAA6BS,IAAI,KAAK,OAAO,IACjDT,IAAI,CAA6Bc,MAAM,KAAKA,MAAM;AAEvD;AAEO,SAASC,6BAA6BA,CAC3Cf,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,qBAAqB,CAAC;AACvE;AAEO,SAASG,sCAAsCA,CACpDhB,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,eAAe,CAAC;AACjE","ignoreList":[]}
1
+ {"version":3,"names":["decodeDataPayload","data","JSON","parse","TextDecoder","decode","error","console","checkIsTurnDetectionData","checkIsInactivityWarningData","type","grace_period_sec","checkIsInactivityTimeoutData","checkIsBillingEndedMessage","topic","reason","checkIsCreditExhaustedMessage","checkIsConversationLimitReachedMessage","checkIsPlanMinutesExhaustedMessage"],"sources":["../../../../../../src/hooks/useConversation/livekit/utils/dataChannel.ts"],"sourcesContent":["import type {\n InactivityWarningData,\n InactivityTimeoutData,\n TurnDetectionData,\n} from '../types';\n\nexport function decodeDataPayload(data: Uint8Array): unknown {\n try {\n return JSON.parse(new TextDecoder().decode(data));\n } catch (error) {\n console.error('Failed to decode data received payload', error);\n return null;\n }\n}\n\nexport function checkIsTurnDetectionData(\n data: unknown,\n): data is TurnDetectionData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'participantKind' in data &&\n 'state' in data\n );\n}\n\nexport function checkIsInactivityWarningData(\n data: unknown,\n): data is InactivityWarningData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_warning' &&\n 'grace_period_sec' in data &&\n typeof (data as Record<string, unknown>).grace_period_sec === 'number'\n );\n}\n\nexport function checkIsInactivityTimeoutData(\n data: unknown,\n): data is InactivityTimeoutData {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'type' in data &&\n (data as Record<string, unknown>).type === 'inactivity_timeout'\n );\n}\n\nfunction checkIsBillingEndedMessage(\n data: unknown,\n topic: string | undefined,\n reason: string,\n): boolean {\n return (\n topic === 'billing' &&\n typeof data === 'object' &&\n data !== null &&\n (data as Record<string, unknown>).type === 'ended' &&\n (data as Record<string, unknown>).reason === reason\n );\n}\n\nexport function checkIsCreditExhaustedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'insufficient_credit');\n}\n\nexport function checkIsConversationLimitReachedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'limit_reached');\n}\n\nexport function checkIsPlanMinutesExhaustedMessage(\n data: unknown,\n topic: string | undefined,\n): boolean {\n return checkIsBillingEndedMessage(data, topic, 'plan_minutes_exhausted');\n}\n"],"mappings":";;;;;;;;;;AAMO,SAASA,iBAAiBA,CAACC,IAAgB,EAAW;EAC3D,IAAI;IACF,OAAOC,IAAI,CAACC,KAAK,CAAC,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CAACJ,IAAI,CAAC,CAAC;EACnD,CAAC,CAAC,OAAOK,KAAK,EAAE;IACdC,OAAO,CAACD,KAAK,CAAC,wCAAwC,EAAEA,KAAK,CAAC;IAC9D,OAAO,IAAI;EACb;AACF;AAEO,SAASE,wBAAwBA,CACtCP,IAAa,EACc;EAC3B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,iBAAiB,IAAIA,IAAI,IACzB,OAAO,IAAIA,IAAI;AAEnB;AAEO,SAASQ,4BAA4BA,CAC1CR,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB,IAC/D,kBAAkB,IAAIT,IAAI,IAC1B,OAAQA,IAAI,CAA6BU,gBAAgB,KAAK,QAAQ;AAE1E;AAEO,SAASC,4BAA4BA,CAC1CX,IAAa,EACkB;EAC/B,OACE,OAAOA,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACb,MAAM,IAAIA,IAAI,IACbA,IAAI,CAA6BS,IAAI,KAAK,oBAAoB;AAEnE;AAEA,SAASG,0BAA0BA,CACjCZ,IAAa,EACba,KAAyB,EACzBC,MAAc,EACL;EACT,OACED,KAAK,KAAK,SAAS,IACnB,OAAOb,IAAI,KAAK,QAAQ,IACxBA,IAAI,KAAK,IAAI,IACZA,IAAI,CAA6BS,IAAI,KAAK,OAAO,IACjDT,IAAI,CAA6Bc,MAAM,KAAKA,MAAM;AAEvD;AAEO,SAASC,6BAA6BA,CAC3Cf,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,qBAAqB,CAAC;AACvE;AAEO,SAASG,sCAAsCA,CACpDhB,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,eAAe,CAAC;AACjE;AAEO,SAASI,kCAAkCA,CAChDjB,IAAa,EACba,KAAyB,EAChB;EACT,OAAOD,0BAA0B,CAACZ,IAAI,EAAEa,KAAK,EAAE,wBAAwB,CAAC;AAC1E","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport type { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type ConversationTurnLatencyPayload = {\n conversationId: string;\n speechId?: string;\n sequence?: number;\n clientAcousticLatencyMs: number;\n rttMs?: number;\n jitterBufferDelayMs?: number;\n userPacketsLost?: number;\n agentPacketsLost?: number;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type CreditExhaustedPayload = {\n conversationId: string;\n};\n\nexport type ConversationLimitReachedPayload = {\n conversationId: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n conversationTurnLatency: ConversationTurnLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n creditExhausted: CreditExhaustedPayload;\n conversationLimitReached: ConversationLimitReachedPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../../src/hooks/useConversationEvents/types.tsx"],"sourcesContent":["import React from 'react';\nimport type { RemoteParticipant } from 'livekit-client';\n\nexport type UserSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type TimeExceededPayload = {\n conversationId: string;\n limit: number;\n};\n\nexport type UserSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStartPayload = {\n conversationId: string;\n};\n\nexport type AgentSpeakStopPayload = {\n conversationId: string;\n};\n\nexport type ResponseLatencyPayload = {\n conversationId: string;\n latencyMs: number;\n turnDetectionStrategy: string;\n sequence?: number;\n speechId?: string;\n};\n\nexport type ConversationTurnLatencyPayload = {\n conversationId: string;\n speechId?: string;\n sequence?: number;\n clientAcousticLatencyMs: number;\n rttMs?: number;\n jitterBufferDelayMs?: number;\n userPacketsLost?: number;\n agentPacketsLost?: number;\n};\n\nexport type InterruptPayload = {\n conversationId: string;\n};\n\nexport type CallStartedPayload = {\n conversationId: string;\n};\n\nexport type CallEndedPayload = {\n conversationId: string;\n};\n\nexport type UserSendMessagePayload = {\n conversationId: string;\n message: string;\n};\n\nexport type AgentJoinedPayload = {\n conversationId: string;\n participant: RemoteParticipant;\n};\n\nexport type AgentLeftPayload = {\n conversationId: string;\n participant?: RemoteParticipant;\n};\n\nexport type AgentVideoLoadedPayload = {\n videoRef: React.RefObject<HTMLVideoElement>;\n};\n\nexport type InactivityWarningPayload = {\n conversationId: string;\n gracePeriodSec: number;\n};\n\nexport type InactivityTimeoutPayload = {\n conversationId: string;\n};\n\nexport type CreditExhaustedPayload = {\n conversationId: string;\n};\n\nexport type ConversationLimitReachedPayload = {\n conversationId: string;\n};\n\nexport type PlanMinutesExhaustedPayload = {\n /** Absent when the server refused to start the conversation. */\n conversationId?: string;\n};\n\nexport type ConversationEventMap = {\n userSpeakStart: UserSpeakStartPayload;\n userSpeakStop: UserSpeakStopPayload;\n agentSpeakStart: AgentSpeakStartPayload;\n agentSpeakStop: AgentSpeakStopPayload;\n responseLatency: ResponseLatencyPayload;\n conversationTurnLatency: ConversationTurnLatencyPayload;\n interrupt: InterruptPayload;\n callStarted: CallStartedPayload;\n callEnded: CallEndedPayload;\n userSendMessage: UserSendMessagePayload;\n agentJoined: AgentJoinedPayload;\n agentLeft: AgentLeftPayload;\n timeExceeded: TimeExceededPayload;\n agentVideoLoaded: AgentVideoLoadedPayload;\n inactivityWarning: InactivityWarningPayload;\n inactivityTimeout: InactivityTimeoutPayload;\n creditExhausted: CreditExhaustedPayload;\n conversationLimitReached: ConversationLimitReachedPayload;\n planMinutesExhausted: PlanMinutesExhaustedPayload;\n};\n\nexport type ConversationEvent = keyof ConversationEventMap;\n\nexport type EventPayload<T extends ConversationEvent> = ConversationEventMap[T];\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ exports.__esModule = true;
4
+ exports.createConversationFailureStatus = createConversationFailureStatus;
5
+ const PLAN_MINUTES_EXHAUSTED = 'PLAN_MINUTES_EXHAUSTED';
6
+ function createConversationFailureStatus(error) {
7
+ var _err$response, _err$response2, _body$details, _err$message;
8
+ const err = error ?? {};
9
+ // @wix/http-client puts the status and body on `response`; the SDK's HttpError puts them on the error.
10
+ const status = err.status ?? ((_err$response = err.response) == null ? void 0 : _err$response.status);
11
+ const body = ((_err$response2 = err.response) == null ? void 0 : _err$response2.data) ?? err.data;
12
+ if ((body == null || (_body$details = body.details) == null || (_body$details = _body$details.applicationError) == null ? void 0 : _body$details.code) === PLAN_MINUTES_EXHAUSTED) {
13
+ return 'plan-minutes-exhausted';
14
+ }
15
+ if (status === 404 && (_err$message = err.message) != null && _err$message.includes('not found')) {
16
+ return 'voice-not-found';
17
+ }
18
+ return 'initialization-error';
19
+ }
20
+ //# sourceMappingURL=createConversationFailureStatus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["PLAN_MINUTES_EXHAUSTED","createConversationFailureStatus","error","_err$response","_err$response2","_body$details","_err$message","err","status","response","body","data","details","applicationError","code","message","includes"],"sources":["../../../../src/hooks/useCreateConversation/createConversationFailureStatus.ts"],"sourcesContent":["import type { ConversationStatus } from '../../conversation';\n\ntype CreateConversationFailureStatus = Extract<\n ConversationStatus,\n 'plan-minutes-exhausted' | 'voice-not-found' | 'initialization-error'\n>;\n\ntype ErrorBody = {\n details?: { applicationError?: { code?: string } };\n};\n\ntype CreateConversationError = {\n status?: number;\n message?: string;\n data?: ErrorBody;\n response?: { status?: number; data?: ErrorBody };\n};\n\nconst PLAN_MINUTES_EXHAUSTED = 'PLAN_MINUTES_EXHAUSTED';\n\nexport function createConversationFailureStatus(\n error: unknown,\n): CreateConversationFailureStatus {\n const err = (error ?? {}) as CreateConversationError;\n // @wix/http-client puts the status and body on `response`; the SDK's HttpError puts them on the error.\n const status = err.status ?? err.response?.status;\n const body = err.response?.data ?? err.data;\n\n if (body?.details?.applicationError?.code === PLAN_MINUTES_EXHAUSTED) {\n return 'plan-minutes-exhausted';\n }\n if (status === 404 && err.message?.includes('not found')) {\n return 'voice-not-found';\n }\n return 'initialization-error';\n}\n"],"mappings":";;;;AAkBA,MAAMA,sBAAsB,GAAG,wBAAwB;AAEhD,SAASC,+BAA+BA,CAC7CC,KAAc,EACmB;EAAA,IAAAC,aAAA,EAAAC,cAAA,EAAAC,aAAA,EAAAC,YAAA;EACjC,MAAMC,GAAG,GAAIL,KAAK,IAAI,CAAC,CAA6B;EACpD;EACA,MAAMM,MAAM,GAAGD,GAAG,CAACC,MAAM,MAAAL,aAAA,GAAII,GAAG,CAACE,QAAQ,qBAAZN,aAAA,CAAcK,MAAM;EACjD,MAAME,IAAI,GAAG,EAAAN,cAAA,GAAAG,GAAG,CAACE,QAAQ,qBAAZL,cAAA,CAAcO,IAAI,KAAIJ,GAAG,CAACI,IAAI;EAE3C,IAAI,CAAAD,IAAI,aAAAL,aAAA,GAAJK,IAAI,CAAEE,OAAO,cAAAP,aAAA,GAAbA,aAAA,CAAeQ,gBAAgB,qBAA/BR,aAAA,CAAiCS,IAAI,MAAKd,sBAAsB,EAAE;IACpE,OAAO,wBAAwB;EACjC;EACA,IAAIQ,MAAM,KAAK,GAAG,KAAAF,YAAA,GAAIC,GAAG,CAACQ,OAAO,aAAXT,YAAA,CAAaU,QAAQ,CAAC,WAAW,CAAC,EAAE;IACxD,OAAO,iBAAiB;EAC1B;EACA,OAAO,sBAAsB;AAC/B","ignoreList":[]}
@@ -9,6 +9,8 @@ var _jotai = require("jotai");
9
9
  var _reactUse = require("react-use");
10
10
  var _conversation = require("../../conversation");
11
11
  var _sdkConsumer = require("../../sdk-consumer");
12
+ var _useEmitConversationEvent = require("../useConversationEvents/useEmitConversationEvent");
13
+ var _createConversationFailureStatus = require("./createConversationFailureStatus");
12
14
  var _helpers = require("./helpers");
13
15
  function useCreateConversation(options) {
14
16
  const {
@@ -24,15 +26,14 @@ function useCreateConversation(options) {
24
26
  } = (0, _sdkConsumer.useSdkConsumer)();
25
27
  const setConversationStatus = (0, _jotai.useSetAtom)(_conversation.state.conversationStatus);
26
28
  const [conversation, setConversation] = (0, _jotai.useAtom)(_conversation.state.conversation);
29
+ const emitEvent = (0, _useEmitConversationEvent.useEmitConversationEvent)();
27
30
  (0, _react.useEffect)(() => {
28
31
  void create().then(() => setConversationStatus('created')).catch(error => {
29
- var _err$message;
30
- const err = error;
31
- if (err.status === 404 && (_err$message = err.message) != null && _err$message.includes('not found')) {
32
- setConversationStatus('voice-not-found');
33
- } else {
34
- setConversationStatus('initialization-error');
32
+ const status = (0, _createConversationFailureStatus.createConversationFailureStatus)(error);
33
+ if (status === 'plan-minutes-exhausted') {
34
+ emitEvent('planMinutesExhausted', {});
35
35
  }
36
+ setConversationStatus(status);
36
37
  });
37
38
  }, [type, chatId]);
38
39
  (0, _reactUse.useUnmount)(() => {
@@ -1 +1 @@
1
- {"version":3,"names":["_invariant","_interopRequireDefault","require","_react","_jotai","_reactUse","_conversation","_sdkConsumer","_helpers","useCreateConversation","options","type","config","chatConfig","firstConversation","lastConversationTopic","chatId","namespace","personaChatService","useSdkConsumer","setConversationStatus","useSetAtom","state","conversationStatus","conversation","setConversation","useAtom","useEffect","create","then","catch","error","_err$message","err","status","message","includes","useUnmount","destroy","limit","data","invariant","result","createInteractiveConversation","url","id","createVoiceConversation","Error","endInteractiveConversation","conversationId","undefined"],"sources":["../../../../src/hooks/useCreateConversation/useCreateConversation.ts"],"sourcesContent":["import invariant from 'invariant';\nimport { useEffect } from 'react';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { useUnmount } from 'react-use';\n\nimport {\n state,\n type ConversationType,\n type Conversation,\n} from '../../conversation';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?: object;\n /** 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};\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 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const setConversationStatus = useSetAtom(state.conversationStatus);\n const [conversation, setConversation] = useAtom(state.conversation);\n\n useEffect(() => {\n void create()\n .then(() => setConversationStatus('created'))\n .catch((error: unknown) => {\n const err = error as { status?: number; message?: string };\n if (err.status === 404 && err.message?.includes('not found')) {\n setConversationStatus('voice-not-found');\n } else {\n setConversationStatus('initialization-error');\n }\n });\n }, [type, chatId]);\n\n useUnmount(() => {\n if (!conversation) {\n return;\n }\n void destroy();\n });\n\n useEffect(() => {\n if (!conversation) {\n return;\n }\n if (conversation.limit === 0) {\n setConversationStatus('exceeded');\n }\n }, [conversation]);\n\n return { data: conversation, destroy };\n\n async function create() {\n invariant(\n personaChatService,\n 'personaChatService is required. Pass it as a prop to LegendsPlatform.',\n );\n\n switch (type) {\n case 'video': {\n const result = await personaChatService.createInteractiveConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n });\n setConversation({\n type: 'video',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n case 'audio': {\n const result = await personaChatService.createVoiceConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n });\n setConversation({\n type: 'audio',\n url: result.url,\n id: result.id,\n limit: limit(result.limit),\n });\n break;\n }\n default:\n throw new Error(`Unsupported conversation type: ${type}`);\n }\n }\n\n async function destroy() {\n invariant(conversation, 'Conversation is not ready');\n invariant(personaChatService, 'personaChatService is required.');\n\n setConversationStatus('destroying');\n\n if (conversation.type === 'video') {\n await personaChatService\n .endInteractiveConversation({\n chatId,\n conversationId: conversation.id,\n namespace,\n })\n .catch(() => {});\n }\n\n setConversationStatus('destroyed');\n setConversation(undefined);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_invariant","_interopRequireDefault","require","_react","_jotai","_reactUse","_conversation","_sdkConsumer","_useEmitConversationEvent","_createConversationFailureStatus","_helpers","useCreateConversation","options","type","config","chatConfig","firstConversation","lastConversationTopic","chatId","namespace","personaChatService","useSdkConsumer","setConversationStatus","useSetAtom","state","conversationStatus","conversation","setConversation","useAtom","emitEvent","useEmitConversationEvent","useEffect","create","then","catch","error","status","createConversationFailureStatus","useUnmount","destroy","limit","data","invariant","result","createInteractiveConversation","url","id","createVoiceConversation","Error","endInteractiveConversation","conversationId","undefined"],"sources":["../../../../src/hooks/useCreateConversation/useCreateConversation.ts"],"sourcesContent":["import invariant from 'invariant';\nimport { useEffect } from 'react';\nimport { useAtom, useSetAtom } from 'jotai';\nimport { useUnmount } from 'react-use';\n\nimport {\n state,\n type ConversationType,\n type Conversation,\n} from '../../conversation';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { useEmitConversationEvent } from '../useConversationEvents/useEmitConversationEvent';\nimport { createConversationFailureStatus } from './createConversationFailureStatus';\nimport { limit } from './helpers';\n\nexport type UseCreateConversationOptions = {\n type: ConversationType;\n config?: object;\n /** Whether this is the visitor's first-ever conversation with the persona (drives the opening message). */\n firstConversation?: boolean;\n /** Title of the visitor's last meaningful conversation, for a returning-visitor greeting. */\n lastConversationTopic?: string;\n};\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 } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const setConversationStatus = useSetAtom(state.conversationStatus);\n const [conversation, setConversation] = useAtom(state.conversation);\n const emitEvent = useEmitConversationEvent();\n\n useEffect(() => {\n void create()\n .then(() => setConversationStatus('created'))\n .catch((error: unknown) => {\n const status = createConversationFailureStatus(error);\n if (status === 'plan-minutes-exhausted') {\n emitEvent('planMinutesExhausted', {});\n }\n setConversationStatus(status);\n });\n }, [type, chatId]);\n\n useUnmount(() => {\n if (!conversation) {\n return;\n }\n void destroy();\n });\n\n useEffect(() => {\n if (!conversation) {\n return;\n }\n if (conversation.limit === 0) {\n setConversationStatus('exceeded');\n }\n }, [conversation]);\n\n return { data: conversation, destroy };\n\n async function create() {\n invariant(\n personaChatService,\n 'personaChatService is required. Pass it as a prop to LegendsPlatform.',\n );\n\n switch (type) {\n case 'video': {\n const result = await personaChatService.createInteractiveConversation({\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n });\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 });\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":[]}
@@ -19,6 +19,7 @@ function usePictureInPictureAuto(options) {
19
19
  const setIsActive = (0, _jotai.useSetAtom)(_state.pipActiveAtom);
20
20
  const isSupported = (0, _jotai.useAtomValue)(_state.pipSupportedAtom);
21
21
  const canvasVideoRef = (0, _react.useRef)(null);
22
+ const ownsPiPVideo = !!element && isSupported && pipVideo === (canvasVideoRef.current ?? element);
22
23
  const callbacksRef = (0, _reactUse.useLatest)({
23
24
  onEnter,
24
25
  onExit,
@@ -26,7 +27,6 @@ function usePictureInPictureAuto(options) {
26
27
  });
27
28
  (0, _react.useEffect)(() => {
28
29
  if (!element || !isSupported) {
29
- setPipVideo(null);
30
30
  return;
31
31
  }
32
32
  let video;
@@ -43,11 +43,11 @@ function usePictureInPictureAuto(options) {
43
43
  destroyCanvasVideo(canvasVideoRef.current);
44
44
  canvasVideoRef.current = null;
45
45
  }
46
- setPipVideo(null);
46
+ setPipVideo(current => current === video ? null : current);
47
47
  };
48
48
  }, [element, isSupported, setPipVideo]);
49
49
  (0, _react.useEffect)(() => {
50
- if (!pipVideo) {
50
+ if (!pipVideo || !ownsPiPVideo) {
51
51
  return;
52
52
  }
53
53
  const handleEnter = () => {
@@ -64,9 +64,9 @@ function usePictureInPictureAuto(options) {
64
64
  pipVideo.removeEventListener('enterpictureinpicture', handleEnter);
65
65
  pipVideo.removeEventListener('leavepictureinpicture', handleLeave);
66
66
  };
67
- }, [pipVideo, setIsActive]);
67
+ }, [pipVideo, ownsPiPVideo, setIsActive]);
68
68
  (0, _react.useEffect)(() => {
69
- if (!pipVideo || !isSupported) {
69
+ if (!pipVideo || !ownsPiPVideo) {
70
70
  return;
71
71
  }
72
72
  try {
@@ -86,17 +86,18 @@ function usePictureInPictureAuto(options) {
86
86
  navigator.mediaSession.setActionHandler('enterpictureinpicture', null);
87
87
  } catch {}
88
88
  };
89
- }, [pipVideo, isSupported]);
89
+ }, [pipVideo, ownsPiPVideo]);
90
90
  (0, _react.useEffect)(() => {
91
- if (!element) {
91
+ if (!element || !isSupported) {
92
92
  return;
93
93
  }
94
+ const ownedVideo = canvasVideoRef.current ?? element;
94
95
  return () => {
95
- if (document.pictureInPictureElement) {
96
+ if (document.pictureInPictureElement === ownedVideo) {
96
97
  document.exitPictureInPicture().catch(() => {});
97
98
  }
98
99
  };
99
- }, [element]);
100
+ }, [element, isSupported]);
100
101
  }
101
102
  function createVideoFromCanvas(canvas) {
102
103
  const video = document.createElement('video');
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactUse","_jotai","_state","usePictureInPictureAuto","options","element","onEnter","onExit","onError","pipVideo","setPipVideo","useAtom","pipVideoAtom","setIsActive","useSetAtom","pipActiveAtom","isSupported","useAtomValue","pipSupportedAtom","canvasVideoRef","useRef","callbacksRef","useLatest","useEffect","video","HTMLCanvasElement","createVideoFromCanvas","current","setAttribute","destroyCanvasVideo","handleEnter","handleLeave","addEventListener","removeEventListener","navigator","mediaSession","setActionHandler","paused","srcObject","play","requestPictureInPicture","error","document","pictureInPictureElement","exitPictureInPicture","catch","canvas","createElement","muted","playsInline","autoplay","captureStream","stream","getTracks","forEach","track","stop"],"sources":["../../../../src/hooks/usePictureInPicture/usePictureInPictureAuto.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { useEffect, useRef } from 'react';\nimport { useLatest } from 'react-use';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\n\nimport { pipVideoAtom, pipActiveAtom, pipSupportedAtom } from './state';\nimport type { UsePictureInPictureAutoOptions } from './types';\n\nexport function usePictureInPictureAuto(\n options: UsePictureInPictureAutoOptions,\n) {\n const { element, onEnter, onExit, onError } = options;\n\n const [pipVideo, setPipVideo] = useAtom(pipVideoAtom);\n const setIsActive = useSetAtom(pipActiveAtom);\n const isSupported = useAtomValue(pipSupportedAtom);\n\n const canvasVideoRef = useRef<HTMLVideoElement | null>(null);\n\n const callbacksRef = useLatest({ onEnter, onExit, onError });\n\n useEffect(() => {\n if (!element || !isSupported) {\n setPipVideo(null);\n return;\n }\n\n let video: HTMLVideoElement;\n\n if (element instanceof HTMLCanvasElement) {\n video = createVideoFromCanvas(element);\n canvasVideoRef.current = video;\n } else {\n video = element;\n }\n\n video.setAttribute('autopictureinpicture', 'true');\n setPipVideo(video);\n\n return () => {\n if (canvasVideoRef.current) {\n destroyCanvasVideo(canvasVideoRef.current);\n canvasVideoRef.current = null;\n }\n setPipVideo(null);\n };\n }, [element, isSupported, setPipVideo]);\n\n useEffect(() => {\n if (!pipVideo) {\n return;\n }\n\n const handleEnter = () => {\n setIsActive(true);\n callbacksRef.current.onEnter?.();\n };\n\n const handleLeave = () => {\n setIsActive(false);\n callbacksRef.current.onExit?.();\n };\n\n pipVideo.addEventListener('enterpictureinpicture', handleEnter);\n pipVideo.addEventListener('leavepictureinpicture', handleLeave);\n\n return () => {\n pipVideo.removeEventListener('enterpictureinpicture', handleEnter);\n pipVideo.removeEventListener('leavepictureinpicture', handleLeave);\n };\n }, [pipVideo, setIsActive]);\n\n useEffect(() => {\n if (!pipVideo || !isSupported) {\n return;\n }\n\n try {\n navigator.mediaSession.setActionHandler(\n 'enterpictureinpicture' as MediaSessionAction,\n async () => {\n try {\n if (pipVideo.paused && pipVideo.srcObject) {\n await pipVideo.play();\n }\n await pipVideo.requestPictureInPicture();\n } catch (error) {\n callbacksRef.current.onError?.(error as Error);\n }\n },\n );\n } catch {}\n\n return () => {\n try {\n navigator.mediaSession.setActionHandler(\n 'enterpictureinpicture' as MediaSessionAction,\n null,\n );\n } catch {}\n };\n }, [pipVideo, isSupported]);\n\n useEffect(() => {\n if (!element) {\n return;\n }\n\n return () => {\n if (document.pictureInPictureElement) {\n document.exitPictureInPicture().catch(() => {});\n }\n };\n }, [element]);\n}\n\nfunction createVideoFromCanvas(canvas: HTMLCanvasElement): HTMLVideoElement {\n const video = document.createElement('video');\n video.muted = true;\n video.playsInline = true;\n video.autoplay = true;\n video.srcObject = canvas.captureStream(30);\n return video;\n}\n\nfunction destroyCanvasVideo(video: HTMLVideoElement) {\n if (video.srcObject) {\n const stream = video.srcObject as MediaStream;\n stream.getTracks().forEach((track) => track.stop());\n video.srcObject = null;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactUse","_jotai","_state","usePictureInPictureAuto","options","element","onEnter","onExit","onError","pipVideo","setPipVideo","useAtom","pipVideoAtom","setIsActive","useSetAtom","pipActiveAtom","isSupported","useAtomValue","pipSupportedAtom","canvasVideoRef","useRef","ownsPiPVideo","current","callbacksRef","useLatest","useEffect","video","HTMLCanvasElement","createVideoFromCanvas","setAttribute","destroyCanvasVideo","handleEnter","handleLeave","addEventListener","removeEventListener","navigator","mediaSession","setActionHandler","paused","srcObject","play","requestPictureInPicture","error","ownedVideo","document","pictureInPictureElement","exitPictureInPicture","catch","canvas","createElement","muted","playsInline","autoplay","captureStream","stream","getTracks","forEach","track","stop"],"sources":["../../../../src/hooks/usePictureInPicture/usePictureInPictureAuto.ts"],"sourcesContent":["/* eslint-disable no-undef */\nimport { useEffect, useRef } from 'react';\nimport { useLatest } from 'react-use';\nimport { useAtom, useAtomValue, useSetAtom } from 'jotai';\n\nimport { pipVideoAtom, pipActiveAtom, pipSupportedAtom } from './state';\nimport type { UsePictureInPictureAutoOptions } from './types';\n\nexport function usePictureInPictureAuto(\n options: UsePictureInPictureAutoOptions,\n) {\n const { element, onEnter, onExit, onError } = options;\n\n const [pipVideo, setPipVideo] = useAtom(pipVideoAtom);\n const setIsActive = useSetAtom(pipActiveAtom);\n const isSupported = useAtomValue(pipSupportedAtom);\n\n const canvasVideoRef = useRef<HTMLVideoElement | null>(null);\n const ownsPiPVideo =\n !!element &&\n isSupported &&\n pipVideo === (canvasVideoRef.current ?? element);\n\n const callbacksRef = useLatest({ onEnter, onExit, onError });\n\n useEffect(() => {\n if (!element || !isSupported) {\n return;\n }\n\n let video: HTMLVideoElement;\n\n if (element instanceof HTMLCanvasElement) {\n video = createVideoFromCanvas(element);\n canvasVideoRef.current = video;\n } else {\n video = element;\n }\n\n video.setAttribute('autopictureinpicture', 'true');\n setPipVideo(video);\n\n return () => {\n if (canvasVideoRef.current) {\n destroyCanvasVideo(canvasVideoRef.current);\n canvasVideoRef.current = null;\n }\n setPipVideo((current) => (current === video ? null : current));\n };\n }, [element, isSupported, setPipVideo]);\n\n useEffect(() => {\n if (!pipVideo || !ownsPiPVideo) {\n return;\n }\n\n const handleEnter = () => {\n setIsActive(true);\n callbacksRef.current.onEnter?.();\n };\n\n const handleLeave = () => {\n setIsActive(false);\n callbacksRef.current.onExit?.();\n };\n\n pipVideo.addEventListener('enterpictureinpicture', handleEnter);\n pipVideo.addEventListener('leavepictureinpicture', handleLeave);\n\n return () => {\n pipVideo.removeEventListener('enterpictureinpicture', handleEnter);\n pipVideo.removeEventListener('leavepictureinpicture', handleLeave);\n };\n }, [pipVideo, ownsPiPVideo, setIsActive]);\n\n useEffect(() => {\n if (!pipVideo || !ownsPiPVideo) {\n return;\n }\n\n try {\n navigator.mediaSession.setActionHandler(\n 'enterpictureinpicture' as MediaSessionAction,\n async () => {\n try {\n if (pipVideo.paused && pipVideo.srcObject) {\n await pipVideo.play();\n }\n await pipVideo.requestPictureInPicture();\n } catch (error) {\n callbacksRef.current.onError?.(error as Error);\n }\n },\n );\n } catch {}\n\n return () => {\n try {\n navigator.mediaSession.setActionHandler(\n 'enterpictureinpicture' as MediaSessionAction,\n null,\n );\n } catch {}\n };\n }, [pipVideo, ownsPiPVideo]);\n\n useEffect(() => {\n if (!element || !isSupported) {\n return;\n }\n const ownedVideo = canvasVideoRef.current ?? element;\n\n return () => {\n if (document.pictureInPictureElement === ownedVideo) {\n document.exitPictureInPicture().catch(() => {});\n }\n };\n }, [element, isSupported]);\n}\n\nfunction createVideoFromCanvas(canvas: HTMLCanvasElement): HTMLVideoElement {\n const video = document.createElement('video');\n video.muted = true;\n video.playsInline = true;\n video.autoplay = true;\n video.srcObject = canvas.captureStream(30);\n return video;\n}\n\nfunction destroyCanvasVideo(video: HTMLVideoElement) {\n if (video.srcObject) {\n const stream = video.srcObject as MediaStream;\n stream.getTracks().forEach((track) => track.stop());\n video.srcObject = null;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -39,7 +39,7 @@ class FetchPersonaChatService {
39
39
  });
40
40
  if (!response.ok) {
41
41
  const text = await response.text().catch(() => '');
42
- throw new _http.HttpError(response.status, `Request failed: ${response.status} ${text}`);
42
+ throw new _http.HttpError(response.status, `Request failed: ${response.status} ${text}`, parseJson(text));
43
43
  }
44
44
  return response.json();
45
45
  }
@@ -146,4 +146,11 @@ class FetchPersonaChatService {
146
146
  }
147
147
  }
148
148
  exports.FetchPersonaChatService = FetchPersonaChatService;
149
+ function parseJson(text) {
150
+ try {
151
+ return JSON.parse(text);
152
+ } catch {
153
+ return undefined;
154
+ }
155
+ }
149
156
  //# sourceMappingURL=FetchPersonaChatService.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_http","require","BASE_URL","resolveLimitMs","limitation","undefined","type","limit","FetchPersonaChatService","constructor","apiKey","_defineProperty2","default","headers","Authorization","post","path","body","response","fetch","method","JSON","stringify","ok","text","catch","HttpError","status","json","createVoiceConversation","params","chatId","namespace","chatConfig","data","url","conversationUrl","id","interactiveConversationId","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","attachments","queryChatMessages","_data$pagingMetadata","cursor","query","cursorPaging","messages","chatMessages","map","m","content","role","createdAt","nextCursor","pagingMetadata","cursors","next","exports"],"sources":["../../../src/services/FetchPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n ChatMessage,\n Limitation,\n} from '../types';\n\nconst BASE_URL = 'https://www.wixapis.com';\n\nfunction resolveLimitMs(limitation?: Limitation): number | undefined {\n if (!limitation) {\n return undefined;\n }\n switch (limitation.type) {\n case 'MINUTES':\n return (limitation.limit ?? 0) * 60 * 1000;\n case 'SECONDS':\n return (limitation.limit ?? 0) * 1000;\n case 'TOKENS':\n default:\n return 0;\n }\n}\n\nexport class FetchPersonaChatService implements IPersonaChatService {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Api-Key ${this.apiKey}`,\n };\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await fetch(`${BASE_URL}${path}`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new HttpError(\n response.status,\n `Request failed: ${response.status} ${text}`,\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-voice-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-interactive-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async endInteractiveConversation(\n params: EndConversationParams,\n ): Promise<void> {\n const { chatId, conversationId, namespace } = params;\n\n await this.post(\n `/_api/persona-chat-service/v1/chats/${chatId}/end-interactive-conversation`,\n { namespace, interactiveConversationId: conversationId },\n ).catch(() => {\n // best-effort\n });\n }\n\n async sendChatMessage(\n params: SendMessageParams,\n ): Promise<{ functionCalls?: FunctionCall[]; messages?: ChatMessage[] }> {\n const {\n chatId,\n namespace,\n message,\n functionCallResults,\n chatConfig,\n attachments,\n } = params;\n\n return this.post<{\n functionCalls?: FunctionCall[];\n messages?: ChatMessage[];\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages`, {\n namespace,\n message,\n ...(functionCallResults ? { functionCallResults } : {}),\n ...(chatConfig ? { chatConfig } : {}),\n ...(attachments ? { attachments } : {}),\n });\n }\n\n async queryChatMessages(\n params: QueryMessagesParams,\n ): Promise<QueryMessagesResult> {\n const { chatId, namespace, limit = 100, cursor } = params;\n\n const data = await this.post<{\n chatMessages?: {\n id: string;\n content: string;\n role: string;\n createdAt?: string;\n }[];\n pagingMetadata?: { cursors?: { next?: string } };\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages/query`, {\n namespace,\n query: { cursorPaging: { limit, ...(cursor ? { cursor } : {}) } },\n });\n\n return {\n messages: (data.chatMessages ?? []).map((m) => ({\n id: m.id,\n content: m.content,\n role: m.role as 'USER' | 'ASSISTANT',\n createdAt: m.createdAt,\n })),\n nextCursor: data.pagingMetadata?.cursors?.next,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_http","require","BASE_URL","resolveLimitMs","limitation","undefined","type","limit","FetchPersonaChatService","constructor","apiKey","_defineProperty2","default","headers","Authorization","post","path","body","response","fetch","method","JSON","stringify","ok","text","catch","HttpError","status","parseJson","json","createVoiceConversation","params","chatId","namespace","chatConfig","data","url","conversationUrl","id","interactiveConversationId","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","attachments","queryChatMessages","_data$pagingMetadata","cursor","query","cursorPaging","messages","chatMessages","map","m","content","role","createdAt","nextCursor","pagingMetadata","cursors","next","exports","parse"],"sources":["../../../src/services/FetchPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n ChatMessage,\n Limitation,\n} from '../types';\n\nconst BASE_URL = 'https://www.wixapis.com';\n\nfunction resolveLimitMs(limitation?: Limitation): number | undefined {\n if (!limitation) {\n return undefined;\n }\n switch (limitation.type) {\n case 'MINUTES':\n return (limitation.limit ?? 0) * 60 * 1000;\n case 'SECONDS':\n return (limitation.limit ?? 0) * 1000;\n case 'TOKENS':\n default:\n return 0;\n }\n}\n\nexport class FetchPersonaChatService implements IPersonaChatService {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Api-Key ${this.apiKey}`,\n };\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await fetch(`${BASE_URL}${path}`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new HttpError(\n response.status,\n `Request failed: ${response.status} ${text}`,\n parseJson(text),\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-voice-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-interactive-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async endInteractiveConversation(\n params: EndConversationParams,\n ): Promise<void> {\n const { chatId, conversationId, namespace } = params;\n\n await this.post(\n `/_api/persona-chat-service/v1/chats/${chatId}/end-interactive-conversation`,\n { namespace, interactiveConversationId: conversationId },\n ).catch(() => {\n // best-effort\n });\n }\n\n async sendChatMessage(\n params: SendMessageParams,\n ): Promise<{ functionCalls?: FunctionCall[]; messages?: ChatMessage[] }> {\n const {\n chatId,\n namespace,\n message,\n functionCallResults,\n chatConfig,\n attachments,\n } = params;\n\n return this.post<{\n functionCalls?: FunctionCall[];\n messages?: ChatMessage[];\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages`, {\n namespace,\n message,\n ...(functionCallResults ? { functionCallResults } : {}),\n ...(chatConfig ? { chatConfig } : {}),\n ...(attachments ? { attachments } : {}),\n });\n }\n\n async queryChatMessages(\n params: QueryMessagesParams,\n ): Promise<QueryMessagesResult> {\n const { chatId, namespace, limit = 100, cursor } = params;\n\n const data = await this.post<{\n chatMessages?: {\n id: string;\n content: string;\n role: string;\n createdAt?: string;\n }[];\n pagingMetadata?: { cursors?: { next?: string } };\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages/query`, {\n namespace,\n query: { cursorPaging: { limit, ...(cursor ? { cursor } : {}) } },\n });\n\n return {\n messages: (data.chatMessages ?? []).map((m) => ({\n id: m.id,\n content: m.content,\n role: m.role as 'USER' | 'ASSISTANT',\n createdAt: m.createdAt,\n })),\n nextCursor: data.pagingMetadata?.cursors?.next,\n };\n }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/objectWithoutPropertiesLoose";
2
- const _excluded = ["className", "style", "width", "height", "pip", "onPiPEnter", "onPiPExit", "onPiPError"];
2
+ const _excluded = ["className", "style", "width", "height", "pip", "pipFallback", "onPiPEnter", "onPiPExit", "onPiPError"];
3
3
  import React, { useEffect, useRef, useState } from 'react';
4
4
  import { chromaKey } from './chroma-key';
5
5
  import { pipActiveAtom, usePictureInPictureAuto } from '../../hooks/usePictureInPicture';
@@ -24,6 +24,7 @@ export function ChromaKey(props) {
24
24
  width = _children$props.width,
25
25
  height = _children$props.height,
26
26
  pip = _children$props.pip,
27
+ pipFallback = _children$props.pipFallback,
27
28
  onPiPEnter = _children$props.onPiPEnter,
28
29
  onPiPExit = _children$props.onPiPExit,
29
30
  onPiPError = _children$props.onPiPError,
@@ -31,13 +32,18 @@ export function ChromaKey(props) {
31
32
  const _useState = useState(false),
32
33
  isPlayable = _useState[0],
33
34
  setIsPlayable = _useState[1];
35
+ const _useState2 = useState(null),
36
+ isWebGLAvailable = _useState2[0],
37
+ setIsWebGLAvailable = _useState2[1];
34
38
  const $video = useRef(null);
35
39
  const $canvas = useRef(null);
36
40
  const isPiPActive = useAtomValue(pipActiveAtom);
41
+ const useVideoFallback = isWebGLAvailable === false;
42
+ const pipElement = isWebGLAvailable === null ? null : useVideoFallback ? $video.current : $canvas.current;
37
43
 
38
44
  // Setup PiP - hook handles canvas → video conversion internally
39
45
  usePictureInPictureAuto({
40
- element: pip && isPlayable ? $canvas.current : null,
46
+ element: pip && isPlayable ? pipElement : null,
41
47
  onEnter: onPiPEnter,
42
48
  onExit: onPiPExit,
43
49
  onError: onPiPError
@@ -55,6 +61,10 @@ export function ChromaKey(props) {
55
61
  smoothness,
56
62
  background
57
63
  });
64
+ setIsWebGLAvailable(process !== null);
65
+ if (!process) {
66
+ return;
67
+ }
58
68
  debug && console.log('Chroma key initialized', $video.current, $canvas.current, {
59
69
  color,
60
70
  spill,
@@ -89,7 +99,7 @@ export function ChromaKey(props) {
89
99
  style: {
90
100
  width: '100%',
91
101
  height: '100%',
92
- display: showPipFallback ? 'none' : 'block',
102
+ display: useVideoFallback || showPipFallback ? 'none' : 'block',
93
103
  ...(isPlayable ? {} : {
94
104
  position: 'absolute',
95
105
  opacity: 0,
@@ -98,10 +108,21 @@ export function ChromaKey(props) {
98
108
  zIndex: -1
99
109
  })
100
110
  }
101
- }), !isPlayable && fallback, /*#__PURE__*/React.cloneElement(children, {
111
+ }), !isPlayable && fallback, showPipFallback && pipFallback, /*#__PURE__*/React.cloneElement(children, {
102
112
  ...restVideoProps,
113
+ // cloneElement retains original props; only ChromaKey should own PiP.
114
+ pip: false,
115
+ pipFallback: undefined,
116
+ onPiPEnter: undefined,
117
+ onPiPExit: undefined,
118
+ onPiPError: undefined,
103
119
  ref: $video,
104
- style: {
120
+ style: useVideoFallback ? {
121
+ width: '100%',
122
+ height: '100%',
123
+ ...style,
124
+ display: isPlayable && !showPipFallback ? style == null ? void 0 : style.display : 'none'
125
+ } : {
105
126
  display: 'none'
106
127
  },
107
128
  onCanPlay: checkPlayable,
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useRef","useState","chromaKey","pipActiveAtom","usePictureInPictureAuto","useAtomValue","ChromaKey","props","_props$debug","debug","children","_props$color","color","_props$spill","spill","_props$smoothness","smoothness","_props$similarity","similarity","fallback","background","_children$props","className","style","width","height","pip","onPiPEnter","onPiPExit","onPiPError","restVideoProps","_objectWithoutPropertiesLoose","_excluded","_useState","isPlayable","setIsPlayable","$video","$canvas","isPiPActive","element","current","onEnter","onExit","onError","showPipFallback","console","warn","process","log","rafId","isActive","loop","requestAnimationFrame","cancelAnimationFrame","createElement","ref","display","position","opacity","pointerEvents","visibility","zIndex","cloneElement","onCanPlay","checkPlayable","onLoadedMetadata","event","readyState","currentTarget","HTMLMediaElement","HAVE_FUTURE_DATA"],"sources":["../../../../src/components/ChromaKey/ChromaKey.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport { chromaKey } from './chroma-key';\nimport {\n pipActiveAtom,\n usePictureInPictureAuto,\n} from '../../hooks/usePictureInPicture';\nimport { useAtomValue } from 'jotai';\n\ninterface ChromaKeyProps extends React.HTMLAttributes<HTMLCanvasElement> {\n debug?: boolean;\n color?: string;\n spill?: number;\n similarity?: number;\n smoothness?: number;\n fallback?: React.ReactNode;\n background?: string | null;\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref?: React.Ref<HTMLVideoElement>;\n pip?: boolean;\n onPiPEnter?: () => void;\n onPiPExit?: () => void;\n onPiPError?: (error: Error) => void;\n }\n >;\n}\n\nexport function ChromaKey(props: ChromaKeyProps) {\n const {\n debug = false,\n children,\n color = '#03ff9c',\n spill = 0.1,\n smoothness = 0.15,\n similarity = 0.3,\n fallback,\n background,\n } = props;\n\n const {\n className,\n style,\n width,\n height,\n pip,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n ...restVideoProps\n } = children.props;\n const [isPlayable, setIsPlayable] = useState(false);\n\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n const isPiPActive = useAtomValue(pipActiveAtom);\n\n // Setup PiP - hook handles canvas → video conversion internally\n usePictureInPictureAuto({\n element: pip && isPlayable ? $canvas.current : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n if (!$video.current || !$canvas.current || !isPlayable) {\n debug && console.warn('Video or canvas is not initialized');\n\n return;\n }\n\n const process = chromaKey($video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n background,\n });\n\n debug &&\n console.log('Chroma key initialized', $video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n });\n\n let rafId: number;\n let isActive = true;\n\n function loop() {\n if (!isActive) {\n return;\n }\n process?.();\n rafId = requestAnimationFrame(loop);\n }\n\n rafId = requestAnimationFrame(loop);\n\n return () => {\n debug && console.log('Chroma key process cleanup');\n isActive = false;\n cancelAnimationFrame(rafId);\n };\n }, [color, spill, similarity, smoothness, isPlayable, debug, background]);\n\n return (\n <div\n className={className}\n style={{\n ...style,\n width,\n height,\n }}\n >\n <canvas\n ref={$canvas}\n style={{\n width: '100%',\n height: '100%',\n display: showPipFallback ? 'none' : 'block',\n ...(isPlayable\n ? {}\n : {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n zIndex: -1,\n }),\n }}\n />\n {!isPlayable && fallback}\n\n {React.cloneElement(children, {\n ...restVideoProps,\n ref: $video,\n style: { display: 'none' },\n onCanPlay: checkPlayable,\n onLoadedMetadata: checkPlayable,\n })}\n </div>\n );\n\n function checkPlayable(event: React.SyntheticEvent<HTMLVideoElement>) {\n const readyState = event.currentTarget.readyState;\n\n setIsPlayable(readyState >= HTMLMediaElement.HAVE_FUTURE_DATA);\n }\n}\n"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAE1D,SAASC,SAAS,QAAQ,cAAc;AACxC,SACEC,aAAa,EACbC,uBAAuB,QAClB,iCAAiC;AACxC,SAASC,YAAY,QAAQ,OAAO;AAqBpC,OAAO,SAASC,SAASA,CAACC,KAAqB,EAAE;EAC/C,MAAAC,YAAA,GASID,KAAK,CARPE,KAAK;IAALA,KAAK,GAAAD,YAAA,cAAG,KAAK,GAAAA,YAAA;IACbE,QAAQ,GAONH,KAAK,CAPPG,QAAQ;IAAAC,YAAA,GAONJ,KAAK,CANPK,KAAK;IAALA,KAAK,GAAAD,YAAA,cAAG,SAAS,GAAAA,YAAA;IAAAE,YAAA,GAMfN,KAAK,CALPO,KAAK;IAALA,KAAK,GAAAD,YAAA,cAAG,GAAG,GAAAA,YAAA;IAAAE,iBAAA,GAKTR,KAAK,CAJPS,UAAU;IAAVA,UAAU,GAAAD,iBAAA,cAAG,IAAI,GAAAA,iBAAA;IAAAE,iBAAA,GAIfV,KAAK,CAHPW,UAAU;IAAVA,UAAU,GAAAD,iBAAA,cAAG,GAAG,GAAAA,iBAAA;IAChBE,QAAQ,GAENZ,KAAK,CAFPY,QAAQ;IACRC,UAAU,GACRb,KAAK,CADPa,UAAU;EAGZ,MAAAC,eAAA,GAUIX,QAAQ,CAACH,KAAK;IAThBe,SAAS,GAAAD,eAAA,CAATC,SAAS;IACTC,KAAK,GAAAF,eAAA,CAALE,KAAK;IACLC,KAAK,GAAAH,eAAA,CAALG,KAAK;IACLC,MAAM,GAAAJ,eAAA,CAANI,MAAM;IACNC,GAAG,GAAAL,eAAA,CAAHK,GAAG;IACHC,UAAU,GAAAN,eAAA,CAAVM,UAAU;IACVC,SAAS,GAAAP,eAAA,CAATO,SAAS;IACTC,UAAU,GAAAR,eAAA,CAAVQ,UAAU;IACPC,cAAc,GAAAC,6BAAA,CAAAV,eAAA,EAAAW,SAAA;EAEnB,MAAAC,SAAA,GAAoChC,QAAQ,CAAC,KAAK,CAAC;IAA5CiC,UAAU,GAAAD,SAAA;IAAEE,aAAa,GAAAF,SAAA;EAEhC,MAAMG,MAAM,GAAGpC,MAAM,CAAmB,IAAI,CAAC;EAC7C,MAAMqC,OAAO,GAAGrC,MAAM,CAAoB,IAAI,CAAC;EAC/C,MAAMsC,WAAW,GAAGjC,YAAY,CAACF,aAAa,CAAC;;EAE/C;EACAC,uBAAuB,CAAC;IACtBmC,OAAO,EAAEb,GAAG,IAAIQ,UAAU,GAAGG,OAAO,CAACG,OAAO,GAAG,IAAI;IACnDC,OAAO,EAAEd,UAAU;IACnBe,MAAM,EAAEd,SAAS;IACjBe,OAAO,EAAEd;EACX,CAAC,CAAC;EAEF,MAAMe,eAAe,GAAGlB,GAAG,IAAIY,WAAW;EAE1CvC,SAAS,CAAC,MAAM;IACd,IAAI,CAACqC,MAAM,CAACI,OAAO,IAAI,CAACH,OAAO,CAACG,OAAO,IAAI,CAACN,UAAU,EAAE;MACtDzB,KAAK,IAAIoC,OAAO,CAACC,IAAI,CAAC,oCAAoC,CAAC;MAE3D;IACF;IAEA,MAAMC,OAAO,GAAG7C,SAAS,CAACkC,MAAM,CAACI,OAAO,EAAEH,OAAO,CAACG,OAAO,EAAE;MACzD5B,KAAK;MACLE,KAAK;MACLI,UAAU;MACVF,UAAU;MACVI;IACF,CAAC,CAAC;IAEFX,KAAK,IACHoC,OAAO,CAACG,GAAG,CAAC,wBAAwB,EAAEZ,MAAM,CAACI,OAAO,EAAEH,OAAO,CAACG,OAAO,EAAE;MACrE5B,KAAK;MACLE,KAAK;MACLI,UAAU;MACVF;IACF,CAAC,CAAC;IAEJ,IAAIiC,KAAa;IACjB,IAAIC,QAAQ,GAAG,IAAI;IAEnB,SAASC,IAAIA,CAAA,EAAG;MACd,IAAI,CAACD,QAAQ,EAAE;QACb;MACF;MACAH,OAAO,YAAPA,OAAO,CAAG,CAAC;MACXE,KAAK,GAAGG,qBAAqB,CAACD,IAAI,CAAC;IACrC;IAEAF,KAAK,GAAGG,qBAAqB,CAACD,IAAI,CAAC;IAEnC,OAAO,MAAM;MACX1C,KAAK,IAAIoC,OAAO,CAACG,GAAG,CAAC,4BAA4B,CAAC;MAClDE,QAAQ,GAAG,KAAK;MAChBG,oBAAoB,CAACJ,KAAK,CAAC;IAC7B,CAAC;EACH,CAAC,EAAE,CAACrC,KAAK,EAAEE,KAAK,EAAEI,UAAU,EAAEF,UAAU,EAAEkB,UAAU,EAAEzB,KAAK,EAAEW,UAAU,CAAC,CAAC;EAEzE,oBACEtB,KAAA,CAAAwD,aAAA;IACEhC,SAAS,EAAEA,SAAU;IACrBC,KAAK,EAAE;MACL,GAAGA,KAAK;MACRC,KAAK;MACLC;IACF;EAAE,gBAEF3B,KAAA,CAAAwD,aAAA;IACEC,GAAG,EAAElB,OAAQ;IACbd,KAAK,EAAE;MACLC,KAAK,EAAE,MAAM;MACbC,MAAM,EAAE,MAAM;MACd+B,OAAO,EAAEZ,eAAe,GAAG,MAAM,GAAG,OAAO;MAC3C,IAAIV,UAAU,GACV,CAAC,CAAC,GACF;QACEuB,QAAQ,EAAE,UAAU;QACpBC,OAAO,EAAE,CAAC;QACVC,aAAa,EAAE,MAAM;QACrBC,UAAU,EAAE,QAAQ;QACpBC,MAAM,EAAE,CAAC;MACX,CAAC;IACP;EAAE,CACH,CAAC,EACD,CAAC3B,UAAU,IAAIf,QAAQ,eAEvBrB,KAAK,CAACgE,YAAY,CAACpD,QAAQ,EAAE;IAC5B,GAAGoB,cAAc;IACjByB,GAAG,EAAEnB,MAAM;IACXb,KAAK,EAAE;MAAEiC,OAAO,EAAE;IAAO,CAAC;IAC1BO,SAAS,EAAEC,aAAa;IACxBC,gBAAgB,EAAED;EACpB,CAAC,CACE,CAAC;EAGR,SAASA,aAAaA,CAACE,KAA6C,EAAE;IACpE,MAAMC,UAAU,GAAGD,KAAK,CAACE,aAAa,CAACD,UAAU;IAEjDhC,aAAa,CAACgC,UAAU,IAAIE,gBAAgB,CAACC,gBAAgB,CAAC;EAChE;AACF","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useRef","useState","chromaKey","pipActiveAtom","usePictureInPictureAuto","useAtomValue","ChromaKey","props","_props$debug","debug","children","_props$color","color","_props$spill","spill","_props$smoothness","smoothness","_props$similarity","similarity","fallback","background","_children$props","className","style","width","height","pip","pipFallback","onPiPEnter","onPiPExit","onPiPError","restVideoProps","_objectWithoutPropertiesLoose","_excluded","_useState","isPlayable","setIsPlayable","_useState2","isWebGLAvailable","setIsWebGLAvailable","$video","$canvas","isPiPActive","useVideoFallback","pipElement","current","element","onEnter","onExit","onError","showPipFallback","console","warn","process","log","rafId","isActive","loop","requestAnimationFrame","cancelAnimationFrame","createElement","ref","display","position","opacity","pointerEvents","visibility","zIndex","cloneElement","undefined","onCanPlay","checkPlayable","onLoadedMetadata","event","readyState","currentTarget","HTMLMediaElement","HAVE_FUTURE_DATA"],"sources":["../../../../src/components/ChromaKey/ChromaKey.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\n\nimport { chromaKey } from './chroma-key';\nimport {\n pipActiveAtom,\n usePictureInPictureAuto,\n} from '../../hooks/usePictureInPicture';\nimport { useAtomValue } from 'jotai';\n\ninterface ChromaKeyProps extends React.HTMLAttributes<HTMLCanvasElement> {\n debug?: boolean;\n color?: string;\n spill?: number;\n similarity?: number;\n smoothness?: number;\n fallback?: React.ReactNode;\n background?: string | null;\n children: React.ReactElement<\n React.VideoHTMLAttributes<HTMLVideoElement> & {\n ref?: React.Ref<HTMLVideoElement>;\n pip?: boolean;\n pipFallback?: React.ReactNode;\n onPiPEnter?: () => void;\n onPiPExit?: () => void;\n onPiPError?: (error: Error) => void;\n }\n >;\n}\n\nexport function ChromaKey(props: ChromaKeyProps) {\n const {\n debug = false,\n children,\n color = '#03ff9c',\n spill = 0.1,\n smoothness = 0.15,\n similarity = 0.3,\n fallback,\n background,\n } = props;\n\n const {\n className,\n style,\n width,\n height,\n pip,\n pipFallback,\n onPiPEnter,\n onPiPExit,\n onPiPError,\n ...restVideoProps\n } = children.props;\n const [isPlayable, setIsPlayable] = useState(false);\n const [isWebGLAvailable, setIsWebGLAvailable] = useState<boolean | null>(\n null,\n );\n\n const $video = useRef<HTMLVideoElement>(null);\n const $canvas = useRef<HTMLCanvasElement>(null);\n const isPiPActive = useAtomValue(pipActiveAtom);\n const useVideoFallback = isWebGLAvailable === false;\n const pipElement =\n isWebGLAvailable === null\n ? null\n : useVideoFallback\n ? $video.current\n : $canvas.current;\n\n // Setup PiP - hook handles canvas → video conversion internally\n usePictureInPictureAuto({\n element: pip && isPlayable ? pipElement : null,\n onEnter: onPiPEnter,\n onExit: onPiPExit,\n onError: onPiPError,\n });\n\n const showPipFallback = pip && isPiPActive;\n\n useEffect(() => {\n if (!$video.current || !$canvas.current || !isPlayable) {\n debug && console.warn('Video or canvas is not initialized');\n\n return;\n }\n\n const process = chromaKey($video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n background,\n });\n setIsWebGLAvailable(process !== null);\n if (!process) {\n return;\n }\n\n debug &&\n console.log('Chroma key initialized', $video.current, $canvas.current, {\n color,\n spill,\n similarity,\n smoothness,\n });\n\n let rafId: number;\n let isActive = true;\n\n function loop() {\n if (!isActive) {\n return;\n }\n process?.();\n rafId = requestAnimationFrame(loop);\n }\n\n rafId = requestAnimationFrame(loop);\n\n return () => {\n debug && console.log('Chroma key process cleanup');\n isActive = false;\n cancelAnimationFrame(rafId);\n };\n }, [color, spill, similarity, smoothness, isPlayable, debug, background]);\n\n return (\n <div\n className={className}\n style={{\n ...style,\n width,\n height,\n }}\n >\n <canvas\n ref={$canvas}\n style={{\n width: '100%',\n height: '100%',\n display: useVideoFallback || showPipFallback ? 'none' : 'block',\n ...(isPlayable\n ? {}\n : {\n position: 'absolute',\n opacity: 0,\n pointerEvents: 'none',\n visibility: 'hidden',\n zIndex: -1,\n }),\n }}\n />\n {!isPlayable && fallback}\n {showPipFallback && pipFallback}\n\n {React.cloneElement(children, {\n ...restVideoProps,\n // cloneElement retains original props; only ChromaKey should own PiP.\n pip: false,\n pipFallback: undefined,\n onPiPEnter: undefined,\n onPiPExit: undefined,\n onPiPError: undefined,\n ref: $video,\n style: useVideoFallback\n ? {\n width: '100%',\n height: '100%',\n ...style,\n display: isPlayable && !showPipFallback ? style?.display : 'none',\n }\n : { display: 'none' },\n onCanPlay: checkPlayable,\n onLoadedMetadata: checkPlayable,\n })}\n </div>\n );\n\n function checkPlayable(event: React.SyntheticEvent<HTMLVideoElement>) {\n const readyState = event.currentTarget.readyState;\n\n setIsPlayable(readyState >= HTMLMediaElement.HAVE_FUTURE_DATA);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -6,7 +6,9 @@ export function chromaKey($video, $canvas, options) {
6
6
  premultipliedAlpha: false,
7
7
  preserveDrawingBuffer: true
8
8
  });
9
- invariant(gl, 'WebGL context is not initialized');
9
+ if (!gl) {
10
+ return null;
11
+ }
10
12
  const BUFFER = gl.createBuffer();
11
13
  const TEXTURE = gl.createTexture();
12
14
  const program = gl.createProgram();
@@ -1 +1 @@
1
- {"version":3,"names":["invariant","shaders","chromaKey","$video","$canvas","options","gl","getContext","alpha","premultipliedAlpha","preserveDrawingBuffer","BUFFER","createBuffer","TEXTURE","createTexture","program","createProgram","_VS_","createShader","VERTEX_SHADER","_FS_","FRAGMENT_SHADER","shaderSource","VertexAlign","ChromaKey","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","attachShader","linkProgram","useProgram","bindTexture","TEXTURE_2D","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","texParameteri","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","$coords$","getAttribLocation","$texture$","getUniformLocation","$width$","$height$","$color$","$similarity$","$smoothness$","$spill$","vertexAttribPointer","FLOAT","enableVertexAttribArray","activeTexture","TEXTURE0","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","process","color","spill","similarity","smoothness","background","videoWidth","videoHeight","width","window","devicePixelRatio","height","viewport","r","parseInt","substring","g","b","clearColor","clear","COLOR_BUFFER_BIT","uniform1i","uniform1f","uniform3f","substr","texImage2D","RGB","UNSIGNED_BYTE","drawArrays","TRIANGLE_FAN"],"sources":["../../../../src/components/ChromaKey/chroma-key.ts"],"sourcesContent":["import invariant from 'invariant';\n\nimport * as shaders from './shaders';\n\nexport type ProcessCallback = () => void;\n\nexport function chromaKey(\n $video: HTMLVideoElement,\n $canvas: HTMLCanvasElement,\n options: {\n color: string;\n spill: number;\n similarity: number;\n smoothness: number;\n background?: string | null;\n },\n): ProcessCallback {\n const gl = $canvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n\n invariant(gl, 'WebGL context is not initialized');\n\n const BUFFER = gl.createBuffer();\n const TEXTURE = gl.createTexture();\n const program = gl.createProgram();\n const _VS_ = gl.createShader(gl.VERTEX_SHADER);\n const _FS_ = gl.createShader(gl.FRAGMENT_SHADER);\n\n invariant(program, 'Program is not initialized');\n invariant(_VS_, 'Vertex shader is not initialized');\n invariant(_FS_, 'Fragment shader is not initialized');\n\n gl.shaderSource(_VS_, shaders.VertexAlign);\n gl.shaderSource(_FS_, shaders.ChromaKey);\n\n gl.compileShader(_VS_);\n gl.compileShader(_FS_);\n\n if (!gl.getShaderParameter(_FS_, gl.COMPILE_STATUS)) {\n console.error(\n 'Fragment shader compilation failed',\n gl.getShaderInfoLog(_FS_),\n );\n }\n\n gl.attachShader(program, _VS_);\n gl.attachShader(program, _FS_);\n\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.bindTexture(gl.TEXTURE_2D, TEXTURE);\n gl.bindBuffer(gl.ARRAY_BUFFER, BUFFER);\n\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const $coords$ = gl.getAttribLocation(program, 'coords');\n const $texture$ = gl.getUniformLocation(program, 'tex');\n const $width$ = gl.getUniformLocation(program, 'texWidth');\n const $height$ = gl.getUniformLocation(program, 'texHeight');\n const $color$ = gl.getUniformLocation(program, 'keyColor');\n const $similarity$ = gl.getUniformLocation(program, 'similarity');\n const $smoothness$ = gl.getUniformLocation(program, 'smoothness');\n const $spill$ = gl.getUniformLocation(program, 'spill');\n\n gl.vertexAttribPointer($coords$, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray($coords$);\n\n gl.activeTexture(gl.TEXTURE0);\n\n // Enable blending for transparency (critical for Safari)\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n return function process() {\n const { color, spill, similarity, smoothness, background } = options;\n\n // Use video dimensions directly instead of metadata (for Safari compatibility)\n const videoWidth = $video.videoWidth;\n const videoHeight = $video.videoHeight;\n\n if (!videoWidth || !videoHeight) {\n return; // Video not ready yet\n }\n\n const width = videoWidth * window.devicePixelRatio;\n const height = videoHeight * window.devicePixelRatio;\n\n $canvas.width = width;\n $canvas.height = height;\n\n gl.viewport(0, 0, width, height);\n\n // Clear with background color or transparent\n if (background) {\n const r = parseInt(background.substring(1, 3), 16) / 255;\n const g = parseInt(background.substring(3, 5), 16) / 255;\n const b = parseInt(background.substring(5, 7), 16) / 255;\n gl.clearColor(r, g, b, 1);\n } else {\n gl.clearColor(0, 0, 0, 0);\n }\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n\n gl.uniform1i($texture$, 0);\n gl.uniform1f($width$, width);\n gl.uniform1f($height$, height);\n gl.uniform1f($spill$, spill);\n gl.uniform1f($similarity$, similarity);\n gl.uniform1f($smoothness$, smoothness);\n gl.uniform3f(\n $color$,\n parseInt(color.substr(1, 2), 16) / 255,\n parseInt(color.substr(3, 2), 16) / 255,\n parseInt(color.substr(5, 2), 16) / 255,\n );\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["invariant","shaders","chromaKey","$video","$canvas","options","gl","getContext","alpha","premultipliedAlpha","preserveDrawingBuffer","BUFFER","createBuffer","TEXTURE","createTexture","program","createProgram","_VS_","createShader","VERTEX_SHADER","_FS_","FRAGMENT_SHADER","shaderSource","VertexAlign","ChromaKey","compileShader","getShaderParameter","COMPILE_STATUS","console","error","getShaderInfoLog","attachShader","linkProgram","useProgram","bindTexture","TEXTURE_2D","bindBuffer","ARRAY_BUFFER","bufferData","Float32Array","STATIC_DRAW","texParameteri","TEXTURE_MIN_FILTER","LINEAR","TEXTURE_WRAP_S","CLAMP_TO_EDGE","TEXTURE_WRAP_T","$coords$","getAttribLocation","$texture$","getUniformLocation","$width$","$height$","$color$","$similarity$","$smoothness$","$spill$","vertexAttribPointer","FLOAT","enableVertexAttribArray","activeTexture","TEXTURE0","enable","BLEND","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","process","color","spill","similarity","smoothness","background","videoWidth","videoHeight","width","window","devicePixelRatio","height","viewport","r","parseInt","substring","g","b","clearColor","clear","COLOR_BUFFER_BIT","uniform1i","uniform1f","uniform3f","substr","texImage2D","RGB","UNSIGNED_BYTE","drawArrays","TRIANGLE_FAN"],"sources":["../../../../src/components/ChromaKey/chroma-key.ts"],"sourcesContent":["import invariant from 'invariant';\n\nimport * as shaders from './shaders';\n\nexport type ProcessCallback = () => void;\n\nexport function chromaKey(\n $video: HTMLVideoElement,\n $canvas: HTMLCanvasElement,\n options: {\n color: string;\n spill: number;\n similarity: number;\n smoothness: number;\n background?: string | null;\n },\n): ProcessCallback | null {\n const gl = $canvas.getContext('webgl', {\n alpha: true,\n premultipliedAlpha: false,\n preserveDrawingBuffer: true,\n });\n\n if (!gl) {\n return null;\n }\n\n const BUFFER = gl.createBuffer();\n const TEXTURE = gl.createTexture();\n const program = gl.createProgram();\n const _VS_ = gl.createShader(gl.VERTEX_SHADER);\n const _FS_ = gl.createShader(gl.FRAGMENT_SHADER);\n\n invariant(program, 'Program is not initialized');\n invariant(_VS_, 'Vertex shader is not initialized');\n invariant(_FS_, 'Fragment shader is not initialized');\n\n gl.shaderSource(_VS_, shaders.VertexAlign);\n gl.shaderSource(_FS_, shaders.ChromaKey);\n\n gl.compileShader(_VS_);\n gl.compileShader(_FS_);\n\n if (!gl.getShaderParameter(_FS_, gl.COMPILE_STATUS)) {\n console.error(\n 'Fragment shader compilation failed',\n gl.getShaderInfoLog(_FS_),\n );\n }\n\n gl.attachShader(program, _VS_);\n gl.attachShader(program, _FS_);\n\n gl.linkProgram(program);\n gl.useProgram(program);\n\n gl.bindTexture(gl.TEXTURE_2D, TEXTURE);\n gl.bindBuffer(gl.ARRAY_BUFFER, BUFFER);\n\n gl.bufferData(\n gl.ARRAY_BUFFER,\n new Float32Array([-1, 1, -1, -1, 1, -1, 1, 1]),\n gl.STATIC_DRAW,\n );\n\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n const $coords$ = gl.getAttribLocation(program, 'coords');\n const $texture$ = gl.getUniformLocation(program, 'tex');\n const $width$ = gl.getUniformLocation(program, 'texWidth');\n const $height$ = gl.getUniformLocation(program, 'texHeight');\n const $color$ = gl.getUniformLocation(program, 'keyColor');\n const $similarity$ = gl.getUniformLocation(program, 'similarity');\n const $smoothness$ = gl.getUniformLocation(program, 'smoothness');\n const $spill$ = gl.getUniformLocation(program, 'spill');\n\n gl.vertexAttribPointer($coords$, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray($coords$);\n\n gl.activeTexture(gl.TEXTURE0);\n\n // Enable blending for transparency (critical for Safari)\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n return function process() {\n const { color, spill, similarity, smoothness, background } = options;\n\n // Use video dimensions directly instead of metadata (for Safari compatibility)\n const videoWidth = $video.videoWidth;\n const videoHeight = $video.videoHeight;\n\n if (!videoWidth || !videoHeight) {\n return; // Video not ready yet\n }\n\n const width = videoWidth * window.devicePixelRatio;\n const height = videoHeight * window.devicePixelRatio;\n\n $canvas.width = width;\n $canvas.height = height;\n\n gl.viewport(0, 0, width, height);\n\n // Clear with background color or transparent\n if (background) {\n const r = parseInt(background.substring(1, 3), 16) / 255;\n const g = parseInt(background.substring(3, 5), 16) / 255;\n const b = parseInt(background.substring(5, 7), 16) / 255;\n gl.clearColor(r, g, b, 1);\n } else {\n gl.clearColor(0, 0, 0, 0);\n }\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n gl.useProgram(program);\n\n gl.uniform1i($texture$, 0);\n gl.uniform1f($width$, width);\n gl.uniform1f($height$, height);\n gl.uniform1f($spill$, spill);\n gl.uniform1f($similarity$, similarity);\n gl.uniform1f($smoothness$, smoothness);\n gl.uniform3f(\n $color$,\n parseInt(color.substr(1, 2), 16) / 255,\n parseInt(color.substr(3, 2), 16) / 255,\n parseInt(color.substr(5, 2), 16) / 255,\n );\n\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGB, gl.RGB, gl.UNSIGNED_BYTE, $video);\n gl.drawArrays(gl.TRIANGLE_FAN, 0, 4);\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n | 'inactivity-timeout' // conversation ended due to inactivity\n | 'credit-exhausted' // the server ended the conversation because the Legend owner ran out of credit\n | 'conversation-limit-reached' // the server ended the conversation because the caller reached the Legend's daily conversation limit\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["../../../src/conversation/types.ts"],"sourcesContent":["export type ConversationType = 'video' | 'audio';\n\nexport type ConversationParticipantRole = 'user' | 'agent';\n\nexport type ConversationVendor =\n | 'LIVEKIT'\n | 'DAILY'\n | 'HUME'\n | 'ELEVEN_LABS'\n | 'UNKNOWN_VENDOR';\n\nexport type AgentConnectionState =\n | 'joined' // agent is connected to the conversation\n | 'joining' // agent is connecting to the conversation\n | 'left' // agent left the conversation\n | 'idle'; // agent is not connected to the conversation\n\nexport type UserConnectionState =\n | 'joined' // user is connected to the conversation\n | 'joining' // user is connecting to the conversation\n | 'idle' // user is not connected to the conversation\n | 'leaving' // user is leaving the conversation\n | 'join-error'; // failed to join the conversation\n\nexport type ActivityState = 'idle' | 'speaking' | 'listening';\n\nexport type ConversationStatus =\n // Initial state\n | 'pending' // conversation is not created yet\n // States\n | 'created' // conversation was created\n | 'destroying' // destroying the conversation\n | 'destroyed' // conversation was destroyed\n | 'exceeded' // conversation limit is exceeded\n | 'inactivity-timeout' // conversation ended due to inactivity\n | 'credit-exhausted' // the server ended the conversation because the Legend owner ran out of credit\n | 'conversation-limit-reached' // the server ended the conversation because the caller reached the Legend's daily conversation limit\n | 'plan-minutes-exhausted' // the server ended the conversation because the member used up their plan's minutes\n // Errors\n | 'voice-not-found' // failed to find a voice\n | 'initialization-error' // failed to create conversation\n | 'error'; // unknown error\n\nexport type Conversation = {\n id: string;\n url: string;\n limit?: number;\n type: ConversationType;\n};\n\nexport type ConversationTranscription = {\n message: string;\n source: ConversationParticipantRole;\n id: string;\n};\n\nexport type ConversationDevice = {\n enabled: boolean;\n deviceId: string;\n};\n\nexport type ConversationAudio = {\n // Range between `0.0` and `1.0`.\n volume: number;\n muted: boolean;\n};\n"],"mappings":"","ignoreList":[]}