@foresthubai/workflow-core 0.3.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/LICENSE +202 -0
- package/NOTICE +14 -0
- package/README.md +63 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/workflow.d.ts +607 -0
- package/dist/api/workflow.d.ts.map +1 -0
- package/dist/api/workflow.js +6 -0
- package/dist/api/workflow.js.map +1 -0
- package/dist/channel/Channel.d.ts +10 -0
- package/dist/channel/Channel.d.ts.map +1 -0
- package/dist/channel/Channel.js +2 -0
- package/dist/channel/Channel.js.map +1 -0
- package/dist/channel/ChannelDefinition.d.ts +27 -0
- package/dist/channel/ChannelDefinition.d.ts.map +1 -0
- package/dist/channel/ChannelDefinition.js +50 -0
- package/dist/channel/ChannelDefinition.js.map +1 -0
- package/dist/channel/index.d.ts +7 -0
- package/dist/channel/index.d.ts.map +1 -0
- package/dist/channel/index.js +4 -0
- package/dist/channel/index.js.map +1 -0
- package/dist/channel/serialization.d.ts +17 -0
- package/dist/channel/serialization.d.ts.map +1 -0
- package/dist/channel/serialization.js +63 -0
- package/dist/channel/serialization.js.map +1 -0
- package/dist/deploy/index.d.ts +2 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +2 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/deploy/requirements.d.ts +17 -0
- package/dist/deploy/requirements.d.ts.map +1 -0
- package/dist/deploy/requirements.js +41 -0
- package/dist/deploy/requirements.js.map +1 -0
- package/dist/diagnostics/__fixtures__/diagnosticFixtures.d.ts +28 -0
- package/dist/diagnostics/__fixtures__/diagnosticFixtures.d.ts.map +1 -0
- package/dist/diagnostics/__fixtures__/diagnosticFixtures.js +125 -0
- package/dist/diagnostics/__fixtures__/diagnosticFixtures.js.map +1 -0
- package/dist/diagnostics/diagnostics.d.ts +128 -0
- package/dist/diagnostics/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics/diagnostics.js +783 -0
- package/dist/diagnostics/diagnostics.js.map +1 -0
- package/dist/diagnostics/index.d.ts +3 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +2 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/edge/Edge.d.ts +22 -0
- package/dist/edge/Edge.d.ts.map +1 -0
- package/dist/edge/Edge.js +2 -0
- package/dist/edge/Edge.js.map +1 -0
- package/dist/edge/EdgeDefinition.d.ts +10 -0
- package/dist/edge/EdgeDefinition.d.ts.map +1 -0
- package/dist/edge/EdgeDefinition.js +36 -0
- package/dist/edge/EdgeDefinition.js.map +1 -0
- package/dist/edge/EdgeType.d.ts +6 -0
- package/dist/edge/EdgeType.d.ts.map +1 -0
- package/dist/edge/EdgeType.js +7 -0
- package/dist/edge/EdgeType.js.map +1 -0
- package/dist/edge/index.d.ts +6 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +6 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/serialization.d.ts +18 -0
- package/dist/edge/serialization.d.ts.map +1 -0
- package/dist/edge/serialization.js +76 -0
- package/dist/edge/serialization.js.map +1 -0
- package/dist/expression/index.d.ts +5 -0
- package/dist/expression/index.d.ts.map +1 -0
- package/dist/expression/index.js +3 -0
- package/dist/expression/index.js.map +1 -0
- package/dist/expression/parser.d.ts +14 -0
- package/dist/expression/parser.d.ts.map +1 -0
- package/dist/expression/parser.js +309 -0
- package/dist/expression/parser.js.map +1 -0
- package/dist/expression/types.d.ts +11 -0
- package/dist/expression/types.d.ts.map +1 -0
- package/dist/expression/types.js +20 -0
- package/dist/expression/types.js.map +1 -0
- package/dist/function/FunctionDeclaration.d.ts +43 -0
- package/dist/function/FunctionDeclaration.d.ts.map +1 -0
- package/dist/function/FunctionDeclaration.js +17 -0
- package/dist/function/FunctionDeclaration.js.map +1 -0
- package/dist/function/index.d.ts +4 -0
- package/dist/function/index.d.ts.map +1 -0
- package/dist/function/index.js +3 -0
- package/dist/function/index.js.map +1 -0
- package/dist/function/serialization.d.ts +20 -0
- package/dist/function/serialization.d.ts.map +1 -0
- package/dist/function/serialization.js +26 -0
- package/dist/function/serialization.js.map +1 -0
- package/dist/id/index.d.ts +7 -0
- package/dist/id/index.d.ts.map +1 -0
- package/dist/id/index.js +9 -0
- package/dist/id/index.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/Memory.d.ts +12 -0
- package/dist/memory/Memory.d.ts.map +1 -0
- package/dist/memory/Memory.js +2 -0
- package/dist/memory/Memory.js.map +1 -0
- package/dist/memory/MemoryDefinition.d.ts +16 -0
- package/dist/memory/MemoryDefinition.d.ts.map +1 -0
- package/dist/memory/MemoryDefinition.js +2 -0
- package/dist/memory/MemoryDefinition.js.map +1 -0
- package/dist/memory/MemoryFileDefinition.d.ts +8 -0
- package/dist/memory/MemoryFileDefinition.d.ts.map +1 -0
- package/dist/memory/MemoryFileDefinition.js +36 -0
- package/dist/memory/MemoryFileDefinition.js.map +1 -0
- package/dist/memory/MemoryRegistry.d.ts +17 -0
- package/dist/memory/MemoryRegistry.d.ts.map +1 -0
- package/dist/memory/MemoryRegistry.js +29 -0
- package/dist/memory/MemoryRegistry.js.map +1 -0
- package/dist/memory/VectorDatabaseDefinition.d.ts +7 -0
- package/dist/memory/VectorDatabaseDefinition.d.ts.map +1 -0
- package/dist/memory/VectorDatabaseDefinition.js +20 -0
- package/dist/memory/VectorDatabaseDefinition.js.map +1 -0
- package/dist/memory/index.d.ts +9 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +6 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/serialization.d.ts +11 -0
- package/dist/memory/serialization.d.ts.map +1 -0
- package/dist/memory/serialization.js +44 -0
- package/dist/memory/serialization.js.map +1 -0
- package/dist/migration/index.d.ts +5 -0
- package/dist/migration/index.d.ts.map +1 -0
- package/dist/migration/index.js +4 -0
- package/dist/migration/index.js.map +1 -0
- package/dist/migration/migrate.d.ts +11 -0
- package/dist/migration/migrate.d.ts.map +1 -0
- package/dist/migration/migrate.js +52 -0
- package/dist/migration/migrate.js.map +1 -0
- package/dist/migration/migrations.d.ts +22 -0
- package/dist/migration/migrations.d.ts.map +1 -0
- package/dist/migration/migrations.js +10 -0
- package/dist/migration/migrations.js.map +1 -0
- package/dist/migration/version.d.ts +9 -0
- package/dist/migration/version.d.ts.map +1 -0
- package/dist/migration/version.js +9 -0
- package/dist/migration/version.js.map +1 -0
- package/dist/model/LLMModelDefinition.d.ts +7 -0
- package/dist/model/LLMModelDefinition.d.ts.map +1 -0
- package/dist/model/LLMModelDefinition.js +11 -0
- package/dist/model/LLMModelDefinition.js.map +1 -0
- package/dist/model/Model.d.ts +21 -0
- package/dist/model/Model.d.ts.map +1 -0
- package/dist/model/Model.js +15 -0
- package/dist/model/Model.js.map +1 -0
- package/dist/model/ModelDefinition.d.ts +15 -0
- package/dist/model/ModelDefinition.d.ts.map +1 -0
- package/dist/model/ModelDefinition.js +2 -0
- package/dist/model/ModelDefinition.js.map +1 -0
- package/dist/model/ModelRegistry.d.ts +17 -0
- package/dist/model/ModelRegistry.d.ts.map +1 -0
- package/dist/model/ModelRegistry.js +27 -0
- package/dist/model/ModelRegistry.js.map +1 -0
- package/dist/model/index.d.ts +8 -0
- package/dist/model/index.d.ts.map +1 -0
- package/dist/model/index.js +5 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model/serialization.d.ts +8 -0
- package/dist/model/serialization.d.ts.map +1 -0
- package/dist/model/serialization.js +25 -0
- package/dist/model/serialization.js.map +1 -0
- package/dist/node/AgentNode.d.ts +21 -0
- package/dist/node/AgentNode.d.ts.map +1 -0
- package/dist/node/AgentNode.js +60 -0
- package/dist/node/AgentNode.js.map +1 -0
- package/dist/node/DataNode.d.ts +14 -0
- package/dist/node/DataNode.d.ts.map +1 -0
- package/dist/node/DataNode.js +26 -0
- package/dist/node/DataNode.js.map +1 -0
- package/dist/node/FunctionNode.d.ts +24 -0
- package/dist/node/FunctionNode.d.ts.map +1 -0
- package/dist/node/FunctionNode.js +44 -0
- package/dist/node/FunctionNode.js.map +1 -0
- package/dist/node/InputNode.d.ts +46 -0
- package/dist/node/InputNode.d.ts.map +1 -0
- package/dist/node/InputNode.js +133 -0
- package/dist/node/InputNode.js.map +1 -0
- package/dist/node/LogicNode.d.ts +13 -0
- package/dist/node/LogicNode.d.ts.map +1 -0
- package/dist/node/LogicNode.js +19 -0
- package/dist/node/LogicNode.js.map +1 -0
- package/dist/node/MqttNode.d.ts +27 -0
- package/dist/node/MqttNode.d.ts.map +1 -0
- package/dist/node/MqttNode.js +96 -0
- package/dist/node/MqttNode.js.map +1 -0
- package/dist/node/Node.d.ts +49 -0
- package/dist/node/Node.d.ts.map +1 -0
- package/dist/node/Node.js +9 -0
- package/dist/node/Node.js.map +1 -0
- package/dist/node/NodeDefinition.d.ts +30 -0
- package/dist/node/NodeDefinition.d.ts.map +1 -0
- package/dist/node/NodeDefinition.js +2 -0
- package/dist/node/NodeDefinition.js.map +1 -0
- package/dist/node/NodeRegistry.d.ts +19 -0
- package/dist/node/NodeRegistry.d.ts.map +1 -0
- package/dist/node/NodeRegistry.js +65 -0
- package/dist/node/NodeRegistry.js.map +1 -0
- package/dist/node/OutputNode.d.ts +23 -0
- package/dist/node/OutputNode.d.ts.map +1 -0
- package/dist/node/OutputNode.js +62 -0
- package/dist/node/OutputNode.js.map +1 -0
- package/dist/node/ToolNode.d.ts +12 -0
- package/dist/node/ToolNode.d.ts.map +1 -0
- package/dist/node/ToolNode.js +18 -0
- package/dist/node/ToolNode.js.map +1 -0
- package/dist/node/TriggerNode.d.ts +67 -0
- package/dist/node/TriggerNode.d.ts.map +1 -0
- package/dist/node/TriggerNode.js +172 -0
- package/dist/node/TriggerNode.js.map +1 -0
- package/dist/node/constants.d.ts +16 -0
- package/dist/node/constants.d.ts.map +1 -0
- package/dist/node/constants.js +18 -0
- package/dist/node/constants.js.map +1 -0
- package/dist/node/index.d.ts +12 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +9 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/methods.d.ts +73 -0
- package/dist/node/methods.d.ts.map +1 -0
- package/dist/node/methods.js +261 -0
- package/dist/node/methods.js.map +1 -0
- package/dist/node/serialization.d.ts +25 -0
- package/dist/node/serialization.d.ts.map +1 -0
- package/dist/node/serialization.js +525 -0
- package/dist/node/serialization.js.map +1 -0
- package/dist/parameter/OutputParameter.d.ts +69 -0
- package/dist/parameter/OutputParameter.d.ts.map +1 -0
- package/dist/parameter/OutputParameter.js +6 -0
- package/dist/parameter/OutputParameter.js.map +1 -0
- package/dist/parameter/Parameter.d.ts +152 -0
- package/dist/parameter/Parameter.d.ts.map +1 -0
- package/dist/parameter/Parameter.js +86 -0
- package/dist/parameter/Parameter.js.map +1 -0
- package/dist/parameter/index.d.ts +5 -0
- package/dist/parameter/index.d.ts.map +1 -0
- package/dist/parameter/index.js +3 -0
- package/dist/parameter/index.js.map +1 -0
- package/dist/variable/Variable.d.ts +25 -0
- package/dist/variable/Variable.d.ts.map +1 -0
- package/dist/variable/Variable.js +2 -0
- package/dist/variable/Variable.js.map +1 -0
- package/dist/variable/index.d.ts +3 -0
- package/dist/variable/index.d.ts.map +1 -0
- package/dist/variable/index.js +5 -0
- package/dist/variable/index.js.map +1 -0
- package/dist/variable/operations.d.ts +37 -0
- package/dist/variable/operations.d.ts.map +1 -0
- package/dist/variable/operations.js +88 -0
- package/dist/variable/operations.js.map +1 -0
- package/dist/workflow/Workflow.d.ts +38 -0
- package/dist/workflow/Workflow.d.ts.map +1 -0
- package/dist/workflow/Workflow.js +8 -0
- package/dist/workflow/Workflow.js.map +1 -0
- package/dist/workflow/index.d.ts +4 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/serialization.d.ts +43 -0
- package/dist/workflow/serialization.d.ts.map +1 -0
- package/dist/workflow/serialization.js +215 -0
- package/dist/workflow/serialization.js.map +1 -0
- package/package.json +105 -0
- package/src/api/index.ts +11 -0
- package/src/api/workflow.ts +607 -0
- package/src/channel/Channel.ts +11 -0
- package/src/channel/ChannelDefinition.ts +76 -0
- package/src/channel/index.ts +6 -0
- package/src/channel/serialization.ts +68 -0
- package/src/deploy/index.ts +1 -0
- package/src/deploy/requirements.test.ts +61 -0
- package/src/deploy/requirements.ts +41 -0
- package/src/diagnostics/__fixtures__/diagnosticFixtures.ts +158 -0
- package/src/diagnostics/diagnostics.test.ts +878 -0
- package/src/diagnostics/diagnostics.ts +936 -0
- package/src/diagnostics/index.ts +11 -0
- package/src/edge/Edge.ts +23 -0
- package/src/edge/EdgeDefinition.ts +45 -0
- package/src/edge/EdgeType.ts +19 -0
- package/src/edge/index.ts +8 -0
- package/src/edge/serialization.ts +83 -0
- package/src/expression/index.ts +4 -0
- package/src/expression/parser.ts +362 -0
- package/src/expression/types.ts +30 -0
- package/src/function/FunctionDeclaration.ts +54 -0
- package/src/function/index.ts +3 -0
- package/src/function/serialization.ts +40 -0
- package/src/globals.d.ts +9 -0
- package/src/id/index.ts +8 -0
- package/src/index.ts +22 -0
- package/src/memory/Memory.ts +15 -0
- package/src/memory/MemoryDefinition.ts +16 -0
- package/src/memory/MemoryFileDefinition.ts +37 -0
- package/src/memory/MemoryRegistry.ts +35 -0
- package/src/memory/VectorDatabaseDefinition.ts +21 -0
- package/src/memory/index.ts +8 -0
- package/src/memory/serialization.ts +47 -0
- package/src/migration/index.ts +4 -0
- package/src/migration/migrate.test.ts +44 -0
- package/src/migration/migrate.ts +58 -0
- package/src/migration/migrations.ts +24 -0
- package/src/migration/version.ts +9 -0
- package/src/model/LLMModelDefinition.ts +12 -0
- package/src/model/Model.ts +39 -0
- package/src/model/ModelDefinition.ts +15 -0
- package/src/model/ModelRegistry.ts +33 -0
- package/src/model/index.ts +7 -0
- package/src/model/serialization.ts +30 -0
- package/src/node/AgentNode.ts +82 -0
- package/src/node/DataNode.ts +41 -0
- package/src/node/FunctionNode.ts +76 -0
- package/src/node/InputNode.ts +185 -0
- package/src/node/LogicNode.ts +33 -0
- package/src/node/MqttNode.ts +127 -0
- package/src/node/Node.ts +61 -0
- package/src/node/NodeDefinition.ts +37 -0
- package/src/node/NodeRegistry.ts +85 -0
- package/src/node/OutputNode.ts +87 -0
- package/src/node/ToolNode.ts +32 -0
- package/src/node/TriggerNode.ts +272 -0
- package/src/node/constants.ts +16 -0
- package/src/node/index.ts +26 -0
- package/src/node/methods.ts +278 -0
- package/src/node/serialization.ts +544 -0
- package/src/parameter/OutputParameter.ts +68 -0
- package/src/parameter/Parameter.ts +243 -0
- package/src/parameter/index.ts +33 -0
- package/src/variable/Variable.ts +10 -0
- package/src/variable/index.ts +16 -0
- package/src/variable/operations.ts +106 -0
- package/src/workflow/Workflow.ts +41 -0
- package/src/workflow/index.ts +3 -0
- package/src/workflow/serialization.test.ts +240 -0
- package/src/workflow/serialization.ts +242 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import jsep from "jsep";
|
|
2
|
+
/**
|
|
3
|
+
* Parse and validate an expression against C-style type rules.
|
|
4
|
+
* Replaces ${} placeholders with temporary identifiers, parses with jsep,
|
|
5
|
+
* infers types from the AST, and validates against the expected type.
|
|
6
|
+
*/
|
|
7
|
+
export function parseExpression(expr) {
|
|
8
|
+
// Handle early returns
|
|
9
|
+
if (!expr.expression.trim()) {
|
|
10
|
+
return { isValid: false, inferredType: null, errors: ["Expression is empty"] };
|
|
11
|
+
}
|
|
12
|
+
if (expr.variables.some((v) => v === null)) {
|
|
13
|
+
return { isValid: false, inferredType: null, errors: ["Expression contains stale variable references"] };
|
|
14
|
+
}
|
|
15
|
+
const errors = [];
|
|
16
|
+
// 1. Build type context from variables
|
|
17
|
+
const typeContext = new Map();
|
|
18
|
+
// Replace ${} placeholders with temp identifiers for jsep
|
|
19
|
+
let parsableExpr = expr.expression;
|
|
20
|
+
// Count placeholders in expression
|
|
21
|
+
const placeholderCount = (expr.expression.match(/\$\{\}/g) || []).length;
|
|
22
|
+
if (placeholderCount !== expr.variables.length) {
|
|
23
|
+
errors.push(`Placeholder count (${placeholderCount}) doesn't match reference count (${expr.variables.length})`);
|
|
24
|
+
return { isValid: false, inferredType: null, errors };
|
|
25
|
+
}
|
|
26
|
+
expr.variables.forEach((variable, i) => {
|
|
27
|
+
const placeholder = `__var${i}__`;
|
|
28
|
+
parsableExpr = parsableExpr.replace("${}", placeholder);
|
|
29
|
+
if (variable) {
|
|
30
|
+
typeContext.set(placeholder, variable.dataType);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Stale reference - variable was deleted
|
|
34
|
+
errors.push(`Referenced variable at position ${i + 1} not found`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
// If we have stale/null variables, don't proceed with parsing
|
|
38
|
+
if (errors.length > 0) {
|
|
39
|
+
return { isValid: false, inferredType: null, errors };
|
|
40
|
+
}
|
|
41
|
+
// 2. For string-type expressions, auto-wrap bare text as string literals
|
|
42
|
+
// so users don't need to type quotes. E.g. `hello __var0__` → `"hello " + __var0__`
|
|
43
|
+
if (expr.expectedType === "string") {
|
|
44
|
+
parsableExpr = wrapStringTemplate(parsableExpr);
|
|
45
|
+
}
|
|
46
|
+
// 3. Parse with jsep
|
|
47
|
+
let ast;
|
|
48
|
+
try {
|
|
49
|
+
ast = jsep(parsableExpr);
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
53
|
+
return { isValid: false, inferredType: null, errors: [`Parse error: ${message}`] };
|
|
54
|
+
}
|
|
55
|
+
// 4. Infer type by walking AST
|
|
56
|
+
const inferredType = inferType(ast, typeContext, errors);
|
|
57
|
+
// 5. Check against expected type
|
|
58
|
+
if (inferredType && expr.expectedType !== inferredType) {
|
|
59
|
+
// Allow implicit conversions (int → float, etc.)
|
|
60
|
+
if (!isCompatible(inferredType, expr.expectedType)) {
|
|
61
|
+
errors.push(`Type mismatch: expression evaluates to '${inferredType}', expected '${expr.expectedType}'`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
isValid: errors.length === 0 && inferredType !== null,
|
|
66
|
+
inferredType,
|
|
67
|
+
errors,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Recursively infer the type of an AST node
|
|
72
|
+
*/
|
|
73
|
+
function inferType(node, ctx, errors) {
|
|
74
|
+
switch (node.type) {
|
|
75
|
+
case "Literal":
|
|
76
|
+
return inferLiteralType(node);
|
|
77
|
+
case "Identifier": {
|
|
78
|
+
const name = node.name;
|
|
79
|
+
const type = ctx.get(name);
|
|
80
|
+
if (!type) {
|
|
81
|
+
// Check if it's a placeholder variable that's missing
|
|
82
|
+
if (name.startsWith("__var") && name.endsWith("__")) {
|
|
83
|
+
errors.push(`Missing type for variable reference`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
errors.push(`Unknown identifier: '${name}'`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return type ?? null;
|
|
90
|
+
}
|
|
91
|
+
case "BinaryExpression":
|
|
92
|
+
return inferBinaryType(node, ctx, errors);
|
|
93
|
+
case "UnaryExpression":
|
|
94
|
+
return inferUnaryType(node, ctx, errors);
|
|
95
|
+
case "ConditionalExpression": {
|
|
96
|
+
// Ternary: condition ? consequent : alternate
|
|
97
|
+
const cond = node;
|
|
98
|
+
const condType = inferType(cond.test, ctx, errors);
|
|
99
|
+
if (condType !== "bool") {
|
|
100
|
+
errors.push("Ternary condition must be boolean");
|
|
101
|
+
}
|
|
102
|
+
const consType = inferType(cond.consequent, ctx, errors);
|
|
103
|
+
const altType = inferType(cond.alternate, ctx, errors);
|
|
104
|
+
if (consType && altType && consType !== altType) {
|
|
105
|
+
// Allow numeric promotion
|
|
106
|
+
if (isNumeric(consType) && isNumeric(altType)) {
|
|
107
|
+
return "float";
|
|
108
|
+
}
|
|
109
|
+
errors.push(`Ternary branches must have same type (got '${consType}' and '${altType}')`);
|
|
110
|
+
}
|
|
111
|
+
return consType;
|
|
112
|
+
}
|
|
113
|
+
case "MemberExpression": {
|
|
114
|
+
// For now, we don't support member expressions in C code generation
|
|
115
|
+
errors.push("Member expressions (e.g., obj.property) are not supported");
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
case "CallExpression": {
|
|
119
|
+
return inferCallType(node, ctx, errors);
|
|
120
|
+
}
|
|
121
|
+
default:
|
|
122
|
+
errors.push(`Unsupported expression type: ${node.type}`);
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Infer the type of a literal value
|
|
128
|
+
*/
|
|
129
|
+
function inferLiteralType(node) {
|
|
130
|
+
const value = node.value;
|
|
131
|
+
if (typeof value === "boolean")
|
|
132
|
+
return "bool";
|
|
133
|
+
if (typeof value === "number") {
|
|
134
|
+
// Check if it's an integer or float
|
|
135
|
+
return Number.isInteger(value) ? "int" : "float";
|
|
136
|
+
}
|
|
137
|
+
if (typeof value === "string")
|
|
138
|
+
return "string";
|
|
139
|
+
// null/undefined - default to int
|
|
140
|
+
return "int";
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Infer the result type of a binary operation
|
|
144
|
+
*/
|
|
145
|
+
function inferBinaryType(node, ctx, errors) {
|
|
146
|
+
const leftType = inferType(node.left, ctx, errors);
|
|
147
|
+
const rightType = inferType(node.right, ctx, errors);
|
|
148
|
+
const op = node.operator;
|
|
149
|
+
// If either operand failed to type, propagate null
|
|
150
|
+
if (!leftType || !rightType)
|
|
151
|
+
return null;
|
|
152
|
+
// String concatenation: string + any → string
|
|
153
|
+
if (op === "+" && (leftType === "string" || rightType === "string")) {
|
|
154
|
+
return "string";
|
|
155
|
+
}
|
|
156
|
+
// Arithmetic operators: int/float → int/float (promote to float if either is float)
|
|
157
|
+
if (["+", "-", "*", "/"].includes(op)) {
|
|
158
|
+
if (!isNumeric(leftType) || !isNumeric(rightType)) {
|
|
159
|
+
errors.push(`Operator '${op}' requires numeric operands (got '${leftType}' and '${rightType}')`);
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return leftType === "float" || rightType === "float" ? "float" : "int";
|
|
163
|
+
}
|
|
164
|
+
// Modulo: int only
|
|
165
|
+
if (op === "%") {
|
|
166
|
+
if (leftType !== "int" || rightType !== "int") {
|
|
167
|
+
errors.push(`Operator '%' requires integer operands (got '${leftType}' and '${rightType}')`);
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return "int";
|
|
171
|
+
}
|
|
172
|
+
// Comparison operators: numeric → bool
|
|
173
|
+
if (["<", ">", "<=", ">="].includes(op)) {
|
|
174
|
+
if (!isNumeric(leftType) || !isNumeric(rightType)) {
|
|
175
|
+
errors.push(`Operator '${op}' requires numeric operands (got '${leftType}' and '${rightType}')`);
|
|
176
|
+
}
|
|
177
|
+
return "bool";
|
|
178
|
+
}
|
|
179
|
+
// Equality operators: any → bool (but types should match)
|
|
180
|
+
if (["==", "!="].includes(op)) {
|
|
181
|
+
if (leftType !== rightType && !(isNumeric(leftType) && isNumeric(rightType))) {
|
|
182
|
+
errors.push(`Comparing incompatible types: '${leftType}' and '${rightType}'`);
|
|
183
|
+
}
|
|
184
|
+
return "bool";
|
|
185
|
+
}
|
|
186
|
+
// Logical operators: bool → bool
|
|
187
|
+
if (["&&", "||"].includes(op)) {
|
|
188
|
+
if (leftType !== "bool" || rightType !== "bool") {
|
|
189
|
+
errors.push(`Operator '${op}' requires boolean operands (got '${leftType}' and '${rightType}')`);
|
|
190
|
+
}
|
|
191
|
+
return "bool";
|
|
192
|
+
}
|
|
193
|
+
// Bitwise operators: int → int
|
|
194
|
+
if (["&", "|", "^", "<<", ">>"].includes(op)) {
|
|
195
|
+
if (leftType !== "int" || rightType !== "int") {
|
|
196
|
+
errors.push(`Bitwise operator '${op}' requires integer operands (got '${leftType}' and '${rightType}')`);
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
return "int";
|
|
200
|
+
}
|
|
201
|
+
errors.push(`Unknown operator: '${op}'`);
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Infer the result type of a unary operation
|
|
206
|
+
*/
|
|
207
|
+
function inferUnaryType(node, ctx, errors) {
|
|
208
|
+
const argType = inferType(node.argument, ctx, errors);
|
|
209
|
+
if (!argType)
|
|
210
|
+
return null;
|
|
211
|
+
// Logical NOT: bool → bool
|
|
212
|
+
if (node.operator === "!") {
|
|
213
|
+
if (argType !== "bool") {
|
|
214
|
+
errors.push(`Logical NOT '!' requires boolean operand (got '${argType}')`);
|
|
215
|
+
}
|
|
216
|
+
return "bool";
|
|
217
|
+
}
|
|
218
|
+
// Unary plus/minus: numeric → same type
|
|
219
|
+
if (node.operator === "-" || node.operator === "+") {
|
|
220
|
+
if (!isNumeric(argType)) {
|
|
221
|
+
errors.push(`Unary '${node.operator}' requires numeric operand (got '${argType}')`);
|
|
222
|
+
}
|
|
223
|
+
return argType;
|
|
224
|
+
}
|
|
225
|
+
// Bitwise NOT: int → int
|
|
226
|
+
if (node.operator === "~") {
|
|
227
|
+
if (argType !== "int") {
|
|
228
|
+
errors.push(`Bitwise NOT '~' requires integer operand (got '${argType}')`);
|
|
229
|
+
}
|
|
230
|
+
return "int";
|
|
231
|
+
}
|
|
232
|
+
errors.push(`Unknown unary operator: '${node.operator}'`);
|
|
233
|
+
return argType;
|
|
234
|
+
}
|
|
235
|
+
/** Cast functions: expression syntax uses int(), float(), bool(), str()
|
|
236
|
+
* which the code generator translates to C casts / conversion calls.
|
|
237
|
+
*/
|
|
238
|
+
const CAST_FUNCTIONS = {
|
|
239
|
+
int: "int",
|
|
240
|
+
float: "float",
|
|
241
|
+
bool: "bool",
|
|
242
|
+
str: "string",
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Infer the result type of a cast function call, e.g. int(expr), str(expr).
|
|
246
|
+
* Any type can be cast to any other type — it's the user's explicit intent.
|
|
247
|
+
*/
|
|
248
|
+
function inferCallType(node, ctx, errors) {
|
|
249
|
+
const callee = node.callee;
|
|
250
|
+
if (callee.type !== "Identifier") {
|
|
251
|
+
errors.push("Only cast functions are supported (int, float, bool, str)");
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
const name = callee.name;
|
|
255
|
+
const targetType = CAST_FUNCTIONS[name];
|
|
256
|
+
if (!targetType) {
|
|
257
|
+
errors.push(`Unknown function '${name}'. Available cast functions: int(), float(), bool(), str()`);
|
|
258
|
+
return null;
|
|
259
|
+
}
|
|
260
|
+
if (node.arguments.length !== 1) {
|
|
261
|
+
errors.push(`${name}() expects exactly 1 argument, got ${node.arguments.length}`);
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
// Validate the argument expression (ensure it type-checks). Length checked as 1 above.
|
|
265
|
+
inferType(node.arguments[0], ctx, errors);
|
|
266
|
+
return targetType;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Check if a type is numeric (int or float)
|
|
270
|
+
*/
|
|
271
|
+
function isNumeric(type) {
|
|
272
|
+
return type === "int" || type === "float";
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Check if a type can be implicitly converted to another.
|
|
276
|
+
* - int ↔ float: both directions (truncation for float→int, common in embedded)
|
|
277
|
+
* - any → string: allowed (format strings)
|
|
278
|
+
* - bool is strict: requires explicit cast to/from bool
|
|
279
|
+
*/
|
|
280
|
+
function isCompatible(from, to) {
|
|
281
|
+
if (from === to)
|
|
282
|
+
return true;
|
|
283
|
+
if (isNumeric(from) && isNumeric(to))
|
|
284
|
+
return true;
|
|
285
|
+
if (to === "string")
|
|
286
|
+
return true;
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Wrap bare text in a string-type expression into quoted string literals for jsep.
|
|
291
|
+
* Splits by variable placeholders (__varN__), quotes text segments, joins with +.
|
|
292
|
+
* E.g. `hello __var0__` → `"hello " + __var0__`
|
|
293
|
+
*/
|
|
294
|
+
function wrapStringTemplate(expr) {
|
|
295
|
+
// Split by __varN__ placeholders but keep them as delimiters
|
|
296
|
+
const parts = expr.split(/(__var\d+__)/);
|
|
297
|
+
const segments = [];
|
|
298
|
+
for (const part of parts) {
|
|
299
|
+
if (/^__var\d+__$/.test(part)) {
|
|
300
|
+
segments.push(part);
|
|
301
|
+
}
|
|
302
|
+
else if (part !== "") {
|
|
303
|
+
const escaped = part.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
304
|
+
segments.push(`"${escaped}"`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return segments.join(" + ");
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/expression/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { NodeOutput } from "../node";
|
|
2
|
+
import type { DataType, Expression } from "../api";
|
|
3
|
+
import type { Variable } from "../variable";
|
|
4
|
+
export interface ResolvedExpr {
|
|
5
|
+
expression: string;
|
|
6
|
+
variables: (NodeOutput | null)[];
|
|
7
|
+
expectedType: DataType;
|
|
8
|
+
}
|
|
9
|
+
export declare function resolveExpression(apiExpr: Expression, availableVars: Record<string, Variable>): ResolvedExpr;
|
|
10
|
+
export declare function isExpression(value: unknown): value is Expression;
|
|
11
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/expression/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;IACjC,YAAY,EAAE,QAAQ,CAAC;CACxB;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,YAAY,CAW5G;AAGD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { refToLookupKey } from "../variable";
|
|
2
|
+
// Resolve an expression by converting variable references to runtime variables
|
|
3
|
+
export function resolveExpression(apiExpr, availableVars) {
|
|
4
|
+
return {
|
|
5
|
+
expression: apiExpr.expression,
|
|
6
|
+
expectedType: apiExpr.dataType,
|
|
7
|
+
variables: apiExpr.references.map((ref) => {
|
|
8
|
+
if (!ref.varId)
|
|
9
|
+
return null;
|
|
10
|
+
const key = refToLookupKey(ref);
|
|
11
|
+
const v = availableVars[key];
|
|
12
|
+
return v ? { name: v.name, dataType: v.dataType } : null;
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
// Check if a value is an expression (has references array)
|
|
17
|
+
export function isExpression(value) {
|
|
18
|
+
return typeof value === "object" && value !== null && "expression" in value && "references" in value;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/expression/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAS7C,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAAC,OAAmB,EAAE,aAAuC;IAC5F,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,QAAQ;QAC9B,SAAS,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,KAAK;gBAAE,OAAO,IAAI,CAAC;YAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3D,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,IAAI,KAAK,IAAI,YAAY,IAAI,KAAK,CAAC;AACvG,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Expression, Schemas } from "../api";
|
|
2
|
+
import type { ApiVariable } from "../variable";
|
|
3
|
+
import type { DataType } from "../parameter";
|
|
4
|
+
/**
|
|
5
|
+
* The flat call-site signature of a function: identity + version + ports, with no
|
|
6
|
+
* expressions (the contract's `FunctionInfo`, used both inside `Function` on the wire
|
|
7
|
+
* and here in the domain). It is the snapshot a {@link FunctionCallNode} caches — to
|
|
8
|
+
* detect drift against the live declaration and render its ports without a registry
|
|
9
|
+
* lookup — and the shape {@link buildFunctionNodeDef} consumes.
|
|
10
|
+
*/
|
|
11
|
+
export type FunctionInfo = Schemas["FunctionInfo"];
|
|
12
|
+
/**
|
|
13
|
+
* A function output: its declaration (`uid`/`name`/`dataType`) bundled with the
|
|
14
|
+
* `expression` that produces it (evaluated in callee scope at the function's end).
|
|
15
|
+
* Acts as a supertype of {@link ApiVariable}.
|
|
16
|
+
*/
|
|
17
|
+
export interface OutputAssignment {
|
|
18
|
+
uid: string;
|
|
19
|
+
name: string;
|
|
20
|
+
dataType: DataType;
|
|
21
|
+
expression: Expression;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The domain function declaration: a signature with its outputs bundled
|
|
25
|
+
* (declaration + assignment per output).
|
|
26
|
+
* Separate from the function body (which is a canvas of nodes, edges, variables).
|
|
27
|
+
*/
|
|
28
|
+
export interface FunctionDeclaration {
|
|
29
|
+
id: string;
|
|
30
|
+
version: number;
|
|
31
|
+
name: string;
|
|
32
|
+
arguments: ApiVariable[];
|
|
33
|
+
outputs: OutputAssignment[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Project a declaration to the flat call-site signature, dropping the expressions
|
|
37
|
+
* (the caller has no business storing the callee's internals). Used only when
|
|
38
|
+
* crossing from declaration to a call-site snapshot — dropping or migrating a
|
|
39
|
+
* `FunctionCall` node — and by serialization. Never used to represent a function
|
|
40
|
+
* within the domain.
|
|
41
|
+
*/
|
|
42
|
+
export declare function toFunctionInfo(fn: FunctionDeclaration): FunctionInfo;
|
|
43
|
+
//# sourceMappingURL=FunctionDeclaration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionDeclaration.d.ts","sourceRoot":"","sources":["../../src/function/FunctionDeclaration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;AAEnD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,mBAAmB,GAAG,YAAY,CAQpE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project a declaration to the flat call-site signature, dropping the expressions
|
|
3
|
+
* (the caller has no business storing the callee's internals). Used only when
|
|
4
|
+
* crossing from declaration to a call-site snapshot — dropping or migrating a
|
|
5
|
+
* `FunctionCall` node — and by serialization. Never used to represent a function
|
|
6
|
+
* within the domain.
|
|
7
|
+
*/
|
|
8
|
+
export function toFunctionInfo(fn) {
|
|
9
|
+
return {
|
|
10
|
+
id: fn.id,
|
|
11
|
+
version: fn.version,
|
|
12
|
+
name: fn.name,
|
|
13
|
+
arguments: fn.arguments,
|
|
14
|
+
returns: fn.outputs.map(({ uid, name, dataType }) => ({ uid, name, dataType })),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=FunctionDeclaration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FunctionDeclaration.js","sourceRoot":"","sources":["../../src/function/FunctionDeclaration.ts"],"names":[],"mappings":"AAsCA;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAAuB;IACpD,OAAO;QACL,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,OAAO,EAAE,EAAE,CAAC,OAAO;QACnB,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,SAAS,EAAE,EAAE,CAAC,SAAS;QACvB,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;KAChF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/function/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/function/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Expression } from "../api";
|
|
2
|
+
import type { FunctionDeclaration, FunctionInfo } from "./FunctionDeclaration";
|
|
3
|
+
/**
|
|
4
|
+
* The two wire pieces a {@link FunctionDeclaration} splits into. The contract keeps
|
|
5
|
+
* the signature (`functionInfo`) and the return-value expressions (`outputAssignments`)
|
|
6
|
+
* apart; the domain bundles them on `outputs`. The function *body*
|
|
7
|
+
* (nodes/edges/declaredVariables) is added separately by the workflow serializer —
|
|
8
|
+
* this only handles the declaration ⇄ wire mapping.
|
|
9
|
+
*/
|
|
10
|
+
export interface SerializedFunction {
|
|
11
|
+
functionInfo: FunctionInfo;
|
|
12
|
+
outputAssignments: Record<string, Expression>;
|
|
13
|
+
}
|
|
14
|
+
/** Domain declaration → wire pieces: flatten the signature and lift each output's
|
|
15
|
+
* expression into the `outputAssignments` map keyed by output uid. */
|
|
16
|
+
export declare function serialize(fn: FunctionDeclaration): SerializedFunction;
|
|
17
|
+
/** Wire pieces → domain declaration: bundle each `return` with its assignment. A
|
|
18
|
+
* return with no stored assignment gets an empty expression of the right dataType. */
|
|
19
|
+
export declare function deserialize(functionInfo: FunctionInfo, outputAssignments: Record<string, Expression>): FunctionDeclaration;
|
|
20
|
+
//# sourceMappingURL=serialization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../src/function/serialization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG/E;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,YAAY,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CAC/C;AAED;uEACuE;AACvE,wBAAgB,SAAS,CAAC,EAAE,EAAE,mBAAmB,GAAG,kBAAkB,CAIrE;AAED;uFACuF;AACvF,wBAAgB,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,mBAAmB,CAa1H"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { toFunctionInfo } from "./FunctionDeclaration";
|
|
2
|
+
/** Domain declaration → wire pieces: flatten the signature and lift each output's
|
|
3
|
+
* expression into the `outputAssignments` map keyed by output uid. */
|
|
4
|
+
export function serialize(fn) {
|
|
5
|
+
const outputAssignments = {};
|
|
6
|
+
for (const o of fn.outputs)
|
|
7
|
+
outputAssignments[o.uid] = o.expression;
|
|
8
|
+
return { functionInfo: toFunctionInfo(fn), outputAssignments };
|
|
9
|
+
}
|
|
10
|
+
/** Wire pieces → domain declaration: bundle each `return` with its assignment. A
|
|
11
|
+
* return with no stored assignment gets an empty expression of the right dataType. */
|
|
12
|
+
export function deserialize(functionInfo, outputAssignments) {
|
|
13
|
+
return {
|
|
14
|
+
id: functionInfo.id,
|
|
15
|
+
version: functionInfo.version,
|
|
16
|
+
name: functionInfo.name,
|
|
17
|
+
arguments: functionInfo.arguments,
|
|
18
|
+
outputs: functionInfo.returns.map((r) => ({
|
|
19
|
+
uid: r.uid,
|
|
20
|
+
name: r.name,
|
|
21
|
+
dataType: r.dataType,
|
|
22
|
+
expression: outputAssignments[r.uid] ?? { expression: "", references: [], dataType: r.dataType },
|
|
23
|
+
})),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=serialization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../src/function/serialization.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAcvD;uEACuE;AACvE,MAAM,UAAU,SAAS,CAAC,EAAuB;IAC/C,MAAM,iBAAiB,GAA+B,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO;QAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACpE,OAAO,EAAE,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC;AACjE,CAAC;AAED;uFACuF;AACvF,MAAM,UAAU,WAAW,CAAC,YAA0B,EAAE,iBAA6C;IACnG,OAAO;QACL,EAAE,EAAE,YAAY,CAAC,EAAE;QACnB,OAAO,EAAE,YAAY,CAAC,OAAO;QAC7B,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;SACjG,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized UID creation for every entity in a workflow — nodes, edges,
|
|
3
|
+
* channels, memory, models, declared variables, function arguments, and
|
|
4
|
+
* function canvases. IDs are opaque.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateId(): string;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/id/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
|
package/dist/id/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized UID creation for every entity in a workflow — nodes, edges,
|
|
3
|
+
* channels, memory, models, declared variables, function arguments, and
|
|
4
|
+
* function canvases. IDs are opaque.
|
|
5
|
+
*/
|
|
6
|
+
export function generateId() {
|
|
7
|
+
return crypto.randomUUID();
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/id/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;AAC7B,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type ValidationResult } from "./diagnostics/diagnostics";
|
|
2
|
+
import type { ApiWorkflow } from "./workflow/Workflow";
|
|
3
|
+
export type { DataType, Reference, Expression } from "./api";
|
|
4
|
+
export { migrate, CURRENT_SCHEMA_VERSION } from "./migration";
|
|
5
|
+
/**
|
|
6
|
+
* Validate a workflow against the headless validator.
|
|
7
|
+
* Pure: no I/O, no Zustand, no React, no DOM. Runnable in Node, a CLI, or
|
|
8
|
+
* a Claude Code skill.
|
|
9
|
+
*/
|
|
10
|
+
export declare function validateWorkflow(workflow: ApiWorkflow): ValidationResult;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAMvD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAI7D,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,WAAW,GAAG,gBAAgB,CAExE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { deserialize } from "./workflow/serialization";
|
|
2
|
+
import { validateWorkflowState } from "./diagnostics/diagnostics";
|
|
3
|
+
// Format versioning: load persisted documents through `migrate` before
|
|
4
|
+
// deserializing.
|
|
5
|
+
export { migrate, CURRENT_SCHEMA_VERSION } from "./migration";
|
|
6
|
+
/**
|
|
7
|
+
* Validate a workflow against the headless validator.
|
|
8
|
+
* Pure: no I/O, no Zustand, no React, no DOM. Runnable in Node, a CLI, or
|
|
9
|
+
* a Claude Code skill.
|
|
10
|
+
*/
|
|
11
|
+
export function validateWorkflow(workflow) {
|
|
12
|
+
return validateWorkflowState(deserialize(workflow));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAyB,MAAM,2BAA2B,CAAC;AASzF,uEAAuE;AACvE,iBAAiB;AACjB,OAAO,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE9D;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAqB;IACpD,OAAO,qBAAqB,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Schemas } from "../api";
|
|
2
|
+
export type MemoryType = "MemoryFile" | "VectorDatabase";
|
|
3
|
+
export declare const ALL_MEMORY_TYPES: MemoryType[];
|
|
4
|
+
export interface Memory {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
type: MemoryType;
|
|
8
|
+
arguments: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
/** Reference from an agent node to a declared MemoryFile, with access mode. Round-trips 1:1 with the API. */
|
|
11
|
+
export type MemoryRef = Schemas["MemoryRef"];
|
|
12
|
+
//# sourceMappingURL=Memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Memory.d.ts","sourceRoot":"","sources":["../../src/memory/Memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,gBAAgB,CAAC;AAEzD,eAAO,MAAM,gBAAgB,EAAE,UAAU,EAAqC,CAAC;AAE/E,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,6GAA6G;AAC7G,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Memory.js","sourceRoot":"","sources":["../../src/memory/Memory.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,gBAAgB,GAAiB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Parameter } from "../parameter";
|
|
2
|
+
import type { MemoryType } from "./Memory";
|
|
3
|
+
/**
|
|
4
|
+
* Static, per-type metadata for a memory variant. Mirrors NodeDefinition:
|
|
5
|
+
* one definition object per MemoryType, registered in MemoryRegistry — unlike
|
|
6
|
+
* channels, which use a single union definition gated by activation rules.
|
|
7
|
+
* `label` is a top-level instance field (edited like a channel label), so it is
|
|
8
|
+
* never a parameter here.
|
|
9
|
+
*/
|
|
10
|
+
export interface MemoryDefinition {
|
|
11
|
+
type: MemoryType;
|
|
12
|
+
label: string;
|
|
13
|
+
description: string;
|
|
14
|
+
parameters: Parameter[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=MemoryDefinition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryDefinition.d.ts","sourceRoot":"","sources":["../../src/memory/MemoryDefinition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MemoryDefinition.js","sourceRoot":"","sources":["../../src/memory/MemoryDefinition.ts"],"names":[],"mappings":""}
|