dynamic-api-workflow 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.
Files changed (114) hide show
  1. package/README.md +287 -0
  2. package/dist/engine/cli.d.ts +3 -0
  3. package/dist/engine/cli.d.ts.map +1 -0
  4. package/dist/engine/cli.js +4 -0
  5. package/dist/engine/cli.js.map +1 -0
  6. package/dist/engine/config/llm-costs.d.ts +16 -0
  7. package/dist/engine/config/llm-costs.d.ts.map +1 -0
  8. package/dist/engine/config/llm-costs.js +38 -0
  9. package/dist/engine/config/llm-costs.js.map +1 -0
  10. package/dist/engine/core/node-executor.d.ts +8 -0
  11. package/dist/engine/core/node-executor.d.ts.map +1 -0
  12. package/dist/engine/core/node-executor.js +144 -0
  13. package/dist/engine/core/node-executor.js.map +1 -0
  14. package/dist/engine/core/validator.d.ts +6 -0
  15. package/dist/engine/core/validator.d.ts.map +1 -0
  16. package/dist/engine/core/validator.js +473 -0
  17. package/dist/engine/core/validator.js.map +1 -0
  18. package/dist/engine/core/workflow-executor.d.ts +6 -0
  19. package/dist/engine/core/workflow-executor.d.ts.map +1 -0
  20. package/dist/engine/core/workflow-executor.js +186 -0
  21. package/dist/engine/core/workflow-executor.js.map +1 -0
  22. package/dist/engine/core/workflow-loader.d.ts +26 -0
  23. package/dist/engine/core/workflow-loader.d.ts.map +1 -0
  24. package/dist/engine/core/workflow-loader.js +257 -0
  25. package/dist/engine/core/workflow-loader.js.map +1 -0
  26. package/dist/engine/index.d.ts +5 -0
  27. package/dist/engine/index.d.ts.map +1 -0
  28. package/dist/engine/index.js +70 -0
  29. package/dist/engine/index.js.map +1 -0
  30. package/dist/engine/nodes/code-node.d.ts +6 -0
  31. package/dist/engine/nodes/code-node.d.ts.map +1 -0
  32. package/dist/engine/nodes/code-node.js +70 -0
  33. package/dist/engine/nodes/code-node.js.map +1 -0
  34. package/dist/engine/nodes/llm-node.d.ts +6 -0
  35. package/dist/engine/nodes/llm-node.d.ts.map +1 -0
  36. package/dist/engine/nodes/llm-node.js +164 -0
  37. package/dist/engine/nodes/llm-node.js.map +1 -0
  38. package/dist/engine/nodes/passthrough-node.d.ts +6 -0
  39. package/dist/engine/nodes/passthrough-node.d.ts.map +1 -0
  40. package/dist/engine/nodes/passthrough-node.js +13 -0
  41. package/dist/engine/nodes/passthrough-node.js.map +1 -0
  42. package/dist/engine/nodes/reduce-node.d.ts +6 -0
  43. package/dist/engine/nodes/reduce-node.d.ts.map +1 -0
  44. package/dist/engine/nodes/reduce-node.js +44 -0
  45. package/dist/engine/nodes/reduce-node.js.map +1 -0
  46. package/dist/engine/nodes/split-node.d.ts +10 -0
  47. package/dist/engine/nodes/split-node.d.ts.map +1 -0
  48. package/dist/engine/nodes/split-node.js +51 -0
  49. package/dist/engine/nodes/split-node.js.map +1 -0
  50. package/dist/engine/providers/gemini.d.ts +27 -0
  51. package/dist/engine/providers/gemini.d.ts.map +1 -0
  52. package/dist/engine/providers/gemini.js +163 -0
  53. package/dist/engine/providers/gemini.js.map +1 -0
  54. package/dist/engine/providers/grok.d.ts +28 -0
  55. package/dist/engine/providers/grok.d.ts.map +1 -0
  56. package/dist/engine/providers/grok.js +164 -0
  57. package/dist/engine/providers/grok.js.map +1 -0
  58. package/dist/engine/providers/registry.d.ts +33 -0
  59. package/dist/engine/providers/registry.d.ts.map +1 -0
  60. package/dist/engine/providers/registry.js +51 -0
  61. package/dist/engine/providers/registry.js.map +1 -0
  62. package/dist/engine/router.d.ts +8 -0
  63. package/dist/engine/router.d.ts.map +1 -0
  64. package/dist/engine/router.js +79 -0
  65. package/dist/engine/router.js.map +1 -0
  66. package/dist/engine/scripts/cleanup-port.d.ts +2 -0
  67. package/dist/engine/scripts/cleanup-port.d.ts.map +1 -0
  68. package/dist/engine/scripts/cleanup-port.js +54 -0
  69. package/dist/engine/scripts/cleanup-port.js.map +1 -0
  70. package/dist/engine/scripts/create-endpoint.d.ts +2 -0
  71. package/dist/engine/scripts/create-endpoint.d.ts.map +1 -0
  72. package/dist/engine/scripts/create-endpoint.js +83 -0
  73. package/dist/engine/scripts/create-endpoint.js.map +1 -0
  74. package/dist/engine/scripts/scan-deps.d.ts +2 -0
  75. package/dist/engine/scripts/scan-deps.d.ts.map +1 -0
  76. package/dist/engine/scripts/scan-deps.js +112 -0
  77. package/dist/engine/scripts/scan-deps.js.map +1 -0
  78. package/dist/engine/scripts/validate-workflows.d.ts +3 -0
  79. package/dist/engine/scripts/validate-workflows.d.ts.map +1 -0
  80. package/dist/engine/scripts/validate-workflows.js +75 -0
  81. package/dist/engine/scripts/validate-workflows.js.map +1 -0
  82. package/dist/engine/server.d.ts +10 -0
  83. package/dist/engine/server.d.ts.map +1 -0
  84. package/dist/engine/server.js +92 -0
  85. package/dist/engine/server.js.map +1 -0
  86. package/dist/engine/types/index.d.ts +304 -0
  87. package/dist/engine/types/index.d.ts.map +1 -0
  88. package/dist/engine/types/index.js +24 -0
  89. package/dist/engine/types/index.js.map +1 -0
  90. package/dist/engine/utils/file-cache.d.ts +31 -0
  91. package/dist/engine/utils/file-cache.d.ts.map +1 -0
  92. package/dist/engine/utils/file-cache.js +68 -0
  93. package/dist/engine/utils/file-cache.js.map +1 -0
  94. package/dist/engine/utils/file-resolver.d.ts +21 -0
  95. package/dist/engine/utils/file-resolver.d.ts.map +1 -0
  96. package/dist/engine/utils/file-resolver.js +33 -0
  97. package/dist/engine/utils/file-resolver.js.map +1 -0
  98. package/dist/engine/utils/jsonpath.d.ts +13 -0
  99. package/dist/engine/utils/jsonpath.d.ts.map +1 -0
  100. package/dist/engine/utils/jsonpath.js +38 -0
  101. package/dist/engine/utils/jsonpath.js.map +1 -0
  102. package/dist/engine/utils/logger.d.ts +11 -0
  103. package/dist/engine/utils/logger.d.ts.map +1 -0
  104. package/dist/engine/utils/logger.js +24 -0
  105. package/dist/engine/utils/logger.js.map +1 -0
  106. package/dist/engine/utils/metrics.d.ts +6 -0
  107. package/dist/engine/utils/metrics.d.ts.map +1 -0
  108. package/dist/engine/utils/metrics.js +82 -0
  109. package/dist/engine/utils/metrics.js.map +1 -0
  110. package/dist/engine/utils/schema-validator.d.ts +10 -0
  111. package/dist/engine/utils/schema-validator.d.ts.map +1 -0
  112. package/dist/engine/utils/schema-validator.js +61 -0
  113. package/dist/engine/utils/schema-validator.js.map +1 -0
  114. package/package.json +53 -0
@@ -0,0 +1,186 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { executeNode } from './node-executor.js';
3
+ import { validateSchema } from '../utils/schema-validator.js';
4
+ import { createLogger } from '../utils/logger.js';
5
+ import { displayMetrics } from '../utils/metrics.js';
6
+ import { ErrorCode } from '../types/index.js';
7
+ /**
8
+ * Execute a workflow with the given input
9
+ */
10
+ export async function executeWorkflow(workflow, input, params = {}) {
11
+ const requestId = randomUUID();
12
+ const requestLogger = createLogger({ requestId });
13
+ requestLogger.info('Starting workflow execution', { params });
14
+ try {
15
+ // Validate input against schema
16
+ if (workflow.input?.schema) {
17
+ const schema = workflow.input.schema.inline || workflow.input.schema.file;
18
+ if (schema) {
19
+ const validation = await validateSchema(input, schema);
20
+ if (!validation.valid) {
21
+ const errorMessages = validation.errors?.map((e) => e.message).join('; ') || 'Unknown error';
22
+ return {
23
+ success: false,
24
+ error: {
25
+ stage: 'validation',
26
+ code: ErrorCode.VALIDATION_FAILED,
27
+ message: `Input validation failed: ${errorMessages}`,
28
+ details: validation.errors,
29
+ },
30
+ };
31
+ }
32
+ }
33
+ }
34
+ // Initialize execution context
35
+ const context = {
36
+ requestId,
37
+ input,
38
+ params,
39
+ nodeOutputs: new Map(),
40
+ splitOutputs: new Map(),
41
+ timing: new Map(),
42
+ metrics: [],
43
+ };
44
+ // Execute stages sequentially
45
+ for (const stage of workflow.stages) {
46
+ try {
47
+ await executeStage(stage, workflow, context, requestLogger);
48
+ }
49
+ catch (error) {
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ const errorCode = extractErrorCode(message);
52
+ requestLogger.error('Stage execution failed', { stage: stage.name, error: message });
53
+ return {
54
+ success: false,
55
+ error: {
56
+ stage: stage.name,
57
+ code: errorCode,
58
+ message,
59
+ },
60
+ };
61
+ }
62
+ }
63
+ // Get exit node output (use stage-scoped key)
64
+ const exitStage = workflow.stages[workflow.stages.length - 1];
65
+ const exitNodeId = Object.keys(exitStage.nodes)[0];
66
+ if (!exitNodeId) {
67
+ throw new Error('Exit stage must have a node defined');
68
+ }
69
+ const exitKey = `${exitStage.name}.${exitNodeId}`;
70
+ const exitOutput = context.nodeOutputs.get(exitKey);
71
+ if (!exitOutput) {
72
+ throw new Error(`Exit node '${exitKey}' did not produce output`);
73
+ }
74
+ const totalDuration = Array.from(context.timing.values()).reduce((a, b) => a + b, 0);
75
+ requestLogger.info('Workflow execution completed', {
76
+ totalDuration: `${totalDuration}ms`,
77
+ nodesExecuted: context.nodeOutputs.size,
78
+ });
79
+ // Display metrics
80
+ displayMetrics(context.metrics);
81
+ // Return success response
82
+ return {
83
+ success: true,
84
+ data: exitOutput.value,
85
+ };
86
+ }
87
+ catch (error) {
88
+ const message = error instanceof Error ? error.message : String(error);
89
+ const errorCode = extractErrorCode(message);
90
+ requestLogger.error('Workflow execution failed', { error: message });
91
+ return {
92
+ success: false,
93
+ error: {
94
+ stage: 'execution',
95
+ code: errorCode,
96
+ message,
97
+ },
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * Execute a single stage
103
+ */
104
+ async function executeStage(stage, workflow, context, logger) {
105
+ logger.debug('Executing stage', { stage: stage.name });
106
+ // Get node entries from stage (nodes is { nodeId: input })
107
+ const nodeEntries = Object.entries(stage.nodes);
108
+ if (nodeEntries.length === 0) {
109
+ throw new Error(`Stage '${stage.name}' has no nodes to execute`);
110
+ }
111
+ // Get node definitions with their inputs from the stage
112
+ // stage.nodes is Record<nodeId, InlineNodeDefinition>
113
+ const nodesWithInputs = nodeEntries.map(([nodeId, inlineNode]) => {
114
+ const node = workflow.nodes.find((n) => n.id === nodeId);
115
+ if (!node) {
116
+ throw new Error(`${ErrorCode.NODE_NOT_FOUND}: Node '${nodeId}' not found in workflow`);
117
+ }
118
+ // Extract input from the inline node definition
119
+ const input = 'input' in inlineNode ? inlineNode.input : inlineNode.inputs?.[0] || '$input';
120
+ return { node, input };
121
+ });
122
+ // Execute nodes
123
+ if (stage.parallel) {
124
+ // Parallel execution
125
+ await executeParallel(nodesWithInputs, workflow, context, stage, logger);
126
+ }
127
+ else {
128
+ // Sequential execution
129
+ for (const { node, input } of nodesWithInputs) {
130
+ await executeNode(node, input, stage, context, workflow);
131
+ }
132
+ }
133
+ logger.debug('Stage completed', { stage: stage.name });
134
+ }
135
+ /**
136
+ * Execute nodes in parallel
137
+ */
138
+ async function executeParallel(nodesWithInputs, workflow, context, stage, logger) {
139
+ const errorStrategy = stage.errorStrategy || 'complete';
140
+ logger.debug('Executing nodes in parallel', {
141
+ nodeCount: nodesWithInputs.length,
142
+ errorStrategy,
143
+ });
144
+ if (errorStrategy === 'fast') {
145
+ // Fail fast - throw on first error
146
+ await Promise.all(nodesWithInputs.map(({ node, input }) => executeNode(node, input, stage, context, workflow)));
147
+ }
148
+ else {
149
+ // Complete - collect all errors
150
+ const results = await Promise.allSettled(nodesWithInputs.map(({ node, input }) => executeNode(node, input, stage, context, workflow)));
151
+ const failures = results
152
+ .map((result, index) => ({
153
+ result,
154
+ node: nodesWithInputs[index].node,
155
+ }))
156
+ .filter(({ result }) => result.status === 'rejected');
157
+ if (failures.length > 0) {
158
+ const errors = failures.map(({ result, node }) => ({
159
+ stage: stage.name,
160
+ node: node.id,
161
+ code: extractErrorCode(result.status === 'rejected' ? result.reason.message : ''),
162
+ message: result.status === 'rejected'
163
+ ? result.reason instanceof Error
164
+ ? result.reason.message
165
+ : String(result.reason)
166
+ : 'Unknown error',
167
+ }));
168
+ logger.error('Multiple nodes failed in parallel stage', {
169
+ failureCount: failures.length,
170
+ errors,
171
+ });
172
+ // Throw with details about all failures
173
+ const error = new Error(`${ErrorCode.STAGE_FAILED}: Multiple nodes failed in stage '${stage.name}'`);
174
+ error.errors = errors;
175
+ throw error;
176
+ }
177
+ }
178
+ }
179
+ /**
180
+ * Extract error code from error message
181
+ */
182
+ function extractErrorCode(message) {
183
+ const match = message.match(/^([A-Z_]+):/);
184
+ return match ? match[1] : ErrorCode.CODE_EXCEPTION;
185
+ }
186
+ //# sourceMappingURL=workflow-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-executor.js","sourceRoot":"","sources":["../../../engine/core/workflow-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { WorkflowDefinition } from '../types/index.js';
2
+ /**
3
+ * Load all workflow YAML files from the endpoints directory using folder-based routing
4
+ * Supports Next.js-style dynamic routes with [param] folder names
5
+ */
6
+ export declare function loadAllWorkflows(): Promise<Map<string, WorkflowDefinition>>;
7
+ /**
8
+ * Get cached workflow by method and route, with param extraction
9
+ */
10
+ export declare function getCachedWorkflow(method: string, route: string): WorkflowDefinition | undefined;
11
+ /**
12
+ * Extract route params from a request path
13
+ */
14
+ export declare function extractRouteParams(method: string, requestPath: string): Record<string, string> | null;
15
+ /**
16
+ * Get all cached routes with their methods
17
+ */
18
+ export declare function getAllRoutes(): Array<{
19
+ method: string;
20
+ route: string;
21
+ }>;
22
+ /**
23
+ * Clear workflow cache
24
+ */
25
+ export declare function clearWorkflowCache(): void;
26
+ //# sourceMappingURL=workflow-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-loader.d.ts","sourceRoot":"","sources":["../../../engine/core/workflow-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,kBAAkB,EAIrB,MAAM,mBAAmB,CAAC;AAwB3B;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAiBjF;AAsND;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAgB/F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAcrG;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAEvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
@@ -0,0 +1,257 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import YAML from 'yaml';
4
+ import logger from '../utils/logger.js';
5
+ import { ErrorCode } from '../types/index.js';
6
+ const workflowsDir = process.env.WORKFLOWS_DIR || './src';
7
+ const workflowCache = new Map();
8
+ /**
9
+ * Load all workflow YAML files from the endpoints directory using folder-based routing
10
+ * Supports Next.js-style dynamic routes with [param] folder names
11
+ */
12
+ export async function loadAllWorkflows() {
13
+ const workflows = new Map();
14
+ const endpointsPath = path.join(process.cwd(), workflowsDir, 'endpoints');
15
+ logger.info(`Loading workflows from: ${endpointsPath}`);
16
+ try {
17
+ await scanEndpointsFolder(endpointsPath, '', workflows);
18
+ }
19
+ catch (error) {
20
+ if (error.code === 'ENOENT') {
21
+ logger.warn(`Endpoints directory not found: ${endpointsPath}`);
22
+ return workflows;
23
+ }
24
+ throw error;
25
+ }
26
+ return workflows;
27
+ }
28
+ /**
29
+ * Recursively scan endpoints folder for method YAML files
30
+ */
31
+ async function scanEndpointsFolder(basePath, relativePath, workflows) {
32
+ const currentPath = path.join(basePath, relativePath);
33
+ let entries;
34
+ try {
35
+ entries = await fs.readdir(currentPath, { withFileTypes: true });
36
+ }
37
+ catch (error) {
38
+ if (error.code === 'ENOENT') {
39
+ return;
40
+ }
41
+ throw error;
42
+ }
43
+ // Process YAML files (HTTP method files like POST.yaml, GET.yaml)
44
+ const httpMethods = ['POST', 'GET', 'PUT', 'DELETE', 'PATCH'];
45
+ for (const entry of entries) {
46
+ if (entry.isFile() && (entry.name.endsWith('.yaml') || entry.name.endsWith('.yml'))) {
47
+ const method = path.basename(entry.name, path.extname(entry.name)).toUpperCase();
48
+ if (httpMethods.includes(method)) {
49
+ try {
50
+ const filePath = path.join(currentPath, entry.name);
51
+ const { route, routeParams, routePattern } = parseRoute(relativePath);
52
+ const workflow = await loadMethodFile(filePath, method, route, routeParams, relativePath);
53
+ const cacheKey = `${method}:${route}`;
54
+ workflows.set(cacheKey, workflow);
55
+ workflowCache.set(cacheKey, {
56
+ workflow,
57
+ route,
58
+ method,
59
+ routeParams,
60
+ routePattern
61
+ });
62
+ logger.info(`Loaded workflow: ${relativePath}/${entry.name} -> ${method} ${route}`);
63
+ }
64
+ catch (error) {
65
+ const message = error instanceof Error ? error.message : String(error);
66
+ logger.error(`Failed to load ${relativePath}/${entry.name}`, { error: message });
67
+ throw new Error(`${ErrorCode.WORKFLOW_LOAD_FAILED}: Failed to load ${relativePath}/${entry.name}: ${message}`);
68
+ }
69
+ }
70
+ }
71
+ }
72
+ // Recurse into subdirectories
73
+ for (const entry of entries) {
74
+ if (entry.isDirectory()) {
75
+ await scanEndpointsFolder(basePath, path.join(relativePath, entry.name), workflows);
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Parse a relative folder path into route info
81
+ * Converts [param] folders to :param route segments
82
+ */
83
+ function parseRoute(relativePath) {
84
+ const routeParams = [];
85
+ if (!relativePath || relativePath === '.') {
86
+ return { route: '/', routeParams: [], routePattern: /^\/$/ };
87
+ }
88
+ const segments = relativePath.split(path.sep);
89
+ const routeSegments = [];
90
+ const patternParts = [];
91
+ for (const segment of segments) {
92
+ // Check for dynamic segment [param]
93
+ const match = segment.match(/^\[(.+)\]$/);
94
+ if (match) {
95
+ const paramName = match[1];
96
+ routeParams.push(paramName);
97
+ routeSegments.push(`:${paramName}`);
98
+ patternParts.push('([^/]+)');
99
+ }
100
+ else {
101
+ routeSegments.push(segment);
102
+ patternParts.push(segment);
103
+ }
104
+ }
105
+ const route = '/' + routeSegments.join('/');
106
+ const routePattern = new RegExp(`^/${patternParts.join('/')}$`);
107
+ return { route, routeParams, routePattern };
108
+ }
109
+ /**
110
+ * Load a single method file (e.g., POST.yaml)
111
+ */
112
+ async function loadMethodFile(filePath, method, route, routeParams, endpointPath) {
113
+ const content = await fs.readFile(filePath, 'utf-8');
114
+ const methodDef = YAML.parse(content);
115
+ if (!methodDef) {
116
+ throw new Error('Method file is empty or invalid YAML');
117
+ }
118
+ if (!methodDef.version) {
119
+ throw new Error('Missing required field: version');
120
+ }
121
+ if (!methodDef.stages || methodDef.stages.length === 0) {
122
+ throw new Error('Missing required field: stages');
123
+ }
124
+ // Build nodes array from inline definitions in stages
125
+ const nodes = extractNodesFromStages(methodDef.stages);
126
+ return {
127
+ version: methodDef.version,
128
+ endpoint: {
129
+ method: method,
130
+ route,
131
+ routeParams,
132
+ endpointPath,
133
+ },
134
+ nodes,
135
+ stages: methodDef.stages,
136
+ };
137
+ }
138
+ /**
139
+ * Extract node definitions from inline stage nodes
140
+ */
141
+ function extractNodesFromStages(stages) {
142
+ const nodes = [];
143
+ const seenNodes = new Set();
144
+ for (const stage of stages) {
145
+ if (!stage.nodes)
146
+ continue;
147
+ for (const [nodeId, inlineNode] of Object.entries(stage.nodes)) {
148
+ // Skip if we've already processed this node
149
+ if (seenNodes.has(nodeId))
150
+ continue;
151
+ seenNodes.add(nodeId);
152
+ // Convert inline node to full NodeDefinition
153
+ const node = inlineNodeToNodeDefinition(nodeId, inlineNode);
154
+ nodes.push(node);
155
+ }
156
+ }
157
+ return nodes;
158
+ }
159
+ /**
160
+ * Convert an inline node definition to a full NodeDefinition
161
+ */
162
+ function inlineNodeToNodeDefinition(id, inline) {
163
+ switch (inline.type) {
164
+ case 'llm':
165
+ return {
166
+ id,
167
+ type: 'llm',
168
+ input: inline.input,
169
+ provider: inline.provider,
170
+ config: {
171
+ model: inline.model || 'gemini-2.0-flash',
172
+ temperature: inline.temperature,
173
+ maxTokens: inline.maxTokens,
174
+ },
175
+ systemMessages: inline.systemMessages,
176
+ };
177
+ case 'code':
178
+ return {
179
+ id,
180
+ type: 'code',
181
+ input: inline.input,
182
+ file: inline.file,
183
+ };
184
+ case 'reduce':
185
+ return {
186
+ id,
187
+ type: 'reduce',
188
+ inputs: inline.inputs,
189
+ mapping: inline.mapping,
190
+ };
191
+ case 'split':
192
+ return {
193
+ id,
194
+ type: 'split',
195
+ input: inline.input,
196
+ mapping: inline.mapping,
197
+ };
198
+ case 'passthrough':
199
+ return {
200
+ id,
201
+ type: 'passthrough',
202
+ input: inline.input,
203
+ };
204
+ default:
205
+ throw new Error(`Unknown node type: ${inline.type}`);
206
+ }
207
+ }
208
+ /**
209
+ * Get cached workflow by method and route, with param extraction
210
+ */
211
+ export function getCachedWorkflow(method, route) {
212
+ // Try exact match first
213
+ const exactKey = `${method}:${route}`;
214
+ const exact = workflowCache.get(exactKey);
215
+ if (exact) {
216
+ return exact.workflow;
217
+ }
218
+ // Try pattern matching for dynamic routes
219
+ for (const [, entry] of workflowCache) {
220
+ if (entry.method === method && entry.routePattern.test(route)) {
221
+ return entry.workflow;
222
+ }
223
+ }
224
+ return undefined;
225
+ }
226
+ /**
227
+ * Extract route params from a request path
228
+ */
229
+ export function extractRouteParams(method, requestPath) {
230
+ for (const [, entry] of workflowCache) {
231
+ if (entry.method !== method)
232
+ continue;
233
+ const match = requestPath.match(entry.routePattern);
234
+ if (match) {
235
+ const params = {};
236
+ entry.routeParams.forEach((param, index) => {
237
+ params[param] = match[index + 1];
238
+ });
239
+ return params;
240
+ }
241
+ }
242
+ return null;
243
+ }
244
+ /**
245
+ * Get all cached routes with their methods
246
+ */
247
+ export function getAllRoutes() {
248
+ return Array.from(workflowCache.values()).map(({ method, route }) => ({ method, route }));
249
+ }
250
+ /**
251
+ * Clear workflow cache
252
+ */
253
+ export function clearWorkflowCache() {
254
+ workflowCache.clear();
255
+ logger.debug('Workflow cache cleared');
256
+ }
257
+ //# sourceMappingURL=workflow-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-loader.js","sourceRoot":"","sources":["../../../engine/core/workflow-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Initialize and start the application
3
+ */
4
+ export declare function main(): Promise<void>;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../engine/index.ts"],"names":[],"mappings":"AAaA;;GAEG;AACH,wBAAsB,IAAI,kBA+DzB"}
@@ -0,0 +1,70 @@
1
+ import dotenv from 'dotenv';
2
+ import { createServer, startServer } from './server.js';
3
+ import { registerRoutes } from './router.js';
4
+ import { loadAllWorkflows } from './core/workflow-loader.js';
5
+ import { validateWorkflow } from './core/validator.js';
6
+ import { providerRegistry } from './providers/registry.js';
7
+ import { GeminiProvider } from './providers/gemini.js';
8
+ import { GrokProvider } from './providers/grok.js';
9
+ import logger from './utils/logger.js';
10
+ // Load environment variables
11
+ dotenv.config();
12
+ /**
13
+ * Initialize and start the application
14
+ */
15
+ export async function main() {
16
+ try {
17
+ logger.info('🚀 Starting Dynamic API Workflow Engine');
18
+ // Register LLM providers
19
+ logger.info('Registering LLM providers...');
20
+ providerRegistry.register(new GeminiProvider());
21
+ providerRegistry.register(new GrokProvider());
22
+ // Load workflows
23
+ logger.info('Loading workflows...');
24
+ const workflows = await loadAllWorkflows();
25
+ if (workflows.size === 0) {
26
+ logger.warn('No workflows found. Server will start but have no routes.');
27
+ }
28
+ // Validate all workflows
29
+ logger.info('Validating workflows...');
30
+ let hasErrors = false;
31
+ for (const [route, workflow] of workflows.entries()) {
32
+ const validation = await validateWorkflow(workflow);
33
+ if (!validation.valid) {
34
+ logger.error(`Workflow validation failed for route ${route}`, {
35
+ errors: validation.errors,
36
+ });
37
+ hasErrors = true;
38
+ }
39
+ else if (validation.warnings && validation.warnings.length > 0) {
40
+ logger.warn(`Workflow has warnings for route ${route}`, {
41
+ warnings: validation.warnings,
42
+ });
43
+ }
44
+ else {
45
+ logger.info(`✓ Workflow validated: ${route}`);
46
+ }
47
+ }
48
+ if (hasErrors) {
49
+ logger.error('Some workflows failed validation. Aborting startup.');
50
+ process.exit(1);
51
+ }
52
+ // Create and configure server
53
+ const app = createServer();
54
+ // Register workflow routes
55
+ registerRoutes(app, workflows);
56
+ // Start server
57
+ const port = parseInt(process.env.PORT || '3000', 10);
58
+ await startServer(app, port);
59
+ logger.info(`✅ Server ready at http://localhost:${port}`);
60
+ logger.info(`✅ Health check available at http://localhost:${port}/health`);
61
+ }
62
+ catch (error) {
63
+ logger.error('Failed to start server', {
64
+ error: error instanceof Error ? error.message : String(error),
65
+ stack: error instanceof Error ? error.stack : undefined,
66
+ });
67
+ process.exit(1);
68
+ }
69
+ }
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../engine/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { NodeOutput, CodeNodeDefinition, ExecutionContext, WorkflowDefinition } from '../types/index.js';
2
+ /**
3
+ * Execute a code node
4
+ */
5
+ export declare function executeCodeNode(node: CodeNodeDefinition, input: unknown, context: ExecutionContext, workflow: WorkflowDefinition): Promise<NodeOutput>;
6
+ //# sourceMappingURL=code-node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-node.d.ts","sourceRoot":"","sources":["../../../engine/nodes/code-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAO9G;;GAEG;AACH,wBAAsB,eAAe,CACjC,IAAI,EAAE,kBAAkB,EACxB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,kBAAkB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAgFrB"}