@memberjunction/server 6.2.0-edge.1 → 6.2.0-edge.3

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 (220) hide show
  1. package/README.md +30 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/config.d.ts +2189 -71
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +123 -3
  6. package/dist/config.js.map +1 -1
  7. package/dist/context.d.ts.map +1 -1
  8. package/dist/context.js +11 -23
  9. package/dist/context.js.map +1 -1
  10. package/dist/generated/graphql-schemas/__mj.d.ts +2143 -205
  11. package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
  12. package/dist/generated/graphql-schemas/__mj.js +24441 -14433
  13. package/dist/generated/graphql-schemas/__mj.js.map +1 -1
  14. package/dist/generic/FireAndForgetHeartbeat.d.ts +15 -1
  15. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  16. package/dist/generic/FireAndForgetHeartbeat.js +16 -2
  17. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  18. package/dist/generic/OrphanedConversationDetailReconciler.d.ts +31 -0
  19. package/dist/generic/OrphanedConversationDetailReconciler.d.ts.map +1 -0
  20. package/dist/generic/OrphanedConversationDetailReconciler.js +215 -0
  21. package/dist/generic/OrphanedConversationDetailReconciler.js.map +1 -0
  22. package/dist/generic/PushStatusResolver.d.ts +38 -0
  23. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  24. package/dist/generic/PushStatusResolver.js +84 -1
  25. package/dist/generic/PushStatusResolver.js.map +1 -1
  26. package/dist/generic/ResolverBase.d.ts +56 -4
  27. package/dist/generic/ResolverBase.d.ts.map +1 -1
  28. package/dist/generic/ResolverBase.js +191 -74
  29. package/dist/generic/ResolverBase.js.map +1 -1
  30. package/dist/generic/RunViewResolver.d.ts +4 -0
  31. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  32. package/dist/generic/RunViewResolver.js +33 -1
  33. package/dist/generic/RunViewResolver.js.map +1 -1
  34. package/dist/index.d.ts +4 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +204 -50
  37. package/dist/index.js.map +1 -1
  38. package/dist/postgresqlCompat.d.ts +8 -0
  39. package/dist/postgresqlCompat.d.ts.map +1 -0
  40. package/dist/postgresqlCompat.js +19 -0
  41. package/dist/postgresqlCompat.js.map +1 -0
  42. package/dist/postgresqlPoolSettings.d.ts +108 -0
  43. package/dist/postgresqlPoolSettings.d.ts.map +1 -0
  44. package/dist/postgresqlPoolSettings.js +134 -0
  45. package/dist/postgresqlPoolSettings.js.map +1 -0
  46. package/dist/resolvers/AdhocQueryResolver.d.ts +23 -18
  47. package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
  48. package/dist/resolvers/AdhocQueryResolver.js +77 -167
  49. package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
  50. package/dist/resolvers/AgentRunStatusPublisher.d.ts +55 -0
  51. package/dist/resolvers/AgentRunStatusPublisher.d.ts.map +1 -0
  52. package/dist/resolvers/AgentRunStatusPublisher.js +141 -0
  53. package/dist/resolvers/AgentRunStatusPublisher.js.map +1 -0
  54. package/dist/resolvers/ConversationRunEventsResolver.d.ts +90 -0
  55. package/dist/resolvers/ConversationRunEventsResolver.d.ts.map +1 -0
  56. package/dist/resolvers/ConversationRunEventsResolver.js +283 -0
  57. package/dist/resolvers/ConversationRunEventsResolver.js.map +1 -0
  58. package/dist/resolvers/DuplicateEntryCheckResolver.d.ts +98 -0
  59. package/dist/resolvers/DuplicateEntryCheckResolver.d.ts.map +1 -0
  60. package/dist/resolvers/DuplicateEntryCheckResolver.js +227 -0
  61. package/dist/resolvers/DuplicateEntryCheckResolver.js.map +1 -0
  62. package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
  63. package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
  64. package/dist/resolvers/EntityRecordNameResolver.js +9 -47
  65. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  66. package/dist/resolvers/FetchEntityVectorsResolver.d.ts.map +1 -1
  67. package/dist/resolvers/FetchEntityVectorsResolver.js +2 -1
  68. package/dist/resolvers/FetchEntityVectorsResolver.js.map +1 -1
  69. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  70. package/dist/resolvers/GetDataResolver.js +9 -0
  71. package/dist/resolvers/GetDataResolver.js.map +1 -1
  72. package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
  73. package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
  74. package/dist/resolvers/HumanHandoffResolver.js +324 -0
  75. package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
  76. package/dist/resolvers/MeetingResolver.d.ts +69 -0
  77. package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
  78. package/dist/resolvers/MeetingResolver.js +381 -0
  79. package/dist/resolvers/MeetingResolver.js.map +1 -0
  80. package/dist/resolvers/MergeRecordsResolver.d.ts +7 -0
  81. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  82. package/dist/resolvers/MergeRecordsResolver.js +16 -2
  83. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  84. package/dist/resolvers/RealtimeBridgeResolver.d.ts +34 -1
  85. package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
  86. package/dist/resolvers/RealtimeBridgeResolver.js +202 -7
  87. package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
  88. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +45 -89
  89. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  90. package/dist/resolvers/RealtimeClientSessionResolver.js +94 -240
  91. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  92. package/dist/resolvers/RunAIAgentResolver.d.ts +0 -16
  93. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  94. package/dist/resolvers/RunAIAgentResolver.js +23 -153
  95. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  96. package/dist/resolvers/RunDecisionResolver.d.ts +149 -0
  97. package/dist/resolvers/RunDecisionResolver.d.ts.map +1 -0
  98. package/dist/resolvers/RunDecisionResolver.js +396 -0
  99. package/dist/resolvers/RunDecisionResolver.js.map +1 -0
  100. package/dist/resolvers/VectorizeEntityResolver.d.ts +1 -1
  101. package/dist/resolvers/VectorizeEntityResolver.d.ts.map +1 -1
  102. package/dist/resolvers/VectorizeEntityResolver.js +14 -10
  103. package/dist/resolvers/VectorizeEntityResolver.js.map +1 -1
  104. package/dist/resolvers/adhocTimeout.d.ts +7 -0
  105. package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
  106. package/dist/resolvers/adhocTimeout.js +12 -0
  107. package/dist/resolvers/adhocTimeout.js.map +1 -0
  108. package/dist/resolvers/meetings/index.d.ts +5 -0
  109. package/dist/resolvers/meetings/index.d.ts.map +1 -0
  110. package/dist/resolvers/meetings/index.js +5 -0
  111. package/dist/resolvers/meetings/index.js.map +1 -0
  112. package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
  113. package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
  114. package/dist/resolvers/meetings/meetingHelpers.js +212 -0
  115. package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
  116. package/dist/resolvers/meetings/meetingMutations.d.ts +12 -0
  117. package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
  118. package/dist/resolvers/meetings/meetingMutations.js +418 -0
  119. package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
  120. package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
  121. package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
  122. package/dist/resolvers/meetings/meetingQueries.js +113 -0
  123. package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
  124. package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
  125. package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
  126. package/dist/resolvers/meetings/meetingTypes.js +345 -0
  127. package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
  128. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  129. package/dist/rest/ViewOperationsHandler.js +8 -5
  130. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  131. package/dist/services/TaskGraphActionRunner.d.ts +8 -0
  132. package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
  133. package/dist/services/TaskGraphActionRunner.js +27 -1
  134. package/dist/services/TaskGraphActionRunner.js.map +1 -1
  135. package/dist/services/WorkQueueHostService.d.ts +36 -0
  136. package/dist/services/WorkQueueHostService.d.ts.map +1 -0
  137. package/dist/services/WorkQueueHostService.js +97 -0
  138. package/dist/services/WorkQueueHostService.js.map +1 -0
  139. package/dist/services/workQueueConfig.d.ts +103 -0
  140. package/dist/services/workQueueConfig.d.ts.map +1 -0
  141. package/dist/services/workQueueConfig.js +48 -0
  142. package/dist/services/workQueueConfig.js.map +1 -0
  143. package/dist/types.d.ts +5 -0
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/types.js.map +1 -1
  146. package/package.json +95 -92
  147. package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
  148. package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
  149. package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
  150. package/src/__tests__/AgentRunStatusPublisher.test.ts +175 -0
  151. package/src/__tests__/DuplicateEntryCheckResolver.test.ts +300 -0
  152. package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
  153. package/src/__tests__/HumanHandoffResolver.test.ts +233 -0
  154. package/src/__tests__/MeetingResolver.test.ts +374 -0
  155. package/src/__tests__/RealtimeBridgeResolver.test.ts +240 -2
  156. package/src/__tests__/RealtimeClientSessionResolver.test.ts +216 -2
  157. package/src/__tests__/RemoteBrowserActionRecovery.test.ts +7 -1
  158. package/src/__tests__/RemoteBrowserAudioStream.test.ts +7 -1
  159. package/src/__tests__/RemoteBrowserSnapshot.test.ts +7 -1
  160. package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
  161. package/src/__tests__/ResolverBase.clientOldValues.test.ts +52 -0
  162. package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
  163. package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
  164. package/src/__tests__/RunAIAgentResolver.historyFrom.test.ts +182 -12
  165. package/src/__tests__/RunAIAgentResolver.streaming.test.ts +18 -27
  166. package/src/__tests__/RunDecisionResolver.test.ts +699 -0
  167. package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +43 -0
  168. package/src/__tests__/VectorizeEntityResolver.test.ts +106 -0
  169. package/src/__tests__/WorkQueueHostService.test.ts +133 -0
  170. package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
  171. package/src/__tests__/conversationRunEvents.test.ts +399 -0
  172. package/src/__tests__/orphanedConversationDetailReconciler.test.ts +283 -0
  173. package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
  174. package/src/__tests__/pushStatusFanOut.test.ts +206 -0
  175. package/src/__tests__/translateBracketsToPG.test.ts +20 -0
  176. package/src/auth/__tests__/backward-compatibility.test.ts +1 -0
  177. package/src/config.ts +130 -3
  178. package/src/context.ts +11 -24
  179. package/src/generated/graphql-schemas/__mj.ts +24183 -17182
  180. package/src/generic/FireAndForgetHeartbeat.ts +16 -2
  181. package/src/generic/OrphanedConversationDetailReconciler.ts +267 -0
  182. package/src/generic/PushStatusResolver.ts +97 -1
  183. package/src/generic/ResolverBase.ts +220 -76
  184. package/src/generic/RunViewResolver.ts +33 -2
  185. package/src/index.ts +228 -51
  186. package/src/postgresqlCompat.ts +21 -0
  187. package/src/postgresqlPoolSettings.ts +213 -0
  188. package/src/resolvers/AdhocQueryResolver.ts +88 -188
  189. package/src/resolvers/AgentRunStatusPublisher.ts +175 -0
  190. package/src/resolvers/ConversationRunEventsResolver.ts +308 -0
  191. package/src/resolvers/DuplicateEntryCheckResolver.ts +232 -0
  192. package/src/resolvers/EntityRecordNameResolver.ts +9 -51
  193. package/src/resolvers/FetchEntityVectorsResolver.ts +2 -1
  194. package/src/resolvers/GetDataResolver.ts +10 -0
  195. package/src/resolvers/HumanHandoffResolver.ts +304 -0
  196. package/src/resolvers/MeetingResolver.ts +438 -0
  197. package/src/resolvers/MergeRecordsResolver.ts +14 -2
  198. package/src/resolvers/RealtimeBridgeResolver.ts +227 -13
  199. package/src/resolvers/RealtimeClientSessionResolver.ts +99 -287
  200. package/src/resolvers/RunAIAgentResolver.ts +28 -174
  201. package/src/resolvers/RunDecisionResolver.ts +435 -0
  202. package/src/resolvers/VectorizeEntityResolver.ts +16 -11
  203. package/src/resolvers/__tests__/MergeRecordsResolver.test.ts +93 -0
  204. package/src/resolvers/adhocTimeout.ts +12 -0
  205. package/src/resolvers/meetings/index.ts +4 -0
  206. package/src/resolvers/meetings/meetingHelpers.ts +307 -0
  207. package/src/resolvers/meetings/meetingMutations.ts +535 -0
  208. package/src/resolvers/meetings/meetingQueries.ts +172 -0
  209. package/src/resolvers/meetings/meetingTypes.ts +238 -0
  210. package/src/rest/ViewOperationsHandler.ts +8 -5
  211. package/src/services/TaskGraphActionRunner.ts +29 -1
  212. package/src/services/WorkQueueHostService.ts +129 -0
  213. package/src/services/workQueueConfig.ts +52 -0
  214. package/src/types.ts +5 -0
  215. package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
  216. package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
  217. package/dist/resolvers/adhoc-query-helpers.js +0 -50
  218. package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
  219. package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
  220. package/src/resolvers/adhoc-query-helpers.ts +0 -67
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -29,6 +29,8 @@ import { WebSocketServer } from 'ws';
29
29
  import { RealtimeProxyServer } from './realtimeProxy/RealtimeProxyServer.js';
30
30
  import buildApolloServer from './apolloServer/index.js';
31
31
  import { configInfo, configFilePath, dbDatabase, dbHost, dbPort, dbUsername, graphqlPort, graphqlRootPath, mj_core_schema, websiteRunFromPackage } from './config.js';
32
+ import { TranslateBracketsToPG } from './postgresqlCompat.js';
33
+ import { BuildPostgreSQLConnectionConfig, DescribeReadOnlyLoginOverreach, PostgreSQLReadOnlyPool, ResolvePostgreSQLEndpoint, ResolvePostgreSQLReadOnlyCredentials, ToPGPoolConfig } from './postgresqlPoolSettings.js';
32
34
  import { default as jwt } from 'jsonwebtoken';
33
35
  import { contextFunction, CreateUnifiedAuthMiddleware, getUserPayload } from './context.js';
34
36
  import { requireSystemUserDirective, publicDirective } from './directives/index.js';
@@ -55,12 +57,17 @@ import { createAuthProviderCatalogRouter, AUTH_CATALOG_MOUNT_PATH } from './auth
55
57
  import { GetAPIKeyEngine } from '@memberjunction/api-keys';
56
58
  import { RedisLocalStorageProvider } from '@memberjunction/redis-provider';
57
59
  import { PubSubManager } from './generic/PubSubManager.js';
60
+ import { ReconcileOrphanedConversationDetails } from './generic/OrphanedConversationDetailReconciler.js';
61
+ import { PUSH_STATUS_UPDATES_TOPIC, SetPushStatusPublishHook, ParseReplicatedStatusUpdate, } from './generic/PushStatusResolver.js';
62
+ import { HANDOFF_OFFER_FANOUT_CHANNEL, HANDOFF_OFFER_TOPIC, SetHandoffOfferPublishHook, ParseReplicatedHandoffOfferUpdate, } from './resolvers/HumanHandoffResolver.js';
63
+ import { RoomHandoffEngine } from '@memberjunction/livekit-room-server';
58
64
  import { IntegrationProgressEmitter } from '@memberjunction/integration-progress-artifacts';
59
65
  import { PublishIntegrationProgress } from './resolvers/IntegrationProgressResolver.js';
60
66
  import { RegisterRSUProgressBridge } from './integration/RSUProgressBridge.js';
61
67
  import { ClientToolRequestManager, AgentRunWatchdog } from '@memberjunction/ai-agents';
62
68
  import { SessionJanitor } from './agentSessions/index.js';
63
69
  import { StartTaskGraphDispatcher } from './services/StartTaskGraphDispatcher.js';
70
+ import { MJServerWorkQueueProviderSource, StartWorkQueueHost } from './services/WorkQueueHostService.js';
64
71
  import { GetAttachmentService } from '@memberjunction/aiengine';
65
72
  import { MJStorageBlobStore } from './services/MJStorageBlobStore.js';
66
73
  import { CACHE_INVALIDATION_TOPIC, MayBroadcastRecordData, ConfigureRecordDataBroadcast } from './generic/CacheInvalidationResolver.js';
@@ -131,7 +138,9 @@ export * from './generic/refusalExtensions.js';
131
138
  export * from './generic/RunViewResolver.js';
132
139
  export * from './resolvers/RunTemplateResolver.js';
133
140
  export * from './resolvers/RunAIPromptResolver.js';
141
+ export * from './resolvers/RunDecisionResolver.js';
134
142
  export * from './resolvers/RunAIAgentResolver.js';
143
+ export { AgentRunStatusPublisher } from './resolvers/AgentRunStatusPublisher.js';
135
144
  export * from './resolvers/VectorizeEntityResolver.js';
136
145
  export * from './resolvers/SearchKnowledgeResolver.js';
137
146
  export * from './resolvers/SearchKnowledgeStreamResolver.js';
@@ -186,6 +195,7 @@ export * from './rest/MediaAccessKeys.js';
186
195
  export * from './rest/MediaStreamHandler.js';
187
196
  export * from './resolvers/InfoResolver.js';
188
197
  export * from './resolvers/PotentialDuplicateRecordResolver.js';
198
+ export * from './resolvers/DuplicateEntryCheckResolver.js';
189
199
  export * from './resolvers/RunTestResolver.js';
190
200
  export * from './resolvers/SearchEntitiesResolver.js';
191
201
  export * from './resolvers/UserFavoriteResolver.js';
@@ -196,6 +206,7 @@ export * from './resolvers/CurrentUserContextResolver.js';
196
206
  export * from './resolvers/RSUResolver.js';
197
207
  export * from './resolvers/AgentSessionResolver.js';
198
208
  export * from './resolvers/RealtimeClientSessionResolver.js';
209
+ export * from './resolvers/MeetingResolver.js';
199
210
  export * from './resolvers/RemoteBrowserActionResolver.js';
200
211
  export * from './agentSessions/index.js';
201
212
  export { GetReadOnlyDataSource, GetReadWriteDataSource, GetReadWriteProvider, GetReadOnlyProvider } from './util.js';
@@ -229,10 +240,102 @@ function resolveServerVersion() {
229
240
  const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
230
241
  return pkg.version;
231
242
  }
232
- catch {
243
+ catch (err) {
244
+ LogError('Failed to resolve server version from package.json', undefined, err);
233
245
  return undefined;
234
246
  }
235
247
  }
248
+ /** How often to re-check for conversation details left behind by finished runs. */
249
+ const ORPHAN_DETAIL_SWEEP_INTERVAL_MS = 5 * 60_000;
250
+ /** Redis channel carrying replicated push-status updates between server instances. */
251
+ const PUSH_STATUS_FANOUT_CHANNEL = 'push-status-updates';
252
+ /**
253
+ * Replicate push-status updates across server instances over Redis (MJ #4222).
254
+ *
255
+ * Outbound: every locally-published update is forwarded on a shared channel. Inbound: a message
256
+ * from another instance is republished onto THIS instance's local topic, where the normal
257
+ * subscription filter decides who receives it — so the identity gate (`ownerUserId` vs. the
258
+ * connection's authenticated user) still applies to a replicated message exactly as it does to a
259
+ * local one. The replica has no say in who sees what.
260
+ *
261
+ * Republishing goes straight to `PubSubManager`, never back through `publishStatusUpdate`, so an
262
+ * inbound message cannot be re-broadcast and loop. `SourceServerId` guards the remaining case: a
263
+ * publisher also receives its own message from Redis.
264
+ */
265
+ async function wirePushStatusFanOut(redisProvider, startupLog) {
266
+ try {
267
+ await redisProvider.SubscribeToChannel(PUSH_STATUS_FANOUT_CHANNEL, (raw) => {
268
+ try {
269
+ const payload = ParseReplicatedStatusUpdate(raw, MJGlobal.Instance.ProcessUUID);
270
+ if (!payload) {
271
+ return;
272
+ }
273
+ // Rebuilt as a plain record: the topic's publish signature takes an index-signature type,
274
+ // and listing the fields keeps the wire shape explicit at the one place it crosses hosts.
275
+ PubSubManager.Instance.Publish(PUSH_STATUS_UPDATES_TOPIC, {
276
+ sessionId: payload.sessionId,
277
+ ownerUserId: payload.ownerUserId,
278
+ message: payload.message,
279
+ SourceServerId: payload.SourceServerId,
280
+ });
281
+ }
282
+ catch (err) {
283
+ // A malformed message on a shared channel must not take down the subscriber.
284
+ LogError('Error processing push-status fan-out message', undefined, err);
285
+ }
286
+ });
287
+ SetPushStatusPublishHook((payload) => {
288
+ redisProvider.PublishMessage(PUSH_STATUS_FANOUT_CHANNEL, JSON.stringify(payload));
289
+ });
290
+ // Printed unconditionally, not verbose-gated. "Is fan-out actually on?" is the first question
291
+ // anyone debugging a hung conversation behind a load balancer asks, and a silent default left
292
+ // no way to answer it.
293
+ console.log('[MJAPI] Push-status updates: cross-instance fan-out enabled via Redis');
294
+ }
295
+ catch (err) {
296
+ // Single-instance delivery still works, and the durable tail query covers the rest. Degraded,
297
+ // not broken — so this must not stop the server from starting.
298
+ console.warn(`Push-status fan-out unavailable: ${err.message}`);
299
+ }
300
+ }
301
+ /**
302
+ * Replicate handoff-offer updates across server instances over Redis.
303
+ *
304
+ * Outbound: every locally-published offer change is forwarded on a shared Redis channel.
305
+ * Inbound: a message from another instance is republished onto THIS instance's local GraphQL
306
+ * topic (where the subscription filter scopes to the target user) and delivered to RoomHandoffEngine
307
+ * so the call-hosting instance can transition its local flow (e.g. wait for the user to join the room).
308
+ */
309
+ async function wireHandoffOfferFanOut(redisProvider, startupLog) {
310
+ try {
311
+ await redisProvider.SubscribeToChannel(HANDOFF_OFFER_FANOUT_CHANNEL, (raw) => {
312
+ try {
313
+ const payload = ParseReplicatedHandoffOfferUpdate(raw, MJGlobal.Instance.ProcessUUID);
314
+ if (!payload) {
315
+ return;
316
+ }
317
+ PubSubManager.Instance.Publish(HANDOFF_OFFER_TOPIC, {
318
+ UserID: payload.UserID,
319
+ Kind: payload.Kind,
320
+ Offer: payload.Offer,
321
+ });
322
+ RoomHandoffEngine.Instance.OnRemoteOfferChange(payload);
323
+ }
324
+ catch (err) {
325
+ // A malformed message on a shared channel must not take down the subscriber.
326
+ LogError('Error processing handoff-offer fan-out message', undefined, err);
327
+ }
328
+ });
329
+ SetHandoffOfferPublishHook((payload) => {
330
+ redisProvider.PublishMessage(HANDOFF_OFFER_FANOUT_CHANNEL, JSON.stringify(payload));
331
+ });
332
+ console.log('[MJAPI] Handoff-offer updates: cross-instance fan-out enabled via Redis');
333
+ startupLog.LogIf('verbose', 'Handoff-offer updates: cross-instance fan-out enabled via Redis');
334
+ }
335
+ catch (err) {
336
+ console.warn(`Handoff-offer fan-out unavailable: ${err instanceof Error ? err.message : String(err)}`);
337
+ }
338
+ }
236
339
  // Bind MJStorage as the conversation-attachment blob store. The attachment service itself no longer
237
340
  // imports `@memberjunction/storage` — that dependency made it unusable from any browser or React
238
341
  // Native client, which is why the same attachment rules had been reimplemented three times.
@@ -273,28 +376,39 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
273
376
  startupLog.BeginPhase('Connecting to database');
274
377
  startupLog.LogIf('verbose', 'Database type: PostgreSQL');
275
378
  const pg = await import('pg');
276
- const { PostgreSQLDataProvider, PostgreSQLProviderConfigData } = await import('@memberjunction/postgresql-dataprovider');
277
- const pgHost = process.env.PG_HOST || process.env.DB_HOST || 'localhost';
278
- const pgPort = parseInt(process.env.PG_PORT || process.env.DB_PORT || '5432', 10);
279
- const pgUser = process.env.PG_USERNAME || process.env.DB_USERNAME || 'postgres';
280
- const pgPass = process.env.PG_PASSWORD || process.env.DB_PASSWORD || '';
281
- const pgDatabase = process.env.PG_DATABASE || process.env.DB_DATABASE || '';
282
- const pgPool = new pg.default.Pool({
283
- host: pgHost,
284
- port: pgPort,
285
- user: pgUser,
286
- password: pgPass,
287
- database: pgDatabase,
288
- max: configInfo.databaseSettings.connectionPool?.max ?? 50,
289
- min: configInfo.databaseSettings.connectionPool?.min ?? 5,
290
- idleTimeoutMillis: configInfo.databaseSettings.connectionPool?.idleTimeoutMillis ?? 30000,
291
- connectionTimeoutMillis: configInfo.databaseSettings.connectionPool?.acquireTimeoutMillis ?? 30000,
292
- });
379
+ const { PostgreSQLDataProvider, PostgreSQLProviderConfigData, MJPostgresTypes } = await import('@memberjunction/postgresql-dataprovider');
380
+ const pgEndpoint = ResolvePostgreSQLEndpoint();
381
+ const { Host: pgHost, Port: pgPort, User: pgUser, Database: pgDatabase } = pgEndpoint;
382
+ // Every API pool carries the statement and idle-in-transaction timeouts from connection #1.
383
+ const pgConnectionConfig = BuildPostgreSQLConnectionConfig(pgEndpoint, configInfo.databaseSettings, 'api');
384
+ const pgPool = new pg.default.Pool(ToPGPoolConfig(pgConnectionConfig));
293
385
  // Verify connection
294
386
  const testClient = await pgPool.connect();
295
387
  await testClient.query('SELECT 1');
296
388
  testClient.release();
297
389
  startupLog.LogIf('verbose', `PostgreSQL pool connected to ${pgHost}:${pgPort}/${pgDatabase}`);
390
+ // A read-only pool opened with the read-only login, as SQL Server has. Read-only per-request
391
+ // providers (TestQuerySQL and other caller-supplied SQL) share it instead of the primary pool.
392
+ const pgReadOnlyCredentials = ResolvePostgreSQLReadOnlyCredentials(configInfo);
393
+ if (pgReadOnlyCredentials) {
394
+ // A pool a provider runs on must carry the provider's type parsers, so BIGINT and NUMERIC
395
+ // come back as numbers here as they do on the provider's own pool.
396
+ const readOnlyPgPool = new pg.default.Pool({
397
+ ...ToPGPoolConfig(BuildPostgreSQLConnectionConfig({ ...pgEndpoint, ...pgReadOnlyCredentials }, configInfo.databaseSettings, 'read-only')),
398
+ types: MJPostgresTypes,
399
+ });
400
+ const readOnlyTestClient = await readOnlyPgPool.connect();
401
+ try {
402
+ for (const warning of await DescribeReadOnlyLoginOverreach(readOnlyTestClient, mj_core_schema)) {
403
+ LogStatus(`WARNING: ${warning}`);
404
+ }
405
+ }
406
+ finally {
407
+ readOnlyTestClient.release();
408
+ }
409
+ PostgreSQLReadOnlyPool.Instance.Pool = readOnlyPgPool;
410
+ startupLog.LogIf('verbose', 'Read-only PostgreSQL pool has been initialized.');
411
+ }
298
412
  // Create a DataSourceInfo with a MSSQL-compatible wrapper around pg.Pool
299
413
  // This allows existing code (types, util, context) to work without changes
300
414
  const mssqlCompatPool = createMSSQLCompatPool(pgPool);
@@ -307,15 +421,6 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
307
421
  userName: pgUser,
308
422
  }));
309
423
  // Set up the PostgreSQL provider
310
- const pgConnectionConfig = {
311
- Host: pgHost,
312
- Port: pgPort,
313
- Database: pgDatabase,
314
- User: pgUser,
315
- Password: pgPass,
316
- MaxConnections: configInfo.databaseSettings.connectionPool?.max ?? 50,
317
- MinConnections: configInfo.databaseSettings.connectionPool?.min ?? 5,
318
- };
319
424
  const pgConfigData = new PostgreSQLProviderConfigData(pgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
320
425
  const provider = new PostgreSQLDataProvider();
321
426
  await provider.Config(pgConfigData);
@@ -339,7 +444,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
339
444
  if (poolAny._pgPool) {
340
445
  const thePgPool = poolAny._pgPool;
341
446
  // Translate SQL Server bracket syntax to PostgreSQL double-quote syntax
342
- const pgQuery = translateBracketsToPG(query);
447
+ const pgQuery = TranslateBracketsToPG(query);
343
448
  const result = await thePgPool.query(pgQuery);
344
449
  return result.rows;
345
450
  }
@@ -357,19 +462,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
357
462
  const pgCodegenPass = process.env.CODEGEN_DB_PASSWORD;
358
463
  if (pgCodegenUser && pgCodegenPass) {
359
464
  try {
360
- const codegenPgPool = new pg.default.Pool({
361
- host: pgHost,
362
- port: pgPort,
363
- user: pgCodegenUser,
364
- password: pgCodegenPass,
365
- database: pgDatabase,
366
- max: 10,
367
- });
465
+ // CodeGen and DDL work runs long statements across every entity, so this pool gets the
466
+ // long CodeGen timeout rather than the API one, as the SQL Server CodeGen pool does.
467
+ const codegenPgConnectionConfig = BuildPostgreSQLConnectionConfig({ ...pgEndpoint, User: pgCodegenUser, Password: pgCodegenPass }, configInfo.databaseSettings, 'codegen');
468
+ const codegenPgPool = new pg.default.Pool(ToPGPoolConfig(codegenPgConnectionConfig));
368
469
  const codegenTestClient = await codegenPgPool.connect();
369
470
  await codegenTestClient.query('SELECT 1');
370
471
  codegenTestClient.release();
371
472
  const { RuntimeSchemaManager } = await import('@memberjunction/schema-engine');
372
- const codegenPgConfigData = new PostgreSQLProviderConfigData({ Host: pgHost, Port: pgPort, Database: pgDatabase, User: pgCodegenUser, Password: pgCodegenPass }, mj_core_schema, cacheRefreshInterval / 1000);
473
+ const codegenPgConfigData = new PostgreSQLProviderConfigData(codegenPgConnectionConfig, mj_core_schema, cacheRefreshInterval / 1000);
373
474
  const codegenPgProvider = new PostgreSQLDataProvider();
374
475
  await codegenPgProvider.Config(codegenPgConfigData); // separate pool (per-instance manager); does NOT touch the global API provider
375
476
  RuntimeSchemaManager.Instance.SetDDLProvider(codegenPgProvider);
@@ -605,6 +706,15 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
605
706
  });
606
707
  }
607
708
  });
709
+ // Fan push-status updates across server instances (MJ #4222).
710
+ //
711
+ // Behind a load balancer the browser's WebSocket lives on one replica while the mutation that
712
+ // drives the agent can be handled by another. The push topic is an in-process PubSub, so a
713
+ // completion published on replica B never reaches a subscriber on replica A — the browser waits
714
+ // forever for an event that was delivered to nobody. Replicating progress and completion over
715
+ // Redis closes that, and the durable tail query remains the backstop if Redis is down.
716
+ await wirePushStatusFanOut(redisProvider, startupLog);
717
+ await wireHandoffOfferFanOut(redisProvider, startupLog);
608
718
  startupLog.LogIf('verbose', `Redis cache provider connected: ${process.env.REDIS_URL}`);
609
719
  }
610
720
  // If Redis is available, swap LocalCacheManager's storage provider to Redis.
@@ -909,6 +1019,14 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
909
1019
  socket.destroy();
910
1020
  }
911
1021
  });
1022
+ // graphql-ws's ws integration takes its keepalive as a THIRD POSITIONAL argument to useServer,
1023
+ // defaulting to 12_000 when omitted. That default was doing real work here while being invisible
1024
+ // at the call site: the server pings every 12s and terminates the socket after an unanswered
1025
+ // pong, which is why MJAPI notices a half-open link in ~12-24s while the browser — whose
1026
+ // graphql-ws client does nothing on an unanswered pong — noticed nothing at all (MJ #4222).
1027
+ // Stated explicitly so the behaviour is visible and tunable, and so the next reader does not
1028
+ // conclude from the call site that no server-side heartbeat exists. Value unchanged.
1029
+ const WS_SERVER_KEEPALIVE_MS = 12_000;
912
1030
  // Track per-connection expiry timers so we can clean them up on close
913
1031
  const expiryTimers = new WeakMap();
914
1032
  const serverCleanup = useServer({
@@ -979,7 +1097,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
979
1097
  // so all errors here are genuine and worth logging.
980
1098
  console.error('WebSocket error:', errors);
981
1099
  },
982
- }, webSocketServer);
1100
+ }, webSocketServer, WS_SERVER_KEEPALIVE_MS);
983
1101
  const apolloServer = buildApolloServer({ schema }, { httpServer, serverCleanup }, mwApolloPlugins.length > 0 ? mwApolloPlugins : undefined);
984
1102
  await apolloServer.start();
985
1103
  // Fix #8: Add compression for better throughput performance
@@ -1093,13 +1211,22 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1093
1211
  // Backwards-compatibility shim: synthesize ServerExtensionConfig entries from legacy configInfo.telephony
1094
1212
  const telephonyExtensionConfigs = [];
1095
1213
  if (configInfo.telephony?.enabled) {
1214
+ // Settings every carrier shares (inbound run-as user, call cap, outbound policy). Each carrier's own block is
1215
+ // spread AFTER them, so a carrier can override one explicitly.
1216
+ const sharedTelephonySettings = {
1217
+ inboundRunAsUserEmail: configInfo.telephony.inboundRunAsUserEmail,
1218
+ maxCallSeconds: configInfo.telephony.maxCallSeconds,
1219
+ maxConcurrentCalls: configInfo.telephony.maxConcurrentCalls,
1220
+ transferTargets: configInfo.telephony.transferTargets,
1221
+ outbound: configInfo.telephony.outbound,
1222
+ };
1096
1223
  if (configInfo.telephony.twilio) {
1097
1224
  telephonyExtensionConfigs.push({
1098
1225
  Enabled: true,
1099
1226
  DriverClass: 'TwilioTelephonyExtension',
1100
1227
  RootPath: '/telephony/twilio',
1101
1228
  Phase: 'pre-auth',
1102
- Settings: configInfo.telephony.twilio,
1229
+ Settings: { ...sharedTelephonySettings, ...configInfo.telephony.twilio },
1103
1230
  });
1104
1231
  }
1105
1232
  if (configInfo.telephony.vonage) {
@@ -1108,7 +1235,7 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1108
1235
  DriverClass: 'VonageTelephonyExtension',
1109
1236
  RootPath: '/telephony/vonage',
1110
1237
  Phase: 'pre-auth',
1111
- Settings: configInfo.telephony.vonage,
1238
+ Settings: { ...sharedTelephonySettings, ...configInfo.telephony.vonage },
1112
1239
  });
1113
1240
  }
1114
1241
  if (configInfo.telephony.ringcentral) {
@@ -1117,7 +1244,16 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1117
1244
  DriverClass: 'RingCentralTelephonyExtension',
1118
1245
  RootPath: '/telephony/ringcentral',
1119
1246
  Phase: 'pre-auth',
1120
- Settings: configInfo.telephony.ringcentral,
1247
+ Settings: { ...sharedTelephonySettings, ...configInfo.telephony.ringcentral },
1248
+ });
1249
+ }
1250
+ if (configInfo.telephony.livekitSip) {
1251
+ telephonyExtensionConfigs.push({
1252
+ Enabled: true,
1253
+ DriverClass: 'LiveKitSipExtension',
1254
+ RootPath: '/telephony/livekit-sip',
1255
+ Phase: 'pre-auth',
1256
+ Settings: { ...sharedTelephonySettings, ...configInfo.telephony.livekitSip },
1121
1257
  });
1122
1258
  }
1123
1259
  if (configInfo.telephony.teams?.enabled) {
@@ -1351,8 +1487,23 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1351
1487
  // instance is still heart-beating. The watchdog also self-registers for graceful-shutdown
1352
1488
  // cancellation (via ShutdownRegistry) once it begins tracking this process's first live run.
1353
1489
  if (resumeUser && Metadata.Provider instanceof DatabaseProviderBase) { // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
1354
- AgentRunWatchdog.SweepOrphanedRuns(Metadata.Provider, resumeUser) // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
1490
+ const sweepUser = resumeUser;
1491
+ const sweepProvider = Metadata.Provider; // global-provider-ok: server startup recovery — one-shot orphaned-run sweep at boot
1492
+ AgentRunWatchdog.SweepOrphanedRuns(sweepProvider, sweepUser)
1355
1493
  .catch(err => console.warn(`[AgentRunWatchdog] Startup sweep failed: ${err}`));
1494
+ // The watchdog repairs the RUN; nothing repaired the conversation detail, which is the row the
1495
+ // chat actually renders from (MJ #4222). A process that dies mid-run leaves a terminal run
1496
+ // beside a message that still claims to be generating, and it spins forever for anyone who
1497
+ // opens it. Runs at boot (closes restart orphans) and on a timer (closes mid-life orphans),
1498
+ // mirroring the watchdog's own two-phase shape.
1499
+ const reconcileOrphans = () => ReconcileOrphanedConversationDetails(sweepProvider, sweepUser)
1500
+ .catch(err => console.warn(`[OrphanDetailReconciler] Pass failed: ${err}`));
1501
+ void reconcileOrphans();
1502
+ const orphanDetailTimer = setInterval(() => void reconcileOrphans(), ORPHAN_DETAIL_SWEEP_INTERVAL_MS);
1503
+ ShutdownRegistry.Instance.Register({
1504
+ ShutdownName: 'OrphanDetailReconciler',
1505
+ Shutdown: () => { clearInterval(orphanDetailTimer); },
1506
+ });
1356
1507
  }
1357
1508
  // Launch the AI Agent Session janitor: run own-host orphan recovery once at boot, then keep a
1358
1509
  // periodic staleness sweep running. Self-registers with ShutdownRegistry, so its timer is cleared
@@ -1392,6 +1543,17 @@ export const Serve = async (resolverPaths, app = CreateApp(), options) => {
1392
1543
  StartTaskGraphDispatcher(taskGraphPool, resumeUser)
1393
1544
  .catch(err => console.warn(`[TaskGraphDispatcher] Startup failed: ${err}`));
1394
1545
  }
1546
+ // Start the durable work-queue host where enabled. It plans which subscriptions this instance runs,
1547
+ // re-plans on a timer, and self-registers with ShutdownRegistry, so gracefulShutdown's awaited
1548
+ // ShutdownAll() drains it (up to 2 × shutdownDrainMs) before the HTTP server closes.
1549
+ // Not awaited: a slow engine load must not delay readiness, and a failure never stops the API.
1550
+ const workQueueProvider = Metadata.Provider; // global-provider-ok: server startup — the work-queue host runs on the server's own provider
1551
+ if (configInfo.workQueue?.enabled && workQueueProvider instanceof DatabaseProviderBase) {
1552
+ const workQueuePool = dataSources[0]?.dataSource;
1553
+ const providerSource = new MJServerWorkQueueProviderSource(workQueuePool instanceof sql.ConnectionPool ? workQueuePool : null, workQueueProvider);
1554
+ StartWorkQueueHost(configInfo.workQueue, workQueueProvider, providerSource)
1555
+ .catch(error => console.error('❌ Failed to start the work queue host:', error));
1556
+ }
1395
1557
  // Set up graceful shutdown handlers
1396
1558
  const gracefulShutdown = async (signal) => {
1397
1559
  console.log(`\n${signal} received, shutting down gracefully...`);
@@ -1835,12 +1997,4 @@ function createMSSQLCompatPool(pgPool) {
1835
1997
  };
1836
1998
  return wrapper;
1837
1999
  }
1838
- /**
1839
- * Translates SQL Server bracket-quoted identifiers to PostgreSQL double-quoted identifiers.
1840
- * Converts [schema].[table] to "schema"."table" and handles common T-SQL patterns.
1841
- */
1842
- function translateBracketsToPG(sql) {
1843
- // Replace [identifier] with "identifier"
1844
- return sql.replace(/\[([^\]]+)\]/g, '"$1"');
1845
- }
1846
2000
  //# sourceMappingURL=index.js.map