@foresthubai/workflow-builder 0.4.4 → 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 (396) hide show
  1. package/dist/BuilderLayout.d.ts.map +1 -1
  2. package/dist/BuilderLayout.js +52 -61
  3. package/dist/BuilderLayout.js.map +1 -1
  4. package/dist/Canvas.d.ts.map +1 -1
  5. package/dist/Canvas.js +10 -3
  6. package/dist/Canvas.js.map +1 -1
  7. package/dist/CanvasEditor.d.ts.map +1 -1
  8. package/dist/CanvasEditor.js.map +1 -1
  9. package/dist/CanvasTabsToolbar.d.ts.map +1 -1
  10. package/dist/CanvasTabsToolbar.js +3 -0
  11. package/dist/CanvasTabsToolbar.js.map +1 -1
  12. package/dist/RightConfigPanel.d.ts.map +1 -1
  13. package/dist/RightConfigPanel.js +3 -0
  14. package/dist/RightConfigPanel.js.map +1 -1
  15. package/dist/WorkflowBuilder.d.ts +7 -13
  16. package/dist/WorkflowBuilder.d.ts.map +1 -1
  17. package/dist/WorkflowBuilder.js +25 -13
  18. package/dist/WorkflowBuilder.js.map +1 -1
  19. package/dist/cn.d.ts.map +1 -1
  20. package/dist/cn.js +3 -0
  21. package/dist/cn.js.map +1 -1
  22. package/dist/components/ui/add-button.d.ts.map +1 -1
  23. package/dist/components/ui/add-button.js +3 -0
  24. package/dist/components/ui/add-button.js.map +1 -1
  25. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  26. package/dist/components/ui/alert-dialog.js +3 -0
  27. package/dist/components/ui/alert-dialog.js.map +1 -1
  28. package/dist/components/ui/alert.d.ts.map +1 -1
  29. package/dist/components/ui/alert.js +3 -0
  30. package/dist/components/ui/alert.js.map +1 -1
  31. package/dist/components/ui/badge.d.ts.map +1 -1
  32. package/dist/components/ui/badge.js.map +1 -1
  33. package/dist/components/ui/button.d.ts.map +1 -1
  34. package/dist/components/ui/button.js +3 -0
  35. package/dist/components/ui/button.js.map +1 -1
  36. package/dist/components/ui/card.d.ts.map +1 -1
  37. package/dist/components/ui/card.js +3 -0
  38. package/dist/components/ui/card.js.map +1 -1
  39. package/dist/components/ui/checkbox.d.ts.map +1 -1
  40. package/dist/components/ui/checkbox.js +3 -0
  41. package/dist/components/ui/checkbox.js.map +1 -1
  42. package/dist/components/ui/collapsible.d.ts.map +1 -1
  43. package/dist/components/ui/collapsible.js +3 -0
  44. package/dist/components/ui/collapsible.js.map +1 -1
  45. package/dist/components/ui/command.d.ts.map +1 -1
  46. package/dist/components/ui/command.js +3 -0
  47. package/dist/components/ui/command.js.map +1 -1
  48. package/dist/components/ui/delete-button.d.ts.map +1 -1
  49. package/dist/components/ui/delete-button.js +3 -0
  50. package/dist/components/ui/delete-button.js.map +1 -1
  51. package/dist/components/ui/dialog.d.ts.map +1 -1
  52. package/dist/components/ui/dialog.js +3 -0
  53. package/dist/components/ui/dialog.js.map +1 -1
  54. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  55. package/dist/components/ui/dropdown-menu.js +3 -0
  56. package/dist/components/ui/dropdown-menu.js.map +1 -1
  57. package/dist/components/ui/input.d.ts.map +1 -1
  58. package/dist/components/ui/input.js +3 -0
  59. package/dist/components/ui/input.js.map +1 -1
  60. package/dist/components/ui/label.d.ts.map +1 -1
  61. package/dist/components/ui/label.js +3 -0
  62. package/dist/components/ui/label.js.map +1 -1
  63. package/dist/components/ui/readonly-banner.d.ts.map +1 -1
  64. package/dist/components/ui/readonly-banner.js +3 -0
  65. package/dist/components/ui/readonly-banner.js.map +1 -1
  66. package/dist/components/ui/resizable.d.ts.map +1 -1
  67. package/dist/components/ui/resizable.js +3 -0
  68. package/dist/components/ui/resizable.js.map +1 -1
  69. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  70. package/dist/components/ui/scroll-area.js +3 -0
  71. package/dist/components/ui/scroll-area.js.map +1 -1
  72. package/dist/components/ui/select.d.ts.map +1 -1
  73. package/dist/components/ui/select.js +3 -0
  74. package/dist/components/ui/select.js.map +1 -1
  75. package/dist/components/ui/separator.d.ts.map +1 -1
  76. package/dist/components/ui/separator.js +3 -0
  77. package/dist/components/ui/separator.js.map +1 -1
  78. package/dist/components/ui/switch.d.ts.map +1 -1
  79. package/dist/components/ui/switch.js +3 -0
  80. package/dist/components/ui/switch.js.map +1 -1
  81. package/dist/components/ui/textarea.d.ts.map +1 -1
  82. package/dist/components/ui/textarea.js +3 -0
  83. package/dist/components/ui/textarea.js.map +1 -1
  84. package/dist/components/ui/toast.d.ts.map +1 -1
  85. package/dist/components/ui/toast.js +3 -0
  86. package/dist/components/ui/toast.js.map +1 -1
  87. package/dist/components/ui/toaster.d.ts.map +1 -1
  88. package/dist/components/ui/toaster.js +3 -0
  89. package/dist/components/ui/toaster.js.map +1 -1
  90. package/dist/components/ui/toggle-group.d.ts.map +1 -1
  91. package/dist/components/ui/toggle-group.js +3 -0
  92. package/dist/components/ui/toggle-group.js.map +1 -1
  93. package/dist/components/ui/toggle.d.ts.map +1 -1
  94. package/dist/components/ui/toggle.js +3 -0
  95. package/dist/components/ui/toggle.js.map +1 -1
  96. package/dist/components/ui/tooltip.d.ts.map +1 -1
  97. package/dist/components/ui/tooltip.js +3 -0
  98. package/dist/components/ui/tooltip.js.map +1 -1
  99. package/dist/dialogs/NodePickerDialog.d.ts.map +1 -1
  100. package/dist/dialogs/NodePickerDialog.js +3 -0
  101. package/dist/dialogs/NodePickerDialog.js.map +1 -1
  102. package/dist/dialogs/ValidationDialog.d.ts.map +1 -1
  103. package/dist/dialogs/ValidationDialog.js +3 -0
  104. package/dist/dialogs/ValidationDialog.js.map +1 -1
  105. package/dist/graph/BaseNode.d.ts.map +1 -1
  106. package/dist/graph/BaseNode.js +11 -6
  107. package/dist/graph/BaseNode.js.map +1 -1
  108. package/dist/graph/CustomEdge.d.ts.map +1 -1
  109. package/dist/graph/CustomEdge.js +4 -1
  110. package/dist/graph/CustomEdge.js.map +1 -1
  111. package/dist/graph/CustomNode.d.ts.map +1 -1
  112. package/dist/graph/CustomNode.js +3 -0
  113. package/dist/graph/CustomNode.js.map +1 -1
  114. package/dist/graph/FunctionCallNode.d.ts.map +1 -1
  115. package/dist/graph/FunctionCallNode.js.map +1 -1
  116. package/dist/graph/PortHandle.d.ts.map +1 -1
  117. package/dist/graph/PortHandle.js.map +1 -1
  118. package/dist/graph/reactFlowRegistry.d.ts.map +1 -1
  119. package/dist/graph/reactFlowRegistry.js +3 -0
  120. package/dist/graph/reactFlowRegistry.js.map +1 -1
  121. package/dist/hooks/use-toast.d.ts.map +1 -1
  122. package/dist/hooks/use-toast.js +3 -0
  123. package/dist/hooks/use-toast.js.map +1 -1
  124. package/dist/hooks/useAvailableVariables.d.ts.map +1 -1
  125. package/dist/hooks/useAvailableVariables.js +3 -0
  126. package/dist/hooks/useAvailableVariables.js.map +1 -1
  127. package/dist/hooks/useCanvasHistory.d.ts.map +1 -1
  128. package/dist/hooks/useCanvasHistory.js +3 -0
  129. package/dist/hooks/useCanvasHistory.js.map +1 -1
  130. package/dist/hooks/useCanvasTabs.d.ts.map +1 -1
  131. package/dist/hooks/useCanvasTabs.js +3 -0
  132. package/dist/hooks/useCanvasTabs.js.map +1 -1
  133. package/dist/hooks/useFunctionDiagnosticsSync.d.ts.map +1 -1
  134. package/dist/hooks/useFunctionDiagnosticsSync.js +3 -0
  135. package/dist/hooks/useFunctionDiagnosticsSync.js.map +1 -1
  136. package/dist/hooks/useFunctionRegistry.d.ts.map +1 -1
  137. package/dist/hooks/useFunctionRegistry.js +3 -0
  138. package/dist/hooks/useFunctionRegistry.js.map +1 -1
  139. package/dist/hooks/useFunctions.d.ts.map +1 -1
  140. package/dist/hooks/useFunctions.js +3 -0
  141. package/dist/hooks/useFunctions.js.map +1 -1
  142. package/dist/hooks/useGraph.d.ts.map +1 -1
  143. package/dist/hooks/useGraph.js +3 -0
  144. package/dist/hooks/useGraph.js.map +1 -1
  145. package/dist/hooks/useNodeDefinitions.d.ts.map +1 -1
  146. package/dist/hooks/useNodeDefinitions.js +3 -0
  147. package/dist/hooks/useNodeDefinitions.js.map +1 -1
  148. package/dist/hooks/useParamErrors.d.ts.map +1 -1
  149. package/dist/hooks/useParamErrors.js +3 -0
  150. package/dist/hooks/useParamErrors.js.map +1 -1
  151. package/dist/hooks/useResolvedTheme.d.ts.map +1 -1
  152. package/dist/hooks/useResolvedTheme.js +3 -0
  153. package/dist/hooks/useResolvedTheme.js.map +1 -1
  154. package/dist/hooks/useResourceDiagnosticsSync.d.ts.map +1 -1
  155. package/dist/hooks/useResourceDiagnosticsSync.js +3 -0
  156. package/dist/hooks/useResourceDiagnosticsSync.js.map +1 -1
  157. package/dist/hooks/useSuppressThemeTransition.d.ts.map +1 -1
  158. package/dist/hooks/useSuppressThemeTransition.js +3 -0
  159. package/dist/hooks/useSuppressThemeTransition.js.map +1 -1
  160. package/dist/hooks/useWorkflowSerialization.d.ts.map +1 -1
  161. package/dist/hooks/useWorkflowSerialization.js +3 -0
  162. package/dist/hooks/useWorkflowSerialization.js.map +1 -1
  163. package/dist/i18n/index.d.ts.map +1 -1
  164. package/dist/i18n/index.js +3 -0
  165. package/dist/i18n/index.js.map +1 -1
  166. package/dist/index.d.ts +1 -1
  167. package/dist/index.d.ts.map +1 -1
  168. package/dist/index.js +3 -0
  169. package/dist/index.js.map +1 -1
  170. package/dist/inputs/ExpressionInput.d.ts.map +1 -1
  171. package/dist/inputs/ExpressionInput.js +3 -0
  172. package/dist/inputs/ExpressionInput.js.map +1 -1
  173. package/dist/inputs/ParameterEditor.d.ts.map +1 -1
  174. package/dist/inputs/ParameterEditor.js +3 -0
  175. package/dist/inputs/ParameterEditor.js.map +1 -1
  176. package/dist/inputs/PortSection.d.ts.map +1 -1
  177. package/dist/inputs/PortSection.js.map +1 -1
  178. package/dist/mode.d.ts +11 -0
  179. package/dist/mode.d.ts.map +1 -0
  180. package/dist/mode.js +8 -0
  181. package/dist/mode.js.map +1 -0
  182. package/dist/panels/BuilderSidebar.d.ts.map +1 -1
  183. package/dist/panels/BuilderSidebar.js +3 -0
  184. package/dist/panels/BuilderSidebar.js.map +1 -1
  185. package/dist/panels/ChannelConfigPanel.d.ts.map +1 -1
  186. package/dist/panels/ChannelConfigPanel.js +3 -0
  187. package/dist/panels/ChannelConfigPanel.js.map +1 -1
  188. package/dist/panels/ChannelsPanel.d.ts.map +1 -1
  189. package/dist/panels/ChannelsPanel.js +3 -0
  190. package/dist/panels/ChannelsPanel.js.map +1 -1
  191. package/dist/panels/DebugConsolePanel.d.ts.map +1 -1
  192. package/dist/panels/DebugConsolePanel.js +3 -0
  193. package/dist/panels/DebugConsolePanel.js.map +1 -1
  194. package/dist/panels/DebugContextPanel.d.ts.map +1 -1
  195. package/dist/panels/DebugContextPanel.js +3 -0
  196. package/dist/panels/DebugContextPanel.js.map +1 -1
  197. package/dist/panels/DebugExternalIOPanel.d.ts.map +1 -1
  198. package/dist/panels/DebugExternalIOPanel.js +3 -0
  199. package/dist/panels/DebugExternalIOPanel.js.map +1 -1
  200. package/dist/panels/DiagnosticsPanel.d.ts.map +1 -1
  201. package/dist/panels/DiagnosticsPanel.js +3 -0
  202. package/dist/panels/DiagnosticsPanel.js.map +1 -1
  203. package/dist/panels/EdgeConfigPanel.d.ts.map +1 -1
  204. package/dist/panels/EdgeConfigPanel.js +4 -1
  205. package/dist/panels/EdgeConfigPanel.js.map +1 -1
  206. package/dist/panels/FunctionConfigPanel.d.ts.map +1 -1
  207. package/dist/panels/FunctionConfigPanel.js +4 -1
  208. package/dist/panels/FunctionConfigPanel.js.map +1 -1
  209. package/dist/panels/FunctionListPanel.d.ts.map +1 -1
  210. package/dist/panels/FunctionListPanel.js +3 -0
  211. package/dist/panels/FunctionListPanel.js.map +1 -1
  212. package/dist/panels/MemoryConfigPanel.d.ts.map +1 -1
  213. package/dist/panels/MemoryConfigPanel.js +3 -0
  214. package/dist/panels/MemoryConfigPanel.js.map +1 -1
  215. package/dist/panels/MemoryPanel.d.ts.map +1 -1
  216. package/dist/panels/MemoryPanel.js +3 -0
  217. package/dist/panels/MemoryPanel.js.map +1 -1
  218. package/dist/panels/ModelConfigPanel.d.ts.map +1 -1
  219. package/dist/panels/ModelConfigPanel.js +3 -0
  220. package/dist/panels/ModelConfigPanel.js.map +1 -1
  221. package/dist/panels/ModelsPanel.d.ts.map +1 -1
  222. package/dist/panels/ModelsPanel.js +3 -0
  223. package/dist/panels/ModelsPanel.js.map +1 -1
  224. package/dist/panels/NodeConfigPanel.d.ts.map +1 -1
  225. package/dist/panels/NodeConfigPanel.js +4 -1
  226. package/dist/panels/NodeConfigPanel.js.map +1 -1
  227. package/dist/panels/NodeLibrary.d.ts.map +1 -1
  228. package/dist/panels/NodeLibrary.js +4 -1
  229. package/dist/panels/NodeLibrary.js.map +1 -1
  230. package/dist/panels/ResourceConfigPanel.d.ts.map +1 -1
  231. package/dist/panels/ResourceConfigPanel.js +4 -1
  232. package/dist/panels/ResourceConfigPanel.js.map +1 -1
  233. package/dist/panels/ResourceListPanel.d.ts.map +1 -1
  234. package/dist/panels/ResourceListPanel.js +4 -1
  235. package/dist/panels/ResourceListPanel.js.map +1 -1
  236. package/dist/panels/VariableConfigPanel.d.ts.map +1 -1
  237. package/dist/panels/VariableConfigPanel.js +4 -1
  238. package/dist/panels/VariableConfigPanel.js.map +1 -1
  239. package/dist/panels/VariablesPanel.d.ts.map +1 -1
  240. package/dist/panels/VariablesPanel.js +4 -1
  241. package/dist/panels/VariablesPanel.js.map +1 -1
  242. package/dist/stores/canvasStore.d.ts.map +1 -1
  243. package/dist/stores/canvasStore.js +3 -0
  244. package/dist/stores/canvasStore.js.map +1 -1
  245. package/dist/stores/debugStore.d.ts.map +1 -1
  246. package/dist/stores/debugStore.js +3 -0
  247. package/dist/stores/debugStore.js.map +1 -1
  248. package/dist/stores/diagnosticsStore.d.ts.map +1 -1
  249. package/dist/stores/diagnosticsStore.js +3 -0
  250. package/dist/stores/diagnosticsStore.js.map +1 -1
  251. package/dist/stores/editorStore.d.ts +1 -1
  252. package/dist/stores/editorStore.d.ts.map +1 -1
  253. package/dist/stores/editorStore.js +3 -0
  254. package/dist/stores/editorStore.js.map +1 -1
  255. package/dist/utils/categoryConstants.d.ts.map +1 -1
  256. package/dist/utils/categoryConstants.js +3 -0
  257. package/dist/utils/categoryConstants.js.map +1 -1
  258. package/dist/utils/channelOperations.d.ts.map +1 -1
  259. package/dist/utils/channelOperations.js +3 -0
  260. package/dist/utils/channelOperations.js.map +1 -1
  261. package/dist/utils/connectionRules.d.ts +3 -1
  262. package/dist/utils/connectionRules.d.ts.map +1 -1
  263. package/dist/utils/connectionRules.js +11 -16
  264. package/dist/utils/connectionRules.js.map +1 -1
  265. package/dist/utils/functionOperations.d.ts.map +1 -1
  266. package/dist/utils/functionOperations.js +3 -0
  267. package/dist/utils/functionOperations.js.map +1 -1
  268. package/dist/utils/graphOperations.d.ts.map +1 -1
  269. package/dist/utils/graphOperations.js +3 -0
  270. package/dist/utils/graphOperations.js.map +1 -1
  271. package/dist/utils/history.d.ts.map +1 -1
  272. package/dist/utils/history.js +4 -1
  273. package/dist/utils/history.js.map +1 -1
  274. package/dist/utils/memoryOperations.d.ts.map +1 -1
  275. package/dist/utils/memoryOperations.js +3 -0
  276. package/dist/utils/memoryOperations.js.map +1 -1
  277. package/dist/utils/migrateFunctionNodes.d.ts.map +1 -1
  278. package/dist/utils/migrateFunctionNodes.js +3 -0
  279. package/dist/utils/migrateFunctionNodes.js.map +1 -1
  280. package/dist/utils/modelOperations.d.ts.map +1 -1
  281. package/dist/utils/modelOperations.js +3 -0
  282. package/dist/utils/modelOperations.js.map +1 -1
  283. package/dist/utils/paramDisplay.d.ts.map +1 -1
  284. package/dist/utils/paramDisplay.js +3 -0
  285. package/dist/utils/paramDisplay.js.map +1 -1
  286. package/dist/utils/resourceHelpers.d.ts.map +1 -1
  287. package/dist/utils/resourceHelpers.js +3 -0
  288. package/dist/utils/resourceHelpers.js.map +1 -1
  289. package/dist/utils/translation.d.ts.map +1 -1
  290. package/dist/utils/translation.js +3 -0
  291. package/dist/utils/translation.js.map +1 -1
  292. package/dist/utils/variableOperations.d.ts.map +1 -1
  293. package/dist/utils/variableOperations.js +3 -0
  294. package/dist/utils/variableOperations.js.map +1 -1
  295. package/package.json +2 -2
  296. package/src/BuilderLayout.tsx +54 -61
  297. package/src/Canvas.tsx +12 -3
  298. package/src/CanvasEditor.tsx +4 -0
  299. package/src/CanvasTabsToolbar.tsx +4 -0
  300. package/src/RightConfigPanel.tsx +4 -0
  301. package/src/WorkflowBuilder.tsx +33 -18
  302. package/src/cn.ts +4 -0
  303. package/src/components/ui/add-button.tsx +4 -0
  304. package/src/components/ui/alert-dialog.tsx +4 -0
  305. package/src/components/ui/alert.tsx +4 -0
  306. package/src/components/ui/badge.tsx +4 -0
  307. package/src/components/ui/button.tsx +4 -0
  308. package/src/components/ui/card.tsx +4 -0
  309. package/src/components/ui/checkbox.tsx +4 -0
  310. package/src/components/ui/collapsible.tsx +4 -0
  311. package/src/components/ui/command.tsx +4 -0
  312. package/src/components/ui/delete-button.tsx +4 -0
  313. package/src/components/ui/dialog.tsx +4 -0
  314. package/src/components/ui/dropdown-menu.tsx +4 -0
  315. package/src/components/ui/input.tsx +4 -0
  316. package/src/components/ui/label.tsx +4 -0
  317. package/src/components/ui/readonly-banner.tsx +4 -0
  318. package/src/components/ui/resizable.tsx +4 -0
  319. package/src/components/ui/scroll-area.tsx +4 -0
  320. package/src/components/ui/select.tsx +4 -0
  321. package/src/components/ui/separator.tsx +4 -0
  322. package/src/components/ui/switch.tsx +4 -0
  323. package/src/components/ui/textarea.tsx +4 -0
  324. package/src/components/ui/toast.tsx +4 -0
  325. package/src/components/ui/toaster.tsx +4 -0
  326. package/src/components/ui/toggle-group.tsx +4 -0
  327. package/src/components/ui/toggle.tsx +4 -0
  328. package/src/components/ui/tooltip.tsx +4 -0
  329. package/src/dialogs/NodePickerDialog.tsx +4 -0
  330. package/src/dialogs/ValidationDialog.tsx +4 -0
  331. package/src/graph/BaseNode.tsx +12 -6
  332. package/src/graph/CustomEdge.tsx +5 -1
  333. package/src/graph/CustomNode.tsx +4 -0
  334. package/src/graph/FunctionCallNode.tsx +4 -0
  335. package/src/graph/PortHandle.tsx +4 -0
  336. package/src/graph/reactFlowRegistry.ts +4 -0
  337. package/src/hooks/use-toast.ts +4 -0
  338. package/src/hooks/useAvailableVariables.ts +4 -0
  339. package/src/hooks/useCanvasHistory.ts +4 -0
  340. package/src/hooks/useCanvasTabs.ts +4 -0
  341. package/src/hooks/useFunctionDiagnosticsSync.ts +4 -0
  342. package/src/hooks/useFunctionRegistry.ts +4 -0
  343. package/src/hooks/useFunctions.ts +4 -0
  344. package/src/hooks/useGraph.ts +4 -0
  345. package/src/hooks/useNodeDefinitions.ts +4 -0
  346. package/src/hooks/useParamErrors.ts +4 -0
  347. package/src/hooks/useResolvedTheme.ts +4 -0
  348. package/src/hooks/useResourceDiagnosticsSync.ts +4 -0
  349. package/src/hooks/useSuppressThemeTransition.ts +4 -0
  350. package/src/hooks/useWorkflowSerialization.ts +4 -0
  351. package/src/i18n/index.ts +4 -0
  352. package/src/index.ts +5 -1
  353. package/src/inputs/ExpressionInput.tsx +4 -0
  354. package/src/inputs/ParameterEditor.tsx +4 -0
  355. package/src/inputs/PortSection.tsx +4 -0
  356. package/src/mode.ts +15 -0
  357. package/src/panels/BuilderSidebar.tsx +4 -0
  358. package/src/panels/ChannelConfigPanel.tsx +4 -0
  359. package/src/panels/ChannelsPanel.tsx +4 -0
  360. package/src/panels/DebugConsolePanel.tsx +4 -0
  361. package/src/panels/DebugContextPanel.tsx +4 -0
  362. package/src/panels/DebugExternalIOPanel.tsx +4 -0
  363. package/src/panels/DiagnosticsPanel.tsx +4 -0
  364. package/src/panels/EdgeConfigPanel.tsx +5 -1
  365. package/src/panels/FunctionConfigPanel.tsx +5 -1
  366. package/src/panels/FunctionListPanel.tsx +4 -0
  367. package/src/panels/MemoryConfigPanel.tsx +4 -0
  368. package/src/panels/MemoryPanel.tsx +4 -0
  369. package/src/panels/ModelConfigPanel.tsx +4 -0
  370. package/src/panels/ModelsPanel.tsx +4 -0
  371. package/src/panels/NodeConfigPanel.tsx +5 -1
  372. package/src/panels/NodeLibrary.tsx +5 -1
  373. package/src/panels/ResourceConfigPanel.tsx +5 -1
  374. package/src/panels/ResourceListPanel.tsx +5 -1
  375. package/src/panels/VariableConfigPanel.tsx +5 -1
  376. package/src/panels/VariablesPanel.tsx +5 -1
  377. package/src/stores/canvasStore.test.ts +4 -0
  378. package/src/stores/canvasStore.ts +4 -0
  379. package/src/stores/debugStore.ts +4 -0
  380. package/src/stores/diagnosticsStore.ts +4 -0
  381. package/src/stores/editorStore.ts +5 -1
  382. package/src/utils/categoryConstants.ts +4 -0
  383. package/src/utils/channelOperations.ts +4 -0
  384. package/src/utils/connectionRules.ts +12 -9
  385. package/src/utils/functionOperations.ts +4 -0
  386. package/src/utils/graphOperations.ts +4 -0
  387. package/src/utils/history.test.ts +92 -0
  388. package/src/utils/history.ts +5 -1
  389. package/src/utils/memoryOperations.ts +4 -0
  390. package/src/utils/migrateFunctionNodes.ts +4 -0
  391. package/src/utils/modelOperations.ts +4 -0
  392. package/src/utils/paramDisplay.ts +4 -0
  393. package/src/utils/resourceHelpers.ts +4 -0
  394. package/src/utils/translation.ts +4 -0
  395. package/src/utils/variableOperations.ts +4 -0
  396. package/tailwind-preset.ts +4 -0
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Tooltip, TooltipContent, TooltipTrigger } from "../components/ui/tooltip";
2
6
  import { BaseEdge, EdgeLabelRenderer, getBezierPath, Position, useEdges } from "@xyflow/react";
3
7
  import { AlertTriangle } from "lucide-react";
@@ -6,7 +10,7 @@ import { useEffect, useMemo } from "react";
6
10
  import { useAvailableVariables } from "../hooks/useAvailableVariables";
7
11
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
8
12
  import { useEditorStore } from "../stores/editorStore";
9
- import { isReadOnly } from "../WorkflowBuilder";
13
+ import { isReadOnly } from "../mode";
10
14
  import { computeEdgeDiagnostics } from "@foresthubai/workflow-core/diagnostics";
11
15
 
12
16
  const EDGE_BASE_COLOR = "hsl(var(--edge-default))";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { NodeData, NodeRegistry } from "@foresthubai/workflow-core/node";
2
6
  import { NodeProps } from "@xyflow/react";
3
7
  import { memo, useMemo } from "react";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { FunctionCallNode as DomainFunctionCallNode } from "@foresthubai/workflow-core/node";
2
6
  import { NodeProps } from "@xyflow/react";
3
7
  import { memo, useMemo } from "react";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import React from "react";
2
6
  import { Handle, Position } from "@xyflow/react";
3
7
  import { Plus } from "lucide-react";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  // ReactFlow node/edge type registries
2
6
  // Maps ReactFlow type strings to the React components that render them.
3
7
  // Shared between CanvasArea (editor) and VersionPreviewCanvas (read-only preview).
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  // Standard shadcn toast hook + dispatcher
2
6
  import * as React from "react";
3
7
 
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useMemo } from "react";
2
6
  import { getOrCreateCanvasStore, MAIN_CANVAS_ID } from "../stores/canvasStore";
3
7
  import { computeAvailableVariables } from "@foresthubai/workflow-core/variable";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { getOrCreateCanvasStore, MAIN_CANVAS_ID } from "../stores/canvasStore";
2
6
 
3
7
  /**
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useState, useCallback, useEffect } from "react";
2
6
  import { MAIN_CANVAS_ID } from "../stores/canvasStore";
3
7
  import { useEditorStore } from "../stores/editorStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect } from "react";
2
6
  import { validateFunction } from "@foresthubai/workflow-core/diagnostics";
3
7
  import { computeAvailableVariables } from "@foresthubai/workflow-core/variable";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useCallback, useMemo } from "react";
2
6
  import { useEditorStore } from "../stores/editorStore";
3
7
  import type { FunctionDeclaration } from "@foresthubai/workflow-core/function";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useCallback } from "react";
2
6
  import { useEditorStore } from "../stores/editorStore";
3
7
  import { getOrCreateCanvasStore } from "../stores/canvasStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { NodeDefinition, NodeData } from "@foresthubai/workflow-core/node";
2
6
  import { Connection, Edge, Node } from "@xyflow/react";
3
7
  import type { EdgeData } from "@foresthubai/workflow-core/edge";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useMemo, useCallback } from "react";
2
6
  import i18n from "../i18n";
3
7
  import { NodeCategory, NodeRegistry, NodeDefinition, NodeData } from "@foresthubai/workflow-core/node";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useMemo } from "react";
2
6
  import type { Diagnostic } from "@foresthubai/workflow-core/diagnostics";
3
7
 
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect, useState } from "react";
2
6
 
3
7
  /**
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect } from "react";
2
6
  import { useEditorStore } from "../stores/editorStore";
3
7
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect, useLayoutEffect } from "react";
2
6
 
3
7
  import { useResolvedTheme } from "./useResolvedTheme";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useCallback } from "react";
2
6
  import { serialize, deserialize, type ApiWorkflow, type Workflow, type Canvas } from "@foresthubai/workflow-core/workflow";
3
7
  import { migrate } from "@foresthubai/workflow-core/migration";
package/src/i18n/index.ts CHANGED
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import i18next, { type i18n as I18n } from "i18next";
2
6
 
3
7
  import de from "./locales/de.json";
package/src/index.ts CHANGED
@@ -1,9 +1,13 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  // Main component + its contract
2
6
  export { WorkflowBuilder } from "./WorkflowBuilder";
3
7
  export type { WorkflowBuilderProps, WorkflowBuilderHandle } from "./WorkflowBuilder";
4
8
 
5
9
  // Editor mode the embedder constructs and passes via setMode / initialMode
6
- export type { BuilderMode } from "./WorkflowBuilder";
10
+ export type { BuilderMode } from "./mode";
7
11
 
8
12
  // Debug phase the embedder pushes from the engine via setDebugPhase
9
13
  export type { DebugSessionPhase } from "./stores/debugStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useState, useRef, useEffect, useCallback, useMemo } from "react";
2
6
  import { useTranslation } from "react-i18next";
3
7
  import { NodeRegistry } from "@foresthubai/workflow-core/node";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Input } from "../components/ui/input";
2
6
  import { Textarea } from "../components/ui/textarea";
3
7
  import { Label } from "../components/ui/label";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import type { ReactNode } from "react";
2
6
  import { Button } from "../components/ui/button";
3
7
  import { Input } from "../components/ui/input";
package/src/mode.ts ADDED
@@ -0,0 +1,15 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
5
+ // Leaf module on purpose: BuilderMode is consumed across the whole tree
6
+ // (panels, graph, stores), so it must not live in WorkflowBuilder.tsx —
7
+ // importing it from there creates module cycles back through the root.
8
+
9
+ /** BuilderMode steers the overall behavior of the workflow builder. */
10
+ export type BuilderMode = { type: "edit" } | { type: "preview" } | { type: "debug" };
11
+
12
+ /** True when canvas mutations should be blocked (preview or debug). */
13
+ export function isReadOnly(mode: BuilderMode): boolean {
14
+ return mode.type !== "edit";
15
+ }
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Button } from "../components/ui/button";
2
6
  import { ScrollArea } from "../components/ui/scroll-area";
3
7
  import { Tooltip, TooltipContent, TooltipTrigger } from "../components/ui/tooltip";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { CHANNEL_DEFINITION, type Channel, type ChannelType } from "@foresthubai/workflow-core/channel";
3
7
  import { isParameterActive, type Parameter } from "@foresthubai/workflow-core/parameter";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { Cpu, Plus } from "lucide-react";
3
7
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Button } from "../components/ui/button";
2
6
  import { ScrollArea } from "../components/ui/scroll-area";
3
7
  import { Trash2 } from "lucide-react";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Input } from "../components/ui/input";
2
6
  import { Label } from "../components/ui/label";
3
7
  import { Switch } from "../components/ui/switch";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Button } from "../components/ui/button";
2
6
  import { Input } from "../components/ui/input";
3
7
  import { Label } from "../components/ui/label";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useState } from "react";
2
6
  import { useTranslation } from "react-i18next";
3
7
  import { Badge } from "../components/ui/badge";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useCallback } from "react";
2
6
  import { useTranslation } from "react-i18next";
3
7
  import { Button } from "../components/ui/button";
@@ -7,7 +11,7 @@ import { getEdgeDefinition } from "@foresthubai/workflow-core/edge";
7
11
  import type { EdgeData, EdgeType } from "@foresthubai/workflow-core/edge";
8
12
  import ParameterEditor from "../inputs/ParameterEditor";
9
13
  import { useEditorStore } from "../stores/editorStore";
10
- import { isReadOnly } from "../WorkflowBuilder";
14
+ import { isReadOnly } from "../mode";
11
15
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
12
16
  import { useParamErrors } from "../hooks/useParamErrors";
13
17
  import { ReadOnlyBanner } from "../components/ui/readonly-banner";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect, useMemo, useState } from "react";
2
6
  import { useTranslation } from "react-i18next";
3
7
  import { Button } from "../components/ui/button";
@@ -16,7 +20,7 @@ import { ChevronRight } from "lucide-react";
16
20
  import type { FunctionDeclaration } from "@foresthubai/workflow-core/function";
17
21
  import { useEditorStore } from "../stores/editorStore";
18
22
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
19
- import { isReadOnly } from "../WorkflowBuilder";
23
+ import { isReadOnly } from "../mode";
20
24
  import { ReadOnlyBanner } from "../components/ui/readonly-banner";
21
25
  import { DeleteButton } from "../components/ui/delete-button";
22
26
  import { PortSection } from "../inputs/PortSection";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { FunctionSquare, Plus } from "lucide-react";
3
7
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { MemoryRegistry, type Memory } from "@foresthubai/workflow-core/memory";
3
7
  import { useEditorStore } from "../stores/editorStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { Database, FileText } from "lucide-react";
3
7
  import type { MemoryType } from "@foresthubai/workflow-core/memory";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { ModelRegistry, type Model } from "@foresthubai/workflow-core/model";
3
7
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useTranslation } from "react-i18next";
2
6
  import { BrainCircuit, Plus } from "lucide-react";
3
7
  import { useDiagnosticsStore } from "../stores/diagnosticsStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Button } from "../components/ui/button";
2
6
  import { AddButton } from "../components/ui/add-button";
3
7
  import { ReadOnlyBanner } from "../components/ui/readonly-banner";
@@ -33,7 +37,7 @@ import { useFunctionRegistry } from "../hooks/useFunctionRegistry";
33
37
  import { useParamErrors } from "../hooks/useParamErrors";
34
38
  import { buildFunctionNodeDef } from "../hooks/useNodeDefinitions";
35
39
  import { useEditorStore } from "../stores/editorStore";
36
- import { isReadOnly } from "../WorkflowBuilder";
40
+ import { isReadOnly } from "../mode";
37
41
  import { migrateFunctionCallNodes } from "../utils/migrateFunctionNodes";
38
42
  import { getNodeDescription } from "../utils/translation";
39
43
  import { useAvailableVariables } from "../hooks/useAvailableVariables";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { Badge } from "../components/ui/badge";
2
6
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "../components/ui/collapsible";
3
7
  import { Input } from "../components/ui/input";
@@ -13,7 +17,7 @@ import { useTranslation } from "react-i18next";
13
17
  import { NodeDefinition } from "@foresthubai/workflow-core/node";
14
18
  import { categoryIcons, categoryColors } from "../utils/categoryConstants";
15
19
  import { useEditorStore } from "../stores/editorStore";
16
- import { isReadOnly } from "../WorkflowBuilder";
20
+ import { isReadOnly } from "../mode";
17
21
  import { FunctionNodeDefinition } from "@foresthubai/workflow-core/node";
18
22
  import { Parameter } from "@foresthubai/workflow-core/parameter";
19
23
  import { getNodeDescription } from "../utils/translation";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect, useState, type ReactNode } from "react";
2
6
  import { Button } from "../components/ui/button";
3
7
  import { Separator } from "../components/ui/separator";
@@ -7,7 +11,7 @@ import type { Diagnostic } from "@foresthubai/workflow-core/diagnostics";
7
11
  import ParameterEditor from "../inputs/ParameterEditor";
8
12
  import { MAIN_CANVAS_ID } from "../stores/canvasStore";
9
13
  import { useEditorStore } from "../stores/editorStore";
10
- import { isReadOnly } from "../WorkflowBuilder";
14
+ import { isReadOnly } from "../mode";
11
15
  import { useParamErrors } from "../hooks/useParamErrors";
12
16
  import { ReadOnlyBanner } from "../components/ui/readonly-banner";
13
17
  import { DeleteButton } from "../components/ui/delete-button";
@@ -1,8 +1,12 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { AlertTriangle, type LucideIcon } from "lucide-react";
2
6
  import { AddButton } from "../components/ui/add-button";
3
7
  import { cn } from "../cn";
4
8
  import { useEditorStore } from "../stores/editorStore";
5
- import { isReadOnly } from "../WorkflowBuilder";
9
+ import { isReadOnly } from "../mode";
6
10
  import type { Diagnostic } from "@foresthubai/workflow-core/diagnostics";
7
11
 
8
12
  interface ResourceListItem {
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { useEffect, useState } from "react";
2
6
  import { useTranslation } from "react-i18next";
3
7
  import { Button } from "../components/ui/button";
@@ -8,7 +12,7 @@ import { ChevronRight } from "lucide-react";
8
12
  import type { DeclaredVariable } from "@foresthubai/workflow-core/variable";
9
13
  import type { DataType } from "@foresthubai/workflow-core";
10
14
  import { useEditorStore } from "../stores/editorStore";
11
- import { isReadOnly } from "../WorkflowBuilder";
15
+ import { isReadOnly } from "../mode";
12
16
  import { ReadOnlyBanner } from "../components/ui/readonly-banner";
13
17
  import { DeleteButton } from "../components/ui/delete-button";
14
18
  import { deleteDeclaredVariable, setDeclaredVariableType, updateDeclaredVariable } from "../utils/variableOperations";
@@ -1,10 +1,14 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import React from "react";
2
6
  import { useTranslation } from "react-i18next";
3
7
  import { AddButton } from "../components/ui/add-button";
4
8
  import { Variable as VariableIcon } from "lucide-react";
5
9
  import { cn } from "../cn";
6
10
  import { useEditorStore } from "../stores/editorStore";
7
- import { isReadOnly } from "../WorkflowBuilder";
11
+ import { isReadOnly } from "../mode";
8
12
  import { useAvailableVariables } from "../hooks/useAvailableVariables";
9
13
  import { getOrCreateCanvasStore, MAIN_CANVAS_ID } from "../stores/canvasStore";
10
14
  import { type Variable, type DeclaredVariable } from "@foresthubai/workflow-core/variable";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { afterEach, describe, expect, it } from "vitest";
2
6
  import {
3
7
  clearAllCanvasStores,
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { create, UseBoundStore, StoreApi } from "zustand";
2
6
  import { Node, Edge, Viewport } from "@xyflow/react";
3
7
  import { NodeCategory, type NodeData } from "@foresthubai/workflow-core/node";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { create } from "zustand";
2
6
 
3
7
  // ---------------------------------------------------------------------------
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  /**
2
6
  * diagnosticsStore.ts
3
7
  *
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { create } from "zustand";
2
6
  import { getCanvasStore, getOrCreateCanvasStore, MAIN_CANVAS_ID } from "./canvasStore";
3
7
  import type { Channel } from "@foresthubai/workflow-core/channel";
@@ -5,7 +9,7 @@ import type { Memory } from "@foresthubai/workflow-core/memory";
5
9
  import type { Model, ModelInfo } from "@foresthubai/workflow-core/model";
6
10
  import type { FunctionDeclaration } from "@foresthubai/workflow-core/function";
7
11
 
8
- import type { BuilderMode } from "../WorkflowBuilder";
12
+ import type { BuilderMode } from "../mode";
9
13
  // Type-only (erased) — the active left-sidebar tab lives here so non-sidebar code
10
14
  // (e.g. validation navigation) can open a specific panel. No runtime cycle.
11
15
  import type { SidebarTab } from "../panels/BuilderSidebar";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  // Shared category icons and colors for node categories in the workflow builder.
2
6
 
3
7
  import { NodeCategory } from "@foresthubai/workflow-core/node";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  import { CHANNEL_DEFINITION, type ChannelType, type Channel } from "@foresthubai/workflow-core/channel";
2
6
  import { isParameterActive } from "@foresthubai/workflow-core/parameter";
3
7
  import { useEditorStore } from "../stores/editorStore";
@@ -1,3 +1,7 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (c) 2026 ForestHub. All rights reserved.
3
+ // For commercial licensing, contact root@foresthub.ai
4
+
1
5
  // Editor connection rules — which ports may connect, which node types are
2
6
  // offered from a port, and whether a node can take another outgoing edge.
3
7
  //
@@ -33,24 +37,23 @@ function hasControlFlowEdge(nodeId: string, nodeData: NodeData, edges: Edge[]):
33
37
  /**
34
38
  * Check whether an output port can accept at least one more outgoing edge.
35
39
  * Used by the contextual "+" button on output ports.
40
+ * Takes the node's own data rather than the nodes array so per-node components
41
+ * (BaseNode) can call it without subscribing to all nodes.
36
42
  */
37
- export function canPortAcceptEdge(nodeId: string, handleId: string, nodes: Node<NodeData>[], edges: Edge[]): boolean {
38
- const node = nodes.find((n) => n.id === nodeId);
39
- if (!node) return false;
40
-
41
- const ports = getPorts(node.data);
43
+ export function canPortAcceptEdge(nodeData: NodeData, handleId: string, edges: Edge[]): boolean {
44
+ const ports = getPorts(nodeData);
42
45
  const port = ports.output.find((p) => p.id === handleId);
43
46
  if (!port) return false;
44
47
 
45
48
  // Tool output ports always accept multiple edges (an agent wires up many tools).
46
49
  // A control output port accepts a single edge unless the node can branch.
47
- if (port.type === "control" && !NodeRegistry.getByType(node.data.type)?.canBranch) {
48
- if (edges.some((e) => e.source === nodeId && e.sourceHandle === handleId)) return false;
50
+ if (port.type === "control" && !NodeRegistry.getByType(nodeData.type)?.canBranch) {
51
+ if (edges.some((e) => e.source === nodeData.id && e.sourceHandle === handleId)) return false;
49
52
  }
50
53
 
51
54
  // Mutual exclusion: control output blocked when node has tool-input edges
52
55
  // (Tool output is exempt — never blocked)
53
- if (port.type === "control" && hasToolInputEdge(nodeId, node.data, edges)) return false;
56
+ if (port.type === "control" && hasToolInputEdge(nodeData.id, nodeData, edges)) return false;
54
57
 
55
58
  return true;
56
59
  }
@@ -107,7 +110,7 @@ export const isValidConnection = (
107
110
  if (!srcNode || !tgtNode) return false;
108
111
 
109
112
  // Source-side checks via canPortAcceptEdge (multiple-outgoing + mutual exclusion)
110
- if (!canPortAcceptEdge(sourceId, sourceHandleId, nodes, edges)) return false;
113
+ if (!canPortAcceptEdge(srcNode.data, sourceHandleId, edges)) return false;
111
114
 
112
115
  // Get ports using centralized dispatcher
113
116
  const sourcePorts = getPorts(srcNode.data);