@webex/internal-plugin-voicea 3.11.0-next.12 → 3.11.0-next.13

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.
@@ -13,6 +13,7 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
13
13
  private captionServiceId?;
14
14
  private announceStatus;
15
15
  private captionStatus;
16
+ private isCaptionBoxOn;
16
17
  private toggleManualCaptionStatus;
17
18
  private currentSpokenLanguage?;
18
19
  private spokenLanguages;
@@ -66,6 +67,7 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
66
67
  * @returns {boolean}
67
68
  */
68
69
  private isLLMConnected;
70
+ getIsCaptionBoxOn: () => boolean;
69
71
  /**
70
72
  * Resolves the active LLM publish transport, preferring the practice-session
71
73
  * connection only when that session is fully connected.
@@ -167,5 +169,34 @@ export declare class VoiceaChannel extends WebexPlugin implements IVoiceaChannel
167
169
  * @returns {string}
168
170
  */
169
171
  getAnnounceStatus: () => string;
172
+ /**
173
+ * update LLM sub‑channel subscriptions.
174
+ *
175
+ * sends a single `subchannelSubscriptionRequest` to LLM,
176
+ * allowing subscribe and unsubscribe subchannel.
177
+ *
178
+ * @param {string[]} options.subscribe Sub‑channels to subscribe to.
179
+ * @param {string[]} options.unsubscribe Sub‑channels to unsubscribe from.
180
+ * @returns {Promise}
181
+ */
182
+ updateSubchannelSubscriptions: ({ subscribe, unsubscribe, }?: {
183
+ subscribe?: string[];
184
+ unsubscribe?: string[];
185
+ }) => Promise<void>;
186
+ /**
187
+ * Syncs the UI caption intent and updates transcription subchannel
188
+ * subscriptions accordingly.
189
+ *
190
+ * @param {Object} [options] - Subscription options.
191
+ * @param {string[]} [options.subscribe] - Subchannels to subscribe to.
192
+ * @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.
193
+ * @param {boolean} [isCaptionBoxOn=false] - Whether captions are intended to be enabled.
194
+ *
195
+ * @returns {Promise<void>}
196
+ */
197
+ updateSubchannelSubscriptionsAndSyncCaptionState: (options?: {
198
+ subscribe?: string[];
199
+ unsubscribe?: string[];
200
+ }, isCaptionBoxOn?: boolean) => Promise<void>;
170
201
  }
171
202
  export default VoiceaChannel;
package/dist/voicea.js CHANGED
@@ -52,6 +52,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
52
52
  (0, _defineProperty2.default)(_this, "captionServiceId", void 0);
53
53
  (0, _defineProperty2.default)(_this, "announceStatus", void 0);
54
54
  (0, _defineProperty2.default)(_this, "captionStatus", void 0);
55
+ (0, _defineProperty2.default)(_this, "isCaptionBoxOn", void 0);
55
56
  (0, _defineProperty2.default)(_this, "toggleManualCaptionStatus", void 0);
56
57
  (0, _defineProperty2.default)(_this, "currentSpokenLanguage", void 0);
57
58
  (0, _defineProperty2.default)(_this, "spokenLanguages", []);
@@ -217,6 +218,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
217
218
  _this.webex.internal.llm.isConnected(_constants.LLM_PRACTICE_SESSION)
218
219
  );
219
220
  });
221
+ (0, _defineProperty2.default)(_this, "getIsCaptionBoxOn", function () {
222
+ return _this.isCaptionBoxOn;
223
+ });
220
224
  /**
221
225
  * Resolves the active LLM publish transport, preferring the practice-session
222
226
  * connection only when that session is fully connected.
@@ -228,7 +232,8 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
228
232
  var isPracticeSessionConnected = llm.isConnected(_constants.LLM_PRACTICE_SESSION);
229
233
  return {
230
234
  socket: isPracticeSessionConnected && llm.getSocket(_constants.LLM_PRACTICE_SESSION) || llm.socket,
231
- binding: isPracticeSessionConnected && llm.getBinding(_constants.LLM_PRACTICE_SESSION) || llm.getBinding()
235
+ binding: isPracticeSessionConnected && llm.getBinding(_constants.LLM_PRACTICE_SESSION) || llm.getBinding(),
236
+ datachannelUrl: isPracticeSessionConnected && llm.getDatachannelUrl(_constants.LLM_PRACTICE_SESSION) || llm.getDatachannelUrl()
232
237
  };
233
238
  });
234
239
  /**
@@ -397,6 +402,9 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
397
402
  _this.areCaptionsEnabled = true;
398
403
  _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.ENABLED;
399
404
  _this.announce();
405
+ _this.updateSubchannelSubscriptionsAndSyncCaptionState({
406
+ subscribe: ['transcription']
407
+ }, true);
400
408
  }).catch(function () {
401
409
  _this.captionStatus = _constants.TURN_ON_CAPTION_STATUS.IDLE;
402
410
  throw new Error('turn on captions fail');
@@ -566,6 +574,77 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
566
574
  (0, _defineProperty2.default)(_this, "getAnnounceStatus", function () {
567
575
  return _this.announceStatus;
568
576
  });
577
+ /**
578
+ * update LLM sub‑channel subscriptions.
579
+ *
580
+ * sends a single `subchannelSubscriptionRequest` to LLM,
581
+ * allowing subscribe and unsubscribe subchannel.
582
+ *
583
+ * @param {string[]} options.subscribe Sub‑channels to subscribe to.
584
+ * @param {string[]} options.unsubscribe Sub‑channels to unsubscribe from.
585
+ * @returns {Promise}
586
+ */
587
+ (0, _defineProperty2.default)(_this, "updateSubchannelSubscriptions", /*#__PURE__*/(0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee2() {
588
+ var _ref3,
589
+ _ref3$subscribe,
590
+ subscribe,
591
+ _ref3$unsubscribe,
592
+ unsubscribe,
593
+ isDataChannelTokenEnabled,
594
+ _this$getPublishTrans4,
595
+ socket,
596
+ datachannelUrl,
597
+ _args2 = arguments;
598
+ return _regenerator.default.wrap(function (_context2) {
599
+ while (1) switch (_context2.prev = _context2.next) {
600
+ case 0:
601
+ _ref3 = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {}, _ref3$subscribe = _ref3.subscribe, subscribe = _ref3$subscribe === void 0 ? [] : _ref3$subscribe, _ref3$unsubscribe = _ref3.unsubscribe, unsubscribe = _ref3$unsubscribe === void 0 ? [] : _ref3$unsubscribe;
602
+ _context2.next = 1;
603
+ return _this.webex.internal.llm.isDataChannelTokenEnabled();
604
+ case 1:
605
+ isDataChannelTokenEnabled = _context2.sent;
606
+ if (!(!_this.isLLMConnected() || !isDataChannelTokenEnabled)) {
607
+ _context2.next = 2;
608
+ break;
609
+ }
610
+ return _context2.abrupt("return");
611
+ case 2:
612
+ _this$getPublishTrans4 = _this.getPublishTransport(), socket = _this$getPublishTrans4.socket, datachannelUrl = _this$getPublishTrans4.datachannelUrl; // @ts-ignore
613
+ socket.send({
614
+ id: "".concat(_this.seqNum),
615
+ type: 'subchannelSubscriptionRequest',
616
+ data: {
617
+ // @ts-ignore
618
+ datachannelUri: datachannelUrl,
619
+ subscribe: subscribe,
620
+ unsubscribe: unsubscribe
621
+ },
622
+ trackingId: "".concat(_webexCore.config.trackingIdPrefix, "_").concat(_uuid.default.v4().toString())
623
+ });
624
+ _this.seqNum += 1;
625
+ case 3:
626
+ case "end":
627
+ return _context2.stop();
628
+ }
629
+ }, _callee2);
630
+ })));
631
+ /**
632
+ * Syncs the UI caption intent and updates transcription subchannel
633
+ * subscriptions accordingly.
634
+ *
635
+ * @param {Object} [options] - Subscription options.
636
+ * @param {string[]} [options.subscribe] - Subchannels to subscribe to.
637
+ * @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.
638
+ * @param {boolean} [isCaptionBoxOn=false] - Whether captions are intended to be enabled.
639
+ *
640
+ * @returns {Promise<void>}
641
+ */
642
+ (0, _defineProperty2.default)(_this, "updateSubchannelSubscriptionsAndSyncCaptionState", function () {
643
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
644
+ var isCaptionBoxOn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
645
+ _this.isCaptionBoxOn = isCaptionBoxOn;
646
+ return _this.updateSubchannelSubscriptions(options);
647
+ });
569
648
  _this.seqNum = 1;
570
649
  _this.areCaptionsEnabled = false;
571
650
  _this.captionServiceId = undefined;
@@ -602,6 +681,7 @@ var VoiceaChannel = exports.VoiceaChannel = /*#__PURE__*/function (_WebexPlugin)
602
681
  key: "deregisterEvents",
603
682
  value: function deregisterEvents() {
604
683
  this.areCaptionsEnabled = false;
684
+ this.isCaptionBoxOn = false;
605
685
  this.captionServiceId = undefined;
606
686
  // @ts-ignore
607
687
  this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
@@ -1 +1 @@
1
- {"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","VoiceaChannel","exports","_WebexPlugin","_this","_classCallCheck2","_len","args","Array","_key","concat","VOICEA","_e$headers","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","onCaptionServiceIdUpdate","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","CAPTIONER","processManualTranscription","transcriptPayload","sender","data_source","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULT","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","source","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","map","transcript","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","LANGUAGE_DETECTED","isInSpokenLanguages","spokenLanguages","includes","language","languageCode","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","_voiceaPayload$ASR$sp2","_voiceaPayload$ASR2","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","ASR","spoken_languages","currentSpokenLanguage","VOICEA_ANNOUNCEMENT","webex","internal","llm","isConnected","LLM_PRACTICE_SESSION","isPracticeSessionConnected","socket","getSocket","binding","getBinding","JOINING","listenToEvents","_this$getPublishTrans","getPublishTransport","send","recipients","route","captionServiceId","to","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageAssignment","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isLLMConnected","_this$getPublishTrans2","translationLanguage","TRANSLATION_REQUEST","currentCaptionLanguage","timeStamp","_this$getPublishTrans3","start_millis","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","catch","IDLE","Error","isAnnounceProcessed","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","toggleManualCaptionStatus","TOGGLE_MANUAL_CAPTION_STATUS","manualCaption","meetingId","serviceId","requestLanguage","DEFAULT_SPOKEN_LANGUAGE","_inherits2","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n AIBRIDGE_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n LLM_PRACTICE_SESSION,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n TOGGLE_MANUAL_CAPTION_STATUS,\n DEFAULT_SPOKEN_LANGUAGE,\n LANGUAGE_ASSIGNMENT,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private captionServiceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n private toggleManualCaptionStatus: string;\n\n private currentSpokenLanguage?: string;\n\n private spokenLanguages: string[] = [];\n\n private currentCaptionLanguage?: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:\n this.onCaptionServiceIdUpdate(e.headers.from);\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:\n case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:\n this.processManualTranscription({\n ...e.data.transcriptPayload,\n sender: e.headers?.from,\n data_source: e.data.relayType,\n });\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n // @ts-ignore\n this.webex.internal.llm.on(`event:relay.event:${LLM_PRACTICE_SESSION}`, this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.captionServiceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n // @ts-ignore\n this.webex.internal.llm.off(`event:relay.event:${LLM_PRACTICE_SESSION}`, this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = undefined;\n this.currentCaptionLanguage = undefined;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.captionServiceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = DEFAULT_SPOKEN_LANGUAGE;\n this.currentCaptionLanguage = undefined;\n }\n\n /**\n * Process manual Transcript and send alert\n * @param {TranscriptionResponse} transcriptPayload\n * @returns {void}\n */\n private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {\n if (\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT\n ) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {\n isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,\n transcriptId: transcriptPayload.id,\n transcripts: transcriptPayload.transcripts,\n sender: transcriptPayload.sender,\n source: transcriptPayload.data_source,\n });\n }\n };\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n });\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts.map((transcript) => {\n transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);\n\n return transcript;\n }),\n });\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.HIGHLIGHT_CREATED, {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: false,\n text: voiceaPayload.command_response,\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n });\n break;\n\n case TRANSCRIPTION_TYPE.LANGUAGE_DETECTED: {\n const isInSpokenLanguages = this.spokenLanguages.includes(voiceaPayload.language);\n\n if (isInSpokenLanguages) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.LANGUAGE_DETECTED, {\n languageCode: voiceaPayload.language,\n });\n }\n\n break;\n }\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {statusCode: 200});\n } else {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {\n statusCode: voiceaPayload.errorCode,\n errorMessage: voiceaPayload.message,\n });\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n currentSpokenLanguage: this.currentSpokenLanguage,\n };\n\n this.spokenLanguages = voiceaPayload?.ASR?.spoken_languages ?? [];\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\n };\n\n /**\n * Indicates whether the default or practice-session LLM connection is active.\n * @returns {boolean}\n */\n private isLLMConnected = (): boolean =>\n // @ts-ignore\n this.webex.internal.llm.isConnected() ||\n // @ts-ignore\n this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION);\n\n /**\n * Resolves the active LLM publish transport, preferring the practice-session\n * connection only when that session is fully connected.\n * @returns {Object}\n */\n private getPublishTransport = () => {\n // @ts-ignore\n const {llm} = this.webex.internal;\n const isPracticeSessionConnected = llm.isConnected(LLM_PRACTICE_SESSION);\n\n return {\n socket: (isPracticeSessionConnected && llm.getSocket(LLM_PRACTICE_SESSION)) || llm.socket,\n binding:\n (isPracticeSessionConnected && llm.getBinding(LLM_PRACTICE_SESSION)) || llm.getBinding(),\n };\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n // If captionServiceId exists, send it as the 'to' header; otherwise keep headers empty.\n headers: this.captionServiceId ? {to: this.captionServiceId} : {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @param {\"DEFAULT\" | \"AUTO\" | \"MANUAL\"} languageAssignment\n * @returns {Promise}\n */\n public setSpokenLanguage = (\n languageCode: string,\n languageAssignment?: 'DEFAULT' | 'AUTO' | 'MANUAL'\n ): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n ...(languageAssignment && {languageAssignment}),\n },\n },\n }).then(() => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n headers: {\n to: this.captionServiceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.currentCaptionLanguage = languageCode;\n\n this.seqNum += 1;\n };\n\n /**\n * Send manual closed captions to voicea service\n * @param {string} text\n * @param {number} timeStamp\n * @param {number[]} csis\n * @param {boolean} isFinal\n * @returns {void}\n */\n public sendManualClosedCaption = (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ): void => {\n if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n\n socket?.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n headers: {},\n data: {\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,\n transcriptPayload: {\n type: isFinal\n ? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT\n : TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,\n id: uuid.v4(),\n transcripts: [\n {\n text,\n start_millis: timeStamp,\n end_millis: timeStamp,\n csis,\n },\n ],\n transcript_id: uuid.v4(),\n },\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\n })\n .then(() => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTIONS_TURNED_ON);\n\n this.areCaptionsEnabled = true;\n this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * is announce processed\n * @returns {boolean}\n */\n private isAnnounceProcessed = () => this.announceStatus === ANNOUNCE_STATUS.JOINED;\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessed()) {\n return;\n }\n if (!this.isLLMConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @param {string} [spokenLanguage] - Optional Spoken language code\n * @returns {Promise}\n */\n public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {\n if (this.captionStatus === TURN_ON_CAPTION_STATUS.SENDING) return undefined;\n\n if (!this.isLLMConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions(spokenLanguage);\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {boolean} activate true means to turn on transcribing and false means to turn off\n * @param {string} spokenLanguage language code for spoken language\n * @returns {Promise}\n */\n public toggleTranscribing = (\n activate: boolean,\n spokenLanguage?: string\n ): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n transcribing: activate,\n },\n spokenLanguage,\n },\n }).then((): undefined | Promise<void> => {\n if (activate && !this.areCaptionsEnabled) {\n return this.turnOnCaptions(spokenLanguage);\n }\n\n return undefined;\n });\n };\n\n /**\n * Toggle turn on manual caption\n * @param {boolean} enable true means to turn on manual caption, false means to turn off\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {\n if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;\n\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;\n\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n manualCaption: {\n enable,\n },\n },\n })\n .then((): undefined | Promise<void> => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n\n return undefined;\n })\n .catch(() => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n throw new Error('toggle manual captions fail');\n });\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} languageCode\n * @param {string} meetingId\n * @returns {void}\n */\n public onSpokenLanguageUpdate = (languageCode: string, meetingId): void => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode, meetingId});\n this.currentSpokenLanguage = languageCode;\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} serviceId\n * @returns {void}\n */\n public onCaptionServiceIdUpdate = (serviceId: string): void => {\n if (!serviceId) {\n return;\n }\n if (this.captionServiceId !== serviceId) {\n this.captionServiceId = serviceId;\n // if service id value has changed and the translation language has been set, client needs to resend the translator language message to the LLM.\n if (this.currentCaptionLanguage) {\n this.requestLanguage(this.currentCaptionLanguage);\n }\n }\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n}\n\nexport default VoiceaChannel;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_uuid","_interopRequireDefault","require","_webexCore","_constants","_utils","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","VoiceaChannel","exports","_WebexPlugin","_this","_classCallCheck2","_len","args","Array","_key","concat","VOICEA","_e$headers","seqNum","sequenceNumber","data","relayType","AIBRIDGE_RELAY_TYPES","ANNOUNCEMENT","onCaptionServiceIdUpdate","headers","from","announceStatus","ANNOUNCE_STATUS","JOINED","processAnnouncementMessage","voiceaPayload","TRANSLATION_RESPONSE","processCaptionLanguageResponse","TRANSCRIPTION","processTranscription","MANUAL","CAPTIONER","processManualTranscription","transcriptPayload","sender","data_source","type","TRANSCRIPTION_TYPE","MANUAL_CAPTION_FINAL_RESULT","MANUAL_CAPTION_INTERIM_RESULT","trigger","EVENT_TRIGGERS","NEW_MANUAL_CAPTION","isFinal","transcriptId","id","transcripts","source","TRANSCRIPT_INTERIM_RESULTS","NEW_CAPTION","transcript_id","TRANSCRIPT_FINAL_RESULT","map","transcript","timestamp","millisToMinutesAndSeconds","end_millis","HIGHLIGHT_CREATED","csis","highlight","highlightId","highlight_id","text","highlightLabel","highlight_label","highlightSource","highlight_source","EVA_THANKS","EVA_COMMAND","isListening","command_response","EVA_WAKE","EVA_CANCEL","LANGUAGE_DETECTED","isInSpokenLanguages","spokenLanguages","includes","language","languageCode","statusCode","CAPTION_LANGUAGE_UPDATE","errorCode","errorMessage","message","_voiceaPayload$transl","_voiceaPayload$transl2","_voiceaPayload$transl3","_voiceaPayload$transl4","_voiceaPayload$ASR$sp","_voiceaPayload$ASR","_voiceaPayload$ASR$sp2","_voiceaPayload$ASR2","voiceaLanguageOptions","captionLanguages","translation","allowed_languages","maxLanguages","max_languages","ASR","spoken_languages","currentSpokenLanguage","VOICEA_ANNOUNCEMENT","webex","internal","llm","isConnected","LLM_PRACTICE_SESSION","isCaptionBoxOn","isPracticeSessionConnected","socket","getSocket","binding","getBinding","datachannelUrl","getDatachannelUrl","JOINING","listenToEvents","_this$getPublishTrans","getPublishTransport","send","recipients","route","captionServiceId","to","clientPayload","version","eventType","CLIENT_ANNOUNCEMENT","trackingId","config","trackingIdPrefix","uuid","v4","toString","languageAssignment","request","method","url","getLocusUrl","body","transcribe","spokenLanguage","then","SPOKEN_LANGUAGE_UPDATE","isLLMConnected","_this$getPublishTrans2","translationLanguage","TRANSLATION_REQUEST","currentCaptionLanguage","timeStamp","_this$getPublishTrans3","start_millis","captionStatus","TURN_ON_CAPTION_STATUS","SENDING","caption","CAPTIONS_TURNED_ON","areCaptionsEnabled","ENABLED","announce","updateSubchannelSubscriptionsAndSyncCaptionState","subscribe","catch","IDLE","Error","isAnnounceProcessed","sendAnnouncement","_ref","_asyncToGenerator2","_regenerator","mark","_callee","wrap","_context","prev","next","abrupt","undefined","requestTurnOnCaptions","stop","_x","activate","transcribing","turnOnCaptions","enable","toggleManualCaptionStatus","TOGGLE_MANUAL_CAPTION_STATUS","manualCaption","meetingId","serviceId","requestLanguage","_callee2","_ref3","_ref3$subscribe","_ref3$unsubscribe","unsubscribe","isDataChannelTokenEnabled","_this$getPublishTrans4","_args2","_context2","sent","datachannelUri","options","updateSubchannelSubscriptions","DEFAULT_SPOKEN_LANGUAGE","_inherits2","_createClass2","key","value","hasSubscribedToEvents","on","eventProcessor","deregisterEvents","off","WebexPlugin","_default"],"sources":["voicea.ts"],"sourcesContent":["import uuid from 'uuid';\nimport {WebexPlugin, config} from '@webex/webex-core';\n\nimport {\n EVENT_TRIGGERS,\n AIBRIDGE_RELAY_TYPES,\n TRANSCRIPTION_TYPE,\n VOICEA,\n LLM_PRACTICE_SESSION,\n ANNOUNCE_STATUS,\n TURN_ON_CAPTION_STATUS,\n TOGGLE_MANUAL_CAPTION_STATUS,\n DEFAULT_SPOKEN_LANGUAGE,\n LANGUAGE_ASSIGNMENT,\n} from './constants';\n// eslint-disable-next-line no-unused-vars\nimport {\n AnnouncementPayload,\n CaptionLanguageResponse,\n TranscriptionResponse,\n IVoiceaChannel,\n} from './voicea.types';\nimport {millisToMinutesAndSeconds} from './utils';\n\n/**\n * @description VoiceaChannel to hold single instance of LLM\n * @export\n * @class VoiceaChannel\n */\nexport class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {\n namespace = VOICEA;\n\n private seqNum: number;\n\n private areCaptionsEnabled: boolean;\n\n private hasSubscribedToEvents = false;\n\n private captionServiceId?: string;\n\n private announceStatus: string;\n\n private captionStatus: string;\n\n private isCaptionBoxOn: boolean;\n\n private toggleManualCaptionStatus: string;\n\n private currentSpokenLanguage?: string;\n\n private spokenLanguages: string[] = [];\n\n private currentCaptionLanguage?: string;\n\n /**\n * @param {Object} e\n * @returns {undefined}\n */\n\n private eventProcessor = (e) => {\n this.seqNum = e.sequenceNumber + 1;\n switch (e.data.relayType) {\n case AIBRIDGE_RELAY_TYPES.VOICEA.ANNOUNCEMENT:\n this.onCaptionServiceIdUpdate(e.headers.from);\n this.announceStatus = ANNOUNCE_STATUS.JOINED;\n this.processAnnouncementMessage(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_RESPONSE:\n this.processCaptionLanguageResponse(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.VOICEA.TRANSCRIPTION:\n this.processTranscription(e.data.voiceaPayload);\n break;\n case AIBRIDGE_RELAY_TYPES.MANUAL.TRANSCRIPTION:\n case AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER:\n this.processManualTranscription({\n ...e.data.transcriptPayload,\n sender: e.headers?.from,\n data_source: e.data.relayType,\n });\n break;\n default:\n break;\n }\n };\n\n /**\n * Listen to websocket messages\n * @returns {undefined}\n */\n private listenToEvents() {\n if (!this.hasSubscribedToEvents) {\n // @ts-ignore\n this.webex.internal.llm.on('event:relay.event', this.eventProcessor);\n // @ts-ignore\n this.webex.internal.llm.on(`event:relay.event:${LLM_PRACTICE_SESSION}`, this.eventProcessor);\n this.hasSubscribedToEvents = true;\n }\n }\n\n /**\n * Listen to websocket messages\n * @returns {void}\n */\n public deregisterEvents() {\n this.areCaptionsEnabled = false;\n this.isCaptionBoxOn = false;\n this.captionServiceId = undefined;\n // @ts-ignore\n this.webex.internal.llm.off('event:relay.event', this.eventProcessor);\n // @ts-ignore\n this.webex.internal.llm.off(`event:relay.event:${LLM_PRACTICE_SESSION}`, this.eventProcessor);\n this.hasSubscribedToEvents = false;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = undefined;\n this.currentCaptionLanguage = undefined;\n }\n\n /**\n * Initializes Voicea plugin\n * @param {any} args\n */\n constructor(...args) {\n super(...args);\n this.seqNum = 1;\n this.areCaptionsEnabled = false;\n this.captionServiceId = undefined;\n this.announceStatus = ANNOUNCE_STATUS.IDLE;\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n this.currentSpokenLanguage = DEFAULT_SPOKEN_LANGUAGE;\n this.currentCaptionLanguage = undefined;\n }\n\n /**\n * Process manual Transcript and send alert\n * @param {TranscriptionResponse} transcriptPayload\n * @returns {void}\n */\n private processManualTranscription = (transcriptPayload: TranscriptionResponse): void => {\n if (\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT ||\n transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT\n ) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_MANUAL_CAPTION, {\n isFinal: transcriptPayload.type === TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT,\n transcriptId: transcriptPayload.id,\n transcripts: transcriptPayload.transcripts,\n sender: transcriptPayload.sender,\n source: transcriptPayload.data_source,\n });\n }\n };\n\n /**\n * Process Transcript and send alert\n * @param {TranscriptionResponse} voiceaPayload\n * @returns {void}\n */\n private processTranscription = (voiceaPayload: TranscriptionResponse): void => {\n switch (voiceaPayload.type) {\n case TRANSCRIPTION_TYPE.TRANSCRIPT_INTERIM_RESULTS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: false,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts,\n });\n break;\n\n case TRANSCRIPTION_TYPE.TRANSCRIPT_FINAL_RESULT:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.NEW_CAPTION, {\n isFinal: true,\n transcriptId: voiceaPayload.transcript_id,\n transcripts: voiceaPayload.transcripts.map((transcript) => {\n transcript.timestamp = millisToMinutesAndSeconds(transcript.end_millis);\n\n return transcript;\n }),\n });\n break;\n\n case TRANSCRIPTION_TYPE.HIGHLIGHT_CREATED:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.HIGHLIGHT_CREATED, {\n csis: voiceaPayload.highlight.csis,\n highlightId: voiceaPayload.highlight.highlight_id,\n text: voiceaPayload.highlight.transcript,\n highlightLabel: voiceaPayload.highlight.highlight_label,\n highlightSource: voiceaPayload.highlight.highlight_source,\n timestamp: millisToMinutesAndSeconds(voiceaPayload.highlight.end_millis),\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_THANKS:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: false,\n text: voiceaPayload.command_response,\n });\n break;\n\n case TRANSCRIPTION_TYPE.EVA_WAKE:\n case TRANSCRIPTION_TYPE.EVA_CANCEL:\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.EVA_COMMAND, {\n isListening: voiceaPayload.type === TRANSCRIPTION_TYPE.EVA_WAKE,\n });\n break;\n\n case TRANSCRIPTION_TYPE.LANGUAGE_DETECTED: {\n const isInSpokenLanguages = this.spokenLanguages.includes(voiceaPayload.language);\n\n if (isInSpokenLanguages) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.LANGUAGE_DETECTED, {\n languageCode: voiceaPayload.language,\n });\n }\n\n break;\n }\n default:\n break;\n }\n };\n\n /**\n * Processes Caption Language Response\n * @param {CaptionLanguageResponse} voiceaPayload\n * @returns {void}\n */\n private processCaptionLanguageResponse = (voiceaPayload: CaptionLanguageResponse): void => {\n if (voiceaPayload.statusCode === 200) {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {statusCode: 200});\n } else {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTION_LANGUAGE_UPDATE, {\n statusCode: voiceaPayload.errorCode,\n errorMessage: voiceaPayload.message,\n });\n }\n };\n\n /**\n * processes voicea announcement response and triggers event\n * @param {Object} voiceaPayload\n * @returns {void}\n */\n private processAnnouncementMessage = (voiceaPayload: AnnouncementPayload): void => {\n const voiceaLanguageOptions = {\n captionLanguages: voiceaPayload?.translation?.allowed_languages ?? [],\n maxLanguages: voiceaPayload?.translation?.max_languages ?? 0,\n spokenLanguages: voiceaPayload?.ASR?.spoken_languages ?? [],\n currentSpokenLanguage: this.currentSpokenLanguage,\n };\n\n this.spokenLanguages = voiceaPayload?.ASR?.spoken_languages ?? [];\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.VOICEA_ANNOUNCEMENT, voiceaLanguageOptions);\n };\n\n /**\n * Indicates whether the default or practice-session LLM connection is active.\n * @returns {boolean}\n */\n private isLLMConnected = (): boolean =>\n // @ts-ignore\n this.webex.internal.llm.isConnected() ||\n // @ts-ignore\n this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION);\n\n public getIsCaptionBoxOn = (): boolean => this.isCaptionBoxOn;\n\n /**\n * Resolves the active LLM publish transport, preferring the practice-session\n * connection only when that session is fully connected.\n * @returns {Object}\n */\n private getPublishTransport = () => {\n // @ts-ignore\n const {llm} = this.webex.internal;\n const isPracticeSessionConnected = llm.isConnected(LLM_PRACTICE_SESSION);\n\n return {\n socket: (isPracticeSessionConnected && llm.getSocket(LLM_PRACTICE_SESSION)) || llm.socket,\n binding:\n (isPracticeSessionConnected && llm.getBinding(LLM_PRACTICE_SESSION)) || llm.getBinding(),\n datachannelUrl:\n (isPracticeSessionConnected && llm.getDatachannelUrl(LLM_PRACTICE_SESSION)) ||\n llm.getDatachannelUrl(),\n };\n };\n\n /**\n * Sends Announcement to add voicea to the meeting\n * @returns {void}\n */\n private sendAnnouncement = (): void => {\n this.announceStatus = ANNOUNCE_STATUS.JOINING;\n this.listenToEvents();\n const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n // If captionServiceId exists, send it as the 'to' header; otherwise keep headers empty.\n headers: this.captionServiceId ? {to: this.captionServiceId} : {},\n data: {\n clientPayload: {\n version: 'v2',\n },\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.VOICEA.CLIENT_ANNOUNCEMENT,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * Set Spoken Language for the meeting\n * @param {string} languageCode\n * @param {\"DEFAULT\" | \"AUTO\" | \"MANUAL\"} languageAssignment\n * @returns {Promise}\n */\n public setSpokenLanguage = (\n languageCode: string,\n languageAssignment?: 'DEFAULT' | 'AUTO' | 'MANUAL'\n ): Promise<void> =>\n // @ts-ignore\n this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n spokenLanguage: languageCode,\n ...(languageAssignment && {languageAssignment}),\n },\n },\n }).then(() => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode});\n });\n\n /**\n * Request Language translation\n * @param {string} languageCode\n * @returns {void}\n */\n public requestLanguage = (languageCode: string): void => {\n if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n socket.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n headers: {\n to: this.captionServiceId,\n },\n data: {\n clientPayload: {\n translationLanguage: languageCode,\n id: uuid.v4(),\n },\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.VOICEA.TRANSLATION_REQUEST,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.currentCaptionLanguage = languageCode;\n\n this.seqNum += 1;\n };\n\n /**\n * Send manual closed captions to voicea service\n * @param {string} text\n * @param {number} timeStamp\n * @param {number[]} csis\n * @param {boolean} isFinal\n * @returns {void}\n */\n public sendManualClosedCaption = (\n text: string,\n timeStamp: number,\n csis: number[],\n isFinal: boolean\n ): void => {\n if (!this.isLLMConnected()) {\n return;\n }\n\n const {socket, binding} = this.getPublishTransport();\n\n socket?.send({\n id: `${this.seqNum}`,\n type: 'publishRequest',\n recipients: {\n // @ts-ignore\n route: binding,\n },\n headers: {},\n data: {\n eventType: 'relay.event',\n relayType: AIBRIDGE_RELAY_TYPES.MANUAL.CAPTIONER,\n transcriptPayload: {\n type: isFinal\n ? TRANSCRIPTION_TYPE.MANUAL_CAPTION_FINAL_RESULT\n : TRANSCRIPTION_TYPE.MANUAL_CAPTION_INTERIM_RESULT,\n id: uuid.v4(),\n transcripts: [\n {\n text,\n start_millis: timeStamp,\n end_millis: timeStamp,\n csis,\n },\n ],\n transcript_id: uuid.v4(),\n },\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n this.seqNum += 1;\n };\n\n /**\n * request turn on Captions\n * @param {string} [languageCode] - Optional Parameter for spoken language code. Defaults to English\n * @returns {Promise}\n */\n private requestTurnOnCaptions = (languageCode?): undefined | Promise<void> => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.SENDING;\n\n // only set the spoken language if it is provided\n const body = {\n transcribe: {caption: true},\n languageCode,\n };\n\n // @ts-ignore\n // eslint-disable-next-line newline-before-return\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body,\n })\n .then(() => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.CAPTIONS_TURNED_ON);\n\n this.areCaptionsEnabled = true;\n this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;\n this.announce();\n this.updateSubchannelSubscriptionsAndSyncCaptionState({subscribe: ['transcription']}, true);\n })\n .catch(() => {\n this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;\n throw new Error('turn on captions fail');\n });\n };\n\n /**\n * is announce processing\n * @returns {boolean}\n */\n private isAnnounceProcessing = () =>\n [ANNOUNCE_STATUS.JOINING, ANNOUNCE_STATUS.JOINED].includes(this.announceStatus);\n\n /**\n * is announce processed\n * @returns {boolean}\n */\n private isAnnounceProcessed = () => this.announceStatus === ANNOUNCE_STATUS.JOINED;\n\n /**\n * announce to voicea data chanel\n * @returns {void}\n */\n public announce = () => {\n if (this.isAnnounceProcessed()) {\n return;\n }\n if (!this.isLLMConnected()) {\n throw new Error('voicea can not announce before llm connected');\n }\n this.sendAnnouncement();\n };\n\n /**\n * is turn on caption processing\n * @returns {boolean}\n */\n private isCaptionProcessing = () =>\n [TURN_ON_CAPTION_STATUS.SENDING, TURN_ON_CAPTION_STATUS.ENABLED].includes(this.captionStatus);\n\n /**\n * Turn on Captions\n * @param {string} [spokenLanguage] - Optional Spoken language code\n * @returns {Promise}\n */\n public turnOnCaptions = async (spokenLanguage?): undefined | Promise<void> => {\n if (this.captionStatus === TURN_ON_CAPTION_STATUS.SENDING) return undefined;\n\n if (!this.isLLMConnected()) {\n throw new Error('can not turn on captions before llm connected');\n }\n\n return this.requestTurnOnCaptions(spokenLanguage);\n };\n\n /**\n * Toggle transcribing for highlights\n * @param {boolean} activate true means to turn on transcribing and false means to turn off\n * @param {string} spokenLanguage language code for spoken language\n * @returns {Promise}\n */\n public toggleTranscribing = (\n activate: boolean,\n spokenLanguage?: string\n ): undefined | Promise<void> => {\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n transcribe: {\n transcribing: activate,\n },\n spokenLanguage,\n },\n }).then((): undefined | Promise<void> => {\n if (activate && !this.areCaptionsEnabled) {\n return this.turnOnCaptions(spokenLanguage);\n }\n\n return undefined;\n });\n };\n\n /**\n * Toggle turn on manual caption\n * @param {boolean} enable true means to turn on manual caption, false means to turn off\n * @returns {Promise}\n */\n public toggleManualCaption = (enable: boolean): undefined | Promise<void> => {\n if (this.toggleManualCaptionStatus === TOGGLE_MANUAL_CAPTION_STATUS.SENDING) return undefined;\n\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.SENDING;\n\n // @ts-ignore\n return this.request({\n method: 'PUT',\n // @ts-ignore\n url: `${this.webex.internal.llm.getLocusUrl()}/controls/`,\n body: {\n manualCaption: {\n enable,\n },\n },\n })\n .then((): undefined | Promise<void> => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n\n return undefined;\n })\n .catch(() => {\n this.toggleManualCaptionStatus = TOGGLE_MANUAL_CAPTION_STATUS.IDLE;\n throw new Error('toggle manual captions fail');\n });\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} languageCode\n * @param {string} meetingId\n * @returns {void}\n */\n public onSpokenLanguageUpdate = (languageCode: string, meetingId): void => {\n // @ts-ignore\n this.trigger(EVENT_TRIGGERS.SPOKEN_LANGUAGE_UPDATE, {languageCode, meetingId});\n this.currentSpokenLanguage = languageCode;\n };\n\n /**\n * In meeting Spoken Language changed event\n * @param {string} serviceId\n * @returns {void}\n */\n public onCaptionServiceIdUpdate = (serviceId: string): void => {\n if (!serviceId) {\n return;\n }\n if (this.captionServiceId !== serviceId) {\n this.captionServiceId = serviceId;\n // if service id value has changed and the translation language has been set, client needs to resend the translator language message to the LLM.\n if (this.currentCaptionLanguage) {\n this.requestLanguage(this.currentCaptionLanguage);\n }\n }\n };\n\n /**\n * get caption status\n * @returns {string}\n */\n public getCaptionStatus = () => this.captionStatus;\n\n /**\n * get announce status\n * @returns {string}\n */\n public getAnnounceStatus = () => this.announceStatus;\n /**\n * update LLM sub‑channel subscriptions.\n *\n * sends a single `subchannelSubscriptionRequest` to LLM,\n * allowing subscribe and unsubscribe subchannel.\n *\n * @param {string[]} options.subscribe Sub‑channels to subscribe to.\n * @param {string[]} options.unsubscribe Sub‑channels to unsubscribe from.\n * @returns {Promise}\n */\n public updateSubchannelSubscriptions = async ({\n subscribe = [],\n unsubscribe = [],\n }: {\n subscribe?: string[];\n unsubscribe?: string[];\n } = {}): Promise<void> => {\n // @ts-ignore\n const isDataChannelTokenEnabled = await this.webex.internal.llm.isDataChannelTokenEnabled();\n // @ts-ignore\n if (!this.isLLMConnected() || !isDataChannelTokenEnabled) return;\n\n const {socket, datachannelUrl} = this.getPublishTransport();\n\n // @ts-ignore\n socket.send({\n id: `${this.seqNum}`,\n type: 'subchannelSubscriptionRequest',\n data: {\n // @ts-ignore\n datachannelUri: datachannelUrl,\n subscribe,\n unsubscribe,\n },\n trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,\n });\n\n this.seqNum += 1;\n };\n\n /**\n * Syncs the UI caption intent and updates transcription subchannel\n * subscriptions accordingly.\n *\n * @param {Object} [options] - Subscription options.\n * @param {string[]} [options.subscribe] - Subchannels to subscribe to.\n * @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.\n * @param {boolean} [isCaptionBoxOn=false] - Whether captions are intended to be enabled.\n *\n * @returns {Promise<void>}\n */\n public updateSubchannelSubscriptionsAndSyncCaptionState = (\n options: {\n subscribe?: string[];\n unsubscribe?: string[];\n } = {},\n isCaptionBoxOn = false\n ): Promise<void> => {\n this.isCaptionBoxOn = isCaptionBoxOn;\n\n return this.updateSubchannelSubscriptions(options);\n };\n}\n\nexport default VoiceaChannel;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAEA,IAAAE,UAAA,GAAAF,OAAA;AAmBA,IAAAG,MAAA,GAAAH,OAAA;AAAkD,SAAAI,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,YAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,WAAAnB,CAAA,EAAAG,CAAA,EAAAL,CAAA,WAAAK,CAAA,OAAAiB,gBAAA,CAAAL,OAAA,EAAAZ,CAAA,OAAAkB,2BAAA,CAAAN,OAAA,EAAAf,CAAA,EAAAsB,yBAAA,KAAAC,kBAAA,CAAApB,CAAA,EAAAL,CAAA,YAAAsB,gBAAA,CAAAL,OAAA,EAAAf,CAAA,EAAAwB,WAAA,IAAArB,CAAA,CAAAK,KAAA,CAAAR,CAAA,EAAAF,CAAA;AAAA,SAAAwB,0BAAA,cAAAtB,CAAA,IAAAyB,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAL,kBAAA,CAAAE,OAAA,iCAAAzB,CAAA,aAAAsB,yBAAA,YAAAA,0BAAA,aAAAtB,CAAA,UAPlD;AASA;AACA;AACA;AACA;AACA;AAJA,IAKa6B,aAAa,GAAAC,OAAA,CAAAD,aAAA,0BAAAE,YAAA;EA2FxB;AACF;AACA;AACA;EACE,SAAAF,cAAA,EAAqB;IAAA,IAAAG,KAAA;IAAA,IAAAC,gBAAA,CAAAlB,OAAA,QAAAc,aAAA;IAAA,SAAAK,IAAA,GAAAxB,SAAA,CAAAC,MAAA,EAANwB,IAAI,OAAAC,KAAA,CAAAF,IAAA,GAAAG,IAAA,MAAAA,IAAA,GAAAH,IAAA,EAAAG,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAA3B,SAAA,CAAA2B,IAAA;IAAA;IACjBL,KAAA,GAAAb,UAAA,OAAAU,aAAA,KAAAS,MAAA,CAASH,IAAI;IAAE,IAAArB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,eA/FLO,iBAAM;IAAA,IAAAzB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,2BAMc,KAAK;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,qBAcD,EAAE;IAAA,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;IAItC;AACF;AACA;AACA;IAHE,IAAAlB,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,oBAKyB,UAAClC,CAAC,EAAK;MAAA,IAAA0C,UAAA;MAC9BR,KAAA,CAAKS,MAAM,GAAG3C,CAAC,CAAC4C,cAAc,GAAG,CAAC;MAClC,QAAQ5C,CAAC,CAAC6C,IAAI,CAACC,SAAS;QACtB,KAAKC,+BAAoB,CAACN,MAAM,CAACO,YAAY;UAC3Cd,KAAA,CAAKe,wBAAwB,CAACjD,CAAC,CAACkD,OAAO,CAACC,IAAI,CAAC;UAC7CjB,KAAA,CAAKkB,cAAc,GAAGC,0BAAe,CAACC,MAAM;UAC5CpB,KAAA,CAAKqB,0BAA0B,CAACvD,CAAC,CAAC6C,IAAI,CAACW,aAAa,CAAC;UACrD;QACF,KAAKT,+BAAoB,CAACN,MAAM,CAACgB,oBAAoB;UACnDvB,KAAA,CAAKwB,8BAA8B,CAAC1D,CAAC,CAAC6C,IAAI,CAACW,aAAa,CAAC;UACzD;QACF,KAAKT,+BAAoB,CAACN,MAAM,CAACkB,aAAa;UAC5CzB,KAAA,CAAK0B,oBAAoB,CAAC5D,CAAC,CAAC6C,IAAI,CAACW,aAAa,CAAC;UAC/C;QACF,KAAKT,+BAAoB,CAACc,MAAM,CAACF,aAAa;QAC9C,KAAKZ,+BAAoB,CAACc,MAAM,CAACC,SAAS;UACxC5B,KAAA,CAAK6B,0BAA0B,CAAApD,aAAA,CAAAA,aAAA,KAC1BX,CAAC,CAAC6C,IAAI,CAACmB,iBAAiB;YAC3BC,MAAM,GAAAvB,UAAA,GAAE1C,CAAC,CAACkD,OAAO,cAAAR,UAAA,uBAATA,UAAA,CAAWS,IAAI;YACvBe,WAAW,EAAElE,CAAC,CAAC6C,IAAI,CAACC;UAAS,EAC9B,CAAC;UACF;QACF;UACE;MACJ;IACF,CAAC;IAoDD;AACF;AACA;AACA;AACA;IAJE,IAAA9B,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,gCAKqC,UAAC8B,iBAAwC,EAAW;MACvF,IACEA,iBAAiB,CAACG,IAAI,KAAKC,6BAAkB,CAACC,2BAA2B,IACzEL,iBAAiB,CAACG,IAAI,KAAKC,6BAAkB,CAACE,6BAA6B,EAC3E;QACA;QACApC,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACC,kBAAkB,EAAE;UAC9CC,OAAO,EAAEV,iBAAiB,CAACG,IAAI,KAAKC,6BAAkB,CAACC,2BAA2B;UAClFM,YAAY,EAAEX,iBAAiB,CAACY,EAAE;UAClCC,WAAW,EAAEb,iBAAiB,CAACa,WAAW;UAC1CZ,MAAM,EAAED,iBAAiB,CAACC,MAAM;UAChCa,MAAM,EAAEd,iBAAiB,CAACE;QAC5B,CAAC,CAAC;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAlD,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,0BAK+B,UAACsB,aAAoC,EAAW;MAC7E,QAAQA,aAAa,CAACW,IAAI;QACxB,KAAKC,6BAAkB,CAACW,0BAA0B;UAChD;UACA7C,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACQ,WAAW,EAAE;YACvCN,OAAO,EAAE,KAAK;YACdC,YAAY,EAAEnB,aAAa,CAACyB,aAAa;YACzCJ,WAAW,EAAErB,aAAa,CAACqB;UAC7B,CAAC,CAAC;UACF;QAEF,KAAKT,6BAAkB,CAACc,uBAAuB;UAC7C;UACAhD,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACQ,WAAW,EAAE;YACvCN,OAAO,EAAE,IAAI;YACbC,YAAY,EAAEnB,aAAa,CAACyB,aAAa;YACzCJ,WAAW,EAAErB,aAAa,CAACqB,WAAW,CAACM,GAAG,CAAC,UAACC,UAAU,EAAK;cACzDA,UAAU,CAACC,SAAS,GAAG,IAAAC,gCAAyB,EAACF,UAAU,CAACG,UAAU,CAAC;cAEvE,OAAOH,UAAU;YACnB,CAAC;UACH,CAAC,CAAC;UACF;QAEF,KAAKhB,6BAAkB,CAACoB,iBAAiB;UACvC;UACAtD,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACgB,iBAAiB,EAAE;YAC7CC,IAAI,EAAEjC,aAAa,CAACkC,SAAS,CAACD,IAAI;YAClCE,WAAW,EAAEnC,aAAa,CAACkC,SAAS,CAACE,YAAY;YACjDC,IAAI,EAAErC,aAAa,CAACkC,SAAS,CAACN,UAAU;YACxCU,cAAc,EAAEtC,aAAa,CAACkC,SAAS,CAACK,eAAe;YACvDC,eAAe,EAAExC,aAAa,CAACkC,SAAS,CAACO,gBAAgB;YACzDZ,SAAS,EAAE,IAAAC,gCAAyB,EAAC9B,aAAa,CAACkC,SAAS,CAACH,UAAU;UACzE,CAAC,CAAC;UACF;QAEF,KAAKnB,6BAAkB,CAAC8B,UAAU;UAChC;UACAhE,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAAC2B,WAAW,EAAE;YACvCC,WAAW,EAAE,KAAK;YAClBP,IAAI,EAAErC,aAAa,CAAC6C;UACtB,CAAC,CAAC;UACF;QAEF,KAAKjC,6BAAkB,CAACkC,QAAQ;QAChC,KAAKlC,6BAAkB,CAACmC,UAAU;UAChC;UACArE,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAAC2B,WAAW,EAAE;YACvCC,WAAW,EAAE5C,aAAa,CAACW,IAAI,KAAKC,6BAAkB,CAACkC;UACzD,CAAC,CAAC;UACF;QAEF,KAAKlC,6BAAkB,CAACoC,iBAAiB;UAAE;YACzC,IAAMC,mBAAmB,GAAGvE,KAAA,CAAKwE,eAAe,CAACC,QAAQ,CAACnD,aAAa,CAACoD,QAAQ,CAAC;YAEjF,IAAIH,mBAAmB,EAAE;cACvB;cACAvE,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACgC,iBAAiB,EAAE;gBAC7CK,YAAY,EAAErD,aAAa,CAACoD;cAC9B,CAAC,CAAC;YACJ;YAEA;UACF;QACA;UACE;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA5F,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,oCAKyC,UAACsB,aAAsC,EAAW;MACzF,IAAIA,aAAa,CAACsD,UAAU,KAAK,GAAG,EAAE;QACpC;QACA5E,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACuC,uBAAuB,EAAE;UAACD,UAAU,EAAE;QAAG,CAAC,CAAC;MACzE,CAAC,MAAM;QACL;QACA5E,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACuC,uBAAuB,EAAE;UACnDD,UAAU,EAAEtD,aAAa,CAACwD,SAAS;UACnCC,YAAY,EAAEzD,aAAa,CAAC0D;QAC9B,CAAC,CAAC;MACJ;IACF,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAlG,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,gCAKqC,UAACsB,aAAkC,EAAW;MAAA,IAAA2D,qBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,qBAAA,EAAAC,kBAAA,EAAAC,sBAAA,EAAAC,mBAAA;MACjF,IAAMC,qBAAqB,GAAG;QAC5BC,gBAAgB,GAAAT,qBAAA,GAAE3D,aAAa,aAAbA,aAAa,wBAAA4D,sBAAA,GAAb5D,aAAa,CAAEqE,WAAW,cAAAT,sBAAA,uBAA1BA,sBAAA,CAA4BU,iBAAiB,cAAAX,qBAAA,cAAAA,qBAAA,GAAI,EAAE;QACrEY,YAAY,GAAAV,sBAAA,GAAE7D,aAAa,aAAbA,aAAa,wBAAA8D,sBAAA,GAAb9D,aAAa,CAAEqE,WAAW,cAAAP,sBAAA,uBAA1BA,sBAAA,CAA4BU,aAAa,cAAAX,sBAAA,cAAAA,sBAAA,GAAI,CAAC;QAC5DX,eAAe,GAAAa,qBAAA,GAAE/D,aAAa,aAAbA,aAAa,wBAAAgE,kBAAA,GAAbhE,aAAa,CAAEyE,GAAG,cAAAT,kBAAA,uBAAlBA,kBAAA,CAAoBU,gBAAgB,cAAAX,qBAAA,cAAAA,qBAAA,GAAI,EAAE;QAC3DY,qBAAqB,EAAEjG,KAAA,CAAKiG;MAC9B,CAAC;MAEDjG,KAAA,CAAKwE,eAAe,IAAAe,sBAAA,GAAGjE,aAAa,aAAbA,aAAa,wBAAAkE,mBAAA,GAAblE,aAAa,CAAEyE,GAAG,cAAAP,mBAAA,uBAAlBA,mBAAA,CAAoBQ,gBAAgB,cAAAT,sBAAA,cAAAA,sBAAA,GAAI,EAAE;MACjE;MACAvF,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAAC4D,mBAAmB,EAAET,qBAAqB,CAAC;IACzE,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAA3G,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,oBAIyB;MAAA;QACvB;QACAA,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACC,WAAW,CAAC,CAAC;QACrC;QACAtG,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACC,WAAW,CAACC,+BAAoB;MAAC;IAAA;IAAA,IAAAzH,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,uBAEhC;MAAA,OAAeA,KAAA,CAAKwG,cAAc;IAAA;IAE7D;AACF;AACA;AACA;AACA;IAJE,IAAA1H,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,yBAK8B,YAAM;MAClC;MACA,IAAOqG,GAAG,GAAIrG,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAA1BC,GAAG;MACV,IAAMI,0BAA0B,GAAGJ,GAAG,CAACC,WAAW,CAACC,+BAAoB,CAAC;MAExE,OAAO;QACLG,MAAM,EAAGD,0BAA0B,IAAIJ,GAAG,CAACM,SAAS,CAACJ,+BAAoB,CAAC,IAAKF,GAAG,CAACK,MAAM;QACzFE,OAAO,EACJH,0BAA0B,IAAIJ,GAAG,CAACQ,UAAU,CAACN,+BAAoB,CAAC,IAAKF,GAAG,CAACQ,UAAU,CAAC,CAAC;QAC1FC,cAAc,EACXL,0BAA0B,IAAIJ,GAAG,CAACU,iBAAiB,CAACR,+BAAoB,CAAC,IAC1EF,GAAG,CAACU,iBAAiB,CAAC;MAC1B,CAAC;IACH,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAAjI,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,sBAI2B,YAAY;MACrCA,KAAA,CAAKkB,cAAc,GAAGC,0BAAe,CAAC6F,OAAO;MAC7ChH,KAAA,CAAKiH,cAAc,CAAC,CAAC;MACrB,IAAAC,qBAAA,GAA0BlH,KAAA,CAAKmH,mBAAmB,CAAC,CAAC;QAA7CT,MAAM,GAAAQ,qBAAA,CAANR,MAAM;QAAEE,OAAO,GAAAM,qBAAA,CAAPN,OAAO;MACtBF,MAAM,CAACU,IAAI,CAAC;QACV1E,EAAE,KAAApC,MAAA,CAAKN,KAAA,CAAKS,MAAM,CAAE;QACpBwB,IAAI,EAAE,gBAAgB;QACtBoF,UAAU,EAAE;UACV;UACAC,KAAK,EAAEV;QACT,CAAC;QACD;QACA5F,OAAO,EAAEhB,KAAA,CAAKuH,gBAAgB,GAAG;UAACC,EAAE,EAAExH,KAAA,CAAKuH;QAAgB,CAAC,GAAG,CAAC,CAAC;QACjE5G,IAAI,EAAE;UACJ8G,aAAa,EAAE;YACbC,OAAO,EAAE;UACX,CAAC;UACDC,SAAS,EAAE,aAAa;UACxB/G,SAAS,EAAEC,+BAAoB,CAACN,MAAM,CAACqH;QACzC,CAAC;QACDC,UAAU,KAAAvH,MAAA,CAAKwH,iBAAM,CAACC,gBAAgB,OAAAzH,MAAA,CAAI0H,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACFlI,KAAA,CAAKS,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;IALE,IAAA3B,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,uBAM2B,UACzB2E,YAAoB,EACpBwD,kBAAkD;MAAA;QAElD;QACAnI,KAAA,CAAKoI,OAAO,CAAC;UACXC,MAAM,EAAE,KAAK;UACb;UACAC,GAAG,KAAAhI,MAAA,CAAKN,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACkC,WAAW,CAAC,CAAC,eAAY;UACzDC,IAAI,EAAE;YACJC,UAAU,EAAAhK,aAAA;cACRiK,cAAc,EAAE/D;YAAY,GACxBwD,kBAAkB,IAAI;cAACA,kBAAkB,EAAlBA;YAAkB,CAAC;UAElD;QACF,CAAC,CAAC,CAACQ,IAAI,CAAC,YAAM;UACZ;UACA3I,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACsG,sBAAsB,EAAE;YAACjE,YAAY,EAAZA;UAAY,CAAC,CAAC;QACrE,CAAC;MAAC;IAAA;IAEJ;AACF;AACA;AACA;AACA;IAJE,IAAA7F,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,qBAKyB,UAAC2E,YAAoB,EAAW;MACvD,IAAI,CAAC3E,KAAA,CAAK6I,cAAc,CAAC,CAAC,EAAE;QAC1B;MACF;MAEA,IAAAC,sBAAA,GAA0B9I,KAAA,CAAKmH,mBAAmB,CAAC,CAAC;QAA7CT,MAAM,GAAAoC,sBAAA,CAANpC,MAAM;QAAEE,OAAO,GAAAkC,sBAAA,CAAPlC,OAAO;MACtBF,MAAM,CAACU,IAAI,CAAC;QACV1E,EAAE,KAAApC,MAAA,CAAKN,KAAA,CAAKS,MAAM,CAAE;QACpBwB,IAAI,EAAE,gBAAgB;QACtBoF,UAAU,EAAE;UACV;UACAC,KAAK,EAAEV;QACT,CAAC;QACD5F,OAAO,EAAE;UACPwG,EAAE,EAAExH,KAAA,CAAKuH;QACX,CAAC;QACD5G,IAAI,EAAE;UACJ8G,aAAa,EAAE;YACbsB,mBAAmB,EAAEpE,YAAY;YACjCjC,EAAE,EAAEsF,aAAI,CAACC,EAAE,CAAC;UACd,CAAC;UACDN,SAAS,EAAE,aAAa;UACxB/G,SAAS,EAAEC,+BAAoB,CAACN,MAAM,CAACyI;QACzC,CAAC;QACDnB,UAAU,KAAAvH,MAAA,CAAKwH,iBAAM,CAACC,gBAAgB,OAAAzH,MAAA,CAAI0H,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACFlI,KAAA,CAAKiJ,sBAAsB,GAAGtE,YAAY;MAE1C3E,KAAA,CAAKS,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;IAPE,IAAA3B,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,6BAQiC,UAC/B2D,IAAY,EACZuF,SAAiB,EACjB3F,IAAc,EACdf,OAAgB,EACP;MACT,IAAI,CAACxC,KAAA,CAAK6I,cAAc,CAAC,CAAC,EAAE;QAC1B;MACF;MAEA,IAAAM,sBAAA,GAA0BnJ,KAAA,CAAKmH,mBAAmB,CAAC,CAAC;QAA7CT,MAAM,GAAAyC,sBAAA,CAANzC,MAAM;QAAEE,OAAO,GAAAuC,sBAAA,CAAPvC,OAAO;MAEtBF,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEU,IAAI,CAAC;QACX1E,EAAE,KAAApC,MAAA,CAAKN,KAAA,CAAKS,MAAM,CAAE;QACpBwB,IAAI,EAAE,gBAAgB;QACtBoF,UAAU,EAAE;UACV;UACAC,KAAK,EAAEV;QACT,CAAC;QACD5F,OAAO,EAAE,CAAC,CAAC;QACXL,IAAI,EAAE;UACJgH,SAAS,EAAE,aAAa;UACxB/G,SAAS,EAAEC,+BAAoB,CAACc,MAAM,CAACC,SAAS;UAChDE,iBAAiB,EAAE;YACjBG,IAAI,EAAEO,OAAO,GACTN,6BAAkB,CAACC,2BAA2B,GAC9CD,6BAAkB,CAACE,6BAA6B;YACpDM,EAAE,EAAEsF,aAAI,CAACC,EAAE,CAAC,CAAC;YACbtF,WAAW,EAAE,CACX;cACEgB,IAAI,EAAJA,IAAI;cACJyF,YAAY,EAAEF,SAAS;cACvB7F,UAAU,EAAE6F,SAAS;cACrB3F,IAAI,EAAJA;YACF,CAAC,CACF;YACDR,aAAa,EAAEiF,aAAI,CAACC,EAAE,CAAC;UACzB;QACF,CAAC;QACDJ,UAAU,KAAAvH,MAAA,CAAKwH,iBAAM,CAACC,gBAAgB,OAAAzH,MAAA,CAAI0H,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;MAChE,CAAC,CAAC;MACFlI,KAAA,CAAKS,MAAM,IAAI,CAAC;IAClB,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA3B,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,2BAKgC,UAAC2E,YAAa,EAAgC;MAC5E3E,KAAA,CAAKqJ,aAAa,GAAGC,iCAAsB,CAACC,OAAO;;MAEnD;MACA,IAAMf,IAAI,GAAG;QACXC,UAAU,EAAE;UAACe,OAAO,EAAE;QAAI,CAAC;QAC3B7E,YAAY,EAAZA;MACF,CAAC;;MAED;MACA;MACA,OAAO3E,KAAA,CAAKoI,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAhI,MAAA,CAAKN,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACkC,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAJA;MACF,CAAC,CAAC,CACCG,IAAI,CAAC,YAAM;QACV;QACA3I,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACmH,kBAAkB,CAAC;QAE/CzJ,KAAA,CAAK0J,kBAAkB,GAAG,IAAI;QAC9B1J,KAAA,CAAKqJ,aAAa,GAAGC,iCAAsB,CAACK,OAAO;QACnD3J,KAAA,CAAK4J,QAAQ,CAAC,CAAC;QACf5J,KAAA,CAAK6J,gDAAgD,CAAC;UAACC,SAAS,EAAE,CAAC,eAAe;QAAC,CAAC,EAAE,IAAI,CAAC;MAC7F,CAAC,CAAC,CACDC,KAAK,CAAC,YAAM;QACX/J,KAAA,CAAKqJ,aAAa,GAAGC,iCAAsB,CAACU,IAAI;QAChD,MAAM,IAAIC,KAAK,CAAC,uBAAuB,CAAC;MAC1C,CAAC,CAAC;IACN,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAAnL,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,0BAI+B;MAAA,OAC7B,CAACmB,0BAAe,CAAC6F,OAAO,EAAE7F,0BAAe,CAACC,MAAM,CAAC,CAACqD,QAAQ,CAACzE,KAAA,CAAKkB,cAAc,CAAC;IAAA;IAEjF;AACF;AACA;AACA;IAHE,IAAApC,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,yBAI8B;MAAA,OAAMA,KAAA,CAAKkB,cAAc,KAAKC,0BAAe,CAACC,MAAM;IAAA;IAElF;AACF;AACA;AACA;IAHE,IAAAtC,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,cAIkB,YAAM;MACtB,IAAIA,KAAA,CAAKkK,mBAAmB,CAAC,CAAC,EAAE;QAC9B;MACF;MACA,IAAI,CAAClK,KAAA,CAAK6I,cAAc,CAAC,CAAC,EAAE;QAC1B,MAAM,IAAIoB,KAAK,CAAC,8CAA8C,CAAC;MACjE;MACAjK,KAAA,CAAKmK,gBAAgB,CAAC,CAAC;IACzB,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAArL,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,yBAI8B;MAAA,OAC5B,CAACsJ,iCAAsB,CAACC,OAAO,EAAED,iCAAsB,CAACK,OAAO,CAAC,CAAClF,QAAQ,CAACzE,KAAA,CAAKqJ,aAAa,CAAC;IAAA;IAE/F;AACF;AACA;AACA;AACA;IAJE,IAAAvK,gBAAA,CAAAC,OAAA,EAAAiB,KAAA;MAAA,IAAAoK,IAAA,OAAAC,kBAAA,CAAAtL,OAAA,eAAAuL,YAAA,CAAAvL,OAAA,CAAAwL,IAAA,CAKwB,SAAAC,QAAO9B,cAAe;QAAA,OAAA4B,YAAA,CAAAvL,OAAA,CAAA0L,IAAA,WAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cAAA,MACxC5K,KAAA,CAAKqJ,aAAa,KAAKC,iCAAsB,CAACC,OAAO;gBAAAmB,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,OAAAF,QAAA,CAAAG,MAAA,WAASC,SAAS;YAAA;cAAA,IAEtE9K,KAAA,CAAK6I,cAAc,CAAC,CAAC;gBAAA6B,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,MAClB,IAAIX,KAAK,CAAC,+CAA+C,CAAC;YAAA;cAAA,OAAAS,QAAA,CAAAG,MAAA,WAG3D7K,KAAA,CAAK+K,qBAAqB,CAACrC,cAAc,CAAC;YAAA;YAAA;cAAA,OAAAgC,QAAA,CAAAM,IAAA;UAAA;QAAA,GAAAR,OAAA;MAAA,CAClD;MAAA,iBAAAS,EAAA;QAAA,OAAAb,IAAA,CAAA5L,KAAA,OAAAE,SAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE,IAAAI,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,wBAM4B,UAC1BkL,QAAiB,EACjBxC,cAAuB,EACO;MAC9B;MACA,OAAO1I,KAAA,CAAKoI,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAhI,MAAA,CAAKN,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACkC,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAE;UACJC,UAAU,EAAE;YACV0C,YAAY,EAAED;UAChB,CAAC;UACDxC,cAAc,EAAdA;QACF;MACF,CAAC,CAAC,CAACC,IAAI,CAAC,YAAiC;QACvC,IAAIuC,QAAQ,IAAI,CAAClL,KAAA,CAAK0J,kBAAkB,EAAE;UACxC,OAAO1J,KAAA,CAAKoL,cAAc,CAAC1C,cAAc,CAAC;QAC5C;QAEA,OAAOoC,SAAS;MAClB,CAAC,CAAC;IACJ,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAAhM,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,yBAK6B,UAACqL,MAAe,EAAgC;MAC3E,IAAIrL,KAAA,CAAKsL,yBAAyB,KAAKC,uCAA4B,CAAChC,OAAO,EAAE,OAAOuB,SAAS;MAE7F9K,KAAA,CAAKsL,yBAAyB,GAAGC,uCAA4B,CAAChC,OAAO;;MAErE;MACA,OAAOvJ,KAAA,CAAKoI,OAAO,CAAC;QAClBC,MAAM,EAAE,KAAK;QACb;QACAC,GAAG,KAAAhI,MAAA,CAAKN,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAACkC,WAAW,CAAC,CAAC,eAAY;QACzDC,IAAI,EAAE;UACJgD,aAAa,EAAE;YACbH,MAAM,EAANA;UACF;QACF;MACF,CAAC,CAAC,CACC1C,IAAI,CAAC,YAAiC;QACrC3I,KAAA,CAAKsL,yBAAyB,GAAGC,uCAA4B,CAACvB,IAAI;QAElE,OAAOc,SAAS;MAClB,CAAC,CAAC,CACDf,KAAK,CAAC,YAAM;QACX/J,KAAA,CAAKsL,yBAAyB,GAAGC,uCAA4B,CAACvB,IAAI;QAClE,MAAM,IAAIC,KAAK,CAAC,6BAA6B,CAAC;MAChD,CAAC,CAAC;IACN,CAAC;IAED;AACF;AACA;AACA;AACA;AACA;IALE,IAAAnL,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,4BAMgC,UAAC2E,YAAoB,EAAE8G,SAAS,EAAW;MACzE;MACAzL,KAAA,CAAKqC,OAAO,CAACC,yBAAc,CAACsG,sBAAsB,EAAE;QAACjE,YAAY,EAAZA,YAAY;QAAE8G,SAAS,EAATA;MAAS,CAAC,CAAC;MAC9EzL,KAAA,CAAKiG,qBAAqB,GAAGtB,YAAY;IAC3C,CAAC;IAED;AACF;AACA;AACA;AACA;IAJE,IAAA7F,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,8BAKkC,UAAC0L,SAAiB,EAAW;MAC7D,IAAI,CAACA,SAAS,EAAE;QACd;MACF;MACA,IAAI1L,KAAA,CAAKuH,gBAAgB,KAAKmE,SAAS,EAAE;QACvC1L,KAAA,CAAKuH,gBAAgB,GAAGmE,SAAS;QACjC;QACA,IAAI1L,KAAA,CAAKiJ,sBAAsB,EAAE;UAC/BjJ,KAAA,CAAK2L,eAAe,CAAC3L,KAAA,CAAKiJ,sBAAsB,CAAC;QACnD;MACF;IACF,CAAC;IAED;AACF;AACA;AACA;IAHE,IAAAnK,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,sBAI0B;MAAA,OAAMA,KAAA,CAAKqJ,aAAa;IAAA;IAElD;AACF;AACA;AACA;IAHE,IAAAvK,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,uBAI2B;MAAA,OAAMA,KAAA,CAAKkB,cAAc;IAAA;IACpD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATE,IAAApC,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,oDAAAqK,kBAAA,CAAAtL,OAAA,eAAAuL,YAAA,CAAAvL,OAAA,CAAAwL,IAAA,CAUuC,SAAAqB,SAAA;MAAA,IAAAC,KAAA;QAAAC,eAAA;QAAAhC,SAAA;QAAAiC,iBAAA;QAAAC,WAAA;QAAAC,yBAAA;QAAAC,sBAAA;QAAAxF,MAAA;QAAAI,cAAA;QAAAqF,MAAA,GAAAzN,SAAA;MAAA,OAAA4L,YAAA,CAAAvL,OAAA,CAAA0L,IAAA,WAAA2B,SAAA;QAAA,kBAAAA,SAAA,CAAAzB,IAAA,GAAAyB,SAAA,CAAAxB,IAAA;UAAA;YAAAiB,KAAA,GAAAM,MAAA,CAAAxN,MAAA,QAAAwN,MAAA,QAAArB,SAAA,GAAAqB,MAAA,MAMnC,CAAC,CAAC,EAAAL,eAAA,GAAAD,KAAA,CALJ/B,SAAS,EAATA,SAAS,GAAAgC,eAAA,cAAG,EAAE,GAAAA,eAAA,EAAAC,iBAAA,GAAAF,KAAA,CACdG,WAAW,EAAXA,WAAW,GAAAD,iBAAA,cAAG,EAAE,GAAAA,iBAAA;YAAAK,SAAA,CAAAxB,IAAA;YAAA,OAMwB5K,KAAA,CAAKmG,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC4F,yBAAyB,CAAC,CAAC;UAAA;YAArFA,yBAAyB,GAAAG,SAAA,CAAAC,IAAA;YAAA,MAE3B,CAACrM,KAAA,CAAK6I,cAAc,CAAC,CAAC,IAAI,CAACoD,yBAAyB;cAAAG,SAAA,CAAAxB,IAAA;cAAA;YAAA;YAAA,OAAAwB,SAAA,CAAAvB,MAAA;UAAA;YAAAqB,sBAAA,GAEvBlM,KAAA,CAAKmH,mBAAmB,CAAC,CAAC,EAApDT,MAAM,GAAAwF,sBAAA,CAANxF,MAAM,EAAEI,cAAc,GAAAoF,sBAAA,CAAdpF,cAAc,EAE7B;YACAJ,MAAM,CAACU,IAAI,CAAC;cACV1E,EAAE,KAAApC,MAAA,CAAKN,KAAA,CAAKS,MAAM,CAAE;cACpBwB,IAAI,EAAE,+BAA+B;cACrCtB,IAAI,EAAE;gBACJ;gBACA2L,cAAc,EAAExF,cAAc;gBAC9BgD,SAAS,EAATA,SAAS;gBACTkC,WAAW,EAAXA;cACF,CAAC;cACDnE,UAAU,KAAAvH,MAAA,CAAKwH,iBAAM,CAACC,gBAAgB,OAAAzH,MAAA,CAAI0H,aAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;YAChE,CAAC,CAAC;YAEFlI,KAAA,CAAKS,MAAM,IAAI,CAAC;UAAC;UAAA;YAAA,OAAA2L,SAAA,CAAApB,IAAA;QAAA;MAAA,GAAAY,QAAA;IAAA,CAClB;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IAVE,IAAA9M,gBAAA,CAAAC,OAAA,EAAAiB,KAAA,sDAW0D,YAMtC;MAAA,IALlBuM,OAGC,GAAA7N,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAoM,SAAA,GAAApM,SAAA,MAAG,CAAC,CAAC;MAAA,IACN8H,cAAc,GAAA9H,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAoM,SAAA,GAAApM,SAAA,MAAG,KAAK;MAEtBsB,KAAA,CAAKwG,cAAc,GAAGA,cAAc;MAEpC,OAAOxG,KAAA,CAAKwM,6BAA6B,CAACD,OAAO,CAAC;IACpD,CAAC;IAtjBCvM,KAAA,CAAKS,MAAM,GAAG,CAAC;IACfT,KAAA,CAAK0J,kBAAkB,GAAG,KAAK;IAC/B1J,KAAA,CAAKuH,gBAAgB,GAAGuD,SAAS;IACjC9K,KAAA,CAAKkB,cAAc,GAAGC,0BAAe,CAAC6I,IAAI;IAC1ChK,KAAA,CAAKqJ,aAAa,GAAGC,iCAAsB,CAACU,IAAI;IAChDhK,KAAA,CAAKsL,yBAAyB,GAAGC,uCAA4B,CAACvB,IAAI;IAClEhK,KAAA,CAAKiG,qBAAqB,GAAGwG,kCAAuB;IACpDzM,KAAA,CAAKiJ,sBAAsB,GAAG6B,SAAS;IAAC,OAAA9K,KAAA;EAC1C;EAAC,IAAA0M,UAAA,CAAA3N,OAAA,EAAAc,aAAA,EAAAE,YAAA;EAAA,WAAA4M,aAAA,CAAA5N,OAAA,EAAAc,aAAA;IAAA+M,GAAA;IAAAC,KAAA;IAhDD;AACF;AACA;AACA;IACE,SAAQ5F,cAAcA,CAAA,EAAG;MACvB,IAAI,CAAC,IAAI,CAAC6F,qBAAqB,EAAE;QAC/B;QACA,IAAI,CAAC3G,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0G,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAACC,cAAc,CAAC;QACpE;QACA,IAAI,CAAC7G,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC0G,EAAE,sBAAAzM,MAAA,CAAsBiG,+BAAoB,GAAI,IAAI,CAACyG,cAAc,CAAC;QAC5F,IAAI,CAACF,qBAAqB,GAAG,IAAI;MACnC;IACF;;IAEA;AACF;AACA;AACA;EAHE;IAAAF,GAAA;IAAAC,KAAA,EAIA,SAAOI,gBAAgBA,CAAA,EAAG;MACxB,IAAI,CAACvD,kBAAkB,GAAG,KAAK;MAC/B,IAAI,CAAClD,cAAc,GAAG,KAAK;MAC3B,IAAI,CAACe,gBAAgB,GAAGuD,SAAS;MACjC;MACA,IAAI,CAAC3E,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC6G,GAAG,CAAC,mBAAmB,EAAE,IAAI,CAACF,cAAc,CAAC;MACrE;MACA,IAAI,CAAC7G,KAAK,CAACC,QAAQ,CAACC,GAAG,CAAC6G,GAAG,sBAAA5M,MAAA,CAAsBiG,+BAAoB,GAAI,IAAI,CAACyG,cAAc,CAAC;MAC7F,IAAI,CAACF,qBAAqB,GAAG,KAAK;MAClC,IAAI,CAAC5L,cAAc,GAAGC,0BAAe,CAAC6I,IAAI;MAC1C,IAAI,CAACX,aAAa,GAAGC,iCAAsB,CAACU,IAAI;MAChD,IAAI,CAACsB,yBAAyB,GAAGC,uCAA4B,CAACvB,IAAI;MAClE,IAAI,CAAC/D,qBAAqB,GAAG6E,SAAS;MACtC,IAAI,CAAC7B,sBAAsB,GAAG6B,SAAS;IACzC;EAAC;AAAA,EAzFgCqC,sBAAW;AAAA,IAAAC,QAAA,GAAAtN,OAAA,CAAAf,OAAA,GA0pB/Bc,aAAa","ignoreList":[]}
package/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  "node": ">=18"
15
15
  },
16
16
  "dependencies": {
17
- "@webex/internal-plugin-llm": "3.11.0-next.11",
17
+ "@webex/internal-plugin-llm": "3.11.0-next.12",
18
18
  "@webex/internal-plugin-mercury": "3.11.0-next.10",
19
19
  "@webex/webex-core": "3.11.0-next.8",
20
20
  "uuid": "^3.3.2"
@@ -49,5 +49,5 @@
49
49
  "test:style": "eslint ./src/**/*.*",
50
50
  "test:unit": "webex-legacy-tools test --unit --runner jest"
51
51
  },
52
- "version": "3.11.0-next.12"
52
+ "version": "3.11.0-next.13"
53
53
  }
package/src/voicea.ts CHANGED
@@ -42,6 +42,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
42
42
 
43
43
  private captionStatus: string;
44
44
 
45
+ private isCaptionBoxOn: boolean;
46
+
45
47
  private toggleManualCaptionStatus: string;
46
48
 
47
49
  private currentSpokenLanguage?: string;
@@ -102,6 +104,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
102
104
  */
103
105
  public deregisterEvents() {
104
106
  this.areCaptionsEnabled = false;
107
+ this.isCaptionBoxOn = false;
105
108
  this.captionServiceId = undefined;
106
109
  // @ts-ignore
107
110
  this.webex.internal.llm.off('event:relay.event', this.eventProcessor);
@@ -272,6 +275,8 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
272
275
  // @ts-ignore
273
276
  this.webex.internal.llm.isConnected(LLM_PRACTICE_SESSION);
274
277
 
278
+ public getIsCaptionBoxOn = (): boolean => this.isCaptionBoxOn;
279
+
275
280
  /**
276
281
  * Resolves the active LLM publish transport, preferring the practice-session
277
282
  * connection only when that session is fully connected.
@@ -286,6 +291,9 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
286
291
  socket: (isPracticeSessionConnected && llm.getSocket(LLM_PRACTICE_SESSION)) || llm.socket,
287
292
  binding:
288
293
  (isPracticeSessionConnected && llm.getBinding(LLM_PRACTICE_SESSION)) || llm.getBinding(),
294
+ datachannelUrl:
295
+ (isPracticeSessionConnected && llm.getDatachannelUrl(LLM_PRACTICE_SESSION)) ||
296
+ llm.getDatachannelUrl(),
289
297
  };
290
298
  };
291
299
 
@@ -461,6 +469,7 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
461
469
  this.areCaptionsEnabled = true;
462
470
  this.captionStatus = TURN_ON_CAPTION_STATUS.ENABLED;
463
471
  this.announce();
472
+ this.updateSubchannelSubscriptionsAndSyncCaptionState({subscribe: ['transcription']}, true);
464
473
  })
465
474
  .catch(() => {
466
475
  this.captionStatus = TURN_ON_CAPTION_STATUS.IDLE;
@@ -620,6 +629,68 @@ export class VoiceaChannel extends WebexPlugin implements IVoiceaChannel {
620
629
  * @returns {string}
621
630
  */
622
631
  public getAnnounceStatus = () => this.announceStatus;
632
+ /**
633
+ * update LLM sub‑channel subscriptions.
634
+ *
635
+ * sends a single `subchannelSubscriptionRequest` to LLM,
636
+ * allowing subscribe and unsubscribe subchannel.
637
+ *
638
+ * @param {string[]} options.subscribe Sub‑channels to subscribe to.
639
+ * @param {string[]} options.unsubscribe Sub‑channels to unsubscribe from.
640
+ * @returns {Promise}
641
+ */
642
+ public updateSubchannelSubscriptions = async ({
643
+ subscribe = [],
644
+ unsubscribe = [],
645
+ }: {
646
+ subscribe?: string[];
647
+ unsubscribe?: string[];
648
+ } = {}): Promise<void> => {
649
+ // @ts-ignore
650
+ const isDataChannelTokenEnabled = await this.webex.internal.llm.isDataChannelTokenEnabled();
651
+ // @ts-ignore
652
+ if (!this.isLLMConnected() || !isDataChannelTokenEnabled) return;
653
+
654
+ const {socket, datachannelUrl} = this.getPublishTransport();
655
+
656
+ // @ts-ignore
657
+ socket.send({
658
+ id: `${this.seqNum}`,
659
+ type: 'subchannelSubscriptionRequest',
660
+ data: {
661
+ // @ts-ignore
662
+ datachannelUri: datachannelUrl,
663
+ subscribe,
664
+ unsubscribe,
665
+ },
666
+ trackingId: `${config.trackingIdPrefix}_${uuid.v4().toString()}`,
667
+ });
668
+
669
+ this.seqNum += 1;
670
+ };
671
+
672
+ /**
673
+ * Syncs the UI caption intent and updates transcription subchannel
674
+ * subscriptions accordingly.
675
+ *
676
+ * @param {Object} [options] - Subscription options.
677
+ * @param {string[]} [options.subscribe] - Subchannels to subscribe to.
678
+ * @param {string[]} [options.unsubscribe] - Subchannels to unsubscribe from.
679
+ * @param {boolean} [isCaptionBoxOn=false] - Whether captions are intended to be enabled.
680
+ *
681
+ * @returns {Promise<void>}
682
+ */
683
+ public updateSubchannelSubscriptionsAndSyncCaptionState = (
684
+ options: {
685
+ subscribe?: string[];
686
+ unsubscribe?: string[];
687
+ } = {},
688
+ isCaptionBoxOn = false
689
+ ): Promise<void> => {
690
+ this.isCaptionBoxOn = isCaptionBoxOn;
691
+
692
+ return this.updateSubchannelSubscriptions(options);
693
+ };
623
694
  }
624
695
 
625
696
  export default VoiceaChannel;
@@ -221,19 +221,17 @@ describe('plugin-voicea', () => {
221
221
  assert.notCalled(voiceaService.webex.internal.llm.socket.send);
222
222
  });
223
223
  });
224
-
225
224
  describe('#deregisterEvents', () => {
226
225
  beforeEach(async () => {
227
226
  const mockWebSocket = new MockWebSocket();
228
-
229
227
  voiceaService.webex.internal.llm.socket = mockWebSocket;
228
+ voiceaService.isCaptionBoxOn = true;
230
229
  });
231
230
 
232
- it('deregisters voicea service', async () => {
231
+ it('deregisters voicea service and resets caption state', async () => {
233
232
  voiceaService.listenToEvents();
234
233
  await voiceaService.toggleTranscribing(true);
235
234
 
236
- // eslint-disable-next-line no-underscore-dangle
237
235
  voiceaService.webex.internal.llm._emit('event:relay.event', {
238
236
  headers: {from: 'ws'},
239
237
  data: {relayType: 'voicea.annc', voiceaPayload: {}},
@@ -241,12 +239,14 @@ describe('plugin-voicea', () => {
241
239
 
242
240
  assert.equal(voiceaService.areCaptionsEnabled, true);
243
241
  assert.equal(voiceaService.captionServiceId, 'ws');
242
+ assert.equal(voiceaService.isCaptionBoxOn, true);
244
243
 
245
244
  voiceaService.deregisterEvents();
246
245
  assert.equal(voiceaService.areCaptionsEnabled, false);
247
246
  assert.equal(voiceaService.captionServiceId, undefined);
248
247
  assert.equal(voiceaService.announceStatus, 'idle');
249
248
  assert.equal(voiceaService.captionStatus, 'idle');
249
+ assert.equal(voiceaService.isCaptionBoxOn, false);
250
250
  });
251
251
  });
252
252
  describe('#processAnnouncementMessage', () => {
@@ -408,6 +408,7 @@ describe('plugin-voicea', () => {
408
408
 
409
409
  it('turns on captions', async () => {
410
410
  const announcementSpy = sinon.spy(voiceaService, 'announce');
411
+ const updateSubchannelSubscriptionsAndSyncCaptionStateSpy = sinon.spy(voiceaService, 'updateSubchannelSubscriptionsAndSyncCaptionState');
411
412
 
412
413
  const triggerSpy = sinon.spy();
413
414
 
@@ -428,6 +429,11 @@ describe('plugin-voicea', () => {
428
429
  assert.calledOnceWithExactly(triggerSpy);
429
430
 
430
431
  assert.calledOnce(announcementSpy);
432
+ assert.calledOnceWithExactly(
433
+ updateSubchannelSubscriptionsAndSyncCaptionStateSpy,
434
+ { subscribe: ['transcription'] },
435
+ true
436
+ );
431
437
  });
432
438
 
433
439
  it("should handle request fail", async () => {
@@ -486,6 +492,28 @@ describe('plugin-voicea', () => {
486
492
  });
487
493
  });
488
494
 
495
+ describe('#getIsCaptionBoxOn', () => {
496
+ beforeEach(() => {
497
+ voiceaService.isCaptionBoxOn = false;
498
+ });
499
+
500
+ it('returns false when captions are disabled', () => {
501
+ voiceaService.isCaptionBoxOn = false;
502
+
503
+ const result = voiceaService.getIsCaptionBoxOn();
504
+
505
+ assert.equal(result, false);
506
+ });
507
+
508
+ it('returns true when captions are enabled', () => {
509
+ voiceaService.isCaptionBoxOn = true;
510
+
511
+ const result = voiceaService.getIsCaptionBoxOn();
512
+
513
+ assert.equal(result, true);
514
+ });
515
+ });
516
+
489
517
  describe("#announce", () => {
490
518
  let isAnnounceProcessed, sendAnnouncement;
491
519
  beforeEach(() => {
@@ -1256,6 +1284,177 @@ describe('plugin-voicea', () => {
1256
1284
  });
1257
1285
  });
1258
1286
 
1287
+ describe('#updateSubchannelSubscriptions', () => {
1288
+ beforeEach(() => {
1289
+ const mockWebSocket = new MockWebSocket();
1290
+
1291
+ sinon.stub(voiceaService, 'getPublishTransport').returns({
1292
+ socket: mockWebSocket,
1293
+ datachannelUrl: 'mock-datachannel-uri',
1294
+ });
1295
+
1296
+ voiceaService.seqNum = 1;
1297
+
1298
+ voiceaService.isLLMConnected = sinon.stub().returns(true);
1299
+ voiceaService.webex.internal.llm.isDataChannelTokenEnabled = sinon.stub().resolves(true);
1300
+ });
1301
+
1302
+ it('sends subchannelSubscriptionRequest with subscribe and unsubscribe lists', async () => {
1303
+ await voiceaService.updateSubchannelSubscriptions({
1304
+ subscribe: ['transcription'],
1305
+ unsubscribe: ['polls'],
1306
+ });
1307
+
1308
+ const socket = voiceaService.getPublishTransport().socket;
1309
+
1310
+ sinon.assert.calledOnceWithExactly(
1311
+ socket.send,
1312
+ {
1313
+ id: '1',
1314
+ type: 'subchannelSubscriptionRequest',
1315
+ data: {
1316
+ datachannelUri: 'mock-datachannel-uri',
1317
+ subscribe: ['transcription'],
1318
+ unsubscribe: ['polls'],
1319
+ },
1320
+ trackingId: sinon.match.string,
1321
+ }
1322
+ );
1323
+
1324
+ sinon.assert.match(voiceaService.seqNum, 2);
1325
+ });
1326
+
1327
+ it('sends empty arrays when no subscribe/unsubscribe provided', async () => {
1328
+ await voiceaService.updateSubchannelSubscriptions({});
1329
+
1330
+ const socket = voiceaService.getPublishTransport().socket;
1331
+
1332
+ sinon.assert.calledOnceWithExactly(
1333
+ socket.send,
1334
+ {
1335
+ id: '1',
1336
+ type: 'subchannelSubscriptionRequest',
1337
+ data: {
1338
+ datachannelUri: 'mock-datachannel-uri',
1339
+ subscribe: [],
1340
+ unsubscribe: [],
1341
+ },
1342
+ trackingId: sinon.match.string,
1343
+ }
1344
+ );
1345
+
1346
+ sinon.assert.match(voiceaService.seqNum, 2);
1347
+ });
1348
+
1349
+ it('does nothing when LLM is not connected', async () => {
1350
+ voiceaService.isLLMConnected = sinon.stub().returns(false);
1351
+
1352
+ await voiceaService.updateSubchannelSubscriptions({
1353
+ subscribe: ['transcription'],
1354
+ });
1355
+
1356
+ const socket = voiceaService.getPublishTransport().socket;
1357
+
1358
+ sinon.assert.notCalled(socket.send);
1359
+ sinon.assert.match(voiceaService.seqNum, 1);
1360
+ });
1361
+
1362
+ it('does nothing when dataChannelToken is not enabled', async () => {
1363
+ voiceaService.webex.internal.llm.isDataChannelTokenEnabled = sinon.stub().resolves(false);
1364
+
1365
+ await voiceaService.updateSubchannelSubscriptions({
1366
+ subscribe: ['transcription'],
1367
+ });
1368
+
1369
+ const socket = voiceaService.getPublishTransport().socket;
1370
+
1371
+ sinon.assert.notCalled(socket.send);
1372
+ sinon.assert.match(voiceaService.seqNum, 1);
1373
+ });
1374
+ });
1375
+
1376
+
1377
+ describe('#updateSubchannelSubscriptionsAndSyncCaptionState', () => {
1378
+ beforeEach(() => {
1379
+ const mockWebSocket = new MockWebSocket();
1380
+ voiceaService.webex.internal.llm.socket = mockWebSocket;
1381
+
1382
+ voiceaService.webex.internal.llm.getDatachannelUrl = sinon.stub().returns('mock-datachannel-uri');
1383
+
1384
+ voiceaService.seqNum = 1;
1385
+
1386
+ voiceaService.isLLMConnected = sinon.stub().returns(true);
1387
+ voiceaService.webex.internal.llm.isDataChannelTokenEnabled = sinon.stub().resolves(true);
1388
+
1389
+ sinon.spy(voiceaService, 'updateSubchannelSubscriptions');
1390
+ });
1391
+
1392
+ afterEach(() => {
1393
+ sinon.restore();
1394
+ });
1395
+
1396
+ it('updates caption intent and forwards subscribe/unsubscribe to updateSubchannelSubscriptions', async () => {
1397
+ await voiceaService.updateSubchannelSubscriptionsAndSyncCaptionState(
1398
+ {
1399
+ subscribe: ['transcription'],
1400
+ unsubscribe: ['polls'],
1401
+ },
1402
+ true
1403
+ );
1404
+
1405
+ assert.equal(voiceaService.isCaptionBoxOn, true);
1406
+
1407
+ assert.calledOnceWithExactly(
1408
+ voiceaService.updateSubchannelSubscriptions,
1409
+ {
1410
+ subscribe: ['transcription'],
1411
+ unsubscribe: ['polls'],
1412
+ }
1413
+ );
1414
+ });
1415
+
1416
+ it('sets caption intent to false when isCCBoxOpen is false', async () => {
1417
+ await voiceaService.updateSubchannelSubscriptionsAndSyncCaptionState(
1418
+ { subscribe: ['transcription'] },
1419
+ false
1420
+ );
1421
+
1422
+ assert.equal(voiceaService.isCaptionBoxOn, false);
1423
+
1424
+ assert.calledOnceWithExactly(
1425
+ voiceaService.updateSubchannelSubscriptions,
1426
+ { subscribe: ['transcription'] }
1427
+ );
1428
+ });
1429
+
1430
+ it('defaults subscribe/unsubscribe to empty arrays when options is empty', async () => {
1431
+ await voiceaService.updateSubchannelSubscriptionsAndSyncCaptionState({}, true);
1432
+
1433
+ assert.equal(voiceaService.isCaptionBoxOn, true);
1434
+
1435
+ assert.calledOnceWithExactly(
1436
+ voiceaService.updateSubchannelSubscriptions,
1437
+ {}
1438
+ );
1439
+ });
1440
+
1441
+ it('still updates caption intent even if updateSubchannelSubscriptions does nothing (e.g., LLM not connected)', async () => {
1442
+ voiceaService.isLLMConnected = sinon.stub().returns(false);
1443
+
1444
+ await voiceaService.updateSubchannelSubscriptionsAndSyncCaptionState(
1445
+ { subscribe: ['transcription'] },
1446
+ true
1447
+ );
1448
+
1449
+ assert.equal(voiceaService.isCaptionBoxOn, true);
1450
+
1451
+ assert.calledOnceWithExactly(
1452
+ voiceaService.updateSubchannelSubscriptions,
1453
+ { subscribe: ['transcription'] }
1454
+ );
1455
+ });
1456
+ });
1457
+
1259
1458
  describe('#multiple llm connections', () => {
1260
1459
  let defaultSocket;
1261
1460
  let practiceSocket;
@@ -1380,6 +1579,5 @@ describe('plugin-voicea', () => {
1380
1579
  assert.equal(voiceaService.captionServiceId, 'svc-practice');
1381
1580
  });
1382
1581
  });
1383
-
1384
1582
  });
1385
1583
  });