@memberjunction/ng-mj-livekit-room 0.0.1 → 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.
package/README.md CHANGED
@@ -1,45 +1,63 @@
1
1
  # @memberjunction/ng-mj-livekit-room
2
2
 
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
4
-
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@memberjunction/ng-mj-livekit-room`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**
3
+ The **MemberJunction binding** for the LiveKit room UI. `<mj-livekit-agent-room>` wraps the portable
4
+ [`@memberjunction/ng-livekit-room`](../livekit-room) component and connects it to MJ's realtime-bridge
5
+ infrastructure: it mints a scoped access token (and optionally starts an **agent room session**) via the
6
+ `RealtimeBridge` GraphQL surface, threads MJ user/provider context, and forwards every feature gate.
7
+
8
+ ```
9
+ @memberjunction/ng-mj-livekit-room ← you are here (MJ-aware, app-agnostic)
10
+ ▲ wraps
11
+ @memberjunction/ng-livekit-room (portable UI)
12
+ calls
13
+ RealtimeBridgeResolver (MJServer) ──► @memberjunction/livekit-room-server
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```html
19
+ <!-- Start an agent in a room and join it -->
20
+ <mj-livekit-agent-room
21
+ [Mode]="'agent'"
22
+ [AgentID]="agentId"
23
+ [AgentName]="'Sage'"
24
+ [Provider]="Provider"
25
+ [ShowAgentState]="true"
26
+ [EnableRecording]="true"
27
+ (SessionStarted)="onSessionStarted($event)"
28
+ ></mj-livekit-agent-room>
29
+
30
+ <!-- Or just join an existing room -->
31
+ <mj-livekit-agent-room [Mode]="'join'" [RoomName]="'support-42'" [DisplayName]="'Amith'"></mj-livekit-agent-room>
32
+ ```
33
+
34
+ ## What it adds over the generic component
35
+
36
+ - **Token resolution** — calls `GraphQLLiveKitClient.MintClientToken` / `StartAgentRoomSession`; you never
37
+ handle LiveKit credentials in the browser.
38
+ - **Agent sessions** — `Mode="agent"` starts the agent's presence in the room via the realtime bridge and
39
+ emits `SessionStarted` with the bridge id.
40
+ - **Server-authorized recording** `EnableRecording` wires the record button to the egress mutations.
41
+ - **Multi-provider** — extends `BaseAngularComponent`; pass `[Provider]` to scope to a specific MJ server.
42
+
43
+ ## Inputs
44
+
45
+ `Mode` (`agent` / `join`), `AgentID`, `AgentName`, `RoomName`, `DisplayName`, `TurnMode`, `AutoStart`,
46
+ plus pass-through gates: `Layout`, `Title`, `ShowHeader`, `ShowControlBar`, `ShowChat`,
47
+ `ShowParticipantsPanel`, `EnablePinning`, `EnableLayoutSwitcher`, `EnableNoiseFilter`,
48
+ `EnableBackgroundEffects`, `ShowAgentState`, `ShowPreJoin`, `EnableRecording`, `StartWithMicrophone`,
49
+ `StartWithCamera`, `AgentAvatarUrl`, `E2EEPassphrase`, `E2EEWorker`, and the device-control gates.
50
+
51
+ ## Outputs
52
+
53
+ `SessionStarted`, `Connected`, `Disconnected`, `ParticipantJoined`, `ParticipantLeft`, `DataReceived`,
54
+ `ErrorOccurred`.
55
+
56
+ ## In Explorer
57
+
58
+ `@memberjunction/ng-explorer-core` registers a `LiveKitRoomResource` (`DriverClass = 'LiveKitRoomResource'`)
59
+ that hosts this component as a tab — add a nav item with that driver class to surface it in an app.
60
+
61
+ ## License
62
+
63
+ ISC © MemberJunction.com
@@ -0,0 +1,251 @@
1
+ import { EventEmitter, OnInit } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { UUIDsEqual } from '@memberjunction/global';
4
+ import { RealtimeModelVoices, RealtimeVoiceOption } from '@memberjunction/graphql-dataprovider';
5
+ import { type LiveKitRoomLayout } from '@memberjunction/ng-livekit-room';
6
+ import type { LiveKitDataMessage, LiveKitDisconnectedEvent, LiveKitParticipantJoinedEvent, LiveKitParticipantLeftEvent, LiveKitRoomError, LiveKitRoomState } from '@memberjunction/livekit-room-core';
7
+ import * as i0 from "@angular/core";
8
+ /** How the MJ binding obtains its room: start an agent in a room, or just join an existing room. */
9
+ export type MJLiveKitConnectionMode = 'agent' | 'join';
10
+ /** Emitted when an agent room session has been started server-side. */
11
+ export interface MJLiveKitSessionStartedEvent {
12
+ /** The durable bridge-session row id. */
13
+ SessionBridgeID: string;
14
+ /** The room name. */
15
+ RoomName: string;
16
+ }
17
+ /** One agent bot bridged into the room — tracked for the in-room add/remove roster. */
18
+ export interface AgentInRoom {
19
+ /** The `MJ: AI Agent Session Bridges` row id (used to stop/remove this agent). */
20
+ SessionBridgeID: string;
21
+ /** The target agent this bot voices, when known. */
22
+ TargetAgentID: string | null;
23
+ /** Display name (the target agent's name). */
24
+ Name: string;
25
+ /** True while a remove request is in flight. */
26
+ Removing?: boolean;
27
+ }
28
+ /**
29
+ * `mj-livekit-agent-room` — the MemberJunction binding for the LiveKit room UI. It resolves a scoped
30
+ * access token (and, in `'agent'` mode, starts the agent's presence in the room) via the RealtimeBridge
31
+ * GraphQL surface, then renders {@link LiveKitRoomComponent} with the resolved connection. All the rich
32
+ * feature gates of the generic component are forwarded; MJ user/provider context is threaded in.
33
+ *
34
+ * Public members are PascalCase (MJ convention); private members are camelCase.
35
+ */
36
+ export declare class MJLiveKitRoomComponent extends BaseAngularComponent implements OnInit {
37
+ private readonly cdr;
38
+ /** Whether to start an agent in the room (`'agent'`) or just join an existing room (`'join'`). */
39
+ Mode: MJLiveKitConnectionMode;
40
+ /** The agent to voice (agent mode) — the Realtime Co-Agent / voice front-end. */
41
+ AgentID: string | null;
42
+ /** The agent's display name (bot name + addressing). */
43
+ AgentName: string | null;
44
+ /**
45
+ * The TARGET agent the co-agent voices — the one being "called". The Realtime Co-Agent delegates to
46
+ * it via `invoke-target-agent`; without it the agent has nobody to speak for and stays idle.
47
+ */
48
+ TargetAgentID: string | null;
49
+ /** The room name. Required for `'join'` mode; optional for `'agent'` (server generates one). */
50
+ RoomName: string | null;
51
+ /** The display name the local user joins as. Defaults to the authenticated user server-side. */
52
+ DisplayName: string | null;
53
+ /** Turn-taking mode for the agent. */
54
+ TurnMode: 'Passive' | 'Active' | 'Hybrid' | null;
55
+ /** Resolve the connection automatically on init. */
56
+ AutoStart: boolean;
57
+ /** Show the in-room "Agents" panel to add/remove agents (agent mode only). */
58
+ EnableAgentManagement: boolean;
59
+ /** Show the "Invite" pill that copies a join link to this room. */
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;
67
+ /** Target agents the user can ADD in-room (id + name). The host (e.g. the Explorer resource) supplies these. */
68
+ AvailableAgents: {
69
+ ID: string;
70
+ Name: string;
71
+ }[];
72
+ /** Per-session Realtime MODEL override for the INITIAL agent (from the host's pre-join picker). */
73
+ RealtimeModelID: string | null;
74
+ /** Per-session VOICE override for the INITIAL agent (from the host's pre-join picker). */
75
+ RealtimeVoice: string | null;
76
+ /**
77
+ * Whether the dev model/voice pickers are shown in the in-room "Add an agent" control. The HOST
78
+ * computes this (the `Realtime: Advanced Session Controls` authorization) and passes it down — this
79
+ * generic component never evaluates authorizations itself.
80
+ */
81
+ CanPickModelVoice: boolean;
82
+ /** Active Realtime models + their voices, supplied by the host (for the add-agent dropdowns). */
83
+ AvailableModels: RealtimeModelVoices[];
84
+ /** True briefly after the invite link is copied (drives the "Link copied" pill state). */
85
+ inviteCopied: boolean;
86
+ /** Whether the floating agents panel is open. */
87
+ showAgentsPanel: boolean;
88
+ /** The agent bots currently bridged into the room (the first is the one started on join). */
89
+ agentsInRoom: AgentInRoom[];
90
+ /** The target id chosen in the "Add an agent" picker. */
91
+ addTargetId: string | null;
92
+ /** The MODEL override chosen in the "Add an agent" picker (dev-only; null = co-agent/target default). */
93
+ addModelId: string | null;
94
+ /** The VOICE override chosen in the "Add an agent" picker (dev-only; null = co-agent/target default). */
95
+ addVoice: string | null;
96
+ /** Exposed for template use — platform-safe UUID equality (SQL upper vs PG lower). */
97
+ UUIDsEqual: typeof UUIDsEqual;
98
+ /** True while an Add request is in flight. */
99
+ addingAgent: boolean;
100
+ /** Last add error, shown under the picker. */
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?;
106
+ /** Available agents not already in the room (by target id) — the "Add" picker options. */
107
+ get availableToAdd(): {
108
+ ID: string;
109
+ Name: string;
110
+ }[];
111
+ /** Voices for the model chosen in the add-agent picker (empty when no model picked or it has none). */
112
+ get addVoices(): RealtimeVoiceOption[];
113
+ /** Records the add-agent MODEL choice; clears the voice so it can't outlive a model switch. */
114
+ onAddModelChange(event: Event): void;
115
+ /** Records the add-agent VOICE choice. */
116
+ onAddVoiceChange(event: Event): void;
117
+ /** @see LiveKitRoomComponent.Layout */
118
+ Layout: LiveKitRoomLayout;
119
+ /** @see LiveKitRoomComponent.Title */
120
+ Title: string | null;
121
+ /** @see LiveKitRoomComponent.ShowHeader */
122
+ ShowHeader: boolean;
123
+ /** @see LiveKitRoomComponent.ShowControlBar */
124
+ ShowControlBar: boolean;
125
+ /** @see LiveKitRoomComponent.ShowChat */
126
+ ShowChat: boolean;
127
+ /** @see LiveKitRoomComponent.ShowParticipantsPanel */
128
+ ShowParticipantsPanel: boolean;
129
+ /** @see LiveKitRoomComponent.EnableMicrophoneControl */
130
+ EnableMicrophoneControl: boolean;
131
+ /** @see LiveKitRoomComponent.EnableCameraControl */
132
+ EnableCameraControl: boolean;
133
+ /** @see LiveKitRoomComponent.EnableScreenShareControl */
134
+ EnableScreenShareControl: boolean;
135
+ /** @see LiveKitRoomComponent.EnableDeviceSettings */
136
+ EnableDeviceSettings: boolean;
137
+ /** @see LiveKitRoomComponent.EnableLeaveControl */
138
+ EnableLeaveControl: boolean;
139
+ /** @see LiveKitRoomComponent.StartWithMicrophone */
140
+ StartWithMicrophone: boolean;
141
+ /** @see LiveKitRoomComponent.StartWithCamera */
142
+ StartWithCamera: boolean;
143
+ /** @see LiveKitRoomComponent.AgentAvatarUrl */
144
+ AgentAvatarUrl: string | null;
145
+ /** @see LiveKitRoomComponent.EnablePinning */
146
+ EnablePinning: boolean;
147
+ /** @see LiveKitRoomComponent.EnableLayoutSwitcher */
148
+ EnableLayoutSwitcher: boolean;
149
+ /** @see LiveKitRoomComponent.EnableNoiseFilter */
150
+ EnableNoiseFilter: boolean;
151
+ /** @see LiveKitRoomComponent.EnableBackgroundEffects */
152
+ EnableBackgroundEffects: boolean;
153
+ /** @see LiveKitRoomComponent.ShowAgentState */
154
+ ShowAgentState: boolean;
155
+ /** @see LiveKitRoomComponent.ShowWhiteboard */
156
+ ShowWhiteboard: boolean;
157
+ /** @see LiveKitRoomComponent.ShowPreJoin */
158
+ ShowPreJoin: boolean;
159
+ /** Enable the server-authorized recording control (composite egress). */
160
+ EnableRecording: boolean;
161
+ /** @see LiveKitRoomComponent.E2EEPassphrase */
162
+ E2EEPassphrase: string | null;
163
+ /** @see LiveKitRoomComponent.E2EEWorker */
164
+ E2EEWorker: Worker | null;
165
+ /** Emitted once the agent room session is started (agent mode). */
166
+ SessionStarted: EventEmitter<MJLiveKitSessionStartedEvent>;
167
+ /**
168
+ * Emitted (with the room name) when the user clicks "Invite people". The host (e.g. the Explorer
169
+ * resource) opens an MJ user-picker and calls the invite mutation — kept out of this generic
170
+ * component, which knows nothing about MJ users.
171
+ */
172
+ InvitePeopleRequested: EventEmitter<string>;
173
+ /** Emitted when the room connects. */
174
+ Connected: EventEmitter<LiveKitRoomState>;
175
+ /** Emitted when the room disconnects. */
176
+ Disconnected: EventEmitter<LiveKitDisconnectedEvent>;
177
+ /** Emitted when a participant joins. */
178
+ ParticipantJoined: EventEmitter<LiveKitParticipantJoinedEvent>;
179
+ /** Emitted when a participant leaves. */
180
+ ParticipantLeft: EventEmitter<LiveKitParticipantLeftEvent>;
181
+ /** Emitted for inbound data-channel messages. */
182
+ DataReceived: EventEmitter<LiveKitDataMessage>;
183
+ /** Emitted on room errors (and on token/session-resolution failures). */
184
+ ErrorOccurred: EventEmitter<LiveKitRoomError>;
185
+ /** Whether the binding is resolving the token/session. */
186
+ loading: boolean;
187
+ /** The token/session-resolution error, if any. */
188
+ errorMessage: string | null;
189
+ /** The resolved LiveKit server URL. */
190
+ serverUrl: string | null;
191
+ /** The resolved access token. */
192
+ token: string | null;
193
+ /** The display name passed to the room. */
194
+ resolvedDisplayName: string | null;
195
+ /** The resolved room name (for recording calls). */
196
+ resolvedRoomName: string | null;
197
+ /** Whether a recording is currently in progress. */
198
+ isRecording: boolean;
199
+ /** The active egress id, when recording. */
200
+ private currentEgressId;
201
+ ngOnInit(): void;
202
+ /**
203
+ * Max time to wait for the connection to start before surfacing a retryable error, so a hung or very
204
+ * slow server (e.g. an agent bot that can't reach the LiveKit media path) doesn't spin forever. Set
205
+ * `0` to disable the client-side timeout.
206
+ */
207
+ ConnectTimeoutMs: number;
208
+ /** Resolves the connection (mints a token and, in agent mode, starts the agent session). */
209
+ Start(): Promise<void>;
210
+ /**
211
+ * Races `op` against a timeout: if it hasn't settled within `ms`, rejects with a clear, retryable
212
+ * message (the template's "Try again" button re-runs {@link Start}). A non-positive `ms` disables it.
213
+ */
214
+ private withTimeout;
215
+ /** Starts the agent room session and applies the returned client token. */
216
+ private startAgentSession;
217
+ /** Picker selection handler for the in-room "Add an agent" control (native select; no FormsModule dep). */
218
+ onAddTargetChange(event: Event): void;
219
+ /**
220
+ * Adds another agent to the SAME room — starts a new bridge (the co-agent voicing the chosen target)
221
+ * and appends it to the roster. The new bot joins the live room alongside the existing participants.
222
+ */
223
+ AddAgent(): Promise<void>;
224
+ /** Removes an agent from the room — stops its bridge and drops it from the roster. */
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>;
235
+ /**
236
+ * Builds the shareable invite URL for THIS room: the current page URL with a `room=<roomName>` query
237
+ * param. Opening it lands the invitee on the Live Room in join mode for the same room.
238
+ */
239
+ get inviteUrl(): string;
240
+ /** Copies {@link inviteUrl} to the clipboard and flips the pill to "Link copied" briefly. */
241
+ CopyInvite(): Promise<void>;
242
+ /** Joins an existing room by minting a client token. */
243
+ private joinRoom;
244
+ /** Toggles room recording via the RealtimeBridge GraphQL surface (server-authorized egress). */
245
+ onToggleRecording(): Promise<void>;
246
+ /** Records a failure and emits an error event. */
247
+ private fail;
248
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJLiveKitRoomComponent, 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>;
250
+ }
251
+ //# sourceMappingURL=mj-livekit-room.component.d.ts.map
@@ -0,0 +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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"}