@forestadmin/workflow-executor 1.35.8 → 1.37.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/dist/adapters/forest-server-workflow-port.d.ts +6 -2
- package/dist/adapters/forest-server-workflow-port.js +36 -3
- package/dist/adapters/run-to-available-step-mapper.js +6 -1
- package/dist/adapters/server-types.d.ts +10 -6
- package/dist/adapters/server-types.js +1 -1
- package/dist/adapters/step-outcome-to-update-step-mapper.d.ts +3 -1
- package/dist/adapters/step-outcome-to-update-step-mapper.js +9 -2
- package/dist/errors.d.ts +20 -0
- package/dist/errors.js +51 -2
- package/dist/executors/base-step-executor.d.ts +1 -0
- package/dist/executors/base-step-executor.js +20 -18
- package/dist/executors/condition-step-executor.d.ts +5 -0
- package/dist/executors/condition-step-executor.js +170 -15
- package/dist/executors/iteration-run-store.d.ts +24 -0
- package/dist/executors/iteration-run-store.js +98 -0
- package/dist/executors/load-related-record-step-executor.d.ts +7 -3
- package/dist/executors/load-related-record-step-executor.js +158 -138
- package/dist/executors/per-record-step-executor.d.ts +27 -0
- package/dist/executors/per-record-step-executor.js +369 -0
- package/dist/executors/record-step-executor.d.ts +4 -0
- package/dist/executors/record-step-executor.js +44 -22
- package/dist/executors/related-record-picker.d.ts +21 -0
- package/dist/executors/related-record-picker.js +180 -0
- package/dist/executors/step-executor-factory.d.ts +3 -1
- package/dist/executors/step-executor-factory.js +49 -1
- package/dist/executors/summary/step-execution-formatters.js +5 -4
- package/dist/executors/summary/step-summary-builder.js +23 -1
- package/dist/http/mcp-oauth-credentials.d.ts +1 -1
- package/dist/http/pending-data-validators.d.ts +2 -0
- package/dist/http/pending-data-validators.js +21 -6
- package/dist/http/step-serializer.js +54 -27
- package/dist/ports/workflow-port.d.ts +12 -1
- package/dist/runner.d.ts +1 -0
- package/dist/runner.js +52 -12
- package/dist/types/execution-context.d.ts +6 -0
- package/dist/types/step-execution-data.d.ts +65 -12
- package/dist/types/step-execution-data.js +5 -1
- package/dist/types/validated/execution.d.ts +7 -117
- package/dist/types/validated/execution.js +3 -1
- package/dist/types/validated/step-definition.d.ts +23 -117
- package/dist/types/validated/step-definition.js +21 -4
- package/package.json +1 -1
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const zod_1 = require("zod");
|
|
37
|
+
const errors_1 = require("../errors");
|
|
38
|
+
const base_step_executor_1 = require("./base-step-executor");
|
|
39
|
+
const iteration_run_store_1 = __importStar(require("./iteration-run-store"));
|
|
40
|
+
const record_step_executor_1 = require("./record-step-executor");
|
|
41
|
+
const record_id_1 = require("../record-id");
|
|
42
|
+
const step_execution_data_1 = require("../types/step-execution-data");
|
|
43
|
+
const step_definition_1 = require("../types/validated/step-definition");
|
|
44
|
+
// Read before any type-specific confirmation: Get Data has none, and a failed record of any step
|
|
45
|
+
// can be retried or skipped.
|
|
46
|
+
const FailedRecordsRequestSchema = zod_1.z
|
|
47
|
+
.object({
|
|
48
|
+
failedRecords: zod_1.z.enum(['retry', 'skip']),
|
|
49
|
+
sourceRecordId: zod_1.z.string().min(1).optional(),
|
|
50
|
+
})
|
|
51
|
+
.strict();
|
|
52
|
+
// Handle the rest manually: every record not finished, the paused one included, is handed over at
|
|
53
|
+
// once, as if each had been handled by hand, so a record that failed before them still ends the
|
|
54
|
+
// step in error and comes back as Retry failed and Skip failed.
|
|
55
|
+
const HandRestRequestSchema = zod_1.z
|
|
56
|
+
.object({
|
|
57
|
+
unfinishedRecords: zod_1.z.literal('handle-manually'),
|
|
58
|
+
sourceRecordId: zod_1.z.string().min(1),
|
|
59
|
+
})
|
|
60
|
+
.strict();
|
|
61
|
+
// Runs a record step once per record its Multiple source loaded, in order, each record
|
|
62
|
+
// independently, through the single-record executor of its type.
|
|
63
|
+
class PerRecordStepExecutor {
|
|
64
|
+
constructor(context, source, createInner) {
|
|
65
|
+
this.context = context;
|
|
66
|
+
this.source = source;
|
|
67
|
+
this.createInner = createInner;
|
|
68
|
+
}
|
|
69
|
+
async execute() {
|
|
70
|
+
try {
|
|
71
|
+
return await this.run();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
this.context.logger('Error', 'Per-record step failed', {
|
|
75
|
+
...this.logCtx,
|
|
76
|
+
error: (0, errors_1.extractErrorMessage)(error),
|
|
77
|
+
});
|
|
78
|
+
if (error instanceof errors_1.WorkflowExecutorError) {
|
|
79
|
+
return this.outcome('error', (0, errors_1.toErrorOutcome)(error));
|
|
80
|
+
}
|
|
81
|
+
return this.outcome('error', { error: 'Unexpected error during step execution' });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async run() {
|
|
85
|
+
const { stepDefinition } = this.context;
|
|
86
|
+
if (stepDefinition.type === step_definition_1.StepType.LoadRelatedRecord &&
|
|
87
|
+
stepDefinition.preRecordedArgs?.multiple === true) {
|
|
88
|
+
throw new errors_1.MultipleOnPerRecordSourceError(stepDefinition.title);
|
|
89
|
+
}
|
|
90
|
+
const executions = await this.context.runStore.getStepExecutions(this.context.runId);
|
|
91
|
+
const stored = executions.find(e => e.stepIndex === this.context.stepIndex);
|
|
92
|
+
const row = (0, step_execution_data_1.isPerRecordExecution)(stored) ? stored : this.listRecords(executions);
|
|
93
|
+
const answered = this.readRequest(row);
|
|
94
|
+
await this.persist(row);
|
|
95
|
+
for (let index = 0; index < row.iterations.length; index += 1) {
|
|
96
|
+
if (row.iterations[index].finishedAt === undefined) {
|
|
97
|
+
// Records run one after the other: each one renews the lock the next one relies on.
|
|
98
|
+
// eslint-disable-next-line no-await-in-loop
|
|
99
|
+
const run = await this.runRecord(row, index, answered === index, executions);
|
|
100
|
+
if ('interrupted' in run) {
|
|
101
|
+
return { ...this.outcome('awaiting-input'), interrupted: run.interrupted };
|
|
102
|
+
}
|
|
103
|
+
if (run.status === 'awaiting-input')
|
|
104
|
+
return this.outcome('awaiting-input');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const failed = row.iterations.filter(iteration => iteration.error !== undefined);
|
|
108
|
+
if (failed.length === 0)
|
|
109
|
+
return this.outcome('success');
|
|
110
|
+
// Records failing for one kind of reason make the step fail for it: an edit, not a retry, fixes
|
|
111
|
+
// a configuration error on every record.
|
|
112
|
+
const kinds = new Set(failed.map(iteration => iteration.errorKind));
|
|
113
|
+
const [errorKind] = kinds.size === 1 ? [...kinds] : [];
|
|
114
|
+
return this.outcome('error', {
|
|
115
|
+
error: `${failed.length} of ${row.iterations.length} records failed.`,
|
|
116
|
+
...(errorKind !== undefined && { errorKind }),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
// Every record is listed when the step starts, so the run view shows the ones still to come.
|
|
120
|
+
listRecords(executions) {
|
|
121
|
+
const { root } = this.source;
|
|
122
|
+
const rootExecution = (0, base_step_executor_1.findStepExecution)(root, executions);
|
|
123
|
+
const result = rootExecution?.type === 'load-related-record' && rootExecution.executionResult;
|
|
124
|
+
const records = result && 'records' in result ? result.records : [];
|
|
125
|
+
if (records.length === 0) {
|
|
126
|
+
throw new errors_1.SourceRecordMissingError(root.stepDefinition.title, {
|
|
127
|
+
errorKind: (0, record_step_executor_1.classifyMissingSourceRecord)(rootExecution),
|
|
128
|
+
errorSourceStepIndex: root.stepOutcome.stepIndex,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
type: this.context.stepDefinition.type,
|
|
133
|
+
stepIndex: this.context.stepIndex,
|
|
134
|
+
iterations: records.map(record => ({ sourceRecordRef: record, attempt: 1 })),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// Applies a retry, skip or hand-the-rest request, or returns the index of the paused record an
|
|
138
|
+
// answer is for.
|
|
139
|
+
// An answer for any other record is dropped: the run view sent it for a pause that has moved on.
|
|
140
|
+
readRequest(row) {
|
|
141
|
+
const incoming = this.context.incomingPendingData;
|
|
142
|
+
if (incoming === undefined)
|
|
143
|
+
return undefined;
|
|
144
|
+
const request = FailedRecordsRequestSchema.safeParse(incoming);
|
|
145
|
+
if (request.success) {
|
|
146
|
+
const { failedRecords, sourceRecordId } = request.data;
|
|
147
|
+
row.iterations = row.iterations.map(iteration => {
|
|
148
|
+
if (iteration.error === undefined)
|
|
149
|
+
return iteration;
|
|
150
|
+
if (sourceRecordId !== undefined && sourceRecordId !== this.idOf(iteration)) {
|
|
151
|
+
return iteration;
|
|
152
|
+
}
|
|
153
|
+
return failedRecords === 'retry'
|
|
154
|
+
? { sourceRecordRef: iteration.sourceRecordRef, attempt: iteration.attempt + 1 }
|
|
155
|
+
: {
|
|
156
|
+
sourceRecordRef: iteration.sourceRecordRef,
|
|
157
|
+
...(iteration.selectedRecordRef && {
|
|
158
|
+
selectedRecordRef: iteration.selectedRecordRef,
|
|
159
|
+
}),
|
|
160
|
+
attempt: iteration.attempt,
|
|
161
|
+
executionResult: { skipped: true },
|
|
162
|
+
finishedAt: new Date().toISOString(),
|
|
163
|
+
};
|
|
164
|
+
});
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
const paused = row.iterations.findIndex(iteration => iteration.finishedAt === undefined);
|
|
168
|
+
const { sourceRecordId } = (incoming ?? {});
|
|
169
|
+
const isForPaused = paused >= 0 &&
|
|
170
|
+
row.iterations[paused].pendingData !== undefined &&
|
|
171
|
+
sourceRecordId === this.idOf(row.iterations[paused]);
|
|
172
|
+
if (isForPaused && HandRestRequestSchema.safeParse(incoming).success) {
|
|
173
|
+
const finishedAt = new Date().toISOString();
|
|
174
|
+
row.iterations = row.iterations.map(iteration => iteration.finishedAt !== undefined
|
|
175
|
+
? iteration
|
|
176
|
+
: {
|
|
177
|
+
sourceRecordRef: iteration.sourceRecordRef,
|
|
178
|
+
...(iteration.selectedRecordRef && {
|
|
179
|
+
selectedRecordRef: iteration.selectedRecordRef,
|
|
180
|
+
}),
|
|
181
|
+
attempt: iteration.attempt,
|
|
182
|
+
userConfirmation: { userConfirmed: false },
|
|
183
|
+
executionResult: { skipped: true },
|
|
184
|
+
finishedAt,
|
|
185
|
+
});
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
if (isForPaused)
|
|
189
|
+
return paused;
|
|
190
|
+
this.context.logger('Info', 'Dropped an answer for a record that is not the one paused', {
|
|
191
|
+
...this.logCtx,
|
|
192
|
+
sourceRecordId: typeof sourceRecordId === 'string' ? sourceRecordId : null,
|
|
193
|
+
});
|
|
194
|
+
return undefined;
|
|
195
|
+
}
|
|
196
|
+
async runRecord(row, index, answered, executions) {
|
|
197
|
+
// An answered record runs before any hand-back: its answer lives only in this dispatch, and
|
|
198
|
+
// the claim that brought it is fresh.
|
|
199
|
+
const decision = answered
|
|
200
|
+
? 'continue'
|
|
201
|
+
: (await this.context.runControl?.beforeRecord()) ?? 'continue';
|
|
202
|
+
if (decision === 'stop')
|
|
203
|
+
return { interrupted: 'stopped' };
|
|
204
|
+
if (decision === 'yield')
|
|
205
|
+
return { interrupted: 'yielded' };
|
|
206
|
+
const { sourceRecordRef } = row.iterations[index];
|
|
207
|
+
if (!this.reachesRecord(sourceRecordRef, executions)) {
|
|
208
|
+
row.iterations[index] = {
|
|
209
|
+
...row.iterations[index],
|
|
210
|
+
executionResult: { skipped: true },
|
|
211
|
+
finishedAt: new Date().toISOString(),
|
|
212
|
+
};
|
|
213
|
+
await this.persist(row);
|
|
214
|
+
return { status: 'success' };
|
|
215
|
+
}
|
|
216
|
+
// A restart cut this record's change off after it started: it may have landed, so the record
|
|
217
|
+
// fails saying so, and only a retry, which drops the marker, runs it again.
|
|
218
|
+
if (row.iterations[index].idempotencyPhase === 'executing') {
|
|
219
|
+
return this.failRecord(row, index, new errors_1.RecordChangeInterruptedError().userMessage);
|
|
220
|
+
}
|
|
221
|
+
const store = new iteration_run_store_1.default(this.context.runStore, this.context.stepIndex, sourceRecordRef, {
|
|
222
|
+
get: () => row.iterations[index],
|
|
223
|
+
set: async (iteration) => {
|
|
224
|
+
row.iterations[index] = iteration;
|
|
225
|
+
await this.persist(row);
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
const { incomingPendingData } = this.context;
|
|
229
|
+
const answer = answered ? this.withoutRecordId(incomingPendingData) : undefined;
|
|
230
|
+
const inner = this.createInner({
|
|
231
|
+
...this.context,
|
|
232
|
+
runStore: store,
|
|
233
|
+
incomingPendingData: answer,
|
|
234
|
+
stepTimeoutS: undefined,
|
|
235
|
+
perRecordLabel: await this.labelOf(sourceRecordRef),
|
|
236
|
+
});
|
|
237
|
+
const { stepOutcome } = await this.withTimeout(inner.execute(), store, () => row.iterations[index]);
|
|
238
|
+
if (stepOutcome.status === 'awaiting-input') {
|
|
239
|
+
await this.persist(row);
|
|
240
|
+
return { status: 'awaiting-input' };
|
|
241
|
+
}
|
|
242
|
+
if (stepOutcome.status === 'error') {
|
|
243
|
+
return this.failRecord(row, index, stepOutcome.error ?? 'Unexpected error during step execution', stepOutcome.errorKind);
|
|
244
|
+
}
|
|
245
|
+
row.iterations[index] = { ...row.iterations[index], finishedAt: new Date().toISOString() };
|
|
246
|
+
await this.persist(row);
|
|
247
|
+
return { status: stepOutcome.status };
|
|
248
|
+
}
|
|
249
|
+
async failRecord(row, index, error, errorKind) {
|
|
250
|
+
row.iterations[index] = {
|
|
251
|
+
...row.iterations[index],
|
|
252
|
+
error,
|
|
253
|
+
...(errorKind !== undefined && { errorKind }),
|
|
254
|
+
finishedAt: new Date().toISOString(),
|
|
255
|
+
};
|
|
256
|
+
await this.persist(row);
|
|
257
|
+
return { status: 'error' };
|
|
258
|
+
}
|
|
259
|
+
// A record whose per-record source found nothing for it is skipped by the steps after it.
|
|
260
|
+
reachesRecord(sourceRecordRef, executions) {
|
|
261
|
+
const { root, direct } = this.source;
|
|
262
|
+
if (direct === root)
|
|
263
|
+
return true;
|
|
264
|
+
const execution = (0, base_step_executor_1.findStepExecution)(direct, executions);
|
|
265
|
+
if (!(0, step_execution_data_1.isPerRecordExecution)(execution))
|
|
266
|
+
return false;
|
|
267
|
+
const result = execution.iterations.find(iteration => (0, iteration_run_store_1.isSameRecord)(iteration.sourceRecordRef, sourceRecordRef))?.executionResult;
|
|
268
|
+
return Boolean(result && 'record' in result);
|
|
269
|
+
}
|
|
270
|
+
// The step timeout applies to each record. The race does not abort the call it gives up on, so
|
|
271
|
+
// the store it writes through is abandoned and its late result is never saved.
|
|
272
|
+
async withTimeout(execution, store, iteration) {
|
|
273
|
+
const timeoutS = this.context.stepTimeoutS;
|
|
274
|
+
if (!timeoutS || timeoutS <= 0)
|
|
275
|
+
return execution;
|
|
276
|
+
let timer;
|
|
277
|
+
let timedOut = false;
|
|
278
|
+
// The abandoned call still ends, and only this log says how: a change it had started may land.
|
|
279
|
+
execution.then(result => {
|
|
280
|
+
if (!timedOut)
|
|
281
|
+
return;
|
|
282
|
+
this.context.logger('Warn', 'A record past its step timeout finished late', {
|
|
283
|
+
...this.logCtx,
|
|
284
|
+
sourceRecordId: this.idOf(iteration()),
|
|
285
|
+
stepStatus: result.stepOutcome.status,
|
|
286
|
+
error: result.stepOutcome.error,
|
|
287
|
+
});
|
|
288
|
+
}, error => {
|
|
289
|
+
if (!timedOut)
|
|
290
|
+
return;
|
|
291
|
+
this.context.logger('Warn', 'A record past its step timeout failed late', {
|
|
292
|
+
...this.logCtx,
|
|
293
|
+
sourceRecordId: this.idOf(iteration()),
|
|
294
|
+
error: (0, errors_1.extractErrorMessage)(error),
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
try {
|
|
298
|
+
return await Promise.race([
|
|
299
|
+
execution,
|
|
300
|
+
new Promise(resolve => {
|
|
301
|
+
timer = setTimeout(() => {
|
|
302
|
+
timedOut = true;
|
|
303
|
+
store.abandon();
|
|
304
|
+
// Past its write-ahead marker, the change has started and may still land.
|
|
305
|
+
const changeStarted = iteration().idempotencyPhase === 'executing';
|
|
306
|
+
this.context.logger('Error', `Step execution exceeded timeout of ${timeoutS}s`, {
|
|
307
|
+
...this.logCtx,
|
|
308
|
+
sourceRecordId: this.idOf(iteration()),
|
|
309
|
+
timeoutS,
|
|
310
|
+
changeStarted,
|
|
311
|
+
});
|
|
312
|
+
const error = changeStarted
|
|
313
|
+
? new errors_1.RecordChangeInterruptedError()
|
|
314
|
+
: new errors_1.StepTimeoutError(timeoutS);
|
|
315
|
+
resolve(this.outcome('error', { error: error.userMessage }));
|
|
316
|
+
}, timeoutS * 1000);
|
|
317
|
+
}),
|
|
318
|
+
]);
|
|
319
|
+
}
|
|
320
|
+
finally {
|
|
321
|
+
if (timer)
|
|
322
|
+
clearTimeout(timer);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
withoutRecordId(pendingData) {
|
|
326
|
+
const { sourceRecordId, ...answer } = pendingData;
|
|
327
|
+
return answer;
|
|
328
|
+
}
|
|
329
|
+
idOf(iteration) {
|
|
330
|
+
return (0, record_id_1.serializeRecordId)(iteration.sourceRecordRef.recordId);
|
|
331
|
+
}
|
|
332
|
+
// The label only names the record to the AI, so a schema that cannot be read falls back to the
|
|
333
|
+
// technical name: the record's own run reads it again and reports the failure on that record.
|
|
334
|
+
async labelOf(record) {
|
|
335
|
+
const id = record.recordId.join(', ');
|
|
336
|
+
try {
|
|
337
|
+
const schema = await this.context.schemaResolver.resolve(record.collectionName);
|
|
338
|
+
return `${schema.collectionDisplayName} #${id}`;
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
this.context.logger('Warn', 'Could not read the schema naming a record for the AI', {
|
|
342
|
+
...this.logCtx,
|
|
343
|
+
collectionName: record.collectionName,
|
|
344
|
+
error: (0, errors_1.extractErrorMessage)(error),
|
|
345
|
+
});
|
|
346
|
+
return `${record.collectionName} #${id}`;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
persist(row) {
|
|
350
|
+
return this.context.runStore.saveStepExecution(this.context.runId, row);
|
|
351
|
+
}
|
|
352
|
+
outcome(status, extra = {}) {
|
|
353
|
+
return {
|
|
354
|
+
stepOutcome: {
|
|
355
|
+
type: 'record',
|
|
356
|
+
stepId: this.context.stepId,
|
|
357
|
+
stepIndex: this.context.stepIndex,
|
|
358
|
+
status,
|
|
359
|
+
...extra,
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
get logCtx() {
|
|
364
|
+
const { runId, stepId, stepIndex, stepDefinition } = this.context;
|
|
365
|
+
return { runId, stepId, stepIndex, stepType: stepDefinition.type };
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
exports.default = PerRecordStepExecutor;
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyLXJlY29yZC1zdGVwLWV4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9wZXItcmVjb3JkLXN0ZXAtZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQSw2QkFBd0I7QUFFeEIsc0NBUW1CO0FBQ25CLDZEQUF5RDtBQUN6RCw2RUFBd0U7QUFDeEUsaUVBQXFFO0FBQ3JFLDRDQUFpRDtBQUNqRCxzRUFBb0U7QUFDcEUsd0VBQThEO0FBRTlELGlHQUFpRztBQUNqRyw2QkFBNkI7QUFDN0IsTUFBTSwwQkFBMEIsR0FBRyxPQUFDO0tBQ2pDLE1BQU0sQ0FBQztJQUNOLGFBQWEsRUFBRSxPQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLGNBQWMsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtDQUM3QyxDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixrR0FBa0c7QUFDbEcsZ0dBQWdHO0FBQ2hHLGdFQUFnRTtBQUNoRSxNQUFNLHFCQUFxQixHQUFHLE9BQUM7S0FDNUIsTUFBTSxDQUFDO0lBQ04saUJBQWlCLEVBQUUsT0FBQyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztJQUMvQyxjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Q0FDbEMsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBV1osdUZBQXVGO0FBQ3ZGLGlFQUFpRTtBQUNqRSxNQUFxQixxQkFBcUI7SUFLeEMsWUFDRSxPQUF5QixFQUN6QixNQUF1QixFQUN2QixXQUF5RDtRQUV6RCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFH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
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import type { StepExecutionResult } from '../types/execution-context';
|
|
2
|
+
import type { StepExecutionData } from '../types/step-execution-data';
|
|
2
3
|
import type { CollectionSchema, FieldSchema, RecordRef } from '../types/validated/collection';
|
|
4
|
+
import type { Step } from '../types/validated/execution';
|
|
3
5
|
import type { StepDefinition } from '../types/validated/step-definition';
|
|
4
6
|
import type { ErrorKind, RecordStepStatus } from '../types/validated/step-outcome';
|
|
5
7
|
import BaseStepExecutor from './base-step-executor';
|
|
8
|
+
export declare function classifyMissingSourceRecord(execution?: StepExecutionData): ErrorKind | undefined;
|
|
9
|
+
export declare function findPinnedLoadStep(previousSteps: readonly Step[], stepId: string, frameStepIndexes?: number[]): Step | undefined;
|
|
6
10
|
export default abstract class RecordStepExecutor<TStep extends StepDefinition = StepDefinition> extends BaseStepExecutor<TStep> {
|
|
7
11
|
protected buildOutcomeResult(outcome: {
|
|
8
12
|
status: RecordStepStatus;
|
|
@@ -3,10 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.classifyMissingSourceRecord = classifyMissingSourceRecord;
|
|
7
|
+
exports.findPinnedLoadStep = findPinnedLoadStep;
|
|
6
8
|
const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
7
9
|
const zod_1 = require("zod");
|
|
8
10
|
const errors_1 = require("../errors");
|
|
9
11
|
const base_step_executor_1 = __importDefault(require("./base-step-executor"));
|
|
12
|
+
const step_execution_data_1 = require("../types/step-execution-data");
|
|
10
13
|
const step_definition_1 = require("../types/validated/step-definition");
|
|
11
14
|
// Candidates passed over are the operator's call, and none at all is a source the operator can go
|
|
12
15
|
// back to. Neither is a configuration fault, so neither is classified as one.
|
|
@@ -23,6 +26,31 @@ function classifyMissingSourceRecord(execution) {
|
|
|
23
26
|
// Whether it paused or recorded a decline, the candidate list says whether there was a choice.
|
|
24
27
|
return pendingData.availableRecordIds.length > 0 ? 'operator' : 'empty-source';
|
|
25
28
|
}
|
|
29
|
+
// The step a pin names: the latest Load Related Record with that id, because a loop repeats ids,
|
|
30
|
+
// and only inside the frame when one is given, since step ids are unique only per workflow.
|
|
31
|
+
function findPinnedLoadStep(previousSteps, stepId, frameStepIndexes) {
|
|
32
|
+
return previousSteps
|
|
33
|
+
.filter(step => step.stepDefinition.type === step_definition_1.StepType.LoadRelatedRecord &&
|
|
34
|
+
step.stepOutcome.stepId === stepId &&
|
|
35
|
+
(frameStepIndexes === undefined || frameStepIndexes.includes(step.stepOutcome.stepIndex)))
|
|
36
|
+
.at(-1);
|
|
37
|
+
}
|
|
38
|
+
// Every record a load-related-record execution loaded: one, several, or one per record it ran for.
|
|
39
|
+
function loadedRecordsOf(execution) {
|
|
40
|
+
if ((0, step_execution_data_1.isPerRecordExecution)(execution)) {
|
|
41
|
+
return execution.iterations.flatMap(iteration => {
|
|
42
|
+
const result = iteration.executionResult;
|
|
43
|
+
return result && 'record' in result ? [result.record] : [];
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (execution?.type !== 'load-related-record' || execution.executionResult === undefined) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
const result = execution.executionResult;
|
|
50
|
+
if ('records' in result)
|
|
51
|
+
return result.records;
|
|
52
|
+
return 'record' in result ? [result.record] : [];
|
|
53
|
+
}
|
|
26
54
|
class RecordStepExecutor extends base_step_executor_1.default {
|
|
27
55
|
buildOutcomeResult(outcome) {
|
|
28
56
|
return {
|
|
@@ -81,20 +109,22 @@ class RecordStepExecutor extends base_step_executor_1.default {
|
|
|
81
109
|
}
|
|
82
110
|
return record;
|
|
83
111
|
}
|
|
84
|
-
// Undefined on a miss so each caller names its own error
|
|
85
|
-
// repeats ids. A call's pin passes its frame, since step ids are unique only per workflow.
|
|
112
|
+
// Undefined on a miss so each caller names its own error. A call's pin passes its frame.
|
|
86
113
|
async resolveStepRecordRef(stepId, frameStepIndexes) {
|
|
87
|
-
const
|
|
88
|
-
step.stepOutcome.stepId === stepId &&
|
|
89
|
-
(frameStepIndexes === undefined || frameStepIndexes.includes(step.stepOutcome.stepIndex)));
|
|
90
|
-
const sourceStep = matches[matches.length - 1];
|
|
114
|
+
const sourceStep = findPinnedLoadStep(this.context.previousSteps, stepId, frameStepIndexes);
|
|
91
115
|
if (sourceStep) {
|
|
92
116
|
const stepExecutions = await this.context.runStore.getStepExecutions(this.context.runId);
|
|
93
117
|
const execution = this.resolveStepExecution(sourceStep, stepExecutions);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
118
|
+
// A step that ran once per record keeps what it loaded in its iterations, not in a result.
|
|
119
|
+
if ((0, step_execution_data_1.isPerRecordExecution)(execution)) {
|
|
120
|
+
throw new errors_1.SourceLoadsSeveralRecordsError(sourceStep.stepDefinition.title);
|
|
121
|
+
}
|
|
122
|
+
const result = execution?.type === 'load-related-record' && execution.executionResult;
|
|
123
|
+
if (result && 'record' in result)
|
|
124
|
+
return result.record;
|
|
125
|
+
// A step's own pin on a Multiple step runs once per record, so only a call's pin gets here.
|
|
126
|
+
if (result && 'records' in result) {
|
|
127
|
+
throw new errors_1.SourceLoadsSeveralRecordsError(sourceStep.stepDefinition.title);
|
|
98
128
|
}
|
|
99
129
|
// The source step exists but loaded nothing → clear "no source record" message,
|
|
100
130
|
// distinct from a config pointing at a non-existent step.
|
|
@@ -110,17 +140,9 @@ class RecordStepExecutor extends base_step_executor_1.default {
|
|
|
110
140
|
// originalStepIndex.
|
|
111
141
|
async getAvailableRecordRefs() {
|
|
112
142
|
const stepExecutions = await this.context.runStore.getStepExecutions(this.context.runId);
|
|
113
|
-
const relatedRecords = this.context.previousSteps.flatMap(step =>
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
const execution = this.resolveStepExecution(step, stepExecutions);
|
|
117
|
-
if (execution?.type === 'load-related-record' &&
|
|
118
|
-
execution.executionResult !== undefined &&
|
|
119
|
-
'record' in execution.executionResult) {
|
|
120
|
-
return [execution.executionResult.record];
|
|
121
|
-
}
|
|
122
|
-
return [];
|
|
123
|
-
});
|
|
143
|
+
const relatedRecords = this.context.previousSteps.flatMap(step => step.stepDefinition.type === step_definition_1.StepType.LoadRelatedRecord
|
|
144
|
+
? loadedRecordsOf(this.resolveStepExecution(step, stepExecutions))
|
|
145
|
+
: []);
|
|
124
146
|
return [this.context.baseRecordRef, ...relatedRecords];
|
|
125
147
|
}
|
|
126
148
|
getCollectionSchema(collectionName) {
|
|
@@ -181,4 +203,4 @@ class RecordStepExecutor extends base_step_executor_1.default {
|
|
|
181
203
|
}
|
|
182
204
|
}
|
|
183
205
|
exports.default = RecordStepExecutor;
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
206
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXN0ZXAtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0b3JzL3JlY29yZC1zdGVwLWV4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBeUJBLGtFQWFDO0FBSUQsZ0RBYUM7QUFoREQsb0RBQTJGO0FBQzNGLDZCQUF3QjtBQUV4QixzQ0FRbUI7QUFDbkIsOEVBQW9EO0FBQ3BELHNFQUFvRTtBQUNwRSx3RUFBc0Y7QUFFdEYsa0dBQWtHO0FBQ2xHLDhFQUE4RTtBQUM5RSxTQUFnQiwyQkFBMkIsQ0FBQyxTQUE2QjtJQUN2RSxJQUFJLFNBQVMsRUFBRSxJQUFJLEtBQUsscUJBQXFCO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFaEUsTUFBTSxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsR0FBRyxTQUFTLENBQUM7SUFFbkQsK0ZBQStGO0lBQy9GLElBQUksZUFBZSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQWUsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXZGLG9HQUFvRztJQUNwRyxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sZUFBZSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFcEYsK0ZBQStGO0lBQy9GLE9BQU8sV0FBVyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxpR0FBaUc7QUFDakcsNEZBQTRGO0FBQzVGLFNBQWdCLGtCQUFrQixDQUNoQyxhQUE4QixFQUM5QixNQUFjLEVBQ2QsZ0JBQTJCO0lBRTNCLE9BQU8sYUFBYTtTQUNqQixNQUFNLENBQ0wsSUFBSSxDQUFDLEVBQUUsQ0FDTCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksS0FBSywwQkFBUSxDQUFD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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CollectionSchema, RecordData } from '../types/validated/collection';
|
|
2
|
+
import type { BaseMessage } from '@forestadmin/ai-proxy';
|
|
3
|
+
import { DynamicStructuredTool, SystemMessage } from '@forestadmin/ai-proxy';
|
|
4
|
+
export interface PickerAi {
|
|
5
|
+
invoke<T>(messages: BaseMessage[], tool: DynamicStructuredTool): Promise<T>;
|
|
6
|
+
contextMessage: SystemMessage;
|
|
7
|
+
warn(message: string, context: Record<string, unknown>): void;
|
|
8
|
+
}
|
|
9
|
+
/** AI call 1 for HasMany: selects the most relevant fields to compare candidates. */
|
|
10
|
+
export declare function selectRelevantFields(ai: PickerAi, schema: CollectionSchema, prompt: string | undefined): Promise<string[]>;
|
|
11
|
+
/** AI call 2 for a Multiple step: picks every candidate relevant to the request. */
|
|
12
|
+
export declare function selectRelevantRecordIndexes(ai: PickerAi, candidates: RecordData[], fieldNames: string[], prompt: string | undefined, collectionDisplayName: string): Promise<{
|
|
13
|
+
indexes: number[];
|
|
14
|
+
confident: boolean;
|
|
15
|
+
sawAll: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function selectBestRecordIndex(ai: PickerAi, candidates: RecordData[], fieldNames: string[], prompt: string | undefined, allowNone?: boolean): Promise<{
|
|
18
|
+
index: number;
|
|
19
|
+
confident: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=related-record-picker.d.ts.map
|