@forestadmin/workflow-executor 1.0.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/LICENSE +674 -0
- package/README.md +141 -0
- package/dist/adapters/activity-log-drainer.d.ts +6 -0
- package/dist/adapters/activity-log-drainer.js +21 -0
- package/dist/adapters/agent-client-agent-port.d.ts +27 -0
- package/dist/adapters/agent-client-agent-port.js +211 -0
- package/dist/adapters/ai-client-adapter.d.ts +11 -0
- package/dist/adapters/ai-client-adapter.js +38 -0
- package/dist/adapters/always-error-ai-model-port.d.ts +8 -0
- package/dist/adapters/always-error-ai-model-port.js +23 -0
- package/dist/adapters/console-logger.d.ts +7 -0
- package/dist/adapters/console-logger.js +15 -0
- package/dist/adapters/forest-server-workflow-port.d.ts +25 -0
- package/dist/adapters/forest-server-workflow-port.js +163 -0
- package/dist/adapters/forestadmin-client-activity-log-port-factory.d.ts +12 -0
- package/dist/adapters/forestadmin-client-activity-log-port-factory.js +22 -0
- package/dist/adapters/forestadmin-client-activity-log-port.d.ts +15 -0
- package/dist/adapters/forestadmin-client-activity-log-port.js +78 -0
- package/dist/adapters/pretty-logger.d.ts +9 -0
- package/dist/adapters/pretty-logger.js +37 -0
- package/dist/adapters/record-id-serializer.d.ts +4 -0
- package/dist/adapters/record-id-serializer.js +20 -0
- package/dist/adapters/run-to-available-step-mapper.d.ts +4 -0
- package/dist/adapters/run-to-available-step-mapper.js +137 -0
- package/dist/adapters/server-ai-adapter.d.ts +16 -0
- package/dist/adapters/server-ai-adapter.js +60 -0
- package/dist/adapters/server-types.d.ts +181 -0
- package/dist/adapters/server-types.js +35 -0
- package/dist/adapters/step-definition-mapper.d.ts +4 -0
- package/dist/adapters/step-definition-mapper.js +68 -0
- package/dist/adapters/step-outcome-to-update-step-mapper.d.ts +4 -0
- package/dist/adapters/step-outcome-to-update-step-mapper.js +34 -0
- package/dist/adapters/with-retry.d.ts +6 -0
- package/dist/adapters/with-retry.js +40 -0
- package/dist/build-workflow-executor.d.ts +35 -0
- package/dist/build-workflow-executor.js +175 -0
- package/dist/cli-core.d.ts +26 -0
- package/dist/cli-core.js +228 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +17 -0
- package/dist/defaults.d.ts +9 -0
- package/dist/defaults.js +12 -0
- package/dist/errors.d.ts +153 -0
- package/dist/errors.js +327 -0
- package/dist/executors/activity-log.d.ts +14 -0
- package/dist/executors/activity-log.js +33 -0
- package/dist/executors/agent-with-log.d.ts +33 -0
- package/dist/executors/agent-with-log.js +76 -0
- package/dist/executors/base-step-executor.d.ts +40 -0
- package/dist/executors/base-step-executor.js +267 -0
- package/dist/executors/condition-step-executor.d.ts +15 -0
- package/dist/executors/condition-step-executor.js +108 -0
- package/dist/executors/guidance-step-executor.d.ts +12 -0
- package/dist/executors/guidance-step-executor.js +39 -0
- package/dist/executors/load-related-record-step-executor.d.ts +38 -0
- package/dist/executors/load-related-record-step-executor.js +478 -0
- package/dist/executors/mcp-step-executor.d.ts +22 -0
- package/dist/executors/mcp-step-executor.js +188 -0
- package/dist/executors/read-record-step-executor.d.ts +10 -0
- package/dist/executors/read-record-step-executor.js +100 -0
- package/dist/executors/record-step-executor.d.ts +19 -0
- package/dist/executors/record-step-executor.js +108 -0
- package/dist/executors/step-executor-factory.d.ts +24 -0
- package/dist/executors/step-executor-factory.js +99 -0
- package/dist/executors/summary/step-execution-formatters.d.ts +8 -0
- package/dist/executors/summary/step-execution-formatters.js +49 -0
- package/dist/executors/summary/step-summary-builder.d.ts +7 -0
- package/dist/executors/summary/step-summary-builder.js +52 -0
- package/dist/executors/trigger-record-action-step-executor.d.ts +17 -0
- package/dist/executors/trigger-record-action-step-executor.js +169 -0
- package/dist/executors/update-record-step-executor.d.ts +13 -0
- package/dist/executors/update-record-step-executor.js +245 -0
- package/dist/http/executor-http-server.d.ts +25 -0
- package/dist/http/executor-http-server.js +170 -0
- package/dist/http/pending-data-validators.d.ts +25 -0
- package/dist/http/pending-data-validators.js +79 -0
- package/dist/http/step-serializer.d.ts +3 -0
- package/dist/http/step-serializer.js +47 -0
- package/dist/in-flight-run-registry.d.ts +9 -0
- package/dist/in-flight-run-registry.js +30 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +88 -0
- package/dist/ports/activity-log-port.d.ts +24 -0
- package/dist/ports/activity-log-port.js +3 -0
- package/dist/ports/agent-port.d.ts +54 -0
- package/dist/ports/agent-port.js +3 -0
- package/dist/ports/ai-model-port.d.ts +7 -0
- package/dist/ports/ai-model-port.js +3 -0
- package/dist/ports/logger-port.d.ts +6 -0
- package/dist/ports/logger-port.js +3 -0
- package/dist/ports/run-store.d.ts +9 -0
- package/dist/ports/run-store.js +3 -0
- package/dist/ports/workflow-port.d.ts +30 -0
- package/dist/ports/workflow-port.js +3 -0
- package/dist/remote-tool-fetcher.d.ts +19 -0
- package/dist/remote-tool-fetcher.js +56 -0
- package/dist/runner.d.ts +50 -0
- package/dist/runner.js +317 -0
- package/dist/schema-cache.d.ts +11 -0
- package/dist/schema-cache.js +37 -0
- package/dist/schema-resolver.d.ts +11 -0
- package/dist/schema-resolver.js +24 -0
- package/dist/stores/build-run-store.d.ts +5 -0
- package/dist/stores/build-run-store.js +28 -0
- package/dist/stores/database-store.d.ts +17 -0
- package/dist/stores/database-store.js +119 -0
- package/dist/stores/in-memory-store.d.ts +11 -0
- package/dist/stores/in-memory-store.js +48 -0
- package/dist/types/execution-context.d.ts +37 -0
- package/dist/types/execution-context.js +3 -0
- package/dist/types/step-execution-data.d.ts +137 -0
- package/dist/types/step-execution-data.js +3 -0
- package/dist/types/validated/collection.d.ts +126 -0
- package/dist/types/validated/collection.js +96 -0
- package/dist/types/validated/execution.d.ts +362 -0
- package/dist/types/validated/execution.js +43 -0
- package/dist/types/validated/step-definition.d.ts +243 -0
- package/dist/types/validated/step-definition.js +128 -0
- package/dist/types/validated/step-outcome.d.ts +108 -0
- package/dist/types/validated/step-outcome.js +66 -0
- package/dist/validate-secrets.d.ts +5 -0
- package/dist/validate-secrets.js +14 -0
- package/package.json +50 -0
package/dist/errors.js
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MalformedRunError = exports.DomainValidationError = exports.InvalidStepDefinitionError = exports.RecordIdSerializationError = exports.UnsupportedStepTypeError = exports.AgentProbeError = exports.InvalidPreRecordedArgsError = exports.InvalidPendingDataError = exports.PendingDataNotFoundError = exports.RunAlreadyInFlightError = exports.UserMismatchError = exports.RunNotFoundError = exports.ConfigurationError = exports.McpToolInvocationError = exports.AiModelPortError = exports.WorkflowPortError = exports.SchemaNotCachedError = exports.AgentPortError = exports.McpToolNotFoundError = exports.NoMcpToolsError = exports.AiInvokeTimeoutError = exports.StepTimeoutError = exports.ActivityLogCreationError = exports.StepStateError = exports.ActionNotFoundError = exports.FieldTypeMissingError = exports.FieldNotFoundError = exports.RelationNotFoundError = exports.InvalidAiRequestError = exports.InvalidAIResponseError = exports.RelatedRecordNotFoundError = exports.NoRelationshipFieldsError = exports.RunStorePortError = exports.UnsupportedActionFormError = exports.NoActionsError = exports.NoWritableFieldsError = exports.NoResolvedFieldsError = exports.NoReadableFieldsError = exports.NoRecordsError = exports.RecordNotFoundError = exports.MalformedToolCallError = exports.MissingToolCallError = exports.WorkflowExecutorError = void 0;
|
|
4
|
+
exports.causeMessage = causeMessage;
|
|
5
|
+
exports.extractErrorMessage = extractErrorMessage;
|
|
6
|
+
function causeMessage(error) {
|
|
7
|
+
const { cause } = error;
|
|
8
|
+
return cause instanceof Error ? cause.message : undefined;
|
|
9
|
+
}
|
|
10
|
+
// Cascades through err.message → err.parent.message (Sequelize) → err.cause.message → err.name,
|
|
11
|
+
// so wrapped infra errors (SequelizeConnectionRefusedError has an empty .message) don't log as empty.
|
|
12
|
+
function extractErrorMessage(err) {
|
|
13
|
+
if (err === undefined)
|
|
14
|
+
return undefined;
|
|
15
|
+
if (!(err instanceof Error))
|
|
16
|
+
return String(err);
|
|
17
|
+
if (err.message)
|
|
18
|
+
return err.message;
|
|
19
|
+
const { parent } = err;
|
|
20
|
+
if (parent instanceof Error && parent.message)
|
|
21
|
+
return parent.message;
|
|
22
|
+
const { cause } = err;
|
|
23
|
+
if (cause instanceof Error && cause.message)
|
|
24
|
+
return cause.message;
|
|
25
|
+
return err.name || 'Unknown error';
|
|
26
|
+
}
|
|
27
|
+
class WorkflowExecutorError extends Error {
|
|
28
|
+
constructor(message, userMessage) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = this.constructor.name;
|
|
31
|
+
this.userMessage = userMessage ?? message;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.WorkflowExecutorError = WorkflowExecutorError;
|
|
35
|
+
class MissingToolCallError extends WorkflowExecutorError {
|
|
36
|
+
constructor() {
|
|
37
|
+
super('AI did not return a tool call', "The AI couldn't decide what to do. Try rephrasing the step's prompt.");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.MissingToolCallError = MissingToolCallError;
|
|
41
|
+
class MalformedToolCallError extends WorkflowExecutorError {
|
|
42
|
+
constructor(toolName, details) {
|
|
43
|
+
super(`AI returned a malformed tool call for "${toolName}": ${details}`, "The AI returned an unexpected response. Try rephrasing the step's prompt.");
|
|
44
|
+
this.toolName = toolName;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.MalformedToolCallError = MalformedToolCallError;
|
|
48
|
+
class RecordNotFoundError extends WorkflowExecutorError {
|
|
49
|
+
constructor(collectionName, recordId) {
|
|
50
|
+
super(`Record not found: collection "${collectionName}", id "${recordId.join('|')}"`, 'The record no longer exists. It may have been deleted.');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.RecordNotFoundError = RecordNotFoundError;
|
|
54
|
+
class NoRecordsError extends WorkflowExecutorError {
|
|
55
|
+
constructor() {
|
|
56
|
+
super('No records available');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.NoRecordsError = NoRecordsError;
|
|
60
|
+
class NoReadableFieldsError extends WorkflowExecutorError {
|
|
61
|
+
constructor(collectionName) {
|
|
62
|
+
super(`No readable fields on record from collection "${collectionName}"`, 'This record type has no readable fields configured in Forest Admin.');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.NoReadableFieldsError = NoReadableFieldsError;
|
|
66
|
+
class NoResolvedFieldsError extends WorkflowExecutorError {
|
|
67
|
+
constructor(fieldNames) {
|
|
68
|
+
super(`None of the requested fields could be resolved: ${fieldNames.join(', ')}`, "The AI selected fields that don't exist on this record. Try rephrasing the step's prompt.");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.NoResolvedFieldsError = NoResolvedFieldsError;
|
|
72
|
+
class NoWritableFieldsError extends WorkflowExecutorError {
|
|
73
|
+
constructor(collectionName) {
|
|
74
|
+
super(`No writable fields on record from collection "${collectionName}"`, 'This record type has no editable fields configured in Forest Admin.');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.NoWritableFieldsError = NoWritableFieldsError;
|
|
78
|
+
class NoActionsError extends WorkflowExecutorError {
|
|
79
|
+
constructor(collectionName) {
|
|
80
|
+
super(`No actions available on collection "${collectionName}"`, 'No actions are available on this record.');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.NoActionsError = NoActionsError;
|
|
84
|
+
class UnsupportedActionFormError extends WorkflowExecutorError {
|
|
85
|
+
constructor(actionDisplayName) {
|
|
86
|
+
super(`Action "${actionDisplayName}" requires a form which is not supported by the executor`, 'This action requires user input via a form, which is not yet supported in workflows.');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.UnsupportedActionFormError = UnsupportedActionFormError;
|
|
90
|
+
class RunStorePortError extends WorkflowExecutorError {
|
|
91
|
+
constructor(operation, cause) {
|
|
92
|
+
super(`Run store "${operation}" failed: ${cause instanceof Error ? cause.message : String(cause)}`, 'The step state could not be accessed. Please retry.');
|
|
93
|
+
this.cause = cause;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.RunStorePortError = RunStorePortError;
|
|
97
|
+
class NoRelationshipFieldsError extends WorkflowExecutorError {
|
|
98
|
+
constructor(collectionName) {
|
|
99
|
+
super(`No relationship fields on record from collection "${collectionName}"`, 'This record type has no relations configured in Forest Admin.');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.NoRelationshipFieldsError = NoRelationshipFieldsError;
|
|
103
|
+
class RelatedRecordNotFoundError extends WorkflowExecutorError {
|
|
104
|
+
constructor(collectionName, relationName) {
|
|
105
|
+
super(`No related record found for relation "${relationName}" on collection "${collectionName}"`, 'The related record could not be found. It may have been deleted.');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
exports.RelatedRecordNotFoundError = RelatedRecordNotFoundError;
|
|
109
|
+
class InvalidAIResponseError extends WorkflowExecutorError {
|
|
110
|
+
constructor(message) {
|
|
111
|
+
super(message, "The AI made an unexpected choice. Try rephrasing the step's prompt.");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.InvalidAIResponseError = InvalidAIResponseError;
|
|
115
|
+
class InvalidAiRequestError extends WorkflowExecutorError {
|
|
116
|
+
constructor(message) {
|
|
117
|
+
super(message, 'Step configuration error — please contact your administrator.');
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.InvalidAiRequestError = InvalidAiRequestError;
|
|
121
|
+
class RelationNotFoundError extends WorkflowExecutorError {
|
|
122
|
+
constructor(name, collectionName) {
|
|
123
|
+
super(`Relation "${name}" not found in collection "${collectionName}"`, "The AI selected a relation that doesn't exist on this record. Try rephrasing the step's prompt.");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.RelationNotFoundError = RelationNotFoundError;
|
|
127
|
+
class FieldNotFoundError extends WorkflowExecutorError {
|
|
128
|
+
constructor(name, collectionName) {
|
|
129
|
+
super(`Field "${name}" not found in collection "${collectionName}"`, "The AI selected a field that doesn't exist on this record. Try rephrasing the step's prompt.");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
exports.FieldNotFoundError = FieldNotFoundError;
|
|
133
|
+
class FieldTypeMissingError extends WorkflowExecutorError {
|
|
134
|
+
constructor(name, collectionName) {
|
|
135
|
+
super(`Field "${name}" in collection "${collectionName}" has no column type`, "This field can't be updated because its type is missing from the schema. " +
|
|
136
|
+
'Contact your administrator if the problem persists.');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
exports.FieldTypeMissingError = FieldTypeMissingError;
|
|
140
|
+
class ActionNotFoundError extends WorkflowExecutorError {
|
|
141
|
+
constructor(name, collectionName) {
|
|
142
|
+
super(`Action "${name}" not found in collection "${collectionName}"`, "The AI selected an action that doesn't exist on this record. Try rephrasing the step's prompt.");
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
exports.ActionNotFoundError = ActionNotFoundError;
|
|
146
|
+
class StepStateError extends WorkflowExecutorError {
|
|
147
|
+
constructor(message) {
|
|
148
|
+
super(message, 'An unexpected error occurred while processing this step.');
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.StepStateError = StepStateError;
|
|
152
|
+
// Bubbles from base-step-executor, which converts it to a step error — no step runs without an audit log.
|
|
153
|
+
class ActivityLogCreationError extends WorkflowExecutorError {
|
|
154
|
+
constructor(cause) {
|
|
155
|
+
super('Failed to create activity log', 'Could not record this step in the audit log. Please try again, or contact your administrator if the problem persists.');
|
|
156
|
+
this.cause = cause;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.ActivityLogCreationError = ActivityLogCreationError;
|
|
160
|
+
class StepTimeoutError extends WorkflowExecutorError {
|
|
161
|
+
constructor(timeoutMs) {
|
|
162
|
+
super(`Step execution exceeded timeout of ${timeoutMs}ms`, 'The step took too long to complete. Please try again, or contact your administrator if the problem persists.');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.StepTimeoutError = StepTimeoutError;
|
|
166
|
+
// Thrown when the AI provider does not respond within the configured timeout — distinct from
|
|
167
|
+
// StepTimeoutError so we can surface a provider-specific message and tune the AI timeout
|
|
168
|
+
// independently of the step timeout (AI hangs are common; record fetches are not).
|
|
169
|
+
class AiInvokeTimeoutError extends WorkflowExecutorError {
|
|
170
|
+
constructor(timeoutMs) {
|
|
171
|
+
super(`AI provider did not respond within ${timeoutMs}ms`, 'The AI provider did not respond in time. Please try again, or contact your administrator if the problem persists.');
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.AiInvokeTimeoutError = AiInvokeTimeoutError;
|
|
175
|
+
class NoMcpToolsError extends WorkflowExecutorError {
|
|
176
|
+
constructor(requestedMcpServerId) {
|
|
177
|
+
super(`No MCP tools available for mcpServerId="${requestedMcpServerId}"`, 'Tools could not be loaded for the targeted server. Please try again, or contact your administrator if the problem persists.');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
exports.NoMcpToolsError = NoMcpToolsError;
|
|
181
|
+
class McpToolNotFoundError extends WorkflowExecutorError {
|
|
182
|
+
constructor(name) {
|
|
183
|
+
super(`MCP tool "${name}" not found`, "The AI selected a tool that doesn't exist. Try rephrasing the step's prompt.");
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.McpToolNotFoundError = McpToolNotFoundError;
|
|
187
|
+
class AgentPortError extends WorkflowExecutorError {
|
|
188
|
+
constructor(operation, cause) {
|
|
189
|
+
super(`Agent port "${operation}" failed: ${cause instanceof Error ? cause.message : String(cause)}`, 'An error occurred while accessing your data. Please try again.');
|
|
190
|
+
this.cause = cause;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
exports.AgentPortError = AgentPortError;
|
|
194
|
+
// Invariant guard: the agent port reads a collection's schema (for its primary keys) from the
|
|
195
|
+
// cache, which the executor must populate via getCollectionSchema before any record access.
|
|
196
|
+
class SchemaNotCachedError extends WorkflowExecutorError {
|
|
197
|
+
constructor(collectionName) {
|
|
198
|
+
super(`Collection schema for "${collectionName}" was not loaded before access — call getCollectionSchema first`, 'An error occurred while accessing your data. Please try again.');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.SchemaNotCachedError = SchemaNotCachedError;
|
|
202
|
+
class WorkflowPortError extends WorkflowExecutorError {
|
|
203
|
+
constructor(operation, cause) {
|
|
204
|
+
super(`Workflow port "${operation}" failed: ${cause instanceof Error ? cause.message : String(cause)}`, "This step couldn't be completed. Please try again, and contact your administrator if the problem continues.");
|
|
205
|
+
this.cause = cause;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.WorkflowPortError = WorkflowPortError;
|
|
209
|
+
class AiModelPortError extends WorkflowExecutorError {
|
|
210
|
+
constructor(operation, cause) {
|
|
211
|
+
super(`AI model "${operation}" failed: ${cause instanceof Error ? cause.message : String(cause)}`, 'The AI service is unavailable. Please try again or contact your administrator.');
|
|
212
|
+
this.cause = cause;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.AiModelPortError = AiModelPortError;
|
|
216
|
+
class McpToolInvocationError extends WorkflowExecutorError {
|
|
217
|
+
constructor(toolName, cause) {
|
|
218
|
+
super(`MCP tool "${toolName}" invocation failed: ${cause instanceof Error ? cause.message : String(cause)}`, 'The tool failed to execute. Please try again or contact your administrator.');
|
|
219
|
+
this.cause = cause;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
exports.McpToolInvocationError = McpToolInvocationError;
|
|
223
|
+
class ConfigurationError extends Error {
|
|
224
|
+
constructor(message) {
|
|
225
|
+
super(message);
|
|
226
|
+
this.name = 'ConfigurationError';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
exports.ConfigurationError = ConfigurationError;
|
|
230
|
+
class RunNotFoundError extends Error {
|
|
231
|
+
constructor(runId, cause) {
|
|
232
|
+
super(`Run "${runId}" not found or unavailable`);
|
|
233
|
+
this.name = 'RunNotFoundError';
|
|
234
|
+
if (cause !== undefined)
|
|
235
|
+
this.cause = cause;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
exports.RunNotFoundError = RunNotFoundError;
|
|
239
|
+
class UserMismatchError extends Error {
|
|
240
|
+
constructor(runId) {
|
|
241
|
+
super(`User not authorized for run "${runId}"`);
|
|
242
|
+
this.name = 'UserMismatchError';
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
exports.UserMismatchError = UserMismatchError;
|
|
246
|
+
class RunAlreadyInFlightError extends Error {
|
|
247
|
+
constructor(runId) {
|
|
248
|
+
super(`Run "${runId}" is already being processed`);
|
|
249
|
+
this.name = 'RunAlreadyInFlightError';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
exports.RunAlreadyInFlightError = RunAlreadyInFlightError;
|
|
253
|
+
class PendingDataNotFoundError extends Error {
|
|
254
|
+
constructor(runId, stepIndex) {
|
|
255
|
+
super(`Step ${stepIndex} in run "${runId}" not found or has no pending data`);
|
|
256
|
+
this.name = 'PendingDataNotFoundError';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.PendingDataNotFoundError = PendingDataNotFoundError;
|
|
260
|
+
class InvalidPendingDataError extends WorkflowExecutorError {
|
|
261
|
+
constructor(issues) {
|
|
262
|
+
super('Invalid pending data', 'The request body is invalid.');
|
|
263
|
+
this.issues = issues;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
exports.InvalidPendingDataError = InvalidPendingDataError;
|
|
267
|
+
class InvalidPreRecordedArgsError extends WorkflowExecutorError {
|
|
268
|
+
constructor(detail) {
|
|
269
|
+
super(`Invalid pre-recorded args: ${detail}`, 'The pre-configured step parameters are invalid');
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
exports.InvalidPreRecordedArgsError = InvalidPreRecordedArgsError;
|
|
273
|
+
// Boundary error — surfaces from Runner.start() and is caught at the CLI/HTTP layer, not by step executors.
|
|
274
|
+
class AgentProbeError extends Error {
|
|
275
|
+
constructor(message, options) {
|
|
276
|
+
super(`Agent probe failed: ${message}`);
|
|
277
|
+
this.name = 'AgentProbeError';
|
|
278
|
+
if (options?.cause !== undefined)
|
|
279
|
+
this.cause = options.cause;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
exports.AgentProbeError = AgentProbeError;
|
|
283
|
+
class UnsupportedStepTypeError extends WorkflowExecutorError {
|
|
284
|
+
constructor(stepType) {
|
|
285
|
+
super(`Step type "${stepType}" is not supported by the executor`, 'This step type is not yet supported.');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
exports.UnsupportedStepTypeError = UnsupportedStepTypeError;
|
|
289
|
+
class RecordIdSerializationError extends WorkflowExecutorError {
|
|
290
|
+
constructor(part) {
|
|
291
|
+
super(`Composite record id part "${part}" cannot contain the "|" separator`, 'A record identifier contains an unsupported character and cannot be processed.');
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
exports.RecordIdSerializationError = RecordIdSerializationError;
|
|
295
|
+
class InvalidStepDefinitionError extends WorkflowExecutorError {
|
|
296
|
+
constructor(detail) {
|
|
297
|
+
super(`Invalid step definition: ${detail}`, 'The workflow step configuration is invalid. Please check the workflow designer.');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
exports.InvalidStepDefinitionError = InvalidStepDefinitionError;
|
|
301
|
+
// Thrown when zod validation fails on a domain object produced internally (e.g. by the
|
|
302
|
+
// run-to-pending-step mapper). Distinct from InvalidStepDefinitionError (which flags wire-format
|
|
303
|
+
// bugs coming from the orchestrator) so the two can be triaged separately in Sentry.
|
|
304
|
+
class DomainValidationError extends WorkflowExecutorError {
|
|
305
|
+
constructor(runId, zodError) {
|
|
306
|
+
const issues = zodError.issues.map(i => ({
|
|
307
|
+
path: i.path.join('.') || '(root)',
|
|
308
|
+
message: i.message,
|
|
309
|
+
}));
|
|
310
|
+
const summary = issues.length
|
|
311
|
+
? issues.map(i => `${i.path}: ${i.message}`).join('; ')
|
|
312
|
+
: '(no zod issues reported — unexpected empty ZodError)';
|
|
313
|
+
super(`Run ${runId} mapper produced invalid AvailableStepExecution — ${summary}`, 'Internal validation error occurred while preparing the step. Please contact support.');
|
|
314
|
+
this.cause = zodError;
|
|
315
|
+
this.issues = issues;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
exports.DomainValidationError = DomainValidationError;
|
|
319
|
+
// Carries MalformedRunInfo so the Runner can report the run without re-parsing the message.
|
|
320
|
+
class MalformedRunError extends WorkflowExecutorError {
|
|
321
|
+
constructor(info) {
|
|
322
|
+
super(info.technicalMessage, info.userMessage);
|
|
323
|
+
this.info = info;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
exports.MalformedRunError = MalformedRunError;
|
|
327
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLQSxvQ0FJQztBQUlELGtEQVlDO0FBcEJELFNBQWdCLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxLQUE0QixDQUFDO0lBRS9DLE9BQU8sS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzVELENBQUM7QUFFRCxnR0FBZ0c7QUFDaEcsc0dBQXNHO0FBQ3RHLFNBQWdCLG1CQUFtQixDQUFDLEdBQWE7SUFDL0MsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxLQUFLLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRCxJQUFJLEdBQUcsQ0FBQyxPQUFPO1FBQUUsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDO0lBRXBDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxHQUEyQixDQUFDO0lBQy9DLElBQUksTUFBTSxZQUFZLEtBQUssSUFBSSxNQUFNLENBQUMsT0FBTztRQUFFLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUVyRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBMEIsQ0FBQztJQUM3QyxJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU87UUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFFbEUsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQztBQUNyQyxDQUFDO0FBRUQsTUFBc0IscUJBQXNCLFNBQVEsS0FBSztJQUl2RCxZQUFZLE9BQWUsRUFBRSxXQUFvQjtRQUMvQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJ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
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ActivityLogPort, CreateActivityLogArgs } from '../ports/activity-log-port';
|
|
2
|
+
import type { StepUser } from '../types/execution-context';
|
|
3
|
+
export type AuditTarget = Omit<CreateActivityLogArgs, 'renderingId'>;
|
|
4
|
+
export type TrackOptions<T> = {
|
|
5
|
+
operation: () => Promise<T>;
|
|
6
|
+
beforeCall?: () => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
export default class ActivityLog {
|
|
9
|
+
private readonly activityLogPort;
|
|
10
|
+
private readonly user;
|
|
11
|
+
constructor(activityLogPort: ActivityLogPort, user: StepUser);
|
|
12
|
+
track<T>(target: AuditTarget, { operation, beforeCall }: TrackOptions<T>): Promise<T>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=activity-log.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Runs an operation while recording an activity-log entry around it (pending → success/failed).
|
|
4
|
+
// It both executes `operation` and owns the activity-log transitions, so callers never touch the
|
|
5
|
+
// ActivityLogPort directly. `beforeCall` runs after createPending, just before the operation, so
|
|
6
|
+
// an audit-creation failure never leaves an orphan write-ahead marker.
|
|
7
|
+
class ActivityLog {
|
|
8
|
+
constructor(activityLogPort, user) {
|
|
9
|
+
this.activityLogPort = activityLogPort;
|
|
10
|
+
this.user = user;
|
|
11
|
+
}
|
|
12
|
+
async track(target, { operation, beforeCall }) {
|
|
13
|
+
const handle = await this.activityLogPort.createPending({
|
|
14
|
+
renderingId: this.user.renderingId,
|
|
15
|
+
...target,
|
|
16
|
+
});
|
|
17
|
+
try {
|
|
18
|
+
if (beforeCall)
|
|
19
|
+
await beforeCall();
|
|
20
|
+
const result = await operation();
|
|
21
|
+
void this.activityLogPort.markSucceeded(handle);
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
catch (err) {
|
|
25
|
+
// The step error is logged/surfaced by base-step-executor when rethrown, so the audit
|
|
26
|
+
// transition only needs the handle.
|
|
27
|
+
void this.activityLogPort.markFailed(handle);
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
exports.default = ActivityLog;
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2V4ZWN1dG9ycy9hY3Rpdml0eS1sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFhQSxnR0FBZ0c7QUFDaEcsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyx1RUFBdUU7QUFDdkUsTUFBcUIsV0FBVztJQUs5QixZQUFZLGVBQWdDLEVBQUUsSUFBYztRQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUssQ0FBSSxNQUFtQixFQUFFLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBbUI7UUFDNUUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQztZQUN0RCxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQ2xDLEdBQUcsTUFBTTtTQUNWLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQztZQUNILElBQUksVUFBVTtnQkFBRSxNQUFNLFVBQVUsRUFBRSxDQUFDO1lBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxFQUFFLENBQUM7WUFDakMsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUVoRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLHNGQUFzRjtZQUN0RixvQ0FBb0M7WUFDcEMsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxNQUFNLEdBQUcsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3QkQsOEJBNkJDIn0=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type ActivityLog from './activity-log';
|
|
2
|
+
import type { AgentPort, ExecuteActionQuery, GetActionFormInfoQuery, GetRecordQuery, GetRelatedDataQuery, GetSingleRelatedDataQuery, UpdateRecordQuery } from '../ports/agent-port';
|
|
3
|
+
import type SchemaResolver from '../schema-resolver';
|
|
4
|
+
import type { StepUser } from '../types/execution-context';
|
|
5
|
+
import type { RecordData } from '../types/validated/collection';
|
|
6
|
+
type WriteOptions = {
|
|
7
|
+
beforeCall: () => Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
export interface AgentWithLogDeps {
|
|
10
|
+
agentPort: AgentPort;
|
|
11
|
+
schemaResolver: SchemaResolver;
|
|
12
|
+
user: StepUser;
|
|
13
|
+
activityLog: ActivityLog;
|
|
14
|
+
}
|
|
15
|
+
export default class AgentWithLog {
|
|
16
|
+
private readonly agentPort;
|
|
17
|
+
private readonly schemaResolver;
|
|
18
|
+
private readonly user;
|
|
19
|
+
private readonly activityLog;
|
|
20
|
+
constructor(deps: AgentWithLogDeps);
|
|
21
|
+
getRecord(query: GetRecordQuery): Promise<RecordData>;
|
|
22
|
+
getRelatedData(query: GetRelatedDataQuery): Promise<RecordData[]>;
|
|
23
|
+
getSingleRelatedData(query: GetSingleRelatedDataQuery): Promise<RecordData | null>;
|
|
24
|
+
updateRecord(query: UpdateRecordQuery, opts: WriteOptions): Promise<RecordData>;
|
|
25
|
+
executeAction(query: ExecuteActionQuery, opts: WriteOptions): Promise<unknown>;
|
|
26
|
+
getActionFormInfo(query: GetActionFormInfoQuery): Promise<{
|
|
27
|
+
hasForm: boolean;
|
|
28
|
+
}>;
|
|
29
|
+
private relationLabel;
|
|
30
|
+
private resolveSchema;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=agent-with-log.d.ts.map
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Wraps AgentPort and runs each data-access call through the ActivityLog so it records an
|
|
4
|
+
// activity-log entry. The audit target is derived from the call: the numeric collectionId is
|
|
5
|
+
// resolved from the call's collection name, the recordId from its id. Idempotency stays in the
|
|
6
|
+
// executors: write methods forward a `beforeCall` thunk (the executor's write-ahead marker).
|
|
7
|
+
class AgentWithLog {
|
|
8
|
+
constructor(deps) {
|
|
9
|
+
this.agentPort = deps.agentPort;
|
|
10
|
+
this.schemaResolver = deps.schemaResolver;
|
|
11
|
+
this.user = deps.user;
|
|
12
|
+
this.activityLog = deps.activityLog;
|
|
13
|
+
}
|
|
14
|
+
async getRecord(query) {
|
|
15
|
+
const { collectionId } = await this.resolveSchema(query.collection);
|
|
16
|
+
return this.activityLog.track({ action: 'index', type: 'read', collectionId, recordId: query.id }, { operation: () => this.agentPort.getRecord(query, this.user) });
|
|
17
|
+
}
|
|
18
|
+
async getRelatedData(query) {
|
|
19
|
+
const schema = await this.resolveSchema(query.collection);
|
|
20
|
+
return this.activityLog.track({
|
|
21
|
+
action: 'listRelatedData',
|
|
22
|
+
type: 'read',
|
|
23
|
+
collectionId: schema.collectionId,
|
|
24
|
+
recordId: query.id,
|
|
25
|
+
label: this.relationLabel(schema, query.relation),
|
|
26
|
+
}, { operation: () => this.agentPort.getRelatedData(query, this.user) });
|
|
27
|
+
}
|
|
28
|
+
async getSingleRelatedData(query) {
|
|
29
|
+
const schema = await this.resolveSchema(query.collection);
|
|
30
|
+
return this.activityLog.track({
|
|
31
|
+
action: 'listRelatedData',
|
|
32
|
+
type: 'read',
|
|
33
|
+
collectionId: schema.collectionId,
|
|
34
|
+
recordId: query.id,
|
|
35
|
+
label: this.relationLabel(schema, query.relation),
|
|
36
|
+
}, { operation: () => this.agentPort.getSingleRelatedData(query, this.user) });
|
|
37
|
+
}
|
|
38
|
+
async updateRecord(query, opts) {
|
|
39
|
+
const { collectionId } = await this.resolveSchema(query.collection);
|
|
40
|
+
return this.activityLog.track({ action: 'update', type: 'write', collectionId, recordId: query.id, label: 'updated' }, {
|
|
41
|
+
operation: () => this.agentPort.updateRecord(query, this.user),
|
|
42
|
+
beforeCall: opts.beforeCall,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async executeAction(query, opts) {
|
|
46
|
+
const { collectionId } = await this.resolveSchema(query.collection);
|
|
47
|
+
return this.activityLog.track({
|
|
48
|
+
action: 'action',
|
|
49
|
+
type: 'write',
|
|
50
|
+
collectionId,
|
|
51
|
+
recordId: query.id,
|
|
52
|
+
label: `triggered the action "${query.action}"`,
|
|
53
|
+
}, {
|
|
54
|
+
operation: () => this.agentPort.executeAction(query, this.user),
|
|
55
|
+
beforeCall: opts.beforeCall,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Unaudited passthrough: form-info is a read-only probe (does this action have a form?),
|
|
59
|
+
// not a data access, so unlike the methods above it records NO activity-log entry.
|
|
60
|
+
getActionFormInfo(query) {
|
|
61
|
+
return this.agentPort.getActionFormInfo(query, this.user);
|
|
62
|
+
}
|
|
63
|
+
// ISO with the browser engine: `list relation "<displayName>"`. The query carries the technical
|
|
64
|
+
// relation name; resolve its displayName from the source schema, falling back to the technical
|
|
65
|
+
// name when the field is absent (resilient to orchestrator schema drift).
|
|
66
|
+
relationLabel(schema, relation) {
|
|
67
|
+
const displayName = schema.fields.filter(f => f.isRelationship).find(f => f.fieldName === relation)
|
|
68
|
+
?.displayName ?? relation;
|
|
69
|
+
return `list relation "${displayName}"`;
|
|
70
|
+
}
|
|
71
|
+
resolveSchema(collectionName) {
|
|
72
|
+
return this.schemaResolver.resolve(collectionName);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.default = AgentWithLog;
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtd2l0aC1sb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXhlY3V0b3JzL2FnZW50LXdpdGgtbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBdUJBLDBGQUEwRjtBQUMxRiw2RkFBNkY7QUFDN0YsK0ZBQStGO0FBQy9GLDZGQUE2RjtBQUM3RixNQUFxQixZQUFZO0lBUy9CLFlBQVksSUFBc0I7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQXFCO1FBQ25DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQzNCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUNuRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2hFLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUEwQjtRQUM3QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFELE9BQU8sSUFBSSxDQUFDLFdB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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ExecutionContext, IStepExecutor, StepExecutionResult } from '../types/execution-context';
|
|
2
|
+
import type { ConfirmableStepExecutionData, StepExecutionData } from '../types/step-execution-data';
|
|
3
|
+
import type { Step } from '../types/validated/execution';
|
|
4
|
+
import type { StepDefinition } from '../types/validated/step-definition';
|
|
5
|
+
import type { StepStatus } from '../types/validated/step-outcome';
|
|
6
|
+
import type { BaseMessage, DynamicStructuredTool, StructuredToolInterface } from '@forestadmin/ai-proxy';
|
|
7
|
+
import { SystemMessage } from '@forestadmin/ai-proxy';
|
|
8
|
+
export default abstract class BaseStepExecutor<TStep extends StepDefinition = StepDefinition> implements IStepExecutor {
|
|
9
|
+
protected readonly context: ExecutionContext<TStep>;
|
|
10
|
+
constructor(context: ExecutionContext<TStep>);
|
|
11
|
+
execute(): Promise<StepExecutionResult>;
|
|
12
|
+
protected abstract doExecute(): Promise<StepExecutionResult>;
|
|
13
|
+
protected checkIdempotency(): Promise<StepExecutionResult | null>;
|
|
14
|
+
private runWithTimeout;
|
|
15
|
+
protected abstract buildOutcomeResult(outcome: {
|
|
16
|
+
status: StepStatus;
|
|
17
|
+
error?: string;
|
|
18
|
+
}): StepExecutionResult;
|
|
19
|
+
protected findPendingExecution<TExec extends ConfirmableStepExecutionData>(type: string): Promise<TExec | undefined>;
|
|
20
|
+
protected patchAndReloadPendingData<TExec extends ConfirmableStepExecutionData>(pendingData?: unknown): Promise<TExec | undefined>;
|
|
21
|
+
protected handleConfirmationFlow<TExec extends ConfirmableStepExecutionData>(execution: TExec, resolveAndExecute: (execution: TExec) => Promise<StepExecutionResult>): Promise<StepExecutionResult>;
|
|
22
|
+
protected buildContextMessage(): SystemMessage;
|
|
23
|
+
protected buildPreviousStepsMessages(): Promise<SystemMessage[]>;
|
|
24
|
+
protected resolveStepExecution(step: Step, executions: StepExecutionData[]): StepExecutionData | undefined;
|
|
25
|
+
private static mergeLeadingSystemMessages;
|
|
26
|
+
private static assertNoMidArraySystemMessages;
|
|
27
|
+
protected invokeWithTools<T = Record<string, unknown>>(messages: BaseMessage[], tools: StructuredToolInterface[]): Promise<{
|
|
28
|
+
toolName: string;
|
|
29
|
+
args: T;
|
|
30
|
+
}>;
|
|
31
|
+
protected invokeWithTool<T = Record<string, unknown>>(messages: BaseMessage[], tool: DynamicStructuredTool): Promise<T>;
|
|
32
|
+
protected getExtraLogContext(): Record<string, unknown>;
|
|
33
|
+
protected get logCtx(): {
|
|
34
|
+
runId: string;
|
|
35
|
+
stepId: string;
|
|
36
|
+
stepIndex: number;
|
|
37
|
+
stepType: import("../types/validated/step-definition").StepType;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=base-step-executor.d.ts.map
|