@d34dman/flowdrop 0.0.1
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 +293 -0
- package/dist/adapters/WorkflowAdapter.d.ts +166 -0
- package/dist/adapters/WorkflowAdapter.js +337 -0
- package/dist/api/client.d.ts +79 -0
- package/dist/api/client.js +208 -0
- package/dist/app.css +0 -0
- package/dist/clients/ApiClient.d.ts +203 -0
- package/dist/clients/ApiClient.js +212 -0
- package/dist/components/App.svelte +237 -0
- package/dist/components/App.svelte.d.ts +3 -0
- package/dist/components/CanvasBanner.svelte +51 -0
- package/dist/components/CanvasBanner.svelte.d.ts +22 -0
- package/dist/components/LoadingSpinner.svelte +36 -0
- package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
- package/dist/components/Node.svelte +38 -0
- package/dist/components/Node.svelte.d.ts +4 -0
- package/dist/components/NodeSidebar.svelte +500 -0
- package/dist/components/NodeSidebar.svelte.d.ts +9 -0
- package/dist/components/WorkflowEditor.svelte +542 -0
- package/dist/components/WorkflowEditor.svelte.d.ts +10 -0
- package/dist/components/WorkflowNode.svelte +558 -0
- package/dist/components/WorkflowNode.svelte.d.ts +11 -0
- package/dist/data/samples.d.ts +17 -0
- package/dist/data/samples.js +1193 -0
- package/dist/examples/adapter-usage.d.ts +66 -0
- package/dist/examples/adapter-usage.js +138 -0
- package/dist/examples/api-client-usage.d.ts +31 -0
- package/dist/examples/api-client-usage.js +241 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.js +27 -0
- package/dist/services/api.d.ts +110 -0
- package/dist/services/api.js +149 -0
- package/dist/services/workflowStorage.d.ts +37 -0
- package/dist/services/workflowStorage.js +116 -0
- package/dist/styles/base.css +858 -0
- package/dist/svelte-app.d.ts +17 -0
- package/dist/svelte-app.js +30 -0
- package/dist/types/index.d.ts +179 -0
- package/dist/types/index.js +4 -0
- package/dist/utils/colors.d.ts +121 -0
- package/dist/utils/colors.js +240 -0
- package/dist/utils/connections.d.ts +47 -0
- package/dist/utils/connections.js +240 -0
- package/dist/utils/icons.d.ts +102 -0
- package/dist/utils/icons.js +149 -0
- package/package.json +99 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Using WorkflowAdapter for workflow management
|
|
3
|
+
* This demonstrates how systems can work with workflows without knowing SvelteFlow internals
|
|
4
|
+
*/
|
|
5
|
+
import { type StandardWorkflow } from "../adapters/WorkflowAdapter.js";
|
|
6
|
+
declare function createSimpleWorkflow(): StandardWorkflow;
|
|
7
|
+
declare function analyzeWorkflow(workflow: StandardWorkflow): {
|
|
8
|
+
stats: {
|
|
9
|
+
totalNodes: number;
|
|
10
|
+
totalEdges: number;
|
|
11
|
+
nodeTypeCounts: {
|
|
12
|
+
[k: string]: number;
|
|
13
|
+
};
|
|
14
|
+
lastModified: string;
|
|
15
|
+
};
|
|
16
|
+
validation: import("../adapters/WorkflowAdapter.js").WorkflowValidationResult;
|
|
17
|
+
complexity: number;
|
|
18
|
+
};
|
|
19
|
+
declare function calculateComplexity(workflow: StandardWorkflow): number;
|
|
20
|
+
declare function optimizeWorkflow(workflow: StandardWorkflow): StandardWorkflow;
|
|
21
|
+
declare function exportWorkflow(workflow: StandardWorkflow): string;
|
|
22
|
+
declare function importWorkflow(json: string): StandardWorkflow;
|
|
23
|
+
declare function getWorkflowStructure(workflow: StandardWorkflow): {
|
|
24
|
+
nodes: {
|
|
25
|
+
id: string;
|
|
26
|
+
type: string;
|
|
27
|
+
position: {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
};
|
|
31
|
+
config: Record<string, unknown>;
|
|
32
|
+
}[];
|
|
33
|
+
edges: {
|
|
34
|
+
source: string;
|
|
35
|
+
target: string;
|
|
36
|
+
sourceHandle: string;
|
|
37
|
+
targetHandle: string;
|
|
38
|
+
}[];
|
|
39
|
+
metadata: {
|
|
40
|
+
name: string;
|
|
41
|
+
description: string;
|
|
42
|
+
version: string;
|
|
43
|
+
lastModified: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
declare function getAvailableNodeTypes(): {
|
|
47
|
+
id: string;
|
|
48
|
+
name: string;
|
|
49
|
+
category: import("../index.js").NodeCategory;
|
|
50
|
+
description: string;
|
|
51
|
+
inputs: {
|
|
52
|
+
name: string;
|
|
53
|
+
type: import("../index.js").NodeDataType;
|
|
54
|
+
required: boolean;
|
|
55
|
+
}[];
|
|
56
|
+
outputs: {
|
|
57
|
+
name: string;
|
|
58
|
+
type: import("../index.js").NodeDataType;
|
|
59
|
+
}[];
|
|
60
|
+
}[];
|
|
61
|
+
declare function validateGeneratedWorkflow(workflowJson: string): {
|
|
62
|
+
valid: boolean;
|
|
63
|
+
errors: string[];
|
|
64
|
+
suggestions: string[];
|
|
65
|
+
};
|
|
66
|
+
export { createSimpleWorkflow, analyzeWorkflow, calculateComplexity, optimizeWorkflow, exportWorkflow, importWorkflow, getWorkflowStructure, getAvailableNodeTypes, validateGeneratedWorkflow };
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Using WorkflowAdapter for workflow management
|
|
3
|
+
* This demonstrates how systems can work with workflows without knowing SvelteFlow internals
|
|
4
|
+
*/
|
|
5
|
+
import { WorkflowAdapter } from "../adapters/WorkflowAdapter.js";
|
|
6
|
+
import { sampleNodes } from "../data/samples.js";
|
|
7
|
+
// Initialize the adapter with available node types
|
|
8
|
+
const adapter = new WorkflowAdapter(sampleNodes);
|
|
9
|
+
// Example 1: Create a simple workflow programmatically
|
|
10
|
+
function createSimpleWorkflow() {
|
|
11
|
+
const workflow = adapter.createWorkflow("Chat Workflow", "A simple chat workflow");
|
|
12
|
+
// Add nodes
|
|
13
|
+
const inputNode = adapter.addNode(workflow, "text-input", { x: 100, y: 100 }, {
|
|
14
|
+
placeholder: "Enter your message"
|
|
15
|
+
});
|
|
16
|
+
const modelNode = adapter.addNode(workflow, "openai", { x: 300, y: 100 }, {
|
|
17
|
+
model: "gpt-4",
|
|
18
|
+
temperature: 0.7
|
|
19
|
+
});
|
|
20
|
+
const outputNode = adapter.addNode(workflow, "text-output", { x: 500, y: 100 });
|
|
21
|
+
// Connect nodes
|
|
22
|
+
adapter.addEdge(workflow, inputNode.id, modelNode.id, "text", "prompt");
|
|
23
|
+
adapter.addEdge(workflow, modelNode.id, outputNode.id, "text", "text");
|
|
24
|
+
return workflow;
|
|
25
|
+
}
|
|
26
|
+
// Example 2: Analyze a workflow structure
|
|
27
|
+
function analyzeWorkflow(workflow) {
|
|
28
|
+
const stats = adapter.getWorkflowStats(workflow);
|
|
29
|
+
const validation = adapter.validateWorkflow(workflow);
|
|
30
|
+
console.log("Workflow Analysis:");
|
|
31
|
+
console.log(`- Total nodes: ${stats.totalNodes}`);
|
|
32
|
+
console.log(`- Total edges: ${stats.totalEdges}`);
|
|
33
|
+
console.log(`- Node types:`, stats.nodeTypeCounts);
|
|
34
|
+
console.log(`- Valid: ${validation.valid}`);
|
|
35
|
+
if (validation.errors.length > 0) {
|
|
36
|
+
console.log("Errors:", validation.errors);
|
|
37
|
+
}
|
|
38
|
+
if (validation.warnings.length > 0) {
|
|
39
|
+
console.log("Warnings:", validation.warnings);
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
stats,
|
|
43
|
+
validation,
|
|
44
|
+
complexity: calculateComplexity(workflow)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
// Example 3: Calculate workflow complexity
|
|
48
|
+
function calculateComplexity(workflow) {
|
|
49
|
+
const nodeCount = workflow.nodes.length;
|
|
50
|
+
const edgeCount = workflow.edges.length;
|
|
51
|
+
const avgConnections = edgeCount / Math.max(nodeCount, 1);
|
|
52
|
+
// Simple complexity score
|
|
53
|
+
return nodeCount * avgConnections;
|
|
54
|
+
}
|
|
55
|
+
// Example 4: Optimize a workflow
|
|
56
|
+
function optimizeWorkflow(workflow) {
|
|
57
|
+
const optimized = adapter.cloneWorkflow(workflow, `${workflow.name} (Optimized)`);
|
|
58
|
+
// Could make optimizations here
|
|
59
|
+
// For example, removing unused nodes, optimizing connections, etc.
|
|
60
|
+
return optimized;
|
|
61
|
+
}
|
|
62
|
+
// Example 5: Export/Import workflows
|
|
63
|
+
function exportWorkflow(workflow) {
|
|
64
|
+
return adapter.exportWorkflow(workflow);
|
|
65
|
+
}
|
|
66
|
+
function importWorkflow(json) {
|
|
67
|
+
return adapter.importWorkflow(json);
|
|
68
|
+
}
|
|
69
|
+
// Example 6: Get workflow structure for analysis
|
|
70
|
+
function getWorkflowStructure(workflow) {
|
|
71
|
+
return {
|
|
72
|
+
nodes: workflow.nodes.map(node => ({
|
|
73
|
+
id: node.id,
|
|
74
|
+
type: node.type,
|
|
75
|
+
position: node.position,
|
|
76
|
+
config: node.data.config
|
|
77
|
+
})),
|
|
78
|
+
edges: workflow.edges.map(edge => ({
|
|
79
|
+
source: edge.source,
|
|
80
|
+
target: edge.target,
|
|
81
|
+
sourceHandle: edge.sourceHandle,
|
|
82
|
+
targetHandle: edge.targetHandle
|
|
83
|
+
})),
|
|
84
|
+
metadata: {
|
|
85
|
+
name: workflow.name,
|
|
86
|
+
description: workflow.description,
|
|
87
|
+
version: workflow.metadata?.version,
|
|
88
|
+
lastModified: workflow.metadata?.updatedAt
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// Example 7: Get available node types
|
|
93
|
+
function getAvailableNodeTypes() {
|
|
94
|
+
return sampleNodes.map(node => ({
|
|
95
|
+
id: node.id,
|
|
96
|
+
name: node.name,
|
|
97
|
+
category: node.category,
|
|
98
|
+
description: node.description,
|
|
99
|
+
inputs: node.inputs.map(input => ({
|
|
100
|
+
name: input.name,
|
|
101
|
+
type: input.dataType,
|
|
102
|
+
required: input.required
|
|
103
|
+
})),
|
|
104
|
+
outputs: node.outputs.map(output => ({
|
|
105
|
+
name: output.name,
|
|
106
|
+
type: output.dataType
|
|
107
|
+
}))
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
// Example 8: Validate generated workflow
|
|
111
|
+
function validateGeneratedWorkflow(workflowJson) {
|
|
112
|
+
try {
|
|
113
|
+
const workflow = adapter.importWorkflow(workflowJson);
|
|
114
|
+
const validation = adapter.validateWorkflow(workflow);
|
|
115
|
+
const suggestions = [];
|
|
116
|
+
// Provide suggestions based on validation results
|
|
117
|
+
if (workflow.nodes.length === 0) {
|
|
118
|
+
suggestions.push("Consider adding input and output nodes");
|
|
119
|
+
}
|
|
120
|
+
if (workflow.edges.length === 0) {
|
|
121
|
+
suggestions.push("Connect nodes to create a data flow");
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
valid: validation.valid,
|
|
125
|
+
errors: validation.errors,
|
|
126
|
+
suggestions
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
return {
|
|
131
|
+
valid: false,
|
|
132
|
+
errors: [error instanceof Error ? error.message : "Unknown error"],
|
|
133
|
+
suggestions: ["Check the JSON format and required fields"]
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// Export all examples for use
|
|
138
|
+
export { createSimpleWorkflow, analyzeWorkflow, calculateComplexity, optimizeWorkflow, exportWorkflow, importWorkflow, getWorkflowStructure, getAvailableNodeTypes, validateGeneratedWorkflow };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Using FlowDrop API Client
|
|
3
|
+
* This demonstrates how to integrate with FlowDrop API from backend applications
|
|
4
|
+
*/
|
|
5
|
+
import type { Workflow } from "../types/index.js";
|
|
6
|
+
declare function checkApiHealth(): Promise<{
|
|
7
|
+
status: string;
|
|
8
|
+
timestamp: string;
|
|
9
|
+
version: string;
|
|
10
|
+
}>;
|
|
11
|
+
declare function getNodeTypes(): Promise<import("../types/index.js").NodesResponse>;
|
|
12
|
+
declare function manageWorkflows(): Promise<import("../types/index.js").WorkflowResponse>;
|
|
13
|
+
declare function executeWorkflow(workflowId: string): Promise<import("../clients/ApiClient.js").ExecutionStatusResponse>;
|
|
14
|
+
declare function importExportWorkflow(workflowId: string): Promise<import("../types/index.js").WorkflowResponse>;
|
|
15
|
+
declare function validateWorkflow(workflow: Workflow): Promise<import("../clients/ApiClient.js").ValidationResponse>;
|
|
16
|
+
declare function handleApiErrors(): Promise<void>;
|
|
17
|
+
declare function batchOperations(): Promise<PromiseSettledResult<{
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
valid: boolean;
|
|
21
|
+
errors: number;
|
|
22
|
+
error?: undefined;
|
|
23
|
+
} | {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
valid: boolean;
|
|
27
|
+
error: string;
|
|
28
|
+
errors?: undefined;
|
|
29
|
+
}>[]>;
|
|
30
|
+
declare function monitorExecutions(workflowId: string): Promise<void>;
|
|
31
|
+
export { checkApiHealth, getNodeTypes, manageWorkflows, executeWorkflow, importExportWorkflow, validateWorkflow, handleApiErrors, batchOperations, monitorExecutions };
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example: Using FlowDrop API Client
|
|
3
|
+
* This demonstrates how to integrate with FlowDrop API from backend applications
|
|
4
|
+
*/
|
|
5
|
+
import { ApiClient } from "../clients/ApiClient.js";
|
|
6
|
+
// Initialize the API client
|
|
7
|
+
const apiClient = new ApiClient({
|
|
8
|
+
baseUrl: "https://api.flowdrop.dev/v1",
|
|
9
|
+
apiKey: "your-api-key-here",
|
|
10
|
+
timeout: 30000
|
|
11
|
+
});
|
|
12
|
+
// Example 1: Health check
|
|
13
|
+
async function checkApiHealth() {
|
|
14
|
+
try {
|
|
15
|
+
const health = await apiClient.healthCheck();
|
|
16
|
+
console.log("API Status:", health.status);
|
|
17
|
+
console.log("API Version:", health.version);
|
|
18
|
+
return health;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.error("API Health Check Failed:", error);
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Example 2: Get available node types
|
|
26
|
+
async function getNodeTypes() {
|
|
27
|
+
try {
|
|
28
|
+
// Get all node types
|
|
29
|
+
const allNodes = await apiClient.getNodeTypes();
|
|
30
|
+
console.log(`Found ${allNodes.data?.length || 0} node types`);
|
|
31
|
+
// Get node types by category
|
|
32
|
+
const modelNodes = await apiClient.getNodeTypesByCategory("models");
|
|
33
|
+
console.log(`Found ${modelNodes.data?.length || 0} model nodes`);
|
|
34
|
+
// Search for specific nodes
|
|
35
|
+
const searchResults = await apiClient.getNodeTypes({ search: "openai" });
|
|
36
|
+
console.log(`Found ${searchResults.data?.length || 0} OpenAI-related nodes`);
|
|
37
|
+
return allNodes;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error("Failed to get node types:", error);
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Example 3: Create and manage workflows
|
|
45
|
+
async function manageWorkflows() {
|
|
46
|
+
try {
|
|
47
|
+
// Create a new workflow
|
|
48
|
+
const createRequest = {
|
|
49
|
+
name: "Chat Workflow",
|
|
50
|
+
description: "A simple chat workflow created via API",
|
|
51
|
+
tags: ["chat", "demo"]
|
|
52
|
+
};
|
|
53
|
+
const newWorkflow = await apiClient.createWorkflow(createRequest);
|
|
54
|
+
console.log("Created workflow:", newWorkflow.data?.id);
|
|
55
|
+
// Get all workflows
|
|
56
|
+
const workflows = await apiClient.getWorkflows({
|
|
57
|
+
limit: 10,
|
|
58
|
+
sort: "created_at",
|
|
59
|
+
order: "desc"
|
|
60
|
+
});
|
|
61
|
+
console.log(`Found ${workflows.data?.length || 0} workflows`);
|
|
62
|
+
// Get workflows by tag
|
|
63
|
+
const chatWorkflows = await apiClient.getWorkflowsByTag("chat");
|
|
64
|
+
console.log(`Found ${chatWorkflows.data?.length || 0} chat workflows`);
|
|
65
|
+
return newWorkflow;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
console.error("Failed to manage workflows:", error);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Example 4: Execute a workflow
|
|
73
|
+
async function executeWorkflow(workflowId) {
|
|
74
|
+
try {
|
|
75
|
+
// Start execution
|
|
76
|
+
const execution = await apiClient.executeWorkflow(workflowId, {
|
|
77
|
+
inputs: {
|
|
78
|
+
message: "Hello, how are you?",
|
|
79
|
+
temperature: 0.7
|
|
80
|
+
},
|
|
81
|
+
options: {
|
|
82
|
+
timeout: 60,
|
|
83
|
+
maxSteps: 100
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
console.log("Execution started:", execution.data?.executionId);
|
|
87
|
+
// Wait for completion
|
|
88
|
+
const result = await apiClient.waitForExecution(execution.data.executionId);
|
|
89
|
+
if (result.data?.status === "completed") {
|
|
90
|
+
console.log("Execution completed successfully");
|
|
91
|
+
console.log("Result:", result.data?.result);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.log("Execution failed:", result.data?.error);
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error("Failed to execute workflow:", error);
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Example 5: Import/Export workflows
|
|
104
|
+
async function importExportWorkflow(workflowId) {
|
|
105
|
+
try {
|
|
106
|
+
// Export workflow
|
|
107
|
+
const exportedWorkflow = await apiClient.exportWorkflow(workflowId, "json");
|
|
108
|
+
console.log("Exported workflow:", exportedWorkflow.name);
|
|
109
|
+
// Modify the exported workflow
|
|
110
|
+
const modifiedWorkflow = {
|
|
111
|
+
...exportedWorkflow,
|
|
112
|
+
id: "", // Will be generated by server
|
|
113
|
+
name: `${exportedWorkflow.name} (Imported)`,
|
|
114
|
+
metadata: {
|
|
115
|
+
...exportedWorkflow.metadata,
|
|
116
|
+
createdAt: new Date().toISOString(),
|
|
117
|
+
updatedAt: new Date().toISOString()
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
// Import the modified workflow
|
|
121
|
+
const importedWorkflow = await apiClient.importWorkflow(modifiedWorkflow);
|
|
122
|
+
console.log("Imported workflow:", importedWorkflow.data?.id);
|
|
123
|
+
return importedWorkflow;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error("Failed to import/export workflow:", error);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Example 6: Validate workflows
|
|
131
|
+
async function validateWorkflow(workflow) {
|
|
132
|
+
try {
|
|
133
|
+
const validation = await apiClient.validateWorkflow(workflow);
|
|
134
|
+
if (validation.data?.valid) {
|
|
135
|
+
console.log("Workflow is valid");
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
console.log("Workflow validation failed:");
|
|
139
|
+
console.log("Errors:", validation.data?.errors);
|
|
140
|
+
console.log("Warnings:", validation.data?.warnings);
|
|
141
|
+
console.log("Suggestions:", validation.data?.suggestions);
|
|
142
|
+
}
|
|
143
|
+
return validation;
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error("Failed to validate workflow:", error);
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Example 7: Error handling
|
|
151
|
+
async function handleApiErrors() {
|
|
152
|
+
try {
|
|
153
|
+
// This will fail - non-existent workflow
|
|
154
|
+
await apiClient.getWorkflow("non-existent-id");
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
if (error instanceof Error) {
|
|
158
|
+
console.log("Error type:", error.constructor.name);
|
|
159
|
+
console.log("Error message:", error.message);
|
|
160
|
+
// Check if it's an API error
|
|
161
|
+
if ("status" in error) {
|
|
162
|
+
console.log("HTTP status:", error.status);
|
|
163
|
+
console.log("Error code:", error.code);
|
|
164
|
+
console.log("Error details:", error.details);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Example 8: Batch operations
|
|
170
|
+
async function batchOperations() {
|
|
171
|
+
try {
|
|
172
|
+
// Get all workflows
|
|
173
|
+
const workflows = await apiClient.getWorkflows({ limit: 100 });
|
|
174
|
+
// Process each workflow
|
|
175
|
+
const results = await Promise.allSettled(workflows.data?.map(async (workflow) => {
|
|
176
|
+
try {
|
|
177
|
+
// Validate each workflow
|
|
178
|
+
const validation = await apiClient.validateWorkflow(workflow);
|
|
179
|
+
return {
|
|
180
|
+
id: workflow.id,
|
|
181
|
+
name: workflow.name,
|
|
182
|
+
valid: validation.data?.valid,
|
|
183
|
+
errors: validation.data?.errors?.length || 0
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
id: workflow.id,
|
|
189
|
+
name: workflow.name,
|
|
190
|
+
valid: false,
|
|
191
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}) || []);
|
|
195
|
+
console.log("Batch validation results:", results);
|
|
196
|
+
return results;
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
console.error("Failed to perform batch operations:", error);
|
|
200
|
+
throw error;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Example 9: Real-time monitoring
|
|
204
|
+
async function monitorExecutions(workflowId) {
|
|
205
|
+
try {
|
|
206
|
+
// Start execution
|
|
207
|
+
const execution = await apiClient.executeWorkflow(workflowId, {
|
|
208
|
+
inputs: { message: "Test message" }
|
|
209
|
+
});
|
|
210
|
+
const executionId = execution.data.executionId;
|
|
211
|
+
console.log("Monitoring execution:", executionId);
|
|
212
|
+
// Poll for status updates
|
|
213
|
+
const interval = setInterval(async () => {
|
|
214
|
+
try {
|
|
215
|
+
const status = await apiClient.getExecutionStatus(executionId);
|
|
216
|
+
console.log(`Status: ${status.data?.status}`);
|
|
217
|
+
if (status.data?.status === "completed" ||
|
|
218
|
+
status.data?.status === "failed" ||
|
|
219
|
+
status.data?.status === "cancelled") {
|
|
220
|
+
clearInterval(interval);
|
|
221
|
+
console.log("Execution finished:", status.data?.status);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error("Failed to get execution status:", error);
|
|
226
|
+
clearInterval(interval);
|
|
227
|
+
}
|
|
228
|
+
}, 1000);
|
|
229
|
+
// Timeout after 5 minutes
|
|
230
|
+
setTimeout(() => {
|
|
231
|
+
clearInterval(interval);
|
|
232
|
+
console.log("Monitoring timeout");
|
|
233
|
+
}, 5 * 60 * 1000);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
console.error("Failed to monitor execution:", error);
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Export all examples
|
|
241
|
+
export { checkApiHealth, getNodeTypes, manageWorkflows, executeWorkflow, importExportWorkflow, validateWorkflow, handleApiErrors, batchOperations, monitorExecutions };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlowDrop - Workflow Library
|
|
3
|
+
* A Svelte Flow-based library for building workflows
|
|
4
|
+
*/
|
|
5
|
+
import "../app.css";
|
|
6
|
+
export type { NodeCategory, NodeDataType, NodePort, NodeMetadata, NodeConfig, WorkflowNode, WorkflowEdge, Workflow, ApiResponse, NodesResponse, WorkflowResponse, WorkflowsResponse, ExecutionStatus, ExecutionResult, FlowDropConfig, WorkflowEvents } from "./types/index.js";
|
|
7
|
+
export { FlowDropApiClient } from "./api/client.js";
|
|
8
|
+
export { default as WorkflowEditor } from "./components/WorkflowEditor.svelte";
|
|
9
|
+
export { default as NodeSidebar } from "./components/NodeSidebar.svelte";
|
|
10
|
+
export { default as WorkflowNodeComponent } from "./components/WorkflowNode.svelte";
|
|
11
|
+
export { default as CanvasBanner } from "./components/CanvasBanner.svelte";
|
|
12
|
+
export { sampleNodes, sampleWorkflow } from "./data/samples.js";
|
|
13
|
+
export * from "./utils/icons.js";
|
|
14
|
+
export * from "./utils/colors.js";
|
|
15
|
+
export * from "./utils/connections.js";
|
|
16
|
+
export * from "./services/api.js";
|
|
17
|
+
export * from "./adapters/WorkflowAdapter.js";
|
|
18
|
+
export * from "./clients/ApiClient.js";
|
|
19
|
+
export { mountWorkflowEditor, unmountWorkflowEditor } from "./svelte-app.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FlowDrop - Workflow Library
|
|
3
|
+
* A Svelte Flow-based library for building workflows
|
|
4
|
+
*/
|
|
5
|
+
// Import CSS to ensure styles are included in the library build
|
|
6
|
+
import "../app.css";
|
|
7
|
+
// Export API client
|
|
8
|
+
export { FlowDropApiClient } from "./api/client.js";
|
|
9
|
+
// Export components
|
|
10
|
+
export { default as WorkflowEditor } from "./components/WorkflowEditor.svelte";
|
|
11
|
+
export { default as NodeSidebar } from "./components/NodeSidebar.svelte";
|
|
12
|
+
export { default as WorkflowNodeComponent } from "./components/WorkflowNode.svelte";
|
|
13
|
+
export { default as CanvasBanner } from "./components/CanvasBanner.svelte";
|
|
14
|
+
// Export sample data for development
|
|
15
|
+
export { sampleNodes, sampleWorkflow } from "./data/samples.js";
|
|
16
|
+
// Export utilities
|
|
17
|
+
export * from "./utils/icons.js";
|
|
18
|
+
export * from "./utils/colors.js";
|
|
19
|
+
export * from "./utils/connections.js";
|
|
20
|
+
// Export services
|
|
21
|
+
export * from "./services/api.js";
|
|
22
|
+
// Export adapters
|
|
23
|
+
export * from "./adapters/WorkflowAdapter.js";
|
|
24
|
+
// Export API client
|
|
25
|
+
export * from "./clients/ApiClient.js";
|
|
26
|
+
// Export Svelte app wrapper for Drupal integration
|
|
27
|
+
export { mountWorkflowEditor, unmountWorkflowEditor } from "./svelte-app.js";
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side API service for FlowDrop
|
|
3
|
+
* Provides methods to interact with the backend APIs
|
|
4
|
+
*/
|
|
5
|
+
import type { NodeMetadata, Workflow } from "../types/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Set the API base URL at runtime
|
|
8
|
+
*/
|
|
9
|
+
export declare function setApiBaseUrl(url: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* Node API methods
|
|
12
|
+
*/
|
|
13
|
+
export declare const nodeApi: {
|
|
14
|
+
/**
|
|
15
|
+
* Get all node types with optional filtering
|
|
16
|
+
*/
|
|
17
|
+
getNodes(options?: {
|
|
18
|
+
category?: string;
|
|
19
|
+
search?: string;
|
|
20
|
+
limit?: number;
|
|
21
|
+
offset?: number;
|
|
22
|
+
}): Promise<NodeMetadata[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Get a specific node type by ID
|
|
25
|
+
*/
|
|
26
|
+
getNode(id: string): Promise<NodeMetadata>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Workflow API methods
|
|
30
|
+
*/
|
|
31
|
+
export declare const workflowApi: {
|
|
32
|
+
/**
|
|
33
|
+
* Get all workflows with optional filtering
|
|
34
|
+
*/
|
|
35
|
+
getWorkflows(options?: {
|
|
36
|
+
search?: string;
|
|
37
|
+
limit?: number;
|
|
38
|
+
offset?: number;
|
|
39
|
+
}): Promise<Workflow[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Get a specific workflow by ID
|
|
42
|
+
*/
|
|
43
|
+
getWorkflow(id: string): Promise<Workflow>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a new workflow
|
|
46
|
+
*/
|
|
47
|
+
createWorkflow(workflow: Omit<Workflow, "id">): Promise<Workflow>;
|
|
48
|
+
/**
|
|
49
|
+
* Update an existing workflow
|
|
50
|
+
*/
|
|
51
|
+
updateWorkflow(id: string, workflow: Partial<Workflow>): Promise<Workflow>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete a workflow
|
|
54
|
+
*/
|
|
55
|
+
deleteWorkflow(id: string): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* Save workflow (create or update)
|
|
58
|
+
*/
|
|
59
|
+
saveWorkflow(workflow: Workflow): Promise<Workflow>;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Export the API service
|
|
63
|
+
*/
|
|
64
|
+
export declare const api: {
|
|
65
|
+
nodes: {
|
|
66
|
+
/**
|
|
67
|
+
* Get all node types with optional filtering
|
|
68
|
+
*/
|
|
69
|
+
getNodes(options?: {
|
|
70
|
+
category?: string;
|
|
71
|
+
search?: string;
|
|
72
|
+
limit?: number;
|
|
73
|
+
offset?: number;
|
|
74
|
+
}): Promise<NodeMetadata[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Get a specific node type by ID
|
|
77
|
+
*/
|
|
78
|
+
getNode(id: string): Promise<NodeMetadata>;
|
|
79
|
+
};
|
|
80
|
+
workflows: {
|
|
81
|
+
/**
|
|
82
|
+
* Get all workflows with optional filtering
|
|
83
|
+
*/
|
|
84
|
+
getWorkflows(options?: {
|
|
85
|
+
search?: string;
|
|
86
|
+
limit?: number;
|
|
87
|
+
offset?: number;
|
|
88
|
+
}): Promise<Workflow[]>;
|
|
89
|
+
/**
|
|
90
|
+
* Get a specific workflow by ID
|
|
91
|
+
*/
|
|
92
|
+
getWorkflow(id: string): Promise<Workflow>;
|
|
93
|
+
/**
|
|
94
|
+
* Create a new workflow
|
|
95
|
+
*/
|
|
96
|
+
createWorkflow(workflow: Omit<Workflow, "id">): Promise<Workflow>;
|
|
97
|
+
/**
|
|
98
|
+
* Update an existing workflow
|
|
99
|
+
*/
|
|
100
|
+
updateWorkflow(id: string, workflow: Partial<Workflow>): Promise<Workflow>;
|
|
101
|
+
/**
|
|
102
|
+
* Delete a workflow
|
|
103
|
+
*/
|
|
104
|
+
deleteWorkflow(id: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Save workflow (create or update)
|
|
107
|
+
*/
|
|
108
|
+
saveWorkflow(workflow: Workflow): Promise<Workflow>;
|
|
109
|
+
};
|
|
110
|
+
};
|