@memberjunction/server 5.51.0 → 6.1.0-edge.1

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 (147) hide show
  1. package/LICENSE +7 -0
  2. package/dist/agentSessions/SessionManager.d.ts +22 -1
  3. package/dist/agentSessions/SessionManager.d.ts.map +1 -1
  4. package/dist/agentSessions/SessionManager.js +13 -3
  5. package/dist/agentSessions/SessionManager.js.map +1 -1
  6. package/dist/auth/actingContextResolver.d.ts +44 -0
  7. package/dist/auth/actingContextResolver.d.ts.map +1 -0
  8. package/dist/auth/actingContextResolver.js +18 -0
  9. package/dist/auth/actingContextResolver.js.map +1 -0
  10. package/dist/auth/index.d.ts +1 -0
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/auth/index.js +1 -0
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/auth/sessionUserClone.d.ts +32 -0
  15. package/dist/auth/sessionUserClone.d.ts.map +1 -0
  16. package/dist/auth/sessionUserClone.js +50 -0
  17. package/dist/auth/sessionUserClone.js.map +1 -0
  18. package/dist/context.d.ts +1 -1
  19. package/dist/context.d.ts.map +1 -1
  20. package/dist/context.js +43 -6
  21. package/dist/context.js.map +1 -1
  22. package/dist/generated/generated.d.ts +234 -642
  23. package/dist/generated/generated.d.ts.map +1 -1
  24. package/dist/generated/generated.js +1277 -3755
  25. package/dist/generated/generated.js.map +1 -1
  26. package/dist/generic/FireAndForgetHeartbeat.d.ts +5 -0
  27. package/dist/generic/FireAndForgetHeartbeat.d.ts.map +1 -1
  28. package/dist/generic/FireAndForgetHeartbeat.js +5 -4
  29. package/dist/generic/FireAndForgetHeartbeat.js.map +1 -1
  30. package/dist/generic/PushStatusResolver.d.ts +58 -0
  31. package/dist/generic/PushStatusResolver.d.ts.map +1 -1
  32. package/dist/generic/PushStatusResolver.js +42 -3
  33. package/dist/generic/PushStatusResolver.js.map +1 -1
  34. package/dist/generic/ResolverBase.d.ts +9 -0
  35. package/dist/generic/ResolverBase.d.ts.map +1 -1
  36. package/dist/generic/ResolverBase.js +31 -13
  37. package/dist/generic/ResolverBase.js.map +1 -1
  38. package/dist/index.d.ts +7 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +20 -4
  41. package/dist/index.js.map +1 -1
  42. package/dist/multiTenancy/index.d.ts +19 -0
  43. package/dist/multiTenancy/index.d.ts.map +1 -1
  44. package/dist/multiTenancy/index.js +82 -5
  45. package/dist/multiTenancy/index.js.map +1 -1
  46. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  47. package/dist/resolvers/ActionResolver.js +12 -5
  48. package/dist/resolvers/ActionResolver.js.map +1 -1
  49. package/dist/resolvers/MCPResolver.d.ts.map +1 -1
  50. package/dist/resolvers/MCPResolver.js +13 -16
  51. package/dist/resolvers/MCPResolver.js.map +1 -1
  52. package/dist/resolvers/RealtimeClientSessionResolver.d.ts +1 -1
  53. package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
  54. package/dist/resolvers/RealtimeClientSessionResolver.js +15 -14
  55. package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
  56. package/dist/resolvers/RemoteBrowserActionResolver.d.ts.map +1 -1
  57. package/dist/resolvers/RemoteBrowserActionResolver.js +19 -26
  58. package/dist/resolvers/RemoteBrowserActionResolver.js.map +1 -1
  59. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  60. package/dist/resolvers/RunAIAgentResolver.js +30 -40
  61. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  62. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  63. package/dist/resolvers/RunTestResolver.js +90 -112
  64. package/dist/resolvers/RunTestResolver.js.map +1 -1
  65. package/dist/resolvers/SearchKnowledgeResolver.js +3 -3
  66. package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
  67. package/dist/resolvers/SearchKnowledgeStreamResolver.js +2 -2
  68. package/dist/resolvers/SearchKnowledgeStreamResolver.js.map +1 -1
  69. package/dist/resolvers/TaskGraphFrameResolver.d.ts +85 -0
  70. package/dist/resolvers/TaskGraphFrameResolver.d.ts.map +1 -0
  71. package/dist/resolvers/TaskGraphFrameResolver.js +163 -0
  72. package/dist/resolvers/TaskGraphFrameResolver.js.map +1 -0
  73. package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -1
  74. package/dist/resolvers/VersionHistoryResolver.js +8 -12
  75. package/dist/resolvers/VersionHistoryResolver.js.map +1 -1
  76. package/dist/rest/RESTEndpointHandler.d.ts +0 -4
  77. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  78. package/dist/rest/RESTEndpointHandler.js +1 -15
  79. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  80. package/dist/services/StartTaskGraphDispatcher.d.ts +33 -0
  81. package/dist/services/StartTaskGraphDispatcher.d.ts.map +1 -0
  82. package/dist/services/StartTaskGraphDispatcher.js +31 -0
  83. package/dist/services/StartTaskGraphDispatcher.js.map +1 -0
  84. package/dist/services/TaskGraphAgentRunner.d.ts +15 -0
  85. package/dist/services/TaskGraphAgentRunner.d.ts.map +1 -0
  86. package/dist/services/TaskGraphAgentRunner.js +74 -0
  87. package/dist/services/TaskGraphAgentRunner.js.map +1 -0
  88. package/dist/services/TaskGraphContinuationDeliverer.d.ts +70 -0
  89. package/dist/services/TaskGraphContinuationDeliverer.d.ts.map +1 -0
  90. package/dist/services/TaskGraphContinuationDeliverer.js +162 -0
  91. package/dist/services/TaskGraphContinuationDeliverer.js.map +1 -0
  92. package/dist/services/TaskGraphProviderFactory.d.ts +39 -0
  93. package/dist/services/TaskGraphProviderFactory.d.ts.map +1 -0
  94. package/dist/services/TaskGraphProviderFactory.js +28 -0
  95. package/dist/services/TaskGraphProviderFactory.js.map +1 -0
  96. package/package.json +103 -100
  97. package/src/__tests__/RealtimeBridgeResolver.test.ts +6 -0
  98. package/src/__tests__/SessionManager.test.ts +44 -0
  99. package/src/__tests__/TaskGraphContinuationDeliverer.test.ts +249 -0
  100. package/src/__tests__/TaskGraphFrameResolver.test.ts +136 -0
  101. package/src/__tests__/multiTenancy.security.test.ts +254 -22
  102. package/src/__tests__/multiTenancy.test.ts +22 -0
  103. package/src/__tests__/pushStatusResolver.filter.test.ts +56 -0
  104. package/src/__tests__/resolverBase.rls.test.ts +4 -0
  105. package/src/__tests__/search-knowledge-tags.test.ts +74 -6
  106. package/src/__tests__/sessionUserClone.test.ts +161 -0
  107. package/src/agentSessions/SessionManager.ts +26 -2
  108. package/src/auth/actingContextResolver.ts +56 -0
  109. package/src/auth/index.ts +1 -0
  110. package/src/auth/sessionUserClone.ts +50 -0
  111. package/src/context.ts +48 -6
  112. package/src/generated/generated.ts +899 -2555
  113. package/src/generic/FireAndForgetHeartbeat.ts +10 -4
  114. package/src/generic/PushStatusResolver.ts +79 -4
  115. package/src/generic/ResolverBase.ts +33 -13
  116. package/src/index.ts +21 -4
  117. package/src/multiTenancy/index.ts +92 -5
  118. package/src/resolvers/ActionResolver.ts +15 -7
  119. package/src/resolvers/MCPResolver.ts +13 -15
  120. package/src/resolvers/RealtimeClientSessionResolver.ts +15 -13
  121. package/src/resolvers/RemoteBrowserActionResolver.ts +19 -25
  122. package/src/resolvers/RunAIAgentResolver.ts +30 -40
  123. package/src/resolvers/RunTestResolver.ts +90 -112
  124. package/src/resolvers/SearchKnowledgeResolver.ts +3 -3
  125. package/src/resolvers/SearchKnowledgeStreamResolver.ts +2 -2
  126. package/src/resolvers/TaskGraphFrameResolver.ts +160 -0
  127. package/src/resolvers/VersionHistoryResolver.ts +10 -13
  128. package/src/rest/RESTEndpointHandler.ts +1 -15
  129. package/src/services/StartTaskGraphDispatcher.ts +61 -0
  130. package/src/services/TaskGraphAgentRunner.ts +81 -0
  131. package/src/services/TaskGraphContinuationDeliverer.ts +181 -0
  132. package/src/services/TaskGraphProviderFactory.ts +53 -0
  133. package/dist/resolvers/ReportResolver.d.ts +0 -24
  134. package/dist/resolvers/ReportResolver.d.ts.map +0 -1
  135. package/dist/resolvers/ReportResolver.js +0 -190
  136. package/dist/resolvers/ReportResolver.js.map +0 -1
  137. package/dist/resolvers/TaskResolver.d.ts +0 -31
  138. package/dist/resolvers/TaskResolver.d.ts.map +0 -1
  139. package/dist/resolvers/TaskResolver.js +0 -157
  140. package/dist/resolvers/TaskResolver.js.map +0 -1
  141. package/dist/services/TaskOrchestrator.d.ts +0 -130
  142. package/dist/services/TaskOrchestrator.d.ts.map +0 -1
  143. package/dist/services/TaskOrchestrator.js +0 -690
  144. package/dist/services/TaskOrchestrator.js.map +0 -1
  145. package/src/resolvers/ReportResolver.ts +0 -157
  146. package/src/resolvers/TaskResolver.ts +0 -148
  147. package/src/services/TaskOrchestrator.ts +0 -873
@@ -349,8 +349,13 @@ export class UploadRealtimeRecordingResult {
349
349
  */
350
350
  @Resolver()
351
351
  export class RealtimeClientSessionResolver extends ResolverBase {
352
- private readonly sessionManager = new SessionManager();
352
+ // Declaration order matters: `clientSessionService` must be initialized before `sessionManager`
353
+ // reads it, so `SessionManager.CloseSession` finalizes co-agent observability runs (see
354
+ // `finalizeObservabilityRuns`) through the SAME `RealtimeClientSessionService` instance that
355
+ // `AppendPromptRunMessage`/`AccumulatePromptRunUsage` (below) accumulated per-run write-chain
356
+ // state on — otherwise that cleanup silently no-ops on a freshly-constructed instance.
353
357
  private readonly clientSessionService = new RealtimeClientSessionService();
358
+ private readonly sessionManager = new SessionManager(this.clientSessionService);
354
359
 
355
360
  /**
356
361
  * Start a client-direct realtime voice session targeting `targetAgentId`.
@@ -558,18 +563,15 @@ export class RealtimeClientSessionResolver extends ResolverBase {
558
563
  if (!SIGNIFICANT_PROGRESS_STEPS.includes(progress.step)) {
559
564
  return;
560
565
  }
561
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
562
- message: JSON.stringify({
563
- resolver: 'RealtimeClientSessionResolver',
564
- type: 'RealtimeDelegationProgress',
565
- agentSessionID,
566
- callID,
567
- step: progress.step,
568
- message: progress.message,
569
- percentage: progress.percentage,
570
- }),
571
- sessionId: userPayload.sessionId,
572
- });
566
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
567
+ resolver: 'RealtimeClientSessionResolver',
568
+ type: 'RealtimeDelegationProgress',
569
+ agentSessionID,
570
+ callID,
571
+ step: progress.step,
572
+ message: progress.message,
573
+ percentage: progress.percentage,
574
+ }), userPayload);
573
575
  };
574
576
  }
575
577
 
@@ -750,18 +750,15 @@ export class RemoteBrowserActionResolver extends ResolverBase {
750
750
  agentSessionID: string,
751
751
  frame: { DataBase64: string; Width: number; Height: number; SequenceNumber: number },
752
752
  ): void {
753
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
754
- message: JSON.stringify({
755
- resolver: 'RemoteBrowserActionResolver',
756
- type: 'RemoteBrowserScreencastFrame',
757
- agentSessionID,
758
- dataBase64: frame.DataBase64,
759
- width: frame.Width,
760
- height: frame.Height,
761
- seq: frame.SequenceNumber,
762
- }),
763
- sessionId: userPayload.sessionId,
764
- });
753
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
754
+ resolver: 'RemoteBrowserActionResolver',
755
+ type: 'RemoteBrowserScreencastFrame',
756
+ agentSessionID,
757
+ dataBase64: frame.DataBase64,
758
+ width: frame.Width,
759
+ height: frame.Height,
760
+ seq: frame.SequenceNumber,
761
+ }), userPayload);
765
762
  }
766
763
 
767
764
  /**
@@ -775,19 +772,16 @@ export class RemoteBrowserActionResolver extends ResolverBase {
775
772
  * @param chunk The encoded audio chunk.
776
773
  */
777
774
  private publishAudioChunk(pubSub: PubSubEngine, userPayload: UserPayload, agentSessionID: string, chunk: RemoteBrowserAudioChunk): void {
778
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
779
- message: JSON.stringify({
780
- resolver: 'RemoteBrowserActionResolver',
781
- type: 'RemoteBrowserAudioChunk',
782
- agentSessionID,
783
- dataBase64: chunk.DataBase64,
784
- codec: chunk.Codec,
785
- sampleRate: chunk.SampleRate,
786
- channels: chunk.Channels,
787
- seq: chunk.SequenceNumber,
788
- }),
789
- sessionId: userPayload.sessionId,
790
- });
775
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
776
+ resolver: 'RemoteBrowserActionResolver',
777
+ type: 'RemoteBrowserAudioChunk',
778
+ agentSessionID,
779
+ dataBase64: chunk.DataBase64,
780
+ codec: chunk.Codec,
781
+ sampleRate: chunk.SampleRate,
782
+ channels: chunk.Channels,
783
+ seq: chunk.SequenceNumber,
784
+ }), userPayload);
791
785
  }
792
786
 
793
787
  /**
@@ -8,7 +8,6 @@ import { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended, ExecuteAgentResult
8
8
  import { AIEngine } from '@memberjunction/aiengine';
9
9
  import { ChatMessage, ChatMessageContent } from '@memberjunction/ai';
10
10
  import { ResolverBase } from '../generic/ResolverBase.js';
11
- import { PUSH_STATUS_UPDATES_TOPIC } from '../generic/PushStatusResolver.js';
12
11
  import { startLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
13
12
  import { RequireSystemUser } from '../directives/RequireSystemUser.js';
14
13
  import { GetReadWriteProvider } from '../util.js';
@@ -306,28 +305,22 @@ export class RunAIAgentResolver extends ResolverBase {
306
305
  }
307
306
 
308
307
  private PublishProgressUpdate(pubSub: PubSubEngine, data: any, userPayload: UserPayload) {
309
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
310
- message: JSON.stringify({
311
- resolver: 'RunAIAgentResolver',
312
- type: 'ExecutionProgress',
313
- status: 'ok',
314
- data,
315
- }),
316
- sessionId: userPayload.sessionId,
317
- });
308
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
309
+ resolver: 'RunAIAgentResolver',
310
+ type: 'ExecutionProgress',
311
+ status: 'ok',
312
+ data,
313
+ }), userPayload);
318
314
  }
319
315
 
320
316
 
321
317
  private PublishStreamingUpdate(pubSub: PubSubEngine, data: any, userPayload: UserPayload) {
322
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
323
- message: JSON.stringify({
324
- resolver: 'RunAIAgentResolver',
325
- type: 'StreamingContent',
326
- status: 'ok',
327
- data,
328
- }),
329
- sessionId: userPayload.sessionId,
330
- });
318
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
319
+ resolver: 'RunAIAgentResolver',
320
+ type: 'StreamingContent',
321
+ status: 'ok',
322
+ data,
323
+ }), userPayload);
331
324
  }
332
325
 
333
326
  /**
@@ -814,17 +807,15 @@ export class RunAIAgentResolver extends ResolverBase {
814
807
  LogStatus(`📬 Notification sent via ${channelList} (ID: ${result.inAppNotificationId})`);
815
808
 
816
809
  // Publish real-time notification event so client updates immediately
817
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
818
- userPayload: JSON.stringify(userPayload),
819
- message: JSON.stringify({
820
- type: 'notification',
821
- notificationId: result.inAppNotificationId,
822
- action: 'create',
823
- title: `${agentName} completed your request`,
824
- message: message,
825
- conversationId: conversationId
826
- })
827
- });
810
+ // NOTE (B49): normalized from a malformed no-sessionId payload
811
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
812
+ type: 'notification',
813
+ notificationId: result.inAppNotificationId,
814
+ action: 'create',
815
+ title: `${agentName} completed your request`,
816
+ message: message,
817
+ conversationId: conversationId
818
+ }), userPayload);
828
819
 
829
820
  LogStatus(`📡 Published notification event to client`);
830
821
  } else if (!result.success) {
@@ -926,16 +917,14 @@ export class RunAIAgentResolver extends ResolverBase {
926
917
  LogStatus(`📬 Feedback request notification sent (ID: ${notifResult.inAppNotificationId})`);
927
918
 
928
919
  // Publish real-time notification event
929
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
930
- userPayload: JSON.stringify(userPayload),
931
- message: JSON.stringify({
932
- type: 'notification',
933
- notificationId: notifResult.inAppNotificationId,
934
- action: 'create',
935
- title: `${agentName} needs your input`,
936
- message: truncatedMessage
937
- })
938
- });
920
+ // NOTE (B49): normalized from a malformed no-sessionId payload
921
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
922
+ type: 'notification',
923
+ notificationId: notifResult.inAppNotificationId,
924
+ action: 'create',
925
+ title: `${agentName} needs your input`,
926
+ message: truncatedMessage
927
+ }), userPayload);
939
928
  } else if (!notifResult.success) {
940
929
  LogError(`Feedback request notification failed: ${notifResult.errors?.join(', ')}`);
941
930
  }
@@ -1294,6 +1283,7 @@ export class RunAIAgentResolver extends ResolverBase {
1294
1283
  const pulse = startLivenessPulse({
1295
1284
  pubSub,
1296
1285
  sessionId,
1286
+ ownerUserId: userPayload.userRecord.ID,
1297
1287
  resolver: 'RunAIAgentResolver',
1298
1288
  readStatus: () => runRef.current
1299
1289
  ? { runId: runRef.current.ID, status: runRef.current.Status }
@@ -15,7 +15,6 @@ import { AppContext, UserPayload } from '../types.js';
15
15
  import { LogError, LogStatus, UserInfo } from '@memberjunction/core';
16
16
  import { TestEngine } from '@memberjunction/testing-engine';
17
17
  import { ResolverBase } from '../generic/ResolverBase.js';
18
- import { PUSH_STATUS_UPDATES_TOPIC } from '../generic/PushStatusResolver.js';
19
18
  import { startLivenessPulse } from '../generic/FireAndForgetHeartbeat.js';
20
19
  import { TestRunVariables, TestLogMessage, TestRunResult as EngineTestRunResult } from '@memberjunction/testing-engine-base';
21
20
 
@@ -257,7 +256,7 @@ export class RunTestResolver extends ResolverBase {
257
256
  ): void {
258
257
  // Keep-alive pulse so a long-running test never trips the client idle timeout.
259
258
  // The client captures the testRunId from progress events for reconciliation.
260
- const pulse = startLivenessPulse({ pubSub, sessionId: userPayload.sessionId, resolver: 'RunTestResolver' });
259
+ const pulse = startLivenessPulse({ pubSub, sessionId: userPayload.sessionId, ownerUserId: userPayload.userRecord.ID, resolver: 'RunTestResolver' });
261
260
 
262
261
  this.executeTest(testId, verbose, environment, tags, variables, pubSub, userPayload, user)
263
262
  .catch((error: unknown) => {
@@ -353,7 +352,7 @@ export class RunTestResolver extends ResolverBase {
353
352
  // (Suite reconciliation isn't wired: suite progress carries the per-test run id, not the
354
353
  // Test Suite Run id, so the client has no handle to reconcile against — the pulse is the
355
354
  // protection here.)
356
- const pulse = startLivenessPulse({ pubSub, sessionId: userPayload.sessionId, resolver: 'RunTestResolver' });
355
+ const pulse = startLivenessPulse({ pubSub, sessionId: userPayload.sessionId, ownerUserId: userPayload.userRecord.ID, resolver: 'RunTestResolver' });
357
356
 
358
357
  this.executeSuite(
359
358
  suiteId, verbose, environment, parallel, tags, variables,
@@ -494,51 +493,42 @@ export class RunTestResolver extends ResolverBase {
494
493
  // ===== PubSub Publishing =====
495
494
 
496
495
  private publishProgress(pubSub: PubSubEngine, data: TestExecutionStreamMessage, userPayload: UserPayload) {
497
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
498
- message: JSON.stringify({
499
- resolver: 'RunTestResolver',
500
- type: 'TestExecutionProgress',
501
- status: 'ok',
502
- data,
503
- }),
504
- sessionId: userPayload.sessionId,
505
- });
496
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
497
+ resolver: 'RunTestResolver',
498
+ type: 'TestExecutionProgress',
499
+ status: 'ok',
500
+ data,
501
+ }), userPayload);
506
502
  }
507
503
 
508
504
  private publishComplete(pubSub: PubSubEngine, userPayload: UserPayload, result: EngineTestRunResult) {
509
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
510
- message: JSON.stringify({
511
- resolver: 'RunTestResolver',
512
- type: 'TestExecutionComplete',
513
- status: 'ok',
514
- data: {
515
- sessionId: userPayload.sessionId,
516
- testRunId: result.testRunId,
517
- type: 'complete',
518
- result: JSON.stringify(result),
519
- timestamp: new Date()
520
- },
521
- }),
522
- sessionId: userPayload.sessionId,
523
- });
505
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
506
+ resolver: 'RunTestResolver',
507
+ type: 'TestExecutionComplete',
508
+ status: 'ok',
509
+ data: {
510
+ sessionId: userPayload.sessionId,
511
+ testRunId: result.testRunId,
512
+ type: 'complete',
513
+ result: JSON.stringify(result),
514
+ timestamp: new Date()
515
+ },
516
+ }), userPayload);
524
517
  }
525
518
 
526
519
  private publishError(pubSub: PubSubEngine, userPayload: UserPayload, testId: string, errorMsg: string) {
527
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
528
- message: JSON.stringify({
529
- resolver: 'RunTestResolver',
530
- type: 'TestExecutionError',
531
- status: 'error',
532
- data: {
533
- sessionId: userPayload.sessionId,
534
- testRunId: testId,
535
- type: 'error',
536
- errorMessage: errorMsg,
537
- timestamp: new Date()
538
- },
539
- }),
540
- sessionId: userPayload.sessionId,
541
- });
520
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
521
+ resolver: 'RunTestResolver',
522
+ type: 'TestExecutionError',
523
+ status: 'error',
524
+ data: {
525
+ sessionId: userPayload.sessionId,
526
+ testRunId: testId,
527
+ type: 'error',
528
+ errorMessage: errorMsg,
529
+ timestamp: new Date()
530
+ },
531
+ }), userPayload);
542
532
  }
543
533
 
544
534
  /**
@@ -551,24 +541,21 @@ export class RunTestResolver extends ResolverBase {
551
541
  testId: string,
552
542
  testRunResult: TestRunResult
553
543
  ) {
554
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
555
- message: JSON.stringify({
556
- resolver: 'RunTestResolver',
557
- type: 'FireAndForgetComplete',
558
- status: 'ok',
559
- data: {
560
- sessionId: userPayload.sessionId,
561
- testId,
562
- type: 'complete',
563
- success: testRunResult.success,
564
- errorMessage: testRunResult.errorMessage,
565
- executionTimeMs: testRunResult.executionTimeMs,
566
- result: testRunResult.result,
567
- timestamp: new Date()
568
- },
569
- }),
570
- sessionId: userPayload.sessionId,
571
- });
544
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
545
+ resolver: 'RunTestResolver',
546
+ type: 'FireAndForgetComplete',
547
+ status: 'ok',
548
+ data: {
549
+ sessionId: userPayload.sessionId,
550
+ testId,
551
+ type: 'complete',
552
+ success: testRunResult.success,
553
+ errorMessage: testRunResult.errorMessage,
554
+ executionTimeMs: testRunResult.executionTimeMs,
555
+ result: testRunResult.result,
556
+ timestamp: new Date()
557
+ },
558
+ }), userPayload);
572
559
  }
573
560
 
574
561
  /**
@@ -580,23 +567,20 @@ export class RunTestResolver extends ResolverBase {
580
567
  testId: string,
581
568
  errorMessage: string
582
569
  ) {
583
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
584
- message: JSON.stringify({
585
- resolver: 'RunTestResolver',
586
- type: 'FireAndForgetComplete',
587
- status: 'ok',
588
- data: {
589
- sessionId: userPayload.sessionId,
590
- testId,
591
- type: 'complete',
592
- success: false,
593
- errorMessage,
594
- result: JSON.stringify({ success: false, errorMessage }),
595
- timestamp: new Date()
596
- },
597
- }),
598
- sessionId: userPayload.sessionId,
599
- });
570
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
571
+ resolver: 'RunTestResolver',
572
+ type: 'FireAndForgetComplete',
573
+ status: 'ok',
574
+ data: {
575
+ sessionId: userPayload.sessionId,
576
+ testId,
577
+ type: 'complete',
578
+ success: false,
579
+ errorMessage,
580
+ result: JSON.stringify({ success: false, errorMessage }),
581
+ timestamp: new Date()
582
+ },
583
+ }), userPayload);
600
584
  }
601
585
 
602
586
  /**
@@ -609,24 +593,21 @@ export class RunTestResolver extends ResolverBase {
609
593
  suiteId: string,
610
594
  suiteRunResult: TestSuiteRunResult
611
595
  ) {
612
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
613
- message: JSON.stringify({
614
- resolver: 'RunTestResolver',
615
- type: 'FireAndForgetSuiteComplete',
616
- status: 'ok',
617
- data: {
618
- sessionId: userPayload.sessionId,
619
- suiteId,
620
- type: 'complete',
621
- success: suiteRunResult.success,
622
- errorMessage: suiteRunResult.errorMessage,
623
- executionTimeMs: suiteRunResult.executionTimeMs,
624
- result: suiteRunResult.result,
625
- timestamp: new Date()
626
- },
627
- }),
628
- sessionId: userPayload.sessionId,
629
- });
596
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
597
+ resolver: 'RunTestResolver',
598
+ type: 'FireAndForgetSuiteComplete',
599
+ status: 'ok',
600
+ data: {
601
+ sessionId: userPayload.sessionId,
602
+ suiteId,
603
+ type: 'complete',
604
+ success: suiteRunResult.success,
605
+ errorMessage: suiteRunResult.errorMessage,
606
+ executionTimeMs: suiteRunResult.executionTimeMs,
607
+ result: suiteRunResult.result,
608
+ timestamp: new Date()
609
+ },
610
+ }), userPayload);
630
611
  }
631
612
 
632
613
  /**
@@ -638,22 +619,19 @@ export class RunTestResolver extends ResolverBase {
638
619
  suiteId: string,
639
620
  errorMessage: string
640
621
  ) {
641
- pubSub.publish(PUSH_STATUS_UPDATES_TOPIC, {
642
- message: JSON.stringify({
643
- resolver: 'RunTestResolver',
644
- type: 'FireAndForgetSuiteComplete',
645
- status: 'ok',
646
- data: {
647
- sessionId: userPayload.sessionId,
648
- suiteId,
649
- type: 'complete',
650
- success: false,
651
- errorMessage,
652
- result: JSON.stringify({ success: false, errorMessage }),
653
- timestamp: new Date()
654
- },
655
- }),
656
- sessionId: userPayload.sessionId,
657
- });
622
+ this.PublishStatusUpdate(pubSub, userPayload.sessionId, JSON.stringify({
623
+ resolver: 'RunTestResolver',
624
+ type: 'FireAndForgetSuiteComplete',
625
+ status: 'ok',
626
+ data: {
627
+ sessionId: userPayload.sessionId,
628
+ suiteId,
629
+ type: 'complete',
630
+ success: false,
631
+ errorMessage,
632
+ result: JSON.stringify({ success: false, errorMessage }),
633
+ timestamp: new Date()
634
+ },
635
+ }), userPayload);
658
636
  }
659
637
  }
@@ -3,7 +3,7 @@ import { GraphQLJSON } from 'graphql-type-json';
3
3
  import { AppContext } from '../types.js';
4
4
  import { LogError, LogStatus, Metadata, RunView, UserInfo } from '@memberjunction/core';
5
5
  import { ResolverBase } from '../generic/ResolverBase.js';
6
- import { SearchEngine, SearchResult as SearchEngineResult, SearchResultItem as SearchEngineResultItem, SearchProviderInfo, SearchContext, SearchScopePermissionResolver } from '@memberjunction/search-engine';
6
+ import { SearchEngine, SearchResult as SearchEngineResult, SearchResultItem as SearchEngineResultItem, SearchProviderInfo, SearchContext, GetSearchScopePermissionResolver } from '@memberjunction/search-engine';
7
7
  import { SearchEngineBase, MJAIAgentEntity } from '@memberjunction/core-entities';
8
8
  import { UUIDsEqual } from '@memberjunction/global';
9
9
 
@@ -284,7 +284,7 @@ export class SearchKnowledgeResolver extends ResolverBase {
284
284
  agentID: string | undefined,
285
285
  ): Promise<string | undefined> {
286
286
  const agent = await this.loadAgent(agentID, user);
287
- const resolver = new SearchScopePermissionResolver();
287
+ const resolver = GetSearchScopePermissionResolver();
288
288
  for (const scopeID of scopeIDs) {
289
289
  const verdict = await resolver.ResolveEffectivePermission({
290
290
  User: user,
@@ -351,7 +351,7 @@ export class SearchKnowledgeResolver extends ResolverBase {
351
351
 
352
352
  const ownedOrUnowned = scopes.filter(s => !s.OwnerUserID || UUIDsEqual(s.OwnerUserID, userID));
353
353
  const agent = await this.loadAgent(agentID, currentUser);
354
- const resolver = new SearchScopePermissionResolver();
354
+ const resolver = GetSearchScopePermissionResolver();
355
355
 
356
356
  const visible: SearchScopeInfo[] = [];
357
357
  for (const s of ownedOrUnowned) {
@@ -28,7 +28,7 @@ import { ResolverBase } from '../generic/ResolverBase.js';
28
28
  import {
29
29
  SearchEngine,
30
30
  SearchContext,
31
- SearchScopePermissionResolver,
31
+ GetSearchScopePermissionResolver,
32
32
  SearchStreamEvent,
33
33
  } from '@memberjunction/search-engine';
34
34
  import { MJAIAgentEntity } from '@memberjunction/core-entities';
@@ -299,7 +299,7 @@ export class SearchKnowledgeStreamResolver extends ResolverBase {
299
299
  agentID: string | undefined,
300
300
  ): Promise<string | undefined> {
301
301
  const agent = await this.loadAgent(agentID, user);
302
- const resolver = new SearchScopePermissionResolver();
302
+ const resolver = GetSearchScopePermissionResolver();
303
303
  for (const scopeID of scopeIDs) {
304
304
  const verdict = await resolver.ResolveEffectivePermission({
305
305
  User: user,