@memberjunction/server 3.3.0 → 3.4.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 (103) hide show
  1. package/README.md +59 -0
  2. package/dist/auth/BaseAuthProvider.d.ts +1 -0
  3. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  4. package/dist/auth/BaseAuthProvider.js +2 -0
  5. package/dist/auth/BaseAuthProvider.js.map +1 -1
  6. package/dist/auth/IAuthProvider.d.ts +1 -0
  7. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  8. package/dist/config.js +2 -2
  9. package/dist/config.js.map +1 -1
  10. package/dist/generated/generated.d.ts +431 -2
  11. package/dist/generated/generated.d.ts.map +1 -1
  12. package/dist/generated/generated.js +3052 -379
  13. package/dist/generated/generated.js.map +1 -1
  14. package/dist/generic/ResolverBase.d.ts +1 -0
  15. package/dist/generic/ResolverBase.d.ts.map +1 -1
  16. package/dist/generic/ResolverBase.js +30 -0
  17. package/dist/generic/ResolverBase.js.map +1 -1
  18. package/dist/index.d.ts +2 -2
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -2
  21. package/dist/index.js.map +1 -1
  22. package/dist/resolvers/APIKeyResolver.d.ts +2 -1
  23. package/dist/resolvers/APIKeyResolver.d.ts.map +1 -1
  24. package/dist/resolvers/APIKeyResolver.js +4 -1
  25. package/dist/resolvers/APIKeyResolver.js.map +1 -1
  26. package/dist/resolvers/ActionResolver.d.ts +2 -1
  27. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  28. package/dist/resolvers/ActionResolver.js +4 -1
  29. package/dist/resolvers/ActionResolver.js.map +1 -1
  30. package/dist/resolvers/DatasetResolver.d.ts +5 -4
  31. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  32. package/dist/resolvers/DatasetResolver.js +7 -4
  33. package/dist/resolvers/DatasetResolver.js.map +1 -1
  34. package/dist/resolvers/EntityCommunicationsResolver.d.ts +2 -1
  35. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  36. package/dist/resolvers/EntityCommunicationsResolver.js +3 -1
  37. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  38. package/dist/resolvers/GetDataContextDataResolver.d.ts +2 -1
  39. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  40. package/dist/resolvers/GetDataContextDataResolver.js +10 -3
  41. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  42. package/dist/resolvers/MCPResolver.d.ts +37 -0
  43. package/dist/resolvers/MCPResolver.d.ts.map +1 -0
  44. package/dist/resolvers/MCPResolver.js +363 -0
  45. package/dist/resolvers/MCPResolver.js.map +1 -0
  46. package/dist/resolvers/MergeRecordsResolver.d.ts +2 -1
  47. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  48. package/dist/resolvers/MergeRecordsResolver.js +3 -1
  49. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  50. package/dist/resolvers/QueryResolver.d.ts +2 -1
  51. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  52. package/dist/resolvers/QueryResolver.js +6 -1
  53. package/dist/resolvers/QueryResolver.js.map +1 -1
  54. package/dist/resolvers/ReportResolver.d.ts +2 -1
  55. package/dist/resolvers/ReportResolver.d.ts.map +1 -1
  56. package/dist/resolvers/ReportResolver.js +4 -1
  57. package/dist/resolvers/ReportResolver.js.map +1 -1
  58. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  59. package/dist/resolvers/RunAIAgentResolver.js +2 -0
  60. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  61. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  62. package/dist/resolvers/RunAIPromptResolver.js +3 -0
  63. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  64. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  65. package/dist/resolvers/RunTemplateResolver.js +1 -0
  66. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  67. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  68. package/dist/resolvers/TaskResolver.js +1 -0
  69. package/dist/resolvers/TaskResolver.js.map +1 -1
  70. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  71. package/dist/resolvers/UserResolver.js +4 -0
  72. package/dist/resolvers/UserResolver.js.map +1 -1
  73. package/package.json +47 -46
  74. package/src/auth/BaseAuthProvider.ts +3 -0
  75. package/src/auth/IAuthProvider.ts +5 -0
  76. package/src/config.ts +2 -2
  77. package/src/generated/generated.ts +2020 -334
  78. package/src/generic/ResolverBase.ts +89 -3
  79. package/src/index.ts +10 -2
  80. package/src/resolvers/APIKeyResolver.ts +8 -1
  81. package/src/resolvers/ActionResolver.ts +8 -1
  82. package/src/resolvers/DatasetResolver.ts +11 -4
  83. package/src/resolvers/EntityCommunicationsResolver.ts +5 -1
  84. package/src/resolvers/GetDataContextDataResolver.ts +14 -6
  85. package/src/resolvers/MCPResolver.ts +480 -0
  86. package/src/resolvers/MergeRecordsResolver.ts +5 -1
  87. package/src/resolvers/QueryResolver.ts +17 -3
  88. package/src/resolvers/ReportResolver.ts +8 -1
  89. package/src/resolvers/RunAIAgentResolver.ts +6 -0
  90. package/src/resolvers/RunAIPromptResolver.ts +10 -1
  91. package/src/resolvers/RunTemplateResolver.ts +4 -1
  92. package/src/resolvers/TaskResolver.ts +3 -0
  93. package/src/resolvers/UserResolver.ts +15 -3
  94. package/dist/resolvers/AskSkipResolver.d.ts +0 -123
  95. package/dist/resolvers/AskSkipResolver.d.ts.map +0 -1
  96. package/dist/resolvers/AskSkipResolver.js +0 -1788
  97. package/dist/resolvers/AskSkipResolver.js.map +0 -1
  98. package/dist/scheduler/LearningCycleScheduler.d.ts +0 -4
  99. package/dist/scheduler/LearningCycleScheduler.d.ts.map +0 -1
  100. package/dist/scheduler/LearningCycleScheduler.js +0 -4
  101. package/dist/scheduler/LearningCycleScheduler.js.map +0 -1
  102. package/src/resolvers/AskSkipResolver.ts +0 -3446
  103. package/src/scheduler/LearningCycleScheduler.ts +0 -320
@@ -1,320 +0,0 @@
1
- import { LogStatus, LogError } from '@memberjunction/core';
2
- import { SQLServerDataProvider, SQLServerProviderConfigData, UserCache } from '@memberjunction/sqlserver-dataprovider';
3
- import { GetReadWriteDataSource } from '../util.js';
4
- import { AskSkipResolver } from '../resolvers/AskSkipResolver.js';
5
- import { AppContext, DataSourceInfo } from '../types.js';
6
- import { getSystemUser } from '../auth/index.js';
7
- import { BaseSingleton } from '@memberjunction/global';
8
- import { mj_core_schema } from '../config.js';
9
-
10
- /**
11
- * A simple scheduler for the Skip AI learning cycle
12
- * Implements BaseSingleton pattern for cross-instance synchronization
13
- */
14
- export class LearningCycleScheduler extends BaseSingleton<LearningCycleScheduler> {
15
- // private intervalId: NodeJS.Timeout | null = null;
16
-
17
- // // Track executions by organization ID instead of a global flag
18
- // private runningOrganizations: Map<string, { startTime: Date, learningCycleId: string }> = new Map();
19
-
20
- // private lastRunTime: Date | null = null;
21
- // private dataSources: DataSourceInfo[] = [];
22
-
23
- // // Protected constructor to enforce singleton pattern via BaseSingleton
24
- // protected constructor() {
25
- // super();
26
- // }
27
-
28
- // public static get Instance(): LearningCycleScheduler {
29
- // return super.getInstance<LearningCycleScheduler>();
30
- // }
31
-
32
- // /**
33
- // * Set the data sources for the scheduler
34
- // * @param dataSources Array of data sources
35
- // */
36
- // public setDataSources(dataSources: DataSourceInfo[]): void {
37
- // this.dataSources = dataSources;
38
- // }
39
-
40
- // /**
41
- // * Start the scheduler with the specified interval in minutes
42
- // * @param intervalMinutes The interval in minutes between runs
43
- // * @param skipLearningAPIurl The URL for the learning cycle API endpoint
44
- // */
45
- // public start(intervalMinutes: number = 60): void {
46
- // LogStatus(`Starting learning cycle scheduler with interval of ${intervalMinutes} minutes`);
47
-
48
- // // Set up the interval for recurring calls
49
- // const intervalMs = intervalMinutes * 60 * 1000;
50
- // this.intervalId = setInterval(() => {
51
- // this.runLearningCycle()
52
- // .catch(error => LogError(`Error in scheduled learning cycle: ${error}`));
53
- // }, intervalMs);
54
-
55
- // // Start learning cycle immediately upon the server start
56
- // this.runLearningCycle()
57
- // .catch(error => LogError(`Error in initial learning cycle: ${error}`));
58
- // }
59
-
60
- // /**
61
- // * Stop the scheduler
62
- // */
63
- // public stop(): void {
64
- // if (this.intervalId) {
65
- // clearInterval(this.intervalId);
66
- // this.intervalId = null;
67
- // LogStatus('Learning cycle scheduler stopped');
68
- // }
69
- // }
70
-
71
- // /**
72
- // * Run the learning cycle if it's not already running
73
- // * @returns A promise that resolves when the learning cycle completes
74
- // */
75
- // public async runLearningCycle(): Promise<boolean> {
76
- // const startTime = new Date();
77
-
78
- // try {
79
- // // Make sure we have data sources
80
- // if (!this.dataSources || this.dataSources.length === 0) {
81
- // throw new Error('No data sources available for the learning cycle');
82
- // }
83
-
84
- // const dataSource = GetReadWriteDataSource(this.dataSources);
85
-
86
- // // Get system user for operation
87
- // const systemUser = await getSystemUser(dataSource);
88
- // if (!systemUser) {
89
- // throw new Error('System user not found');
90
- // }
91
-
92
- // // Create context for the resolver
93
- // const config = new SQLServerProviderConfigData(dataSource, mj_core_schema, 0, undefined, undefined, false);
94
- // const p = new SQLServerDataProvider();
95
- // await p.Config(config);
96
-
97
- // const context: AppContext = {
98
- // dataSource: dataSource,
99
- // dataSources: this.dataSources,
100
- // userPayload: {
101
- // email: systemUser.Email,
102
- // sessionId: `scheduler_${Date.now()}`,
103
- // userRecord: systemUser,
104
- // isSystemUser: true
105
- // },
106
- // providers: [{provider: p, type: 'Read-Write'}]
107
- // };
108
-
109
- // // Execute the learning cycle
110
- // const skipResolver = new AskSkipResolver();
111
- // const result = await skipResolver.ExecuteAskSkipLearningCycle(
112
- // context,
113
- // false // forceEntityRefresh
114
- // );
115
-
116
- // const endTime = new Date();
117
- // const elapsedMs = endTime.getTime() - startTime.getTime();
118
-
119
- // this.lastRunTime = startTime;
120
-
121
- // if (result.learningCycleSkipped) {
122
- // // skipped the learning cycle - no messages to process, already logged..
123
- // return true;
124
- // }
125
- // else if (result.success) {
126
- // LogStatus(`Learning cycle completed successfully in ${elapsedMs}ms`);
127
- // return true;
128
- // }
129
- // else {
130
- // LogError(`Learning cycle failed after ${elapsedMs}ms: ${result.error}`);
131
- // return false;
132
- // }
133
- // } catch (error) {
134
- // LogError(`Error executing learning cycle: ${error}`);
135
- // return false;
136
- // }
137
- // }
138
-
139
- // /**
140
- // * Get the current status of the scheduler
141
- // */
142
- // public getStatus() {
143
- // return {
144
- // isSchedulerRunning: this.intervalId !== null,
145
- // lastRunTime: this.lastRunTime,
146
- // runningOrganizations: Array.from(this.runningOrganizations.entries()).map(([orgId, info]) => ({
147
- // organizationId: orgId,
148
- // learningCycleId: info.learningCycleId,
149
- // startTime: info.startTime,
150
- // runningForMinutes: (new Date().getTime() - info.startTime.getTime()) / (1000 * 60)
151
- // }))
152
- // };
153
- // }
154
-
155
- // /**
156
- // * Checks if an organization is currently running a learning cycle
157
- // * @param organizationId The organization ID to check
158
- // * @returns Whether the organization is running a cycle and details if running
159
- // */
160
- // public isOrganizationRunningCycle(
161
- // organizationId: string
162
- // ): { isRunning: boolean, startTime?: Date, learningCycleId?: string, runningForMinutes?: number } {
163
- // const runningInfo = this.runningOrganizations.get(organizationId);
164
-
165
- // if (runningInfo) {
166
- // // Check if it's been running too long and should be considered stalled
167
- // const now = new Date();
168
- // const elapsedMinutes = (now.getTime() - runningInfo.startTime.getTime()) / (1000 * 60);
169
-
170
- // return {
171
- // isRunning: true,
172
- // startTime: runningInfo.startTime,
173
- // learningCycleId: runningInfo.learningCycleId,
174
- // runningForMinutes: elapsedMinutes
175
- // };
176
- // }
177
-
178
- // return { isRunning: false };
179
- // }
180
-
181
- // /**
182
- // * Registers an organization as running a learning cycle
183
- // * @param organizationId The organization ID to register
184
- // * @param learningCycleId The ID of the learning cycle
185
- // * @returns true if successfully registered, false if already running
186
- // */
187
- // public registerRunningCycle(organizationId: string, learningCycleId: string): boolean {
188
- // // First check if already running
189
- // const { isRunning } = this.isOrganizationRunningCycle(organizationId);
190
-
191
- // if (isRunning) {
192
- // return false;
193
- // }
194
-
195
- // // Register the organization as running a cycle
196
- // this.runningOrganizations.set(organizationId, {
197
- // startTime: new Date(),
198
- // learningCycleId
199
- // });
200
-
201
- // return true;
202
- // }
203
-
204
- // /**
205
- // * Unregisters an organization after its learning cycle completes
206
- // * @param organizationId The organization ID to unregister
207
- // * @returns true if successfully unregistered, false if wasn't registered
208
- // */
209
- // public unregisterRunningCycle(organizationId: string): boolean {
210
- // if (this.runningOrganizations.has(organizationId)) {
211
- // this.runningOrganizations.delete(organizationId);
212
- // return true;
213
- // }
214
-
215
- // return false;
216
- // }
217
-
218
- // /**
219
- // * Manually execute a learning cycle run for testing purposes
220
- // * This is intended for debugging/testing only and will force a run
221
- // * even if the scheduler is not started
222
- // * @param organizationId Optional organization ID to register for the manual run
223
- // * @returns A promise that resolves when the learning cycle completes
224
- // */
225
- // public async manuallyExecuteLearningCycle(organizationId?: string): Promise<boolean> {
226
- // try {
227
- // LogStatus('🧪 Manually executing learning cycle for testing...');
228
-
229
- // // If an organization ID is provided, register it as running
230
- // const learningCycleId = `manual_${Date.now()}`;
231
- // let orgRegistered = false;
232
-
233
- // if (organizationId) {
234
- // // Check if already running
235
- // const runningStatus = this.isOrganizationRunningCycle(organizationId);
236
-
237
- // if (runningStatus.isRunning) {
238
- // LogError(`Organization ${organizationId} is already running a learning cycle. Cannot start a new one.`);
239
- // return false;
240
- // }
241
-
242
- // // Register this organization
243
- // orgRegistered = this.registerRunningCycle(organizationId, learningCycleId);
244
- // if (!orgRegistered) {
245
- // LogError(`Failed to register organization ${organizationId} for manual learning cycle execution`);
246
- // return false;
247
- // }
248
- // }
249
-
250
- // // Run the learning cycle
251
- // const result = await this.runLearningCycle();
252
- // LogStatus(`🧪 Manual learning cycle execution completed with result: ${result ? 'Success' : 'Failed'}`);
253
-
254
- // // Unregister the organization if it was registered
255
- // if (organizationId && orgRegistered) {
256
- // this.unregisterRunningCycle(organizationId);
257
- // }
258
-
259
- // return result;
260
- // } catch (error) {
261
- // // Make sure to unregister on error
262
- // if (organizationId && this.runningOrganizations.has(organizationId)) {
263
- // this.unregisterRunningCycle(organizationId);
264
- // }
265
-
266
- // LogError(`Error in manual learning cycle execution: ${error}`);
267
- // return false;
268
- // }
269
- // }
270
-
271
- // /**
272
- // * Force stop a running learning cycle for an organization
273
- // * @param organizationId The organization ID to stop the cycle for
274
- // * @returns Information about the stopped cycle
275
- // */
276
- // public stopLearningCycleForOrganization(organizationId: string): {
277
- // success: boolean,
278
- // message: string,
279
- // wasRunning: boolean,
280
- // cycleDetails?: { learningCycleId: string, startTime: Date, runningForMinutes: number }
281
- // } {
282
- // // Check if this organization has a running cycle
283
- // const runningStatus = this.isOrganizationRunningCycle(organizationId);
284
-
285
- // if (!runningStatus.isRunning) {
286
- // return {
287
- // success: false,
288
- // message: `No running learning cycle found for organization ${organizationId}`,
289
- // wasRunning: false
290
- // };
291
- // }
292
-
293
- // // Capture details before unregistering
294
- // const startTime = runningStatus.startTime!;
295
- // const learningCycleId = runningStatus.learningCycleId!;
296
- // const runningForMinutes = runningStatus.runningForMinutes!;
297
-
298
- // // Unregister the organization
299
- // const unregistered = this.unregisterRunningCycle(organizationId);
300
-
301
- // if (unregistered) {
302
- // return {
303
- // success: true,
304
- // message: `Successfully stopped learning cycle for organization ${organizationId}`,
305
- // wasRunning: true,
306
- // cycleDetails: {
307
- // learningCycleId,
308
- // startTime,
309
- // runningForMinutes
310
- // }
311
- // };
312
- // } else {
313
- // return {
314
- // success: false,
315
- // message: `Failed to stop learning cycle for organization ${organizationId}`,
316
- // wasRunning: true
317
- // };
318
- // }
319
- // }
320
- }