@orbytautomation/engine 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/core/EngineLogger.d.ts +34 -2
- package/dist/core/EngineLogger.d.ts.map +1 -1
- package/dist/core/EngineLogger.js +44 -3
- package/dist/core/EngineLogger.js.map +1 -1
- package/dist/errors/ErrorCodes.d.ts +205 -6
- package/dist/errors/ErrorCodes.d.ts.map +1 -1
- package/dist/errors/ErrorCodes.js +398 -5
- package/dist/errors/ErrorCodes.js.map +1 -1
- package/dist/errors/ErrorDebugger.d.ts +98 -0
- package/dist/errors/ErrorDebugger.d.ts.map +1 -0
- package/dist/errors/ErrorDebugger.js +283 -0
- package/dist/errors/ErrorDebugger.js.map +1 -0
- package/dist/errors/ErrorDetector.d.ts +148 -0
- package/dist/errors/ErrorDetector.d.ts.map +1 -0
- package/dist/errors/ErrorDetector.js +358 -0
- package/dist/errors/ErrorDetector.js.map +1 -0
- package/dist/errors/ErrorFormatter.d.ts +92 -3
- package/dist/errors/ErrorFormatter.d.ts.map +1 -1
- package/dist/errors/ErrorFormatter.js +220 -4
- package/dist/errors/ErrorFormatter.js.map +1 -1
- package/dist/errors/ErrorHandler.d.ts +259 -0
- package/dist/errors/ErrorHandler.d.ts.map +1 -0
- package/dist/errors/ErrorHandler.js +378 -0
- package/dist/errors/ErrorHandler.js.map +1 -0
- package/dist/errors/FieldRegistry.d.ts +39 -0
- package/dist/errors/FieldRegistry.d.ts.map +1 -1
- package/dist/errors/FieldRegistry.js +172 -74
- package/dist/errors/FieldRegistry.js.map +1 -1
- package/dist/errors/OrbytError.d.ts +85 -3
- package/dist/errors/OrbytError.d.ts.map +1 -1
- package/dist/errors/OrbytError.js +151 -4
- package/dist/errors/OrbytError.js.map +1 -1
- package/dist/errors/SchedulerError.d.ts +93 -1
- package/dist/errors/SchedulerError.d.ts.map +1 -1
- package/dist/errors/SchedulerError.js +145 -1
- package/dist/errors/SchedulerError.js.map +1 -1
- package/dist/errors/SecurityErrors.d.ts +94 -12
- package/dist/errors/SecurityErrors.d.ts.map +1 -1
- package/dist/errors/SecurityErrors.js +162 -18
- package/dist/errors/SecurityErrors.js.map +1 -1
- package/dist/errors/StepError.d.ts +111 -1
- package/dist/errors/StepError.d.ts.map +1 -1
- package/dist/errors/StepError.js +182 -1
- package/dist/errors/StepError.js.map +1 -1
- package/dist/errors/WorkflowError.d.ts +139 -2
- package/dist/errors/WorkflowError.d.ts.map +1 -1
- package/dist/errors/WorkflowError.js +264 -22
- package/dist/errors/WorkflowError.js.map +1 -1
- package/dist/errors/index.d.ts +5 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +7 -4
- package/dist/errors/index.js.map +1 -1
- package/dist/loader/WorkflowLoader.d.ts +83 -21
- package/dist/loader/WorkflowLoader.d.ts.map +1 -1
- package/dist/loader/WorkflowLoader.js +169 -55
- package/dist/loader/WorkflowLoader.js.map +1 -1
- package/dist/parser/SchemaValidator.d.ts.map +1 -1
- package/dist/parser/SchemaValidator.js +2 -1
- package/dist/parser/SchemaValidator.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handler (Automatic Error Management)
|
|
3
|
+
*
|
|
4
|
+
* Central error handling system that orchestrates detection, logging, and execution control.
|
|
5
|
+
* Designed to work automatically without manual error handling in engine.
|
|
6
|
+
*
|
|
7
|
+
* ARCHITECTURE:
|
|
8
|
+
* =============
|
|
9
|
+
* - AUTOMATIC in Engine: Errors are auto-detected and classified
|
|
10
|
+
* - MANUAL in CLI/API/SDK: Use ErrorHandler explicitly for custom handling
|
|
11
|
+
* - INTEGRATED with WorkflowLoader: Validates and detects errors on load
|
|
12
|
+
*
|
|
13
|
+
* EXECUTION CONTROL:
|
|
14
|
+
* ==================
|
|
15
|
+
* Based on severity, automatically determines what to do:
|
|
16
|
+
* - CRITICAL/FATAL → Stop entire workflow immediately
|
|
17
|
+
* - ERROR → Stop entire workflow
|
|
18
|
+
* - MEDIUM → Stop current step, try next step
|
|
19
|
+
* - LOW/WARNING/INFO → Log and continue
|
|
20
|
+
*
|
|
21
|
+
* USAGE:
|
|
22
|
+
* ======
|
|
23
|
+
* ```typescript
|
|
24
|
+
* // In Engine (automatic):
|
|
25
|
+
* try {
|
|
26
|
+
* await executeStep(step);
|
|
27
|
+
* } catch (error) {
|
|
28
|
+
* const result = await ErrorHandler.handle(error, {
|
|
29
|
+
* location: `steps[${index}]`,
|
|
30
|
+
* stepId: step.id
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* if (result.shouldStopWorkflow) {
|
|
34
|
+
* throw result.error;
|
|
35
|
+
* }
|
|
36
|
+
* if (result.shouldStopStep) {
|
|
37
|
+
* continue; // Skip to next step
|
|
38
|
+
* }
|
|
39
|
+
* // Continue current step
|
|
40
|
+
* }
|
|
41
|
+
*
|
|
42
|
+
* // In CLI/API (manual):
|
|
43
|
+
* try {
|
|
44
|
+
* const workflow = await WorkflowLoader.fromFile(path);
|
|
45
|
+
* } catch (error) {
|
|
46
|
+
* const result = await ErrorHandler.handle(error, { location: path });
|
|
47
|
+
* console.error(result.debug?.formatted);
|
|
48
|
+
* process.exit(result.error.exitCode);
|
|
49
|
+
* }
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* @module errors/handler
|
|
53
|
+
*/
|
|
54
|
+
import { OrbytError } from './OrbytError.js';
|
|
55
|
+
import { ErrorDetector } from './ErrorDetector.js';
|
|
56
|
+
import { ErrorDebugger } from './ErrorDebugger.js';
|
|
57
|
+
import { formatDetailedError } from './ErrorFormatter.js';
|
|
58
|
+
import { ErrorSeverity, ExecutionControl, getExecutionControl, shouldStopWorkflow, shouldStopStep, } from './ErrorCodes.js';
|
|
59
|
+
/**
|
|
60
|
+
* Error Handler
|
|
61
|
+
*
|
|
62
|
+
* Unified error handling system for Orbyt engine.
|
|
63
|
+
* Automatically detects, classifies, logs, and controls execution based on errors.
|
|
64
|
+
*/
|
|
65
|
+
export class ErrorHandler {
|
|
66
|
+
/**
|
|
67
|
+
* Handle any error - the main entry point
|
|
68
|
+
*
|
|
69
|
+
* Automatically:
|
|
70
|
+
* 1. Detects and classifies error type
|
|
71
|
+
* 2. Determines severity level
|
|
72
|
+
* 3. Logs appropriately
|
|
73
|
+
* 4. Generates debug info (if enabled)
|
|
74
|
+
* 5. Returns execution control decision
|
|
75
|
+
*
|
|
76
|
+
* @param error - Any error (OrbytError, Error, string, or error context)
|
|
77
|
+
* @param errorContext - Context about where error occurred
|
|
78
|
+
* @param options - Configuration options
|
|
79
|
+
* @returns Complete error handling result with execution decisions
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* // Automatic handling in engine
|
|
84
|
+
* const result = await ErrorHandler.handle(error, {
|
|
85
|
+
* location: 'workflow.steps[2]',
|
|
86
|
+
* stepId: 'fetch-data'
|
|
87
|
+
* });
|
|
88
|
+
*
|
|
89
|
+
* if (result.shouldStopWorkflow) {
|
|
90
|
+
* throw result.error; // Stop execution
|
|
91
|
+
* }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
static async handle(error, errorContext, options = {}) {
|
|
95
|
+
const { enableLogging = true, enableDebug = false, useColors = true, logger = console, context = {}, } = options;
|
|
96
|
+
// STEP 1: Detect and classify error → OrbytError
|
|
97
|
+
const orbytError = this.detectError(error, errorContext);
|
|
98
|
+
// STEP 2: Determine execution control based on severity
|
|
99
|
+
const control = getExecutionControl(orbytError.severity);
|
|
100
|
+
const stopWorkflow = shouldStopWorkflow(orbytError.severity);
|
|
101
|
+
const stopStep = shouldStopStep(orbytError.severity);
|
|
102
|
+
const continueExecution = control === ExecutionControl.CONTINUE;
|
|
103
|
+
// STEP 3: Log error if logging is enabled
|
|
104
|
+
let logEntry;
|
|
105
|
+
if (enableLogging) {
|
|
106
|
+
logEntry = this.logError(orbytError, logger, context);
|
|
107
|
+
}
|
|
108
|
+
// STEP 4: Generate debug information if enabled
|
|
109
|
+
let debug;
|
|
110
|
+
if (enableDebug) {
|
|
111
|
+
debug = this.generateDebugInfo(orbytError, useColors);
|
|
112
|
+
}
|
|
113
|
+
// STEP 5: Return complete result
|
|
114
|
+
return {
|
|
115
|
+
error: orbytError,
|
|
116
|
+
control,
|
|
117
|
+
shouldStopWorkflow: stopWorkflow,
|
|
118
|
+
shouldStopStep: stopStep,
|
|
119
|
+
shouldContinue: continueExecution,
|
|
120
|
+
debug,
|
|
121
|
+
logEntry,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Handle error from WorkflowLoader
|
|
126
|
+
* Special handling for load-time errors with file path context
|
|
127
|
+
*
|
|
128
|
+
* @param error - Error from loader
|
|
129
|
+
* @param filePath - Path to workflow file being loaded
|
|
130
|
+
* @param options - Handler options
|
|
131
|
+
* @returns Error handling result
|
|
132
|
+
*/
|
|
133
|
+
static async handleLoaderError(error, filePath, options = {}) {
|
|
134
|
+
return this.handle(error, {
|
|
135
|
+
location: filePath,
|
|
136
|
+
type: this.detectLoaderErrorType(error),
|
|
137
|
+
}, {
|
|
138
|
+
...options,
|
|
139
|
+
enableDebug: true, // Always enable debug for loader errors
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handle error from context object
|
|
144
|
+
* When you already know the error type and have context
|
|
145
|
+
*
|
|
146
|
+
* @param context - Error context with type and data
|
|
147
|
+
* @param options - Handler options
|
|
148
|
+
* @returns Error handling result
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* const result = await ErrorHandler.handleContext({
|
|
153
|
+
* type: 'missing_field',
|
|
154
|
+
* field: 'version',
|
|
155
|
+
* location: 'workflow'
|
|
156
|
+
* });
|
|
157
|
+
* ```
|
|
158
|
+
*/
|
|
159
|
+
static async handleContext(context, options = {}) {
|
|
160
|
+
const error = ErrorDetector.detect(context);
|
|
161
|
+
return this.handle(error, context, options);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Quick handle - simplified for common use cases
|
|
165
|
+
* Returns just a boolean: should stop execution?
|
|
166
|
+
*
|
|
167
|
+
* @param error - Error to handle
|
|
168
|
+
* @param location - Where error occurred
|
|
169
|
+
* @returns True if should stop execution, false if can continue
|
|
170
|
+
*
|
|
171
|
+
* @example
|
|
172
|
+
* ```typescript
|
|
173
|
+
* if (await ErrorHandler.shouldStop(error, 'workflow.steps[2]')) {
|
|
174
|
+
* throw error; // Stop execution
|
|
175
|
+
* }
|
|
176
|
+
* // Continue execution
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
static async shouldStop(error, location) {
|
|
180
|
+
const result = await this.handle(error, { location }, {
|
|
181
|
+
enableLogging: true,
|
|
182
|
+
enableDebug: false
|
|
183
|
+
});
|
|
184
|
+
return result.shouldStopWorkflow;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Batch handle multiple errors
|
|
188
|
+
* Useful for validation that collects multiple errors
|
|
189
|
+
*
|
|
190
|
+
* @param errors - Array of errors
|
|
191
|
+
* @param options - Handler options
|
|
192
|
+
* @returns Array of handling results
|
|
193
|
+
*/
|
|
194
|
+
static async handleBatch(errors, options = {}) {
|
|
195
|
+
const results = await Promise.all(errors.map(error => this.handle(error, undefined, options)));
|
|
196
|
+
return results;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get most severe error from batch
|
|
200
|
+
* Returns the error that should take precedence
|
|
201
|
+
*
|
|
202
|
+
* @param results - Array of error handling results
|
|
203
|
+
* @returns Most severe error result
|
|
204
|
+
*/
|
|
205
|
+
static getMostSevere(results) {
|
|
206
|
+
if (results.length === 0)
|
|
207
|
+
return undefined;
|
|
208
|
+
const severityOrder = [
|
|
209
|
+
ErrorSeverity.CRITICAL,
|
|
210
|
+
ErrorSeverity.FATAL,
|
|
211
|
+
ErrorSeverity.ERROR,
|
|
212
|
+
ErrorSeverity.MEDIUM,
|
|
213
|
+
ErrorSeverity.LOW,
|
|
214
|
+
ErrorSeverity.WARNING,
|
|
215
|
+
ErrorSeverity.INFO,
|
|
216
|
+
];
|
|
217
|
+
return results.reduce((mostSevere, current) => {
|
|
218
|
+
const currentIndex = severityOrder.indexOf(current.error.severity);
|
|
219
|
+
const mostSevereIndex = severityOrder.indexOf(mostSevere.error.severity);
|
|
220
|
+
return currentIndex < mostSevereIndex ? current : mostSevere;
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if any errors in batch should stop workflow
|
|
225
|
+
*
|
|
226
|
+
* @param results - Array of error handling results
|
|
227
|
+
* @returns True if any error should stop workflow
|
|
228
|
+
*/
|
|
229
|
+
static shouldStopWorkflowForBatch(results) {
|
|
230
|
+
return results.some(result => result.shouldStopWorkflow);
|
|
231
|
+
}
|
|
232
|
+
// ==================== PRIVATE HELPERS ====================
|
|
233
|
+
/**
|
|
234
|
+
* Detect and classify error into OrbytError
|
|
235
|
+
*/
|
|
236
|
+
static detectError(error, context) {
|
|
237
|
+
// Already an OrbytError - return as-is
|
|
238
|
+
if (error instanceof OrbytError) {
|
|
239
|
+
return error;
|
|
240
|
+
}
|
|
241
|
+
// Standard Error - try to classify
|
|
242
|
+
if (error instanceof Error) {
|
|
243
|
+
return ErrorDetector.detectFromException(error, context?.location);
|
|
244
|
+
}
|
|
245
|
+
// Error context object - detect from context
|
|
246
|
+
if (typeof error === 'object' && error !== null && 'type' in error) {
|
|
247
|
+
return ErrorDetector.detect(error);
|
|
248
|
+
}
|
|
249
|
+
// String error message - create generic error
|
|
250
|
+
if (typeof error === 'string') {
|
|
251
|
+
return ErrorDetector.detect({
|
|
252
|
+
type: 'unknown',
|
|
253
|
+
rawMessage: error,
|
|
254
|
+
location: context?.location,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
// Unknown error type - create generic error
|
|
258
|
+
return ErrorDetector.detect({
|
|
259
|
+
type: 'unknown',
|
|
260
|
+
rawMessage: String(error),
|
|
261
|
+
location: context?.location,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Detect error type from WorkflowLoader errors
|
|
266
|
+
*/
|
|
267
|
+
static detectLoaderErrorType(error) {
|
|
268
|
+
if (!(error instanceof Error))
|
|
269
|
+
return 'unknown';
|
|
270
|
+
const message = error.message.toLowerCase();
|
|
271
|
+
if (message.includes('file not found') || message.includes('enoent')) {
|
|
272
|
+
return 'unknown'; // Will be classified as RUNTIME_FILE_NOT_FOUND
|
|
273
|
+
}
|
|
274
|
+
if (message.includes('yaml') || message.includes('syntax')) {
|
|
275
|
+
return 'parse_error';
|
|
276
|
+
}
|
|
277
|
+
if (message.includes('json')) {
|
|
278
|
+
return 'parse_error';
|
|
279
|
+
}
|
|
280
|
+
if (message.includes('reserved field')) {
|
|
281
|
+
return 'reserved_field';
|
|
282
|
+
}
|
|
283
|
+
if (message.includes('unknown field')) {
|
|
284
|
+
return 'unknown_field';
|
|
285
|
+
}
|
|
286
|
+
if (message.includes('missing') || message.includes('required')) {
|
|
287
|
+
return 'missing_field';
|
|
288
|
+
}
|
|
289
|
+
return 'unknown';
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Log error with appropriate level
|
|
293
|
+
*/
|
|
294
|
+
static logError(error, logger, context) {
|
|
295
|
+
const metadata = {
|
|
296
|
+
code: error.code,
|
|
297
|
+
exitCode: error.exitCode,
|
|
298
|
+
severity: error.severity,
|
|
299
|
+
path: error.path,
|
|
300
|
+
category: error.category,
|
|
301
|
+
isUserError: error.isUserError,
|
|
302
|
+
isRetryable: error.isRetryable,
|
|
303
|
+
hint: error.hint,
|
|
304
|
+
context: error.diagnostic.context,
|
|
305
|
+
...context,
|
|
306
|
+
};
|
|
307
|
+
const message = `[${error.code}] ${error.message}`;
|
|
308
|
+
const timestamp = new Date();
|
|
309
|
+
// Log based on severity
|
|
310
|
+
switch (error.severity) {
|
|
311
|
+
case ErrorSeverity.CRITICAL:
|
|
312
|
+
case ErrorSeverity.FATAL:
|
|
313
|
+
case ErrorSeverity.ERROR:
|
|
314
|
+
logger?.error?.(message, metadata);
|
|
315
|
+
return { level: 'error', message, metadata, timestamp };
|
|
316
|
+
case ErrorSeverity.MEDIUM:
|
|
317
|
+
case ErrorSeverity.LOW:
|
|
318
|
+
case ErrorSeverity.WARNING:
|
|
319
|
+
logger?.warn?.(message, metadata);
|
|
320
|
+
return { level: 'warn', message, metadata, timestamp };
|
|
321
|
+
case ErrorSeverity.INFO:
|
|
322
|
+
logger?.info?.(message, metadata);
|
|
323
|
+
return { level: 'info', message, metadata, timestamp };
|
|
324
|
+
default:
|
|
325
|
+
logger?.error?.(message, metadata);
|
|
326
|
+
return { level: 'error', message, metadata, timestamp };
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Generate complete debug information
|
|
331
|
+
*/
|
|
332
|
+
static generateDebugInfo(error, useColors) {
|
|
333
|
+
const debugInfo = ErrorDebugger.analyze(error);
|
|
334
|
+
const formatted = ErrorDebugger.format(error, useColors);
|
|
335
|
+
const detailed = formatDetailedError(error, useColors);
|
|
336
|
+
const quickFix = ErrorDebugger.quickDebug(error);
|
|
337
|
+
return {
|
|
338
|
+
explanation: debugInfo.explanation,
|
|
339
|
+
cause: debugInfo.cause,
|
|
340
|
+
fixSteps: debugInfo.fixSteps,
|
|
341
|
+
quickFix,
|
|
342
|
+
formatted,
|
|
343
|
+
detailed,
|
|
344
|
+
commonMistakes: debugInfo.commonMistakes,
|
|
345
|
+
estimatedFixTime: debugInfo.estimatedFixTime,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Global error handler instance for convenience
|
|
351
|
+
* Can be used for setting default options
|
|
352
|
+
*/
|
|
353
|
+
export class GlobalErrorHandler {
|
|
354
|
+
static defaultOptions = {
|
|
355
|
+
enableLogging: true,
|
|
356
|
+
enableDebug: false,
|
|
357
|
+
useColors: true,
|
|
358
|
+
};
|
|
359
|
+
/**
|
|
360
|
+
* Configure default options for all error handling
|
|
361
|
+
*/
|
|
362
|
+
static configure(options) {
|
|
363
|
+
this.defaultOptions = { ...this.defaultOptions, ...options };
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Handle error with default options
|
|
367
|
+
*/
|
|
368
|
+
static async handle(error, context) {
|
|
369
|
+
return ErrorHandler.handle(error, context, this.defaultOptions);
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get current default options
|
|
373
|
+
*/
|
|
374
|
+
static getOptions() {
|
|
375
|
+
return { ...this.defaultOptions };
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=ErrorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../src/errors/ErrorHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,10 +11,13 @@
|
|
|
11
11
|
/**
|
|
12
12
|
* Valid fields at workflow root level
|
|
13
13
|
* MUST stay in sync with OrbytWorkflowSchema in @dev-ecosystem/core
|
|
14
|
+
* Last synced: 2026-02-15
|
|
14
15
|
*/
|
|
15
16
|
export declare const ROOT_FIELDS: readonly ["version", "kind", "workflow", "metadata", "annotations", "triggers", "secrets", "inputs", "context", "defaults", "policies", "permissions", "resources", "outputs", "on", "usage", "strategy", "profiles", "compliance", "provenance", "execution", "outputsSchema", "telemetry", "accounting", "compatibility", "failurePolicy", "rollback", "governance"];
|
|
16
17
|
/**
|
|
17
18
|
* Valid fields in metadata object
|
|
19
|
+
* MUST stay in sync with MetadataSchema in @dev-ecosystem/core
|
|
20
|
+
* Last synced: 2026-02-15
|
|
18
21
|
*/
|
|
19
22
|
export declare const METADATA_FIELDS: readonly ["name", "description", "tags", "owner", "version", "createdAt", "updatedAt", "v1", "future"];
|
|
20
23
|
/**
|
|
@@ -24,22 +27,31 @@ export declare const WORKFLOW_FIELDS: readonly ["steps"];
|
|
|
24
27
|
/**
|
|
25
28
|
* Valid fields in step definition
|
|
26
29
|
* MUST stay in sync with StepSchema in @dev-ecosystem/core
|
|
30
|
+
* Last synced: 2026-02-15
|
|
27
31
|
*/
|
|
28
32
|
export declare const STEP_FIELDS: readonly ["id", "uses", "name", "with", "when", "needs", "retry", "timeout", "continueOnError", "outputs", "env", "usage", "ref", "requires", "hints", "contracts", "profiles", "onFailure", "telemetry", "rollback"];
|
|
29
33
|
/**
|
|
30
34
|
* Valid fields in secrets config
|
|
35
|
+
* MUST stay in sync with SecretsSchema in @dev-ecosystem/core
|
|
36
|
+
* Last synced: 2026-02-15
|
|
31
37
|
*/
|
|
32
38
|
export declare const SECRETS_FIELDS: readonly ["vault", "keys"];
|
|
33
39
|
/**
|
|
34
40
|
* Valid fields in context config
|
|
41
|
+
* MUST stay in sync with ContextSchema in @dev-ecosystem/core
|
|
42
|
+
* Last synced: 2026-02-15
|
|
35
43
|
*/
|
|
36
44
|
export declare const CONTEXT_FIELDS: readonly ["env", "platform", "workspace"];
|
|
37
45
|
/**
|
|
38
46
|
* Valid fields in defaults config
|
|
47
|
+
* MUST stay in sync with DefaultsSchema in @dev-ecosystem/core
|
|
48
|
+
* Last synced: 2026-02-15
|
|
39
49
|
*/
|
|
40
50
|
export declare const DEFAULTS_FIELDS: readonly ["retry", "timeout", "adapter"];
|
|
41
51
|
/**
|
|
42
52
|
* Valid fields in policies config
|
|
53
|
+
* MUST stay in sync with PoliciesSchema in @dev-ecosystem/core
|
|
54
|
+
* Last synced: 2026-02-15
|
|
43
55
|
*/
|
|
44
56
|
export declare const POLICIES_FIELDS: readonly ["failure", "concurrency", "sandbox"];
|
|
45
57
|
/**
|
|
@@ -48,6 +60,8 @@ export declare const POLICIES_FIELDS: readonly ["failure", "concurrency", "sandb
|
|
|
48
60
|
export declare const PERMISSIONS_FIELDS: readonly ["fs", "network"];
|
|
49
61
|
/**
|
|
50
62
|
* Valid fields in retry config
|
|
63
|
+
* MUST stay in sync with RetryConfigSchema in @dev-ecosystem/core
|
|
64
|
+
* Last synced: 2026-02-15
|
|
51
65
|
*/
|
|
52
66
|
export declare const RETRY_FIELDS: readonly ["max", "backoff", "delay"];
|
|
53
67
|
/**
|
|
@@ -61,6 +75,31 @@ export declare const USAGE_FIELDS: readonly ["track", "scope", "category", "bill
|
|
|
61
75
|
* Note: costHint is NOT included - use hints.cost instead (no duplicates)
|
|
62
76
|
*/
|
|
63
77
|
export declare const STEP_USAGE_FIELDS: readonly ["billable", "unit", "weight"];
|
|
78
|
+
/**
|
|
79
|
+
* Reserved workflow-level fields (engine-controlled, NEVER user-set)
|
|
80
|
+
* These fields would trigger SecurityError if found in user YAML
|
|
81
|
+
* MUST stay in sync with RESERVED_WORKFLOW_FIELDS in security/ReservedFields.ts
|
|
82
|
+
* Last synced: 2026-02-15
|
|
83
|
+
*/
|
|
84
|
+
export declare const RESERVED_WORKFLOW_FIELDS: readonly ["_internal", "_identity", "_ownership", "_billing", "_usage", "_audit", "_system", "_engine", "_execution", "_runtime", "_security", "_metadata"];
|
|
85
|
+
/**
|
|
86
|
+
* Reserved context fields (engine-controlled, users cannot set in context)
|
|
87
|
+
* MUST stay in sync with RESERVED_CONTEXT_FIELDS in security/ReservedFields.ts
|
|
88
|
+
* Last synced: 2026-02-15
|
|
89
|
+
*/
|
|
90
|
+
export declare const RESERVED_CONTEXT_FIELDS: readonly ["_internal", "_identity", "_ownership", "_billing", "_usage", "_audit", "_system", "_engine", "_security", "executionId", "runId", "traceId", "userId", "workspaceId", "subscriptionId", "subscriptionTier", "billingId", "billingMode", "pricingTier", "pricingModel", "billingSnapshot"];
|
|
91
|
+
/**
|
|
92
|
+
* Reserved step fields (engine-controlled, users cannot set in steps)
|
|
93
|
+
* MUST stay in sync with RESERVED_STEP_FIELDS in security/ReservedFields.ts
|
|
94
|
+
* Last synced: 2026-02-15
|
|
95
|
+
*/
|
|
96
|
+
export declare const RESERVED_STEP_FIELDS: readonly ["_internal", "_billing", "_usage", "_audit", "executionId", "runId", "stepExecutionId"];
|
|
97
|
+
/**
|
|
98
|
+
* Reserved annotation prefixes (engine-controlled namespaces)
|
|
99
|
+
* MUST stay in sync with RESERVED_ANNOTATION_PREFIXES in security/ReservedFields.ts
|
|
100
|
+
* Last synced: 2026-02-15
|
|
101
|
+
*/
|
|
102
|
+
export declare const RESERVED_ANNOTATION_PREFIXES: readonly ["engine.", "system.", "internal.", "billing.", "audit.", "security."];
|
|
64
103
|
/**
|
|
65
104
|
* Field registry map - maps path prefixes to valid fields
|
|
66
105
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldRegistry.d.ts","sourceRoot":"","sources":["../../src/errors/FieldRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH
|
|
1
|
+
{"version":3,"file":"FieldRegistry.d.ts","sourceRoot":"","sources":["../../src/errors/FieldRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,eAAO,MAAM,WAAW,wWA0Cd,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,eAAe,wGAYlB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe,oBAElB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,WAAW,uNA4Bd,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,cAAc,4BAGjB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,cAAc,2CAIjB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,eAAe,0CAIlB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,eAAe,gDAIlB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,kBAAkB,4BAGrB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,YAAY,sCAIf,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,YAAY,wEAOf,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,yCAIpB,CAAC;AAMX;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,6JAa3B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,sSAsB1B,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,mGAQvB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iFAO/B,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAa5D,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAoB9D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjE"}
|