@memberjunction/ng-mj-livekit-room 5.42.0 → 5.43.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.
@@ -58,6 +58,12 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
58
58
  EnableAgentManagement: boolean;
59
59
  /** Show the "Invite" pill that copies a join link to this room. */
60
60
  EnableInvite: boolean;
61
+ /**
62
+ * Offer "End meeting for everyone" in the control bar's Zoom-style leave menu. When on (default) and a
63
+ * room is resolved, ending tears down every agent in the room server-side (by name — so it works even
64
+ * when this client only *joined*). Set `false` for contexts where only the local user should ever leave.
65
+ */
66
+ EnableEndForAll: boolean;
61
67
  /** Target agents the user can ADD in-room (id + name). The host (e.g. the Explorer resource) supplies these. */
62
68
  AvailableAgents: {
63
69
  ID: string;
@@ -93,6 +99,10 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
93
99
  addingAgent: boolean;
94
100
  /** Last add error, shown under the picker. */
95
101
  addError: string | null;
102
+ /** True while an "End meeting" (stop all agents + leave) is in flight. */
103
+ endingMeeting: boolean;
104
+ /** The inner Generic room — used to trigger the local disconnect when ending/leaving the meeting. */
105
+ private roomComponent?;
96
106
  /** Available agents not already in the room (by target id) — the "Add" picker options. */
97
107
  get availableToAdd(): {
98
108
  ID: string;
@@ -213,6 +223,15 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
213
223
  AddAgent(): Promise<void>;
214
224
  /** Removes an agent from the room — stops its bridge and drops it from the roster. */
215
225
  RemoveAgent(agent: AgentInRoom): Promise<void>;
226
+ /**
227
+ * **End meeting** (the Zoom/Teams "End for all", reached from the control-bar leave menu): tears down EVERY
228
+ * agent in the room server-side — *by room name*, so it works even when this client only **joined** the room
229
+ * and never tracked the bridge ids locally — then disconnects the local user. Contrast with **Leave** (the
230
+ * other menu item → {@link LiveKitRoomComponent.Leave}), which only disconnects YOU and lets the meeting
231
+ * continue; the server then auto-leaves the agents once the last human is gone, so neither path strands
232
+ * billable agent sessions in an empty room.
233
+ */
234
+ EndMeeting(): Promise<void>;
216
235
  /**
217
236
  * Builds the shareable invite URL for THIS room: the current page URL with a `room=<roomName>` query
218
237
  * param. Opening it lands the invitee on the Live Room in join mode for the same room.
@@ -227,6 +246,6 @@ export declare class MJLiveKitRoomComponent extends BaseAngularComponent impleme
227
246
  /** Records a failure and emits an error event. */
228
247
  private fail;
229
248
  static ɵfac: i0.ɵɵFactoryDeclaration<MJLiveKitRoomComponent, never>;
230
- static ɵcmp: i0.ɵɵComponentDeclaration<MJLiveKitRoomComponent, "mj-livekit-agent-room", never, { "Mode": { "alias": "Mode"; "required": false; }; "AgentID": { "alias": "AgentID"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; "TargetAgentID": { "alias": "TargetAgentID"; "required": false; }; "RoomName": { "alias": "RoomName"; "required": false; }; "DisplayName": { "alias": "DisplayName"; "required": false; }; "TurnMode": { "alias": "TurnMode"; "required": false; }; "AutoStart": { "alias": "AutoStart"; "required": false; }; "EnableAgentManagement": { "alias": "EnableAgentManagement"; "required": false; }; "EnableInvite": { "alias": "EnableInvite"; "required": false; }; "AvailableAgents": { "alias": "AvailableAgents"; "required": false; }; "RealtimeModelID": { "alias": "RealtimeModelID"; "required": false; }; "RealtimeVoice": { "alias": "RealtimeVoice"; "required": false; }; "CanPickModelVoice": { "alias": "CanPickModelVoice"; "required": false; }; "AvailableModels": { "alias": "AvailableModels"; "required": false; }; "Layout": { "alias": "Layout"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "ShowHeader": { "alias": "ShowHeader"; "required": false; }; "ShowControlBar": { "alias": "ShowControlBar"; "required": false; }; "ShowChat": { "alias": "ShowChat"; "required": false; }; "ShowParticipantsPanel": { "alias": "ShowParticipantsPanel"; "required": false; }; "EnableMicrophoneControl": { "alias": "EnableMicrophoneControl"; "required": false; }; "EnableCameraControl": { "alias": "EnableCameraControl"; "required": false; }; "EnableScreenShareControl": { "alias": "EnableScreenShareControl"; "required": false; }; "EnableDeviceSettings": { "alias": "EnableDeviceSettings"; "required": false; }; "EnableLeaveControl": { "alias": "EnableLeaveControl"; "required": false; }; "StartWithMicrophone": { "alias": "StartWithMicrophone"; "required": false; }; "StartWithCamera": { "alias": "StartWithCamera"; "required": false; }; "AgentAvatarUrl": { "alias": "AgentAvatarUrl"; "required": false; }; "EnablePinning": { "alias": "EnablePinning"; "required": false; }; "EnableLayoutSwitcher": { "alias": "EnableLayoutSwitcher"; "required": false; }; "EnableNoiseFilter": { "alias": "EnableNoiseFilter"; "required": false; }; "EnableBackgroundEffects": { "alias": "EnableBackgroundEffects"; "required": false; }; "ShowAgentState": { "alias": "ShowAgentState"; "required": false; }; "ShowWhiteboard": { "alias": "ShowWhiteboard"; "required": false; }; "ShowPreJoin": { "alias": "ShowPreJoin"; "required": false; }; "EnableRecording": { "alias": "EnableRecording"; "required": false; }; "E2EEPassphrase": { "alias": "E2EEPassphrase"; "required": false; }; "E2EEWorker": { "alias": "E2EEWorker"; "required": false; }; "ConnectTimeoutMs": { "alias": "ConnectTimeoutMs"; "required": false; }; }, { "SessionStarted": "SessionStarted"; "InvitePeopleRequested": "InvitePeopleRequested"; "Connected": "Connected"; "Disconnected": "Disconnected"; "ParticipantJoined": "ParticipantJoined"; "ParticipantLeft": "ParticipantLeft"; "DataReceived": "DataReceived"; "ErrorOccurred": "ErrorOccurred"; }, never, never, true, never>;
249
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJLiveKitRoomComponent, "mj-livekit-agent-room", never, { "Mode": { "alias": "Mode"; "required": false; }; "AgentID": { "alias": "AgentID"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; "TargetAgentID": { "alias": "TargetAgentID"; "required": false; }; "RoomName": { "alias": "RoomName"; "required": false; }; "DisplayName": { "alias": "DisplayName"; "required": false; }; "TurnMode": { "alias": "TurnMode"; "required": false; }; "AutoStart": { "alias": "AutoStart"; "required": false; }; "EnableAgentManagement": { "alias": "EnableAgentManagement"; "required": false; }; "EnableInvite": { "alias": "EnableInvite"; "required": false; }; "EnableEndForAll": { "alias": "EnableEndForAll"; "required": false; }; "AvailableAgents": { "alias": "AvailableAgents"; "required": false; }; "RealtimeModelID": { "alias": "RealtimeModelID"; "required": false; }; "RealtimeVoice": { "alias": "RealtimeVoice"; "required": false; }; "CanPickModelVoice": { "alias": "CanPickModelVoice"; "required": false; }; "AvailableModels": { "alias": "AvailableModels"; "required": false; }; "Layout": { "alias": "Layout"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "ShowHeader": { "alias": "ShowHeader"; "required": false; }; "ShowControlBar": { "alias": "ShowControlBar"; "required": false; }; "ShowChat": { "alias": "ShowChat"; "required": false; }; "ShowParticipantsPanel": { "alias": "ShowParticipantsPanel"; "required": false; }; "EnableMicrophoneControl": { "alias": "EnableMicrophoneControl"; "required": false; }; "EnableCameraControl": { "alias": "EnableCameraControl"; "required": false; }; "EnableScreenShareControl": { "alias": "EnableScreenShareControl"; "required": false; }; "EnableDeviceSettings": { "alias": "EnableDeviceSettings"; "required": false; }; "EnableLeaveControl": { "alias": "EnableLeaveControl"; "required": false; }; "StartWithMicrophone": { "alias": "StartWithMicrophone"; "required": false; }; "StartWithCamera": { "alias": "StartWithCamera"; "required": false; }; "AgentAvatarUrl": { "alias": "AgentAvatarUrl"; "required": false; }; "EnablePinning": { "alias": "EnablePinning"; "required": false; }; "EnableLayoutSwitcher": { "alias": "EnableLayoutSwitcher"; "required": false; }; "EnableNoiseFilter": { "alias": "EnableNoiseFilter"; "required": false; }; "EnableBackgroundEffects": { "alias": "EnableBackgroundEffects"; "required": false; }; "ShowAgentState": { "alias": "ShowAgentState"; "required": false; }; "ShowWhiteboard": { "alias": "ShowWhiteboard"; "required": false; }; "ShowPreJoin": { "alias": "ShowPreJoin"; "required": false; }; "EnableRecording": { "alias": "EnableRecording"; "required": false; }; "E2EEPassphrase": { "alias": "E2EEPassphrase"; "required": false; }; "E2EEWorker": { "alias": "E2EEWorker"; "required": false; }; "ConnectTimeoutMs": { "alias": "ConnectTimeoutMs"; "required": false; }; }, { "SessionStarted": "SessionStarted"; "InvitePeopleRequested": "InvitePeopleRequested"; "Connected": "Connected"; "Disconnected": "Disconnected"; "ParticipantJoined": "ParticipantJoined"; "ParticipantLeft": "ParticipantLeft"; "DataReceived": "DataReceived"; "ErrorOccurred": "ErrorOccurred"; }, never, never, true, never>;
231
250
  }
232
251
  //# sourceMappingURL=mj-livekit-room.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mj-livekit-room.component.d.ts","sourceRoot":"","sources":["../../src/lib/mj-livekit-room.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mj-livekit-room.component.d.ts","sourceRoot":"","sources":["../../src/lib/mj-livekit-room.component.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, inject } from '@angular/core';
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewChild, inject } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
4
  import { GraphQLLiveKitClient } from '@memberjunction/graphql-dataprovider';
@@ -211,14 +211,14 @@ function MJLiveKitRoomComponent_Conditional_2_Conditional_2_Template(rf, ctx) {
211
211
  function MJLiveKitRoomComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
212
212
  const _r3 = i0.ɵɵgetCurrentView();
213
213
  i0.ɵɵelementStart(0, "div", 2)(1, "mj-livekit-room", 6);
214
- i0.ɵɵlistener("Connected", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_Connected_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Connected.emit($event)); })("Disconnected", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_Disconnected_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Disconnected.emit($event)); })("ParticipantJoined", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ParticipantJoined_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ParticipantJoined.emit($event)); })("ParticipantLeft", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ParticipantLeft_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ParticipantLeft.emit($event)); })("DataReceived", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_DataReceived_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.DataReceived.emit($event)); })("ToggleRecording", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ToggleRecording_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onToggleRecording()); })("ErrorOccurred", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ErrorOccurred_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ErrorOccurred.emit($event)); });
214
+ i0.ɵɵlistener("Connected", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_Connected_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Connected.emit($event)); })("Disconnected", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_Disconnected_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.Disconnected.emit($event)); })("EndForAll", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_EndForAll_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.EndMeeting()); })("ParticipantJoined", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ParticipantJoined_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ParticipantJoined.emit($event)); })("ParticipantLeft", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ParticipantLeft_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ParticipantLeft.emit($event)); })("DataReceived", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_DataReceived_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.DataReceived.emit($event)); })("ToggleRecording", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ToggleRecording_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onToggleRecording()); })("ErrorOccurred", function MJLiveKitRoomComponent_Conditional_2_Template_mj_livekit_room_ErrorOccurred_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ErrorOccurred.emit($event)); });
215
215
  i0.ɵɵelementEnd();
216
216
  i0.ɵɵconditionalCreate(2, MJLiveKitRoomComponent_Conditional_2_Conditional_2_Template, 7, 3, "div", 7);
217
217
  i0.ɵɵelementEnd();
218
218
  } if (rf & 2) {
219
219
  const ctx_r0 = i0.ɵɵnextContext();
220
220
  i0.ɵɵadvance();
221
- i0.ɵɵproperty("ServerUrl", ctx_r0.serverUrl)("Token", ctx_r0.token)("DisplayName", ctx_r0.resolvedDisplayName)("AutoConnect", true)("StartWithMicrophone", ctx_r0.StartWithMicrophone)("StartWithCamera", ctx_r0.StartWithCamera)("Layout", ctx_r0.Layout)("Title", ctx_r0.Title)("ShowHeader", ctx_r0.ShowHeader)("ShowControlBar", ctx_r0.ShowControlBar)("ShowChat", ctx_r0.ShowChat)("ShowParticipantsPanel", ctx_r0.ShowParticipantsPanel)("EnableMicrophoneControl", ctx_r0.EnableMicrophoneControl)("EnableCameraControl", ctx_r0.EnableCameraControl)("EnableScreenShareControl", ctx_r0.EnableScreenShareControl)("EnableDeviceSettings", ctx_r0.EnableDeviceSettings)("EnableLeaveControl", ctx_r0.EnableLeaveControl)("EnablePinning", ctx_r0.EnablePinning)("EnableLayoutSwitcher", ctx_r0.EnableLayoutSwitcher)("EnableNoiseFilter", ctx_r0.EnableNoiseFilter)("EnableBackgroundEffects", ctx_r0.EnableBackgroundEffects)("ShowAgentState", ctx_r0.ShowAgentState)("ShowWhiteboard", ctx_r0.ShowWhiteboard)("ShowPreJoin", ctx_r0.ShowPreJoin)("ShowRecordingControl", ctx_r0.EnableRecording)("IsRecording", ctx_r0.isRecording)("E2EEPassphrase", ctx_r0.E2EEPassphrase)("E2EEWorker", ctx_r0.E2EEWorker)("AgentAvatarUrl", ctx_r0.AgentAvatarUrl);
221
+ i0.ɵɵproperty("ServerUrl", ctx_r0.serverUrl)("Token", ctx_r0.token)("DisplayName", ctx_r0.resolvedDisplayName)("AutoConnect", true)("StartWithMicrophone", ctx_r0.StartWithMicrophone)("StartWithCamera", ctx_r0.StartWithCamera)("Layout", ctx_r0.Layout)("Title", ctx_r0.Title)("ShowHeader", ctx_r0.ShowHeader)("ShowControlBar", ctx_r0.ShowControlBar)("ShowChat", ctx_r0.ShowChat)("ShowParticipantsPanel", ctx_r0.ShowParticipantsPanel)("EnableMicrophoneControl", ctx_r0.EnableMicrophoneControl)("EnableCameraControl", ctx_r0.EnableCameraControl)("EnableScreenShareControl", ctx_r0.EnableScreenShareControl)("EnableDeviceSettings", ctx_r0.EnableDeviceSettings)("EnableLeaveControl", ctx_r0.EnableLeaveControl)("EnablePinning", ctx_r0.EnablePinning)("EnableLayoutSwitcher", ctx_r0.EnableLayoutSwitcher)("EnableNoiseFilter", ctx_r0.EnableNoiseFilter)("EnableBackgroundEffects", ctx_r0.EnableBackgroundEffects)("ShowAgentState", ctx_r0.ShowAgentState)("ShowWhiteboard", ctx_r0.ShowWhiteboard)("ShowPreJoin", ctx_r0.ShowPreJoin)("ShowRecordingControl", ctx_r0.EnableRecording)("IsRecording", ctx_r0.isRecording)("E2EEPassphrase", ctx_r0.E2EEPassphrase)("E2EEWorker", ctx_r0.E2EEWorker)("AgentAvatarUrl", ctx_r0.AgentAvatarUrl)("CanEndForAll", ctx_r0.EnableEndForAll && !!ctx_r0.resolvedRoomName);
222
222
  i0.ɵɵadvance();
223
223
  i0.ɵɵconditional(ctx_r0.Mode === "agent" && ctx_r0.EnableAgentManagement && ctx_r0.resolvedRoomName ? 2 : -1);
224
224
  } }
@@ -257,6 +257,12 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
257
257
  EnableAgentManagement = true;
258
258
  /** Show the "Invite" pill that copies a join link to this room. */
259
259
  EnableInvite = true;
260
+ /**
261
+ * Offer "End meeting for everyone" in the control bar's Zoom-style leave menu. When on (default) and a
262
+ * room is resolved, ending tears down every agent in the room server-side (by name — so it works even
263
+ * when this client only *joined*). Set `false` for contexts where only the local user should ever leave.
264
+ */
265
+ EnableEndForAll = true;
260
266
  /** Target agents the user can ADD in-room (id + name). The host (e.g. the Explorer resource) supplies these. */
261
267
  AvailableAgents = [];
262
268
  /** Per-session Realtime MODEL override for the INITIAL agent (from the host's pre-join picker). */
@@ -289,6 +295,10 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
289
295
  addingAgent = false;
290
296
  /** Last add error, shown under the picker. */
291
297
  addError = null;
298
+ /** True while an "End meeting" (stop all agents + leave) is in flight. */
299
+ endingMeeting = false;
300
+ /** The inner Generic room — used to trigger the local disconnect when ending/leaving the meeting. */
301
+ roomComponent;
292
302
  /** Available agents not already in the room (by target id) — the "Add" picker options. */
293
303
  get availableToAdd() {
294
304
  const present = new Set(this.agentsInRoom.map((a) => (a.TargetAgentID ?? '').toLowerCase()));
@@ -541,6 +551,36 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
541
551
  this.cdr.markForCheck();
542
552
  }
543
553
  }
554
+ /**
555
+ * **End meeting** (the Zoom/Teams "End for all", reached from the control-bar leave menu): tears down EVERY
556
+ * agent in the room server-side — *by room name*, so it works even when this client only **joined** the room
557
+ * and never tracked the bridge ids locally — then disconnects the local user. Contrast with **Leave** (the
558
+ * other menu item → {@link LiveKitRoomComponent.Leave}), which only disconnects YOU and lets the meeting
559
+ * continue; the server then auto-leaves the agents once the last human is gone, so neither path strands
560
+ * billable agent sessions in an empty room.
561
+ */
562
+ async EndMeeting() {
563
+ if (this.endingMeeting) {
564
+ return;
565
+ }
566
+ this.endingMeeting = true;
567
+ this.cdr.markForCheck();
568
+ try {
569
+ if (this.resolvedRoomName) {
570
+ const client = new GraphQLLiveKitClient(this.ProviderToUse);
571
+ await client.EndRoom(this.resolvedRoomName);
572
+ }
573
+ this.agentsInRoom = [];
574
+ }
575
+ catch {
576
+ /* best-effort — fall through and still disconnect the local user */
577
+ }
578
+ finally {
579
+ await this.roomComponent?.Leave();
580
+ this.endingMeeting = false;
581
+ this.cdr.markForCheck();
582
+ }
583
+ }
544
584
  /**
545
585
  * Builds the shareable invite URL for THIS room: the current page URL with a `room=<roomName>` query
546
586
  * param. Opening it lands the invitee on the Live Room in join mode for the same room.
@@ -612,8 +652,13 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
612
652
  this.ErrorOccurred.emit({ Kind: 'connect', Message: message });
613
653
  }
614
654
  static ɵfac = /*@__PURE__*/ (() => { let ɵMJLiveKitRoomComponent_BaseFactory; return function MJLiveKitRoomComponent_Factory(__ngFactoryType__) { return (ɵMJLiveKitRoomComponent_BaseFactory || (ɵMJLiveKitRoomComponent_BaseFactory = i0.ɵɵgetInheritedFactory(MJLiveKitRoomComponent)))(__ngFactoryType__ || MJLiveKitRoomComponent); }; })();
615
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJLiveKitRoomComponent, selectors: [["mj-livekit-agent-room"]], inputs: { Mode: "Mode", AgentID: "AgentID", AgentName: "AgentName", TargetAgentID: "TargetAgentID", RoomName: "RoomName", DisplayName: "DisplayName", TurnMode: "TurnMode", AutoStart: "AutoStart", EnableAgentManagement: "EnableAgentManagement", EnableInvite: "EnableInvite", AvailableAgents: "AvailableAgents", RealtimeModelID: "RealtimeModelID", RealtimeVoice: "RealtimeVoice", CanPickModelVoice: "CanPickModelVoice", AvailableModels: "AvailableModels", Layout: "Layout", Title: "Title", ShowHeader: "ShowHeader", ShowControlBar: "ShowControlBar", ShowChat: "ShowChat", ShowParticipantsPanel: "ShowParticipantsPanel", EnableMicrophoneControl: "EnableMicrophoneControl", EnableCameraControl: "EnableCameraControl", EnableScreenShareControl: "EnableScreenShareControl", EnableDeviceSettings: "EnableDeviceSettings", EnableLeaveControl: "EnableLeaveControl", StartWithMicrophone: "StartWithMicrophone", StartWithCamera: "StartWithCamera", AgentAvatarUrl: "AgentAvatarUrl", EnablePinning: "EnablePinning", EnableLayoutSwitcher: "EnableLayoutSwitcher", EnableNoiseFilter: "EnableNoiseFilter", EnableBackgroundEffects: "EnableBackgroundEffects", ShowAgentState: "ShowAgentState", ShowWhiteboard: "ShowWhiteboard", ShowPreJoin: "ShowPreJoin", EnableRecording: "EnableRecording", E2EEPassphrase: "E2EEPassphrase", E2EEWorker: "E2EEWorker", ConnectTimeoutMs: "ConnectTimeoutMs" }, outputs: { SessionStarted: "SessionStarted", InvitePeopleRequested: "InvitePeopleRequested", Connected: "Connected", Disconnected: "Disconnected", ParticipantJoined: "ParticipantJoined", ParticipantLeft: "ParticipantLeft", DataReceived: "DataReceived", ErrorOccurred: "ErrorOccurred" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "mj-lk-status"], [1, "mj-lk-status", "mj-lk-status--error"], [1, "mj-lk-room-wrap"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-triangle-exclamation"], ["type", "button", 1, "mj-lk-retry", 3, "click"], [3, "Connected", "Disconnected", "ParticipantJoined", "ParticipantLeft", "DataReceived", "ToggleRecording", "ErrorOccurred", "ServerUrl", "Token", "DisplayName", "AutoConnect", "StartWithMicrophone", "StartWithCamera", "Layout", "Title", "ShowHeader", "ShowControlBar", "ShowChat", "ShowParticipantsPanel", "EnableMicrophoneControl", "EnableCameraControl", "EnableScreenShareControl", "EnableDeviceSettings", "EnableLeaveControl", "EnablePinning", "EnableLayoutSwitcher", "EnableNoiseFilter", "EnableBackgroundEffects", "ShowAgentState", "ShowWhiteboard", "ShowPreJoin", "ShowRecordingControl", "IsRecording", "E2EEPassphrase", "E2EEWorker", "AgentAvatarUrl"], [1, "mj-lk-agents"], [1, "mj-lk-agents__panel"], [1, "mj-lk-agents__pills"], ["type", "button", 1, "mj-lk-agents__toggle", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "mj-lk-agents__head"], [1, "mj-lk-agents__row"], [1, "mj-lk-agents__error"], [1, "mj-lk-agents__name"], ["type", "button", "title", "Remove agent", 1, "mj-lk-agents__remove", 3, "click", "disabled"], [1, "fa-solid"], [1, "mj-lk-agents__add"], [1, "mj-input", "mj-lk-agents__select", 3, "change"], ["value", ""], [3, "value", "selected"], ["type", "button", 1, "mj-lk-agents__addbtn", 3, "click", "disabled"], [1, "mj-lk-agents__overrides"], ["title", "Model (dev override)", 1, "mj-input", "mj-lk-agents__select", "mj-lk-agents__select--sm", 3, "change"], ["title", "Voice (dev override)", 1, "mj-input", "mj-lk-agents__select", "mj-lk-agents__select--sm"], ["title", "Voice (dev override)", 1, "mj-input", "mj-lk-agents__select", "mj-lk-agents__select--sm", 3, "change"], ["type", "button", "title", "Copy a link to invite someone to this room", 1, "mj-lk-agents__toggle", 3, "click"], ["type", "button", "title", "Invite people from this workspace", 1, "mj-lk-agents__toggle", 3, "click"], [1, "fa-solid", "fa-user-plus"]], template: function MJLiveKitRoomComponent_Template(rf, ctx) { if (rf & 1) {
616
- i0.ɵɵconditionalCreate(0, MJLiveKitRoomComponent_Conditional_0_Template, 4, 1, "div", 0)(1, MJLiveKitRoomComponent_Conditional_1_Template, 6, 1, "div", 1)(2, MJLiveKitRoomComponent_Conditional_2_Template, 3, 30, "div", 2);
655
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJLiveKitRoomComponent, selectors: [["mj-livekit-agent-room"]], viewQuery: function MJLiveKitRoomComponent_Query(rf, ctx) { if (rf & 1) {
656
+ i0.ɵɵviewQuery(LiveKitRoomComponent, 5);
657
+ } if (rf & 2) {
658
+ let _t;
659
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.roomComponent = _t.first);
660
+ } }, inputs: { Mode: "Mode", AgentID: "AgentID", AgentName: "AgentName", TargetAgentID: "TargetAgentID", RoomName: "RoomName", DisplayName: "DisplayName", TurnMode: "TurnMode", AutoStart: "AutoStart", EnableAgentManagement: "EnableAgentManagement", EnableInvite: "EnableInvite", EnableEndForAll: "EnableEndForAll", AvailableAgents: "AvailableAgents", RealtimeModelID: "RealtimeModelID", RealtimeVoice: "RealtimeVoice", CanPickModelVoice: "CanPickModelVoice", AvailableModels: "AvailableModels", Layout: "Layout", Title: "Title", ShowHeader: "ShowHeader", ShowControlBar: "ShowControlBar", ShowChat: "ShowChat", ShowParticipantsPanel: "ShowParticipantsPanel", EnableMicrophoneControl: "EnableMicrophoneControl", EnableCameraControl: "EnableCameraControl", EnableScreenShareControl: "EnableScreenShareControl", EnableDeviceSettings: "EnableDeviceSettings", EnableLeaveControl: "EnableLeaveControl", StartWithMicrophone: "StartWithMicrophone", StartWithCamera: "StartWithCamera", AgentAvatarUrl: "AgentAvatarUrl", EnablePinning: "EnablePinning", EnableLayoutSwitcher: "EnableLayoutSwitcher", EnableNoiseFilter: "EnableNoiseFilter", EnableBackgroundEffects: "EnableBackgroundEffects", ShowAgentState: "ShowAgentState", ShowWhiteboard: "ShowWhiteboard", ShowPreJoin: "ShowPreJoin", EnableRecording: "EnableRecording", E2EEPassphrase: "E2EEPassphrase", E2EEWorker: "E2EEWorker", ConnectTimeoutMs: "ConnectTimeoutMs" }, outputs: { SessionStarted: "SessionStarted", InvitePeopleRequested: "InvitePeopleRequested", Connected: "Connected", Disconnected: "Disconnected", ParticipantJoined: "ParticipantJoined", ParticipantLeft: "ParticipantLeft", DataReceived: "DataReceived", ErrorOccurred: "ErrorOccurred" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "mj-lk-status"], [1, "mj-lk-status", "mj-lk-status--error"], [1, "mj-lk-room-wrap"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-triangle-exclamation"], ["type", "button", 1, "mj-lk-retry", 3, "click"], [3, "Connected", "Disconnected", "EndForAll", "ParticipantJoined", "ParticipantLeft", "DataReceived", "ToggleRecording", "ErrorOccurred", "ServerUrl", "Token", "DisplayName", "AutoConnect", "StartWithMicrophone", "StartWithCamera", "Layout", "Title", "ShowHeader", "ShowControlBar", "ShowChat", "ShowParticipantsPanel", "EnableMicrophoneControl", "EnableCameraControl", "EnableScreenShareControl", "EnableDeviceSettings", "EnableLeaveControl", "EnablePinning", "EnableLayoutSwitcher", "EnableNoiseFilter", "EnableBackgroundEffects", "ShowAgentState", "ShowWhiteboard", "ShowPreJoin", "ShowRecordingControl", "IsRecording", "E2EEPassphrase", "E2EEWorker", "AgentAvatarUrl", "CanEndForAll"], [1, "mj-lk-agents"], [1, "mj-lk-agents__panel"], [1, "mj-lk-agents__pills"], ["type", "button", 1, "mj-lk-agents__toggle", 3, "click"], [1, "fa-solid", "fa-robot"], [1, "mj-lk-agents__head"], [1, "mj-lk-agents__row"], [1, "mj-lk-agents__error"], [1, "mj-lk-agents__name"], ["type", "button", "title", "Remove agent", 1, "mj-lk-agents__remove", 3, "click", "disabled"], [1, "fa-solid"], [1, "mj-lk-agents__add"], [1, "mj-input", "mj-lk-agents__select", 3, "change"], ["value", ""], [3, "value", "selected"], ["type", "button", 1, "mj-lk-agents__addbtn", 3, "click", "disabled"], [1, "mj-lk-agents__overrides"], ["title", "Model (dev override)", 1, "mj-input", "mj-lk-agents__select", "mj-lk-agents__select--sm", 3, "change"], ["title", "Voice (dev override)", 1, "mj-input", "mj-lk-agents__select", "mj-lk-agents__select--sm"], ["title", "Voice (dev override)", 1, "mj-input", "mj-lk-agents__select", "mj-lk-agents__select--sm", 3, "change"], ["type", "button", "title", "Copy a link to invite someone to this room", 1, "mj-lk-agents__toggle", 3, "click"], ["type", "button", "title", "Invite people from this workspace", 1, "mj-lk-agents__toggle", 3, "click"], [1, "fa-solid", "fa-user-plus"]], template: function MJLiveKitRoomComponent_Template(rf, ctx) { if (rf & 1) {
661
+ i0.ɵɵconditionalCreate(0, MJLiveKitRoomComponent_Conditional_0_Template, 4, 1, "div", 0)(1, MJLiveKitRoomComponent_Conditional_1_Template, 6, 1, "div", 1)(2, MJLiveKitRoomComponent_Conditional_2_Template, 3, 31, "div", 2);
617
662
  } if (rf & 2) {
618
663
  i0.ɵɵconditional(ctx.loading ? 0 : ctx.errorMessage ? 1 : ctx.serverUrl && ctx.token ? 2 : -1);
619
664
  } }, dependencies: [LiveKitRoomComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n width: 100%;\n height: 100%;\n }\n .mj-lk-status[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n height: 100%;\n min-height: 220px;\n color: var(--mj-text-secondary, #475569);\n background: var(--mj-bg-surface-card, #f1f5f9);\n border-radius: 12px;\n }\n .mj-lk-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.6rem;\n color: var(--mj-brand-primary, #0076b6);\n }\n .mj-lk-status--error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error, #ef4444);\n }\n .mj-lk-retry[_ngcontent-%COMP%] {\n padding: 7px 16px;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-inverse, #fff);\n background: var(--mj-brand-primary, #0076b6);\n }\n .mj-lk-room-wrap[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .mj-lk-agents[_ngcontent-%COMP%] {\n position: absolute;\n left: 16px;\n bottom: 84px;\n z-index: 40;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n .mj-lk-agents__pills[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n }\n .mj-lk-agents__toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n box-shadow: var(--mj-shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.18));\n }\n .mj-lk-agents__panel[_ngcontent-%COMP%] {\n width: 260px;\n padding: 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n box-shadow: var(--mj-shadow-md, 0 6px 20px rgba(0, 0, 0, 0.25));\n }\n .mj-lk-agents__head[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n .mj-lk-agents__row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 5px 0;\n }\n .mj-lk-agents__name[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mj-lk-agents__name[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n }\n .mj-lk-agents__remove[_ngcontent-%COMP%] {\n flex: none;\n width: 26px;\n height: 26px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n background: transparent;\n }\n .mj-lk-agents__remove[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: var(--mj-status-error);\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-agents__add[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n }\n .mj-lk-agents__select[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n font-size: 0.8125rem;\n }\n .mj-lk-agents__overrides[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n margin-top: 6px;\n }\n .mj-lk-agents__select--sm[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n }\n .mj-lk-agents__addbtn[_ngcontent-%COMP%] {\n flex: none;\n width: 32px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n }\n .mj-lk-agents__addbtn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-agents__error[_ngcontent-%COMP%] {\n margin-top: 6px;\n font-size: 0.75rem;\n color: var(--mj-status-error-text, var(--mj-status-error));\n }"], changeDetection: 0 });
@@ -664,8 +709,10 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
664
709
  [E2EEPassphrase]="E2EEPassphrase"
665
710
  [E2EEWorker]="E2EEWorker"
666
711
  [AgentAvatarUrl]="AgentAvatarUrl"
712
+ [CanEndForAll]="EnableEndForAll && !!resolvedRoomName"
667
713
  (Connected)="Connected.emit($event)"
668
714
  (Disconnected)="Disconnected.emit($event)"
715
+ (EndForAll)="EndMeeting()"
669
716
  (ParticipantJoined)="ParticipantJoined.emit($event)"
670
717
  (ParticipantLeft)="ParticipantLeft.emit($event)"
671
718
  (DataReceived)="DataReceived.emit($event)"
@@ -764,6 +811,8 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
764
811
  type: Input
765
812
  }], EnableInvite: [{
766
813
  type: Input
814
+ }], EnableEndForAll: [{
815
+ type: Input
767
816
  }], AvailableAgents: [{
768
817
  type: Input
769
818
  }], RealtimeModelID: [{
@@ -774,6 +823,9 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
774
823
  type: Input
775
824
  }], AvailableModels: [{
776
825
  type: Input
826
+ }], roomComponent: [{
827
+ type: ViewChild,
828
+ args: [LiveKitRoomComponent]
777
829
  }], Layout: [{
778
830
  type: Input
779
831
  }], Title: [{
@@ -841,5 +893,5 @@ export class MJLiveKitRoomComponent extends BaseAngularComponent {
841
893
  }], ConnectTimeoutMs: [{
842
894
  type: Input
843
895
  }] }); })();
844
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJLiveKitRoomComponent, { className: "MJLiveKitRoomComponent", filePath: "src/lib/mj-livekit-room.component.ts", lineNumber: 331 }); })();
896
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJLiveKitRoomComponent, { className: "MJLiveKitRoomComponent", filePath: "src/lib/mj-livekit-room.component.ts", lineNumber: 333 }); })();
845
897
  //# sourceMappingURL=mj-livekit-room.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mj-livekit-room.component.js","sourceRoot":"","sources":["../../src/lib/mj-livekit-room.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GraphQLDataProvider, GraphQLLiveKitClient, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';\nimport { LiveKitRoomComponent, type LiveKitRoomLayout } from '@memberjunction/ng-livekit-room';\nimport type {\n LiveKitDataMessage,\n LiveKitDisconnectedEvent,\n LiveKitParticipantJoinedEvent,\n LiveKitParticipantLeftEvent,\n LiveKitRoomError,\n LiveKitRoomState,\n} from '@memberjunction/livekit-room-core';\n\n/** How the MJ binding obtains its room: start an agent in a room, or just join an existing room. */\nexport type MJLiveKitConnectionMode = 'agent' | 'join';\n\n/** Emitted when an agent room session has been started server-side. */\nexport interface MJLiveKitSessionStartedEvent {\n /** The durable bridge-session row id. */\n SessionBridgeID: string;\n /** The room name. */\n RoomName: string;\n}\n\n/** One agent bot bridged into the room — tracked for the in-room add/remove roster. */\nexport interface AgentInRoom {\n /** The `MJ: AI Agent Session Bridges` row id (used to stop/remove this agent). */\n SessionBridgeID: string;\n /** The target agent this bot voices, when known. */\n TargetAgentID: string | null;\n /** Display name (the target agent's name). */\n Name: string;\n /** True while a remove request is in flight. */\n Removing?: boolean;\n}\n\n/**\n * `mj-livekit-agent-room` — the MemberJunction binding for the LiveKit room UI. It resolves a scoped\n * access token (and, in `'agent'` mode, starts the agent's presence in the room) via the RealtimeBridge\n * GraphQL surface, then renders {@link LiveKitRoomComponent} with the resolved connection. All the rich\n * feature gates of the generic component are forwarded; MJ user/provider context is threaded in.\n *\n * Public members are PascalCase (MJ convention); private members are camelCase.\n */\n@Component({\n selector: 'mj-livekit-agent-room',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LiveKitRoomComponent],\n template: `\n @if (loading) {\n <div class=\"mj-lk-status\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>{{ Mode === 'agent' ? 'Starting agent session…' : 'Joining room…' }}</span>\n </div>\n } @else if (errorMessage) {\n <div class=\"mj-lk-status mj-lk-status--error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ errorMessage }}</span>\n <button type=\"button\" class=\"mj-lk-retry\" (click)=\"Start()\">Try again</button>\n </div>\n } @else if (serverUrl && token) {\n <div class=\"mj-lk-room-wrap\">\n <mj-livekit-room\n [ServerUrl]=\"serverUrl\"\n [Token]=\"token\"\n [DisplayName]=\"resolvedDisplayName\"\n [AutoConnect]=\"true\"\n [StartWithMicrophone]=\"StartWithMicrophone\"\n [StartWithCamera]=\"StartWithCamera\"\n [Layout]=\"Layout\"\n [Title]=\"Title\"\n [ShowHeader]=\"ShowHeader\"\n [ShowControlBar]=\"ShowControlBar\"\n [ShowChat]=\"ShowChat\"\n [ShowParticipantsPanel]=\"ShowParticipantsPanel\"\n [EnableMicrophoneControl]=\"EnableMicrophoneControl\"\n [EnableCameraControl]=\"EnableCameraControl\"\n [EnableScreenShareControl]=\"EnableScreenShareControl\"\n [EnableDeviceSettings]=\"EnableDeviceSettings\"\n [EnableLeaveControl]=\"EnableLeaveControl\"\n [EnablePinning]=\"EnablePinning\"\n [EnableLayoutSwitcher]=\"EnableLayoutSwitcher\"\n [EnableNoiseFilter]=\"EnableNoiseFilter\"\n [EnableBackgroundEffects]=\"EnableBackgroundEffects\"\n [ShowAgentState]=\"ShowAgentState\"\n [ShowWhiteboard]=\"ShowWhiteboard\"\n [ShowPreJoin]=\"ShowPreJoin\"\n [ShowRecordingControl]=\"EnableRecording\"\n [IsRecording]=\"isRecording\"\n [E2EEPassphrase]=\"E2EEPassphrase\"\n [E2EEWorker]=\"E2EEWorker\"\n [AgentAvatarUrl]=\"AgentAvatarUrl\"\n (Connected)=\"Connected.emit($event)\"\n (Disconnected)=\"Disconnected.emit($event)\"\n (ParticipantJoined)=\"ParticipantJoined.emit($event)\"\n (ParticipantLeft)=\"ParticipantLeft.emit($event)\"\n (DataReceived)=\"DataReceived.emit($event)\"\n (ToggleRecording)=\"onToggleRecording()\"\n (ErrorOccurred)=\"ErrorOccurred.emit($event)\"\n ></mj-livekit-room>\n\n @if (Mode === 'agent' && EnableAgentManagement && resolvedRoomName) {\n <div class=\"mj-lk-agents\">\n @if (showAgentsPanel) {\n <div class=\"mj-lk-agents__panel\">\n <div class=\"mj-lk-agents__head\">In this room</div>\n @for (a of agentsInRoom; track a.SessionBridgeID) {\n <div class=\"mj-lk-agents__row\">\n <span class=\"mj-lk-agents__name\"><i class=\"fa-solid fa-robot\"></i> {{ a.Name }}</span>\n <button type=\"button\" class=\"mj-lk-agents__remove\" title=\"Remove agent\"\n [disabled]=\"a.Removing\" (click)=\"RemoveAgent(a)\">\n <i class=\"fa-solid\" [class.fa-xmark]=\"!a.Removing\" [class.fa-spinner]=\"a.Removing\" [class.fa-spin]=\"a.Removing\"></i>\n </button>\n </div>\n }\n @if (availableToAdd.length) {\n <div class=\"mj-lk-agents__add\">\n <select class=\"mj-input mj-lk-agents__select\" (change)=\"onAddTargetChange($event)\">\n <option value=\"\">Add an agent…</option>\n @for (a of availableToAdd; track a.ID) {\n <option [value]=\"a.ID\" [selected]=\"UUIDsEqual(a.ID, addTargetId)\">{{ a.Name }}</option>\n }\n </select>\n <button type=\"button\" class=\"mj-lk-agents__addbtn\" [disabled]=\"!addTargetId || addingAgent\" (click)=\"AddAgent()\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!addingAgent\" [class.fa-spinner]=\"addingAgent\" [class.fa-spin]=\"addingAgent\"></i>\n </button>\n </div>\n @if (CanPickModelVoice && AvailableModels.length) {\n <div class=\"mj-lk-agents__overrides\">\n <select class=\"mj-input mj-lk-agents__select mj-lk-agents__select--sm\" (change)=\"onAddModelChange($event)\" title=\"Model (dev override)\">\n <option value=\"\">Default model</option>\n @for (m of AvailableModels; track m.ModelID) {\n <option [value]=\"m.ModelID\" [selected]=\"UUIDsEqual(m.ModelID, addModelId)\">{{ m.ModelName }}</option>\n }\n </select>\n @if (addVoices.length) {\n <select class=\"mj-input mj-lk-agents__select mj-lk-agents__select--sm\" (change)=\"onAddVoiceChange($event)\" title=\"Voice (dev override)\">\n <option value=\"\">Default voice</option>\n @for (v of addVoices; track v.ID) {\n <option [value]=\"v.ID\" [selected]=\"v.ID === addVoice\">{{ v.Name }}</option>\n }\n </select>\n }\n </div>\n }\n }\n @if (addError) {\n <div class=\"mj-lk-agents__error\">{{ addError }}</div>\n }\n </div>\n }\n <div class=\"mj-lk-agents__pills\">\n <button type=\"button\" class=\"mj-lk-agents__toggle\" (click)=\"showAgentsPanel = !showAgentsPanel\">\n <i class=\"fa-solid fa-robot\"></i> Agents ({{ agentsInRoom.length }})\n </button>\n @if (EnableInvite) {\n <button type=\"button\" class=\"mj-lk-agents__toggle\" title=\"Copy a link to invite someone to this room\"\n (click)=\"CopyInvite()\">\n <i class=\"fa-solid\" [class.fa-link]=\"!inviteCopied\" [class.fa-check]=\"inviteCopied\"></i>\n {{ inviteCopied ? 'Link copied' : 'Copy link' }}\n </button>\n <button type=\"button\" class=\"mj-lk-agents__toggle\" title=\"Invite people from this workspace\"\n (click)=\"InvitePeopleRequested.emit(resolvedRoomName)\">\n <i class=\"fa-solid fa-user-plus\"></i> Invite people\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .mj-lk-status {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n height: 100%;\n min-height: 220px;\n color: var(--mj-text-secondary, #475569);\n background: var(--mj-bg-surface-card, #f1f5f9);\n border-radius: 12px;\n }\n .mj-lk-status i {\n font-size: 1.6rem;\n color: var(--mj-brand-primary, #0076b6);\n }\n .mj-lk-status--error i {\n color: var(--mj-status-error, #ef4444);\n }\n .mj-lk-retry {\n padding: 7px 16px;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-inverse, #fff);\n background: var(--mj-brand-primary, #0076b6);\n }\n .mj-lk-room-wrap {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .mj-lk-agents {\n position: absolute;\n left: 16px;\n bottom: 84px;\n z-index: 40;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n .mj-lk-agents__pills {\n display: flex;\n gap: 8px;\n }\n .mj-lk-agents__toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n box-shadow: var(--mj-shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.18));\n }\n .mj-lk-agents__panel {\n width: 260px;\n padding: 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n box-shadow: var(--mj-shadow-md, 0 6px 20px rgba(0, 0, 0, 0.25));\n }\n .mj-lk-agents__head {\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n .mj-lk-agents__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 5px 0;\n }\n .mj-lk-agents__name {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mj-lk-agents__name i {\n color: var(--mj-brand-primary);\n }\n .mj-lk-agents__remove {\n flex: none;\n width: 26px;\n height: 26px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n background: transparent;\n }\n .mj-lk-agents__remove:hover:not(:disabled) {\n color: var(--mj-status-error);\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-agents__add {\n display: flex;\n gap: 6px;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n }\n .mj-lk-agents__select {\n flex: 1;\n min-width: 0;\n font-size: 0.8125rem;\n }\n .mj-lk-agents__overrides {\n display: flex;\n gap: 6px;\n margin-top: 6px;\n }\n .mj-lk-agents__select--sm {\n font-size: 0.75rem;\n }\n .mj-lk-agents__addbtn {\n flex: none;\n width: 32px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n }\n .mj-lk-agents__addbtn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-agents__error {\n margin-top: 6px;\n font-size: 0.75rem;\n color: var(--mj-status-error-text, var(--mj-status-error));\n }\n `,\n ],\n})\nexport class MJLiveKitRoomComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ── MJ connection inputs ───────────────────────────────────────────────────────\n /** Whether to start an agent in the room (`'agent'`) or just join an existing room (`'join'`). */\n @Input() public Mode: MJLiveKitConnectionMode = 'agent';\n /** The agent to voice (agent mode) — the Realtime Co-Agent / voice front-end. */\n @Input() public AgentID: string | null = null;\n /** The agent's display name (bot name + addressing). */\n @Input() public AgentName: string | null = null;\n /**\n * The TARGET agent the co-agent voices — the one being \"called\". The Realtime Co-Agent delegates to\n * it via `invoke-target-agent`; without it the agent has nobody to speak for and stays idle.\n */\n @Input() public TargetAgentID: string | null = null;\n /** The room name. Required for `'join'` mode; optional for `'agent'` (server generates one). */\n @Input() public RoomName: string | null = null;\n /** The display name the local user joins as. Defaults to the authenticated user server-side. */\n @Input() public DisplayName: string | null = null;\n /** Turn-taking mode for the agent. */\n @Input() public TurnMode: 'Passive' | 'Active' | 'Hybrid' | null = null;\n /** Resolve the connection automatically on init. */\n @Input() public AutoStart = true;\n\n // ── In-room agent management (agent mode) ─────────────────────────────────────────\n /** Show the in-room \"Agents\" panel to add/remove agents (agent mode only). */\n @Input() public EnableAgentManagement = true;\n /** Show the \"Invite\" pill that copies a join link to this room. */\n @Input() public EnableInvite = true;\n /** Target agents the user can ADD in-room (id + name). The host (e.g. the Explorer resource) supplies these. */\n @Input() public AvailableAgents: { ID: string; Name: string }[] = [];\n\n /** Per-session Realtime MODEL override for the INITIAL agent (from the host's pre-join picker). */\n @Input() public RealtimeModelID: string | null = null;\n /** Per-session VOICE override for the INITIAL agent (from the host's pre-join picker). */\n @Input() public RealtimeVoice: string | null = null;\n /**\n * Whether the dev model/voice pickers are shown in the in-room \"Add an agent\" control. The HOST\n * computes this (the `Realtime: Advanced Session Controls` authorization) and passes it down — this\n * generic component never evaluates authorizations itself.\n */\n @Input() public CanPickModelVoice = false;\n /** Active Realtime models + their voices, supplied by the host (for the add-agent dropdowns). */\n @Input() public AvailableModels: RealtimeModelVoices[] = [];\n\n /** True briefly after the invite link is copied (drives the \"Link copied\" pill state). */\n public inviteCopied = false;\n\n /** Whether the floating agents panel is open. */\n public showAgentsPanel = false;\n /** The agent bots currently bridged into the room (the first is the one started on join). */\n public agentsInRoom: AgentInRoom[] = [];\n /** The target id chosen in the \"Add an agent\" picker. */\n public addTargetId: string | null = null;\n /** The MODEL override chosen in the \"Add an agent\" picker (dev-only; null = co-agent/target default). */\n public addModelId: string | null = null;\n /** The VOICE override chosen in the \"Add an agent\" picker (dev-only; null = co-agent/target default). */\n public addVoice: string | null = null;\n /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */\n public UUIDsEqual = UUIDsEqual;\n /** True while an Add request is in flight. */\n public addingAgent = false;\n /** Last add error, shown under the picker. */\n public addError: string | null = null;\n\n /** Available agents not already in the room (by target id) — the \"Add\" picker options. */\n public get availableToAdd(): { ID: string; Name: string }[] {\n const present = new Set(this.agentsInRoom.map((a) => (a.TargetAgentID ?? '').toLowerCase()));\n return this.AvailableAgents.filter((a) => !present.has(a.ID.toLowerCase()));\n }\n\n /** Voices for the model chosen in the add-agent picker (empty when no model picked or it has none). */\n public get addVoices(): RealtimeVoiceOption[] {\n const model = this.AvailableModels.find((m) => UUIDsEqual(m.ModelID, this.addModelId));\n return model?.Voices ?? [];\n }\n\n /** Records the add-agent MODEL choice; clears the voice so it can't outlive a model switch. */\n public onAddModelChange(event: Event): void {\n this.addModelId = (event.target as HTMLSelectElement).value || null;\n this.addVoice = null;\n }\n\n /** Records the add-agent VOICE choice. */\n public onAddVoiceChange(event: Event): void {\n this.addVoice = (event.target as HTMLSelectElement).value || null;\n }\n\n // ── Forwarded UI gates (see LiveKitRoomComponent) ────────────────────────────────\n /** @see LiveKitRoomComponent.Layout */\n @Input() public Layout: LiveKitRoomLayout = 'grid';\n /** @see LiveKitRoomComponent.Title */\n @Input() public Title: string | null = null;\n /** @see LiveKitRoomComponent.ShowHeader */\n @Input() public ShowHeader = true;\n /** @see LiveKitRoomComponent.ShowControlBar */\n @Input() public ShowControlBar = true;\n /** @see LiveKitRoomComponent.ShowChat */\n @Input() public ShowChat = true;\n /** @see LiveKitRoomComponent.ShowParticipantsPanel */\n @Input() public ShowParticipantsPanel = true;\n /** @see LiveKitRoomComponent.EnableMicrophoneControl */\n @Input() public EnableMicrophoneControl = true;\n /** @see LiveKitRoomComponent.EnableCameraControl */\n @Input() public EnableCameraControl = true;\n /** @see LiveKitRoomComponent.EnableScreenShareControl */\n @Input() public EnableScreenShareControl = true;\n /** @see LiveKitRoomComponent.EnableDeviceSettings */\n @Input() public EnableDeviceSettings = true;\n /** @see LiveKitRoomComponent.EnableLeaveControl */\n @Input() public EnableLeaveControl = true;\n /** @see LiveKitRoomComponent.StartWithMicrophone */\n @Input() public StartWithMicrophone = true;\n /** @see LiveKitRoomComponent.StartWithCamera */\n @Input() public StartWithCamera = false;\n /** @see LiveKitRoomComponent.AgentAvatarUrl */\n @Input() public AgentAvatarUrl: string | null = null;\n /** @see LiveKitRoomComponent.EnablePinning */\n @Input() public EnablePinning = true;\n /** @see LiveKitRoomComponent.EnableLayoutSwitcher */\n @Input() public EnableLayoutSwitcher = true;\n /** @see LiveKitRoomComponent.EnableNoiseFilter */\n @Input() public EnableNoiseFilter = false;\n /** @see LiveKitRoomComponent.EnableBackgroundEffects */\n @Input() public EnableBackgroundEffects = false;\n /** @see LiveKitRoomComponent.ShowAgentState */\n @Input() public ShowAgentState = false;\n /** @see LiveKitRoomComponent.ShowWhiteboard */\n @Input() public ShowWhiteboard = false;\n /** @see LiveKitRoomComponent.ShowPreJoin */\n @Input() public ShowPreJoin = false;\n /** Enable the server-authorized recording control (composite egress). */\n @Input() public EnableRecording = false;\n /** @see LiveKitRoomComponent.E2EEPassphrase */\n @Input() public E2EEPassphrase: string | null = null;\n /** @see LiveKitRoomComponent.E2EEWorker */\n @Input() public E2EEWorker: Worker | null = null;\n\n // ── Outputs ────────────────────────────────────────────────────────────────────\n /** Emitted once the agent room session is started (agent mode). */\n @Output() public SessionStarted = new EventEmitter<MJLiveKitSessionStartedEvent>();\n /**\n * Emitted (with the room name) when the user clicks \"Invite people\". The host (e.g. the Explorer\n * resource) opens an MJ user-picker and calls the invite mutation — kept out of this generic\n * component, which knows nothing about MJ users.\n */\n @Output() public InvitePeopleRequested = new EventEmitter<string>();\n /** Emitted when the room connects. */\n @Output() public Connected = new EventEmitter<LiveKitRoomState>();\n /** Emitted when the room disconnects. */\n @Output() public Disconnected = new EventEmitter<LiveKitDisconnectedEvent>();\n /** Emitted when a participant joins. */\n @Output() public ParticipantJoined = new EventEmitter<LiveKitParticipantJoinedEvent>();\n /** Emitted when a participant leaves. */\n @Output() public ParticipantLeft = new EventEmitter<LiveKitParticipantLeftEvent>();\n /** Emitted for inbound data-channel messages. */\n @Output() public DataReceived = new EventEmitter<LiveKitDataMessage>();\n /** Emitted on room errors (and on token/session-resolution failures). */\n @Output() public ErrorOccurred = new EventEmitter<LiveKitRoomError>();\n\n // ── View state ─────────────────────────────────────────────────────────────────\n /** Whether the binding is resolving the token/session. */\n public loading = false;\n /** The token/session-resolution error, if any. */\n public errorMessage: string | null = null;\n /** The resolved LiveKit server URL. */\n public serverUrl: string | null = null;\n /** The resolved access token. */\n public token: string | null = null;\n /** The display name passed to the room. */\n public resolvedDisplayName: string | null = null;\n /** The resolved room name (for recording calls). */\n public resolvedRoomName: string | null = null;\n /** Whether a recording is currently in progress. */\n public isRecording = false;\n /** The active egress id, when recording. */\n private currentEgressId: string | null = null;\n\n public ngOnInit(): void {\n if (this.AutoStart) {\n void this.Start();\n }\n }\n\n /**\n * Max time to wait for the connection to start before surfacing a retryable error, so a hung or very\n * slow server (e.g. an agent bot that can't reach the LiveKit media path) doesn't spin forever. Set\n * `0` to disable the client-side timeout.\n */\n @Input() public ConnectTimeoutMs = 25000;\n\n /** Resolves the connection (mints a token and, in agent mode, starts the agent session). */\n public async Start(): Promise<void> {\n this.loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n this.resolvedDisplayName = this.DisplayName;\n const connect = this.Mode === 'agent' ? this.startAgentSession(client) : this.joinRoom(client);\n await this.withTimeout(connect, this.ConnectTimeoutMs);\n } catch (err) {\n this.fail(err instanceof Error ? err.message : String(err));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Races `op` against a timeout: if it hasn't settled within `ms`, rejects with a clear, retryable\n * message (the template's \"Try again\" button re-runs {@link Start}). A non-positive `ms` disables it.\n */\n private withTimeout<T>(op: Promise<T>, ms: number): Promise<T> {\n if (!ms || ms <= 0) {\n return op;\n }\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new Error(\n 'The connection is taking too long — the agent could not join the room. ' +\n 'Check that the LiveKit server is running and reachable, then try again.',\n ),\n ),\n ms,\n );\n op.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n }\n\n /** Starts the agent room session and applies the returned client token. */\n private async startAgentSession(client: GraphQLLiveKitClient): Promise<void> {\n const result = await client.StartAgentRoomSession({\n AgentID: this.AgentID ?? undefined,\n AgentName: this.AgentName ?? undefined,\n TargetAgentID: this.TargetAgentID ?? undefined,\n RealtimeModelID: this.RealtimeModelID ?? undefined,\n RealtimeVoice: this.RealtimeVoice ?? undefined,\n RoomName: this.RoomName ?? undefined,\n TurnMode: this.TurnMode ?? undefined,\n });\n if (!result.Success) {\n this.fail(result.ErrorMessage ?? 'Failed to start the agent session.');\n return;\n }\n this.serverUrl = result.ServerUrl;\n this.token = result.ClientToken;\n this.resolvedRoomName = result.RoomName;\n // Track the agent we just brought in as the first entry in the in-room roster.\n this.agentsInRoom = [\n { SessionBridgeID: result.SessionBridgeID, TargetAgentID: this.TargetAgentID, Name: this.AgentName ?? 'Agent' },\n ];\n this.SessionStarted.emit({ SessionBridgeID: result.SessionBridgeID, RoomName: result.RoomName });\n }\n\n /** Picker selection handler for the in-room \"Add an agent\" control (native select; no FormsModule dep). */\n public onAddTargetChange(event: Event): void {\n this.addTargetId = (event.target as HTMLSelectElement).value || null;\n this.addError = null;\n }\n\n /**\n * Adds another agent to the SAME room — starts a new bridge (the co-agent voicing the chosen target)\n * and appends it to the roster. The new bot joins the live room alongside the existing participants.\n */\n public async AddAgent(): Promise<void> {\n if (!this.addTargetId || !this.resolvedRoomName || this.addingAgent) {\n return;\n }\n const target = this.AvailableAgents.find((a) => UUIDsEqual(a.ID, this.addTargetId));\n this.addingAgent = true;\n this.addError = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const result = await client.StartAgentRoomSession({\n AgentID: this.AgentID ?? undefined,\n AgentName: target?.Name ?? undefined,\n TargetAgentID: this.addTargetId,\n RealtimeModelID: this.addModelId ?? undefined,\n RealtimeVoice: this.addVoice ?? undefined,\n RoomName: this.resolvedRoomName,\n TurnMode: this.TurnMode ?? undefined,\n });\n if (!result.Success) {\n this.addError = result.ErrorMessage ?? 'Failed to add the agent.';\n return;\n }\n this.agentsInRoom = [\n ...this.agentsInRoom,\n { SessionBridgeID: result.SessionBridgeID, TargetAgentID: this.addTargetId, Name: target?.Name ?? 'Agent' },\n ];\n this.addTargetId = null;\n this.addModelId = null;\n this.addVoice = null;\n } catch (err) {\n this.addError = err instanceof Error ? err.message : String(err);\n } finally {\n this.addingAgent = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Removes an agent from the room — stops its bridge and drops it from the roster. */\n public async RemoveAgent(agent: AgentInRoom): Promise<void> {\n if (agent.Removing) {\n return;\n }\n agent.Removing = true;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const ok = await client.StopAgentRoomSession(agent.SessionBridgeID);\n if (ok) {\n this.agentsInRoom = this.agentsInRoom.filter((a) => a.SessionBridgeID !== agent.SessionBridgeID);\n } else {\n agent.Removing = false;\n }\n } catch {\n agent.Removing = false;\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Builds the shareable invite URL for THIS room: the current page URL with a `room=<roomName>` query\n * param. Opening it lands the invitee on the Live Room in join mode for the same room.\n */\n public get inviteUrl(): string {\n const url = new URL(window.location.href);\n url.searchParams.set('room', this.resolvedRoomName ?? '');\n return url.toString();\n }\n\n /** Copies {@link inviteUrl} to the clipboard and flips the pill to \"Link copied\" briefly. */\n public async CopyInvite(): Promise<void> {\n if (!this.resolvedRoomName) {\n return;\n }\n try {\n await navigator.clipboard.writeText(this.inviteUrl);\n this.inviteCopied = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.inviteCopied = false;\n this.cdr.markForCheck();\n }, 2000);\n } catch {\n // Clipboard blocked (insecure context / permissions) — leave the pill unchanged.\n }\n }\n\n /** Joins an existing room by minting a client token. */\n private async joinRoom(client: GraphQLLiveKitClient): Promise<void> {\n if (!this.RoomName) {\n this.fail('RoomName is required when Mode is \"join\".');\n return;\n }\n const result = await client.MintClientToken({ RoomName: this.RoomName, DisplayName: this.DisplayName ?? undefined });\n if (!result.Success) {\n this.fail(result.ErrorMessage ?? 'Failed to obtain a room token.');\n return;\n }\n this.serverUrl = result.ServerUrl;\n this.token = result.Token;\n this.resolvedRoomName = this.RoomName;\n }\n\n /** Toggles room recording via the RealtimeBridge GraphQL surface (server-authorized egress). */\n public async onToggleRecording(): Promise<void> {\n if (!this.resolvedRoomName) {\n return;\n }\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n if (!this.isRecording) {\n const result = await client.StartRecording(this.resolvedRoomName);\n if (result.Success) {\n this.isRecording = true;\n this.currentEgressId = result.EgressID;\n } else {\n this.fail(result.ErrorMessage ?? 'Failed to start recording.');\n }\n } else if (this.currentEgressId) {\n await client.StopRecording(this.currentEgressId);\n this.isRecording = false;\n this.currentEgressId = null;\n }\n this.cdr.markForCheck();\n }\n\n /** Records a failure and emits an error event. */\n private fail(message: string): void {\n this.errorMessage = message;\n this.ErrorOccurred.emit({ Kind: 'connect', Message: message });\n }\n}\n"]}
1
+ {"version":3,"file":"mj-livekit-room.component.js","sourceRoot":"","sources":["../../src/lib/mj-livekit-room.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild, inject } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { GraphQLDataProvider, GraphQLLiveKitClient, RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';\nimport { LiveKitRoomComponent, type LiveKitRoomLayout } from '@memberjunction/ng-livekit-room';\nimport type {\n LiveKitDataMessage,\n LiveKitDisconnectedEvent,\n LiveKitParticipantJoinedEvent,\n LiveKitParticipantLeftEvent,\n LiveKitRoomError,\n LiveKitRoomState,\n} from '@memberjunction/livekit-room-core';\n\n/** How the MJ binding obtains its room: start an agent in a room, or just join an existing room. */\nexport type MJLiveKitConnectionMode = 'agent' | 'join';\n\n/** Emitted when an agent room session has been started server-side. */\nexport interface MJLiveKitSessionStartedEvent {\n /** The durable bridge-session row id. */\n SessionBridgeID: string;\n /** The room name. */\n RoomName: string;\n}\n\n/** One agent bot bridged into the room — tracked for the in-room add/remove roster. */\nexport interface AgentInRoom {\n /** The `MJ: AI Agent Session Bridges` row id (used to stop/remove this agent). */\n SessionBridgeID: string;\n /** The target agent this bot voices, when known. */\n TargetAgentID: string | null;\n /** Display name (the target agent's name). */\n Name: string;\n /** True while a remove request is in flight. */\n Removing?: boolean;\n}\n\n/**\n * `mj-livekit-agent-room` — the MemberJunction binding for the LiveKit room UI. It resolves a scoped\n * access token (and, in `'agent'` mode, starts the agent's presence in the room) via the RealtimeBridge\n * GraphQL surface, then renders {@link LiveKitRoomComponent} with the resolved connection. All the rich\n * feature gates of the generic component are forwarded; MJ user/provider context is threaded in.\n *\n * Public members are PascalCase (MJ convention); private members are camelCase.\n */\n@Component({\n selector: 'mj-livekit-agent-room',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LiveKitRoomComponent],\n template: `\n @if (loading) {\n <div class=\"mj-lk-status\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>{{ Mode === 'agent' ? 'Starting agent session…' : 'Joining room…' }}</span>\n </div>\n } @else if (errorMessage) {\n <div class=\"mj-lk-status mj-lk-status--error\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <span>{{ errorMessage }}</span>\n <button type=\"button\" class=\"mj-lk-retry\" (click)=\"Start()\">Try again</button>\n </div>\n } @else if (serverUrl && token) {\n <div class=\"mj-lk-room-wrap\">\n <mj-livekit-room\n [ServerUrl]=\"serverUrl\"\n [Token]=\"token\"\n [DisplayName]=\"resolvedDisplayName\"\n [AutoConnect]=\"true\"\n [StartWithMicrophone]=\"StartWithMicrophone\"\n [StartWithCamera]=\"StartWithCamera\"\n [Layout]=\"Layout\"\n [Title]=\"Title\"\n [ShowHeader]=\"ShowHeader\"\n [ShowControlBar]=\"ShowControlBar\"\n [ShowChat]=\"ShowChat\"\n [ShowParticipantsPanel]=\"ShowParticipantsPanel\"\n [EnableMicrophoneControl]=\"EnableMicrophoneControl\"\n [EnableCameraControl]=\"EnableCameraControl\"\n [EnableScreenShareControl]=\"EnableScreenShareControl\"\n [EnableDeviceSettings]=\"EnableDeviceSettings\"\n [EnableLeaveControl]=\"EnableLeaveControl\"\n [EnablePinning]=\"EnablePinning\"\n [EnableLayoutSwitcher]=\"EnableLayoutSwitcher\"\n [EnableNoiseFilter]=\"EnableNoiseFilter\"\n [EnableBackgroundEffects]=\"EnableBackgroundEffects\"\n [ShowAgentState]=\"ShowAgentState\"\n [ShowWhiteboard]=\"ShowWhiteboard\"\n [ShowPreJoin]=\"ShowPreJoin\"\n [ShowRecordingControl]=\"EnableRecording\"\n [IsRecording]=\"isRecording\"\n [E2EEPassphrase]=\"E2EEPassphrase\"\n [E2EEWorker]=\"E2EEWorker\"\n [AgentAvatarUrl]=\"AgentAvatarUrl\"\n [CanEndForAll]=\"EnableEndForAll && !!resolvedRoomName\"\n (Connected)=\"Connected.emit($event)\"\n (Disconnected)=\"Disconnected.emit($event)\"\n (EndForAll)=\"EndMeeting()\"\n (ParticipantJoined)=\"ParticipantJoined.emit($event)\"\n (ParticipantLeft)=\"ParticipantLeft.emit($event)\"\n (DataReceived)=\"DataReceived.emit($event)\"\n (ToggleRecording)=\"onToggleRecording()\"\n (ErrorOccurred)=\"ErrorOccurred.emit($event)\"\n ></mj-livekit-room>\n\n @if (Mode === 'agent' && EnableAgentManagement && resolvedRoomName) {\n <div class=\"mj-lk-agents\">\n @if (showAgentsPanel) {\n <div class=\"mj-lk-agents__panel\">\n <div class=\"mj-lk-agents__head\">In this room</div>\n @for (a of agentsInRoom; track a.SessionBridgeID) {\n <div class=\"mj-lk-agents__row\">\n <span class=\"mj-lk-agents__name\"><i class=\"fa-solid fa-robot\"></i> {{ a.Name }}</span>\n <button type=\"button\" class=\"mj-lk-agents__remove\" title=\"Remove agent\"\n [disabled]=\"a.Removing\" (click)=\"RemoveAgent(a)\">\n <i class=\"fa-solid\" [class.fa-xmark]=\"!a.Removing\" [class.fa-spinner]=\"a.Removing\" [class.fa-spin]=\"a.Removing\"></i>\n </button>\n </div>\n }\n @if (availableToAdd.length) {\n <div class=\"mj-lk-agents__add\">\n <select class=\"mj-input mj-lk-agents__select\" (change)=\"onAddTargetChange($event)\">\n <option value=\"\">Add an agent…</option>\n @for (a of availableToAdd; track a.ID) {\n <option [value]=\"a.ID\" [selected]=\"UUIDsEqual(a.ID, addTargetId)\">{{ a.Name }}</option>\n }\n </select>\n <button type=\"button\" class=\"mj-lk-agents__addbtn\" [disabled]=\"!addTargetId || addingAgent\" (click)=\"AddAgent()\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!addingAgent\" [class.fa-spinner]=\"addingAgent\" [class.fa-spin]=\"addingAgent\"></i>\n </button>\n </div>\n @if (CanPickModelVoice && AvailableModels.length) {\n <div class=\"mj-lk-agents__overrides\">\n <select class=\"mj-input mj-lk-agents__select mj-lk-agents__select--sm\" (change)=\"onAddModelChange($event)\" title=\"Model (dev override)\">\n <option value=\"\">Default model</option>\n @for (m of AvailableModels; track m.ModelID) {\n <option [value]=\"m.ModelID\" [selected]=\"UUIDsEqual(m.ModelID, addModelId)\">{{ m.ModelName }}</option>\n }\n </select>\n @if (addVoices.length) {\n <select class=\"mj-input mj-lk-agents__select mj-lk-agents__select--sm\" (change)=\"onAddVoiceChange($event)\" title=\"Voice (dev override)\">\n <option value=\"\">Default voice</option>\n @for (v of addVoices; track v.ID) {\n <option [value]=\"v.ID\" [selected]=\"v.ID === addVoice\">{{ v.Name }}</option>\n }\n </select>\n }\n </div>\n }\n }\n @if (addError) {\n <div class=\"mj-lk-agents__error\">{{ addError }}</div>\n }\n </div>\n }\n <div class=\"mj-lk-agents__pills\">\n <button type=\"button\" class=\"mj-lk-agents__toggle\" (click)=\"showAgentsPanel = !showAgentsPanel\">\n <i class=\"fa-solid fa-robot\"></i> Agents ({{ agentsInRoom.length }})\n </button>\n @if (EnableInvite) {\n <button type=\"button\" class=\"mj-lk-agents__toggle\" title=\"Copy a link to invite someone to this room\"\n (click)=\"CopyInvite()\">\n <i class=\"fa-solid\" [class.fa-link]=\"!inviteCopied\" [class.fa-check]=\"inviteCopied\"></i>\n {{ inviteCopied ? 'Link copied' : 'Copy link' }}\n </button>\n <button type=\"button\" class=\"mj-lk-agents__toggle\" title=\"Invite people from this workspace\"\n (click)=\"InvitePeopleRequested.emit(resolvedRoomName)\">\n <i class=\"fa-solid fa-user-plus\"></i> Invite people\n </button>\n }\n </div>\n </div>\n }\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n .mj-lk-status {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 10px;\n height: 100%;\n min-height: 220px;\n color: var(--mj-text-secondary, #475569);\n background: var(--mj-bg-surface-card, #f1f5f9);\n border-radius: 12px;\n }\n .mj-lk-status i {\n font-size: 1.6rem;\n color: var(--mj-brand-primary, #0076b6);\n }\n .mj-lk-status--error i {\n color: var(--mj-status-error, #ef4444);\n }\n .mj-lk-retry {\n padding: 7px 16px;\n border: none;\n border-radius: 8px;\n cursor: pointer;\n color: var(--mj-text-inverse, #fff);\n background: var(--mj-brand-primary, #0076b6);\n }\n .mj-lk-room-wrap {\n position: relative;\n width: 100%;\n height: 100%;\n }\n .mj-lk-agents {\n position: absolute;\n left: 16px;\n bottom: 84px;\n z-index: 40;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 8px;\n }\n .mj-lk-agents__pills {\n display: flex;\n gap: 8px;\n }\n .mj-lk-agents__toggle {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n box-shadow: var(--mj-shadow-sm, 0 2px 8px rgba(0, 0, 0, 0.18));\n }\n .mj-lk-agents__panel {\n width: 260px;\n padding: 10px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n background: var(--mj-bg-surface-elevated, var(--mj-bg-surface));\n box-shadow: var(--mj-shadow-md, 0 6px 20px rgba(0, 0, 0, 0.25));\n }\n .mj-lk-agents__head {\n font-size: 0.6875rem;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n margin-bottom: 6px;\n }\n .mj-lk-agents__row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 5px 0;\n }\n .mj-lk-agents__name {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n font-size: 0.8125rem;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .mj-lk-agents__name i {\n color: var(--mj-brand-primary);\n }\n .mj-lk-agents__remove {\n flex: none;\n width: 26px;\n height: 26px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-muted);\n background: transparent;\n }\n .mj-lk-agents__remove:hover:not(:disabled) {\n color: var(--mj-status-error);\n background: var(--mj-bg-surface-hover);\n }\n .mj-lk-agents__add {\n display: flex;\n gap: 6px;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-subtle, var(--mj-border-default));\n }\n .mj-lk-agents__select {\n flex: 1;\n min-width: 0;\n font-size: 0.8125rem;\n }\n .mj-lk-agents__overrides {\n display: flex;\n gap: 6px;\n margin-top: 6px;\n }\n .mj-lk-agents__select--sm {\n font-size: 0.75rem;\n }\n .mj-lk-agents__addbtn {\n flex: none;\n width: 32px;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-inverse);\n background: var(--mj-brand-primary);\n }\n .mj-lk-agents__addbtn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n .mj-lk-agents__error {\n margin-top: 6px;\n font-size: 0.75rem;\n color: var(--mj-status-error-text, var(--mj-status-error));\n }\n `,\n ],\n})\nexport class MJLiveKitRoomComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n // ── MJ connection inputs ───────────────────────────────────────────────────────\n /** Whether to start an agent in the room (`'agent'`) or just join an existing room (`'join'`). */\n @Input() public Mode: MJLiveKitConnectionMode = 'agent';\n /** The agent to voice (agent mode) — the Realtime Co-Agent / voice front-end. */\n @Input() public AgentID: string | null = null;\n /** The agent's display name (bot name + addressing). */\n @Input() public AgentName: string | null = null;\n /**\n * The TARGET agent the co-agent voices — the one being \"called\". The Realtime Co-Agent delegates to\n * it via `invoke-target-agent`; without it the agent has nobody to speak for and stays idle.\n */\n @Input() public TargetAgentID: string | null = null;\n /** The room name. Required for `'join'` mode; optional for `'agent'` (server generates one). */\n @Input() public RoomName: string | null = null;\n /** The display name the local user joins as. Defaults to the authenticated user server-side. */\n @Input() public DisplayName: string | null = null;\n /** Turn-taking mode for the agent. */\n @Input() public TurnMode: 'Passive' | 'Active' | 'Hybrid' | null = null;\n /** Resolve the connection automatically on init. */\n @Input() public AutoStart = true;\n\n // ── In-room agent management (agent mode) ─────────────────────────────────────────\n /** Show the in-room \"Agents\" panel to add/remove agents (agent mode only). */\n @Input() public EnableAgentManagement = true;\n /** Show the \"Invite\" pill that copies a join link to this room. */\n @Input() public EnableInvite = true;\n /**\n * Offer \"End meeting for everyone\" in the control bar's Zoom-style leave menu. When on (default) and a\n * room is resolved, ending tears down every agent in the room server-side (by name — so it works even\n * when this client only *joined*). Set `false` for contexts where only the local user should ever leave.\n */\n @Input() public EnableEndForAll = true;\n /** Target agents the user can ADD in-room (id + name). The host (e.g. the Explorer resource) supplies these. */\n @Input() public AvailableAgents: { ID: string; Name: string }[] = [];\n\n /** Per-session Realtime MODEL override for the INITIAL agent (from the host's pre-join picker). */\n @Input() public RealtimeModelID: string | null = null;\n /** Per-session VOICE override for the INITIAL agent (from the host's pre-join picker). */\n @Input() public RealtimeVoice: string | null = null;\n /**\n * Whether the dev model/voice pickers are shown in the in-room \"Add an agent\" control. The HOST\n * computes this (the `Realtime: Advanced Session Controls` authorization) and passes it down — this\n * generic component never evaluates authorizations itself.\n */\n @Input() public CanPickModelVoice = false;\n /** Active Realtime models + their voices, supplied by the host (for the add-agent dropdowns). */\n @Input() public AvailableModels: RealtimeModelVoices[] = [];\n\n /** True briefly after the invite link is copied (drives the \"Link copied\" pill state). */\n public inviteCopied = false;\n\n /** Whether the floating agents panel is open. */\n public showAgentsPanel = false;\n /** The agent bots currently bridged into the room (the first is the one started on join). */\n public agentsInRoom: AgentInRoom[] = [];\n /** The target id chosen in the \"Add an agent\" picker. */\n public addTargetId: string | null = null;\n /** The MODEL override chosen in the \"Add an agent\" picker (dev-only; null = co-agent/target default). */\n public addModelId: string | null = null;\n /** The VOICE override chosen in the \"Add an agent\" picker (dev-only; null = co-agent/target default). */\n public addVoice: string | null = null;\n /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */\n public UUIDsEqual = UUIDsEqual;\n /** True while an Add request is in flight. */\n public addingAgent = false;\n /** Last add error, shown under the picker. */\n public addError: string | null = null;\n /** True while an \"End meeting\" (stop all agents + leave) is in flight. */\n public endingMeeting = false;\n\n /** The inner Generic room — used to trigger the local disconnect when ending/leaving the meeting. */\n @ViewChild(LiveKitRoomComponent) private roomComponent?: LiveKitRoomComponent;\n\n /** Available agents not already in the room (by target id) — the \"Add\" picker options. */\n public get availableToAdd(): { ID: string; Name: string }[] {\n const present = new Set(this.agentsInRoom.map((a) => (a.TargetAgentID ?? '').toLowerCase()));\n return this.AvailableAgents.filter((a) => !present.has(a.ID.toLowerCase()));\n }\n\n /** Voices for the model chosen in the add-agent picker (empty when no model picked or it has none). */\n public get addVoices(): RealtimeVoiceOption[] {\n const model = this.AvailableModels.find((m) => UUIDsEqual(m.ModelID, this.addModelId));\n return model?.Voices ?? [];\n }\n\n /** Records the add-agent MODEL choice; clears the voice so it can't outlive a model switch. */\n public onAddModelChange(event: Event): void {\n this.addModelId = (event.target as HTMLSelectElement).value || null;\n this.addVoice = null;\n }\n\n /** Records the add-agent VOICE choice. */\n public onAddVoiceChange(event: Event): void {\n this.addVoice = (event.target as HTMLSelectElement).value || null;\n }\n\n // ── Forwarded UI gates (see LiveKitRoomComponent) ────────────────────────────────\n /** @see LiveKitRoomComponent.Layout */\n @Input() public Layout: LiveKitRoomLayout = 'grid';\n /** @see LiveKitRoomComponent.Title */\n @Input() public Title: string | null = null;\n /** @see LiveKitRoomComponent.ShowHeader */\n @Input() public ShowHeader = true;\n /** @see LiveKitRoomComponent.ShowControlBar */\n @Input() public ShowControlBar = true;\n /** @see LiveKitRoomComponent.ShowChat */\n @Input() public ShowChat = true;\n /** @see LiveKitRoomComponent.ShowParticipantsPanel */\n @Input() public ShowParticipantsPanel = true;\n /** @see LiveKitRoomComponent.EnableMicrophoneControl */\n @Input() public EnableMicrophoneControl = true;\n /** @see LiveKitRoomComponent.EnableCameraControl */\n @Input() public EnableCameraControl = true;\n /** @see LiveKitRoomComponent.EnableScreenShareControl */\n @Input() public EnableScreenShareControl = true;\n /** @see LiveKitRoomComponent.EnableDeviceSettings */\n @Input() public EnableDeviceSettings = true;\n /** @see LiveKitRoomComponent.EnableLeaveControl */\n @Input() public EnableLeaveControl = true;\n /** @see LiveKitRoomComponent.StartWithMicrophone */\n @Input() public StartWithMicrophone = true;\n /** @see LiveKitRoomComponent.StartWithCamera */\n @Input() public StartWithCamera = false;\n /** @see LiveKitRoomComponent.AgentAvatarUrl */\n @Input() public AgentAvatarUrl: string | null = null;\n /** @see LiveKitRoomComponent.EnablePinning */\n @Input() public EnablePinning = true;\n /** @see LiveKitRoomComponent.EnableLayoutSwitcher */\n @Input() public EnableLayoutSwitcher = true;\n /** @see LiveKitRoomComponent.EnableNoiseFilter */\n @Input() public EnableNoiseFilter = false;\n /** @see LiveKitRoomComponent.EnableBackgroundEffects */\n @Input() public EnableBackgroundEffects = false;\n /** @see LiveKitRoomComponent.ShowAgentState */\n @Input() public ShowAgentState = false;\n /** @see LiveKitRoomComponent.ShowWhiteboard */\n @Input() public ShowWhiteboard = false;\n /** @see LiveKitRoomComponent.ShowPreJoin */\n @Input() public ShowPreJoin = false;\n /** Enable the server-authorized recording control (composite egress). */\n @Input() public EnableRecording = false;\n /** @see LiveKitRoomComponent.E2EEPassphrase */\n @Input() public E2EEPassphrase: string | null = null;\n /** @see LiveKitRoomComponent.E2EEWorker */\n @Input() public E2EEWorker: Worker | null = null;\n\n // ── Outputs ────────────────────────────────────────────────────────────────────\n /** Emitted once the agent room session is started (agent mode). */\n @Output() public SessionStarted = new EventEmitter<MJLiveKitSessionStartedEvent>();\n /**\n * Emitted (with the room name) when the user clicks \"Invite people\". The host (e.g. the Explorer\n * resource) opens an MJ user-picker and calls the invite mutation — kept out of this generic\n * component, which knows nothing about MJ users.\n */\n @Output() public InvitePeopleRequested = new EventEmitter<string>();\n /** Emitted when the room connects. */\n @Output() public Connected = new EventEmitter<LiveKitRoomState>();\n /** Emitted when the room disconnects. */\n @Output() public Disconnected = new EventEmitter<LiveKitDisconnectedEvent>();\n /** Emitted when a participant joins. */\n @Output() public ParticipantJoined = new EventEmitter<LiveKitParticipantJoinedEvent>();\n /** Emitted when a participant leaves. */\n @Output() public ParticipantLeft = new EventEmitter<LiveKitParticipantLeftEvent>();\n /** Emitted for inbound data-channel messages. */\n @Output() public DataReceived = new EventEmitter<LiveKitDataMessage>();\n /** Emitted on room errors (and on token/session-resolution failures). */\n @Output() public ErrorOccurred = new EventEmitter<LiveKitRoomError>();\n\n // ── View state ─────────────────────────────────────────────────────────────────\n /** Whether the binding is resolving the token/session. */\n public loading = false;\n /** The token/session-resolution error, if any. */\n public errorMessage: string | null = null;\n /** The resolved LiveKit server URL. */\n public serverUrl: string | null = null;\n /** The resolved access token. */\n public token: string | null = null;\n /** The display name passed to the room. */\n public resolvedDisplayName: string | null = null;\n /** The resolved room name (for recording calls). */\n public resolvedRoomName: string | null = null;\n /** Whether a recording is currently in progress. */\n public isRecording = false;\n /** The active egress id, when recording. */\n private currentEgressId: string | null = null;\n\n public ngOnInit(): void {\n if (this.AutoStart) {\n void this.Start();\n }\n }\n\n /**\n * Max time to wait for the connection to start before surfacing a retryable error, so a hung or very\n * slow server (e.g. an agent bot that can't reach the LiveKit media path) doesn't spin forever. Set\n * `0` to disable the client-side timeout.\n */\n @Input() public ConnectTimeoutMs = 25000;\n\n /** Resolves the connection (mints a token and, in agent mode, starts the agent session). */\n public async Start(): Promise<void> {\n this.loading = true;\n this.errorMessage = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n this.resolvedDisplayName = this.DisplayName;\n const connect = this.Mode === 'agent' ? this.startAgentSession(client) : this.joinRoom(client);\n await this.withTimeout(connect, this.ConnectTimeoutMs);\n } catch (err) {\n this.fail(err instanceof Error ? err.message : String(err));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Races `op` against a timeout: if it hasn't settled within `ms`, rejects with a clear, retryable\n * message (the template's \"Try again\" button re-runs {@link Start}). A non-positive `ms` disables it.\n */\n private withTimeout<T>(op: Promise<T>, ms: number): Promise<T> {\n if (!ms || ms <= 0) {\n return op;\n }\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(\n () =>\n reject(\n new Error(\n 'The connection is taking too long — the agent could not join the room. ' +\n 'Check that the LiveKit server is running and reachable, then try again.',\n ),\n ),\n ms,\n );\n op.then(\n (value) => {\n clearTimeout(timer);\n resolve(value);\n },\n (error) => {\n clearTimeout(timer);\n reject(error);\n },\n );\n });\n }\n\n /** Starts the agent room session and applies the returned client token. */\n private async startAgentSession(client: GraphQLLiveKitClient): Promise<void> {\n const result = await client.StartAgentRoomSession({\n AgentID: this.AgentID ?? undefined,\n AgentName: this.AgentName ?? undefined,\n TargetAgentID: this.TargetAgentID ?? undefined,\n RealtimeModelID: this.RealtimeModelID ?? undefined,\n RealtimeVoice: this.RealtimeVoice ?? undefined,\n RoomName: this.RoomName ?? undefined,\n TurnMode: this.TurnMode ?? undefined,\n });\n if (!result.Success) {\n this.fail(result.ErrorMessage ?? 'Failed to start the agent session.');\n return;\n }\n this.serverUrl = result.ServerUrl;\n this.token = result.ClientToken;\n this.resolvedRoomName = result.RoomName;\n // Track the agent we just brought in as the first entry in the in-room roster.\n this.agentsInRoom = [\n { SessionBridgeID: result.SessionBridgeID, TargetAgentID: this.TargetAgentID, Name: this.AgentName ?? 'Agent' },\n ];\n this.SessionStarted.emit({ SessionBridgeID: result.SessionBridgeID, RoomName: result.RoomName });\n }\n\n /** Picker selection handler for the in-room \"Add an agent\" control (native select; no FormsModule dep). */\n public onAddTargetChange(event: Event): void {\n this.addTargetId = (event.target as HTMLSelectElement).value || null;\n this.addError = null;\n }\n\n /**\n * Adds another agent to the SAME room — starts a new bridge (the co-agent voicing the chosen target)\n * and appends it to the roster. The new bot joins the live room alongside the existing participants.\n */\n public async AddAgent(): Promise<void> {\n if (!this.addTargetId || !this.resolvedRoomName || this.addingAgent) {\n return;\n }\n const target = this.AvailableAgents.find((a) => UUIDsEqual(a.ID, this.addTargetId));\n this.addingAgent = true;\n this.addError = null;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const result = await client.StartAgentRoomSession({\n AgentID: this.AgentID ?? undefined,\n AgentName: target?.Name ?? undefined,\n TargetAgentID: this.addTargetId,\n RealtimeModelID: this.addModelId ?? undefined,\n RealtimeVoice: this.addVoice ?? undefined,\n RoomName: this.resolvedRoomName,\n TurnMode: this.TurnMode ?? undefined,\n });\n if (!result.Success) {\n this.addError = result.ErrorMessage ?? 'Failed to add the agent.';\n return;\n }\n this.agentsInRoom = [\n ...this.agentsInRoom,\n { SessionBridgeID: result.SessionBridgeID, TargetAgentID: this.addTargetId, Name: target?.Name ?? 'Agent' },\n ];\n this.addTargetId = null;\n this.addModelId = null;\n this.addVoice = null;\n } catch (err) {\n this.addError = err instanceof Error ? err.message : String(err);\n } finally {\n this.addingAgent = false;\n this.cdr.markForCheck();\n }\n }\n\n /** Removes an agent from the room — stops its bridge and drops it from the roster. */\n public async RemoveAgent(agent: AgentInRoom): Promise<void> {\n if (agent.Removing) {\n return;\n }\n agent.Removing = true;\n this.cdr.markForCheck();\n try {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n const ok = await client.StopAgentRoomSession(agent.SessionBridgeID);\n if (ok) {\n this.agentsInRoom = this.agentsInRoom.filter((a) => a.SessionBridgeID !== agent.SessionBridgeID);\n } else {\n agent.Removing = false;\n }\n } catch {\n agent.Removing = false;\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n /**\n * **End meeting** (the Zoom/Teams \"End for all\", reached from the control-bar leave menu): tears down EVERY\n * agent in the room server-side — *by room name*, so it works even when this client only **joined** the room\n * and never tracked the bridge ids locally — then disconnects the local user. Contrast with **Leave** (the\n * other menu item → {@link LiveKitRoomComponent.Leave}), which only disconnects YOU and lets the meeting\n * continue; the server then auto-leaves the agents once the last human is gone, so neither path strands\n * billable agent sessions in an empty room.\n */\n public async EndMeeting(): Promise<void> {\n if (this.endingMeeting) {\n return;\n }\n this.endingMeeting = true;\n this.cdr.markForCheck();\n try {\n if (this.resolvedRoomName) {\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n await client.EndRoom(this.resolvedRoomName);\n }\n this.agentsInRoom = [];\n } catch {\n /* best-effort — fall through and still disconnect the local user */\n } finally {\n await this.roomComponent?.Leave();\n this.endingMeeting = false;\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Builds the shareable invite URL for THIS room: the current page URL with a `room=<roomName>` query\n * param. Opening it lands the invitee on the Live Room in join mode for the same room.\n */\n public get inviteUrl(): string {\n const url = new URL(window.location.href);\n url.searchParams.set('room', this.resolvedRoomName ?? '');\n return url.toString();\n }\n\n /** Copies {@link inviteUrl} to the clipboard and flips the pill to \"Link copied\" briefly. */\n public async CopyInvite(): Promise<void> {\n if (!this.resolvedRoomName) {\n return;\n }\n try {\n await navigator.clipboard.writeText(this.inviteUrl);\n this.inviteCopied = true;\n this.cdr.markForCheck();\n setTimeout(() => {\n this.inviteCopied = false;\n this.cdr.markForCheck();\n }, 2000);\n } catch {\n // Clipboard blocked (insecure context / permissions) — leave the pill unchanged.\n }\n }\n\n /** Joins an existing room by minting a client token. */\n private async joinRoom(client: GraphQLLiveKitClient): Promise<void> {\n if (!this.RoomName) {\n this.fail('RoomName is required when Mode is \"join\".');\n return;\n }\n const result = await client.MintClientToken({ RoomName: this.RoomName, DisplayName: this.DisplayName ?? undefined });\n if (!result.Success) {\n this.fail(result.ErrorMessage ?? 'Failed to obtain a room token.');\n return;\n }\n this.serverUrl = result.ServerUrl;\n this.token = result.Token;\n this.resolvedRoomName = this.RoomName;\n }\n\n /** Toggles room recording via the RealtimeBridge GraphQL surface (server-authorized egress). */\n public async onToggleRecording(): Promise<void> {\n if (!this.resolvedRoomName) {\n return;\n }\n const client = new GraphQLLiveKitClient(this.ProviderToUse as unknown as GraphQLDataProvider);\n if (!this.isRecording) {\n const result = await client.StartRecording(this.resolvedRoomName);\n if (result.Success) {\n this.isRecording = true;\n this.currentEgressId = result.EgressID;\n } else {\n this.fail(result.ErrorMessage ?? 'Failed to start recording.');\n }\n } else if (this.currentEgressId) {\n await client.StopRecording(this.currentEgressId);\n this.isRecording = false;\n this.currentEgressId = null;\n }\n this.cdr.markForCheck();\n }\n\n /** Records a failure and emits an error event. */\n private fail(message: string): void {\n this.errorMessage = message;\n this.ErrorOccurred.emit({ Kind: 'connect', Message: message });\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-mj-livekit-room",
3
- "version": "5.42.0",
3
+ "version": "5.43.0",
4
4
  "description": "MemberJunction: MJ binding layer for the LiveKit room UI. Wraps @memberjunction/ng-livekit-room and connects it to the MJ realtime-bridge infrastructure — mints scoped tokens and starts agent room sessions via the RealtimeBridge GraphQL surface, threading MJ user/provider/agent context.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -32,12 +32,12 @@
32
32
  "rxjs": "^7.8.2"
33
33
  },
34
34
  "dependencies": {
35
- "@memberjunction/core": "5.42.0",
36
- "@memberjunction/global": "5.42.0",
37
- "@memberjunction/graphql-dataprovider": "5.42.0",
38
- "@memberjunction/livekit-room-core": "5.42.0",
39
- "@memberjunction/ng-base-types": "5.42.0",
40
- "@memberjunction/ng-livekit-room": "5.42.0",
35
+ "@memberjunction/core": "5.43.0",
36
+ "@memberjunction/global": "5.43.0",
37
+ "@memberjunction/graphql-dataprovider": "5.43.0",
38
+ "@memberjunction/livekit-room-core": "5.43.0",
39
+ "@memberjunction/ng-base-types": "5.43.0",
40
+ "@memberjunction/ng-livekit-room": "5.43.0",
41
41
  "tslib": "^2.8.1"
42
42
  },
43
43
  "sideEffects": false,