@msm-core/jobs 0.1.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.
- package/README.md +43 -0
- package/dist/approval/policy.d.ts +8 -0
- package/dist/approval/policy.d.ts.map +1 -0
- package/dist/approval/policy.js +22 -0
- package/dist/approval/policy.js.map +1 -0
- package/dist/config.d.ts +31 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -0
- package/dist/enums.d.ts +16 -0
- package/dist/enums.d.ts.map +1 -0
- package/dist/enums.js +35 -0
- package/dist/enums.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator.d.ts +26 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +408 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/port.d.ts +127 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +17 -0
- package/dist/port.js.map +1 -0
- package/dist/reconciler.d.ts +25 -0
- package/dist/reconciler.d.ts.map +1 -0
- package/dist/reconciler.js +75 -0
- package/dist/reconciler.js.map +1 -0
- package/dist/resume-token.d.ts +40 -0
- package/dist/resume-token.d.ts.map +1 -0
- package/dist/resume-token.js +116 -0
- package/dist/resume-token.js.map +1 -0
- package/dist/types.d.ts +134 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow/registry.d.ts +10 -0
- package/dist/workflow/registry.d.ts.map +1 -0
- package/dist/workflow/registry.js +114 -0
- package/dist/workflow/registry.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
// Job orchestrator — executes deterministic workflow steps with CAS + idempotency
|
|
2
|
+
// protection, in a bounded burst. Ported from kader's job-orchestrator.service.ts:
|
|
3
|
+
// every Mongo/BullMQ call is replaced by a port call, and a StepExecutorPort runs the
|
|
4
|
+
// real side-effecting work (e.g. an agent turn) for `run_interaction_task` — the one
|
|
5
|
+
// capability kader's deterministic version lacked.
|
|
6
|
+
import { isTerminalJobStatus, isRunnableJobStatus } from "./enums.js";
|
|
7
|
+
import { DuplicateStepError } from "./port.js";
|
|
8
|
+
import { resolveRunConfig } from "./config.js";
|
|
9
|
+
const QUEUE_NAME = "jobs";
|
|
10
|
+
function isDuplicateKeyError(error) {
|
|
11
|
+
return error instanceof DuplicateStepError;
|
|
12
|
+
}
|
|
13
|
+
export function createOrchestrator(deps) {
|
|
14
|
+
const { jobStore, queue, ops, clock, registry, stepExecutor, resumeToken, config } = deps;
|
|
15
|
+
const runConfig = resolveRunConfig(config);
|
|
16
|
+
function buildIdempotencyKey(input, version, currentStep) {
|
|
17
|
+
if (input.idempotencyKey)
|
|
18
|
+
return input.idempotencyKey;
|
|
19
|
+
const reason = input.reason || "queue";
|
|
20
|
+
return `${input.jobId}:${version}:${currentStep}:${reason}`;
|
|
21
|
+
}
|
|
22
|
+
async function enqueueBurstContinuation(input) {
|
|
23
|
+
const continuation = await jobStore.getJob(input.jobId, input.tenantId);
|
|
24
|
+
if (!continuation)
|
|
25
|
+
return;
|
|
26
|
+
if (!isRunnableJobStatus(continuation.status))
|
|
27
|
+
return;
|
|
28
|
+
await queue.enqueue({
|
|
29
|
+
jobId: input.jobId,
|
|
30
|
+
tenantId: input.tenantId,
|
|
31
|
+
reason: "burst_continue",
|
|
32
|
+
dedupeKey: `${continuation.currentStep}:burst`,
|
|
33
|
+
});
|
|
34
|
+
ops.record({
|
|
35
|
+
jobId: input.jobId,
|
|
36
|
+
tenantId: input.tenantId,
|
|
37
|
+
missionId: continuation.missionId,
|
|
38
|
+
source: "job_orchestrator",
|
|
39
|
+
eventType: "job.burst.continue_enqueued",
|
|
40
|
+
status: continuation.status,
|
|
41
|
+
queueName: QUEUE_NAME,
|
|
42
|
+
employeeId: continuation.employeeId,
|
|
43
|
+
correlationId: continuation.correlationId,
|
|
44
|
+
metadata: { currentStep: continuation.currentStep },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async function orchestrateJobStep(input) {
|
|
48
|
+
let stepsExecuted = 0;
|
|
49
|
+
while (stepsExecuted < runConfig.maxStepsPerTick) {
|
|
50
|
+
const snapshot = await jobStore.getJob(input.jobId, input.tenantId);
|
|
51
|
+
if (!snapshot)
|
|
52
|
+
return;
|
|
53
|
+
const now = clock.now();
|
|
54
|
+
const dueTimeResume = snapshot.status === "waiting_time" &&
|
|
55
|
+
snapshot.resumeAt !== null &&
|
|
56
|
+
snapshot.resumeAt.getTime() <= now.getTime();
|
|
57
|
+
// A tick is actionable when the job is already runnable, OR it is a waiting_time job
|
|
58
|
+
// whose resumeAt has passed — in which case we promote it to running here (the
|
|
59
|
+
// reconciler / delayed tick only re-enqueues; the CAS promotion lives in the engine
|
|
60
|
+
// so a resumed time-wait actually advances rather than being skipped as non-runnable).
|
|
61
|
+
if (!isRunnableJobStatus(snapshot.status) && !dueTimeResume)
|
|
62
|
+
return;
|
|
63
|
+
const claimed = await jobStore.claim({
|
|
64
|
+
jobId: input.jobId,
|
|
65
|
+
tenantId: input.tenantId,
|
|
66
|
+
expectedVersion: snapshot.version,
|
|
67
|
+
statusIn: dueTimeResume ? ["waiting_time"] : ["queued", "running"],
|
|
68
|
+
set: { status: "running", resumeAt: null, startedAt: snapshot.startedAt ?? now },
|
|
69
|
+
});
|
|
70
|
+
if (!claimed)
|
|
71
|
+
return; // CAS claim lost — another worker owns this tick.
|
|
72
|
+
const idempotencyKey = buildIdempotencyKey(input, claimed.version, claimed.currentStep);
|
|
73
|
+
const existingStep = await jobStore.findStepByIdempotencyKey(input.jobId, input.tenantId, idempotencyKey);
|
|
74
|
+
if (existingStep) {
|
|
75
|
+
const restoredStatus = claimed.waitEvent
|
|
76
|
+
? "waiting_event"
|
|
77
|
+
: claimed.resumeAt
|
|
78
|
+
? "waiting_time"
|
|
79
|
+
: claimed.completedAt
|
|
80
|
+
? "completed"
|
|
81
|
+
: "queued";
|
|
82
|
+
if (claimed.status === "running") {
|
|
83
|
+
await jobStore.finalizeStep({
|
|
84
|
+
jobId: input.jobId,
|
|
85
|
+
tenantId: input.tenantId,
|
|
86
|
+
expectedVersion: claimed.version,
|
|
87
|
+
set: { status: restoredStatus },
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
ops.record({
|
|
91
|
+
jobId: input.jobId,
|
|
92
|
+
tenantId: input.tenantId,
|
|
93
|
+
missionId: claimed.missionId,
|
|
94
|
+
source: "job_orchestrator",
|
|
95
|
+
eventType: "job.step.duplicate_skipped",
|
|
96
|
+
status: claimed.status,
|
|
97
|
+
queueName: QUEUE_NAME,
|
|
98
|
+
employeeId: claimed.employeeId,
|
|
99
|
+
correlationId: claimed.correlationId,
|
|
100
|
+
metadata: { idempotencyKey, restoredStatus },
|
|
101
|
+
});
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const stepStartedAt = clock.now();
|
|
105
|
+
const stepNumber = claimed.currentStep + 1;
|
|
106
|
+
ops.record({
|
|
107
|
+
jobId: input.jobId,
|
|
108
|
+
tenantId: input.tenantId,
|
|
109
|
+
missionId: claimed.missionId,
|
|
110
|
+
source: "job_orchestrator",
|
|
111
|
+
eventType: "job.step.started",
|
|
112
|
+
status: "running",
|
|
113
|
+
queueName: QUEUE_NAME,
|
|
114
|
+
employeeId: claimed.employeeId,
|
|
115
|
+
correlationId: claimed.correlationId,
|
|
116
|
+
metadata: { stepNumber, reason: input.reason || "queue", idempotencyKey },
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
const resolution = registry.resolveStep({
|
|
120
|
+
workflowType: claimed.workflowType,
|
|
121
|
+
workflowVersion: claimed.workflowVersion,
|
|
122
|
+
budget: claimed.budget,
|
|
123
|
+
state: claimed.state,
|
|
124
|
+
stepNumber,
|
|
125
|
+
reason: input.reason || "queue",
|
|
126
|
+
now: stepStartedAt,
|
|
127
|
+
});
|
|
128
|
+
// Run the real side-effecting work (agent turn for run_interaction_task; {} for
|
|
129
|
+
// pure transitions). Throwing here fails the step via the catch below.
|
|
130
|
+
const execResult = await stepExecutor.execute({
|
|
131
|
+
stepType: resolution.stepType,
|
|
132
|
+
triggeredBy: resolution.triggeredBy,
|
|
133
|
+
job: claimed,
|
|
134
|
+
resolution,
|
|
135
|
+
stepNumber,
|
|
136
|
+
});
|
|
137
|
+
const stepEndedAt = clock.now();
|
|
138
|
+
const durationMs = stepEndedAt.getTime() - stepStartedAt.getTime();
|
|
139
|
+
const mergedOutput = { ...(resolution.output ?? {}), ...(execResult.output ?? {}) };
|
|
140
|
+
const mergedStatePatch = {
|
|
141
|
+
...(resolution.statePatch ?? {}),
|
|
142
|
+
...(execResult.statePatch ?? {}),
|
|
143
|
+
};
|
|
144
|
+
const step = {
|
|
145
|
+
stepId: deps.genStepId(),
|
|
146
|
+
jobId: input.jobId,
|
|
147
|
+
tenantId: input.tenantId,
|
|
148
|
+
stepNumber,
|
|
149
|
+
stepType: resolution.stepType,
|
|
150
|
+
status: "completed",
|
|
151
|
+
triggeredBy: resolution.triggeredBy,
|
|
152
|
+
startedAt: stepStartedAt,
|
|
153
|
+
endedAt: stepEndedAt,
|
|
154
|
+
durationMs,
|
|
155
|
+
toolCalls: [],
|
|
156
|
+
output: mergedOutput,
|
|
157
|
+
error: null,
|
|
158
|
+
nextStep: null,
|
|
159
|
+
transitionReason: resolution.transitionReason,
|
|
160
|
+
idempotencyKey,
|
|
161
|
+
};
|
|
162
|
+
await jobStore.insertStep(step);
|
|
163
|
+
const nextStatus = resolution.nextStatus;
|
|
164
|
+
const nextResumeAt = nextStatus === "waiting_time"
|
|
165
|
+
? new Date(clock.now().getTime() + (resolution.resumeDelayMs ?? config.defaultWaitMs))
|
|
166
|
+
: null;
|
|
167
|
+
const waitEventName = resolution.waitEventName || "job.resume";
|
|
168
|
+
const issuedWaitEventToken = nextStatus === "waiting_event"
|
|
169
|
+
? resumeToken.issue({
|
|
170
|
+
jobId: input.jobId,
|
|
171
|
+
tenantId: input.tenantId,
|
|
172
|
+
eventName: waitEventName,
|
|
173
|
+
})
|
|
174
|
+
: null;
|
|
175
|
+
const nextWaitEvent = nextStatus === "waiting_event"
|
|
176
|
+
? { eventName: waitEventName, token: issuedWaitEventToken?.token ?? null }
|
|
177
|
+
: null;
|
|
178
|
+
const nextState = { ...(claimed.state ?? {}), ...mergedStatePatch };
|
|
179
|
+
const finalized = await jobStore.finalizeStep({
|
|
180
|
+
jobId: input.jobId,
|
|
181
|
+
tenantId: input.tenantId,
|
|
182
|
+
expectedVersion: claimed.version,
|
|
183
|
+
set: {
|
|
184
|
+
currentStep: stepNumber,
|
|
185
|
+
status: nextStatus,
|
|
186
|
+
resumeAt: nextResumeAt,
|
|
187
|
+
waitEvent: nextWaitEvent,
|
|
188
|
+
state: nextState,
|
|
189
|
+
completedAt: isTerminalJobStatus(nextStatus) ? clock.now() : null,
|
|
190
|
+
},
|
|
191
|
+
incCounters: { totalStepsExecuted: 1, attempt: 1 },
|
|
192
|
+
});
|
|
193
|
+
if (!finalized)
|
|
194
|
+
return; // CAS finalize lost.
|
|
195
|
+
stepsExecuted += 1;
|
|
196
|
+
ops.record({
|
|
197
|
+
jobId: input.jobId,
|
|
198
|
+
tenantId: input.tenantId,
|
|
199
|
+
missionId: finalized.missionId,
|
|
200
|
+
source: "job_orchestrator",
|
|
201
|
+
eventType: "job.step.completed",
|
|
202
|
+
status: finalized.status,
|
|
203
|
+
queueName: QUEUE_NAME,
|
|
204
|
+
employeeId: finalized.employeeId,
|
|
205
|
+
correlationId: finalized.correlationId,
|
|
206
|
+
metadata: {
|
|
207
|
+
stepNumber,
|
|
208
|
+
stepType: resolution.stepType,
|
|
209
|
+
transitionReason: resolution.transitionReason,
|
|
210
|
+
durationMs,
|
|
211
|
+
idempotencyKey,
|
|
212
|
+
stepsExecutedThisTick: stepsExecuted,
|
|
213
|
+
maxStepsPerTick: runConfig.maxStepsPerTick,
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
if (nextStatus === "completed") {
|
|
217
|
+
ops.record({
|
|
218
|
+
jobId: input.jobId,
|
|
219
|
+
tenantId: input.tenantId,
|
|
220
|
+
missionId: finalized.missionId,
|
|
221
|
+
source: "job_orchestrator",
|
|
222
|
+
eventType: "job.completed",
|
|
223
|
+
status: finalized.status,
|
|
224
|
+
queueName: QUEUE_NAME,
|
|
225
|
+
employeeId: finalized.employeeId,
|
|
226
|
+
correlationId: finalized.correlationId,
|
|
227
|
+
});
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (nextStatus === "failed") {
|
|
231
|
+
ops.record({
|
|
232
|
+
jobId: input.jobId,
|
|
233
|
+
tenantId: input.tenantId,
|
|
234
|
+
missionId: finalized.missionId,
|
|
235
|
+
source: "job_orchestrator",
|
|
236
|
+
eventType: "job.failed",
|
|
237
|
+
status: finalized.status,
|
|
238
|
+
queueName: QUEUE_NAME,
|
|
239
|
+
employeeId: finalized.employeeId,
|
|
240
|
+
correlationId: finalized.correlationId,
|
|
241
|
+
});
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (nextStatus === "waiting_event") {
|
|
245
|
+
ops.record({
|
|
246
|
+
jobId: input.jobId,
|
|
247
|
+
tenantId: input.tenantId,
|
|
248
|
+
missionId: finalized.missionId,
|
|
249
|
+
source: "job_orchestrator",
|
|
250
|
+
eventType: "job.waiting_event",
|
|
251
|
+
status: finalized.status,
|
|
252
|
+
queueName: QUEUE_NAME,
|
|
253
|
+
employeeId: finalized.employeeId,
|
|
254
|
+
correlationId: finalized.correlationId,
|
|
255
|
+
metadata: {
|
|
256
|
+
stepNumber,
|
|
257
|
+
waitEventName: nextWaitEvent?.eventName ?? null,
|
|
258
|
+
resumeTokenExpiresAt: issuedWaitEventToken?.expiresAt ?? null,
|
|
259
|
+
},
|
|
260
|
+
});
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (nextStatus === "awaiting_approval") {
|
|
264
|
+
await handleAwaitingApproval(finalized, resolution, stepNumber, input);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (nextStatus !== "waiting_time")
|
|
268
|
+
return;
|
|
269
|
+
ops.record({
|
|
270
|
+
jobId: input.jobId,
|
|
271
|
+
tenantId: input.tenantId,
|
|
272
|
+
missionId: finalized.missionId,
|
|
273
|
+
source: "job_orchestrator",
|
|
274
|
+
eventType: "job.waiting_time",
|
|
275
|
+
status: finalized.status,
|
|
276
|
+
queueName: QUEUE_NAME,
|
|
277
|
+
employeeId: finalized.employeeId,
|
|
278
|
+
correlationId: finalized.correlationId,
|
|
279
|
+
metadata: {
|
|
280
|
+
stepNumber,
|
|
281
|
+
transitionReason: resolution.transitionReason,
|
|
282
|
+
resumeAt: nextResumeAt?.toISOString(),
|
|
283
|
+
resumeMode: config.resumeMode,
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
const resumeDelayMs = nextResumeAt
|
|
287
|
+
? Math.max(1, nextResumeAt.getTime() - clock.now().getTime())
|
|
288
|
+
: config.defaultWaitMs;
|
|
289
|
+
const canInlineContinue = stepsExecuted < runConfig.maxStepsPerTick &&
|
|
290
|
+
resumeDelayMs <= runConfig.inlineResumeMaxDelayMs;
|
|
291
|
+
if (canInlineContinue) {
|
|
292
|
+
const inlined = await jobStore.claim({
|
|
293
|
+
jobId: input.jobId,
|
|
294
|
+
tenantId: input.tenantId,
|
|
295
|
+
expectedVersion: finalized.version,
|
|
296
|
+
statusIn: ["waiting_time"],
|
|
297
|
+
set: { status: "queued", resumeAt: null },
|
|
298
|
+
});
|
|
299
|
+
if (!inlined)
|
|
300
|
+
return;
|
|
301
|
+
ops.record({
|
|
302
|
+
jobId: input.jobId,
|
|
303
|
+
tenantId: input.tenantId,
|
|
304
|
+
missionId: inlined.missionId,
|
|
305
|
+
source: "job_orchestrator",
|
|
306
|
+
eventType: "job.waiting_time.inline_continued",
|
|
307
|
+
status: inlined.status,
|
|
308
|
+
queueName: QUEUE_NAME,
|
|
309
|
+
employeeId: inlined.employeeId,
|
|
310
|
+
correlationId: inlined.correlationId,
|
|
311
|
+
metadata: { stepNumber, resumeDelayMs, inlineResumeMaxDelayMs: runConfig.inlineResumeMaxDelayMs },
|
|
312
|
+
});
|
|
313
|
+
continue;
|
|
314
|
+
}
|
|
315
|
+
if (config.resumeMode === "scan_only")
|
|
316
|
+
return;
|
|
317
|
+
await queue.enqueue({
|
|
318
|
+
jobId: input.jobId,
|
|
319
|
+
tenantId: input.tenantId,
|
|
320
|
+
reason: "waiting_time_resume",
|
|
321
|
+
delayMs: resumeDelayMs,
|
|
322
|
+
dedupeKey: `${stepNumber}:${idempotencyKey}`,
|
|
323
|
+
});
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
if (isDuplicateKeyError(error)) {
|
|
328
|
+
ops.record({
|
|
329
|
+
jobId: input.jobId,
|
|
330
|
+
tenantId: input.tenantId,
|
|
331
|
+
missionId: claimed.missionId,
|
|
332
|
+
source: "job_orchestrator",
|
|
333
|
+
eventType: "job.step.duplicate_skipped",
|
|
334
|
+
status: claimed.status,
|
|
335
|
+
queueName: QUEUE_NAME,
|
|
336
|
+
employeeId: claimed.employeeId,
|
|
337
|
+
correlationId: claimed.correlationId,
|
|
338
|
+
metadata: { idempotencyKey },
|
|
339
|
+
});
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
await jobStore.markFailed({ jobId: input.jobId, tenantId: input.tenantId });
|
|
343
|
+
ops.record({
|
|
344
|
+
jobId: input.jobId,
|
|
345
|
+
tenantId: input.tenantId,
|
|
346
|
+
missionId: claimed.missionId,
|
|
347
|
+
source: "job_orchestrator",
|
|
348
|
+
eventType: "job.failed",
|
|
349
|
+
status: "failed",
|
|
350
|
+
queueName: QUEUE_NAME,
|
|
351
|
+
employeeId: claimed.employeeId,
|
|
352
|
+
correlationId: claimed.correlationId,
|
|
353
|
+
metadata: { error: error.message },
|
|
354
|
+
});
|
|
355
|
+
throw error;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
await enqueueBurstContinuation(input);
|
|
359
|
+
}
|
|
360
|
+
async function handleAwaitingApproval(finalized, resolution, stepNumber, input) {
|
|
361
|
+
let approvalId = null;
|
|
362
|
+
let approvalExpiresAt = null;
|
|
363
|
+
if (deps.approvalCreator) {
|
|
364
|
+
const createInput = {
|
|
365
|
+
tenantId: input.tenantId,
|
|
366
|
+
employeeId: finalized.employeeId,
|
|
367
|
+
jobId: finalized.jobId,
|
|
368
|
+
stepNumber,
|
|
369
|
+
jobVersion: finalized.version,
|
|
370
|
+
workflowType: finalized.workflowType,
|
|
371
|
+
stepType: resolution.stepType,
|
|
372
|
+
transitionReason: resolution.transitionReason,
|
|
373
|
+
reasoning: `Approval required at job step ${stepNumber} for ${resolution.stepType}`,
|
|
374
|
+
approvalPolicy: resolution.approvalPolicy ?? "internal_operational",
|
|
375
|
+
metadata: {
|
|
376
|
+
timeoutOutcome: resolution.approvalTimeoutOutcome ?? null,
|
|
377
|
+
orchestratorReason: input.reason || "queue",
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
if (resolution.approvalTimeoutMs !== undefined) {
|
|
381
|
+
createInput.approvalTimeoutMs = resolution.approvalTimeoutMs;
|
|
382
|
+
}
|
|
383
|
+
const approval = await deps.approvalCreator.create(createInput);
|
|
384
|
+
approvalId = approval.approvalId;
|
|
385
|
+
approvalExpiresAt = approval.expiresAt;
|
|
386
|
+
}
|
|
387
|
+
ops.record({
|
|
388
|
+
jobId: input.jobId,
|
|
389
|
+
tenantId: input.tenantId,
|
|
390
|
+
missionId: finalized.missionId,
|
|
391
|
+
source: "job_orchestrator",
|
|
392
|
+
eventType: "job.approval.awaiting",
|
|
393
|
+
status: finalized.status,
|
|
394
|
+
queueName: QUEUE_NAME,
|
|
395
|
+
employeeId: finalized.employeeId,
|
|
396
|
+
correlationId: finalized.correlationId,
|
|
397
|
+
metadata: {
|
|
398
|
+
stepNumber,
|
|
399
|
+
approvalId,
|
|
400
|
+
approvalPolicy: resolution.approvalPolicy ?? "internal_operational",
|
|
401
|
+
timeoutOutcome: resolution.approvalTimeoutOutcome ?? null,
|
|
402
|
+
approvalExpiresAt: approvalExpiresAt?.toISOString() ?? null,
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
return { orchestrateJobStep };
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mFAAmF;AACnF,sFAAsF;AACtF,qFAAqF;AACrF,mDAAmD;AAEnD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAUtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAG/C,OAAO,EAAE,gBAAgB,EAAwB,MAAM,aAAa,CAAC;AAGrE,MAAM,UAAU,GAAG,MAAM,CAAC;AA0B1B,SAAS,mBAAmB,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,kBAAkB,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1F,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE3C,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,OAAe,EACf,WAAmB;QAEnB,IAAI,KAAK,CAAC,cAAc;YAAE,OAAO,KAAK,CAAC,cAAc,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC;QACvC,OAAO,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,IAAI,WAAW,IAAI,MAAM,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,UAAU,wBAAwB,CAAC,KAA8B;QACpE,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,MAAM,CAAC;YAAE,OAAO;QAEtD,MAAM,KAAK,CAAC,OAAO,CAAC;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,GAAG,YAAY,CAAC,WAAW,QAAQ;SAC/C,CAAC,CAAC;QAEH,GAAG,CAAC,MAAM,CAAC;YACT,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,YAAY,CAAC,SAAS;YACjC,MAAM,EAAE,kBAAkB;YAC1B,SAAS,EAAE,6BAA6B;YACxC,MAAM,EAAE,YAAY,CAAC,MAAM;YAC3B,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,aAAa,EAAE,YAAY,CAAC,aAAa;YACzC,QAAQ,EAAE,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE;SACpD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,kBAAkB,CAAC,KAA8B;QAC9D,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,OAAO,aAAa,GAAG,SAAS,CAAC,eAAe,EAAE,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpE,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAEtB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YACxB,MAAM,aAAa,GACjB,QAAQ,CAAC,MAAM,KAAK,cAAc;gBAClC,QAAQ,CAAC,QAAQ,KAAK,IAAI;gBAC1B,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAE/C,qFAAqF;YACrF,+EAA+E;YAC/E,oFAAoF;YACpF,uFAAuF;YACvF,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAEpE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;gBACnC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,eAAe,EAAE,QAAQ,CAAC,OAAO;gBACjC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC;gBAClE,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,GAAG,EAAE;aACjF,CAAC,CAAC;YACH,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,kDAAkD;YAExE,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACxF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,wBAAwB,CAC1D,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,QAAQ,EACd,cAAc,CACf,CAAC;YAEF,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,cAAc,GAAc,OAAO,CAAC,SAAS;oBACjD,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,OAAO,CAAC,QAAQ;wBAChB,CAAC,CAAC,cAAc;wBAChB,CAAC,CAAC,OAAO,CAAC,WAAW;4BACnB,CAAC,CAAC,WAAW;4BACb,CAAC,CAAC,QAAQ,CAAC;gBAEjB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,QAAQ,CAAC,YAAY,CAAC;wBAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,eAAe,EAAE,OAAO,CAAC,OAAO;wBAChC,GAAG,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE;qBAChC,CAAC,CAAC;gBACL,CAAC;gBAED,GAAG,CAAC,MAAM,CAAC;oBACT,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,4BAA4B;oBACvC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;oBACpC,QAAQ,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE;iBAC7C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;YAE3C,GAAG,CAAC,MAAM,CAAC;gBACT,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,kBAAkB;gBAC7B,MAAM,EAAE,SAAS;gBACjB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO,EAAE,cAAc,EAAE;aAC1E,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC;oBACtC,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,UAAU;oBACV,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO;oBAC/B,GAAG,EAAE,aAAa;iBACnB,CAAC,CAAC;gBAEH,gFAAgF;gBAChF,uEAAuE;gBACvE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;oBAC5C,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,GAAG,EAAE,OAAO;oBACZ,UAAU;oBACV,UAAU;iBACX,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;gBAEnE,MAAM,YAAY,GAAG,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpF,MAAM,gBAAgB,GAAG;oBACvB,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;oBAChC,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;iBACjC,CAAC;gBAEF,MAAM,IAAI,GAAkB;oBAC1B,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;oBACxB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,UAAU;oBACV,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,MAAM,EAAE,WAAW;oBACnB,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,SAAS,EAAE,aAAa;oBACxB,OAAO,EAAE,WAAW;oBACpB,UAAU;oBACV,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,YAAY;oBACpB,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,IAAI;oBACd,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;oBAC7C,cAAc;iBACf,CAAC;gBACF,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAEhC,MAAM,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;gBACzC,MAAM,YAAY,GAChB,UAAU,KAAK,cAAc;oBAC3B,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC;oBACtF,CAAC,CAAC,IAAI,CAAC;gBAEX,MAAM,aAAa,GAAW,UAAU,CAAC,aAAa,IAAI,YAAY,CAAC;gBACvE,MAAM,oBAAoB,GACxB,UAAU,KAAK,eAAe;oBAC5B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;wBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,aAAa;qBACzB,CAAC;oBACJ,CAAC,CAAC,IAAI,CAAC;gBACX,MAAM,aAAa,GACjB,UAAU,KAAK,eAAe;oBAC5B,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,IAAI,IAAI,EAAE;oBAC1E,CAAC,CAAC,IAAI,CAAC;gBAEX,MAAM,SAAS,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,gBAAgB,EAAE,CAAC;gBAEpE,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC;oBAC5C,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,eAAe,EAAE,OAAO,CAAC,OAAO;oBAChC,GAAG,EAAE;wBACH,WAAW,EAAE,UAAU;wBACvB,MAAM,EAAE,UAAU;wBAClB,QAAQ,EAAE,YAAY;wBACtB,SAAS,EAAE,aAAa;wBACxB,KAAK,EAAE,SAAS;wBAChB,WAAW,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI;qBAClE;oBACD,WAAW,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;iBACnD,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS;oBAAE,OAAO,CAAC,qBAAqB;gBAE7C,aAAa,IAAI,CAAC,CAAC;gBAEnB,GAAG,CAAC,MAAM,CAAC;oBACT,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,oBAAoB;oBAC/B,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,QAAQ,EAAE;wBACR,UAAU;wBACV,QAAQ,EAAE,UAAU,CAAC,QAAQ;wBAC7B,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;wBAC7C,UAAU;wBACV,cAAc;wBACd,qBAAqB,EAAE,aAAa;wBACpC,eAAe,EAAE,SAAS,CAAC,eAAe;qBAC3C;iBACF,CAAC,CAAC;gBAEH,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;oBAC/B,GAAG,CAAC,MAAM,CAAC;wBACT,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,MAAM,EAAE,kBAAkB;wBAC1B,SAAS,EAAE,eAAe;wBAC1B,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,SAAS,EAAE,UAAU;wBACrB,UAAU,EAAE,SAAS,CAAC,UAAU;wBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;qBACvC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;oBAC5B,GAAG,CAAC,MAAM,CAAC;wBACT,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,MAAM,EAAE,kBAAkB;wBAC1B,SAAS,EAAE,YAAY;wBACvB,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,SAAS,EAAE,UAAU;wBACrB,UAAU,EAAE,SAAS,CAAC,UAAU;wBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;qBACvC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,eAAe,EAAE,CAAC;oBACnC,GAAG,CAAC,MAAM,CAAC;wBACT,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;wBAC9B,MAAM,EAAE,kBAAkB;wBAC1B,SAAS,EAAE,mBAAmB;wBAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;wBACxB,SAAS,EAAE,UAAU;wBACrB,UAAU,EAAE,SAAS,CAAC,UAAU;wBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;wBACtC,QAAQ,EAAE;4BACR,UAAU;4BACV,aAAa,EAAE,aAAa,EAAE,SAAS,IAAI,IAAI;4BAC/C,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,IAAI,IAAI;yBAC9D;qBACF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,mBAAmB,EAAE,CAAC;oBACvC,MAAM,sBAAsB,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;oBACvE,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,KAAK,cAAc;oBAAE,OAAO;gBAE1C,GAAG,CAAC,MAAM,CAAC;oBACT,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,SAAS,EAAE,SAAS,CAAC,SAAS;oBAC9B,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,kBAAkB;oBAC7B,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,aAAa,EAAE,SAAS,CAAC,aAAa;oBACtC,QAAQ,EAAE;wBACR,UAAU;wBACV,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;wBAC7C,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE;wBACrC,UAAU,EAAE,MAAM,CAAC,UAAU;qBAC9B;iBACF,CAAC,CAAC;gBAEH,MAAM,aAAa,GAAG,YAAY;oBAChC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC7D,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;gBACzB,MAAM,iBAAiB,GACrB,aAAa,GAAG,SAAS,CAAC,eAAe;oBACzC,aAAa,IAAI,SAAS,CAAC,sBAAsB,CAAC;gBAEpD,IAAI,iBAAiB,EAAE,CAAC;oBACtB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC;wBACnC,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,eAAe,EAAE,SAAS,CAAC,OAAO;wBAClC,QAAQ,EAAE,CAAC,cAAc,CAAC;wBAC1B,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;qBAC1C,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO;wBAAE,OAAO;oBAErB,GAAG,CAAC,MAAM,CAAC;wBACT,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,MAAM,EAAE,kBAAkB;wBAC1B,SAAS,EAAE,mCAAmC;wBAC9C,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,SAAS,EAAE,UAAU;wBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;wBACpC,QAAQ,EAAE,EAAE,UAAU,EAAE,aAAa,EAAE,sBAAsB,EAAE,SAAS,CAAC,sBAAsB,EAAE;qBAClG,CAAC,CAAC;oBACH,SAAS;gBACX,CAAC;gBAED,IAAI,MAAM,CAAC,UAAU,KAAK,WAAW;oBAAE,OAAO;gBAE9C,MAAM,KAAK,CAAC,OAAO,CAAC;oBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,qBAAqB;oBAC7B,OAAO,EAAE,aAAa;oBACtB,SAAS,EAAE,GAAG,UAAU,IAAI,cAAc,EAAE;iBAC7C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC/B,GAAG,CAAC,MAAM,CAAC;wBACT,KAAK,EAAE,KAAK,CAAC,KAAK;wBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;wBAC5B,MAAM,EAAE,kBAAkB;wBAC1B,SAAS,EAAE,4BAA4B;wBACvC,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,SAAS,EAAE,UAAU;wBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;wBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;wBACpC,QAAQ,EAAE,EAAE,cAAc,EAAE;qBAC7B,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,MAAM,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC5E,GAAG,CAAC,MAAM,CAAC;oBACT,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,YAAY;oBACvB,MAAM,EAAE,QAAQ;oBAChB,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,aAAa,EAAE,OAAO,CAAC,aAAa;oBACpC,QAAQ,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;iBAC9C,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,UAAU,sBAAsB,CACnC,SAA0D,EAC1D,UAAuD,EACvD,UAAkB,EAClB,KAA8B;QAE9B,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,iBAAiB,GAAgB,IAAI,CAAC;QAE1C,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,WAAW,GAAiD;gBAChE,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,UAAU,EAAE,SAAS,CAAC,UAAU;gBAChC,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,UAAU;gBACV,UAAU,EAAE,SAAS,CAAC,OAAO;gBAC7B,YAAY,EAAE,SAAS,CAAC,YAAY;gBACpC,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;gBAC7C,SAAS,EAAE,iCAAiC,UAAU,QAAQ,UAAU,CAAC,QAAQ,EAAE;gBACnF,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI,sBAAsB;gBACnE,QAAQ,EAAE;oBACR,cAAc,EAAE,UAAU,CAAC,sBAAsB,IAAI,IAAI;oBACzD,kBAAkB,EAAE,KAAK,CAAC,MAAM,IAAI,OAAO;iBAC5C;aACF,CAAC;YACF,IAAI,UAAU,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;gBAC/C,WAAW,CAAC,iBAAiB,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC/D,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAChE,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;YACjC,iBAAiB,GAAG,QAAQ,CAAC,SAAS,CAAC;QACzC,CAAC;QAED,GAAG,CAAC,MAAM,CAAC;YACT,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,MAAM,EAAE,kBAAkB;YAC1B,SAAS,EAAE,uBAAuB;YAClC,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,QAAQ,EAAE;gBACR,UAAU;gBACV,UAAU;gBACV,cAAc,EAAE,UAAU,CAAC,cAAc,IAAI,sBAAsB;gBACnE,cAAc,EAAE,UAAU,CAAC,sBAAsB,IAAI,IAAI;gBACzD,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,EAAE,IAAI,IAAI;aAC5D;SACF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAChC,CAAC"}
|
package/dist/port.d.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { CreateJobInput, JobOpsEventInput, JobSnapshot, JobStepRecord, WorkflowContext, WorkflowResolution } from "./types.js";
|
|
2
|
+
import type { JobStatus, JobStepTriggeredBy, JobStepType } from "./enums.js";
|
|
3
|
+
/** Thrown by `insertStep` when the unique idempotency key already exists. The adapter
|
|
4
|
+
* maps Mongo duplicate-key (code 11000) onto this; the engine never sees `11000`. */
|
|
5
|
+
export declare class DuplicateStepError extends Error {
|
|
6
|
+
constructor(message?: string);
|
|
7
|
+
}
|
|
8
|
+
export interface JobStore {
|
|
9
|
+
/** Read the current snapshot (mongo: findOne(...).lean()). */
|
|
10
|
+
getJob(jobId: string, tenantId: string): Promise<JobSnapshot | null>;
|
|
11
|
+
/** Create + persist a new job; returns its initial snapshot. */
|
|
12
|
+
createJob(input: CreateJobInput): Promise<JobSnapshot>;
|
|
13
|
+
/**
|
|
14
|
+
* CAS claim. Atomic conditional update keyed on (jobId,tenantId,expectedVersion,statusIn).
|
|
15
|
+
* Returns the NEW snapshot, or null when the version/status guard failed (claim lost).
|
|
16
|
+
* Adapter MUST implement as:
|
|
17
|
+
* findOneAndUpdate({jobId,tenantId,version:expectedVersion,status:{$in:statusIn}},
|
|
18
|
+
* {$set:set, $inc:{version:1}}, {new:true}).lean()
|
|
19
|
+
*/
|
|
20
|
+
claim(args: {
|
|
21
|
+
jobId: string;
|
|
22
|
+
tenantId: string;
|
|
23
|
+
expectedVersion: number;
|
|
24
|
+
statusIn: JobStatus[];
|
|
25
|
+
set: Partial<JobSnapshot>;
|
|
26
|
+
}): Promise<JobSnapshot | null>;
|
|
27
|
+
/**
|
|
28
|
+
* Version-guarded finalize (no status guard). Returns the NEW snapshot or null on
|
|
29
|
+
* lost CAS. Adapter: findOneAndUpdate({...,version:expectedVersion},
|
|
30
|
+
* {$set:set, $inc:{version:1, ...incCounters}}, {new:true}).lean()
|
|
31
|
+
*/
|
|
32
|
+
finalizeStep(args: {
|
|
33
|
+
jobId: string;
|
|
34
|
+
tenantId: string;
|
|
35
|
+
expectedVersion: number;
|
|
36
|
+
set: Partial<JobSnapshot>;
|
|
37
|
+
incCounters?: Record<string, number>;
|
|
38
|
+
}): Promise<JobSnapshot | null>;
|
|
39
|
+
/** Force the job to `failed` WITHOUT a version guard (terminal error path). */
|
|
40
|
+
markFailed(args: {
|
|
41
|
+
jobId: string;
|
|
42
|
+
tenantId: string;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
/** Append a step. MUST throw `DuplicateStepError` when the unique key already exists. */
|
|
45
|
+
insertStep(step: JobStepRecord): Promise<void>;
|
|
46
|
+
findStepByIdempotencyKey(jobId: string, tenantId: string, idempotencyKey: string): Promise<JobStepRecord | null>;
|
|
47
|
+
/** Reconciler scan: waiting_time jobs with a non-null resumeAt <= asOf, oldest first. */
|
|
48
|
+
findDueWaitingTime(asOf: Date, limit: number): Promise<JobSnapshot[]>;
|
|
49
|
+
}
|
|
50
|
+
/** Enqueues an orchestrator tick (BullMQ behind this; jobId-based dedup via dedupeKey). */
|
|
51
|
+
export interface QueuePort {
|
|
52
|
+
enqueue(args: {
|
|
53
|
+
jobId: string;
|
|
54
|
+
tenantId: string;
|
|
55
|
+
reason: string;
|
|
56
|
+
idempotencyKey?: string;
|
|
57
|
+
delayMs?: number;
|
|
58
|
+
dedupeKey?: string;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
/** Distributed single-flight lock (Redis SET key val PX ttl NX). Auto-expires; no release. */
|
|
62
|
+
export interface LockPort {
|
|
63
|
+
acquire(key: string, ttlMs: number): Promise<boolean>;
|
|
64
|
+
}
|
|
65
|
+
/** One-time nonce claim for resume-token replay protection (Redis SET key 1 EX ttl NX). */
|
|
66
|
+
export interface NoncePort {
|
|
67
|
+
claimOnce(key: string, ttlSeconds: number): Promise<boolean>;
|
|
68
|
+
}
|
|
69
|
+
/** Injected clock — makes cron/reconciler/inline-resume math deterministic in tests. */
|
|
70
|
+
export interface ClockPort {
|
|
71
|
+
now(): Date;
|
|
72
|
+
}
|
|
73
|
+
/** Fire-and-forget operational ledger sink. Implementations MUST NOT throw. */
|
|
74
|
+
export interface JobOpsPort {
|
|
75
|
+
record(event: JobOpsEventInput): void;
|
|
76
|
+
}
|
|
77
|
+
/** Pluggable workflow definition resolver (data-driven; fed from the manifest). */
|
|
78
|
+
export interface WorkflowRegistry {
|
|
79
|
+
resolveStep(ctx: WorkflowContext): WorkflowResolution;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Executes the side-effecting work of a step. For `run_interaction_task` this runs an
|
|
83
|
+
* actual agent turn (in platform-ai: a @msm-core/mini turn); for pure transitions
|
|
84
|
+
* (wait_time/complete/fail/wait_event) it returns {}. The returned output/statePatch
|
|
85
|
+
* are merged onto the workflow resolution's. Throwing fails the step (job → failed).
|
|
86
|
+
*/
|
|
87
|
+
export interface StepExecutorPort {
|
|
88
|
+
execute(args: {
|
|
89
|
+
stepType: JobStepType;
|
|
90
|
+
triggeredBy: JobStepTriggeredBy;
|
|
91
|
+
job: JobSnapshot;
|
|
92
|
+
resolution: WorkflowResolution;
|
|
93
|
+
stepNumber: number;
|
|
94
|
+
}): Promise<{
|
|
95
|
+
output?: Record<string, unknown>;
|
|
96
|
+
statePatch?: Record<string, unknown>;
|
|
97
|
+
}>;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Creates an HITL approval record when a step transitions to `awaiting_approval`.
|
|
101
|
+
* Optional in S1 (engine just records the transition if absent); the real approval
|
|
102
|
+
* engine plugs in here in S2.
|
|
103
|
+
*/
|
|
104
|
+
export interface ApprovalCreatorPort {
|
|
105
|
+
create(input: {
|
|
106
|
+
tenantId: string;
|
|
107
|
+
employeeId: string;
|
|
108
|
+
jobId: string;
|
|
109
|
+
stepNumber: number;
|
|
110
|
+
jobVersion: number;
|
|
111
|
+
workflowType: string;
|
|
112
|
+
stepType: JobStepType;
|
|
113
|
+
transitionReason: string;
|
|
114
|
+
reasoning: string;
|
|
115
|
+
approvalPolicy: string;
|
|
116
|
+
approvalTimeoutMs?: number;
|
|
117
|
+
metadata?: Record<string, unknown>;
|
|
118
|
+
}): Promise<{
|
|
119
|
+
approvalId: string;
|
|
120
|
+
expiresAt: Date | null;
|
|
121
|
+
}>;
|
|
122
|
+
}
|
|
123
|
+
/** Step-id generator (default: crypto.randomUUID). */
|
|
124
|
+
export interface IdGeneratorPort {
|
|
125
|
+
jobStepId(): string;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"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"}
|
package/dist/port.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// @msm-core/jobs — the PORTS. The engine is pure decision logic; ALL infrastructure
|
|
2
|
+
// (Mongo, BullMQ, Redis, wall-clock) is injected through these interfaces, so this
|
|
3
|
+
// package carries NO mongoose/bullmq/ioredis dependency.
|
|
4
|
+
//
|
|
5
|
+
// The two correctness-critical atomics are FIRST-CLASS, named methods — `claim` and
|
|
6
|
+
// `finalizeStep` (version-guarded compare-and-set) and `insertStep` (unique-key
|
|
7
|
+
// idempotency). The adapter is the single place that must get Mongo atomics right;
|
|
8
|
+
// the engine catches exactly one typed failure (`DuplicateStepError`).
|
|
9
|
+
/** Thrown by `insertStep` when the unique idempotency key already exists. The adapter
|
|
10
|
+
* maps Mongo duplicate-key (code 11000) onto this; the engine never sees `11000`. */
|
|
11
|
+
export class DuplicateStepError extends Error {
|
|
12
|
+
constructor(message = "Duplicate job step (idempotency key already used)") {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = "DuplicateStepError";
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=port.js.map
|
package/dist/port.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../src/port.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,mFAAmF;AACnF,yDAAyD;AACzD,EAAE;AACF,oFAAoF;AACpF,gFAAgF;AAChF,mFAAmF;AACnF,uEAAuE;AAYvE;sFACsF;AACtF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAO,GAAG,mDAAmD;QACvE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ClockPort, JobOpsPort, JobStore, LockPort, QueuePort } from "./port.js";
|
|
2
|
+
import type { JobEngineConfig } from "./config.js";
|
|
3
|
+
export interface WaitingTimeReconcileResult {
|
|
4
|
+
locked: boolean;
|
|
5
|
+
scanned: number;
|
|
6
|
+
enqueued: number;
|
|
7
|
+
failed: number;
|
|
8
|
+
skippedByMode: boolean;
|
|
9
|
+
asOf: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ReconcilerDeps {
|
|
12
|
+
jobStore: JobStore;
|
|
13
|
+
queue: QueuePort;
|
|
14
|
+
lock: LockPort;
|
|
15
|
+
ops: JobOpsPort;
|
|
16
|
+
clock: ClockPort;
|
|
17
|
+
config: JobEngineConfig;
|
|
18
|
+
/** Lock TTL — should be ~the scan interval so a crashed scanner's lock expires. */
|
|
19
|
+
lockTtlMs: number;
|
|
20
|
+
}
|
|
21
|
+
export interface Reconciler {
|
|
22
|
+
reconcileWaitingTimeJobs(asOf?: Date): Promise<WaitingTimeReconcileResult>;
|
|
23
|
+
}
|
|
24
|
+
export declare function createReconciler(deps: ReconcilerDeps): Reconciler;
|
|
25
|
+
//# sourceMappingURL=reconciler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconciler.d.ts","sourceRoot":"","sources":["../src/reconciler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAKnD,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,eAAe,CAAC;IACxB,mFAAmF;IACnF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,wBAAwB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC5E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CA4EjE"}
|