@memberjunction/ai-bridge-livekit 0.0.1 → 5.42.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.
@@ -0,0 +1,187 @@
1
+ /**
2
+ * The injectable **LiveKit room SDK seam** — the minimal set of operations
3
+ * {@link import('./livekit-bridge.js').LiveKitBridge} needs from LiveKit, declared as an interface so the
4
+ * driver builds and unit-tests against an in-memory fake with **no network and no real LiveKit SDK**.
5
+ *
6
+ * ## LiveKit is the MJ-NATIVE room (self-hosted), not a 3rd-party platform
7
+ * Every OTHER bridge in this program connects **out** to a meeting hosted by someone else (Zoom,
8
+ * Teams, Meet, Webex, Slack, Discord) or to a telephony carrier (Twilio, Vonage, RingCentral). LiveKit
9
+ * is the opposite: it is an **open-source WebRTC SFU that MJ runs itself** — the "MJ-native room"
10
+ * (`/plans/realtime/realtime-bridges-architecture.md` §4c). The architecture deliberately treats a Zoom
11
+ * meeting, a Teams meeting, and an MJ-native LiveKit room **identically** — all are multi-party media
12
+ * transports — so LiveKit is "*another bridge, not a special build*." The only practical differences:
13
+ * - **We own the room.** No marketplace review, no per-platform bot-admission quirks; MJ mints the
14
+ * access token and the room exists because MJ stood up the SFU. An MJ-native multi-party experience
15
+ * (e.g. embedded in Explorer) is just *this* bridge.
16
+ * - **`connect(roomUrl, token)`** takes a LiveKit room URL + a signed access token (minted upstream by
17
+ * MJ's credential/token layer — never inline secrets), rather than a join URL we were handed.
18
+ *
19
+ * ## Production binding (TODO at deployment)
20
+ * In production this interface is bound to **`livekit-server-sdk`** (token minting / room admin) plus a
21
+ * **room client** (the Node WebRTC participant — e.g. `@livekit/rtc-node`) so the bot can publish/
22
+ * subscribe media. The named operations map to the SDK as follows:
23
+ * - {@link connect} / {@link disconnect} → the room client `connect()` / `disconnect()` lifecycle.
24
+ * - {@link publishAudioFrame} → publishing PCM on the bot's audio track (the agent's voice).
25
+ * - {@link onAudioTrack} → subscribing each remote participant's audio track; LiveKit delivers tracks
26
+ * **per participant**, which is the native source of speaker labels for diarization (no extra mixer).
27
+ * - {@link publishVideoFrame} / {@link publishScreenFrame} → publishing the bot's camera / screen-share
28
+ * tracks (LiveKit does full A/V/screen; the realtime models light audio first).
29
+ * - {@link onParticipantJoin} / {@link onParticipantLeave} / {@link getParticipants} → the room's
30
+ * `ParticipantConnected` / `ParticipantDisconnected` events + the participant list.
31
+ * - {@link sendDataMessage} → the LiveKit **data channel** (reliable data publish) — used for chat.
32
+ * - {@link onDisconnected} → the room `Disconnected` event (the SFU closed / the bot was removed).
33
+ *
34
+ * ## Echo / self-audio
35
+ * A LiveKit SFU **never delivers a participant its own published track back** — the bot does not hear
36
+ * its own voice, so no echo gate is needed here (documented in {@link onAudioTrack}). The bridge still
37
+ * flags its own track via {@link LiveKitParticipant.IsLocal} defensively.
38
+ *
39
+ * Binding the real SDK is a thin adapter that implements this interface; the driver and its tests do
40
+ * not change. **None of the SDK types leak into this package.**
41
+ *
42
+ * See `/plans/realtime/realtime-bridges-architecture.md` §4c and `/guides/REALTIME_BRIDGES_GUIDE.md`.
43
+ */
44
+ /** The role a LiveKit participant holds, normalized to the bridge's participant roles. */
45
+ export type LiveKitParticipantRole = 'Host' | 'CoHost' | 'Participant';
46
+ /**
47
+ * One LiveKit room participant as the seam reports it. Platform-native and minimal — the driver maps
48
+ * this onto `BridgeParticipantInfo` / `BridgeMeetingParticipant`.
49
+ */
50
+ export interface LiveKitParticipant {
51
+ /** The LiveKit participant identity (stable, application-assigned — the SID's human-facing key). */
52
+ Identity: string;
53
+ /** The participant's display name as LiveKit reports it (the `name` attribute), when set. */
54
+ DisplayName?: string;
55
+ /** The participant's room role (derived from participant metadata / permissions by the adapter). */
56
+ Role: LiveKitParticipantRole;
57
+ /** Whether this participant is the bridge's own bot (LiveKit's local participant). */
58
+ IsLocal?: boolean;
59
+ }
60
+ /**
61
+ * One frame of raw per-participant audio the seam surfaces for diarization + the agent's "hearing".
62
+ * Because LiveKit subscribes tracks **per participant**, every inbound frame is already attributed to a
63
+ * single speaker — diarization comes free from the SFU.
64
+ */
65
+ export interface LiveKitAudioFrame {
66
+ /** Raw PCM audio bytes for this frame. */
67
+ Pcm: ArrayBuffer;
68
+ /** The LiveKit participant identity this audio came from (the diarization speaker label). */
69
+ ParticipantIdentity: string;
70
+ /** The participant's display name at capture time, when known. */
71
+ DisplayName?: string;
72
+ /** Optional epoch-ms capture timestamp. */
73
+ TimestampMs?: number;
74
+ }
75
+ /** Arguments to {@link ILiveKitRoomSdk.connect} — what the bot needs to join an MJ-native room. */
76
+ export interface LiveKitConnectArgs {
77
+ /** The LiveKit room server URL (e.g. `wss://livekit.myorg.com`). MJ-owned, self-hosted. */
78
+ RoomUrl: string;
79
+ /**
80
+ * The signed LiveKit access token authorizing the bot to join a specific room as a participant.
81
+ * Minted upstream by MJ's token/credential layer (it encodes the room name + grants). Never inline
82
+ * secrets — this arrives already-signed.
83
+ */
84
+ AccessToken: string;
85
+ /** The display name the bot appears as in the participant list. */
86
+ BotDisplayName: string;
87
+ }
88
+ /** The handles the seam returns after a successful {@link ILiveKitRoomSdk.connect}. */
89
+ export interface LiveKitConnectResult {
90
+ /** The bot's own participant identity in the joined room. */
91
+ BotIdentity: string;
92
+ /** The LiveKit room name the bot joined (the durable external connection id). */
93
+ RoomName: string;
94
+ }
95
+ /**
96
+ * The minimal LiveKit room SDK surface the {@link import('./livekit-bridge.js').LiveKitBridge} depends on.
97
+ * Production binds this to `livekit-server-sdk` + a room client; tests inject a `FakeLiveKitRoomSdk`.
98
+ */
99
+ export interface ILiveKitRoomSdk {
100
+ /**
101
+ * Connects to the MJ-native LiveKit room as a bot participant and brings the bot online. Returns
102
+ * the bot's identity + the room name.
103
+ *
104
+ * @param args Connect parameters (room URL, signed access token, bot name).
105
+ * @returns The bot identity + room handles.
106
+ */
107
+ connect(args: LiveKitConnectArgs): Promise<LiveKitConnectResult>;
108
+ /** Disconnects from the room and releases SDK resources. */
109
+ disconnect(): Promise<void>;
110
+ /**
111
+ * Publishes one raw PCM audio frame on the bot's audio track (the agent's voice into the room).
112
+ *
113
+ * @param pcm The PCM audio bytes to publish.
114
+ */
115
+ publishAudioFrame(pcm: ArrayBuffer): void;
116
+ /**
117
+ * Flushes all pending/queued outbound audio (the agent's voice). Called on barge-in so the agent
118
+ * stops talking immediately instead of draining already-buffered audio after the model is cut off.
119
+ */
120
+ flushOutboundAudio(): void;
121
+ /**
122
+ * Subscribes inbound per-participant audio frames (what the agent hears, carrying the speaker
123
+ * identity for diarization). "Latest handler wins." The SFU never echoes the bot's own published
124
+ * audio back, so frames here are always from OTHER participants.
125
+ *
126
+ * @param cb Invoked with each inbound, per-participant audio frame.
127
+ */
128
+ onAudioTrack(cb: (frame: LiveKitAudioFrame) => void): void;
129
+ /**
130
+ * Publishes one raw video frame on the bot's camera track. LiveKit does full video; the realtime
131
+ * models light audio first, so this is wired but typically unused until a model emits video.
132
+ *
133
+ * @param frame The encoded/raw video frame bytes to publish.
134
+ */
135
+ publishVideoFrame(frame: ArrayBuffer): void;
136
+ /**
137
+ * Publishes one raw screen-share frame on the bot's screen track (e.g. a Remote Browser channel's
138
+ * viewport). LiveKit does full screen share.
139
+ *
140
+ * @param frame The encoded/raw screen frame bytes to publish.
141
+ */
142
+ publishScreenFrame(frame: ArrayBuffer): void;
143
+ /**
144
+ * Registers a callback fired when a participant connects. "Latest handler wins."
145
+ *
146
+ * @param cb Invoked with the participant who joined.
147
+ */
148
+ onParticipantJoin(cb: (participant: LiveKitParticipant) => void): void;
149
+ /**
150
+ * Registers a callback fired when a participant disconnects. "Latest handler wins."
151
+ *
152
+ * @param cb Invoked with the participant identity that left.
153
+ */
154
+ onParticipantLeave(cb: (participantIdentity: string) => void): void;
155
+ /**
156
+ * Returns the current participant list (including the bot).
157
+ *
158
+ * @returns The current participants.
159
+ */
160
+ getParticipants(): Promise<LiveKitParticipant[]>;
161
+ /**
162
+ * Sends a text message on the LiveKit data channel (reliable publish to all participants) — the
163
+ * room-native "chat".
164
+ *
165
+ * @param text The chat/data message text.
166
+ */
167
+ sendDataMessage(text: string): Promise<void>;
168
+ /**
169
+ * Registers a callback fired when the room disconnects the bot (SFU closed / bot removed). "Latest
170
+ * handler wins."
171
+ *
172
+ * @param cb Invoked when the room has disconnected.
173
+ */
174
+ onDisconnected(cb: () => void): void;
175
+ }
176
+ /**
177
+ * A factory that constructs an {@link ILiveKitRoomSdk} for a session — the creation seam (mirroring
178
+ * Zoom's `ZoomMeetingSdkFactory`). Production supplies a factory that builds the real LiveKit adapter
179
+ * (`livekit-server-sdk` + a room client) from resolved config; tests supply one that returns a
180
+ * `FakeLiveKitRoomSdk`.
181
+ *
182
+ * @param config The resolved provider/session configuration (room URL, region, credential refs already
183
+ * resolved upstream into a signed token).
184
+ * @returns The LiveKit room SDK instance to drive the room with.
185
+ */
186
+ export type LiveKitRoomSdkFactory = (config?: Record<string, unknown>) => ILiveKitRoomSdk;
187
+ //# sourceMappingURL=livekit-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit-sdk.d.ts","sourceRoot":"","sources":["../src/livekit-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,0FAA0F;AAC1F,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAC;AAEvE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IAC/B,oGAAoG;IACpG,QAAQ,EAAE,MAAM,CAAC;IACjB,6FAA6F;IAC7F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oGAAoG;IACpG,IAAI,EAAE,sBAAsB,CAAC;IAC7B,sFAAsF;IACtF,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,0CAA0C;IAC1C,GAAG,EAAE,WAAW,CAAC;IACjB,6FAA6F;IAC7F,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mGAAmG;AACnG,MAAM,WAAW,kBAAkB;IAC/B,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,uFAAuF;AACvF,MAAM,WAAW,oBAAoB;IACjC,6DAA6D;IAC7D,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC5B;;;;;;OAMG;IACH,OAAO,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEjE,4DAA4D;IAC5D,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;OAIG;IACH,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAE1C;;;OAGG;IACH,kBAAkB,IAAI,IAAI,CAAC;IAE3B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI,CAAC;IAE3D;;;;;OAKG;IACH,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAE5C;;;;;OAKG;IACH,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAE7C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI,CAAC;IAEvE;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,EAAE,CAAC,mBAAmB,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAEpE;;;;OAIG;IACH,eAAe,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEjD;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7C;;;;;OAKG;IACH,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACxC;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,eAAe,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The injectable **LiveKit room SDK seam** — the minimal set of operations
3
+ * {@link import('./livekit-bridge.js').LiveKitBridge} needs from LiveKit, declared as an interface so the
4
+ * driver builds and unit-tests against an in-memory fake with **no network and no real LiveKit SDK**.
5
+ *
6
+ * ## LiveKit is the MJ-NATIVE room (self-hosted), not a 3rd-party platform
7
+ * Every OTHER bridge in this program connects **out** to a meeting hosted by someone else (Zoom,
8
+ * Teams, Meet, Webex, Slack, Discord) or to a telephony carrier (Twilio, Vonage, RingCentral). LiveKit
9
+ * is the opposite: it is an **open-source WebRTC SFU that MJ runs itself** — the "MJ-native room"
10
+ * (`/plans/realtime/realtime-bridges-architecture.md` §4c). The architecture deliberately treats a Zoom
11
+ * meeting, a Teams meeting, and an MJ-native LiveKit room **identically** — all are multi-party media
12
+ * transports — so LiveKit is "*another bridge, not a special build*." The only practical differences:
13
+ * - **We own the room.** No marketplace review, no per-platform bot-admission quirks; MJ mints the
14
+ * access token and the room exists because MJ stood up the SFU. An MJ-native multi-party experience
15
+ * (e.g. embedded in Explorer) is just *this* bridge.
16
+ * - **`connect(roomUrl, token)`** takes a LiveKit room URL + a signed access token (minted upstream by
17
+ * MJ's credential/token layer — never inline secrets), rather than a join URL we were handed.
18
+ *
19
+ * ## Production binding (TODO at deployment)
20
+ * In production this interface is bound to **`livekit-server-sdk`** (token minting / room admin) plus a
21
+ * **room client** (the Node WebRTC participant — e.g. `@livekit/rtc-node`) so the bot can publish/
22
+ * subscribe media. The named operations map to the SDK as follows:
23
+ * - {@link connect} / {@link disconnect} → the room client `connect()` / `disconnect()` lifecycle.
24
+ * - {@link publishAudioFrame} → publishing PCM on the bot's audio track (the agent's voice).
25
+ * - {@link onAudioTrack} → subscribing each remote participant's audio track; LiveKit delivers tracks
26
+ * **per participant**, which is the native source of speaker labels for diarization (no extra mixer).
27
+ * - {@link publishVideoFrame} / {@link publishScreenFrame} → publishing the bot's camera / screen-share
28
+ * tracks (LiveKit does full A/V/screen; the realtime models light audio first).
29
+ * - {@link onParticipantJoin} / {@link onParticipantLeave} / {@link getParticipants} → the room's
30
+ * `ParticipantConnected` / `ParticipantDisconnected` events + the participant list.
31
+ * - {@link sendDataMessage} → the LiveKit **data channel** (reliable data publish) — used for chat.
32
+ * - {@link onDisconnected} → the room `Disconnected` event (the SFU closed / the bot was removed).
33
+ *
34
+ * ## Echo / self-audio
35
+ * A LiveKit SFU **never delivers a participant its own published track back** — the bot does not hear
36
+ * its own voice, so no echo gate is needed here (documented in {@link onAudioTrack}). The bridge still
37
+ * flags its own track via {@link LiveKitParticipant.IsLocal} defensively.
38
+ *
39
+ * Binding the real SDK is a thin adapter that implements this interface; the driver and its tests do
40
+ * not change. **None of the SDK types leak into this package.**
41
+ *
42
+ * See `/plans/realtime/realtime-bridges-architecture.md` §4c and `/guides/REALTIME_BRIDGES_GUIDE.md`.
43
+ */
44
+ export {};
45
+ //# sourceMappingURL=livekit-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit-sdk.js","sourceRoot":"","sources":["../src/livekit-sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview Registers the LiveKit **native two-way** SDK binding into the {@link BridgeNativeSdkRegistry}
3
+ * so `AIBridgeEngine.StartBridgeSession` auto-binds it onto a resolved `LiveKitBridge` before connect — no
4
+ * per-deployment wiring needed. The typed downcast + `SetSdkFactory` stay confined here (where the concrete
5
+ * `LiveKitBridge` type is known), keeping the engine seam free of provider types.
6
+ *
7
+ * A host can still override per-session via `StartBridgeSessionParams.BindSdk` — e.g. to inject a fake in a
8
+ * test instead of the native two-way default.
9
+ *
10
+ * @module @memberjunction/ai-bridge-livekit
11
+ * @author MemberJunction.com
12
+ */
13
+ /**
14
+ * Registers LiveKit's native two-way binding. Idempotent (latest-wins in the registry), and invoked from the
15
+ * package `index.ts` so merely importing `@memberjunction/ai-bridge-livekit` wires the default binding. Also
16
+ * exported as a tree-shake-safe no-op-returning function callers can reference to force-retain the module.
17
+ */
18
+ export declare function RegisterLiveKitNativeSdk(): void;
19
+ //# sourceMappingURL=register-native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-native.d.ts","sourceRoot":"","sources":["../src/register-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAO/C"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview Registers the LiveKit **native two-way** SDK binding into the {@link BridgeNativeSdkRegistry}
3
+ * so `AIBridgeEngine.StartBridgeSession` auto-binds it onto a resolved `LiveKitBridge` before connect — no
4
+ * per-deployment wiring needed. The typed downcast + `SetSdkFactory` stay confined here (where the concrete
5
+ * `LiveKitBridge` type is known), keeping the engine seam free of provider types.
6
+ *
7
+ * A host can still override per-session via `StartBridgeSessionParams.BindSdk` — e.g. to inject a fake in a
8
+ * test instead of the native two-way default.
9
+ *
10
+ * @module @memberjunction/ai-bridge-livekit
11
+ * @author MemberJunction.com
12
+ */
13
+ import { BridgeNativeSdkRegistry } from '@memberjunction/ai-bridge-base';
14
+ import { BindLiveKitNative } from './livekit-native-sdk.js';
15
+ /** The `MJ: AI Bridge Providers.DriverClass` value the LiveKit provider row carries. */
16
+ const LIVEKIT_DRIVER_CLASS = 'LiveKitBridge';
17
+ /**
18
+ * Registers LiveKit's native two-way binding. Idempotent (latest-wins in the registry), and invoked from the
19
+ * package `index.ts` so merely importing `@memberjunction/ai-bridge-livekit` wires the default binding. Also
20
+ * exported as a tree-shake-safe no-op-returning function callers can reference to force-retain the module.
21
+ */
22
+ export function RegisterLiveKitNativeSdk() {
23
+ BridgeNativeSdkRegistry.Instance.Register(LIVEKIT_DRIVER_CLASS, (driver) => {
24
+ // Safe downcast: the registry is keyed by DriverClass, so the engine only ever applies this to the
25
+ // LiveKitBridge it resolved for 'LiveKitBridge'. BindLiveKitNative() defaults to the lazy native
26
+ // loader, which reads NativeModuleSpecifier from the per-session Configuration.
27
+ driver.SetSdkFactory(BindLiveKitNative());
28
+ });
29
+ }
30
+ // Register on import (mirrors the LoadLiveKitBridge() tree-shake pattern in index.ts).
31
+ RegisterLiveKitNativeSdk();
32
+ //# sourceMappingURL=register-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-native.js","sourceRoot":"","sources":["../src/register-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,uBAAuB,EAAsB,MAAM,gCAAgC,CAAC;AAE7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,wFAAwF;AACxF,MAAM,oBAAoB,GAAG,eAAe,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,wBAAwB;IACpC,uBAAuB,CAAC,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,MAA0B,EAAE,EAAE;QAC3F,mGAAmG;QACnG,iGAAiG;QACjG,gFAAgF;QAC/E,MAAwB,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,uFAAuF;AACvF,wBAAwB,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,35 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-bridge-livekit",
3
- "version": "0.0.1",
4
- "description": "OIDC trusted publishing setup package for @memberjunction/ai-bridge-livekit",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
3
+ "type": "module",
4
+ "version": "5.42.0",
5
+ "description": "MemberJunction: LiveKit Realtime Bridge driver — the MJ-native multi-party room. Unlike the other bridges (which connect OUT to a 3rd-party meeting platform), LiveKit is a SELF-HOSTED WebRTC SFU that MJ runs itself. Connects the realtime agent engine to a LiveKit room as a bot participant (audio/video/screen in+out, per-participant diarization, data-channel chat) via an injectable LiveKit room SDK seam, and contributes a Meeting Controls facilitator channel.",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "/dist"
10
+ ],
11
+ "scripts": {
12
+ "start": "ts-node-dev src/index.ts",
13
+ "build": "tsc && tsc-alias -f",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest"
16
+ },
17
+ "author": "MemberJunction.com",
18
+ "license": "ISC",
19
+ "dependencies": {
20
+ "@memberjunction/core": "5.42.0",
21
+ "@memberjunction/global": "5.42.0",
22
+ "@memberjunction/core-entities": "5.42.0",
23
+ "@memberjunction/ai-bridge-base": "5.42.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "24.10.11",
27
+ "ts-node-dev": "^2.0.0",
28
+ "typescript": "^5.9.3",
29
+ "vitest": "^4.0.18"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "https://github.com/MemberJunction/MJ"
34
+ }
10
35
  }