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,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File cache with modification time tracking
|
|
3
|
+
*/
|
|
4
|
+
declare class FileCache {
|
|
5
|
+
private cache;
|
|
6
|
+
private baseDir;
|
|
7
|
+
constructor(baseDir: string);
|
|
8
|
+
/**
|
|
9
|
+
* Get file content, using cache if file hasn't been modified
|
|
10
|
+
*/
|
|
11
|
+
get(filePath: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* Clear cache for a specific file
|
|
14
|
+
*/
|
|
15
|
+
invalidate(filePath: string): void;
|
|
16
|
+
/**
|
|
17
|
+
* Clear entire cache
|
|
18
|
+
*/
|
|
19
|
+
clear(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Get cache statistics
|
|
22
|
+
*/
|
|
23
|
+
getStats(): {
|
|
24
|
+
size: number;
|
|
25
|
+
entries: string[];
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare const promptCache: FileCache;
|
|
29
|
+
export declare const schemaCache: FileCache;
|
|
30
|
+
export default FileCache;
|
|
31
|
+
//# sourceMappingURL=file-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache.d.ts","sourceRoot":"","sources":["../../../engine/utils/file-cache.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,cAAM,SAAS;IACX,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,MAAM;IAI3B;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B5C;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKlC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,QAAQ;;;;CAMX;AAGD,eAAO,MAAM,WAAW,WAAmE,CAAC;AAC5F,eAAO,MAAM,WAAW,WAAmE,CAAC;AAE5F,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import logger from './logger.js';
|
|
4
|
+
/**
|
|
5
|
+
* File cache with modification time tracking
|
|
6
|
+
*/
|
|
7
|
+
class FileCache {
|
|
8
|
+
cache = new Map();
|
|
9
|
+
baseDir;
|
|
10
|
+
constructor(baseDir) {
|
|
11
|
+
this.baseDir = baseDir;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get file content, using cache if file hasn't been modified
|
|
15
|
+
*/
|
|
16
|
+
async get(filePath) {
|
|
17
|
+
const fullPath = path.isAbsolute(filePath) ? filePath : path.join(this.baseDir, filePath);
|
|
18
|
+
try {
|
|
19
|
+
const stats = await fs.stat(fullPath);
|
|
20
|
+
const cached = this.cache.get(fullPath);
|
|
21
|
+
// Return cached content if file hasn't been modified
|
|
22
|
+
if (cached && cached.mtime === stats.mtimeMs) {
|
|
23
|
+
logger.debug('File cache hit', { file: fullPath });
|
|
24
|
+
return cached.content;
|
|
25
|
+
}
|
|
26
|
+
// Load file content
|
|
27
|
+
const content = await fs.readFile(fullPath, 'utf-8');
|
|
28
|
+
// Update cache
|
|
29
|
+
this.cache.set(fullPath, {
|
|
30
|
+
content,
|
|
31
|
+
mtime: stats.mtimeMs,
|
|
32
|
+
});
|
|
33
|
+
logger.debug('File cache miss, loaded from disk', { file: fullPath });
|
|
34
|
+
return content;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
throw new Error(`Failed to read file '${fullPath}': ${message}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Clear cache for a specific file
|
|
43
|
+
*/
|
|
44
|
+
invalidate(filePath) {
|
|
45
|
+
const fullPath = path.isAbsolute(filePath) ? filePath : path.join(this.baseDir, filePath);
|
|
46
|
+
this.cache.delete(fullPath);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Clear entire cache
|
|
50
|
+
*/
|
|
51
|
+
clear() {
|
|
52
|
+
this.cache.clear();
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get cache statistics
|
|
56
|
+
*/
|
|
57
|
+
getStats() {
|
|
58
|
+
return {
|
|
59
|
+
size: this.cache.size,
|
|
60
|
+
entries: Array.from(this.cache.keys()),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Create singleton instances for different file types
|
|
65
|
+
export const promptCache = new FileCache(process.env.PROMPTS_DIR || './src/source/prompts');
|
|
66
|
+
export const schemaCache = new FileCache(process.env.SCHEMAS_DIR || './src/source/schemas');
|
|
67
|
+
export default FileCache;
|
|
68
|
+
//# sourceMappingURL=file-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-cache.js","sourceRoot":"","sources":["../../../engine/utils/file-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,MAAM,MAAM,aAAa,CAAC;AAOjC;;GAEG;AACH,MAAM,SAAS;IACH,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACtC,OAAO,CAAS;IAExB,YAAY,OAAe;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,QAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE1F,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExC,qDAAqD;YACrD,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC3C,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,OAAO,MAAM,CAAC,OAAO,CAAC;YAC1B,CAAC;YAED,oBAAoB;YACpB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAErD,eAAe;YACf,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACrB,OAAO;gBACP,KAAK,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YAEH,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACtE,OAAO,OAAO,CAAC;QACnB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,wBAAwB,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC1F,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,KAAK;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SACzC,CAAC;IACN,CAAC;CACJ;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB,CAAC,CAAC;AAC5F,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,sBAAsB,CAAC,CAAC;AAE5F,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve file path for code or prompt files
|
|
3
|
+
*
|
|
4
|
+
* Files are always local to the endpoint folder:
|
|
5
|
+
* - code files: src/endpoints/<path>/codes/<filename>
|
|
6
|
+
* - prompt files: src/endpoints/<path>/prompts/<filename>
|
|
7
|
+
*
|
|
8
|
+
* For shared utilities, code files can import from @workflow/plugins/...
|
|
9
|
+
* which maps to src/plugins/...
|
|
10
|
+
*
|
|
11
|
+
* @param filename - The filename from YAML
|
|
12
|
+
* @param endpointPath - The endpoint folder path relative to src/endpoints
|
|
13
|
+
* @param type - 'codes' or 'prompts'
|
|
14
|
+
*/
|
|
15
|
+
export declare function resolveFilePath(filename: string, endpointPath: string, type: 'codes' | 'prompts'): string;
|
|
16
|
+
/**
|
|
17
|
+
* Extract endpoint path from route
|
|
18
|
+
* Converts route like "/users/:id" to folder path "users/[id]"
|
|
19
|
+
*/
|
|
20
|
+
export declare function routeToEndpointPath(route: string): string;
|
|
21
|
+
//# sourceMappingURL=file-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-resolver.d.ts","sourceRoot":"","sources":["../../../engine/utils/file-resolver.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,OAAO,GAAG,SAAS,GAC1B,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOzD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
const workflowsDir = process.env.WORKFLOWS_DIR || './src';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve file path for code or prompt files
|
|
5
|
+
*
|
|
6
|
+
* Files are always local to the endpoint folder:
|
|
7
|
+
* - code files: src/endpoints/<path>/codes/<filename>
|
|
8
|
+
* - prompt files: src/endpoints/<path>/prompts/<filename>
|
|
9
|
+
*
|
|
10
|
+
* For shared utilities, code files can import from @workflow/plugins/...
|
|
11
|
+
* which maps to src/plugins/...
|
|
12
|
+
*
|
|
13
|
+
* @param filename - The filename from YAML
|
|
14
|
+
* @param endpointPath - The endpoint folder path relative to src/endpoints
|
|
15
|
+
* @param type - 'codes' or 'prompts'
|
|
16
|
+
*/
|
|
17
|
+
export function resolveFilePath(filename, endpointPath, type) {
|
|
18
|
+
// All files are local to the endpoint
|
|
19
|
+
return path.join(process.cwd(), workflowsDir, 'endpoints', endpointPath, type, filename);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract endpoint path from route
|
|
23
|
+
* Converts route like "/users/:id" to folder path "users/[id]"
|
|
24
|
+
*/
|
|
25
|
+
export function routeToEndpointPath(route) {
|
|
26
|
+
// Remove leading slash and convert :param to [param]
|
|
27
|
+
return route
|
|
28
|
+
.replace(/^\//, '')
|
|
29
|
+
.split('/')
|
|
30
|
+
.map(segment => segment.startsWith(':') ? `[${segment.slice(1)}]` : segment)
|
|
31
|
+
.join('/');
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=file-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-resolver.js","sourceRoot":"","sources":["../../../engine/utils/file-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC;AAE1D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAC3B,QAAgB,EAChB,YAAoB,EACpB,IAAyB;IAEzB,sCAAsC;IACtC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC7C,qDAAqD;IACrD,OAAO,KAAK;SACP,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;SAClB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;SAC3E,IAAI,CAAC,GAAG,CAAC,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluate a JSONPath expression against data
|
|
3
|
+
*/
|
|
4
|
+
export declare function evaluate(path: string, data: unknown): unknown;
|
|
5
|
+
/**
|
|
6
|
+
* Evaluate multiple JSONPath expressions
|
|
7
|
+
*/
|
|
8
|
+
export declare function evaluateAll(mapping: Record<string, string>, data: unknown): Record<string, unknown>;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a JSONPath expression is valid syntax
|
|
11
|
+
*/
|
|
12
|
+
export declare function isValidPath(path: string): boolean;
|
|
13
|
+
//# sourceMappingURL=jsonpath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonpath.d.ts","sourceRoot":"","sources":["../../../engine/utils/jsonpath.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAQ7D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,OAAO,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { JSONPath } from 'jsonpath-plus';
|
|
2
|
+
import { ErrorCode } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Evaluate a JSONPath expression against data
|
|
5
|
+
*/
|
|
6
|
+
export function evaluate(path, data) {
|
|
7
|
+
try {
|
|
8
|
+
const result = JSONPath({ path, json: data, wrap: false });
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
throw new Error(`${ErrorCode.JSONPATH_ERROR}: Failed to evaluate path '${path}': ${message}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Evaluate multiple JSONPath expressions
|
|
18
|
+
*/
|
|
19
|
+
export function evaluateAll(mapping, data) {
|
|
20
|
+
const result = {};
|
|
21
|
+
for (const [key, path] of Object.entries(mapping)) {
|
|
22
|
+
result[key] = evaluate(path, data);
|
|
23
|
+
}
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if a JSONPath expression is valid syntax
|
|
28
|
+
*/
|
|
29
|
+
export function isValidPath(path) {
|
|
30
|
+
try {
|
|
31
|
+
JSONPath({ path, json: {}, wrap: false });
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=jsonpath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonpath.js","sourceRoot":"","sources":["../../../engine/utils/jsonpath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAa;IAChD,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAsB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,CAAC,cAAc,8BAA8B,IAAI,MAAM,OAAO,EAAE,CAAC,CAAC;IAClG,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACvB,OAA+B,EAC/B,IAAa;IAEb,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACpC,IAAI,CAAC;QACD,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
/**
|
|
3
|
+
* Create winston logger with appropriate format
|
|
4
|
+
*/
|
|
5
|
+
declare const logger: winston.Logger;
|
|
6
|
+
/**
|
|
7
|
+
* Create a child logger with additional context
|
|
8
|
+
*/
|
|
9
|
+
export declare function createLogger(context: Record<string, unknown>): winston.Logger;
|
|
10
|
+
export default logger;
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../engine/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAK9B;;GAEG;AACH,QAAA,MAAM,MAAM,gBAaV,CAAC;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBAE5D;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
const logLevel = process.env.LOG_LEVEL || 'info';
|
|
3
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
|
4
|
+
/**
|
|
5
|
+
* Create winston logger with appropriate format
|
|
6
|
+
*/
|
|
7
|
+
const logger = winston.createLogger({
|
|
8
|
+
level: logLevel,
|
|
9
|
+
format: isProduction
|
|
10
|
+
? winston.format.json()
|
|
11
|
+
: winston.format.combine(winston.format.colorize(), winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), winston.format.printf(({ timestamp, level, message, ...meta }) => {
|
|
12
|
+
const metaStr = Object.keys(meta).length ? JSON.stringify(meta, null, 2) : '';
|
|
13
|
+
return `${timestamp} [${level}]: ${message} ${metaStr}`;
|
|
14
|
+
})),
|
|
15
|
+
transports: [new winston.transports.Console()],
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Create a child logger with additional context
|
|
19
|
+
*/
|
|
20
|
+
export function createLogger(context) {
|
|
21
|
+
return logger.child(context);
|
|
22
|
+
}
|
|
23
|
+
export default logger;
|
|
24
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../engine/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;AACjD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAChC,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,YAAY;QAChB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;QACvB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,EAC3D,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE;YAC7D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;QAC5D,CAAC,CAAC,CACL;IACL,UAAU,EAAE,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;CACjD,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgC;IACzD,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../engine/utils/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAKrD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAwF3D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import logger from './logger.js';
|
|
2
|
+
import { getModelCost } from '../config/llm-costs.js';
|
|
3
|
+
/**
|
|
4
|
+
* Display metrics in a tabular format
|
|
5
|
+
*/
|
|
6
|
+
export function displayMetrics(metrics) {
|
|
7
|
+
if (metrics.length === 0) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
console.log('\n📊 Pipeline Metrics:');
|
|
11
|
+
console.log('─'.repeat(80));
|
|
12
|
+
// Header
|
|
13
|
+
console.log(padRight('Node ID', 25) +
|
|
14
|
+
padRight('Type', 12) +
|
|
15
|
+
padRight('Runtime', 12) +
|
|
16
|
+
padRight('Tokens (in/out)', 20) +
|
|
17
|
+
padRight('Cost ($)', 12));
|
|
18
|
+
console.log('─'.repeat(80));
|
|
19
|
+
// Calculate totals
|
|
20
|
+
let totalTime = 0;
|
|
21
|
+
let totalInputTokens = 0;
|
|
22
|
+
let totalOutputTokens = 0;
|
|
23
|
+
let totalCost = 0;
|
|
24
|
+
// Rows
|
|
25
|
+
for (const metric of metrics) {
|
|
26
|
+
const runtimeSeconds = (metric.executionTimeMs / 1000).toFixed(2);
|
|
27
|
+
const runtime = `${runtimeSeconds}s`;
|
|
28
|
+
let tokens = '-';
|
|
29
|
+
let costStr = '-';
|
|
30
|
+
let cost = 0;
|
|
31
|
+
if (metric.inputTokens !== undefined || metric.outputTokens !== undefined) {
|
|
32
|
+
const inputStr = metric.inputTokens?.toString() || '0';
|
|
33
|
+
const outputStr = metric.outputTokens?.toString() || '0';
|
|
34
|
+
tokens = `${inputStr} / ${outputStr}`;
|
|
35
|
+
}
|
|
36
|
+
if (metric.nodeType === 'llm' && metric.model) {
|
|
37
|
+
const modelCosts = getModelCost(metric.model);
|
|
38
|
+
const inputCost = ((metric.inputTokens || 0) / 1_000_000) * modelCosts.inputCostPer1M;
|
|
39
|
+
const outputCost = ((metric.outputTokens || 0) / 1_000_000) * modelCosts.outputCostPer1M;
|
|
40
|
+
const cachedCost = ((metric.cachedTokens || 0) / 1_000_000) * (modelCosts.cachedInputCostPer1M || 0);
|
|
41
|
+
cost = inputCost + outputCost + cachedCost;
|
|
42
|
+
costStr = `$${cost.toFixed(6)}`;
|
|
43
|
+
}
|
|
44
|
+
console.log(padRight(metric.nodeId, 25) +
|
|
45
|
+
padRight(metric.nodeType, 12) +
|
|
46
|
+
padRight(runtime, 12) +
|
|
47
|
+
padRight(tokens, 20) +
|
|
48
|
+
padRight(costStr, 12));
|
|
49
|
+
totalTime += metric.executionTimeMs;
|
|
50
|
+
totalInputTokens += metric.inputTokens || 0;
|
|
51
|
+
totalOutputTokens += metric.outputTokens || 0;
|
|
52
|
+
totalCost += cost;
|
|
53
|
+
}
|
|
54
|
+
// Footer with totals
|
|
55
|
+
console.log('─'.repeat(80));
|
|
56
|
+
const totalRuntimeSeconds = (totalTime / 1000).toFixed(2);
|
|
57
|
+
const totalTokens = totalInputTokens > 0 || totalOutputTokens > 0
|
|
58
|
+
? `${totalInputTokens} / ${totalOutputTokens}`
|
|
59
|
+
: '-';
|
|
60
|
+
console.log(padRight('TOTAL', 25) +
|
|
61
|
+
padRight('', 12) +
|
|
62
|
+
padRight(`${totalRuntimeSeconds}s`, 12) +
|
|
63
|
+
padRight(totalTokens, 20) +
|
|
64
|
+
padRight(`$${totalCost.toFixed(6)}`, 12));
|
|
65
|
+
console.log('─'.repeat(80));
|
|
66
|
+
console.log('');
|
|
67
|
+
// Log summary to logger
|
|
68
|
+
logger.info('Pipeline execution metrics', {
|
|
69
|
+
totalExecutionTimeMs: totalTime.toFixed(2),
|
|
70
|
+
totalInputTokens,
|
|
71
|
+
totalOutputTokens,
|
|
72
|
+
totalCost: totalCost.toFixed(6),
|
|
73
|
+
nodeCount: metrics.length,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Pad string to the right
|
|
78
|
+
*/
|
|
79
|
+
function padRight(str, length) {
|
|
80
|
+
return str.padEnd(length, ' ');
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../engine/utils/metrics.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsB;IACjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,SAAS;IACT,OAAO,CAAC,GAAG,CACP,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QACpB,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC;QACvB,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAC/B,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAC3B,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,mBAAmB;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,OAAO;IACP,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,GAAG,cAAc,GAAG,CAAC;QAErC,IAAI,MAAM,GAAG,GAAG,CAAC;QACjB,IAAI,OAAO,GAAG,GAAG,CAAC;QAClB,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACxE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC;YACvD,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,QAAQ,EAAE,IAAI,GAAG,CAAC;YACzD,MAAM,GAAG,GAAG,QAAQ,MAAM,SAAS,EAAE,CAAC;QAC1C,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,cAAc,CAAC;YACtF,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,eAAe,CAAC;YACzF,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,oBAAoB,IAAI,CAAC,CAAC,CAAC;YAErG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;YAC3C,OAAO,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,CAAC,GAAG,CACP,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3B,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC7B,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACrB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CACxB,CAAC;QAEF,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC;QACpC,gBAAgB,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC;QAC5C,iBAAiB,IAAI,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;QAC9C,SAAS,IAAI,IAAI,CAAC;IACtB,CAAC;IAED,qBAAqB;IACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,mBAAmB,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,gBAAgB,GAAG,CAAC,IAAI,iBAAiB,GAAG,CAAC;QAC7D,CAAC,CAAC,GAAG,gBAAgB,MAAM,iBAAiB,EAAE;QAC9C,CAAC,CAAC,GAAG,CAAC;IAEV,OAAO,CAAC,GAAG,CACP,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;QAChB,QAAQ,CAAC,GAAG,mBAAmB,GAAG,EAAE,EAAE,CAAC;QACvC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAC3C,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,wBAAwB;IACxB,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;QACtC,oBAAoB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,gBAAgB;QAChB,iBAAiB;QACjB,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/B,SAAS,EAAE,OAAO,CAAC,MAAM;KAC5B,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,GAAW,EAAE,MAAc;IACzC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ValidationResult } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate data against a JSON schema
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateSchema(data: unknown, schema: Record<string, unknown> | string): Promise<ValidationResult>;
|
|
6
|
+
/**
|
|
7
|
+
* Check if a schema is valid JSON Schema
|
|
8
|
+
*/
|
|
9
|
+
export declare function isValidSchema(schema: unknown): boolean;
|
|
10
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../engine/utils/schema-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK1D;;GAEG;AACH,wBAAsB,cAAc,CAChC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GACzC,OAAO,CAAC,gBAAgB,CAAC,CA+B3B;AAoBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAOtD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import Ajv from 'ajv';
|
|
2
|
+
import { schemaCache } from './file-cache.js';
|
|
3
|
+
const ajv = new Ajv({ allErrors: true });
|
|
4
|
+
/**
|
|
5
|
+
* Validate data against a JSON schema
|
|
6
|
+
*/
|
|
7
|
+
export async function validateSchema(data, schema) {
|
|
8
|
+
let schemaObj;
|
|
9
|
+
// Load schema from file if it's a string path
|
|
10
|
+
if (typeof schema === 'string') {
|
|
11
|
+
const schemaContent = await schemaCache.get(schema);
|
|
12
|
+
schemaObj = JSON.parse(schemaContent);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
schemaObj = schema;
|
|
16
|
+
}
|
|
17
|
+
// Compile and validate
|
|
18
|
+
const validate = ajv.compile(schemaObj);
|
|
19
|
+
const valid = validate(data);
|
|
20
|
+
if (valid) {
|
|
21
|
+
return { valid: true };
|
|
22
|
+
}
|
|
23
|
+
// Format errors
|
|
24
|
+
const errors = (validate.errors || []).map((error) => ({
|
|
25
|
+
code: 'SCHEMA_VALIDATION_ERROR',
|
|
26
|
+
message: formatErrorMessage(error),
|
|
27
|
+
path: error.instancePath,
|
|
28
|
+
details: error,
|
|
29
|
+
}));
|
|
30
|
+
return {
|
|
31
|
+
valid: false,
|
|
32
|
+
errors,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format Ajv error into human-readable message
|
|
37
|
+
*/
|
|
38
|
+
function formatErrorMessage(error) {
|
|
39
|
+
const { instancePath, message, params } = error;
|
|
40
|
+
const path = instancePath || 'root';
|
|
41
|
+
if (error.keyword === 'required') {
|
|
42
|
+
return `${path} ${message}: ${params.missingProperty}`;
|
|
43
|
+
}
|
|
44
|
+
if (error.keyword === 'type') {
|
|
45
|
+
return `${path} ${message}`;
|
|
46
|
+
}
|
|
47
|
+
return `${path}: ${message}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Check if a schema is valid JSON Schema
|
|
51
|
+
*/
|
|
52
|
+
export function isValidSchema(schema) {
|
|
53
|
+
try {
|
|
54
|
+
ajv.compile(schema);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../engine/utils/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,GAAoB,MAAM,KAAK,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAChC,IAAa,EACb,MAAwC;IAExC,IAAI,SAAkC,CAAC;IAEvC,8CAA8C;IAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,aAAa,GAAG,MAAM,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACJ,SAAS,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,uBAAuB;IACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7B,IAAI,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB;IAChB,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAkB,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,EAAE,yBAAyB;QAC/B,OAAO,EAAE,kBAAkB,CAAC,KAAK,CAAC;QAClC,IAAI,EAAE,KAAK,CAAC,YAAY;QACxB,OAAO,EAAE,KAAK;KACjB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACH,KAAK,EAAE,KAAK;QACZ,MAAM;KACT,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAkB;IAC1C,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChD,MAAM,IAAI,GAAG,YAAY,IAAI,MAAM,CAAC;IAEpC,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAC/B,OAAO,GAAG,IAAI,IAAI,OAAO,KAAM,MAAsC,CAAC,eAAe,EAAE,CAAC;IAC5F,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAe;IACzC,IAAI,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,MAAiC,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dynamic-api-workflow",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "TypeScript-based dynamic API workflow engine that creates configurable endpoints from YAML definitions",
|
|
5
|
+
"main": "dist/engine/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dynamic-api-workflow": "./dist/engine/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/engine",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"type": "module",
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsx engine/scripts/cleanup-port.ts && tsx --watch engine/cli.ts",
|
|
17
|
+
"create-endpoint": "tsx engine/scripts/create-endpoint.ts",
|
|
18
|
+
"start": "node dist/engine/cli.js",
|
|
19
|
+
"validate": "tsx engine/scripts/validate-workflows.ts",
|
|
20
|
+
"scan-deps": "tsx engine/scripts/scan-deps.ts",
|
|
21
|
+
"lint": "eslint engine/",
|
|
22
|
+
"format": "prettier --write \"engine/**/*.ts\""
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"api",
|
|
26
|
+
"workflow",
|
|
27
|
+
"llm",
|
|
28
|
+
"automation",
|
|
29
|
+
"yaml"
|
|
30
|
+
],
|
|
31
|
+
"author": "",
|
|
32
|
+
"license": "ISC",
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"@google/generative-ai": "^0.21.0",
|
|
35
|
+
"@xmldom/xmldom": "^0.8.11",
|
|
36
|
+
"ajv": "^8.12.0",
|
|
37
|
+
"dotenv": "^16.4.1",
|
|
38
|
+
"express": "^4.18.2",
|
|
39
|
+
"jsonpath-plus": "^10.2.0",
|
|
40
|
+
"winston": "^3.11.0",
|
|
41
|
+
"yaml": "^2.3.4"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@types/express": "^4.17.21",
|
|
45
|
+
"@types/node": "^20.11.5",
|
|
46
|
+
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
47
|
+
"@typescript-eslint/parser": "^6.19.0",
|
|
48
|
+
"eslint": "^8.56.0",
|
|
49
|
+
"prettier": "^3.2.4",
|
|
50
|
+
"tsx": "^4.7.0",
|
|
51
|
+
"typescript": "^5.3.3"
|
|
52
|
+
}
|
|
53
|
+
}
|