@forestadmin/workflow-executor 1.36.0 → 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/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 +4 -0
- package/dist/executors/condition-step-executor.js +164 -18
- 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 +47 -2
- package/dist/types/step-execution-data.js +5 -1
- package/dist/types/validated/execution.d.ts +4 -0
- package/dist/types/validated/execution.js +3 -1
- package/dist/types/validated/step-definition.d.ts +10 -0
- package/dist/types/validated/step-definition.js +7 -2
- package/package.json +1 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectRelevantFields = selectRelevantFields;
|
|
4
|
+
exports.selectRelevantRecordIndexes = selectRelevantRecordIndexes;
|
|
5
|
+
exports.selectBestRecordIndex = selectBestRecordIndex;
|
|
6
|
+
const ai_proxy_1 = require("@forestadmin/ai-proxy");
|
|
7
|
+
const zod_1 = require("zod");
|
|
8
|
+
const errors_1 = require("../errors");
|
|
9
|
+
const SELECT_FIELDS_SYSTEM_PROMPT = `You are an AI agent selecting the most relevant fields to identify a related record.
|
|
10
|
+
Choose the fields that are most useful for determining which record best matches the user request.`;
|
|
11
|
+
const SELECT_RECORD_SYSTEM_PROMPT = `You are an AI agent selecting the most relevant related record from a list of candidates.
|
|
12
|
+
Choose the record that best matches the user request based on the provided field values.`;
|
|
13
|
+
const SELECT_RECORDS_SYSTEM_PROMPT = `You are an AI agent selecting the related records relevant to a user request from a list of candidates.
|
|
14
|
+
Choose every record that matches the request based on the provided field values, and none that does not.`;
|
|
15
|
+
// Only appended when -1 is a valid answer. The base prompt tells the AI to always pick, so without
|
|
16
|
+
// this it forces a weak match on an impossible request instead of declining.
|
|
17
|
+
const SELECT_RECORD_NONE_ALLOWED_PROMPT = `If the request states a specific requirement that NO candidate satisfies, return -1 instead of forcing an arbitrary or loosely-related match. Do NOT return -1 merely because a match is imperfect — only when no candidate genuinely fits the request.`;
|
|
18
|
+
// Bound only what is sent to the AI in selectBestRecordIndex — the full candidate list is
|
|
19
|
+
// always returned to the front via availableRecordIds. These cap the prompt size, not the data.
|
|
20
|
+
const MAX_RELEVANT_FIELDS = 6;
|
|
21
|
+
const MAX_FIELD_VALUE_LENGTH = 80; // per-field serialized length before truncation
|
|
22
|
+
const MAX_AI_CANDIDATES_CHARS = 16000; // global budget for the `Candidates:` block (~4k tokens)
|
|
23
|
+
function clampFieldValue(value) {
|
|
24
|
+
const serialized = typeof value === 'string' ? value : JSON.stringify(value) ?? '';
|
|
25
|
+
if (serialized.length <= MAX_FIELD_VALUE_LENGTH)
|
|
26
|
+
return value;
|
|
27
|
+
return `${serialized.slice(0, MAX_FIELD_VALUE_LENGTH)}… (truncated)`;
|
|
28
|
+
}
|
|
29
|
+
/** AI call 1 for HasMany: selects the most relevant fields to compare candidates. */
|
|
30
|
+
async function selectRelevantFields(ai, schema, prompt) {
|
|
31
|
+
const nonRelationFields = schema.fields.filter(f => !f.isRelationship);
|
|
32
|
+
if (nonRelationFields.length === 0)
|
|
33
|
+
return [];
|
|
34
|
+
// Use displayName in both the enum and the prompt for consistency — the AI sees human-readable
|
|
35
|
+
// names throughout. Results are mapped back to technical fieldNames before returning.
|
|
36
|
+
const displayNames = nonRelationFields.map(f => f.displayName);
|
|
37
|
+
const tool = new ai_proxy_1.DynamicStructuredTool({
|
|
38
|
+
name: 'select-fields',
|
|
39
|
+
description: 'Select the most relevant fields to identify the right record.',
|
|
40
|
+
schema: zod_1.z.object({
|
|
41
|
+
fieldNames: zod_1.z
|
|
42
|
+
.array(zod_1.z.enum(displayNames))
|
|
43
|
+
.min(1)
|
|
44
|
+
.max(MAX_RELEVANT_FIELDS)
|
|
45
|
+
.describe(`The ${MAX_RELEVANT_FIELDS} fields most useful for identifying the relevant record`),
|
|
46
|
+
}),
|
|
47
|
+
func: undefined,
|
|
48
|
+
});
|
|
49
|
+
const messages = [
|
|
50
|
+
ai.contextMessage,
|
|
51
|
+
new ai_proxy_1.SystemMessage(SELECT_FIELDS_SYSTEM_PROMPT),
|
|
52
|
+
new ai_proxy_1.SystemMessage(`The related records are from the "${schema.collectionDisplayName}" collection. ` +
|
|
53
|
+
`Available fields: ${nonRelationFields.map(f => f.displayName).join(', ')}.`),
|
|
54
|
+
new ai_proxy_1.HumanMessage(`**Request**: ${prompt ?? 'Select the most relevant record.'}`),
|
|
55
|
+
];
|
|
56
|
+
const { fieldNames: selectedDisplayNames } = await ai.invoke(messages, tool);
|
|
57
|
+
// Zod's .min(1) shapes the prompt but is NOT validated against the AI response.
|
|
58
|
+
// Guard explicitly to avoid silently passing all fields to selectBestRecordIndex.
|
|
59
|
+
if (selectedDisplayNames.length === 0) {
|
|
60
|
+
throw new errors_1.InvalidAIResponseError(`AI returned no field names for field selection in collection "${schema.collectionName}"`);
|
|
61
|
+
}
|
|
62
|
+
// Map display names back to technical field names — values in RecordData are keyed by fieldName.
|
|
63
|
+
// .max() shapes the prompt only (not validated against the response), so cap explicitly.
|
|
64
|
+
return selectedDisplayNames
|
|
65
|
+
.slice(0, MAX_RELEVANT_FIELDS)
|
|
66
|
+
.map(dn => nonRelationFields.find(f => f.displayName === dn)?.fieldName ?? dn);
|
|
67
|
+
}
|
|
68
|
+
// Bound the prompt only — the full candidate list is still returned upstream. Accumulate
|
|
69
|
+
// lines until the global budget is reached (always keep at least the first candidate).
|
|
70
|
+
function candidateLines(candidates, fieldNames) {
|
|
71
|
+
const filteredCandidates = candidates.map((c, i) => {
|
|
72
|
+
const entries = Object.entries(c.values).filter(([k]) => fieldNames.length === 0 || fieldNames.includes(k));
|
|
73
|
+
return {
|
|
74
|
+
index: i,
|
|
75
|
+
values: Object.fromEntries(entries.map(([k, v]) => [k, clampFieldValue(v)])),
|
|
76
|
+
};
|
|
77
|
+
});
|
|
78
|
+
const lines = [];
|
|
79
|
+
let usedChars = 0;
|
|
80
|
+
for (const c of filteredCandidates) {
|
|
81
|
+
const line = `[${c.index}] ${JSON.stringify(c.values)}`;
|
|
82
|
+
if (lines.length > 0 && usedChars + line.length > MAX_AI_CANDIDATES_CHARS)
|
|
83
|
+
break;
|
|
84
|
+
lines.push(line);
|
|
85
|
+
usedChars += line.length + 1;
|
|
86
|
+
}
|
|
87
|
+
return { lines, shown: lines.length, truncated: lines.length < candidates.length };
|
|
88
|
+
}
|
|
89
|
+
/** AI call 2 for a Multiple step: picks every candidate relevant to the request. */
|
|
90
|
+
async function selectRelevantRecordIndexes(ai, candidates, fieldNames, prompt, collectionDisplayName) {
|
|
91
|
+
const { lines, shown, truncated } = candidateLines(candidates, fieldNames);
|
|
92
|
+
const maxIndex = shown - 1;
|
|
93
|
+
const tool = new ai_proxy_1.DynamicStructuredTool({
|
|
94
|
+
name: 'select-records-by-content',
|
|
95
|
+
description: 'Select every related record relevant to the request, by index.',
|
|
96
|
+
schema: zod_1.z.object({
|
|
97
|
+
recordIndexes: zod_1.z
|
|
98
|
+
.array(zod_1.z.number().int().min(0).max(maxIndex))
|
|
99
|
+
.describe(`0-based indexes of the records relevant to the request (0 to ${maxIndex}), empty when none is`),
|
|
100
|
+
confident: zod_1.z
|
|
101
|
+
.boolean()
|
|
102
|
+
.describe('true when the records picked clearly match the request; false when unsure which ' +
|
|
103
|
+
'records the request means'),
|
|
104
|
+
reasoning: zod_1.z.string().describe('Why these records were chosen (or why none is relevant)'),
|
|
105
|
+
}),
|
|
106
|
+
func: undefined,
|
|
107
|
+
});
|
|
108
|
+
const messages = [
|
|
109
|
+
ai.contextMessage,
|
|
110
|
+
new ai_proxy_1.SystemMessage(SELECT_RECORDS_SYSTEM_PROMPT),
|
|
111
|
+
// Without it the AI judges whether each candidate is what the request names: "the dvds priced
|
|
112
|
+
// above $8" over titles reading like bicycles drew "not confident they are DVDs", or no pick.
|
|
113
|
+
new ai_proxy_1.SystemMessage(`The related records are from the "${collectionDisplayName}" collection.`),
|
|
114
|
+
new ai_proxy_1.SystemMessage(`Candidates:\n${lines.join('\n')}`),
|
|
115
|
+
new ai_proxy_1.HumanMessage(`**Request**: ${prompt ?? 'Select the relevant records.'}`),
|
|
116
|
+
];
|
|
117
|
+
const { recordIndexes, confident } = await ai.invoke(messages, tool);
|
|
118
|
+
// The Zod bounds shape the tool prompt only; this guard is the runtime enforcement.
|
|
119
|
+
if (!Array.isArray(recordIndexes) ||
|
|
120
|
+
recordIndexes.some(index => !Number.isInteger(index) || index < 0 || index > maxIndex)) {
|
|
121
|
+
throw new errors_1.InvalidAIResponseError(`AI selected record indexes ${JSON.stringify(recordIndexes)} outside 0-${maxIndex}`);
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
indexes: [...new Set(recordIndexes)],
|
|
125
|
+
confident: confident !== false,
|
|
126
|
+
sawAll: !truncated,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
async function selectBestRecordIndex(ai, candidates, fieldNames, prompt, allowNone = false) {
|
|
130
|
+
const { lines, shown, truncated } = candidateLines(candidates, fieldNames);
|
|
131
|
+
if (truncated) {
|
|
132
|
+
ai.warn('load-related-record: candidate list truncated for AI prompt', {
|
|
133
|
+
shown,
|
|
134
|
+
total: candidates.length,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// "None relevant" (-1) is only trustworthy when the AI saw the whole list. If it was truncated,
|
|
138
|
+
// force a pick from what was shown — otherwise a match in the unseen tail would be silently skipped.
|
|
139
|
+
const noneAllowed = allowNone && !truncated;
|
|
140
|
+
const maxIndex = shown - 1;
|
|
141
|
+
const minIndex = noneAllowed ? -1 : 0;
|
|
142
|
+
const tool = new ai_proxy_1.DynamicStructuredTool({
|
|
143
|
+
name: 'select-record-by-content',
|
|
144
|
+
description: 'Select the most relevant related record by its index.',
|
|
145
|
+
schema: zod_1.z.object({
|
|
146
|
+
recordIndex: zod_1.z
|
|
147
|
+
.number()
|
|
148
|
+
.int()
|
|
149
|
+
.min(minIndex)
|
|
150
|
+
.max(maxIndex)
|
|
151
|
+
.describe(noneAllowed
|
|
152
|
+
? `0-based index of the most relevant record (0 to ${maxIndex}), or -1 if none of the candidates is relevant`
|
|
153
|
+
: `0-based index of the most relevant record (0 to ${maxIndex})`),
|
|
154
|
+
confident: zod_1.z
|
|
155
|
+
.boolean()
|
|
156
|
+
.describe('true when one candidate clearly best matches the request; false when several ' +
|
|
157
|
+
'candidates fit similarly well and you cannot confidently single one out'),
|
|
158
|
+
reasoning: zod_1.z.string().describe('Why this record was chosen (or why none is relevant)'),
|
|
159
|
+
}),
|
|
160
|
+
func: undefined,
|
|
161
|
+
});
|
|
162
|
+
const messages = [
|
|
163
|
+
ai.contextMessage,
|
|
164
|
+
new ai_proxy_1.SystemMessage(SELECT_RECORD_SYSTEM_PROMPT),
|
|
165
|
+
...(noneAllowed ? [new ai_proxy_1.SystemMessage(SELECT_RECORD_NONE_ALLOWED_PROMPT)] : []),
|
|
166
|
+
new ai_proxy_1.SystemMessage(`Candidates:\n${lines.join('\n')}`),
|
|
167
|
+
new ai_proxy_1.HumanMessage(`**Request**: ${prompt ?? 'Select the most relevant record.'}`),
|
|
168
|
+
];
|
|
169
|
+
const { recordIndex, confident: rawConfident } = await ai.invoke(messages, tool);
|
|
170
|
+
// The Zod .min().max() shapes the tool prompt only — NOT validated against the AI response; this
|
|
171
|
+
// guard is the sole runtime enforcement. -1 is accepted only when noneAllowed (allowNone && !truncated).
|
|
172
|
+
if (!Number.isInteger(recordIndex) || recordIndex < minIndex || recordIndex > maxIndex) {
|
|
173
|
+
throw new errors_1.InvalidAIResponseError(`AI selected record index ${recordIndex} which is out of range (${minIndex}-${maxIndex}) or not an integer`);
|
|
174
|
+
}
|
|
175
|
+
// A definitive -1 ("none relevant") is not ambiguity. For a positive pick, honour the AI's
|
|
176
|
+
// confidence flag, defaulting to confident when omitted so a missing flag still auto-loads.
|
|
177
|
+
const confident = recordIndex < 0 ? true : rawConfident !== false;
|
|
178
|
+
return { index: recordIndex, confident };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsYXRlZC1yZWNvcmQtcGlja2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9yZWxhdGVkLXJlY29yZC1waWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyQ0Esb0RBdURDO0FBaUNELGtFQTREQztBQUVELHNEQXlFQztBQXZRRCxvREFBMkY7QUFDM0YsNkJBQXdCO0FBRXhCLHNDQUFtRDtBQVVuRCxNQUFNLDJCQUEyQixHQUFHO21HQUMrRCxDQUFDO0FBRXBHLE1BQU0sMkJBQTJCLEdBQUc7eUZBQ3FELENBQUM7QUFFMUYsTUFBTSw0QkFBNEIsR0FBRzt5R0FDb0UsQ0FBQztBQUUxRyxtR0FBbUc7QUFDbkcsNkVBQTZFO0FBQzdFLE1BQU0saUNBQWlDLEdBQUcseVBBQXlQLENBQUM7QUFFcFMsMEZBQTBGO0FBQzFGLGdHQUFnRztBQUNoRyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLGdEQUFnRDtBQUNuRixNQUFNLHVCQUF1QixHQUFHLEtBQU0sQ0FBQyxDQUFDLHlEQUF5RDtBQUVqRyxTQUFTLGVBQWUsQ0FBQyxLQUFjO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNuRixJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksc0JBQXNCO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFOUQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLGVBQWUsQ0FBQztBQUN2RSxDQUFDO0FBRUQscUZBQXFGO0FBQzlFLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsRUFBWSxFQUNaLE1BQXdCLEVBQ3hCLE1BQTBCO0lBRTFCLE1B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
|
|
@@ -6,7 +6,8 @@ import type { RunStore } from '../ports/run-store';
|
|
|
6
6
|
import type { WorkflowPort } from '../ports/workflow-port';
|
|
7
7
|
import type { FetchRemoteToolsResult } from '../remote-tool-fetcher';
|
|
8
8
|
import type SchemaCache from '../schema-cache';
|
|
9
|
-
import type { AvailableStepExecution, IStepExecutor } from '../types/execution-context';
|
|
9
|
+
import type { AvailableStepExecution, IStepExecutor, RunControl } from '../types/execution-context';
|
|
10
|
+
export type { RunControl };
|
|
10
11
|
export interface StepContextConfig {
|
|
11
12
|
aiModelPort: AiModelPort;
|
|
12
13
|
agentPort: AgentPort;
|
|
@@ -16,6 +17,7 @@ export interface StepContextConfig {
|
|
|
16
17
|
logger: Logger;
|
|
17
18
|
stepTimeoutS?: number;
|
|
18
19
|
aiInvokeTimeoutS?: number;
|
|
20
|
+
runControl?: RunControl;
|
|
19
21
|
}
|
|
20
22
|
export default class StepExecutorFactory {
|
|
21
23
|
static create(step: AvailableStepExecution, contextConfig: StepContextConfig, activityLogPort: ActivityLogPort, fetchRemoteTools: (mcpServerId: string, userId: number) => Promise<FetchRemoteToolsResult>, incomingPendingData?: unknown, forestServerToken?: string): Promise<IStepExecutor>;
|
|
@@ -11,15 +11,62 @@ const condition_step_executor_1 = __importDefault(require("./condition-step-exec
|
|
|
11
11
|
const guidance_step_executor_1 = __importDefault(require("./guidance-step-executor"));
|
|
12
12
|
const load_related_record_step_executor_1 = __importDefault(require("./load-related-record-step-executor"));
|
|
13
13
|
const mcp_step_executor_1 = __importDefault(require("./mcp-step-executor"));
|
|
14
|
+
const per_record_step_executor_1 = __importDefault(require("./per-record-step-executor"));
|
|
14
15
|
const read_record_step_executor_1 = __importDefault(require("./read-record-step-executor"));
|
|
16
|
+
const record_step_executor_1 = require("./record-step-executor");
|
|
15
17
|
const trigger_record_action_step_executor_1 = __importDefault(require("./trigger-record-action-step-executor"));
|
|
16
18
|
const update_record_step_executor_1 = __importDefault(require("./update-record-step-executor"));
|
|
17
19
|
const step_definition_1 = require("../types/validated/step-definition");
|
|
18
20
|
const step_outcome_1 = require("../types/validated/step-outcome");
|
|
21
|
+
// The record steps that run once per record when their source chain starts at a Multiple step.
|
|
22
|
+
const PER_RECORD_STEP_TYPES = [
|
|
23
|
+
step_definition_1.StepType.ReadRecord,
|
|
24
|
+
step_definition_1.StepType.UpdateRecord,
|
|
25
|
+
step_definition_1.StepType.TriggerAction,
|
|
26
|
+
step_definition_1.StepType.LoadRelatedRecord,
|
|
27
|
+
];
|
|
28
|
+
// A step runs once per record when a Load Related Record set to Multiple sits on its source chain.
|
|
29
|
+
function findPerRecordSource(step) {
|
|
30
|
+
if (!PER_RECORD_STEP_TYPES.includes(step.stepDefinition.type))
|
|
31
|
+
return null;
|
|
32
|
+
const pinned = step.stepDefinition;
|
|
33
|
+
let stepId = pinned.preRecordedArgs?.selectedRecordStepId;
|
|
34
|
+
let direct;
|
|
35
|
+
const visited = new Set();
|
|
36
|
+
while (stepId !== undefined && stepId !== step_definition_1.WORKFLOW_START_STEP_ID && !visited.has(stepId)) {
|
|
37
|
+
visited.add(stepId);
|
|
38
|
+
// The same lookup the record executor reads its source with, so both agree on the step.
|
|
39
|
+
const source = (0, record_step_executor_1.findPinnedLoadStep)(step.previousSteps, stepId, step.callScope?.currentFrameStepIndexes);
|
|
40
|
+
if (!source)
|
|
41
|
+
return null;
|
|
42
|
+
direct ?? (direct = source);
|
|
43
|
+
const sourceArgs = source.stepDefinition.preRecordedArgs;
|
|
44
|
+
if (sourceArgs?.multiple === true)
|
|
45
|
+
return { root: source, direct };
|
|
46
|
+
stepId = sourceArgs?.selectedRecordStepId;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function createRecordExecutor(context) {
|
|
51
|
+
switch (context.stepDefinition.type) {
|
|
52
|
+
case step_definition_1.StepType.ReadRecord:
|
|
53
|
+
return new read_record_step_executor_1.default(context);
|
|
54
|
+
case step_definition_1.StepType.UpdateRecord:
|
|
55
|
+
return new update_record_step_executor_1.default(context);
|
|
56
|
+
case step_definition_1.StepType.TriggerAction:
|
|
57
|
+
return new trigger_record_action_step_executor_1.default(context);
|
|
58
|
+
default:
|
|
59
|
+
return new load_related_record_step_executor_1.default(context);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
19
62
|
class StepExecutorFactory {
|
|
20
63
|
static async create(step, contextConfig, activityLogPort, fetchRemoteTools, incomingPendingData, forestServerToken) {
|
|
21
64
|
try {
|
|
22
65
|
const context = StepExecutorFactory.buildContext(step, contextConfig, activityLogPort, incomingPendingData, forestServerToken);
|
|
66
|
+
const perRecordSource = findPerRecordSource(step);
|
|
67
|
+
if (perRecordSource) {
|
|
68
|
+
return new per_record_step_executor_1.default(context, perRecordSource, createRecordExecutor);
|
|
69
|
+
}
|
|
23
70
|
switch (step.stepDefinition.type) {
|
|
24
71
|
case step_definition_1.StepType.Condition:
|
|
25
72
|
return new condition_step_executor_1.default(context);
|
|
@@ -119,8 +166,9 @@ class StepExecutorFactory {
|
|
|
119
166
|
incomingPendingData,
|
|
120
167
|
stepTimeoutS: cfg.stepTimeoutS,
|
|
121
168
|
aiInvokeTimeoutS: cfg.aiInvokeTimeoutS,
|
|
169
|
+
runControl: cfg.runControl,
|
|
122
170
|
};
|
|
123
171
|
}
|
|
124
172
|
}
|
|
125
173
|
exports.default = StepExecutorFactory;
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRvci1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9zdGVwLWV4ZWN1dG9yLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUEyQkEsc0NBTW1CO0FBQ25CLHlFQUFnRDtBQUNoRCxrRUFBeUM7QUFDekMsc0VBQTRDO0FBQzVDLHdGQUE4RDtBQUM5RCxzRkFBNEQ7QUFDNUQsNEdBQWdGO0FBQ2hGLDRFQUFrRDtBQUNsRCwwRkFBK0Q7QUFDL0QsNEZBQWlFO0FBQ2pFLGlFQUE0RDtBQUM1RCxnSEFBb0Y7QUFDcEYsZ0dBQXFFO0FBQ3JFLHdFQUFzRjtBQUN0RixrRUFBd0U7QUFJeEUsK0ZBQStGO0FBQy9GLE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsMEJBQVEsQ0FBQyxVQUFVO0lBQ25CLDBCQUFRLENBQUMsWUFBWTtJQUNyQiwwQkFBUSxDQUFDLGFBQWE7SUFDdEIsMEJBQVEsQ0FBQyxpQkFBaUI7Q0FDM0IsQ0FBQztBQUVGLG1HQUFtRztBQUNuRyxTQUFTLG1CQUFtQixDQUFDLElBQTRCO0lBQ3ZELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUUzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBeUUsQ0FBQztJQUM5RixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsZUFBZSxFQUFFLG9CQUFvQixDQUFDO0lBQzFELElBQUksTUFBd0IsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRWxDLE9BQU8sTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLEtBQUssd0NBQXNCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENB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
|
|
@@ -109,11 +109,12 @@ class StepExecutionFormatters {
|
|
|
109
109
|
if ('skipped' in executionResult)
|
|
110
110
|
return null; // user skipped — generic fallback
|
|
111
111
|
const { selectedRecordRef } = execution;
|
|
112
|
-
const { relation
|
|
112
|
+
const { relation } = executionResult;
|
|
113
|
+
const records = 'records' in executionResult ? executionResult.records : [executionResult.record];
|
|
113
114
|
const sourceId = selectedRecordRef.recordId.join(', ');
|
|
114
|
-
const
|
|
115
|
-
return ` Loaded: ${selectedRecordRef.collectionName} #${sourceId} → [${relation.displayName}] → ${
|
|
115
|
+
const loaded = records.map(r => `${r.collectionName} #${r.recordId.join(', ')}`).join(', ');
|
|
116
|
+
return ` Loaded: ${selectedRecordRef.collectionName} #${sourceId} → [${relation.displayName}] → ${loaded} (step ${records[0].stepIndex})`;
|
|
116
117
|
}
|
|
117
118
|
}
|
|
118
119
|
exports.default = StepExecutionFormatters;
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1leGVjdXRpb24tZm9ybWF0dGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjdXRvcnMvc3VtbWFyeS9zdGVwLWV4ZWN1dGlvbi1mb3JtYXR0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBU0EsbUdBQW1HO0FBQ25HLDZGQUE2RjtBQUM3RixNQUFNLHNCQUFzQixHQUFHLEtBQU0sQ0FBQztBQUV0QyxTQUFTLGdCQUFnQixDQUFDLE1BQWU7SUFDdkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFbEYsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLHNCQUFzQjtRQUN6QyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxtQkFBbUI7UUFDN0QsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRCxNQUFxQix1QkFBdUI7SUFDMUMseUZBQXlGO0lBQ3pGLHlGQUF5RjtJQUN6RixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQTRCO1FBQ3hDLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZCLEtBQUsscUJBQXFCO2dCQUN4QixPQUFPLHVCQUF1QixDQUFDLHVCQUF1QixDQUNwRCxTQUErQyxDQUNoRCxDQUFDO1lBQ0osS0FBSyxLQUFLO2dCQUNSLE9BQU8sdUJBQXVCLENBQUMsU0FBUyxDQUFDLFNBQWlDLENBQUMsQ0FBQztZQUM5RSxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsU0FBc0MsQ0FBQyxDQUFDO1lBQ3hGLEtBQUssZ0JBQWdCO2dCQUNuQixPQUFPLHVCQUF1QixDQUFDLG1CQUFtQixDQUNoRCxTQUFpRCxDQUNs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
|
|
@@ -4,11 +4,33 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const step_execution_formatters_1 = __importDefault(require("./step-execution-formatters"));
|
|
7
|
+
const step_execution_data_1 = require("../../types/step-execution-data");
|
|
8
|
+
function summarizeIteration(iteration) {
|
|
9
|
+
const { collectionName, recordId } = iteration.sourceRecordRef;
|
|
10
|
+
let outcome = 'not run';
|
|
11
|
+
if (iteration.error !== undefined) {
|
|
12
|
+
outcome = `failed: ${iteration.error}`;
|
|
13
|
+
}
|
|
14
|
+
else if (iteration.executionResult !== undefined) {
|
|
15
|
+
outcome = JSON.stringify(iteration.executionResult);
|
|
16
|
+
}
|
|
17
|
+
else if (iteration.pendingData !== undefined) {
|
|
18
|
+
outcome = `awaiting input: ${JSON.stringify(iteration.pendingData)}`;
|
|
19
|
+
}
|
|
20
|
+
return ` - ${collectionName} #${recordId.join(', ')}: ${outcome}`;
|
|
21
|
+
}
|
|
7
22
|
class StepSummaryBuilder {
|
|
8
23
|
static build(step, stepOutcome, execution) {
|
|
9
24
|
const prompt = step.prompt ?? '(no prompt)';
|
|
10
25
|
const header = `Step "${stepOutcome.stepId}" (index ${stepOutcome.stepIndex}):`;
|
|
11
26
|
const lines = [header, ` Prompt: ${prompt}`];
|
|
27
|
+
if ((0, step_execution_data_1.isPerRecordExecution)(execution)) {
|
|
28
|
+
return [
|
|
29
|
+
...lines,
|
|
30
|
+
' Ran once per record:',
|
|
31
|
+
...execution.iterations.map(summarizeIteration),
|
|
32
|
+
].join('\n');
|
|
33
|
+
}
|
|
12
34
|
if (execution !== undefined) {
|
|
13
35
|
const mcpCalls = step_execution_formatters_1.default.formatMcpCallsWithoutAnswer(execution);
|
|
14
36
|
if (mcpCalls !== null) {
|
|
@@ -59,4 +81,4 @@ class StepSummaryBuilder {
|
|
|
59
81
|
}
|
|
60
82
|
}
|
|
61
83
|
exports.default = StepSummaryBuilder;
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1zdW1tYXJ5LWJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXhlY3V0b3JzL3N1bW1hcnkvc3RlcC1zdW1tYXJ5LWJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSw0RkFBa0U7QUFDbEUseUVBQXVFO0FBRXZFLFNBQVMsa0JBQWtCLENBQUMsU0FBd0I7SUFDbEQsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFDO0lBQy9ELElBQUksT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUV4QixJQUFJLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbEMsT0FBTyxHQUFHLFdBQVcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pDLENBQUM7U0FBTSxJQUFJLFNBQVMsQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDbkQsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7U0FBTSxJQUFJLFNBQVMsQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0MsT0FBTyxHQUFHLG1CQUFtQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxPQUFPLE9BQU8sY0FBYyxLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxFQUFFLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQXFCLGtCQUFrQjtJQUNyQyxNQUFNLENBQUMsS0FBSyxDQUNWLElBQW9CLEVBQ3BCLFdBQXdCLEVBQ3hCLFNBQXdDO1FBRXhDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLFNBQVMsV0FBVyxDQUFD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
|
|
@@ -10,9 +10,9 @@ export declare const depositCredentialsBodySchema: z.ZodObject<{
|
|
|
10
10
|
clientSecretExpiresAt: z.ZodOptional<z.ZodString>;
|
|
11
11
|
tokenEndpoint: z.ZodString;
|
|
12
12
|
tokenEndpointAuthMethod: z.ZodOptional<z.ZodEnum<{
|
|
13
|
+
none: "none";
|
|
13
14
|
client_secret_post: "client_secret_post";
|
|
14
15
|
client_secret_basic: "client_secret_basic";
|
|
15
|
-
none: "none";
|
|
16
16
|
}>>;
|
|
17
17
|
scopes: z.ZodOptional<z.ZodString>;
|
|
18
18
|
}, z.core.$strict>;
|
|
@@ -18,10 +18,12 @@ declare const triggerActionPatchSchema: z.ZodObject<{
|
|
|
18
18
|
declare const mcpPatchSchema: z.ZodObject<{
|
|
19
19
|
userConfirmed: z.ZodBoolean;
|
|
20
20
|
}, z.core.$strict>;
|
|
21
|
+
export declare const MAX_SELECTED_RECORDS = 50;
|
|
21
22
|
declare const loadRelatedRecordPatchSchema: z.ZodObject<{
|
|
22
23
|
userConfirmed: z.ZodOptional<z.ZodBoolean>;
|
|
23
24
|
fieldName: z.ZodOptional<z.ZodString>;
|
|
24
25
|
selectedRecordId: z.ZodOptional<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>, z.ZodArray<z.ZodString>>>;
|
|
26
|
+
selectedRecordIds: z.ZodOptional<z.ZodArray<z.ZodPipe<z.ZodPipe<z.ZodString, z.ZodTransform<string[], string>>, z.ZodArray<z.ZodString>>>>;
|
|
25
27
|
}, z.core.$strict>;
|
|
26
28
|
export type UpdateRecordConfirmation = z.infer<typeof updateRecordPatchSchema>;
|
|
27
29
|
export type TriggerActionConfirmation = z.infer<typeof triggerActionPatchSchema>;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MAX_SELECTED_RECORDS = void 0;
|
|
3
4
|
const zod_1 = require("zod");
|
|
4
5
|
const record_id_1 = require("../record-id");
|
|
5
6
|
// Per-step-type schemas for the userConfirmation payload sent by the front via
|
|
@@ -41,6 +42,14 @@ const mcpPatchSchema = zod_1.z.object({ userConfirmed: zod_1.z.boolean() }).stri
|
|
|
41
42
|
// finalizing. The executor refreshes pendingData and stays awaiting-input.
|
|
42
43
|
// Required when the frontend lets the user switch relations: the IDs originally
|
|
43
44
|
// stored under `availableRecordIds` belong to the AI-suggested relation only.
|
|
45
|
+
// The Forest Runtime lists at most this many candidates on a Load Related Record step.
|
|
46
|
+
exports.MAX_SELECTED_RECORDS = 50;
|
|
47
|
+
// Pipe-separated id (e.g. 'id1|id2'), deserialized to an id array; empty segments would build a bogus PK.
|
|
48
|
+
const recordIdSchema = zod_1.z
|
|
49
|
+
.string()
|
|
50
|
+
.min(1)
|
|
51
|
+
.transform(record_id_1.deserializeRecordId)
|
|
52
|
+
.pipe(zod_1.z.array(zod_1.z.string().min(1)));
|
|
44
53
|
const loadRelatedRecordPatchSchema = zod_1.z
|
|
45
54
|
.object({
|
|
46
55
|
userConfirmed: zod_1.z.boolean().optional(),
|
|
@@ -53,11 +62,16 @@ const loadRelatedRecordPatchSchema = zod_1.z
|
|
|
53
62
|
// deserialized to an id array. Required when confirming with a relation override —
|
|
54
63
|
// the original record ID belongs to a different collection and cannot be reused.
|
|
55
64
|
// The .pipe(...) rejects empty segments that would build a bogus PK.
|
|
56
|
-
selectedRecordId:
|
|
57
|
-
|
|
65
|
+
selectedRecordId: recordIdSchema.optional(),
|
|
66
|
+
// A Multiple step: every record picked, each among the candidates offered.
|
|
67
|
+
// A record picked twice would run every step after it twice on that record.
|
|
68
|
+
selectedRecordIds: zod_1.z
|
|
69
|
+
.array(recordIdSchema)
|
|
58
70
|
.min(1)
|
|
59
|
-
.
|
|
60
|
-
.
|
|
71
|
+
.max(exports.MAX_SELECTED_RECORDS)
|
|
72
|
+
.refine(ids => new Set(ids.map(record_id_1.serializeRecordId)).size === ids.length, {
|
|
73
|
+
message: 'each record can be picked once',
|
|
74
|
+
})
|
|
61
75
|
.optional(),
|
|
62
76
|
})
|
|
63
77
|
.strict()
|
|
@@ -65,7 +79,8 @@ const loadRelatedRecordPatchSchema = zod_1.z
|
|
|
65
79
|
// Preview patch (no confirm): fieldName alone is sufficient.
|
|
66
80
|
if (data.userConfirmed === undefined)
|
|
67
81
|
return data.fieldName !== undefined;
|
|
68
|
-
// Confirm patch with relation override:
|
|
82
|
+
// Confirm patch with relation override: the record picked is required. A Multiple step's
|
|
83
|
+
// relation is never switched, so the override never comes with selectedRecordIds.
|
|
69
84
|
if (data.fieldName !== undefined)
|
|
70
85
|
return data.selectedRecordId !== undefined;
|
|
71
86
|
return true;
|
|
@@ -88,4 +103,4 @@ const patchBodySchemas = {
|
|
|
88
103
|
condition: conditionPatchSchema,
|
|
89
104
|
};
|
|
90
105
|
exports.default = patchBodySchemas;
|
|
91
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVuZGluZy1kYXRhLXZhbGlkYXRvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaHR0cC9wZW5kaW5nLWRhdGEtdmFsaWRhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBd0I7QUFFeEIsNENBQXNFO0FBRXRFLCtFQUErRTtBQUMvRSxrRkFBa0Y7QUFDbEYsMENBQTBDO0FBRTFDLE1BQU0sdUJBQXVCLEdBQUcsT0FBQztLQUM5QixNQUFNLENBQUM7SUFDTixhQUFhLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRTtJQUMxQixLQUFLLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM5QixDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixNQUFNLHdCQUF3QixHQUFHLE9BQUM7S0FDL0IsTUFBTSxDQUFDO0lBQ04sYUFBYSxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUU7SUFDMUIsZ0ZBQWdGO0lBQ2hGLGdGQUFnRjtJQUNoRixzRUFBc0U7SUFDdEUsWUFBWSxFQUFFLE9BQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsNEVBQTRFO0lBQzVFLDJGQUEyRjtJQUMzRixlQUFlLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzdELDhGQUE4RjtJQUM5Riw0RkFBNEY7SUFDNUYsaUJBQWlCLEVBQUUsT0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3RFLDhGQUE4RjtJQUM5RixpRkFBaUY7SUFDakYsZUFBZSxFQUFFLE9BQUM7U0FDZixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2pDLE1BQU0sRUFBRTtTQUNSLFFBQVEsRUFBRTtDQUNkLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQztBQUVaLE1BQU0sY0FBYyxHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUV6RSxzQkFBc0I7QUFDdEIsdUZBQXVGO0FBQ3ZGLDZCQUE2QjtBQUM3QixzRkFBc0Y7QUFDdEYsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRixxRkFBcUY7QUFDckYsbUZBQW1GO0FBQ25GLHVGQUF1RjtBQUMxRSxRQUFBLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztBQUV2QywwR0FBMEc7QUFDMUcsTUFBTSxjQUFjLEdBQUcsT0FBQztLQUNyQixNQUFNLEVBQUU7S0FDUixHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ04sU0FBUyxDQUFDLCtCQUFtQixDQUFDO0tBQzlCLElBQUksQ0FBQyxPQUFDLENBQUMsS0FBSyxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sNEJBQTRCLEdBQUcsT0FBQztLQUNuQyxNQUFNLENBQUM7SUFDTixhQUFhLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUNyQyxzRkFBc0Y7SUFDdEYsb0ZBQW9GO0lBQ3BGLGtGQUFrRjtJQUNsRixvREFBb0Q7SUFDcEQsU0FBUyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQ3ZDLG9GQUFvRjtJQUNwRixtRkFBbUY7SUFDbkYsaUZBQWlGO0lBQ2pGLHFFQUFxRTtJQUNyRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFO0lBQzNDLDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsaUJBQWlCLEVBQUUsT0FBQztTQUNqQixLQUFLLENBQUMsY0FBYyxDQUFDO1NBQ3JCLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDTixHQUFHLENBQUMsNEJBQW9CLENBQUM7U0FDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyw2QkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxNQUFNLEVBQUU7UUFDdEUsT0FBTyxFQUFFLGdDQUFnQztLQUMxQyxDQUFDO1NBQ0QsUUFBUSxFQUFFO0NBQ2QsQ0FBQztLQUNELE1BQU0sRUFBRTtLQUNSLE1BQU0sQ0FDTCxJQUFJLENBQUMsRUFBRTtJQUNMLDZEQUE2RDtJQUM3RCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFFMUUseUZBQXlGO0lBQ3pGLGtGQUFrRjtJQUNsRixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUztRQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQztJQUU3RSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsRUFDRDtJQUNFLE9BQU8sRUFDTCx5RUFBeUU7UUFDekUsc0VBQXNFO0NBQ3pFLENBQ0YsQ0FBQztBQUNKLE1BQU0sbUJBQW1CLEdBQUcsT0FBQztLQUMxQixNQUFNLENBQUM7SUFDTixTQUFTLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUNqQyxDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixNQUFNLG9CQUFvQixHQUFHLE9BQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQWlCL0UsTUFBTSxnQkFBZ0IsR0FBcUQ7SUFDekUsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QyxnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDMUMsR0FBRyxFQUFFLGNBQWM7SUFDbkIscUJBQXFCLEVBQUUsNEJBQTRCO0lBQ25ELFFBQVEsRUFBRSxtQkFBbUI7SUFDN0IsU0FBUyxFQUFFLG9CQUFvQjtDQUNoQyxDQUFDO0FBRUYsa0JBQWUsZ0JBQWdCLENBQUMifQ==
|
|
@@ -2,49 +2,76 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.default = serializeStepForWire;
|
|
4
4
|
const record_id_1 = require("../record-id");
|
|
5
|
+
const step_execution_data_1 = require("../types/step-execution-data");
|
|
5
6
|
function serializeRecordRef(ref) {
|
|
6
7
|
return { ...ref, recordId: (0, record_id_1.serializeRecordId)(ref.recordId) };
|
|
7
8
|
}
|
|
9
|
+
function serializeCandidate(candidate) {
|
|
10
|
+
return { ...candidate, recordId: (0, record_id_1.serializeRecordId)(candidate.recordId) };
|
|
11
|
+
}
|
|
12
|
+
// Fields shared by a load-related-record step and each of its iterations.
|
|
13
|
+
function serializeLoadRelatedFields(fields) {
|
|
14
|
+
const result = {};
|
|
15
|
+
if (fields.pendingData) {
|
|
16
|
+
const { availableRecordIds, suggestedRecord, suggestedRecords } = fields.pendingData;
|
|
17
|
+
result.pendingData = {
|
|
18
|
+
...fields.pendingData,
|
|
19
|
+
availableRecordIds: availableRecordIds.map(serializeCandidate),
|
|
20
|
+
...(suggestedRecord && { suggestedRecord: serializeCandidate(suggestedRecord) }),
|
|
21
|
+
...(suggestedRecords && { suggestedRecords: suggestedRecords.map(serializeCandidate) }),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (fields.executionResult && 'record' in fields.executionResult) {
|
|
25
|
+
result.executionResult = {
|
|
26
|
+
...fields.executionResult,
|
|
27
|
+
record: serializeRecordRef(fields.executionResult.record),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (fields.executionResult && 'records' in fields.executionResult) {
|
|
31
|
+
result.executionResult = {
|
|
32
|
+
...fields.executionResult,
|
|
33
|
+
records: fields.executionResult.records.map(serializeRecordRef),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
function serializeIteration(type, iteration) {
|
|
39
|
+
return {
|
|
40
|
+
...iteration,
|
|
41
|
+
sourceRecordRef: serializeRecordRef(iteration.sourceRecordRef),
|
|
42
|
+
...(iteration.selectedRecordRef && {
|
|
43
|
+
selectedRecordRef: serializeRecordRef(iteration.selectedRecordRef),
|
|
44
|
+
}),
|
|
45
|
+
...(type === 'load-related-record' &&
|
|
46
|
+
serializeLoadRelatedFields({
|
|
47
|
+
pendingData: iteration.pendingData,
|
|
48
|
+
executionResult: iteration.executionResult,
|
|
49
|
+
})),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
8
52
|
function serializeStepForWire(step) {
|
|
53
|
+
if ((0, step_execution_data_1.isPerRecordExecution)(step)) {
|
|
54
|
+
return {
|
|
55
|
+
...step,
|
|
56
|
+
iterations: step.iterations.map(iteration => serializeIteration(step.type, iteration)),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
9
59
|
switch (step.type) {
|
|
10
60
|
case 'read-record':
|
|
11
61
|
case 'update-record':
|
|
12
62
|
case 'trigger-action':
|
|
13
63
|
return { ...step, selectedRecordRef: serializeRecordRef(step.selectedRecordRef) };
|
|
14
|
-
case 'load-related-record':
|
|
64
|
+
case 'load-related-record':
|
|
15
65
|
// Omit selectedRecordRef when absent — serializing undefined throws.
|
|
16
|
-
|
|
66
|
+
return {
|
|
17
67
|
...step,
|
|
18
68
|
...(step.selectedRecordRef && {
|
|
19
69
|
selectedRecordRef: serializeRecordRef(step.selectedRecordRef),
|
|
20
70
|
}),
|
|
71
|
+
...serializeLoadRelatedFields(step),
|
|
21
72
|
};
|
|
22
|
-
if (step.pendingData) {
|
|
23
|
-
const { availableRecordIds, suggestedRecord } = step.pendingData;
|
|
24
|
-
result.pendingData = {
|
|
25
|
-
...step.pendingData,
|
|
26
|
-
availableRecordIds: availableRecordIds.map(c => ({
|
|
27
|
-
...c,
|
|
28
|
-
recordId: (0, record_id_1.serializeRecordId)(c.recordId),
|
|
29
|
-
})),
|
|
30
|
-
...(suggestedRecord && {
|
|
31
|
-
suggestedRecord: {
|
|
32
|
-
...suggestedRecord,
|
|
33
|
-
recordId: (0, record_id_1.serializeRecordId)(suggestedRecord.recordId),
|
|
34
|
-
},
|
|
35
|
-
}),
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
if (step.executionResult && 'record' in step.executionResult) {
|
|
39
|
-
result.executionResult = {
|
|
40
|
-
...step.executionResult,
|
|
41
|
-
record: serializeRecordRef(step.executionResult.record),
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
return result;
|
|
45
|
-
}
|
|
46
73
|
default:
|
|
47
74
|
return step;
|
|
48
75
|
}
|
|
49
76
|
}
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1zZXJpYWxpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvc3RlcC1zZXJpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBc0VBLHVDQTJCQztBQXhGRCw0Q0FBaUQ7QUFDakQsc0VBQW9FO0FBRXBFLFNBQVMsa0JBQWtCLENBQUMsR0FBYztJQUN4QyxPQUFPLEVBQUUsR0FBRyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUEsNkJBQWlCLEVBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFDL0QsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsU0FBcUM7SUFDL0QsT0FBTyxFQUFFLEdBQUcsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFBLDZCQUFpQixFQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQzNFLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBUywwQkFBMEIsQ0FDakMsTUFBbUY7SUFFbkYsTUFBTSxNQUFNLEdBQTRCLEVBQUUsQ0FBQztJQUUzQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUVyRixNQUFNLENBQUMsV0FBVyxHQUFHO1lBQ25CLEdBQUcsTUFBTSxDQUFDLFdBQVc7WUFDckIsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1lBQzlELEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxlQUFlLEVBQUUsa0JBQWtCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNoRixHQUFHLENBQUMsZ0JBQWdCLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1NBQ3hGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsZUFBZSxJQUFJLFFBQVEsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDakUsTUFBTSxDQUFDLGVBQWUsR0FBRztZQUN2QixHQUFHLE1BQU0sQ0FBQyxlQUFlO1lBQ3pCLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQztTQUMxRCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLGVBQWUsSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxlQUFlLEdBQUc7WUFDdkIsR0FBRyxNQUFNLENBQUMsZUFBZTtZQUN6QixPQUFPLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1NBQ2hFLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBK0IsRUFBRSxTQUF3QjtJQUNuRixPQUFPO1FBQ0wsR0FBRyxTQUFTO1FBQ1osZUFBZSxFQUFFLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7UUFDOUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsSUFBSTtZQUNqQyxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUM7U0FDbkUsQ0FBQztRQUNGLEdBQUcsQ0FBQyxJQUFJLEtBQUsscUJBQXFCO1lBQ2hDLDBCQUEwQixDQUFDO2dCQUN6QixXQUFXLEVBQUUsU0FBUyxDQUFDLFdBQXVEO2dCQUM5RSxlQUFlLEVBQ2IsU0FBUyxDQUFDLGVBQXdFO2FBQ3JGLENBQUMsQ0FBQztLQUNOLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBd0Isb0JBQW9CLENBQUMsSUFBdUI7SUFDbEUsSUFBSSxJQUFBLDBDQUFvQixFQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTztZQUNMLEdBQUcsSUFBSTtZQUNQLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDdkYsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLGFBQWEsQ0FBQztRQUNuQixLQUFLLGVBQWUsQ0FBQztRQUNyQixLQUFLLGdCQUFnQjtZQUNuQixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztRQUVwRixLQUFLLHFCQUFxQjtZQUN4QixxRUFBcUU7WUFDckUsT0FBTztnQkFDTCxHQUFHLElBQUk7Z0JBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSTtvQkFDNUIsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO2lCQUM5RCxDQUFDO2dCQUNGLEdBQUcsMEJBQTBCLENBQUMsSUFBSSxDQUFDO2FBQ3BDLENBQUM7UUFFSjtZQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7QUFDSCxDQUFDIn0=
|