@charliesu/workflow-core 0.0.1-alpha → 0.0.3-alpha
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 +116 -23
- package/dist/lib/validation.d.ts +1 -8
- package/dist/lib/validation.d.ts.map +1 -1
- package/dist/lib/validation.js +56 -67
- package/dist/lib/validation.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
[](https://www.npmjs.com/package/@charliesu/workflow-core)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
6
|
|
|
7
|
-
Shared workflow
|
|
7
|
+
Shared workflow validation and type definitions for TopFlow and TaraFlow - React Flow based workflow orchestration library.
|
|
8
|
+
|
|
9
|
+
> **Current Version**: 0.0.2-alpha
|
|
10
|
+
> **Status**: Alpha - API may change
|
|
8
11
|
|
|
9
12
|
## Installation
|
|
10
13
|
|
|
@@ -24,44 +27,80 @@ yarn add @charliesu/workflow-core
|
|
|
24
27
|
|
|
25
28
|
## Usage
|
|
26
29
|
|
|
27
|
-
|
|
28
|
-
import { WorkflowEngine, WorkflowNode, WorkflowEdge } from '@charliesu/workflow-core';
|
|
30
|
+
### Workflow Validation
|
|
29
31
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
```typescript
|
|
33
|
+
import {
|
|
34
|
+
validateWorkflow,
|
|
35
|
+
validateApiKeys,
|
|
36
|
+
calculateValidationScore,
|
|
37
|
+
getValidationGrade,
|
|
38
|
+
type ValidationIssue
|
|
39
|
+
} from '@charliesu/workflow-core';
|
|
40
|
+
import type { Node, Edge } from '@xyflow/react';
|
|
41
|
+
|
|
42
|
+
// Validate workflow structure
|
|
43
|
+
const nodes: Node[] = [
|
|
32
44
|
{
|
|
33
45
|
id: '1',
|
|
34
46
|
type: 'start',
|
|
35
47
|
position: { x: 0, y: 0 },
|
|
36
|
-
data: {
|
|
48
|
+
data: {}
|
|
37
49
|
},
|
|
38
50
|
{
|
|
39
51
|
id: '2',
|
|
40
52
|
type: 'textModel',
|
|
41
53
|
position: { x: 200, y: 0 },
|
|
42
|
-
data: { model: 'gpt-
|
|
54
|
+
data: { model: 'gpt-4o', temperature: 0.7 }
|
|
43
55
|
}
|
|
44
56
|
];
|
|
45
57
|
|
|
46
|
-
const edges:
|
|
47
|
-
{
|
|
48
|
-
id: 'e1-2',
|
|
49
|
-
source: '1',
|
|
50
|
-
target: '2'
|
|
51
|
-
}
|
|
58
|
+
const edges: Edge[] = [
|
|
59
|
+
{ id: 'e1-2', source: '1', target: '2' }
|
|
52
60
|
];
|
|
53
61
|
|
|
54
|
-
//
|
|
55
|
-
|
|
62
|
+
// Run validation
|
|
63
|
+
const issues: ValidationIssue[] = validateWorkflow(nodes, edges);
|
|
64
|
+
|
|
65
|
+
// Check API keys
|
|
66
|
+
const apiKeys = { openai: 'sk-...' };
|
|
67
|
+
const keyIssues = validateApiKeys(apiKeys, nodes);
|
|
68
|
+
|
|
69
|
+
// Calculate validation score (0-100)
|
|
70
|
+
const score = calculateValidationScore([...issues, ...keyIssues]);
|
|
71
|
+
const grade = getValidationGrade(score); // A, B, C, D, or F
|
|
72
|
+
|
|
73
|
+
console.log(`Validation: ${grade} (${score}/100)`);
|
|
74
|
+
console.log(`Issues:`, issues);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### ValidationIssue Type
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
interface ValidationIssue {
|
|
81
|
+
type: 'error' | 'warning' | 'info';
|
|
82
|
+
nodeId?: string; // Optional: specific node with issue
|
|
83
|
+
message: string; // Human-readable error message
|
|
84
|
+
field?: string; // Optional: specific field with issue
|
|
85
|
+
suggestion?: string; // Optional: how to fix
|
|
86
|
+
}
|
|
56
87
|
```
|
|
57
88
|
|
|
58
89
|
## Features
|
|
59
90
|
|
|
60
|
-
-
|
|
91
|
+
- ✅ **Workflow Validation** - Comprehensive validation for React Flow workflows
|
|
92
|
+
- Cycle detection (prevents infinite loops)
|
|
93
|
+
- Orphan node detection
|
|
94
|
+
- Missing configuration checks
|
|
95
|
+
- SSRF protection for HTTP nodes
|
|
96
|
+
- 🔐 **Security-First** - Built-in security validations
|
|
97
|
+
- URL safety checks (blocks localhost, private IPs, metadata endpoints)
|
|
98
|
+
- API key validation
|
|
99
|
+
- Protocol restrictions (HTTP/HTTPS only)
|
|
100
|
+
- 📊 **Validation Scoring** - Grade workflows A-F based on issues
|
|
61
101
|
- 📦 **TypeScript Support** - Full type safety with TypeScript definitions
|
|
62
|
-
- 🎯 **Shared
|
|
63
|
-
- ⚡ **
|
|
64
|
-
- 🔐 **Security-First** - Built with security patterns in mind
|
|
102
|
+
- 🎯 **Shared Library** - Common validation logic for TopFlow and TaraFlow
|
|
103
|
+
- ⚡ **Zero Dependencies** - Only peer dependencies on React and @xyflow/react
|
|
65
104
|
|
|
66
105
|
## Requirements
|
|
67
106
|
|
|
@@ -70,10 +109,32 @@ This package has peer dependencies that you need to install:
|
|
|
70
109
|
- React >= 19.0.0
|
|
71
110
|
- React DOM >= 19.0.0
|
|
72
111
|
|
|
73
|
-
##
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
112
|
+
## Validation Checks
|
|
113
|
+
|
|
114
|
+
### Structural Validation
|
|
115
|
+
- **Cycle Detection** - Identifies circular dependencies that would cause infinite loops
|
|
116
|
+
- **Orphan Nodes** - Finds disconnected nodes that won't execute
|
|
117
|
+
- **Start Node** - Ensures workflow has an entry point
|
|
118
|
+
- **Unreachable End Nodes** - Detects end nodes with no incoming connections
|
|
119
|
+
|
|
120
|
+
### Configuration Validation
|
|
121
|
+
Validates node-specific requirements:
|
|
122
|
+
- **Text Model Nodes** - Requires model selection
|
|
123
|
+
- **HTTP Request Nodes** - Requires valid URL, checks for SSRF vulnerabilities
|
|
124
|
+
- **Prompt Nodes** - Warns about empty content
|
|
125
|
+
- **Conditional Nodes** - Requires condition expression
|
|
126
|
+
- **Unused Outputs** - Detects nodes whose output is never used
|
|
127
|
+
- **Long Chains** - Warns about chains >10 nodes deep
|
|
128
|
+
|
|
129
|
+
### Security Validation
|
|
130
|
+
- **SSRF Prevention** - Blocks requests to:
|
|
131
|
+
- localhost, 127.0.0.1, 0.0.0.0
|
|
132
|
+
- Private IP ranges (10.x, 172.16.x, 192.168.x)
|
|
133
|
+
- Cloud metadata endpoints (AWS, GCP)
|
|
134
|
+
- **Protocol Restrictions** - Only allows HTTP/HTTPS
|
|
135
|
+
- **API Key Validation** - Ensures required provider keys are configured
|
|
136
|
+
|
|
137
|
+
### Supported Node Types
|
|
77
138
|
- **Entry/Exit**: `start`, `end`
|
|
78
139
|
- **AI Nodes**: `textModel`, `embeddingModel`, `imageGeneration`, `audio`
|
|
79
140
|
- **Data Nodes**: `prompt`, `javascript`, `structuredOutput`
|
|
@@ -108,6 +169,38 @@ This package provides the core workflow engine that is shared between:
|
|
|
108
169
|
|
|
109
170
|
The forked foundation architecture allows both projects to share common workflow logic while maintaining their unique features.
|
|
110
171
|
|
|
172
|
+
## API Reference
|
|
173
|
+
|
|
174
|
+
### Core Functions
|
|
175
|
+
|
|
176
|
+
- `validateWorkflow(nodes, edges)` - Validates workflow structure and configuration
|
|
177
|
+
- `validateApiKeys(apiKeys, nodes)` - Validates required API keys for nodes
|
|
178
|
+
- `calculateValidationScore(issues)` - Calculates 0-100 score from issues
|
|
179
|
+
- `getValidationGrade(score)` - Converts score to letter grade (A-F)
|
|
180
|
+
- `isUrlSafe(url)` - Checks if URL is safe (no SSRF)
|
|
181
|
+
- `detectCycles(nodes, edges)` - Finds circular dependencies
|
|
182
|
+
|
|
183
|
+
### Types
|
|
184
|
+
|
|
185
|
+
- `ValidationIssue` - Validation error/warning/info object
|
|
186
|
+
- `ValidationIssueType` - Type literal: `'error' | 'warning' | 'info'`
|
|
187
|
+
|
|
188
|
+
## Changelog
|
|
189
|
+
|
|
190
|
+
### 0.0.2-alpha (2026-01-12)
|
|
191
|
+
- **Breaking**: Updated `ValidationIssue` interface
|
|
192
|
+
- Removed: `id`, `title`, `description`, `nodeIds[]`, `fixable`
|
|
193
|
+
- Added: `message` (combined title+description), `nodeId?` (single node), `field?`, `suggestion?`
|
|
194
|
+
- Improved validation messages with actionable suggestions
|
|
195
|
+
- Consolidated duplicate type definitions
|
|
196
|
+
- Fixed type exports for better IDE support
|
|
197
|
+
|
|
198
|
+
### 0.0.1-alpha (2026-01-11)
|
|
199
|
+
- Initial alpha release
|
|
200
|
+
- Core validation functions
|
|
201
|
+
- TypeScript type definitions
|
|
202
|
+
- SSRF protection
|
|
203
|
+
|
|
111
204
|
## Contributing
|
|
112
205
|
|
|
113
206
|
Contributions are welcome! Please feel free to submit a Pull Request.
|
package/dist/lib/validation.d.ts
CHANGED
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import type { Node, Edge } from "@xyflow/react";
|
|
2
|
-
|
|
3
|
-
id: string;
|
|
4
|
-
type: "error" | "warning" | "info";
|
|
5
|
-
title: string;
|
|
6
|
-
description: string;
|
|
7
|
-
nodeIds: string[];
|
|
8
|
-
fixable: boolean;
|
|
9
|
-
};
|
|
2
|
+
import type { ValidationIssue } from "../types/validation";
|
|
10
3
|
export declare function isUrlSafe(url: string): boolean;
|
|
11
4
|
export declare function detectCycles(nodes: Node[], edges: Edge[]): string[][];
|
|
12
5
|
export declare function validateWorkflow(nodes: Node[], edges: Edge[]): ValidationIssue[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAa1D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA2B9C;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,CA+CrE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CAgLhF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,eAAe,EAAE,CA2BjG;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,CAa1E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD"}
|
package/dist/lib/validation.js
CHANGED
|
@@ -9,6 +9,9 @@ const BLOCKED_HOSTS = [
|
|
|
9
9
|
"192.168.",
|
|
10
10
|
];
|
|
11
11
|
export function isUrlSafe(url) {
|
|
12
|
+
if (url.startsWith('/')) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
12
15
|
try {
|
|
13
16
|
const parsed = new URL(url);
|
|
14
17
|
const hostname = parsed.hostname.toLowerCase();
|
|
@@ -70,14 +73,12 @@ export function validateWorkflow(nodes, edges) {
|
|
|
70
73
|
const issues = [];
|
|
71
74
|
const cycles = detectCycles(nodes, edges);
|
|
72
75
|
if (cycles.length > 0) {
|
|
73
|
-
cycles.forEach((cycle
|
|
76
|
+
cycles.forEach((cycle) => {
|
|
74
77
|
issues.push({
|
|
75
|
-
id: `cycle-${index}`,
|
|
76
78
|
type: "error",
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
fixable: false,
|
|
79
|
+
nodeId: cycle[0],
|
|
80
|
+
message: `Cycle detected - Infinite loop found involving nodes: ${cycle.join(' → ')}`,
|
|
81
|
+
suggestion: "Remove connections that create circular dependencies"
|
|
81
82
|
});
|
|
82
83
|
});
|
|
83
84
|
}
|
|
@@ -88,24 +89,21 @@ export function validateWorkflow(nodes, edges) {
|
|
|
88
89
|
});
|
|
89
90
|
const orphanNodes = nodes.filter((node) => !connectedNodes.has(node.id) && node.type !== "start" && nodes.length > 1);
|
|
90
91
|
if (orphanNodes.length > 0) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
orphanNodes.forEach((node) => {
|
|
93
|
+
issues.push({
|
|
94
|
+
type: "warning",
|
|
95
|
+
nodeId: node.id,
|
|
96
|
+
message: "Orphan node - Not connected to workflow and will not execute",
|
|
97
|
+
suggestion: "Connect this node to the workflow or remove it"
|
|
98
|
+
});
|
|
98
99
|
});
|
|
99
100
|
}
|
|
100
101
|
const hasStartNode = nodes.some((node) => node.type === "start");
|
|
101
102
|
if (!hasStartNode && nodes.length > 0) {
|
|
102
103
|
issues.push({
|
|
103
|
-
id: "no-start-node",
|
|
104
104
|
type: "warning",
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
nodeIds: [],
|
|
108
|
-
fixable: false,
|
|
105
|
+
message: "No Start node - Workflow needs an entry point",
|
|
106
|
+
suggestion: "Add a Start node to define where execution begins"
|
|
109
107
|
});
|
|
110
108
|
}
|
|
111
109
|
const endNodes = nodes.filter((node) => node.type === "end");
|
|
@@ -113,12 +111,10 @@ export function validateWorkflow(nodes, edges) {
|
|
|
113
111
|
const hasPath = edges.some((edge) => edge.target === endNode.id);
|
|
114
112
|
if (!hasPath && nodes.length > 1) {
|
|
115
113
|
issues.push({
|
|
116
|
-
id: `unreachable-end-${endNode.id}`,
|
|
117
114
|
type: "warning",
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
fixable: false,
|
|
115
|
+
nodeId: endNode.id,
|
|
116
|
+
message: "Unreachable End node - Cannot be reached from any other node",
|
|
117
|
+
suggestion: "Connect this node to the workflow or remove it"
|
|
122
118
|
});
|
|
123
119
|
}
|
|
124
120
|
});
|
|
@@ -128,58 +124,53 @@ export function validateWorkflow(nodes, edges) {
|
|
|
128
124
|
case "textModel":
|
|
129
125
|
if (!data.model) {
|
|
130
126
|
issues.push({
|
|
131
|
-
id: `missing-model-${node.id}`,
|
|
132
127
|
type: "error",
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
nodeId: node.id,
|
|
129
|
+
field: "model",
|
|
130
|
+
message: "Text Model node requires a model to be selected",
|
|
131
|
+
suggestion: "Select an AI model from the configuration panel"
|
|
137
132
|
});
|
|
138
133
|
}
|
|
139
134
|
break;
|
|
140
135
|
case "httpRequest":
|
|
141
136
|
if (!data.url) {
|
|
142
137
|
issues.push({
|
|
143
|
-
id: `missing-url-${node.id}`,
|
|
144
138
|
type: "error",
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
139
|
+
nodeId: node.id,
|
|
140
|
+
field: "url",
|
|
141
|
+
message: "HTTP Request node requires a URL",
|
|
142
|
+
suggestion: "Enter a valid HTTP or HTTPS URL"
|
|
149
143
|
});
|
|
150
144
|
}
|
|
151
145
|
else if (!isUrlSafe(data.url)) {
|
|
152
146
|
issues.push({
|
|
153
|
-
id: `unsafe-url-${node.id}`,
|
|
154
147
|
type: "error",
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
148
|
+
nodeId: node.id,
|
|
149
|
+
field: "url",
|
|
150
|
+
message: "Unsafe URL - Points to private network or uses unsupported protocol",
|
|
151
|
+
suggestion: "Only public HTTP/HTTPS endpoints are allowed. Avoid localhost, private IPs, and metadata endpoints"
|
|
159
152
|
});
|
|
160
153
|
}
|
|
161
154
|
break;
|
|
162
155
|
case "prompt":
|
|
163
156
|
if (!data.content) {
|
|
164
157
|
issues.push({
|
|
165
|
-
id: `missing-prompt-${node.id}`,
|
|
166
158
|
type: "warning",
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
159
|
+
nodeId: node.id,
|
|
160
|
+
field: "content",
|
|
161
|
+
message: "Prompt node has no content",
|
|
162
|
+
suggestion: "Add prompt text or template"
|
|
171
163
|
});
|
|
172
164
|
}
|
|
173
165
|
break;
|
|
174
166
|
case "conditional":
|
|
175
167
|
if (!data.condition) {
|
|
176
168
|
issues.push({
|
|
177
|
-
id: `missing-condition-${node.id}`,
|
|
178
169
|
type: "error",
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
170
|
+
nodeId: node.id,
|
|
171
|
+
field: "condition",
|
|
172
|
+
message: "Conditional node requires a condition expression",
|
|
173
|
+
suggestion: "Add a JavaScript expression that returns true or false"
|
|
183
174
|
});
|
|
184
175
|
}
|
|
185
176
|
break;
|
|
@@ -188,13 +179,13 @@ export function validateWorkflow(nodes, edges) {
|
|
|
188
179
|
const targetNodes = new Set(edges.map((e) => e.target));
|
|
189
180
|
const unusedOutputs = nodes.filter((node) => !targetNodes.has(node.id) && node.type !== "end" && nodes.length > 1);
|
|
190
181
|
if (unusedOutputs.length > 0) {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
182
|
+
unusedOutputs.forEach((node) => {
|
|
183
|
+
issues.push({
|
|
184
|
+
type: "info",
|
|
185
|
+
nodeId: node.id,
|
|
186
|
+
message: "Node output not connected - Result will not be used",
|
|
187
|
+
suggestion: "Connect to another node or add an End node"
|
|
188
|
+
});
|
|
198
189
|
});
|
|
199
190
|
}
|
|
200
191
|
const chainLengths = new Map();
|
|
@@ -218,13 +209,13 @@ export function validateWorkflow(nodes, edges) {
|
|
|
218
209
|
return length > 10;
|
|
219
210
|
});
|
|
220
211
|
if (longChains.length > 0) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
212
|
+
longChains.forEach((node) => {
|
|
213
|
+
issues.push({
|
|
214
|
+
type: "info",
|
|
215
|
+
nodeId: node.id,
|
|
216
|
+
message: "Long execution chain detected (>10 nodes deep)",
|
|
217
|
+
suggestion: "Consider breaking into smaller workflows or adding checkpoints for better debugging"
|
|
218
|
+
});
|
|
228
219
|
});
|
|
229
220
|
}
|
|
230
221
|
return issues;
|
|
@@ -245,12 +236,10 @@ export function validateApiKeys(apiKeys, nodes) {
|
|
|
245
236
|
requiredProviders.forEach((provider) => {
|
|
246
237
|
if (!apiKeys[provider] || apiKeys[provider].trim() === "") {
|
|
247
238
|
issues.push({
|
|
248
|
-
id: `missing-api-key-${provider}`,
|
|
249
239
|
type: "error",
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
fixable: true,
|
|
240
|
+
message: `Missing ${provider.charAt(0).toUpperCase() + provider.slice(1)} API Key - Workflow uses ${provider} models but no key is configured`,
|
|
241
|
+
field: provider,
|
|
242
|
+
suggestion: "Click API Keys to add your credentials"
|
|
254
243
|
});
|
|
255
244
|
}
|
|
256
245
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/lib/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED