@memberjunction/livekit-room-server 6.2.0-edge.3 → 6.2.0-edge.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/livekit-agent-room-coordinator.d.ts +120 -10
  6. package/dist/livekit-agent-room-coordinator.d.ts.map +1 -1
  7. package/dist/livekit-agent-room-coordinator.js +312 -68
  8. package/dist/livekit-agent-room-coordinator.js.map +1 -1
  9. package/dist/livekit-native-module.d.ts.map +1 -1
  10. package/dist/livekit-native-module.js +7 -0
  11. package/dist/livekit-native-module.js.map +1 -1
  12. package/dist/livekit-participant-service.d.ts +47 -0
  13. package/dist/livekit-participant-service.d.ts.map +1 -0
  14. package/dist/livekit-participant-service.js +64 -0
  15. package/dist/livekit-participant-service.js.map +1 -0
  16. package/dist/livekit-token-service.d.ts +20 -5
  17. package/dist/livekit-token-service.d.ts.map +1 -1
  18. package/dist/livekit-token-service.js +14 -7
  19. package/dist/livekit-token-service.js.map +1 -1
  20. package/dist/meeting-dial-in-service.d.ts +32 -1
  21. package/dist/meeting-dial-in-service.d.ts.map +1 -1
  22. package/dist/meeting-dial-in-service.js +83 -11
  23. package/dist/meeting-dial-in-service.js.map +1 -1
  24. package/dist/room-handoff/handoff-offer-registry.d.ts +10 -0
  25. package/dist/room-handoff/handoff-offer-registry.d.ts.map +1 -1
  26. package/dist/room-handoff/handoff-offer-registry.js +40 -13
  27. package/dist/room-handoff/handoff-offer-registry.js.map +1 -1
  28. package/dist/room-handoff/handoff-types.d.ts +11 -9
  29. package/dist/room-handoff/handoff-types.d.ts.map +1 -1
  30. package/dist/room-handoff/room-handoff-engine.d.ts +9 -1
  31. package/dist/room-handoff/room-handoff-engine.d.ts.map +1 -1
  32. package/dist/room-handoff/room-handoff-engine.js +40 -7
  33. package/dist/room-handoff/room-handoff-engine.js.map +1 -1
  34. package/package.json +13 -12
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * @fileoverview {@link LiveKitAgentRoomCoordinator} — the server-side **session-start harness** for the
3
3
  * MJ-native LiveKit room (§1 of the realtime-bridge buildout plan). Given an agent + a room, it:
4
- * 1. mints the agent bot's scoped LiveKit token ({@link LiveKitTokenService}),
5
- * 2. opens the realtime model session via an injectable {@link RealtimeSessionFactory} seam, and
4
+ * 1. opens the realtime model session via an injectable {@link RealtimeSessionFactory} seam,
5
+ * 2. mints the agent bot's scoped LiveKit token ({@link LiveKitTokenService}), whose attributes depend on the session, and
6
6
  * 3. bridges that session into the room through {@link AIBridgeEngine.StartBridgeSession} (which wires
7
7
  * the transport seam + turn-taking automatically).
8
+ * A start that fails after step 1 closes the model session before the error propagates, recording the failure on the
9
+ * agent's co-agent run first ({@link FailedStartRecorder}).
8
10
  *
9
11
  * The realtime-session factory is a seam (mirroring `LiveKitBridge.SetSdkFactory`): production binds it to
10
12
  * the real model-resolution path (`@memberjunction/ai-agents`), and tests/de-risk inject a stub session.
@@ -12,14 +14,38 @@
12
14
  *
13
15
  * @module @memberjunction/livekit-room-server
14
16
  */
15
- import { BaseSingleton } from '@memberjunction/global';
17
+ import { BaseSingleton, NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
16
18
  import { LogError, LogStatus } from '@memberjunction/core';
19
+ import { AgentAvatarAttributes, AgentParticipantIdentity, AgentWatchesAttributes, InboundVideoStreamsOf, ResolveIsModelFullDuplex, } from '@memberjunction/ai';
20
+ import { DefaultNativeLoader } from '@memberjunction/ai-bridge-livekit';
21
+ import { AIEngine } from '@memberjunction/aiengine';
17
22
  import { AlwaysAddressedMatcher, RegexAddressedMatcher, TURN_TAKING_TOOL_DEFINITIONS, } from '@memberjunction/ai-bridge-base';
18
23
  import { AIBridgeEngine, } from '@memberjunction/ai-bridge-server';
19
24
  import { LiveKitTokenService } from './livekit-token-service.js';
20
25
  import { ResolveLiveKitNativeModuleSpecifier } from './livekit-native-module.js';
26
+ /**
27
+ * Static capability map for known realtime drivers when resolving full-duplex capability before session connect.
28
+ * Avoids class-name substring heuristics.
29
+ */
30
+ const DRIVER_STATIC_CAPABILITIES = {
31
+ OpenAILiveRealtime: { FullDuplex: true },
32
+ };
33
+ function GetDriverStaticCapabilities(driverClass) {
34
+ if (!driverClass) {
35
+ return null;
36
+ }
37
+ const key = driverClass.trim().toLowerCase();
38
+ for (const [cls, caps] of Object.entries(DRIVER_STATIC_CAPABILITIES)) {
39
+ if (cls.toLowerCase() === key) {
40
+ return caps;
41
+ }
42
+ }
43
+ return null;
44
+ }
21
45
  /** The `DriverClass` the LiveKit bridge registers under (must match the `MJ: AI Bridge Providers` row). */
22
46
  export const LIVEKIT_BRIDGE_DRIVER_CLASS = 'LiveKitBridge';
47
+ /** The answer for a phone call: the module is not asked. */
48
+ const PHONE_CALL_AVATAR_VIDEO = { Supported: false, Reason: 'phone' };
23
49
  /**
24
50
  * Coordinates starting (and stopping) an agent's presence in a LiveKit room. A process-wide singleton
25
51
  * (per MJ convention) so deployment code can bind the realtime-session factory once at startup and the
@@ -69,6 +95,24 @@ export class LiveKitAgentRoomCoordinator extends BaseSingleton {
69
95
  SetTurnToolBinder(binder) {
70
96
  this.turnToolBinder = binder;
71
97
  }
98
+ /**
99
+ * Binds the seam that says whether the agent behind a model session watches meetings. Without it no agent watches:
100
+ * the bot reads nobody's camera or screen and the room never offers people the choice.
101
+ *
102
+ * @param resolver The resolver, or `undefined` to clear it.
103
+ */
104
+ SetAgentVisionResolver(resolver) {
105
+ this.agentVisionResolver = resolver;
106
+ }
107
+ /**
108
+ * Binds the seam that records a failed start on the agent's co-agent run. Without it, the run of an agent whose start
109
+ * failed reads as completed: closing its model session finalizes the run that way.
110
+ *
111
+ * @param recorder The recorder, or `undefined` to clear it.
112
+ */
113
+ SetFailedStartRecorder(recorder) {
114
+ this.failedStartRecorder = recorder;
115
+ }
72
116
  /**
73
117
  * Overrides where a room's turn-taking snapshot comes from (an injectable seam for unit testing; production
74
118
  * reads the process-wide {@link AIBridgeEngine}).
@@ -106,12 +150,18 @@ export class LiveKitAgentRoomCoordinator extends BaseSingleton {
106
150
  this.bridgeOps = ops;
107
151
  }
108
152
  /**
109
- * Starts the agent's presence in a LiveKit room: mints the bot token, opens the realtime session, and
110
- * bridges it into the room.
153
+ * Starts the agent's presence in a LiveKit room: opens the realtime session, mints the bot token, and
154
+ * bridges the session into the room.
155
+ *
156
+ * A start that fails once the model session is open (the bot token can't be minted, the bridge doesn't start) closes
157
+ * that session before the error propagates, after recording the failure, with the start's error, on the session's
158
+ * co-agent run ({@link SetFailedStartRecorder}), which would otherwise read as completed. The agent session it runs under
159
+ * (`AgentSessionID`) is the caller's: a caller that created one for this start closes it.
111
160
  *
112
161
  * @param params The session parameters.
113
162
  * @returns The active session handles.
114
- * @throws {Error} when the LiveKit provider is not configured/registered or the session factory is unbound.
163
+ * @throws {Error} when the LiveKit provider is not configured/registered, the session factory is unbound or fails,
164
+ * the bot token can't be minted, or the bridge doesn't start.
115
165
  */
116
166
  async StartAgentRoomSession(params) {
117
167
  await this.bridgeOps.Config(false, params.ContextUser, params.MetadataProvider);
@@ -121,8 +171,11 @@ export class LiveKitAgentRoomCoordinator extends BaseSingleton {
121
171
  'Seed/activate the LiveKit provider row before starting a room session.');
122
172
  }
123
173
  const botName = params.AgentName ?? 'Agent';
124
- const botIdentity = `agent-${params.AgentSessionID}`;
125
- const botToken = await this.tokenService.MintBotToken(params.RoomName, botIdentity, botName);
174
+ // `agent-<agent session id>`: the identity the bridge, the engine and other agents' bots read as an agent's.
175
+ const botIdentity = AgentParticipantIdentity(params.AgentSessionID);
176
+ // Fail before opening a model session when LiveKit isn't configured. The bot's token itself is minted once the
177
+ // session is open, because whether the bot watches depends on the session (see agentWatches).
178
+ this.tokenService.AssertConfigured();
126
179
  // Multi-agent MEETING detection: if the room already holds an agent, THIS agent joins as a meeting
127
180
  // participant — auto-response OFF, speaks only when addressed by name. When a room becomes multi-agent
128
181
  // the agents ALREADY in it are retroactively re-gated too (capability-permitting — see below). The names
@@ -137,17 +190,30 @@ export class LiveKitAgentRoomCoordinator extends BaseSingleton {
137
190
  // (gated meeting mode + LLM router) for controlled scenarios (webinars, large rooms, weaker models).
138
191
  const moderatorMode = process.env.MJ_REALTIME_MODERATOR_MODE === 'on';
139
192
  const isMeeting = moderatorMode && existingAgents.length > 0;
140
- // A full-duplex model judges for itself whether it was addressed and uses the turn-taking tools; a gated
141
- // meeting (moderator mode) decides addressing by name in the engine, so the tools would only confuse it.
142
193
  const addressing = isMeeting ? 'Regex' : params.TurnAddressing ?? 'Auto';
194
+ let resolvedFullDuplex = params.FullDuplex;
195
+ if (resolvedFullDuplex === undefined && params.RealtimeModelID) {
196
+ resolvedFullDuplex = this.resolveIsModelFullDuplexFromId(params.RealtimeModelID);
197
+ }
143
198
  const host = params.Host;
144
- const turnTakingTools = addressing === 'Regex' ? [] : [...TURN_TAKING_TOOL_DEFINITIONS];
145
- const combinedHostTools = (host?.HostTools?.length ?? 0) > 0 || turnTakingTools.length > 0
146
- ? [...(host?.HostTools ?? []), ...turnTakingTools]
147
- : undefined;
199
+ const buildToolsForFullDuplex = (isFd) => {
200
+ const turnTakingTools = isFd || addressing === 'Regex' ? [] : [...TURN_TAKING_TOOL_DEFINITIONS];
201
+ return (host?.HostTools?.length ?? 0) > 0 || turnTakingTools.length > 0
202
+ ? [...(host?.HostTools ?? []), ...turnTakingTools]
203
+ : undefined;
204
+ };
205
+ // Whether this host's bot can publish the agent's avatar is asked BEFORE the model session opens, so a host that
206
+ // can't never asks the model for it (and is never billed for video nobody sees). Cleared if the avatar is taken down.
207
+ // A phone call is never asked about: the caller sees no video, so the session asks for no avatar at all.
208
+ const phoneCall = host?.Channel === 'phone';
209
+ const avatarVideo = phoneCall ? PHONE_CALL_AVATAR_VIDEO : await this.DescribeAvatarVideo();
210
+ let avatarDelivery = avatarVideo.Supported === true ? 'room' : undefined;
148
211
  let activeTurnHandler = undefined;
149
212
  const openModelSession = async (priorTranscript) => {
213
+ const initialTools = buildToolsForFullDuplex(resolvedFullDuplex ?? false);
150
214
  const opened = await this.sessionFactory({
215
+ AvatarDelivery: avatarDelivery,
216
+ PhoneCall: phoneCall || undefined,
151
217
  AgentID: params.AgentID,
152
218
  AgentName: params.AgentName,
153
219
  TargetAgentID: params.TargetAgentID,
@@ -160,72 +226,149 @@ export class LiveKitAgentRoomCoordinator extends BaseSingleton {
160
226
  AgentSessionID: params.AgentSessionID,
161
227
  MeetingMode: isMeeting || undefined,
162
228
  SelfNames: isMeeting ? selfNames : undefined,
163
- HostTools: combinedHostTools,
229
+ HostTools: initialTools,
164
230
  HostFraming: host?.HostFraming,
165
231
  ConversationID: host?.ConversationID,
166
232
  PriorTranscript: priorTranscript,
233
+ ResolveHostTools: (resolved) => {
234
+ if (resolvedFullDuplex === undefined) {
235
+ if (resolved.ModelID) {
236
+ const effective = AIEngine.Instance.GetEffectiveModelConfiguration(resolved.ModelID, resolved.ModelVendorID);
237
+ const model = (AIEngine.Instance.Models ?? []).find(m => UUIDsEqual(m.ID, resolved.ModelID));
238
+ const staticCaps = GetDriverStaticCapabilities(resolved.DriverClass);
239
+ resolvedFullDuplex = ResolveIsModelFullDuplex(effective ?? model?.ModelConfigurationObject, staticCaps);
240
+ }
241
+ else if (resolved.DriverClass) {
242
+ const staticCaps = GetDriverStaticCapabilities(resolved.DriverClass);
243
+ resolvedFullDuplex = staticCaps?.FullDuplex === true;
244
+ }
245
+ }
246
+ return buildToolsForFullDuplex(resolvedFullDuplex ?? false);
247
+ },
167
248
  });
249
+ const declaredTurnToolsInitially = !resolvedFullDuplex && addressing !== 'Regex';
250
+ if (resolvedFullDuplex === undefined) {
251
+ resolvedFullDuplex = opened.Capabilities?.FullDuplex === true;
252
+ }
253
+ else if (opened.Capabilities?.FullDuplex !== undefined && opened.Capabilities.FullDuplex !== resolvedFullDuplex) {
254
+ LogStatus(`[LiveKitAgentRoomCoordinator] WARNING: Session factory opened with Capabilities.FullDuplex=${opened.Capabilities.FullDuplex}, ` +
255
+ `which disagrees with pre-open resolved FullDuplex=${resolvedFullDuplex}. Initial tools may mismatch.`);
256
+ }
257
+ // If full duplex is active, but turn-taking tools were declared to the session initially
258
+ // (e.g. because full-duplex was only discovered after open, or custom factory ignored ResolveHostTools):
259
+ if (resolvedFullDuplex && declaredTurnToolsInitially) {
260
+ const desiredTools = buildToolsForFullDuplex(true);
261
+ try {
262
+ await opened.RegisterTools(desiredTools ?? []);
263
+ }
264
+ catch (err) {
265
+ LogError(`[LiveKitAgentRoomCoordinator] Failed to reconfigure tools after discovering FullDuplex: ${err instanceof Error ? err.message : String(err)}`);
266
+ }
267
+ // Explicitly bind a no-op handler so any in-flight or model-cached turn-taking tool calls return a clear "not available" result
268
+ if (this.turnToolBinder) {
269
+ const noopTurnHandler = {
270
+ Handles(toolName) {
271
+ return TURN_TAKING_TOOL_DEFINITIONS.some(t => t.Name === toolName);
272
+ },
273
+ async Execute(call) {
274
+ return JSON.stringify({
275
+ success: false,
276
+ error: `Tool '${call.ToolName}' is not available: session is running in full-duplex mode.`,
277
+ });
278
+ },
279
+ };
280
+ this.turnToolBinder(opened, noopTurnHandler);
281
+ }
282
+ }
168
283
  host?.OnModelSession?.(opened);
169
284
  if (activeTurnHandler) {
170
- this.bindTurnTools(opened, activeTurnHandler, botName);
285
+ this.bindTurnTools(opened, activeTurnHandler, botName, resolvedFullDuplex);
171
286
  }
172
287
  return opened;
173
288
  };
174
289
  const session = await openModelSession();
290
+ const finalFullDuplex = resolvedFullDuplex ?? false;
175
291
  // The bridge id is known only after the engine starts the session, but the end-of-session hook is registered at start,
176
292
  // so it reaches the id through this holder.
177
293
  const started = {};
178
- const active = await this.bridgeOps.StartBridgeSession({
179
- AgentSessionID: params.AgentSessionID,
180
- AgentID: params.AgentID,
181
- Provider: provider,
182
- RealtimeSession: session,
183
- Address: botToken.ServerUrl,
184
- JoinMethod: host?.JoinMethod ?? 'OnDemand',
185
- Direction: host?.Direction,
186
- TurnMode: params.TurnMode ?? 'Passive',
187
- TurnAddressing: addressing,
188
- // Meeting: gate speech to ADDRESSED turns (RegexAddressedMatcher on the agent's names) AND tell the
189
- // engine the model's auto-response is off so the bridge becomes the sole trigger. Solo 1:1: respond to
190
- // ALL the user's speech (AlwaysAddressedMatcher) with the model's own auto-response — Passive's
191
- // name-match would otherwise leave a single agent silent unless you said its name each turn.
192
- TurnMatcher: isMeeting ? new RegexAddressedMatcher(selfNames) : new AlwaysAddressedMatcher(),
193
- DisableAutoResponse: isMeeting || undefined,
194
- // Roster info for the room turn moderator (the LLM router, when one is wired via SetTurnModerator):
195
- // the names it answers to + its participation style. `'proactive'` (default) lets the moderator bring
196
- // it in unaddressed when relevant; per-agent `'addressed-only'` resolution from config is a follow-up.
197
- AgentNames: selfNames,
198
- ParticipationMode: 'proactive',
199
- // The voiced TARGET agent (e.g. Sage) — the moderator resolves its role + per-agent turnTaking.mode.
200
- TargetAgentID: params.TargetAgentID,
201
- // NativeModuleSpecifier tells LiveKitNativeMeetingSdk which native room-client wrapper to load — the
202
- // @livekit/rtc-node-backed @memberjunction/ai-bridge-livekit-native by default, overridable via env
203
- // (e.g. a one-line module setting Gemini's 16 kHz inbound rate). AccessToken is the pre-signed bot
204
- // join token; the room ws URL arrives as `Address`.
205
- Configuration: {
206
- AccessToken: botToken.Token,
207
- BotDisplayName: botName,
208
- RoomName: params.RoomName,
209
- NativeModuleSpecifier: this.resolveNativeModuleSpecifier(),
210
- },
211
- ContextUser: params.ContextUser,
212
- MetadataProvider: params.MetadataProvider,
213
- // Host-owned call: its own transcript, barge-in policy, model recovery and end-of-session bookkeeping.
214
- TranscriptSink: host?.TranscriptSink,
215
- OnBargeIn: host?.OnBargeIn,
216
- RecoverRealtimeSession: host?.RecoverModelSession ? (request) => openModelSession(request.PriorTranscript) : undefined,
217
- OnSessionEnded: async (reason) => {
218
- // An agent that leaves on its own (every human gone, the model lost, a handoff) must drop off the room's roster too.
219
- if (started.SessionBridgeID) {
220
- this.removeFromRoster(started.SessionBridgeID);
221
- }
222
- await host?.OnSessionEnded?.(reason);
223
- },
224
- });
294
+ // Until the bridge engine holds the model session (StartBridgeSession resolves), the session is this start's to close:
295
+ // when the bot's token can't be minted or the bridge doesn't start, it is closed before the error propagates, so a
296
+ // failed start leaves no model connection open (#5308), and its co-agent run reads as failed, with the start's error.
297
+ // From then on the engine closes it when the bridge ends.
298
+ let botToken;
299
+ let active;
300
+ try {
301
+ const watches = this.agentWatches(session);
302
+ const avatar = this.avatarStatusFor(session, avatarVideo, botName);
303
+ const botAttributes = { ...(watches ? AgentWatchesAttributes(true) : {}), ...AgentAvatarAttributes(avatar) };
304
+ botToken = await this.mintBotToken(params.RoomName, botIdentity, botName, botAttributes);
305
+ active = await this.bridgeOps.StartBridgeSession({
306
+ AgentSessionID: params.AgentSessionID,
307
+ AgentID: params.AgentID,
308
+ Provider: provider,
309
+ RealtimeSession: session,
310
+ FullDuplex: finalFullDuplex,
311
+ Address: botToken.ServerUrl,
312
+ JoinMethod: host?.JoinMethod ?? 'OnDemand',
313
+ Direction: host?.Direction,
314
+ TurnMode: params.TurnMode ?? 'Passive',
315
+ TurnAddressing: addressing,
316
+ // Meeting: gate speech to ADDRESSED turns (RegexAddressedMatcher on the agent's names) AND tell the
317
+ // engine the model's auto-response is off so the bridge becomes the sole trigger. Solo 1:1: respond to
318
+ // ALL the user's speech (AlwaysAddressedMatcher) with the model's own auto-response — Passive's
319
+ // name-match would otherwise leave a single agent silent unless you said its name each turn.
320
+ TurnMatcher: isMeeting ? new RegexAddressedMatcher(selfNames) : new AlwaysAddressedMatcher(),
321
+ DisableAutoResponse: isMeeting || undefined,
322
+ // Roster info for the room turn moderator (the LLM router, when one is wired via SetTurnModerator):
323
+ // the names it answers to + its participation style. `'proactive'` (default) lets the moderator bring
324
+ // it in unaddressed when relevant; per-agent `'addressed-only'` resolution from config is a follow-up.
325
+ AgentNames: selfNames,
326
+ ParticipationMode: 'proactive',
327
+ // The voiced TARGET agent (e.g. Sage) — the moderator resolves its role + per-agent turnTaking.mode.
328
+ TargetAgentID: params.TargetAgentID,
329
+ // NativeModuleSpecifier tells LiveKitNativeMeetingSdk which native room-client wrapper to load — the
330
+ // @livekit/rtc-node-backed @memberjunction/ai-bridge-livekit-native by default, overridable via env
331
+ // (e.g. a one-line module setting Gemini's 16 kHz inbound rate). AccessToken is the pre-signed bot
332
+ // join token; the room ws URL arrives as `Address`.
333
+ Configuration: {
334
+ AccessToken: botToken.Token,
335
+ BotDisplayName: botName,
336
+ RoomName: params.RoomName,
337
+ NativeModuleSpecifier: this.resolveNativeModuleSpecifier(),
338
+ // The bot reads the cameras and screens of people who allow it, only when this agent watches.
339
+ AgentVision: watches,
340
+ },
341
+ ContextUser: params.ContextUser,
342
+ MetadataProvider: params.MetadataProvider,
343
+ // Host-owned call: its own transcript, barge-in policy, model recovery and end-of-session bookkeeping.
344
+ TranscriptSink: host?.TranscriptSink,
345
+ OnBargeIn: host?.OnBargeIn,
346
+ RecoverRealtimeSession: host?.RecoverModelSession ? (request) => openModelSession(request.PriorTranscript) : undefined,
347
+ // The bot took the avatar down mid-meeting: the model session is replaced by one that renders none (and re-opened
348
+ // without it from then on), so the model stops generating video nobody sees.
349
+ RecoverRealtimeSessionWithoutAvatar: avatar?.Granted
350
+ ? (request) => {
351
+ avatarDelivery = undefined;
352
+ return openModelSession(request.PriorTranscript);
353
+ }
354
+ : undefined,
355
+ OnSessionEnded: async (reason) => {
356
+ // An agent that leaves on its own (every human gone, the model lost, a handoff) must drop off the room's roster too.
357
+ if (started.SessionBridgeID) {
358
+ this.removeFromRoster(started.SessionBridgeID);
359
+ }
360
+ await host?.OnSessionEnded?.(reason);
361
+ },
362
+ });
363
+ }
364
+ catch (err) {
365
+ await this.closeModelSessionOfFailedStart(session, err);
366
+ throw err;
367
+ }
225
368
  started.SessionBridgeID = active.SessionBridgeID;
226
369
  this.addToRoster(roomKey, { AgentSessionID: params.AgentSessionID, SessionBridgeID: active.SessionBridgeID, Names: selfNames });
227
370
  activeTurnHandler = active.TurnTakingToolHandler;
228
- this.bindTurnTools(session, active.TurnTakingToolHandler, botName);
371
+ this.bindTurnTools(session, active.TurnTakingToolHandler, botName, finalFullDuplex);
229
372
  // The room just became (or stayed) multi-agent → retroactively re-gate the agents already in it into
230
373
  // meeting mode so the whole room takes turns, not just the newcomers. Capability-gated in the engine:
231
374
  // a provider that can't reconfigure a live session (e.g. Gemini) is left conversational, no dead call.
@@ -239,18 +382,119 @@ export class LiveKitAgentRoomCoordinator extends BaseSingleton {
239
382
  `(bridge ${active.SessionBridgeID}, ${isMeeting ? 'MEETING — addressed-only' : 'solo 1:1'})`);
240
383
  return { SessionBridgeID: active.SessionBridgeID, RoomName: params.RoomName, ServerUrl: botToken.ServerUrl };
241
384
  }
242
- /** Installs the engine's turn-taking tool handler on the model session, when the session has one (a full-duplex model in a room). */
243
- bindTurnTools(session, handler, botName) {
385
+ /**
386
+ * Whether the agent behind this model session watches the meeting: its setting is on (through the bound
387
+ * {@link AgentVisionResolver}) AND its session takes inbound video. Watching on an audio-only model would offer people
388
+ * a choice no frame could honour, so it is logged and treated as off.
389
+ */
390
+ agentWatches(session) {
391
+ const settingOn = this.agentVisionResolver?.(session) === true;
392
+ if (settingOn && InboundVideoStreamsOf(session.Capabilities) === 0) {
393
+ LogStatus('[LiveKitAgentRoomCoordinator] The agent is set to watch meetings, but its realtime model takes no video; it will not watch.');
394
+ return false;
395
+ }
396
+ return settingOn;
397
+ }
398
+ /**
399
+ * Whether this host's bots can publish an agent's avatar, from the native room module the bots join with (`ffmpeg`
400
+ * with the H.264 and AAC decoders, and a room SDK that publishes video). Asked before every agent's model session
401
+ * opens; the module probes once and remembers. A module that cannot be loaded, or that predates avatars, means no.
402
+ */
403
+ async DescribeAvatarVideo() {
404
+ try {
405
+ const nativeModule = await DefaultNativeLoader(this.resolveNativeModuleSpecifier());
406
+ if (!nativeModule.describeAvatarVideo) {
407
+ return { Supported: false, Reason: 'bridged', Detail: 'the native room module publishes no avatars' };
408
+ }
409
+ return await nativeModule.describeAvatarVideo();
410
+ }
411
+ catch (err) {
412
+ return { Supported: false, Reason: 'bridged', Detail: `the native room module could not be asked: ${err instanceof Error ? err.message : String(err)}` };
413
+ }
414
+ }
415
+ /**
416
+ * What became of the agent's avatar request: the session's own status, except that a session which asked for an
417
+ * avatar and stayed audio only because this host could not publish it carries the host's reason (`decoder-missing`
418
+ * when there is no usable ffmpeg, `phone` on a phone call whose session factory still asked). Logged once per join when
419
+ * an avatar was asked for.
420
+ */
421
+ avatarStatusFor(session, avatarVideo, botName) {
422
+ const status = session.AvatarStatus;
423
+ if (!status?.Requested) {
424
+ return status;
425
+ }
426
+ const resolved = !status.Granted && status.Reason === 'bridged' && avatarVideo.Supported === false ? { ...status, Reason: avatarVideo.Reason } : status;
427
+ const detail = avatarVideo.Supported === false && avatarVideo.Detail ? ` (${avatarVideo.Detail})` : '';
428
+ LogStatus(`[LiveKitAgentRoomCoordinator] ${botName}'s avatar: ${resolved.Granted ? 'on' : `audio only, ${resolved.Reason ?? 'bridged'}${detail}`}`);
429
+ return resolved;
430
+ }
431
+ /**
432
+ * Mints the bot's join token with its attributes: `mj.agentWatches` when the agent watches, so the room offers people
433
+ * the choice from the moment the bot joins, and `mj.agentAvatar` when the agent asked for an avatar. Minted once the
434
+ * model session is open; when it fails, the start closes that session (see {@link StartAgentRoomSession}).
435
+ */
436
+ async mintBotToken(roomName, botIdentity, botName, attributes) {
437
+ return this.tokenService.MintBotToken(roomName, botIdentity, botName, Object.keys(attributes).length > 0 ? attributes : undefined);
438
+ }
439
+ /**
440
+ * Closes the model session of a start that failed before the bridge engine took it: the bot's token could not be minted,
441
+ * or the bridge did not start (its row could not be saved, the driver could not connect). The failure is recorded on the
442
+ * session's co-agent run first ({@link FailedStartRecorder}), since the close alone would finalize that run as completed.
443
+ * Neither step throws: a failure is logged, so the caller sees why the start failed and the session is still closed.
444
+ */
445
+ async closeModelSessionOfFailedStart(session, startError) {
446
+ try {
447
+ await this.failedStartRecorder?.(session, startError instanceof Error ? startError.message : String(startError));
448
+ }
449
+ catch (err) {
450
+ LogError(`[LiveKitAgentRoomCoordinator] recording a failed start on the agent's run failed: ${err instanceof Error ? err.message : String(err)}`);
451
+ }
452
+ try {
453
+ await session.Close();
454
+ }
455
+ catch (err) {
456
+ LogError(`[LiveKitAgentRoomCoordinator] closing the model session of a failed start failed: ${err instanceof Error ? err.message : String(err)}`);
457
+ }
458
+ }
459
+ /** Installs the engine's turn-taking tool handler on the model session, when the session has one (a turn-based model in a room). */
460
+ bindTurnTools(session, handler, botName, isFullDuplex) {
244
461
  if (!handler) {
245
462
  return;
246
463
  }
464
+ // Full-duplex models never get turn-taking tools; do not bind turn-taking handlers to them
465
+ if (isFullDuplex) {
466
+ return;
467
+ }
247
468
  if (!this.turnToolBinder) {
248
- LogError(`[LiveKitAgentRoomCoordinator] ${botName} is full-duplex but no turn-tool binder is set (SetTurnToolBinder); ` +
249
- 'its i_am_addressed / yield_turn calls will not execute. The room floor gate still prevents overlap.');
469
+ LogError(`[LiveKitAgentRoomCoordinator] ${botName} has turn-taking tools but no turn-tool binder is set (SetTurnToolBinder); ` +
470
+ 'its i_am_addressed / yield_turn calls will not execute.');
250
471
  return;
251
472
  }
252
473
  this.turnToolBinder(session, handler);
253
474
  }
475
+ /**
476
+ * Resolves whether the model with the given ID is full duplex from model metadata and static driver capabilities.
477
+ */
478
+ resolveIsModelFullDuplexFromId(modelId) {
479
+ try {
480
+ const model = (AIEngine.Instance.Models ?? []).find(m => UUIDsEqual(m.ID, modelId));
481
+ if (!model) {
482
+ return undefined;
483
+ }
484
+ const vendors = (AIEngine.Instance.ModelVendorsByModelID?.get(NormalizeUUID(model.ID)) ??
485
+ (AIEngine.Instance.ModelVendors ?? []).filter(mv => UUIDsEqual(mv.ModelID, model.ID)))
486
+ .filter(v => v.DriverClass != null && (v.Status === undefined || v.Status === 'Active'))
487
+ .sort((a, b) => (b.Priority ?? 0) - (a.Priority ?? 0));
488
+ const primaryVendor = vendors[0];
489
+ const effective = AIEngine.Instance.GetEffectiveModelConfiguration(model.ID, primaryVendor?.ID);
490
+ const staticCaps = GetDriverStaticCapabilities(primaryVendor?.DriverClass);
491
+ return ResolveIsModelFullDuplex(effective ?? model.ModelConfigurationObject, staticCaps);
492
+ }
493
+ catch (err) {
494
+ LogError(`[LiveKitAgentRoomCoordinator] resolveIsModelFullDuplexFromId failed: ${err instanceof Error ? err.message : String(err)}`);
495
+ return undefined;
496
+ }
497
+ }
254
498
  /** Appends an agent to a room's roster (creating the room's list on first join). */
255
499
  addToRoster(roomKey, entry) {
256
500
  const roster = this.roomRosters.get(roomKey);
@@ -1 +1 @@
1
- {"version":3,"file":"livekit-agent-room-coordinator.js","sourceRoot":"","sources":["../src/livekit-agent-room-coordinator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"livekit-agent-room-coordinator.js","sourceRoot":"","sources":["../src/livekit-agent-room-coordinator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"livekit-native-module.d.ts","sourceRoot":"","sources":["../src/livekit-native-module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uGAAuG;AACvG,eAAO,MAAM,6BAA6B,6CAA6C,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E"}
1
+ {"version":3,"file":"livekit-native-module.d.ts","sourceRoot":"","sources":["../src/livekit-native-module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,uGAAuG;AACvG,eAAO,MAAM,6BAA6B,6CAA6C,CAAC;AAExF;;;;;;GAMG;AACH,wBAAgB,mCAAmC,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E"}
@@ -5,6 +5,8 @@
5
5
  *
6
6
  * @module @memberjunction/livekit-room-server
7
7
  */
8
+ import { RegisterNativeRoomModule } from '@memberjunction/ai-bridge-livekit';
9
+ import NativeRoomModuleDefault from '@memberjunction/ai-bridge-livekit-native';
8
10
  /** The default native room-client wrapper — the `@livekit/rtc-node`-backed package this repo ships. */
9
11
  export const DEFAULT_LIVEKIT_NATIVE_MODULE = '@memberjunction/ai-bridge-livekit-native';
10
12
  /**
@@ -17,4 +19,9 @@ export const DEFAULT_LIVEKIT_NATIVE_MODULE = '@memberjunction/ai-bridge-livekit-
17
19
  export function ResolveLiveKitNativeModuleSpecifier(override) {
18
20
  return override ?? process.env.LIVEKIT_NATIVE_MODULE ?? DEFAULT_LIVEKIT_NATIVE_MODULE;
19
21
  }
22
+ // The bridge package's loader cannot `import()` the default wrapper itself: it does not (and, to avoid a dependency
23
+ // cycle, must not) declare it, so the bare specifier does not resolve from there under pnpm's strict layout. This
24
+ // package declares the wrapper, so it imports it statically and registers it for the loader to find. An override
25
+ // specifier (`LIVEKIT_NATIVE_MODULE`) that is not registered still goes through the loader's `import()`.
26
+ RegisterNativeRoomModule(DEFAULT_LIVEKIT_NATIVE_MODULE, NativeRoomModuleDefault);
20
27
  //# sourceMappingURL=livekit-native-module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"livekit-native-module.js","sourceRoot":"","sources":["../src/livekit-native-module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uGAAuG;AACvG,MAAM,CAAC,MAAM,6BAA6B,GAAG,0CAA0C,CAAC;AAExF;;;;;;GAMG;AACH,MAAM,UAAU,mCAAmC,CAAC,QAAiB;IACnE,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,6BAA6B,CAAC;AACxF,CAAC"}
1
+ {"version":3,"file":"livekit-native-module.js","sourceRoot":"","sources":["../src/livekit-native-module.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,uBAAuB,MAAM,0CAA0C,CAAC;AAE/E,uGAAuG;AACvG,MAAM,CAAC,MAAM,6BAA6B,GAAG,0CAA0C,CAAC;AAExF;;;;;;GAMG;AACH,MAAM,UAAU,mCAAmC,CAAC,QAAiB;IACnE,OAAO,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,6BAA6B,CAAC;AACxF,CAAC;AAED,oHAAoH;AACpH,kHAAkH;AAClH,iHAAiH;AACjH,yGAAyG;AACzG,wBAAwB,CAAC,6BAA6B,EAAE,uBAAuB,CAAC,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview {@link LiveKitParticipantService} — changes a participant in a live room through LiveKit's
3
+ * `RoomServiceClient` (`livekit-server-sdk`). Today it records whether a person lets agents see their camera and shared
4
+ * screen. A participant's token can't change its own attributes: MJ's tokens carry no `canUpdateOwnMetadata`, because
5
+ * the same right would let anyone rename themselves and rewrite the metadata that carries their role. So the server
6
+ * sets the attribute for them, once MJAPI has worked out who is asking.
7
+ *
8
+ * @module @memberjunction/livekit-room-server
9
+ */
10
+ import { RoomServiceClient } from 'livekit-server-sdk';
11
+ import { type LiveKitServerConfig } from './livekit-token-service.js';
12
+ /** The subset of {@link RoomServiceClient} the service drives — an injectable seam for unit testing. */
13
+ export type ParticipantUpdateClientLike = Pick<RoomServiceClient, 'updateParticipant'>;
14
+ /** The outcome of changing a participant. */
15
+ export interface ParticipantUpdateResult {
16
+ /** Whether LiveKit applied the change. */
17
+ Success: boolean;
18
+ /** `true` when LiveKit refused because that participant (or the room) does not exist. */
19
+ NotInRoom?: boolean;
20
+ /** What went wrong, when it failed. */
21
+ ErrorMessage?: string;
22
+ }
23
+ /** Changes participants in live LiveKit rooms, on the server's authority. */
24
+ export declare class LiveKitParticipantService {
25
+ private readonly configured;
26
+ private readonly client;
27
+ /**
28
+ * @param config Explicit credentials; omitted fields fall back to environment variables (via
29
+ * {@link LiveKitTokenService}). The room service client uses the HTTP(S) form of the server URL.
30
+ * @param client An injectable room service client (primarily for unit testing); defaults to a real
31
+ * `RoomServiceClient` built from the resolved credentials.
32
+ */
33
+ constructor(config?: Partial<LiveKitServerConfig>, client?: ParticipantUpdateClientLike);
34
+ /**
35
+ * Records whether a person lets agents see their camera and shared screen: sets their `mj.agentCanSee` attribute to
36
+ * `'true'`, or removes it. The caller must already have established that `identity` is the person asking.
37
+ *
38
+ * @param roomName The room the person is in.
39
+ * @param identity The person's participant identity.
40
+ * @param allow `true` to let agents see, `false` to stop.
41
+ * @returns Whether LiveKit applied it; never throws.
42
+ */
43
+ SetAgentVision(roomName: string, identity: string, allow: boolean): Promise<ParticipantUpdateResult>;
44
+ /** Sets (or, with `''`, removes) a participant's attributes; reports LiveKit's refusal instead of throwing. */
45
+ private updateAttributes;
46
+ }
47
+ //# sourceMappingURL=livekit-participant-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit-participant-service.d.ts","sourceRoot":"","sources":["../src/livekit-participant-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAc,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAuB,KAAK,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGxF,wGAAwG;AACxG,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;AAEvF,6CAA6C;AAC7C,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,6EAA6E;AAC7E,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IAErD;;;;;OAKG;gBACS,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC,EAAE,2BAA2B;IAOvF;;;;;;;;OAQG;IACU,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAIjH,+GAA+G;YACjG,gBAAgB;CAc/B"}