@memberjunction/scheduling-engine 5.11.0 → 5.12.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.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @fileoverview Driver for executing scheduled Integration Sync jobs
3
+ * @module @memberjunction/scheduling-engine
4
+ */
5
+ import { BaseScheduledJob, ScheduledJobExecutionContext } from '../BaseScheduledJob.js';
6
+ import { ValidationResult } from '@memberjunction/core';
7
+ import { ScheduledJobResult, NotificationContent } from '@memberjunction/scheduling-base-types';
8
+ /**
9
+ * Driver for executing scheduled Integration Sync jobs.
10
+ *
11
+ * Configuration schema (stored in ScheduledJob.Configuration):
12
+ * {
13
+ * CompanyIntegrationID: string,
14
+ * EntityMapIDs?: string[],
15
+ * FullSync?: boolean
16
+ * }
17
+ *
18
+ * Execution result details (stored in ScheduledJobRun.Details):
19
+ * {
20
+ * CompanyIntegrationRunID: string,
21
+ * CompanyIntegrationID: string,
22
+ * RecordsProcessed: number,
23
+ * RecordsCreated: number,
24
+ * RecordsUpdated: number,
25
+ * RecordsDeleted: number,
26
+ * RecordsErrored: number,
27
+ * RecordsSkipped: number,
28
+ * EntityMapResults: EntityMapSyncResult[],
29
+ * Duration: number
30
+ * }
31
+ */
32
+ export declare class IntegrationSyncScheduledJobDriver extends BaseScheduledJob {
33
+ Execute(context: ScheduledJobExecutionContext): Promise<ScheduledJobResult>;
34
+ ValidateConfiguration(schedule: {
35
+ Configuration?: string;
36
+ }): ValidationResult;
37
+ FormatNotification(context: ScheduledJobExecutionContext, result: ScheduledJobResult): NotificationContent;
38
+ private buildResult;
39
+ private buildSuccessBody;
40
+ private buildFailureBody;
41
+ }
42
+ //# sourceMappingURL=IntegrationSyncScheduledJobDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntegrationSyncScheduledJobDriver.d.ts","sourceRoot":"","sources":["../../src/drivers/IntegrationSyncScheduledJobDriver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAA4C,MAAM,sBAAsB,CAAC;AAGlG,OAAO,EACH,kBAAkB,EAClB,mBAAmB,EAEtB,MAAM,uCAAuC,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,iCAAkC,SAAQ,gBAAgB;IAEtD,OAAO,CAAC,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgCjF,qBAAqB,CAAC,QAAQ,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB;IAqC7E,kBAAkB,CACrB,OAAO,EAAE,4BAA4B,EACrC,MAAM,EAAE,kBAAkB,GAC3B,mBAAmB;IAwBtB,OAAO,CAAC,WAAW;IAsBnB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,gBAAgB;CAW3B"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * @fileoverview Driver for executing scheduled Integration Sync jobs
3
+ * @module @memberjunction/scheduling-engine
4
+ */
5
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ 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;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ };
11
+ import { RegisterClass } from '@memberjunction/global';
12
+ import { BaseScheduledJob } from '../BaseScheduledJob.js';
13
+ import { ValidationResult, ValidationErrorInfo, ValidationErrorType } from '@memberjunction/core';
14
+ import { IntegrationEngine } from '@memberjunction/integration-engine';
15
+ /**
16
+ * Driver for executing scheduled Integration Sync jobs.
17
+ *
18
+ * Configuration schema (stored in ScheduledJob.Configuration):
19
+ * {
20
+ * CompanyIntegrationID: string,
21
+ * EntityMapIDs?: string[],
22
+ * FullSync?: boolean
23
+ * }
24
+ *
25
+ * Execution result details (stored in ScheduledJobRun.Details):
26
+ * {
27
+ * CompanyIntegrationRunID: string,
28
+ * CompanyIntegrationID: string,
29
+ * RecordsProcessed: number,
30
+ * RecordsCreated: number,
31
+ * RecordsUpdated: number,
32
+ * RecordsDeleted: number,
33
+ * RecordsErrored: number,
34
+ * RecordsSkipped: number,
35
+ * EntityMapResults: EntityMapSyncResult[],
36
+ * Duration: number
37
+ * }
38
+ */
39
+ let IntegrationSyncScheduledJobDriver = class IntegrationSyncScheduledJobDriver extends BaseScheduledJob {
40
+ async Execute(context) {
41
+ const config = this.parseConfiguration(context.Schedule);
42
+ this.log(`Starting integration sync for CompanyIntegration: ${config.CompanyIntegrationID}`);
43
+ // Ensure the integration engine metadata is loaded
44
+ await IntegrationEngine.Instance.Config(false, context.ContextUser);
45
+ const options = {
46
+ EntityMapIDs: config.EntityMapIDs,
47
+ FullSync: config.FullSync,
48
+ ScheduledJobRunID: context.Run.ID,
49
+ };
50
+ const result = await IntegrationEngine.Instance.RunSync(config.CompanyIntegrationID, context.ContextUser, 'Scheduled', undefined, // onProgress
51
+ undefined, // onNotification
52
+ options);
53
+ this.log(`Integration sync completed: ${result.RecordsProcessed} processed, ` +
54
+ `${result.RecordsCreated} created, ${result.RecordsUpdated} updated, ` +
55
+ `${result.RecordsErrored} errors`);
56
+ return this.buildResult(config, result);
57
+ }
58
+ ValidateConfiguration(schedule) {
59
+ const result = new ValidationResult();
60
+ try {
61
+ const config = this.parseConfiguration(schedule);
62
+ if (!config.CompanyIntegrationID) {
63
+ result.Errors.push(new ValidationErrorInfo('Configuration.CompanyIntegrationID', 'CompanyIntegrationID is required', config.CompanyIntegrationID, ValidationErrorType.Failure));
64
+ }
65
+ if (config.EntityMapIDs && !Array.isArray(config.EntityMapIDs)) {
66
+ result.Errors.push(new ValidationErrorInfo('Configuration.EntityMapIDs', 'EntityMapIDs must be an array of strings', config.EntityMapIDs, ValidationErrorType.Failure));
67
+ }
68
+ }
69
+ catch (error) {
70
+ const errorMessage = error instanceof Error ? error.message : 'Invalid configuration';
71
+ result.Errors.push(new ValidationErrorInfo('Configuration', errorMessage, schedule.Configuration, ValidationErrorType.Failure));
72
+ }
73
+ result.Success = result.Errors.length === 0;
74
+ return result;
75
+ }
76
+ FormatNotification(context, result) {
77
+ const details = result.Details;
78
+ const subject = result.Success
79
+ ? `Scheduled Integration Sync Completed: ${context.Schedule.Name}`
80
+ : `Scheduled Integration Sync Failed: ${context.Schedule.Name}`;
81
+ const body = result.Success
82
+ ? this.buildSuccessBody(context, details)
83
+ : this.buildFailureBody(context, result);
84
+ return {
85
+ Subject: subject,
86
+ Body: body,
87
+ Priority: result.Success ? 'Normal' : 'High',
88
+ Metadata: {
89
+ ScheduleID: context.Schedule.ID,
90
+ JobType: 'IntegrationSync',
91
+ CompanyIntegrationID: details?.CompanyIntegrationID,
92
+ CompanyIntegrationRunID: details?.CompanyIntegrationRunID,
93
+ }
94
+ };
95
+ }
96
+ buildResult(config, syncResult) {
97
+ return {
98
+ Success: syncResult.Success,
99
+ ErrorMessage: syncResult.ErrorMessage,
100
+ Details: {
101
+ CompanyIntegrationRunID: syncResult.RunID,
102
+ CompanyIntegrationID: config.CompanyIntegrationID,
103
+ RecordsProcessed: syncResult.RecordsProcessed,
104
+ RecordsCreated: syncResult.RecordsCreated,
105
+ RecordsUpdated: syncResult.RecordsUpdated,
106
+ RecordsDeleted: syncResult.RecordsDeleted,
107
+ RecordsErrored: syncResult.RecordsErrored,
108
+ RecordsSkipped: syncResult.RecordsSkipped,
109
+ EntityMapResults: syncResult.EntityMapResults,
110
+ Duration: syncResult.Duration,
111
+ }
112
+ };
113
+ }
114
+ buildSuccessBody(context, details) {
115
+ const durationMs = details?.Duration;
116
+ const durationStr = durationMs != null ? `${(durationMs / 1000).toFixed(1)}s` : 'N/A';
117
+ return [
118
+ `The scheduled integration sync "${context.Schedule.Name}" completed successfully.`,
119
+ '',
120
+ `Records Processed: ${details?.RecordsProcessed ?? 'N/A'}`,
121
+ ` Created: ${details?.RecordsCreated ?? 'N/A'}`,
122
+ ` Updated: ${details?.RecordsUpdated ?? 'N/A'}`,
123
+ ` Deleted: ${details?.RecordsDeleted ?? 'N/A'}`,
124
+ ` Skipped: ${details?.RecordsSkipped ?? 'N/A'}`,
125
+ ` Errors: ${details?.RecordsErrored ?? 'N/A'}`,
126
+ '',
127
+ `Duration: ${durationStr}`,
128
+ ].join('\n');
129
+ }
130
+ buildFailureBody(context, result) {
131
+ return [
132
+ `The scheduled integration sync "${context.Schedule.Name}" failed.`,
133
+ '',
134
+ `Error: ${result.ErrorMessage ?? 'Unknown error'}`,
135
+ `Records Errored: ${result.Details?.RecordsErrored ?? 'N/A'}`,
136
+ ].join('\n');
137
+ }
138
+ };
139
+ IntegrationSyncScheduledJobDriver = __decorate([
140
+ RegisterClass(BaseScheduledJob, 'IntegrationSyncScheduledJobDriver')
141
+ ], IntegrationSyncScheduledJobDriver);
142
+ export { IntegrationSyncScheduledJobDriver };
143
+ //# sourceMappingURL=IntegrationSyncScheduledJobDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntegrationSyncScheduledJobDriver.js","sourceRoot":"","sources":["../../src/drivers/IntegrationSyncScheduledJobDriver.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;;;;;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAgC,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAQvE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEI,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,gBAAgB;IAE5D,KAAK,CAAC,OAAO,CAAC,OAAqC;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAkC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE1F,IAAI,CAAC,GAAG,CAAC,qDAAqD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC;QAE7F,mDAAmD;QACnD,MAAM,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,OAAO,GAA2B;YACpC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE;SACpC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CACnD,MAAM,CAAC,oBAAoB,EAC3B,OAAO,CAAC,WAAW,EACnB,WAAW,EACX,SAAS,EAAE,aAAa;QACxB,SAAS,EAAE,iBAAiB;QAC5B,OAAO,CACV,CAAC;QAEF,IAAI,CAAC,GAAG,CACJ,+BAA+B,MAAM,CAAC,gBAAgB,cAAc;YACpE,GAAG,MAAM,CAAC,cAAc,aAAa,MAAM,CAAC,cAAc,YAAY;YACtE,GAAG,MAAM,CAAC,cAAc,SAAS,CACpC,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAEM,qBAAqB,CAAC,QAAoC;QAC7D,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAEtC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAkC,QAAyD,CAAC,CAAC;YAEnI,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,oCAAoC,EACpC,kCAAkC,EAClC,MAAM,CAAC,oBAAoB,EAC3B,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;YACP,CAAC;YAED,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,4BAA4B,EAC5B,0CAA0C,EAC1C,MAAM,CAAC,YAAY,EACnB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;YACtF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CACtC,eAAe,EACf,YAAY,EACZ,QAAQ,CAAC,aAAa,EACtB,mBAAmB,CAAC,OAAO,CAC9B,CAAC,CAAC;QACP,CAAC;QAED,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAClB,CAAC;IAEM,kBAAkB,CACrB,OAAqC,EACrC,MAA0B;QAE1B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;YAC1B,CAAC,CAAC,yCAAyC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;YAClE,CAAC,CAAC,sCAAsC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEpE,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO;YACvB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE7C,OAAO;YACH,OAAO,EAAE,OAAO;YAChB,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YAC5C,QAAQ,EAAE;gBACN,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAC/B,OAAO,EAAE,iBAAiB;gBAC1B,oBAAoB,EAAE,OAAO,EAAE,oBAAoB;gBACnD,uBAAuB,EAAE,OAAO,EAAE,uBAAuB;aAC5D;SACJ,CAAC;IACN,CAAC;IAEO,WAAW,CACf,MAAuC,EACvC,UAAsB;QAEtB,OAAO;YACH,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,OAAO,EAAE;gBACL,uBAAuB,EAAE,UAAU,CAAC,KAAK;gBACzC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB;gBACjD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;gBAC7C,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;gBAC7C,QAAQ,EAAE,UAAU,CAAC,QAAQ;aAChC;SACJ,CAAC;IACN,CAAC;IAEO,gBAAgB,CACpB,OAAqC,EACrC,OAA4C;QAE5C,MAAM,UAAU,GAAG,OAAO,EAAE,QAA8B,CAAC;QAC3D,MAAM,WAAW,GAAG,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAEtF,OAAO;YACH,mCAAmC,OAAO,CAAC,QAAQ,CAAC,IAAI,2BAA2B;YACnF,EAAE;YACF,sBAAsB,OAAO,EAAE,gBAAgB,IAAI,KAAK,EAAE;YAC1D,cAAc,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE;YAChD,cAAc,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE;YAChD,cAAc,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE;YAChD,cAAc,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE;YAChD,cAAc,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE;YAChD,EAAE;YACF,aAAa,WAAW,EAAE;SAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAEO,gBAAgB,CACpB,OAAqC,EACrC,MAA0B;QAE1B,OAAO;YACH,mCAAmC,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW;YACnE,EAAE;YACF,UAAU,MAAM,CAAC,YAAY,IAAI,eAAe,EAAE;YAClD,oBAAoB,MAAM,CAAC,OAAO,EAAE,cAAc,IAAI,KAAK,EAAE;SAChE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;CACJ,CAAA;AAxJY,iCAAiC;IAD7C,aAAa,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;GACxD,iCAAiC,CAwJ7C"}
@@ -4,4 +4,5 @@
4
4
  */
5
5
  export * from './AgentScheduledJobDriver.js';
6
6
  export * from './ActionScheduledJobDriver.js';
7
+ export * from './IntegrationSyncScheduledJobDriver.js';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC"}
@@ -4,4 +4,5 @@
4
4
  */
5
5
  export * from './AgentScheduledJobDriver.js';
6
6
  export * from './ActionScheduledJobDriver.js';
7
+ export * from './IntegrationSyncScheduledJobDriver.js';
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/drivers/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qCAAqC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/scheduling-engine",
3
3
  "type": "module",
4
- "version": "5.11.0",
4
+ "version": "5.12.0",
5
5
  "description": "MemberJunction: Scheduling Engine - core engine for executing scheduled jobs with plugin architecture",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -17,16 +17,17 @@
17
17
  "author": "MemberJunction.com",
18
18
  "license": "ISC",
19
19
  "dependencies": {
20
- "@memberjunction/actions": "5.11.0",
21
- "@memberjunction/actions-base": "5.11.0",
22
- "@memberjunction/ai-core-plus": "5.11.0",
23
- "@memberjunction/ai-agents": "5.11.0",
24
- "@memberjunction/core": "5.11.0",
25
- "@memberjunction/core-entities": "5.11.0",
26
- "@memberjunction/global": "5.11.0",
27
- "@memberjunction/scheduling-base-types": "5.11.0",
28
- "@memberjunction/scheduling-engine-base": "5.11.0",
29
- "@memberjunction/sqlserver-dataprovider": "5.11.0",
20
+ "@memberjunction/integration-engine": "5.12.0",
21
+ "@memberjunction/actions": "5.12.0",
22
+ "@memberjunction/actions-base": "5.12.0",
23
+ "@memberjunction/ai-core-plus": "5.12.0",
24
+ "@memberjunction/ai-agents": "5.12.0",
25
+ "@memberjunction/core": "5.12.0",
26
+ "@memberjunction/core-entities": "5.12.0",
27
+ "@memberjunction/global": "5.12.0",
28
+ "@memberjunction/scheduling-base-types": "5.12.0",
29
+ "@memberjunction/scheduling-engine-base": "5.12.0",
30
+ "@memberjunction/sqlserver-dataprovider": "5.12.0",
30
31
  "cron-parser": "^4.9.0"
31
32
  },
32
33
  "devDependencies": {