@memberjunction/scheduling-actions 6.1.0-edge.0 → 6.1.0-edge.2
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.
|
@@ -2,8 +2,15 @@ import { ActionResultSimple, RunActionParams } from '@memberjunction/actions-bas
|
|
|
2
2
|
import { BaseJobAction } from './BaseJobAction.js';
|
|
3
3
|
/**
|
|
4
4
|
* Execute Scheduled Job Now action.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* Runs a scheduled job immediately, bypassing its cron schedule, through the same engine path the
|
|
7
|
+
* poller uses — lock acquisition, plugin execution, the run record, statistics, and notifications.
|
|
8
|
+
*
|
|
9
|
+
* **This used to write a `Status='Running'` run row and return.** Nothing consumed those rows: there
|
|
10
|
+
* is no queue reader for ad-hoc runs, only the cron poller, which selects jobs by their *schedule*
|
|
11
|
+
* and never looks at pending run records. So "Execute Now" reported success, left a row that said
|
|
12
|
+
* Running forever, and never ran anything. Delegating to `SchedulingEngine.ExecuteScheduledJob` is
|
|
13
|
+
* what makes the name true.
|
|
7
14
|
*
|
|
8
15
|
* @example
|
|
9
16
|
* ```typescript
|
|
@@ -17,16 +24,33 @@ import { BaseJobAction } from './BaseJobAction.js';
|
|
|
17
24
|
*/
|
|
18
25
|
export declare class ExecuteScheduledJobNowAction extends BaseJobAction {
|
|
19
26
|
/**
|
|
20
|
-
*
|
|
27
|
+
* Runs a scheduled job immediately.
|
|
21
28
|
*
|
|
22
29
|
* @param params - The action parameters containing:
|
|
23
30
|
* - JobID (required): ID of the job to execute
|
|
31
|
+
* - Wait (optional, default true): await the job and report its real outcome. Set false to
|
|
32
|
+
* start it and return as soon as it is under way — useful for a long job behind an
|
|
33
|
+
* interactive button, at the cost of the result only saying it started.
|
|
24
34
|
*
|
|
25
35
|
* @returns ActionResultSimple with:
|
|
26
|
-
* - Success:
|
|
27
|
-
* - ResultCode: SUCCESS, VALIDATION_ERROR, NOT_FOUND, or FAILED
|
|
28
|
-
* - Params:
|
|
36
|
+
* - Success: whether the job itself succeeded (or, with Wait=false, whether it started)
|
|
37
|
+
* - ResultCode: SUCCESS, VALIDATION_ERROR, NOT_FOUND, LOCKED, JOB_FAILED, STARTED, or FAILED
|
|
38
|
+
* - Params: output parameters 'RunID' and 'RunStatus'
|
|
29
39
|
*/
|
|
30
40
|
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
41
|
+
/**
|
|
42
|
+
* Start the job and return once it is under way.
|
|
43
|
+
*
|
|
44
|
+
* The promise is deliberately not awaited; its rejection is logged rather than left unhandled,
|
|
45
|
+
* because a rejected floating promise takes the process down under Node's default policy.
|
|
46
|
+
*/
|
|
47
|
+
private startWithoutWaiting;
|
|
48
|
+
/** Map a completed run onto the action result, so a failed job is a failed action. */
|
|
49
|
+
private describeRun;
|
|
50
|
+
/**
|
|
51
|
+
* Classify an engine throw. Lock contention is called out separately because it is the one
|
|
52
|
+
* failure a caller can act on — the job is already running, so try again shortly.
|
|
53
|
+
*/
|
|
54
|
+
private describeFailure;
|
|
31
55
|
}
|
|
32
56
|
//# sourceMappingURL=ExecuteJobNowAction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecuteJobNowAction.d.ts","sourceRoot":"","sources":["../src/ExecuteJobNowAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"ExecuteJobNowAction.d.ts","sourceRoot":"","sources":["../src/ExecuteJobNowAction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAMnF,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,4BAA6B,SAAQ,aAAa;IAC3D;;;;;;;;;;;;;OAaG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA6CvF;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAkB3B,sFAAsF;IACtF,OAAO,CAAC,WAAW;IAenB;;;OAGG;IACH,OAAO,CAAC,eAAe;CAsB1B"}
|
|
@@ -6,12 +6,20 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { RegisterClass } from '@memberjunction/global';
|
|
8
8
|
import { BaseAction } from '@memberjunction/actions';
|
|
9
|
-
import {
|
|
9
|
+
import { LogError } from '@memberjunction/core';
|
|
10
|
+
import { SchedulingEngine } from '@memberjunction/scheduling-engine';
|
|
10
11
|
import { BaseJobAction } from './BaseJobAction.js';
|
|
11
12
|
/**
|
|
12
13
|
* Execute Scheduled Job Now action.
|
|
13
|
-
*
|
|
14
|
-
*
|
|
14
|
+
*
|
|
15
|
+
* Runs a scheduled job immediately, bypassing its cron schedule, through the same engine path the
|
|
16
|
+
* poller uses — lock acquisition, plugin execution, the run record, statistics, and notifications.
|
|
17
|
+
*
|
|
18
|
+
* **This used to write a `Status='Running'` run row and return.** Nothing consumed those rows: there
|
|
19
|
+
* is no queue reader for ad-hoc runs, only the cron poller, which selects jobs by their *schedule*
|
|
20
|
+
* and never looks at pending run records. So "Execute Now" reported success, left a row that said
|
|
21
|
+
* Running forever, and never ran anything. Delegating to `SchedulingEngine.ExecuteScheduledJob` is
|
|
22
|
+
* what makes the name true.
|
|
15
23
|
*
|
|
16
24
|
* @example
|
|
17
25
|
* ```typescript
|
|
@@ -25,15 +33,18 @@ import { BaseJobAction } from './BaseJobAction.js';
|
|
|
25
33
|
*/
|
|
26
34
|
let ExecuteScheduledJobNowAction = class ExecuteScheduledJobNowAction extends BaseJobAction {
|
|
27
35
|
/**
|
|
28
|
-
*
|
|
36
|
+
* Runs a scheduled job immediately.
|
|
29
37
|
*
|
|
30
38
|
* @param params - The action parameters containing:
|
|
31
39
|
* - JobID (required): ID of the job to execute
|
|
40
|
+
* - Wait (optional, default true): await the job and report its real outcome. Set false to
|
|
41
|
+
* start it and return as soon as it is under way — useful for a long job behind an
|
|
42
|
+
* interactive button, at the cost of the result only saying it started.
|
|
32
43
|
*
|
|
33
44
|
* @returns ActionResultSimple with:
|
|
34
|
-
* - Success:
|
|
35
|
-
* - ResultCode: SUCCESS, VALIDATION_ERROR, NOT_FOUND, or FAILED
|
|
36
|
-
* - Params:
|
|
45
|
+
* - Success: whether the job itself succeeded (or, with Wait=false, whether it started)
|
|
46
|
+
* - ResultCode: SUCCESS, VALIDATION_ERROR, NOT_FOUND, LOCKED, JOB_FAILED, STARTED, or FAILED
|
|
47
|
+
* - Params: output parameters 'RunID' and 'RunStatus'
|
|
37
48
|
*/
|
|
38
49
|
async InternalRunAction(params) {
|
|
39
50
|
try {
|
|
@@ -45,13 +56,13 @@ let ExecuteScheduledJobNowAction = class ExecuteScheduledJobNowAction extends Ba
|
|
|
45
56
|
Message: 'JobID parameter is required'
|
|
46
57
|
};
|
|
47
58
|
}
|
|
48
|
-
// Load the job to verify it exists
|
|
49
59
|
const loadResult = await this.loadJob(jobId, params.ContextUser, params.Provider);
|
|
50
60
|
if (loadResult.error) {
|
|
51
61
|
return loadResult.error;
|
|
52
62
|
}
|
|
53
63
|
const job = loadResult.job;
|
|
54
|
-
//
|
|
64
|
+
// Checked here rather than left to the engine so the caller gets a specific message.
|
|
65
|
+
// The engine's own job list only holds active jobs, so it would report "not found".
|
|
55
66
|
if (job.Status !== 'Active') {
|
|
56
67
|
return {
|
|
57
68
|
Success: false,
|
|
@@ -59,39 +70,75 @@ let ExecuteScheduledJobNowAction = class ExecuteScheduledJobNowAction extends Ba
|
|
|
59
70
|
Message: `Cannot execute job '${job.Name}' with status '${job.Status}'. Job must be Active.`
|
|
60
71
|
};
|
|
61
72
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
jobRun.Status = 'Running';
|
|
68
|
-
jobRun.StartedAt = new Date();
|
|
69
|
-
jobRun.QueuedAt = new Date();
|
|
70
|
-
// Save the job run
|
|
71
|
-
const saveResult = await jobRun.Save();
|
|
72
|
-
if (!saveResult) {
|
|
73
|
-
return {
|
|
74
|
-
Success: false,
|
|
75
|
-
ResultCode: 'FAILED',
|
|
76
|
-
Message: `Failed to create job run: ${jobRun.LatestResult?.Message || 'Unknown error'}`
|
|
77
|
-
};
|
|
73
|
+
const engine = SchedulingEngine.Instance;
|
|
74
|
+
await engine.Config(false, params.ContextUser, params.Provider);
|
|
75
|
+
const wait = this.getBooleanParam(params, 'Wait', true);
|
|
76
|
+
if (!wait) {
|
|
77
|
+
return this.startWithoutWaiting(engine, jobId, job.Name, params);
|
|
78
78
|
}
|
|
79
|
-
|
|
80
|
-
this.
|
|
79
|
+
const run = await engine.ExecuteScheduledJob(jobId, params.ContextUser);
|
|
80
|
+
return this.describeRun(run, job.Name, params);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return this.describeFailure(error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Start the job and return once it is under way.
|
|
88
|
+
*
|
|
89
|
+
* The promise is deliberately not awaited; its rejection is logged rather than left unhandled,
|
|
90
|
+
* because a rejected floating promise takes the process down under Node's default policy.
|
|
91
|
+
*/
|
|
92
|
+
startWithoutWaiting(engine, jobId, jobName, params) {
|
|
93
|
+
engine.ExecuteScheduledJob(jobId, params.ContextUser).catch((error) => {
|
|
94
|
+
LogError(`Execute Scheduled Job Now: background execution of '${jobName}' failed`, undefined, error);
|
|
95
|
+
});
|
|
96
|
+
return {
|
|
97
|
+
Success: true,
|
|
98
|
+
ResultCode: 'STARTED',
|
|
99
|
+
Message: `Scheduled job '${jobName}' started. Its outcome is recorded on its job run record.`,
|
|
100
|
+
Params: params.Params
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** Map a completed run onto the action result, so a failed job is a failed action. */
|
|
104
|
+
describeRun(run, jobName, params) {
|
|
105
|
+
this.addOutputParam(params, 'RunID', run.ID);
|
|
106
|
+
this.addOutputParam(params, 'RunStatus', run.Status);
|
|
107
|
+
const succeeded = run.Status === 'Completed';
|
|
108
|
+
return {
|
|
109
|
+
Success: succeeded,
|
|
110
|
+
ResultCode: succeeded ? 'SUCCESS' : 'JOB_FAILED',
|
|
111
|
+
Message: succeeded
|
|
112
|
+
? `Scheduled job '${jobName}' completed (Run ID: ${run.ID})`
|
|
113
|
+
: `Scheduled job '${jobName}' finished with status '${run.Status}'${run.ErrorMessage ? `: ${run.ErrorMessage}` : ''} (Run ID: ${run.ID})`,
|
|
114
|
+
Params: params.Params
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Classify an engine throw. Lock contention is called out separately because it is the one
|
|
119
|
+
* failure a caller can act on — the job is already running, so try again shortly.
|
|
120
|
+
*/
|
|
121
|
+
describeFailure(error) {
|
|
122
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
123
|
+
if (/could not acquire lock/i.test(message)) {
|
|
81
124
|
return {
|
|
82
|
-
Success:
|
|
83
|
-
ResultCode: '
|
|
84
|
-
Message: `
|
|
85
|
-
Params: params.Params
|
|
125
|
+
Success: false,
|
|
126
|
+
ResultCode: 'LOCKED',
|
|
127
|
+
Message: `The job is already running. ${message}`
|
|
86
128
|
};
|
|
87
129
|
}
|
|
88
|
-
|
|
130
|
+
if (/not found or not active/i.test(message)) {
|
|
89
131
|
return {
|
|
90
132
|
Success: false,
|
|
91
|
-
ResultCode: '
|
|
92
|
-
Message:
|
|
133
|
+
ResultCode: 'NOT_FOUND',
|
|
134
|
+
Message: message
|
|
93
135
|
};
|
|
94
136
|
}
|
|
137
|
+
return {
|
|
138
|
+
Success: false,
|
|
139
|
+
ResultCode: 'FAILED',
|
|
140
|
+
Message: `Error executing scheduled job: ${message}`
|
|
141
|
+
};
|
|
95
142
|
}
|
|
96
143
|
};
|
|
97
144
|
ExecuteScheduledJobNowAction = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExecuteJobNowAction.js","sourceRoot":"","sources":["../src/ExecuteJobNowAction.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"ExecuteJobNowAction.js","sourceRoot":"","sources":["../src/ExecuteJobNowAction.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEI,IAAM,4BAA4B,GAAlC,MAAM,4BAA6B,SAAQ,aAAa;IAC3D;;;;;;;;;;;;;OAaG;IACO,KAAK,CAAC,iBAAiB,CAAC,MAAuB;QACrD,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAElD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,kBAAkB;oBAC9B,OAAO,EAAE,6BAA6B;iBACzC,CAAC;YACN,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClF,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,UAAU,CAAC,KAAK,CAAC;YAC5B,CAAC;YAED,MAAM,GAAG,GAAG,UAAU,CAAC,GAAI,CAAC;YAE5B,qFAAqF;YACrF,oFAAoF;YACpF,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,kBAAkB;oBAC9B,OAAO,EAAE,uBAAuB,GAAG,CAAC,IAAI,kBAAkB,GAAG,CAAC,MAAM,wBAAwB;iBAC/F,CAAC;YACN,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC;YACzC,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEhE,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACR,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CACvB,MAAwB,EACxB,KAAa,EACb,OAAe,EACf,MAAuB;QAEvB,MAAM,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAClE,QAAQ,CAAC,uDAAuD,OAAO,UAAU,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,OAAO;YACH,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,SAAS;YACrB,OAAO,EAAE,kBAAkB,OAAO,2DAA2D;YAC7F,MAAM,EAAE,MAAM,CAAC,MAAM;SACxB,CAAC;IACN,CAAC;IAED,sFAAsF;IAC9E,WAAW,CAAC,GAA4B,EAAE,OAAe,EAAE,MAAuB;QACtF,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAErD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC;QAC7C,OAAO;YACH,OAAO,EAAE,SAAS;YAClB,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY;YAChD,OAAO,EAAE,SAAS;gBACd,CAAC,CAAC,kBAAkB,OAAO,wBAAwB,GAAG,CAAC,EAAE,GAAG;gBAC5D,CAAC,CAAC,kBAAkB,OAAO,2BAA2B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,GAAG;YAC7I,MAAM,EAAE,MAAM,CAAC,MAAM;SACxB,CAAC;IACN,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,KAAc;QAClC,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,+BAA+B,OAAO,EAAE;aACpD,CAAC;QACN,CAAC;QACD,IAAI,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,WAAW;gBACvB,OAAO,EAAE,OAAO;aACnB,CAAC;QACN,CAAC;QACD,OAAO;YACH,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,QAAQ;YACpB,OAAO,EAAE,kCAAkC,OAAO,EAAE;SACvD,CAAC;IACN,CAAC;CACJ,CAAA;AA9HY,4BAA4B;IADxC,aAAa,CAAC,UAAU,EAAE,2BAA2B,CAAC;GAC1C,4BAA4B,CA8HxC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/scheduling-actions",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.1.0-edge.
|
|
4
|
+
"version": "6.1.0-edge.2",
|
|
5
5
|
"description": "MemberJunction: Scheduling Actions - agentic tools for managing scheduled jobs",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -11,14 +11,15 @@
|
|
|
11
11
|
"author": "MemberJunction.com",
|
|
12
12
|
"license": "ISC",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@memberjunction/global": "6.1.0-edge.
|
|
15
|
-
"@memberjunction/core": "6.1.0-edge.
|
|
16
|
-
"@memberjunction/core-entities": "6.1.0-edge.
|
|
17
|
-
"@memberjunction/actions": "6.1.0-edge.
|
|
18
|
-
"@memberjunction/actions-base": "6.1.0-edge.
|
|
19
|
-
"@memberjunction/scheduling-base-types": "6.1.0-edge.
|
|
14
|
+
"@memberjunction/global": "6.1.0-edge.2",
|
|
15
|
+
"@memberjunction/core": "6.1.0-edge.2",
|
|
16
|
+
"@memberjunction/core-entities": "6.1.0-edge.2",
|
|
17
|
+
"@memberjunction/actions": "6.1.0-edge.2",
|
|
18
|
+
"@memberjunction/actions-base": "6.1.0-edge.2",
|
|
19
|
+
"@memberjunction/scheduling-base-types": "6.1.0-edge.2",
|
|
20
20
|
"cron-parser": "^4.9.0",
|
|
21
|
-
"luxon": "^3.2.1"
|
|
21
|
+
"luxon": "^3.2.1",
|
|
22
|
+
"@memberjunction/scheduling-engine": "6.1.0-edge.2"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
25
|
"@types/node": "24.10.11",
|