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.
- package/README.md +287 -0
- package/dist/engine/cli.d.ts +3 -0
- package/dist/engine/cli.d.ts.map +1 -0
- package/dist/engine/cli.js +4 -0
- package/dist/engine/cli.js.map +1 -0
- package/dist/engine/config/llm-costs.d.ts +16 -0
- package/dist/engine/config/llm-costs.d.ts.map +1 -0
- package/dist/engine/config/llm-costs.js +38 -0
- package/dist/engine/config/llm-costs.js.map +1 -0
- package/dist/engine/core/node-executor.d.ts +8 -0
- package/dist/engine/core/node-executor.d.ts.map +1 -0
- package/dist/engine/core/node-executor.js +144 -0
- package/dist/engine/core/node-executor.js.map +1 -0
- package/dist/engine/core/validator.d.ts +6 -0
- package/dist/engine/core/validator.d.ts.map +1 -0
- package/dist/engine/core/validator.js +473 -0
- package/dist/engine/core/validator.js.map +1 -0
- package/dist/engine/core/workflow-executor.d.ts +6 -0
- package/dist/engine/core/workflow-executor.d.ts.map +1 -0
- package/dist/engine/core/workflow-executor.js +186 -0
- package/dist/engine/core/workflow-executor.js.map +1 -0
- package/dist/engine/core/workflow-loader.d.ts +26 -0
- package/dist/engine/core/workflow-loader.d.ts.map +1 -0
- package/dist/engine/core/workflow-loader.js +257 -0
- package/dist/engine/core/workflow-loader.js.map +1 -0
- package/dist/engine/index.d.ts +5 -0
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/engine/index.js +70 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/nodes/code-node.d.ts +6 -0
- package/dist/engine/nodes/code-node.d.ts.map +1 -0
- package/dist/engine/nodes/code-node.js +70 -0
- package/dist/engine/nodes/code-node.js.map +1 -0
- package/dist/engine/nodes/llm-node.d.ts +6 -0
- package/dist/engine/nodes/llm-node.d.ts.map +1 -0
- package/dist/engine/nodes/llm-node.js +164 -0
- package/dist/engine/nodes/llm-node.js.map +1 -0
- package/dist/engine/nodes/passthrough-node.d.ts +6 -0
- package/dist/engine/nodes/passthrough-node.d.ts.map +1 -0
- package/dist/engine/nodes/passthrough-node.js +13 -0
- package/dist/engine/nodes/passthrough-node.js.map +1 -0
- package/dist/engine/nodes/reduce-node.d.ts +6 -0
- package/dist/engine/nodes/reduce-node.d.ts.map +1 -0
- package/dist/engine/nodes/reduce-node.js +44 -0
- package/dist/engine/nodes/reduce-node.js.map +1 -0
- package/dist/engine/nodes/split-node.d.ts +10 -0
- package/dist/engine/nodes/split-node.d.ts.map +1 -0
- package/dist/engine/nodes/split-node.js +51 -0
- package/dist/engine/nodes/split-node.js.map +1 -0
- package/dist/engine/providers/gemini.d.ts +27 -0
- package/dist/engine/providers/gemini.d.ts.map +1 -0
- package/dist/engine/providers/gemini.js +163 -0
- package/dist/engine/providers/gemini.js.map +1 -0
- package/dist/engine/providers/grok.d.ts +28 -0
- package/dist/engine/providers/grok.d.ts.map +1 -0
- package/dist/engine/providers/grok.js +164 -0
- package/dist/engine/providers/grok.js.map +1 -0
- package/dist/engine/providers/registry.d.ts +33 -0
- package/dist/engine/providers/registry.d.ts.map +1 -0
- package/dist/engine/providers/registry.js +51 -0
- package/dist/engine/providers/registry.js.map +1 -0
- package/dist/engine/router.d.ts +8 -0
- package/dist/engine/router.d.ts.map +1 -0
- package/dist/engine/router.js +79 -0
- package/dist/engine/router.js.map +1 -0
- package/dist/engine/scripts/cleanup-port.d.ts +2 -0
- package/dist/engine/scripts/cleanup-port.d.ts.map +1 -0
- package/dist/engine/scripts/cleanup-port.js +54 -0
- package/dist/engine/scripts/cleanup-port.js.map +1 -0
- package/dist/engine/scripts/create-endpoint.d.ts +2 -0
- package/dist/engine/scripts/create-endpoint.d.ts.map +1 -0
- package/dist/engine/scripts/create-endpoint.js +83 -0
- package/dist/engine/scripts/create-endpoint.js.map +1 -0
- package/dist/engine/scripts/scan-deps.d.ts +2 -0
- package/dist/engine/scripts/scan-deps.d.ts.map +1 -0
- package/dist/engine/scripts/scan-deps.js +112 -0
- package/dist/engine/scripts/scan-deps.js.map +1 -0
- package/dist/engine/scripts/validate-workflows.d.ts +3 -0
- package/dist/engine/scripts/validate-workflows.d.ts.map +1 -0
- package/dist/engine/scripts/validate-workflows.js +75 -0
- package/dist/engine/scripts/validate-workflows.js.map +1 -0
- package/dist/engine/server.d.ts +10 -0
- package/dist/engine/server.d.ts.map +1 -0
- package/dist/engine/server.js +92 -0
- package/dist/engine/server.js.map +1 -0
- package/dist/engine/types/index.d.ts +304 -0
- package/dist/engine/types/index.d.ts.map +1 -0
- package/dist/engine/types/index.js +24 -0
- package/dist/engine/types/index.js.map +1 -0
- package/dist/engine/utils/file-cache.d.ts +31 -0
- package/dist/engine/utils/file-cache.d.ts.map +1 -0
- package/dist/engine/utils/file-cache.js +68 -0
- package/dist/engine/utils/file-cache.js.map +1 -0
- package/dist/engine/utils/file-resolver.d.ts +21 -0
- package/dist/engine/utils/file-resolver.d.ts.map +1 -0
- package/dist/engine/utils/file-resolver.js +33 -0
- package/dist/engine/utils/file-resolver.js.map +1 -0
- package/dist/engine/utils/jsonpath.d.ts +13 -0
- package/dist/engine/utils/jsonpath.d.ts.map +1 -0
- package/dist/engine/utils/jsonpath.js +38 -0
- package/dist/engine/utils/jsonpath.js.map +1 -0
- package/dist/engine/utils/logger.d.ts +11 -0
- package/dist/engine/utils/logger.d.ts.map +1 -0
- package/dist/engine/utils/logger.js +24 -0
- package/dist/engine/utils/logger.js.map +1 -0
- package/dist/engine/utils/metrics.d.ts +6 -0
- package/dist/engine/utils/metrics.d.ts.map +1 -0
- package/dist/engine/utils/metrics.js +82 -0
- package/dist/engine/utils/metrics.js.map +1 -0
- package/dist/engine/utils/schema-validator.d.ts +10 -0
- package/dist/engine/utils/schema-validator.d.ts.map +1 -0
- package/dist/engine/utils/schema-validator.js +61 -0
- package/dist/engine/utils/schema-validator.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"scan-deps.d.ts","sourceRoot":"","sources":["../../../engine/scripts/scan-deps.ts"],"names":[],"mappings":""}
|