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,28 @@
1
+ import type { LLMProvider, LLMConfig, LLMCallParams, LLMResponse, ValidationResult } from '../types/index.js';
2
+ /**
3
+ * Grok LLM provider implementation
4
+ * Uses xAI's API (compatible with OpenAI format)
5
+ */
6
+ export declare class GrokProvider implements LLMProvider {
7
+ name: string;
8
+ private apiKey;
9
+ private baseURL;
10
+ constructor();
11
+ /**
12
+ * Validate Grok configuration
13
+ */
14
+ validateConfig(config: LLMConfig): Promise<ValidationResult>;
15
+ /**
16
+ * Call Grok API
17
+ */
18
+ call(params: LLMCallParams): Promise<LLMResponse>;
19
+ /**
20
+ * Check if a feature is supported
21
+ */
22
+ supportsFeature(feature: string): boolean;
23
+ /**
24
+ * Check if a custom config key is supported
25
+ */
26
+ private isSupportedCustomKey;
27
+ }
28
+ //# sourceMappingURL=grok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.d.ts","sourceRoot":"","sources":["../../../engine/providers/grok.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,gBAAgB,EACnB,MAAM,mBAAmB,CAAC;AAG3B;;;GAGG;AACH,qBAAa,YAAa,YAAW,WAAW;IAC5C,IAAI,SAAU;IACd,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAAyB;;IAWxC;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsClE;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC;IAqHvD;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKzC;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAI/B"}
@@ -0,0 +1,164 @@
1
+ import logger from '../utils/logger.js';
2
+ /**
3
+ * Grok LLM provider implementation
4
+ * Uses xAI's API (compatible with OpenAI format)
5
+ */
6
+ export class GrokProvider {
7
+ name = 'grok';
8
+ apiKey;
9
+ baseURL = 'https://api.x.ai/v1';
10
+ constructor() {
11
+ this.apiKey = process.env.GROK_API_KEY;
12
+ if (this.apiKey) {
13
+ logger.info('Grok provider initialized');
14
+ }
15
+ else {
16
+ logger.warn('Grok API key not found, provider will not be functional');
17
+ }
18
+ }
19
+ /**
20
+ * Validate Grok configuration
21
+ */
22
+ async validateConfig(config) {
23
+ const errors = [];
24
+ if (!config.model) {
25
+ errors.push({
26
+ code: 'MISSING_MODEL',
27
+ message: 'Model is required for Grok provider',
28
+ });
29
+ }
30
+ if (!this.apiKey) {
31
+ errors.push({
32
+ code: 'MISSING_API_KEY',
33
+ message: 'GROK_API_KEY environment variable is not set',
34
+ });
35
+ }
36
+ if (config.temperature !== undefined && (config.temperature < 0 || config.temperature > 2)) {
37
+ errors.push({
38
+ code: 'INVALID_TEMPERATURE',
39
+ message: 'Temperature must be between 0 and 2',
40
+ });
41
+ }
42
+ if (config.maxTokens !== undefined && config.maxTokens < 1) {
43
+ errors.push({
44
+ code: 'INVALID_MAX_TOKENS',
45
+ message: 'Max tokens must be a positive number',
46
+ });
47
+ }
48
+ if (errors.length > 0) {
49
+ return { valid: false, errors };
50
+ }
51
+ return { valid: true };
52
+ }
53
+ /**
54
+ * Call Grok API
55
+ */
56
+ async call(params) {
57
+ if (!this.apiKey) {
58
+ throw new Error('Grok API key not initialized. Check GROK_API_KEY.');
59
+ }
60
+ const { config, systemMessages, userMessage } = params;
61
+ const timeout = parseInt(process.env.LLM_TIMEOUT_MS || '30000', 10);
62
+ try {
63
+ // Build messages array (OpenAI-compatible format)
64
+ const messages = [
65
+ ...systemMessages.map((msg) => ({
66
+ role: 'system',
67
+ content: msg.content,
68
+ })),
69
+ {
70
+ role: 'user',
71
+ content: userMessage,
72
+ },
73
+ ];
74
+ // Build request body
75
+ const body = {
76
+ model: config.model,
77
+ messages,
78
+ };
79
+ if (config.temperature !== undefined) {
80
+ body.temperature = config.temperature;
81
+ }
82
+ if (config.maxTokens !== undefined) {
83
+ body.max_tokens = config.maxTokens;
84
+ }
85
+ // Add custom config parameters
86
+ if (config.custom) {
87
+ for (const [key, value] of Object.entries(config.custom)) {
88
+ if (this.isSupportedCustomKey(key)) {
89
+ body[key] = value;
90
+ }
91
+ else {
92
+ logger.warn(`Unsupported custom config key for Grok: ${key}`, { key, value });
93
+ }
94
+ }
95
+ }
96
+ // Call API with timeout
97
+ const controller = new AbortController();
98
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
99
+ const response = await fetch(`${this.baseURL}/chat/completions`, {
100
+ method: 'POST',
101
+ headers: {
102
+ 'Content-Type': 'application/json',
103
+ Authorization: `Bearer ${this.apiKey}`,
104
+ },
105
+ body: JSON.stringify(body),
106
+ signal: controller.signal,
107
+ });
108
+ clearTimeout(timeoutId);
109
+ if (!response.ok) {
110
+ const errorText = await response.text();
111
+ // Check for rate limit
112
+ if (response.status === 429) {
113
+ throw new Error('LLM_RATE_LIMIT: Rate limit exceeded');
114
+ }
115
+ throw new Error(`HTTP ${response.status}: ${errorText}`);
116
+ }
117
+ const data = (await response.json());
118
+ const content = data.choices?.[0]?.message?.content || '';
119
+ const usage = data.usage
120
+ ? {
121
+ inputTokens: data.usage.prompt_tokens || 0,
122
+ outputTokens: data.usage.completion_tokens || 0,
123
+ }
124
+ : undefined;
125
+ logger.debug('Grok API call successful', {
126
+ model: config.model,
127
+ inputTokens: usage?.inputTokens,
128
+ outputTokens: usage?.outputTokens,
129
+ });
130
+ return {
131
+ content,
132
+ usage,
133
+ };
134
+ }
135
+ catch (error) {
136
+ if (error instanceof Error && error.name === 'AbortError') {
137
+ logger.error('Grok API timeout', { timeout, model: config.model });
138
+ throw new Error(`LLM_TIMEOUT: Request timed out after ${timeout}ms`);
139
+ }
140
+ const message = error instanceof Error ? error.message : String(error);
141
+ // Pass through specific error codes
142
+ if (message.startsWith('LLM_')) {
143
+ throw error;
144
+ }
145
+ logger.error('Grok API error', { error: message, model: config.model });
146
+ throw new Error(`LLM_API_ERROR: ${message}`);
147
+ }
148
+ }
149
+ /**
150
+ * Check if a feature is supported
151
+ */
152
+ supportsFeature(feature) {
153
+ const supportedFeatures = ['systemMessages', 'temperature', 'maxTokens'];
154
+ return supportedFeatures.includes(feature);
155
+ }
156
+ /**
157
+ * Check if a custom config key is supported
158
+ */
159
+ isSupportedCustomKey(key) {
160
+ const supported = ['presence_penalty', 'frequency_penalty', 'stop', 'top_p'];
161
+ return supported.includes(key);
162
+ }
163
+ }
164
+ //# sourceMappingURL=grok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.js","sourceRoot":"","sources":["../../../engine/providers/grok.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { LLMProvider } from '../types/index.js';
2
+ /**
3
+ * Provider registry for LLM providers
4
+ */
5
+ declare class ProviderRegistry {
6
+ private providers;
7
+ /**
8
+ * Register a new provider
9
+ */
10
+ register(provider: LLMProvider): void;
11
+ /**
12
+ * Get a provider by name
13
+ */
14
+ get(name: string): LLMProvider | undefined;
15
+ /**
16
+ * Check if a provider exists
17
+ */
18
+ has(name: string): boolean;
19
+ /**
20
+ * Get all registered provider names
21
+ */
22
+ getProviderNames(): string[];
23
+ /**
24
+ * Validate that a provider is available
25
+ */
26
+ validate(name: string): {
27
+ valid: boolean;
28
+ error?: string;
29
+ };
30
+ }
31
+ export declare const providerRegistry: ProviderRegistry;
32
+ export default ProviderRegistry;
33
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../engine/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD;;GAEG;AACH,cAAM,gBAAgB;IAClB,OAAO,CAAC,SAAS,CAAkC;IAEnD;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAQrC;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI1C;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,gBAAgB,IAAI,MAAM,EAAE;IAI5B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAS7D;AAGD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAEvD,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,51 @@
1
+ import logger from '../utils/logger.js';
2
+ /**
3
+ * Provider registry for LLM providers
4
+ */
5
+ class ProviderRegistry {
6
+ providers = new Map();
7
+ /**
8
+ * Register a new provider
9
+ */
10
+ register(provider) {
11
+ if (this.providers.has(provider.name)) {
12
+ logger.warn(`Provider ${provider.name} is already registered, overwriting`);
13
+ }
14
+ this.providers.set(provider.name, provider);
15
+ logger.info(`Registered LLM provider: ${provider.name}`);
16
+ }
17
+ /**
18
+ * Get a provider by name
19
+ */
20
+ get(name) {
21
+ return this.providers.get(name);
22
+ }
23
+ /**
24
+ * Check if a provider exists
25
+ */
26
+ has(name) {
27
+ return this.providers.has(name);
28
+ }
29
+ /**
30
+ * Get all registered provider names
31
+ */
32
+ getProviderNames() {
33
+ return Array.from(this.providers.keys());
34
+ }
35
+ /**
36
+ * Validate that a provider is available
37
+ */
38
+ validate(name) {
39
+ if (!this.has(name)) {
40
+ return {
41
+ valid: false,
42
+ error: `Provider '${name}' not found. Available providers: ${this.getProviderNames().join(', ')}`,
43
+ };
44
+ }
45
+ return { valid: true };
46
+ }
47
+ }
48
+ // Singleton instance
49
+ export const providerRegistry = new ProviderRegistry();
50
+ export default ProviderRegistry;
51
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../engine/providers/registry.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC;;GAEG;AACH,MAAM,gBAAgB;IACV,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEnD;;OAEG;IACH,QAAQ,CAAC,QAAqB;QAC1B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,IAAI,qCAAqC,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,4BAA4B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,IAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACZ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAY;QACjB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,OAAO;gBACH,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,aAAa,IAAI,qCAAqC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACpG,CAAC;QACN,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;CACJ;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEvD,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import express from 'express';
2
+ import type { WorkflowDefinition } from './types/index.js';
3
+ /**
4
+ * Register all workflow routes with the Express app
5
+ * Supports dynamic routes with :param syntax
6
+ */
7
+ export declare function registerRoutes(app: express.Application, workflows: Map<string, WorkflowDefinition>): void;
8
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../engine/router.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4C,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAI3D;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,GAAG,EAAE,OAAO,CAAC,WAAW,EACxB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,GAC3C,IAAI,CAiBN"}
@@ -0,0 +1,79 @@
1
+ import { executeWorkflow } from './core/workflow-executor.js';
2
+ import logger from './utils/logger.js';
3
+ /**
4
+ * Register all workflow routes with the Express app
5
+ * Supports dynamic routes with :param syntax
6
+ */
7
+ export function registerRoutes(app, workflows) {
8
+ logger.info(`Registering ${workflows.size} workflow routes`);
9
+ for (const [key, workflow] of workflows.entries()) {
10
+ // Key format is "METHOD:route" (e.g., "POST:/summarize" or "GET:/users/:id")
11
+ const [method, route] = key.includes(':')
12
+ ? [key.split(':')[0].toLowerCase(), key.split(':').slice(1).join(':')]
13
+ : [(workflow.endpoint?.method || 'POST').toLowerCase(), key];
14
+ // Create route handler
15
+ const handler = createWorkflowHandler(workflow);
16
+ // Register route (Express understands :param syntax)
17
+ app[method](route, handler);
18
+ logger.info(`Registered route: ${method.toUpperCase()} ${route}`);
19
+ }
20
+ }
21
+ /**
22
+ * Create an Express handler for a workflow
23
+ * Extracts route params and passes them to workflow execution
24
+ */
25
+ function createWorkflowHandler(workflow) {
26
+ return async (req, res, next) => {
27
+ try {
28
+ const input = req.body;
29
+ // Extract route params from Express (already parsed by Express for :param)
30
+ const params = req.params;
31
+ logger.debug('Received workflow request', {
32
+ method: req.method,
33
+ path: req.path,
34
+ params,
35
+ body: input,
36
+ });
37
+ // Execute workflow with input and route params
38
+ const result = await executeWorkflow(workflow, input, params);
39
+ // Send response
40
+ if (result.success) {
41
+ res.status(200).json(result);
42
+ }
43
+ else {
44
+ // Determine appropriate status code based on error
45
+ const statusCode = getErrorStatusCode(result.error.code);
46
+ res.status(statusCode).json(result);
47
+ }
48
+ }
49
+ catch (error) {
50
+ next(error);
51
+ }
52
+ };
53
+ }
54
+ /**
55
+ * Map error codes to HTTP status codes
56
+ */
57
+ function getErrorStatusCode(errorCode) {
58
+ switch (errorCode) {
59
+ case 'VALIDATION_FAILED':
60
+ return 400;
61
+ case 'NODE_NOT_FOUND':
62
+ case 'FILE_NOT_FOUND':
63
+ case 'PROVIDER_NOT_FOUND':
64
+ return 500;
65
+ case 'LLM_TIMEOUT':
66
+ return 504;
67
+ case 'LLM_RATE_LIMIT':
68
+ return 429;
69
+ case 'LLM_API_ERROR':
70
+ case 'CODE_EXCEPTION':
71
+ case 'CODE_INVALID_OUTPUT':
72
+ case 'JSONPATH_ERROR':
73
+ case 'STAGE_FAILED':
74
+ return 500;
75
+ default:
76
+ return 500;
77
+ }
78
+ }
79
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../engine/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cleanup-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-port.d.ts","sourceRoot":"","sources":["../../../engine/scripts/cleanup-port.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ import { exec } from 'child_process';
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+ const port = process.env.PORT || '3000';
5
+ async function killPort(port) {
6
+ return new Promise((resolve) => {
7
+ if (process.platform === 'win32') {
8
+ const command = `netstat -ano | findstr :${port}`;
9
+ exec(command, (_error, stdout) => {
10
+ if (stdout) {
11
+ const lines = stdout.trim().split('\n');
12
+ const updates = lines.map(line => {
13
+ const pid = line.trim().split(/\s+/).pop();
14
+ if (pid) {
15
+ return new Promise(res => {
16
+ exec(`taskkill /F /PID ${pid}`, () => {
17
+ console.log(`Killed process ${pid} on port ${port}`);
18
+ res();
19
+ });
20
+ });
21
+ }
22
+ return Promise.resolve();
23
+ });
24
+ Promise.all(updates).then(() => resolve());
25
+ }
26
+ else {
27
+ resolve();
28
+ }
29
+ });
30
+ }
31
+ else {
32
+ const command = `lsof -i :${port} -t`;
33
+ exec(command, (_error, stdout) => {
34
+ if (stdout) {
35
+ const pids = stdout.trim().split('\n');
36
+ const updates = pids.map(pid => {
37
+ return new Promise(res => {
38
+ exec(`kill -9 ${pid}`, () => {
39
+ console.log(`Killed process ${pid} on port ${port}`);
40
+ res();
41
+ });
42
+ });
43
+ });
44
+ Promise.all(updates).then(() => resolve());
45
+ }
46
+ else {
47
+ resolve();
48
+ }
49
+ });
50
+ }
51
+ });
52
+ }
53
+ killPort(port);
54
+ //# sourceMappingURL=cleanup-port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup-port.js","sourceRoot":"","sources":["../../../engine/scripts/cleanup-port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC;AAGxC,KAAK,UAAU,QAAQ,CAAC,IAAY;IAChC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,2BAA2B,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;gBAC7B,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC;wBAC3C,IAAI,GAAG,EAAE,CAAC;4BACN,OAAO,IAAI,OAAO,CAAO,GAAG,CAAC,EAAE;gCAC3B,IAAI,CAAC,oBAAoB,GAAG,EAAE,EAAE,GAAG,EAAE;oCACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,YAAY,IAAI,EAAE,CAAC,CAAC;oCACrD,GAAG,EAAE,CAAC;gCACV,CAAC,CAAC,CAAC;4BACP,CAAC,CAAC,CAAC;wBACP,CAAC;wBACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;oBAC7B,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACJ,OAAO,EAAE,CAAC;gBACd,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,IAAI,KAAK,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE;gBAC7B,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;wBAC3B,OAAO,IAAI,OAAO,CAAO,GAAG,CAAC,EAAE;4BAC3B,IAAI,CAAC,WAAW,GAAG,EAAE,EAAE,GAAG,EAAE;gCACxB,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,YAAY,IAAI,EAAE,CAAC,CAAC;gCACrD,GAAG,EAAE,CAAC;4BACV,CAAC,CAAC,CAAC;wBACP,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;oBACH,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACJ,OAAO,EAAE,CAAC;gBACd,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AAED,QAAQ,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=create-endpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-endpoint.d.ts","sourceRoot":"","sources":["../../../engine/scripts/create-endpoint.ts"],"names":[],"mappings":""}
@@ -0,0 +1,83 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import readline from 'readline';
4
+ const endpointsDir = path.join(process.cwd(), 'src/endpoints');
5
+ async function prompt(question) {
6
+ const rl = readline.createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ });
10
+ return new Promise((resolve) => {
11
+ rl.question(question, (answer) => {
12
+ rl.close();
13
+ resolve(answer.trim());
14
+ });
15
+ });
16
+ }
17
+ async function main() {
18
+ console.log('🚀 Creating new API endpoint...');
19
+ // Get endpoint name
20
+ let endpointName = process.argv[2];
21
+ if (!endpointName) {
22
+ endpointName = await prompt('Endpoint name (e.g., my-feature): ');
23
+ }
24
+ if (!endpointName) {
25
+ console.error('❌ Endpoint name is required');
26
+ process.exit(1);
27
+ }
28
+ // Get HTTP method
29
+ let method = process.argv[3];
30
+ if (!method) {
31
+ method = await prompt('HTTP Method (POST/GET) [POST]: ');
32
+ }
33
+ method = (method || 'POST').toUpperCase();
34
+ if (!['GET', 'POST', 'PUT', 'DELETE', 'PATCH'].includes(method)) {
35
+ console.error('❌ Invalid HTTP method');
36
+ process.exit(1);
37
+ }
38
+ const targetDir = path.join(endpointsDir, endpointName);
39
+ try {
40
+ // Check if exists
41
+ try {
42
+ await fs.access(targetDir);
43
+ console.error(`❌ Endpoint '${endpointName}' already exists`);
44
+ process.exit(1);
45
+ }
46
+ catch {
47
+ // Directory doesn't exist, proceed
48
+ }
49
+ // Create directories
50
+ await fs.mkdir(targetDir, { recursive: true });
51
+ await fs.mkdir(path.join(targetDir, 'codes'), { recursive: true });
52
+ await fs.mkdir(path.join(targetDir, 'prompts'), { recursive: true });
53
+ // Create Default Workflow YAML
54
+ const yamlContent = `version: "1.0"
55
+
56
+ stages:
57
+ - name: main
58
+ nodes:
59
+ start:
60
+ type: passthrough
61
+ input: $input
62
+ `;
63
+ await fs.writeFile(path.join(targetDir, `${method}.yaml`), yamlContent);
64
+ console.log(`
65
+ ✅ Endpoint created successfully!
66
+
67
+ 📂 Structure:
68
+ src/endpoints/${endpointName}/
69
+ ├── ${method}.yaml
70
+ ├── codes/
71
+ └── prompts/
72
+
73
+ 👉 To test:
74
+ npm run dev
75
+ `);
76
+ }
77
+ catch (error) {
78
+ console.error('Failed to create endpoint:', error);
79
+ process.exit(1);
80
+ }
81
+ }
82
+ main();
83
+ //# sourceMappingURL=create-endpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-endpoint.js","sourceRoot":"","sources":["../../../engine/scripts/create-endpoint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scan-deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan-deps.d.ts","sourceRoot":"","sources":["../../../engine/scripts/scan-deps.ts"],"names":[],"mappings":""}