@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.
Files changed (42) hide show
  1. package/dist/adapters/forest-server-workflow-port.d.ts +6 -2
  2. package/dist/adapters/forest-server-workflow-port.js +36 -3
  3. package/dist/adapters/run-to-available-step-mapper.js +6 -1
  4. package/dist/adapters/server-types.d.ts +10 -6
  5. package/dist/adapters/server-types.js +1 -1
  6. package/dist/adapters/step-outcome-to-update-step-mapper.d.ts +3 -1
  7. package/dist/adapters/step-outcome-to-update-step-mapper.js +9 -2
  8. package/dist/errors.d.ts +20 -0
  9. package/dist/errors.js +51 -2
  10. package/dist/executors/base-step-executor.d.ts +1 -0
  11. package/dist/executors/base-step-executor.js +20 -18
  12. package/dist/executors/condition-step-executor.d.ts +5 -0
  13. package/dist/executors/condition-step-executor.js +170 -15
  14. package/dist/executors/iteration-run-store.d.ts +24 -0
  15. package/dist/executors/iteration-run-store.js +98 -0
  16. package/dist/executors/load-related-record-step-executor.d.ts +7 -3
  17. package/dist/executors/load-related-record-step-executor.js +158 -138
  18. package/dist/executors/per-record-step-executor.d.ts +27 -0
  19. package/dist/executors/per-record-step-executor.js +369 -0
  20. package/dist/executors/record-step-executor.d.ts +4 -0
  21. package/dist/executors/record-step-executor.js +44 -22
  22. package/dist/executors/related-record-picker.d.ts +21 -0
  23. package/dist/executors/related-record-picker.js +180 -0
  24. package/dist/executors/step-executor-factory.d.ts +3 -1
  25. package/dist/executors/step-executor-factory.js +49 -1
  26. package/dist/executors/summary/step-execution-formatters.js +5 -4
  27. package/dist/executors/summary/step-summary-builder.js +23 -1
  28. package/dist/http/mcp-oauth-credentials.d.ts +1 -1
  29. package/dist/http/pending-data-validators.d.ts +2 -0
  30. package/dist/http/pending-data-validators.js +21 -6
  31. package/dist/http/step-serializer.js +54 -27
  32. package/dist/ports/workflow-port.d.ts +12 -1
  33. package/dist/runner.d.ts +1 -0
  34. package/dist/runner.js +52 -12
  35. package/dist/types/execution-context.d.ts +6 -0
  36. package/dist/types/step-execution-data.d.ts +65 -12
  37. package/dist/types/step-execution-data.js +5 -1
  38. package/dist/types/validated/execution.d.ts +7 -117
  39. package/dist/types/validated/execution.js +3 -1
  40. package/dist/types/validated/step-definition.d.ts +23 -117
  41. package/dist/types/validated/step-definition.js +21 -4
  42. 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, and the latest match because a loop
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 matches = this.context.previousSteps.filter(step => step.stepDefinition.type === step_definition_1.StepType.LoadRelatedRecord &&
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
- if (execution?.type === 'load-related-record' &&
95
- execution.executionResult !== undefined &&
96
- 'record' in execution.executionResult) {
97
- return execution.executionResult.record;
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
- if (step.stepDefinition.type !== step_definition_1.StepType.LoadRelatedRecord)
115
- return [];
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXN0ZXAtZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0b3JzL3JlY29yZC1zdGVwLWV4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsb0RBQTJGO0FBQzNGLDZCQUF3QjtBQUV4QixzQ0FPbUI7QUFDbkIsOEVBQW9EO0FBQ3BELHdFQUFzRjtBQUV0RixrR0FBa0c7QUFDbEcsOEVBQThFO0FBQzlFLFNBQVMsMkJBQTJCLENBQUMsU0FBNkI7SUFDaEUsSUFBSSxTQUFTLEVBQUUsSUFBSSxLQUFLLHFCQUFxQjtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWhFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBRW5ELCtGQUErRjtJQUMvRixJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxlQUFlLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV2RixvR0FBb0c7SUFDcEcsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPLGVBQWUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRXBGLCtGQUErRjtJQUMvRixPQUFPLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztBQUNqRixDQUFDO0FBRUQsTUFBOEIsa0JBRTVCLFNBQVEsNEJBQXVCO0lBQ3JCLGtCQUFrQixDQUFDLE9BSzVCO1FBQ0MsT0FBTztZQUNMLFdBQVcsRUFBRTtnQkFDWCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNO2dCQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUNqQyxHQUFHLE9BQU87YUFDWDtTQUNG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
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