@foresthubai/workflow-core 0.4.3 → 0.4.5

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.
Files changed (298) hide show
  1. package/LICENSE +202 -202
  2. package/NOTICE +14 -14
  3. package/README.md +63 -63
  4. package/dist/api/deployment.d.ts +74 -0
  5. package/dist/api/deployment.d.ts.map +1 -0
  6. package/dist/api/deployment.js +6 -0
  7. package/dist/api/deployment.js.map +1 -0
  8. package/dist/api/engine.d.ts +744 -0
  9. package/dist/api/engine.d.ts.map +1 -0
  10. package/dist/api/engine.js +6 -0
  11. package/dist/api/engine.js.map +1 -0
  12. package/dist/api/index.d.ts +4 -0
  13. package/dist/api/index.d.ts.map +1 -1
  14. package/dist/api/index.js +2 -0
  15. package/dist/api/index.js.map +1 -1
  16. package/dist/api/workflow.d.ts +25 -9
  17. package/dist/api/workflow.d.ts.map +1 -1
  18. package/dist/channel/Channel.d.ts +1 -1
  19. package/dist/channel/Channel.d.ts.map +1 -1
  20. package/dist/channel/Channel.js +3 -1
  21. package/dist/channel/Channel.js.map +1 -1
  22. package/dist/channel/ChannelDefinition.d.ts.map +1 -1
  23. package/dist/channel/ChannelDefinition.js +24 -0
  24. package/dist/channel/ChannelDefinition.js.map +1 -1
  25. package/dist/channel/index.d.ts.map +1 -1
  26. package/dist/channel/index.js +2 -0
  27. package/dist/channel/index.js.map +1 -1
  28. package/dist/channel/serialization.d.ts.map +1 -1
  29. package/dist/channel/serialization.js +8 -0
  30. package/dist/channel/serialization.js.map +1 -1
  31. package/dist/deploy/index.d.ts +5 -1
  32. package/dist/deploy/index.d.ts.map +1 -1
  33. package/dist/deploy/index.js +4 -1
  34. package/dist/deploy/index.js.map +1 -1
  35. package/dist/deploy/inputs.d.ts +26 -0
  36. package/dist/deploy/inputs.d.ts.map +1 -0
  37. package/dist/deploy/inputs.js +4 -0
  38. package/dist/deploy/inputs.js.map +1 -0
  39. package/dist/deploy/requirements.d.ts +24 -0
  40. package/dist/deploy/requirements.d.ts.map +1 -1
  41. package/dist/deploy/requirements.js +63 -0
  42. package/dist/deploy/requirements.js.map +1 -1
  43. package/dist/deploy/spec.d.ts +27 -0
  44. package/dist/deploy/spec.d.ts.map +1 -0
  45. package/dist/deploy/spec.js +352 -0
  46. package/dist/deploy/spec.js.map +1 -0
  47. package/dist/diagnostics/__fixtures__/diagnosticFixtures.d.ts.map +1 -1
  48. package/dist/diagnostics/__fixtures__/diagnosticFixtures.js +2 -0
  49. package/dist/diagnostics/__fixtures__/diagnosticFixtures.js.map +1 -1
  50. package/dist/diagnostics/diagnostics.d.ts.map +1 -1
  51. package/dist/diagnostics/diagnostics.js +2 -0
  52. package/dist/diagnostics/diagnostics.js.map +1 -1
  53. package/dist/diagnostics/index.d.ts.map +1 -1
  54. package/dist/diagnostics/index.js +2 -0
  55. package/dist/diagnostics/index.js.map +1 -1
  56. package/dist/edge/Edge.d.ts.map +1 -1
  57. package/dist/edge/Edge.js +2 -0
  58. package/dist/edge/Edge.js.map +1 -1
  59. package/dist/edge/EdgeDefinition.d.ts.map +1 -1
  60. package/dist/edge/EdgeDefinition.js +2 -0
  61. package/dist/edge/EdgeDefinition.js.map +1 -1
  62. package/dist/edge/EdgeType.d.ts.map +1 -1
  63. package/dist/edge/EdgeType.js +2 -0
  64. package/dist/edge/EdgeType.js.map +1 -1
  65. package/dist/edge/index.d.ts.map +1 -1
  66. package/dist/edge/index.js +2 -2
  67. package/dist/edge/index.js.map +1 -1
  68. package/dist/edge/serialization.d.ts.map +1 -1
  69. package/dist/edge/serialization.js +2 -0
  70. package/dist/edge/serialization.js.map +1 -1
  71. package/dist/expression/index.d.ts.map +1 -1
  72. package/dist/expression/index.js +2 -0
  73. package/dist/expression/index.js.map +1 -1
  74. package/dist/expression/parser.d.ts.map +1 -1
  75. package/dist/expression/parser.js +2 -0
  76. package/dist/expression/parser.js.map +1 -1
  77. package/dist/expression/types.d.ts.map +1 -1
  78. package/dist/expression/types.js +2 -0
  79. package/dist/expression/types.js.map +1 -1
  80. package/dist/function/FunctionDeclaration.d.ts.map +1 -1
  81. package/dist/function/FunctionDeclaration.js +2 -0
  82. package/dist/function/FunctionDeclaration.js.map +1 -1
  83. package/dist/function/index.d.ts.map +1 -1
  84. package/dist/function/index.js +2 -0
  85. package/dist/function/index.js.map +1 -1
  86. package/dist/function/serialization.d.ts.map +1 -1
  87. package/dist/function/serialization.js +2 -0
  88. package/dist/function/serialization.js.map +1 -1
  89. package/dist/id/index.d.ts.map +1 -1
  90. package/dist/id/index.js +2 -0
  91. package/dist/id/index.js.map +1 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +2 -0
  94. package/dist/index.js.map +1 -1
  95. package/dist/memory/Memory.d.ts.map +1 -1
  96. package/dist/memory/Memory.js +2 -0
  97. package/dist/memory/Memory.js.map +1 -1
  98. package/dist/memory/MemoryDefinition.d.ts.map +1 -1
  99. package/dist/memory/MemoryDefinition.js +2 -0
  100. package/dist/memory/MemoryDefinition.js.map +1 -1
  101. package/dist/memory/MemoryFileDefinition.d.ts.map +1 -1
  102. package/dist/memory/MemoryFileDefinition.js +2 -0
  103. package/dist/memory/MemoryFileDefinition.js.map +1 -1
  104. package/dist/memory/MemoryRegistry.d.ts.map +1 -1
  105. package/dist/memory/MemoryRegistry.js +2 -0
  106. package/dist/memory/MemoryRegistry.js.map +1 -1
  107. package/dist/memory/VectorDatabaseDefinition.d.ts.map +1 -1
  108. package/dist/memory/VectorDatabaseDefinition.js +2 -0
  109. package/dist/memory/VectorDatabaseDefinition.js.map +1 -1
  110. package/dist/memory/index.d.ts.map +1 -1
  111. package/dist/memory/index.js +2 -0
  112. package/dist/memory/index.js.map +1 -1
  113. package/dist/memory/serialization.d.ts.map +1 -1
  114. package/dist/memory/serialization.js +2 -0
  115. package/dist/memory/serialization.js.map +1 -1
  116. package/dist/migration/index.d.ts.map +1 -1
  117. package/dist/migration/index.js +2 -0
  118. package/dist/migration/index.js.map +1 -1
  119. package/dist/migration/migrate.d.ts.map +1 -1
  120. package/dist/migration/migrate.js +2 -0
  121. package/dist/migration/migrate.js.map +1 -1
  122. package/dist/migration/migrations.d.ts.map +1 -1
  123. package/dist/migration/migrations.js +2 -0
  124. package/dist/migration/migrations.js.map +1 -1
  125. package/dist/migration/version.d.ts.map +1 -1
  126. package/dist/migration/version.js +2 -0
  127. package/dist/migration/version.js.map +1 -1
  128. package/dist/model/LLMModelDefinition.d.ts.map +1 -1
  129. package/dist/model/LLMModelDefinition.js +2 -0
  130. package/dist/model/LLMModelDefinition.js.map +1 -1
  131. package/dist/model/Model.d.ts.map +1 -1
  132. package/dist/model/Model.js +2 -13
  133. package/dist/model/Model.js.map +1 -1
  134. package/dist/model/ModelDefinition.d.ts.map +1 -1
  135. package/dist/model/ModelDefinition.js +2 -0
  136. package/dist/model/ModelDefinition.js.map +1 -1
  137. package/dist/model/ModelRegistry.d.ts.map +1 -1
  138. package/dist/model/ModelRegistry.js +2 -0
  139. package/dist/model/ModelRegistry.js.map +1 -1
  140. package/dist/model/index.d.ts.map +1 -1
  141. package/dist/model/index.js +2 -0
  142. package/dist/model/index.js.map +1 -1
  143. package/dist/model/serialization.d.ts.map +1 -1
  144. package/dist/model/serialization.js +2 -0
  145. package/dist/model/serialization.js.map +1 -1
  146. package/dist/node/AgentNode.d.ts.map +1 -1
  147. package/dist/node/AgentNode.js +2 -0
  148. package/dist/node/AgentNode.js.map +1 -1
  149. package/dist/node/DataNode.d.ts.map +1 -1
  150. package/dist/node/DataNode.js +2 -0
  151. package/dist/node/DataNode.js.map +1 -1
  152. package/dist/node/FunctionNode.d.ts.map +1 -1
  153. package/dist/node/FunctionNode.js +2 -0
  154. package/dist/node/FunctionNode.js.map +1 -1
  155. package/dist/node/InputNode.d.ts.map +1 -1
  156. package/dist/node/InputNode.js +2 -0
  157. package/dist/node/InputNode.js.map +1 -1
  158. package/dist/node/LogicNode.d.ts.map +1 -1
  159. package/dist/node/LogicNode.js +2 -0
  160. package/dist/node/LogicNode.js.map +1 -1
  161. package/dist/node/MqttNode.d.ts.map +1 -1
  162. package/dist/node/MqttNode.js +2 -0
  163. package/dist/node/MqttNode.js.map +1 -1
  164. package/dist/node/Node.d.ts.map +1 -1
  165. package/dist/node/Node.js +2 -7
  166. package/dist/node/Node.js.map +1 -1
  167. package/dist/node/NodeDefinition.d.ts.map +1 -1
  168. package/dist/node/NodeDefinition.js +2 -0
  169. package/dist/node/NodeDefinition.js.map +1 -1
  170. package/dist/node/NodeRegistry.d.ts.map +1 -1
  171. package/dist/node/NodeRegistry.js +2 -0
  172. package/dist/node/NodeRegistry.js.map +1 -1
  173. package/dist/node/OutputNode.d.ts.map +1 -1
  174. package/dist/node/OutputNode.js +4 -2
  175. package/dist/node/OutputNode.js.map +1 -1
  176. package/dist/node/ToolNode.d.ts.map +1 -1
  177. package/dist/node/ToolNode.js +2 -0
  178. package/dist/node/ToolNode.js.map +1 -1
  179. package/dist/node/TriggerNode.d.ts.map +1 -1
  180. package/dist/node/TriggerNode.js +2 -0
  181. package/dist/node/TriggerNode.js.map +1 -1
  182. package/dist/node/constants.d.ts.map +1 -1
  183. package/dist/node/constants.js +2 -0
  184. package/dist/node/constants.js.map +1 -1
  185. package/dist/node/index.d.ts.map +1 -1
  186. package/dist/node/index.js +2 -0
  187. package/dist/node/index.js.map +1 -1
  188. package/dist/node/methods.d.ts.map +1 -1
  189. package/dist/node/methods.js +2 -0
  190. package/dist/node/methods.js.map +1 -1
  191. package/dist/node/serialization.d.ts.map +1 -1
  192. package/dist/node/serialization.js +33 -13
  193. package/dist/node/serialization.js.map +1 -1
  194. package/dist/parameter/OutputParameter.d.ts.map +1 -1
  195. package/dist/parameter/OutputParameter.js +2 -0
  196. package/dist/parameter/OutputParameter.js.map +1 -1
  197. package/dist/parameter/Parameter.d.ts.map +1 -1
  198. package/dist/parameter/Parameter.js +2 -0
  199. package/dist/parameter/Parameter.js.map +1 -1
  200. package/dist/parameter/index.d.ts.map +1 -1
  201. package/dist/parameter/index.js +2 -0
  202. package/dist/parameter/index.js.map +1 -1
  203. package/dist/variable/Variable.d.ts.map +1 -1
  204. package/dist/variable/Variable.js +2 -0
  205. package/dist/variable/Variable.js.map +1 -1
  206. package/dist/variable/index.d.ts.map +1 -1
  207. package/dist/variable/index.js +2 -3
  208. package/dist/variable/index.js.map +1 -1
  209. package/dist/variable/operations.d.ts.map +1 -1
  210. package/dist/variable/operations.js +2 -0
  211. package/dist/variable/operations.js.map +1 -1
  212. package/dist/workflow/Workflow.d.ts.map +1 -1
  213. package/dist/workflow/Workflow.js +2 -0
  214. package/dist/workflow/Workflow.js.map +1 -1
  215. package/dist/workflow/index.d.ts.map +1 -1
  216. package/dist/workflow/index.js +2 -0
  217. package/dist/workflow/index.js.map +1 -1
  218. package/dist/workflow/serialization.d.ts.map +1 -1
  219. package/dist/workflow/serialization.js +2 -4
  220. package/dist/workflow/serialization.js.map +1 -1
  221. package/package.json +2 -2
  222. package/src/api/deployment.ts +74 -0
  223. package/src/api/engine.ts +744 -0
  224. package/src/api/index.ts +29 -11
  225. package/src/api/workflow.ts +25 -9
  226. package/src/channel/Channel.ts +14 -11
  227. package/src/channel/ChannelDefinition.ts +101 -76
  228. package/src/channel/index.ts +9 -6
  229. package/src/channel/serialization.ts +77 -68
  230. package/src/deploy/index.ts +17 -1
  231. package/src/deploy/inputs.ts +44 -0
  232. package/src/deploy/requirements.test.ts +64 -61
  233. package/src/deploy/requirements.ts +159 -41
  234. package/src/deploy/spec.test.ts +227 -0
  235. package/src/deploy/spec.ts +397 -0
  236. package/src/diagnostics/__fixtures__/diagnosticFixtures.ts +161 -158
  237. package/src/diagnostics/diagnostics.test.ts +881 -878
  238. package/src/diagnostics/diagnostics.ts +939 -936
  239. package/src/diagnostics/index.ts +14 -11
  240. package/src/edge/Edge.ts +26 -23
  241. package/src/edge/EdgeDefinition.ts +48 -45
  242. package/src/edge/EdgeType.ts +22 -19
  243. package/src/edge/index.ts +11 -8
  244. package/src/edge/serialization.ts +86 -83
  245. package/src/expression/index.ts +7 -4
  246. package/src/expression/parser.ts +365 -362
  247. package/src/expression/types.ts +33 -30
  248. package/src/function/FunctionDeclaration.ts +57 -54
  249. package/src/function/index.ts +6 -3
  250. package/src/function/serialization.ts +43 -40
  251. package/src/globals.d.ts +12 -9
  252. package/src/id/index.ts +11 -8
  253. package/src/index.ts +25 -22
  254. package/src/memory/Memory.ts +18 -15
  255. package/src/memory/MemoryDefinition.ts +19 -16
  256. package/src/memory/MemoryFileDefinition.ts +40 -37
  257. package/src/memory/MemoryRegistry.ts +38 -35
  258. package/src/memory/VectorDatabaseDefinition.ts +24 -21
  259. package/src/memory/index.ts +11 -8
  260. package/src/memory/serialization.ts +50 -47
  261. package/src/migration/index.ts +7 -4
  262. package/src/migration/migrate.test.ts +47 -44
  263. package/src/migration/migrate.ts +61 -58
  264. package/src/migration/migrations.ts +27 -24
  265. package/src/migration/version.ts +12 -9
  266. package/src/model/LLMModelDefinition.ts +15 -12
  267. package/src/model/Model.ts +42 -39
  268. package/src/model/ModelDefinition.ts +18 -15
  269. package/src/model/ModelRegistry.ts +36 -33
  270. package/src/model/index.ts +10 -7
  271. package/src/model/serialization.ts +33 -30
  272. package/src/node/AgentNode.ts +85 -82
  273. package/src/node/DataNode.ts +44 -41
  274. package/src/node/FunctionNode.ts +79 -76
  275. package/src/node/InputNode.ts +188 -185
  276. package/src/node/LogicNode.ts +36 -33
  277. package/src/node/MqttNode.ts +130 -127
  278. package/src/node/Node.ts +64 -61
  279. package/src/node/NodeDefinition.ts +40 -37
  280. package/src/node/NodeRegistry.ts +88 -85
  281. package/src/node/OutputNode.ts +90 -87
  282. package/src/node/ToolNode.ts +35 -32
  283. package/src/node/TriggerNode.ts +275 -272
  284. package/src/node/constants.ts +19 -16
  285. package/src/node/index.ts +29 -26
  286. package/src/node/methods.ts +281 -278
  287. package/src/node/serialization.test.ts +51 -0
  288. package/src/node/serialization.ts +565 -544
  289. package/src/parameter/OutputParameter.ts +71 -68
  290. package/src/parameter/Parameter.ts +246 -243
  291. package/src/parameter/index.ts +36 -33
  292. package/src/variable/Variable.ts +13 -10
  293. package/src/variable/index.ts +19 -16
  294. package/src/variable/operations.ts +109 -106
  295. package/src/workflow/Workflow.ts +44 -41
  296. package/src/workflow/index.ts +6 -3
  297. package/src/workflow/serialization.test.ts +243 -240
  298. package/src/workflow/serialization.ts +245 -242
@@ -1,11 +1,14 @@
1
- export type { DiagnosticSeverity, DiagnosticCategory, Diagnostic, CanvasValidationResult, ValidationResult } from "./diagnostics";
2
- export {
3
- computeNodeDiagnostics,
4
- computeEdgeDiagnostics,
5
- validateChannel,
6
- validateMemory,
7
- validateModel,
8
- validateFunction,
9
- validateFunctionOutputs,
10
- validateWorkflowState,
11
- } from "./diagnostics";
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ export type { DiagnosticSeverity, DiagnosticCategory, Diagnostic, CanvasValidationResult, ValidationResult } from "./diagnostics";
5
+ export {
6
+ computeNodeDiagnostics,
7
+ computeEdgeDiagnostics,
8
+ validateChannel,
9
+ validateMemory,
10
+ validateModel,
11
+ validateFunction,
12
+ validateFunctionOutputs,
13
+ validateWorkflowState,
14
+ } from "./diagnostics";
package/src/edge/Edge.ts CHANGED
@@ -1,23 +1,26 @@
1
- import type { Expression } from "../api";
2
-
3
- export interface EdgeData extends Record<string, unknown> {
4
- prompt?: Expression; // agentTask and agentDelegate
5
- description?: string; // agentChoice and agentDelegate
6
- }
7
-
8
- /**
9
- * Full domain edge entity held on a {@link Canvas}: connectivity topology plus
10
- * the optional {@link EdgeData} payload. Low-level core fns that read only
11
- * connectivity accept it directly, and the editor's React Flow `Edge[]` is
12
- * structurally assignable
13
- * without an adapter (core stays free of `@xyflow/react`).
14
- */
15
- export interface Edge {
16
- id: string;
17
- type?: string;
18
- source: string;
19
- sourceHandle?: string | null;
20
- target: string;
21
- targetHandle?: string | null;
22
- data?: EdgeData;
23
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ import type { Expression } from "../api";
5
+
6
+ export interface EdgeData extends Record<string, unknown> {
7
+ prompt?: Expression; // agentTask and agentDelegate
8
+ description?: string; // agentChoice and agentDelegate
9
+ }
10
+
11
+ /**
12
+ * Full domain edge entity held on a {@link Canvas}: connectivity topology plus
13
+ * the optional {@link EdgeData} payload. Low-level core fns that read only
14
+ * connectivity accept it directly, and the editor's React Flow `Edge[]` is
15
+ * structurally assignable
16
+ * without an adapter (core stays free of `@xyflow/react`).
17
+ */
18
+ export interface Edge {
19
+ id: string;
20
+ type?: string;
21
+ source: string;
22
+ sourceHandle?: string | null;
23
+ target: string;
24
+ targetHandle?: string | null;
25
+ data?: EdgeData;
26
+ }
@@ -1,45 +1,48 @@
1
- import { Parameter } from "../parameter";
2
- import type { EdgeType } from "./EdgeType";
3
-
4
- export interface EdgeDefinition {
5
- label: string;
6
- description: string;
7
- parameters: Parameter[];
8
- }
9
-
10
- export const EDGE_DEFINITIONS: Record<EdgeType, EdgeDefinition> = {
11
- agentTask: {
12
- label: "Task",
13
- description: "Assigns a task to an agent with a prompt",
14
- parameters: [{ id: "prompt", label: "Prompt", description: "", type: "expression", expressionType: "string", default: { expression: "", references: [], dataType: "string" } }],
15
- },
16
- agentChoice: {
17
- label: "Choice",
18
- description: "A path the agent can choose based on its description",
19
- parameters: [
20
- { id: "description", label: "Description", description: "", type: "string", default: "When should the agent take this path?" },
21
- ],
22
- },
23
- agentDelegate: {
24
- label: "Delegation",
25
- description: "Lets an agent hand off control to another agent",
26
- parameters: [
27
- { id: "description", label: "Description", description: "", type: "string", default: "When should the agent take this path?" },
28
- { id: "prompt", label: "Prompt", description: "", type: "expression", expressionType: "string", default: { expression: "", references: [], dataType: "string" } },
29
- ],
30
- },
31
- control: {
32
- label: "Control",
33
- description: "Sequential control flow between nodes",
34
- parameters: [],
35
- },
36
- tool: {
37
- label: "Tool",
38
- description: "Tool connection between nodes",
39
- parameters: [],
40
- },
41
- };
42
-
43
- export function getEdgeDefinition(type: EdgeType): EdgeDefinition {
44
- return EDGE_DEFINITIONS[type];
45
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ import { Parameter } from "../parameter";
5
+ import type { EdgeType } from "./EdgeType";
6
+
7
+ export interface EdgeDefinition {
8
+ label: string;
9
+ description: string;
10
+ parameters: Parameter[];
11
+ }
12
+
13
+ export const EDGE_DEFINITIONS: Record<EdgeType, EdgeDefinition> = {
14
+ agentTask: {
15
+ label: "Task",
16
+ description: "Assigns a task to an agent with a prompt",
17
+ parameters: [{ id: "prompt", label: "Prompt", description: "", type: "expression", expressionType: "string", default: { expression: "", references: [], dataType: "string" } }],
18
+ },
19
+ agentChoice: {
20
+ label: "Choice",
21
+ description: "A path the agent can choose based on its description",
22
+ parameters: [
23
+ { id: "description", label: "Description", description: "", type: "string", default: "When should the agent take this path?" },
24
+ ],
25
+ },
26
+ agentDelegate: {
27
+ label: "Delegation",
28
+ description: "Lets an agent hand off control to another agent",
29
+ parameters: [
30
+ { id: "description", label: "Description", description: "", type: "string", default: "When should the agent take this path?" },
31
+ { id: "prompt", label: "Prompt", description: "", type: "expression", expressionType: "string", default: { expression: "", references: [], dataType: "string" } },
32
+ ],
33
+ },
34
+ control: {
35
+ label: "Control",
36
+ description: "Sequential control flow between nodes",
37
+ parameters: [],
38
+ },
39
+ tool: {
40
+ label: "Tool",
41
+ description: "Tool connection between nodes",
42
+ parameters: [],
43
+ },
44
+ };
45
+
46
+ export function getEdgeDefinition(type: EdgeType): EdgeDefinition {
47
+ return EDGE_DEFINITIONS[type];
48
+ }
@@ -1,19 +1,22 @@
1
- // Edge taxonomy: a plain control/tool edge, or one of the three agent-specific
2
- // control-flow refinements resolved at connection time from source/target context.
3
- // Node port handles themselves only carry `control` or `tool`. Tool edges have no
4
- // agent-specific variant every tool edge points at an agent by construction.
5
- export type EdgeType = "control" | "tool" | "agentTask" | "agentChoice" | "agentDelegate";
6
-
7
- // All types that behave like control flow (horizontal bezier, side ports)
8
- export type ControlFlowType = "control" | "agentTask" | "agentChoice" | "agentDelegate";
9
-
10
- // All types that behave like tool connections (vertical bezier, top/bottom ports)
11
- export type ToolFlowType = "tool";
12
-
13
- export function isControlFlow(type: EdgeType): type is ControlFlowType {
14
- return type === "control" || type === "agentTask" || type === "agentChoice" || type === "agentDelegate";
15
- }
16
-
17
- export function isToolFlow(type: EdgeType): type is ToolFlowType {
18
- return type === "tool";
19
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ // Edge taxonomy: a plain control/tool edge, or one of the three agent-specific
5
+ // control-flow refinements resolved at connection time from source/target context.
6
+ // Node port handles themselves only carry `control` or `tool`. Tool edges have no
7
+ // agent-specific variant every tool edge points at an agent by construction.
8
+ export type EdgeType = "control" | "tool" | "agentTask" | "agentChoice" | "agentDelegate";
9
+
10
+ // All types that behave like control flow (horizontal bezier, side ports)
11
+ export type ControlFlowType = "control" | "agentTask" | "agentChoice" | "agentDelegate";
12
+
13
+ // All types that behave like tool connections (vertical bezier, top/bottom ports)
14
+ export type ToolFlowType = "tool";
15
+
16
+ export function isControlFlow(type: EdgeType): type is ControlFlowType {
17
+ return type === "control" || type === "agentTask" || type === "agentChoice" || type === "agentDelegate";
18
+ }
19
+
20
+ export function isToolFlow(type: EdgeType): type is ToolFlowType {
21
+ return type === "tool";
22
+ }
package/src/edge/index.ts CHANGED
@@ -1,8 +1,11 @@
1
- // Public surface of the edge module. The base type (EdgeData) lives in
2
- // ./Edge; this file is a barrel only. Mirrors channel/memory/model.
3
-
4
- export type { EdgeData, Edge } from "./Edge";
5
- export { type EdgeDefinition, getEdgeDefinition, EDGE_DEFINITIONS } from "./EdgeDefinition";
6
- export { type EdgeType, type ControlFlowType, type ToolFlowType, isControlFlow, isToolFlow } from "./EdgeType";
7
- export { serialize, deserialize } from "./serialization";
8
- export type { ApiEdge } from "./serialization";
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ // Public surface of the edge module. The base type (EdgeData) lives in
5
+ // ./Edge; this file is a barrel only. Mirrors channel/memory/model.
6
+
7
+ export type { EdgeData, Edge } from "./Edge";
8
+ export { type EdgeDefinition, getEdgeDefinition, EDGE_DEFINITIONS } from "./EdgeDefinition";
9
+ export { type EdgeType, type ControlFlowType, type ToolFlowType, isControlFlow, isToolFlow } from "./EdgeType";
10
+ export { serialize, deserialize } from "./serialization";
11
+ export type { ApiEdge } from "./serialization";
@@ -1,83 +1,86 @@
1
- import type { Schemas } from "../api";
2
- import type { Edge, EdgeData } from "./Edge";
3
- import type { EdgeType } from "./EdgeType";
4
-
5
- export type ApiEdge = Schemas["Edge"];
6
-
7
- /**
8
- * Serialize a domain {@link Edge} to the api `Edge`. The `id` is preserved
9
- * (the api requires it). Edge-type-conditional metadata (`prompt`,
10
- * `description`) is reattached from the edge's `data` payload.
11
- */
12
- export function serialize(edge: Edge): ApiEdge {
13
- const sourceHandle = edge.sourceHandle || "";
14
- const targetHandle = edge.targetHandle || "";
15
- const edgeType = edge.type as EdgeType | undefined;
16
- const from = { nodeId: edge.source, port: sourceHandle };
17
- const to = { nodeId: edge.target, port: targetHandle };
18
-
19
- switch (edgeType) {
20
- case "agentTask":
21
- return {
22
- id: edge.id,
23
- type: "agentTask",
24
- from,
25
- to,
26
- prompt: (edge.data?.prompt as Schemas["Expression"]) ?? { expression: "", references: [], dataType: "string" },
27
- };
28
- case "agentChoice":
29
- return {
30
- id: edge.id,
31
- type: "agentChoice",
32
- from,
33
- to,
34
- ...(edge.data?.description ? { description: edge.data.description as string } : {}),
35
- };
36
- case "agentDelegate":
37
- return {
38
- id: edge.id,
39
- type: "agentDelegate",
40
- from,
41
- to,
42
- ...(edge.data?.prompt ? { prompt: edge.data.prompt as Schemas["Expression"] } : {}),
43
- ...(edge.data?.description ? { description: edge.data.description as string } : {}),
44
- };
45
- case "control":
46
- return { id: edge.id, type: "control", from, to };
47
- case "tool":
48
- return { id: edge.id, type: "tool", from, to };
49
- default:
50
- return {
51
- id: edge.id,
52
- type: sourceHandle.startsWith("ctrl") || targetHandle.startsWith("ctrl") ? "control" : "tool",
53
- from,
54
- to,
55
- };
56
- }
57
- }
58
-
59
- /**
60
- * Convert an api `Edge` into a domain {@link Edge}. The api's `id` is preserved
61
- * verbatim (earlier code synthesized `e${index+1}`, breaking roundtrip
62
- * identity). Edge-type-conditional metadata (`prompt` on agentTask/agentDelegate;
63
- * `description` on agentChoice/agentDelegate) is folded into `data` as
64
- * {@link EdgeData}.
65
- */
66
- export function deserialize(apiEdge: ApiEdge): Edge {
67
- let data: EdgeData | undefined;
68
- if ((apiEdge.type === "agentTask" || apiEdge.type === "agentDelegate") && apiEdge.prompt) {
69
- data = { ...data, prompt: apiEdge.prompt };
70
- }
71
- if ((apiEdge.type === "agentChoice" || apiEdge.type === "agentDelegate") && apiEdge.description) {
72
- data = { ...data, description: apiEdge.description };
73
- }
74
- return {
75
- id: apiEdge.id,
76
- type: apiEdge.type,
77
- source: apiEdge.from.nodeId,
78
- sourceHandle: apiEdge.from.port,
79
- target: apiEdge.to.nodeId,
80
- targetHandle: apiEdge.to.port,
81
- ...(data ? { data } : {}),
82
- };
83
- }
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ import type { Schemas } from "../api";
5
+ import type { Edge, EdgeData } from "./Edge";
6
+ import type { EdgeType } from "./EdgeType";
7
+
8
+ export type ApiEdge = Schemas["Edge"];
9
+
10
+ /**
11
+ * Serialize a domain {@link Edge} to the api `Edge`. The `id` is preserved
12
+ * (the api requires it). Edge-type-conditional metadata (`prompt`,
13
+ * `description`) is reattached from the edge's `data` payload.
14
+ */
15
+ export function serialize(edge: Edge): ApiEdge {
16
+ const sourceHandle = edge.sourceHandle || "";
17
+ const targetHandle = edge.targetHandle || "";
18
+ const edgeType = edge.type as EdgeType | undefined;
19
+ const from = { nodeId: edge.source, port: sourceHandle };
20
+ const to = { nodeId: edge.target, port: targetHandle };
21
+
22
+ switch (edgeType) {
23
+ case "agentTask":
24
+ return {
25
+ id: edge.id,
26
+ type: "agentTask",
27
+ from,
28
+ to,
29
+ prompt: (edge.data?.prompt as Schemas["Expression"]) ?? { expression: "", references: [], dataType: "string" },
30
+ };
31
+ case "agentChoice":
32
+ return {
33
+ id: edge.id,
34
+ type: "agentChoice",
35
+ from,
36
+ to,
37
+ ...(edge.data?.description ? { description: edge.data.description as string } : {}),
38
+ };
39
+ case "agentDelegate":
40
+ return {
41
+ id: edge.id,
42
+ type: "agentDelegate",
43
+ from,
44
+ to,
45
+ ...(edge.data?.prompt ? { prompt: edge.data.prompt as Schemas["Expression"] } : {}),
46
+ ...(edge.data?.description ? { description: edge.data.description as string } : {}),
47
+ };
48
+ case "control":
49
+ return { id: edge.id, type: "control", from, to };
50
+ case "tool":
51
+ return { id: edge.id, type: "tool", from, to };
52
+ default:
53
+ return {
54
+ id: edge.id,
55
+ type: sourceHandle.startsWith("ctrl") || targetHandle.startsWith("ctrl") ? "control" : "tool",
56
+ from,
57
+ to,
58
+ };
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Convert an api `Edge` into a domain {@link Edge}. The api's `id` is preserved
64
+ * verbatim (earlier code synthesized `e${index+1}`, breaking roundtrip
65
+ * identity). Edge-type-conditional metadata (`prompt` on agentTask/agentDelegate;
66
+ * `description` on agentChoice/agentDelegate) is folded into `data` as
67
+ * {@link EdgeData}.
68
+ */
69
+ export function deserialize(apiEdge: ApiEdge): Edge {
70
+ let data: EdgeData | undefined;
71
+ if ((apiEdge.type === "agentTask" || apiEdge.type === "agentDelegate") && apiEdge.prompt) {
72
+ data = { ...data, prompt: apiEdge.prompt };
73
+ }
74
+ if ((apiEdge.type === "agentChoice" || apiEdge.type === "agentDelegate") && apiEdge.description) {
75
+ data = { ...data, description: apiEdge.description };
76
+ }
77
+ return {
78
+ id: apiEdge.id,
79
+ type: apiEdge.type,
80
+ source: apiEdge.from.nodeId,
81
+ sourceHandle: apiEdge.from.port,
82
+ target: apiEdge.to.nodeId,
83
+ targetHandle: apiEdge.to.port,
84
+ ...(data ? { data } : {}),
85
+ };
86
+ }
@@ -1,4 +1,7 @@
1
- export type { ParseResult } from "./parser";
2
- export { parseExpression } from "./parser";
3
- export type { ResolvedExpr } from "./types";
4
- export { resolveExpression, isExpression } from "./types";
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) 2026 ForestHub.
3
+
4
+ export type { ParseResult } from "./parser";
5
+ export { parseExpression } from "./parser";
6
+ export type { ResolvedExpr } from "./types";
7
+ export { resolveExpression, isExpression } from "./types";