@memberjunction/server 5.40.2 → 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.
Files changed (129) hide show
  1. package/dist/agentSessions/HostInstance.d.ts +19 -0
  2. package/dist/agentSessions/HostInstance.d.ts.map +1 -0
  3. package/dist/agentSessions/HostInstance.js +48 -0
  4. package/dist/agentSessions/HostInstance.js.map +1 -0
  5. package/dist/agentSessions/SessionJanitor.d.ts +97 -0
  6. package/dist/agentSessions/SessionJanitor.d.ts.map +1 -0
  7. package/dist/agentSessions/SessionJanitor.js +222 -0
  8. package/dist/agentSessions/SessionJanitor.js.map +1 -0
  9. package/dist/agentSessions/SessionManager.d.ts +142 -0
  10. package/dist/agentSessions/SessionManager.d.ts.map +1 -0
  11. package/dist/agentSessions/SessionManager.js +308 -0
  12. package/dist/agentSessions/SessionManager.js.map +1 -0
  13. package/dist/agentSessions/index.d.ts +5 -0
  14. package/dist/agentSessions/index.d.ts.map +1 -0
  15. package/dist/agentSessions/index.js +31 -0
  16. package/dist/agentSessions/index.js.map +1 -0
  17. package/dist/agentSessions/remoteBrowserGoalEngine.d.ts +102 -0
  18. package/dist/agentSessions/remoteBrowserGoalEngine.d.ts.map +1 -0
  19. package/dist/agentSessions/remoteBrowserGoalEngine.js +164 -0
  20. package/dist/agentSessions/remoteBrowserGoalEngine.js.map +1 -0
  21. package/dist/agentSessions/remoteBrowserGoalRegistry.d.ts +66 -0
  22. package/dist/agentSessions/remoteBrowserGoalRegistry.d.ts.map +1 -0
  23. package/dist/agentSessions/remoteBrowserGoalRegistry.js +86 -0
  24. package/dist/agentSessions/remoteBrowserGoalRegistry.js.map +1 -0
  25. package/dist/auth/initializeProviders.d.ts.map +1 -1
  26. package/dist/auth/initializeProviders.js +4 -2
  27. package/dist/auth/initializeProviders.js.map +1 -1
  28. package/dist/config.d.ts +7 -0
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +12 -2
  31. package/dist/config.js.map +1 -1
  32. package/dist/context.d.ts.map +1 -1
  33. package/dist/context.js +41 -7
  34. package/dist/context.js.map +1 -1
  35. package/dist/generated/generated.d.ts +1296 -49
  36. package/dist/generated/generated.d.ts.map +1 -1
  37. package/dist/generated/generated.js +50343 -43421
  38. package/dist/generated/generated.js.map +1 -1
  39. package/dist/generic/ResolverBase.js +1 -1
  40. package/dist/generic/ResolverBase.js.map +1 -1
  41. package/dist/generic/RunViewResolver.js +9 -10
  42. package/dist/generic/RunViewResolver.js.map +1 -1
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +127 -54
  46. package/dist/index.js.map +1 -1
  47. package/dist/integration/CustomColumnPromoter.d.ts +108 -0
  48. package/dist/integration/CustomColumnPromoter.d.ts.map +1 -0
  49. package/dist/integration/CustomColumnPromoter.js +508 -0
  50. package/dist/integration/CustomColumnPromoter.js.map +1 -0
  51. package/dist/logging/StartupLogger.d.ts +177 -0
  52. package/dist/logging/StartupLogger.d.ts.map +1 -0
  53. package/dist/logging/StartupLogger.js +354 -0
  54. package/dist/logging/StartupLogger.js.map +1 -0
  55. package/dist/logging/variablesLoggingMiddleware.d.ts.map +1 -1
  56. package/dist/logging/variablesLoggingMiddleware.js +21 -2
  57. package/dist/logging/variablesLoggingMiddleware.js.map +1 -1
  58. package/dist/resolvers/AgentSessionResolver.d.ts +42 -0
  59. package/dist/resolvers/AgentSessionResolver.d.ts.map +1 -0
  60. package/dist/resolvers/AgentSessionResolver.js +152 -0
  61. package/dist/resolvers/AgentSessionResolver.js.map +1 -0
  62. package/dist/resolvers/EntityPermissionResolver.d.ts +16 -0
  63. package/dist/resolvers/EntityPermissionResolver.d.ts.map +1 -0
  64. package/dist/resolvers/EntityPermissionResolver.js +95 -0
  65. package/dist/resolvers/EntityPermissionResolver.js.map +1 -0
  66. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts +27 -0
  67. package/dist/resolvers/ExecuteRemoteOperationResolver.d.ts.map +1 -0
  68. package/dist/resolvers/ExecuteRemoteOperationResolver.js +136 -0
  69. package/dist/resolvers/ExecuteRemoteOperationResolver.js.map +1 -0
  70. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts +101 -1
  71. package/dist/resolvers/IntegrationDiscoveryResolver.d.ts.map +1 -1
  72. package/dist/resolvers/IntegrationDiscoveryResolver.js +544 -42
  73. package/dist/resolvers/IntegrationDiscoveryResolver.js.map +1 -1
  74. package/dist/resolvers/RealtimeBridgeResolver.d.ts +121 -0
  75. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -0
  76. package/dist/resolvers/RealtimeBridgeResolver.js +533 -0
  77. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -0
  78. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +688 -0
  79. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -0
  80. package/dist/resolvers/RealtimeClientSessionResolver.js +1774 -0
  81. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -0
  82. package/dist/resolvers/RemoteBrowserActionResolver.d.ts +432 -0
  83. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -0
  84. package/dist/resolvers/RemoteBrowserActionResolver.js +1108 -0
  85. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -0
  86. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  87. package/dist/resolvers/RunAIAgentResolver.js +0 -7
  88. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  89. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  90. package/dist/rest/setupRESTEndpoints.js +5 -3
  91. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  92. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  93. package/dist/services/ScheduledJobsService.js +6 -5
  94. package/dist/services/ScheduledJobsService.js.map +1 -1
  95. package/package.json +83 -74
  96. package/src/__tests__/RealtimeBridgeResolver.test.ts +100 -0
  97. package/src/__tests__/RealtimeClientSessionResolver.test.ts +2605 -0
  98. package/src/__tests__/RemoteBrowserAudioStream.test.ts +181 -0
  99. package/src/__tests__/RemoteBrowserGoalEngine.test.ts +144 -0
  100. package/src/__tests__/SessionJanitor.test.ts +234 -0
  101. package/src/__tests__/SessionManager.test.ts +465 -0
  102. package/src/__tests__/remoteBrowserGoalRegistry.test.ts +81 -0
  103. package/src/__tests__/subscriptionRedaction.test.ts +5 -0
  104. package/src/agentSessions/HostInstance.ts +53 -0
  105. package/src/agentSessions/SessionJanitor.ts +267 -0
  106. package/src/agentSessions/SessionManager.ts +446 -0
  107. package/src/agentSessions/index.ts +32 -0
  108. package/src/agentSessions/remoteBrowserGoalEngine.ts +191 -0
  109. package/src/agentSessions/remoteBrowserGoalRegistry.ts +122 -0
  110. package/src/auth/initializeProviders.ts +4 -2
  111. package/src/config.ts +13 -2
  112. package/src/context.ts +42 -7
  113. package/src/generated/generated.ts +33808 -29025
  114. package/src/generic/ResolverBase.ts +1 -1
  115. package/src/generic/RunViewResolver.ts +9 -9
  116. package/src/index.ts +128 -54
  117. package/src/integration/CustomColumnPromoter.ts +597 -0
  118. package/src/logging/StartupLogger.ts +441 -0
  119. package/src/logging/variablesLoggingMiddleware.ts +25 -5
  120. package/src/resolvers/AgentSessionResolver.ts +138 -0
  121. package/src/resolvers/EntityPermissionResolver.ts +73 -0
  122. package/src/resolvers/ExecuteRemoteOperationResolver.ts +108 -0
  123. package/src/resolvers/IntegrationDiscoveryResolver.ts +396 -37
  124. package/src/resolvers/RealtimeBridgeResolver.ts +450 -0
  125. package/src/resolvers/RealtimeClientSessionResolver.ts +2162 -0
  126. package/src/resolvers/RemoteBrowserActionResolver.ts +1122 -0
  127. package/src/resolvers/RunAIAgentResolver.ts +1 -9
  128. package/src/rest/setupRESTEndpoints.ts +5 -3
  129. package/src/services/ScheduledJobsService.ts +6 -5
@@ -0,0 +1,121 @@
1
+ import { AppContext } from '../types.js';
2
+ import { ResolverBase } from '../generic/ResolverBase.js';
3
+ /**
4
+ * GraphQL surface for the MJ-native LiveKit room: mints scoped client access tokens and starts an
5
+ * agent's presence in a room. The thin resolver delegates to `@memberjunction/livekit-room-server`
6
+ * (token service + session-start coordinator) per the Transport-Layer Architecture — no LiveKit logic
7
+ * lives here.
8
+ *
9
+ * `MintLiveKitClientToken` is fully functional given LiveKit credentials. `StartLiveKitAgentRoomSession`
10
+ * opens a real agent model session via the realtime-session factory bound above (the agent must have an
11
+ * Active `Realtime` model + a vendor with a resolvable API key), then bridges it into the room through the
12
+ * coordinator. The native room media client (`@memberjunction/ai-bridge-livekit-native` /
13
+ * `@livekit/rtc-node`) must be installed on the agent host for the bot's audio to flow.
14
+ */
15
+ export declare class MintLiveKitClientTokenInput {
16
+ RoomName: string;
17
+ DisplayName?: string;
18
+ }
19
+ export declare class LiveKitClientTokenResult {
20
+ Success: boolean;
21
+ ErrorMessage?: string;
22
+ ServerUrl: string;
23
+ Token: string;
24
+ Identity: string;
25
+ RoomName: string;
26
+ }
27
+ export declare class StartLiveKitAgentRoomSessionInput {
28
+ AgentID?: string;
29
+ AgentName?: string;
30
+ /** The TARGET agent the co-agent voices (the one being "called") — the Realtime Co-Agent delegates to it. */
31
+ TargetAgentID?: string;
32
+ /** Optional per-session Realtime MODEL override (Name or ID) — a dev choosing the model for this agent. */
33
+ RealtimeModelID?: string;
34
+ /** Optional per-session VOICE override (provider-native voice id) — gives this agent a distinct voice. */
35
+ RealtimeVoice?: string;
36
+ RoomName?: string;
37
+ AgentSessionID?: string;
38
+ TurnMode?: string;
39
+ }
40
+ export declare class LiveKitAgentRoomSessionResult {
41
+ Success: boolean;
42
+ ErrorMessage?: string;
43
+ SessionBridgeID: string;
44
+ RoomName: string;
45
+ ServerUrl: string;
46
+ ClientToken: string;
47
+ Identity: string;
48
+ }
49
+ export declare class LiveKitRecordingInput {
50
+ RoomName: string;
51
+ Layout?: string;
52
+ }
53
+ export declare class LiveKitRecordingResult {
54
+ Success: boolean;
55
+ ErrorMessage?: string;
56
+ EgressID: string;
57
+ Status: string;
58
+ }
59
+ /** A selectable provider-native voice for the dev voice picker. */
60
+ export declare class RealtimeVoiceOptionResult {
61
+ ID: string;
62
+ Name: string;
63
+ }
64
+ /** An active Realtime model with the voices its driver supports — feeds the dev model/voice picker. */
65
+ export declare class RealtimeModelVoicesResult {
66
+ ModelID: string;
67
+ ModelName: string;
68
+ Voices: RealtimeVoiceOptionResult[];
69
+ }
70
+ export declare class RealtimeBridgeResolver extends ResolverBase {
71
+ /** Durable `AIAgentSession` record manager — creates the session row the bridge FK-references. */
72
+ private readonly sessionManager;
73
+ /**
74
+ * Mints a scoped LiveKit access token for the current user to join the given room. The participant
75
+ * identity is derived server-side from the authenticated user (never trusted from the client).
76
+ */
77
+ MintLiveKitClientToken(input: MintLiveKitClientTokenInput, context?: AppContext): Promise<LiveKitClientTokenResult>;
78
+ /**
79
+ * Starts (or reuses) an agent's presence in a LiveKit room and returns a client token so the calling
80
+ * user can immediately join the same room.
81
+ */
82
+ StartLiveKitAgentRoomSession(input: StartLiveKitAgentRoomSessionInput, context?: AppContext): Promise<LiveKitAgentRoomSessionResult>;
83
+ /**
84
+ * Stops one agent's presence in a room (the bot leaves) — the remove half of in-room agent management.
85
+ * Identified by the `SessionBridgeID` returned from {@link StartLiveKitAgentRoomSession}. Returns `true`
86
+ * when the bridge was stopped. Best-effort: a missing/already-stopped bridge or any error resolves `false`.
87
+ *
88
+ * @param sessionBridgeID The `MJ: AI Agent Session Bridges` row id of the agent to remove.
89
+ */
90
+ StopLiveKitAgentRoomSession(sessionBridgeID: string, context?: AppContext): Promise<boolean>;
91
+ /**
92
+ * Lists active Realtime models with the voices each driver supports — the source for the dev model/voice
93
+ * picker (gated client-side by the `Realtime: Advanced Session Controls` authorization). Read-only; returns
94
+ * an empty list on any error so the picker degrades gracefully to "no overrides".
95
+ */
96
+ GetRealtimeModelVoices(context?: AppContext): Promise<RealtimeModelVoicesResult[]>;
97
+ /**
98
+ * Invites MJ users to a live room: for each user, sends a **"Live Room Invite"** notification via the
99
+ * unified {@link NotificationEngine} — which writes the in-app notification (clickable → joins the room
100
+ * via the `meet-room` ResourceConfiguration) and ALSO delivers over MJ Comms (email/SMS) when the type's
101
+ * channels + a provider are configured. Best-effort: Comms not being set up never blocks the in-app
102
+ * notification, and a missing "Live Room Invite" type (seed not yet pushed) is caught and returns false.
103
+ *
104
+ * @param roomName The LiveKit room the invitees should join.
105
+ * @param userIDs The `MJ: Users` ids to invite.
106
+ * @returns `true` when at least one invite was delivered.
107
+ */
108
+ InviteUsersToLiveKitRoom(roomName: string, userIDs: string[], context?: AppContext): Promise<boolean>;
109
+ /**
110
+ * Starts recording (composite egress) of a room. Server-authorized — the browser never holds egress
111
+ * credentials.
112
+ */
113
+ StartLiveKitRecording(input: LiveKitRecordingInput, context?: AppContext): Promise<LiveKitRecordingResult>;
114
+ /** Stops a recording by egress id. */
115
+ StopLiveKitRecording(egressID: string, context?: AppContext): Promise<LiveKitRecordingResult>;
116
+ /** Builds a stable, lowercased participant identity from the authenticated user. */
117
+ private participantIdentity;
118
+ /** Normalizes a turn-mode string to the bridge's accepted values. */
119
+ private normalizeTurnMode;
120
+ }
121
+ //# sourceMappingURL=RealtimeBridgeResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RealtimeBridgeResolver.d.ts","sourceRoot":"","sources":["../../src/resolvers/RealtimeBridgeResolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,533 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { Resolver, Mutation, Query, Arg, Ctx, ObjectType, InputType, Field } from 'type-graphql';
14
+ import { randomUUID } from 'crypto';
15
+ import { LogError } from '@memberjunction/core';
16
+ import { LiveKitTokenService, LiveKitAgentRoomCoordinator, LiveKitEgressService } from '@memberjunction/livekit-room-server';
17
+ import { ResolverBase } from '../generic/ResolverBase.js';
18
+ import { GetReadWriteProvider } from '../util.js';
19
+ import { CreateBridgeRealtimeSession, FinalizeBridgeCoAgentRuns, GetRealtimeModelVoices, CreateBridgeRoomTranscriptSink } from '@memberjunction/ai-agents';
20
+ import { AIBridgeEngine } from '@memberjunction/ai-bridge-server';
21
+ import { SessionManager } from '../agentSessions/SessionManager.js';
22
+ import { NotificationEngine } from '@memberjunction/notifications';
23
+ /**
24
+ * Binds the agent realtime-session factory onto the LiveKit room coordinator's model-session creation seam.
25
+ * Module-load side effect — it runs when MJServer builds its GraphQL schema (which imports this resolver),
26
+ * so `StartLiveKitAgentRoomSession` can open a real model session. `@memberjunction/server` is the natural
27
+ * home for the binding: it is the one package that depends on BOTH `@memberjunction/ai-agents` (the factory)
28
+ * and `@memberjunction/livekit-room-server` (the coordinator), keeping each of those decoupled from the
29
+ * other. Idempotent (latest-wins).
30
+ */
31
+ LiveKitAgentRoomCoordinator.Instance.SetSessionFactory(CreateBridgeRealtimeSession);
32
+ /**
33
+ * Binds the co-agent run finalizer onto the bridge engine (same module-load rationale as the factory above).
34
+ * Lets the engine finalize a session's dangling co-agent observability run when it reaps a bridge WITHOUT a
35
+ * live in-memory session (a prior-boot orphan / cross-host reap) — the one teardown path the agent layer's
36
+ * `Close()`-wrapped finalizer can't reach. Idempotent for clean same-process teardowns.
37
+ */
38
+ AIBridgeEngine.Instance.SetSessionRunFinalizer(FinalizeBridgeCoAgentRuns);
39
+ /**
40
+ * Binds the unified room-transcript sink onto the bridge engine (same module-load rationale). The engine
41
+ * elects one scribe per LiveKit room and feeds its final transcript lines here; the sink persists them as a
42
+ * single `MJ: Conversations` of `Type='Meeting Room'`, scoped `Application` so it stays OUT of the normal
43
+ * chat list (it surfaces in the Meet app's own view), with one `MJ: Conversation Detail` per utterance. The
44
+ * "Meeting Room"/scope choices live HERE (the Meet composition layer), keeping the engine generic.
45
+ */
46
+ AIBridgeEngine.Instance.SetTranscriptSink(CreateBridgeRoomTranscriptSink({ ConversationType: 'Meeting Room', ApplicationScope: 'Application' }));
47
+ /**
48
+ * GraphQL surface for the MJ-native LiveKit room: mints scoped client access tokens and starts an
49
+ * agent's presence in a room. The thin resolver delegates to `@memberjunction/livekit-room-server`
50
+ * (token service + session-start coordinator) per the Transport-Layer Architecture — no LiveKit logic
51
+ * lives here.
52
+ *
53
+ * `MintLiveKitClientToken` is fully functional given LiveKit credentials. `StartLiveKitAgentRoomSession`
54
+ * opens a real agent model session via the realtime-session factory bound above (the agent must have an
55
+ * Active `Realtime` model + a vendor with a resolvable API key), then bridges it into the room through the
56
+ * coordinator. The native room media client (`@memberjunction/ai-bridge-livekit-native` /
57
+ * `@livekit/rtc-node`) must be installed on the agent host for the bot's audio to flow.
58
+ */
59
+ let MintLiveKitClientTokenInput = class MintLiveKitClientTokenInput {
60
+ };
61
+ __decorate([
62
+ Field(() => String),
63
+ __metadata("design:type", String)
64
+ ], MintLiveKitClientTokenInput.prototype, "RoomName", void 0);
65
+ __decorate([
66
+ Field(() => String, { nullable: true }),
67
+ __metadata("design:type", String)
68
+ ], MintLiveKitClientTokenInput.prototype, "DisplayName", void 0);
69
+ MintLiveKitClientTokenInput = __decorate([
70
+ InputType()
71
+ ], MintLiveKitClientTokenInput);
72
+ export { MintLiveKitClientTokenInput };
73
+ let LiveKitClientTokenResult = class LiveKitClientTokenResult {
74
+ };
75
+ __decorate([
76
+ Field(() => Boolean),
77
+ __metadata("design:type", Boolean)
78
+ ], LiveKitClientTokenResult.prototype, "Success", void 0);
79
+ __decorate([
80
+ Field(() => String, { nullable: true }),
81
+ __metadata("design:type", String)
82
+ ], LiveKitClientTokenResult.prototype, "ErrorMessage", void 0);
83
+ __decorate([
84
+ Field(() => String),
85
+ __metadata("design:type", String)
86
+ ], LiveKitClientTokenResult.prototype, "ServerUrl", void 0);
87
+ __decorate([
88
+ Field(() => String),
89
+ __metadata("design:type", String)
90
+ ], LiveKitClientTokenResult.prototype, "Token", void 0);
91
+ __decorate([
92
+ Field(() => String),
93
+ __metadata("design:type", String)
94
+ ], LiveKitClientTokenResult.prototype, "Identity", void 0);
95
+ __decorate([
96
+ Field(() => String),
97
+ __metadata("design:type", String)
98
+ ], LiveKitClientTokenResult.prototype, "RoomName", void 0);
99
+ LiveKitClientTokenResult = __decorate([
100
+ ObjectType()
101
+ ], LiveKitClientTokenResult);
102
+ export { LiveKitClientTokenResult };
103
+ let StartLiveKitAgentRoomSessionInput = class StartLiveKitAgentRoomSessionInput {
104
+ };
105
+ __decorate([
106
+ Field(() => String, { nullable: true }),
107
+ __metadata("design:type", String)
108
+ ], StartLiveKitAgentRoomSessionInput.prototype, "AgentID", void 0);
109
+ __decorate([
110
+ Field(() => String, { nullable: true }),
111
+ __metadata("design:type", String)
112
+ ], StartLiveKitAgentRoomSessionInput.prototype, "AgentName", void 0);
113
+ __decorate([
114
+ Field(() => String, { nullable: true }),
115
+ __metadata("design:type", String)
116
+ ], StartLiveKitAgentRoomSessionInput.prototype, "TargetAgentID", void 0);
117
+ __decorate([
118
+ Field(() => String, { nullable: true }),
119
+ __metadata("design:type", String)
120
+ ], StartLiveKitAgentRoomSessionInput.prototype, "RealtimeModelID", void 0);
121
+ __decorate([
122
+ Field(() => String, { nullable: true }),
123
+ __metadata("design:type", String)
124
+ ], StartLiveKitAgentRoomSessionInput.prototype, "RealtimeVoice", void 0);
125
+ __decorate([
126
+ Field(() => String, { nullable: true }),
127
+ __metadata("design:type", String)
128
+ ], StartLiveKitAgentRoomSessionInput.prototype, "RoomName", void 0);
129
+ __decorate([
130
+ Field(() => String, { nullable: true }),
131
+ __metadata("design:type", String)
132
+ ], StartLiveKitAgentRoomSessionInput.prototype, "AgentSessionID", void 0);
133
+ __decorate([
134
+ Field(() => String, { nullable: true }),
135
+ __metadata("design:type", String)
136
+ ], StartLiveKitAgentRoomSessionInput.prototype, "TurnMode", void 0);
137
+ StartLiveKitAgentRoomSessionInput = __decorate([
138
+ InputType()
139
+ ], StartLiveKitAgentRoomSessionInput);
140
+ export { StartLiveKitAgentRoomSessionInput };
141
+ let LiveKitAgentRoomSessionResult = class LiveKitAgentRoomSessionResult {
142
+ };
143
+ __decorate([
144
+ Field(() => Boolean),
145
+ __metadata("design:type", Boolean)
146
+ ], LiveKitAgentRoomSessionResult.prototype, "Success", void 0);
147
+ __decorate([
148
+ Field(() => String, { nullable: true }),
149
+ __metadata("design:type", String)
150
+ ], LiveKitAgentRoomSessionResult.prototype, "ErrorMessage", void 0);
151
+ __decorate([
152
+ Field(() => String),
153
+ __metadata("design:type", String)
154
+ ], LiveKitAgentRoomSessionResult.prototype, "SessionBridgeID", void 0);
155
+ __decorate([
156
+ Field(() => String),
157
+ __metadata("design:type", String)
158
+ ], LiveKitAgentRoomSessionResult.prototype, "RoomName", void 0);
159
+ __decorate([
160
+ Field(() => String),
161
+ __metadata("design:type", String)
162
+ ], LiveKitAgentRoomSessionResult.prototype, "ServerUrl", void 0);
163
+ __decorate([
164
+ Field(() => String),
165
+ __metadata("design:type", String)
166
+ ], LiveKitAgentRoomSessionResult.prototype, "ClientToken", void 0);
167
+ __decorate([
168
+ Field(() => String),
169
+ __metadata("design:type", String)
170
+ ], LiveKitAgentRoomSessionResult.prototype, "Identity", void 0);
171
+ LiveKitAgentRoomSessionResult = __decorate([
172
+ ObjectType()
173
+ ], LiveKitAgentRoomSessionResult);
174
+ export { LiveKitAgentRoomSessionResult };
175
+ let LiveKitRecordingInput = class LiveKitRecordingInput {
176
+ };
177
+ __decorate([
178
+ Field(() => String),
179
+ __metadata("design:type", String)
180
+ ], LiveKitRecordingInput.prototype, "RoomName", void 0);
181
+ __decorate([
182
+ Field(() => String, { nullable: true }),
183
+ __metadata("design:type", String)
184
+ ], LiveKitRecordingInput.prototype, "Layout", void 0);
185
+ LiveKitRecordingInput = __decorate([
186
+ InputType()
187
+ ], LiveKitRecordingInput);
188
+ export { LiveKitRecordingInput };
189
+ let LiveKitRecordingResult = class LiveKitRecordingResult {
190
+ };
191
+ __decorate([
192
+ Field(() => Boolean),
193
+ __metadata("design:type", Boolean)
194
+ ], LiveKitRecordingResult.prototype, "Success", void 0);
195
+ __decorate([
196
+ Field(() => String, { nullable: true }),
197
+ __metadata("design:type", String)
198
+ ], LiveKitRecordingResult.prototype, "ErrorMessage", void 0);
199
+ __decorate([
200
+ Field(() => String),
201
+ __metadata("design:type", String)
202
+ ], LiveKitRecordingResult.prototype, "EgressID", void 0);
203
+ __decorate([
204
+ Field(() => String),
205
+ __metadata("design:type", String)
206
+ ], LiveKitRecordingResult.prototype, "Status", void 0);
207
+ LiveKitRecordingResult = __decorate([
208
+ ObjectType()
209
+ ], LiveKitRecordingResult);
210
+ export { LiveKitRecordingResult };
211
+ /** A selectable provider-native voice for the dev voice picker. */
212
+ let RealtimeVoiceOptionResult = class RealtimeVoiceOptionResult {
213
+ };
214
+ __decorate([
215
+ Field(() => String),
216
+ __metadata("design:type", String)
217
+ ], RealtimeVoiceOptionResult.prototype, "ID", void 0);
218
+ __decorate([
219
+ Field(() => String),
220
+ __metadata("design:type", String)
221
+ ], RealtimeVoiceOptionResult.prototype, "Name", void 0);
222
+ RealtimeVoiceOptionResult = __decorate([
223
+ ObjectType()
224
+ ], RealtimeVoiceOptionResult);
225
+ export { RealtimeVoiceOptionResult };
226
+ /** An active Realtime model with the voices its driver supports — feeds the dev model/voice picker. */
227
+ let RealtimeModelVoicesResult = class RealtimeModelVoicesResult {
228
+ };
229
+ __decorate([
230
+ Field(() => String),
231
+ __metadata("design:type", String)
232
+ ], RealtimeModelVoicesResult.prototype, "ModelID", void 0);
233
+ __decorate([
234
+ Field(() => String),
235
+ __metadata("design:type", String)
236
+ ], RealtimeModelVoicesResult.prototype, "ModelName", void 0);
237
+ __decorate([
238
+ Field(() => [RealtimeVoiceOptionResult]),
239
+ __metadata("design:type", Array)
240
+ ], RealtimeModelVoicesResult.prototype, "Voices", void 0);
241
+ RealtimeModelVoicesResult = __decorate([
242
+ ObjectType()
243
+ ], RealtimeModelVoicesResult);
244
+ export { RealtimeModelVoicesResult };
245
+ let RealtimeBridgeResolver = class RealtimeBridgeResolver extends ResolverBase {
246
+ constructor() {
247
+ super(...arguments);
248
+ /** Durable `AIAgentSession` record manager — creates the session row the bridge FK-references. */
249
+ this.sessionManager = new SessionManager();
250
+ }
251
+ /**
252
+ * Mints a scoped LiveKit access token for the current user to join the given room. The participant
253
+ * identity is derived server-side from the authenticated user (never trusted from the client).
254
+ */
255
+ async MintLiveKitClientToken(input, context = {}) {
256
+ const failure = (msg) => ({
257
+ Success: false,
258
+ ErrorMessage: msg,
259
+ ServerUrl: '',
260
+ Token: '',
261
+ Identity: '',
262
+ RoomName: input.RoomName,
263
+ });
264
+ try {
265
+ const user = this.GetUserFromPayload(context.userPayload);
266
+ if (!user) {
267
+ return failure('Unable to determine current user.');
268
+ }
269
+ const tokenService = new LiveKitTokenService();
270
+ const minted = await tokenService.MintClientToken(input.RoomName, this.participantIdentity(user), input.DisplayName ?? user.Name ?? user.Email);
271
+ return { Success: true, ...minted };
272
+ }
273
+ catch (error) {
274
+ const msg = error instanceof Error ? error.message : String(error);
275
+ LogError(`MintLiveKitClientToken failed: ${msg}`);
276
+ return failure(msg);
277
+ }
278
+ }
279
+ /**
280
+ * Starts (or reuses) an agent's presence in a LiveKit room and returns a client token so the calling
281
+ * user can immediately join the same room.
282
+ */
283
+ async StartLiveKitAgentRoomSession(input, context = {}) {
284
+ const failure = (msg, roomName = '') => ({
285
+ Success: false,
286
+ ErrorMessage: msg,
287
+ SessionBridgeID: '',
288
+ RoomName: roomName,
289
+ ServerUrl: '',
290
+ ClientToken: '',
291
+ Identity: '',
292
+ });
293
+ try {
294
+ const user = this.GetUserFromPayload(context.userPayload);
295
+ if (!user) {
296
+ return failure('Unable to determine current user.');
297
+ }
298
+ const provider = GetReadWriteProvider(context.providers);
299
+ const roomName = input.RoomName?.trim() || `mj-${randomUUID()}`;
300
+ // Resolve the AIAgentSession the bridge will reference. The bridge row FK-references
301
+ // AIAgentSession(ID), so we must use an EXISTING session — either one the caller supplied, or a
302
+ // freshly-created one. Previously this minted a bare random UUID with no backing row, so the
303
+ // bridge INSERT failed the FK_AIAgentSessionBridge_Session constraint.
304
+ let agentSessionID = input.AgentSessionID?.trim();
305
+ if (!agentSessionID) {
306
+ if (!input.AgentID?.trim()) {
307
+ return failure('An AgentID is required to start an agent room session.', roomName);
308
+ }
309
+ const createdSession = await this.sessionManager.CreateSession({ agentID: input.AgentID.trim(), userID: user.ID }, user, provider);
310
+ agentSessionID = createdSession.ID;
311
+ }
312
+ const session = await LiveKitAgentRoomCoordinator.Instance.StartAgentRoomSession({
313
+ AgentSessionID: agentSessionID,
314
+ RoomName: roomName,
315
+ AgentID: input.AgentID,
316
+ AgentName: input.AgentName,
317
+ TargetAgentID: input.TargetAgentID,
318
+ RealtimeModelID: input.RealtimeModelID,
319
+ RealtimeVoice: input.RealtimeVoice,
320
+ TurnMode: this.normalizeTurnMode(input.TurnMode),
321
+ ContextUser: user,
322
+ MetadataProvider: provider,
323
+ });
324
+ const tokenService = new LiveKitTokenService();
325
+ const clientToken = await tokenService.MintClientToken(roomName, this.participantIdentity(user), user.Name ?? user.Email);
326
+ return {
327
+ Success: true,
328
+ SessionBridgeID: session.SessionBridgeID,
329
+ RoomName: session.RoomName,
330
+ ServerUrl: session.ServerUrl,
331
+ ClientToken: clientToken.Token,
332
+ Identity: clientToken.Identity,
333
+ };
334
+ }
335
+ catch (error) {
336
+ const msg = error instanceof Error ? error.message : String(error);
337
+ LogError(`StartLiveKitAgentRoomSession failed: ${msg}`);
338
+ return failure(msg, input.RoomName ?? '');
339
+ }
340
+ }
341
+ /**
342
+ * Stops one agent's presence in a room (the bot leaves) — the remove half of in-room agent management.
343
+ * Identified by the `SessionBridgeID` returned from {@link StartLiveKitAgentRoomSession}. Returns `true`
344
+ * when the bridge was stopped. Best-effort: a missing/already-stopped bridge or any error resolves `false`.
345
+ *
346
+ * @param sessionBridgeID The `MJ: AI Agent Session Bridges` row id of the agent to remove.
347
+ */
348
+ async StopLiveKitAgentRoomSession(sessionBridgeID, context = {}) {
349
+ try {
350
+ const user = this.GetUserFromPayload(context.userPayload);
351
+ if (!user) {
352
+ return false;
353
+ }
354
+ const provider = GetReadWriteProvider(context.providers);
355
+ return await LiveKitAgentRoomCoordinator.Instance.StopAgentRoomSession(sessionBridgeID, 'Explicit', user, provider);
356
+ }
357
+ catch (error) {
358
+ LogError(`StopLiveKitAgentRoomSession failed: ${error instanceof Error ? error.message : String(error)}`);
359
+ return false;
360
+ }
361
+ }
362
+ /**
363
+ * Lists active Realtime models with the voices each driver supports — the source for the dev model/voice
364
+ * picker (gated client-side by the `Realtime: Advanced Session Controls` authorization). Read-only; returns
365
+ * an empty list on any error so the picker degrades gracefully to "no overrides".
366
+ */
367
+ async GetRealtimeModelVoices(context = {}) {
368
+ try {
369
+ const user = this.GetUserFromPayload(context.userPayload);
370
+ if (!user) {
371
+ return [];
372
+ }
373
+ const provider = GetReadWriteProvider(context.providers);
374
+ return await GetRealtimeModelVoices(user, provider);
375
+ }
376
+ catch (error) {
377
+ LogError(`GetRealtimeModelVoices failed: ${error instanceof Error ? error.message : String(error)}`);
378
+ return [];
379
+ }
380
+ }
381
+ /**
382
+ * Invites MJ users to a live room: for each user, sends a **"Live Room Invite"** notification via the
383
+ * unified {@link NotificationEngine} — which writes the in-app notification (clickable → joins the room
384
+ * via the `meet-room` ResourceConfiguration) and ALSO delivers over MJ Comms (email/SMS) when the type's
385
+ * channels + a provider are configured. Best-effort: Comms not being set up never blocks the in-app
386
+ * notification, and a missing "Live Room Invite" type (seed not yet pushed) is caught and returns false.
387
+ *
388
+ * @param roomName The LiveKit room the invitees should join.
389
+ * @param userIDs The `MJ: Users` ids to invite.
390
+ * @returns `true` when at least one invite was delivered.
391
+ */
392
+ async InviteUsersToLiveKitRoom(roomName, userIDs, context = {}) {
393
+ try {
394
+ const user = this.GetUserFromPayload(context.userPayload);
395
+ if (!user) {
396
+ return false;
397
+ }
398
+ const provider = GetReadWriteProvider(context.providers);
399
+ await NotificationEngine.Instance.Config(false, user, provider);
400
+ const inviter = user.Name?.trim() || user.Email || 'Someone';
401
+ let anyDelivered = false;
402
+ for (const userId of userIDs ?? []) {
403
+ if (!userId?.trim()) {
404
+ continue;
405
+ }
406
+ const result = await NotificationEngine.Instance.SendNotification({
407
+ userId,
408
+ typeNameOrId: 'Live Room Invite',
409
+ title: `${inviter} invited you to a live room`,
410
+ message: `${inviter} is inviting you to join a live Meet room. Open this notification to join.`,
411
+ resourceConfiguration: { type: 'meet-room', room: roomName },
412
+ }, user);
413
+ anyDelivered = anyDelivered || result.success;
414
+ }
415
+ return anyDelivered;
416
+ }
417
+ catch (error) {
418
+ LogError(`InviteUsersToLiveKitRoom failed: ${error instanceof Error ? error.message : String(error)}`);
419
+ return false;
420
+ }
421
+ }
422
+ /**
423
+ * Starts recording (composite egress) of a room. Server-authorized — the browser never holds egress
424
+ * credentials.
425
+ */
426
+ async StartLiveKitRecording(input, context = {}) {
427
+ try {
428
+ if (!this.GetUserFromPayload(context.userPayload)) {
429
+ return { Success: false, ErrorMessage: 'Unable to determine current user.', EgressID: '', Status: '' };
430
+ }
431
+ const info = await new LiveKitEgressService().StartRoomRecording({ RoomName: input.RoomName, Layout: input.Layout });
432
+ return { Success: true, EgressID: info.EgressID, Status: info.Status };
433
+ }
434
+ catch (error) {
435
+ const msg = error instanceof Error ? error.message : String(error);
436
+ LogError(`StartLiveKitRecording failed: ${msg}`);
437
+ return { Success: false, ErrorMessage: msg, EgressID: '', Status: '' };
438
+ }
439
+ }
440
+ /** Stops a recording by egress id. */
441
+ async StopLiveKitRecording(egressID, context = {}) {
442
+ try {
443
+ if (!this.GetUserFromPayload(context.userPayload)) {
444
+ return { Success: false, ErrorMessage: 'Unable to determine current user.', EgressID: egressID, Status: '' };
445
+ }
446
+ const info = await new LiveKitEgressService().StopRecording(egressID);
447
+ return { Success: true, EgressID: info.EgressID, Status: info.Status };
448
+ }
449
+ catch (error) {
450
+ const msg = error instanceof Error ? error.message : String(error);
451
+ LogError(`StopLiveKitRecording failed: ${msg}`);
452
+ return { Success: false, ErrorMessage: msg, EgressID: egressID, Status: '' };
453
+ }
454
+ }
455
+ /** Builds a stable, lowercased participant identity from the authenticated user. */
456
+ participantIdentity(user) {
457
+ return `user-${user.ID}`.toLowerCase();
458
+ }
459
+ /** Normalizes a turn-mode string to the bridge's accepted values. */
460
+ normalizeTurnMode(mode) {
461
+ switch ((mode ?? '').toLowerCase()) {
462
+ case 'active':
463
+ return 'Active';
464
+ case 'hybrid':
465
+ return 'Hybrid';
466
+ case 'passive':
467
+ return 'Passive';
468
+ default:
469
+ return undefined;
470
+ }
471
+ }
472
+ };
473
+ __decorate([
474
+ Mutation(() => LiveKitClientTokenResult),
475
+ __param(0, Arg('input', () => MintLiveKitClientTokenInput)),
476
+ __param(1, Ctx()),
477
+ __metadata("design:type", Function),
478
+ __metadata("design:paramtypes", [MintLiveKitClientTokenInput, Object]),
479
+ __metadata("design:returntype", Promise)
480
+ ], RealtimeBridgeResolver.prototype, "MintLiveKitClientToken", null);
481
+ __decorate([
482
+ Mutation(() => LiveKitAgentRoomSessionResult),
483
+ __param(0, Arg('input', () => StartLiveKitAgentRoomSessionInput)),
484
+ __param(1, Ctx()),
485
+ __metadata("design:type", Function),
486
+ __metadata("design:paramtypes", [StartLiveKitAgentRoomSessionInput, Object]),
487
+ __metadata("design:returntype", Promise)
488
+ ], RealtimeBridgeResolver.prototype, "StartLiveKitAgentRoomSession", null);
489
+ __decorate([
490
+ Mutation(() => Boolean),
491
+ __param(0, Arg('sessionBridgeID', () => String)),
492
+ __param(1, Ctx()),
493
+ __metadata("design:type", Function),
494
+ __metadata("design:paramtypes", [String, Object]),
495
+ __metadata("design:returntype", Promise)
496
+ ], RealtimeBridgeResolver.prototype, "StopLiveKitAgentRoomSession", null);
497
+ __decorate([
498
+ Query(() => [RealtimeModelVoicesResult]),
499
+ __param(0, Ctx()),
500
+ __metadata("design:type", Function),
501
+ __metadata("design:paramtypes", [Object]),
502
+ __metadata("design:returntype", Promise)
503
+ ], RealtimeBridgeResolver.prototype, "GetRealtimeModelVoices", null);
504
+ __decorate([
505
+ Mutation(() => Boolean),
506
+ __param(0, Arg('roomName', () => String)),
507
+ __param(1, Arg('userIDs', () => [String])),
508
+ __param(2, Ctx()),
509
+ __metadata("design:type", Function),
510
+ __metadata("design:paramtypes", [String, Array, Object]),
511
+ __metadata("design:returntype", Promise)
512
+ ], RealtimeBridgeResolver.prototype, "InviteUsersToLiveKitRoom", null);
513
+ __decorate([
514
+ Mutation(() => LiveKitRecordingResult),
515
+ __param(0, Arg('input', () => LiveKitRecordingInput)),
516
+ __param(1, Ctx()),
517
+ __metadata("design:type", Function),
518
+ __metadata("design:paramtypes", [LiveKitRecordingInput, Object]),
519
+ __metadata("design:returntype", Promise)
520
+ ], RealtimeBridgeResolver.prototype, "StartLiveKitRecording", null);
521
+ __decorate([
522
+ Mutation(() => LiveKitRecordingResult),
523
+ __param(0, Arg('egressID', () => String)),
524
+ __param(1, Ctx()),
525
+ __metadata("design:type", Function),
526
+ __metadata("design:paramtypes", [String, Object]),
527
+ __metadata("design:returntype", Promise)
528
+ ], RealtimeBridgeResolver.prototype, "StopLiveKitRecording", null);
529
+ RealtimeBridgeResolver = __decorate([
530
+ Resolver()
531
+ ], RealtimeBridgeResolver);
532
+ export { RealtimeBridgeResolver };
533
+ //# sourceMappingURL=RealtimeBridgeResolver.js.map