@foresthubai/workflow-builder 0.4.4 → 0.4.6

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 +18 -12
  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 +6 -6
  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 -1
  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 +19 -11
  332. package/src/graph/CustomEdge.tsx +7 -5
  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 -1
  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 { 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);
@@ -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 { Expression } from "@foresthubai/workflow-core";
2
6
  import type { DataType } from "@foresthubai/workflow-core/parameter";
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 {
2
6
  NodeBase,
3
7
  NodeCategory,
@@ -0,0 +1,92 @@
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
+ import { describe, it, expect, beforeEach } from "vitest";
6
+ import { create } from "zustand";
7
+ import { history } from "./history";
8
+
9
+ interface CounterState {
10
+ count: number;
11
+ label: string;
12
+ setCount: (n: number) => void;
13
+ }
14
+
15
+ // A store on DEFAULT config — no custom equality/partialize — so the default
16
+ // equality path is what's under test.
17
+ function makeStore() {
18
+ return create(
19
+ history<CounterState>()((set) => ({
20
+ count: 0,
21
+ label: "a",
22
+ setCount: (n) => set((s) => ({ ...s, count: n })),
23
+ })),
24
+ );
25
+ }
26
+
27
+ describe("history middleware (default config)", () => {
28
+ let store: ReturnType<typeof makeStore>;
29
+ beforeEach(() => {
30
+ store = makeStore();
31
+ });
32
+
33
+ it("withCheckpoint records a checkpoint when the operation changes state", () => {
34
+ store.getState().withCheckpoint(() => store.getState().setCount(1));
35
+ expect(store.getState().count).toBe(1);
36
+ expect(store.getState().canUndo()).toBe(true);
37
+
38
+ store.getState().undo();
39
+ expect(store.getState().count).toBe(0);
40
+ expect(store.getState().canRedo()).toBe(true);
41
+
42
+ store.getState().redo();
43
+ expect(store.getState().count).toBe(1);
44
+ });
45
+
46
+ it("withCheckpoint does NOT record a checkpoint for a no-op", () => {
47
+ store.getState().withCheckpoint(() => {});
48
+ expect(store.getState().canUndo()).toBe(false);
49
+ });
50
+
51
+ it("a no-op withCheckpoint preserves the redo stack", () => {
52
+ store.getState().withCheckpoint(() => store.getState().setCount(1));
53
+ store.getState().undo();
54
+ expect(store.getState().canRedo()).toBe(true);
55
+
56
+ store.getState().withCheckpoint(() => {});
57
+ expect(store.getState().canRedo()).toBe(true);
58
+ });
59
+
60
+ it("a real change clears the redo stack", () => {
61
+ store.getState().withCheckpoint(() => store.getState().setCount(1));
62
+ store.getState().undo();
63
+ store.getState().withCheckpoint(() => store.getState().setCount(7));
64
+ expect(store.getState().canRedo()).toBe(false);
65
+ });
66
+
67
+ it("withCheckpoint returns the operation's result and propagates throws without a checkpoint", () => {
68
+ expect(store.getState().withCheckpoint(() => 42)).toBe(42);
69
+ expect(() =>
70
+ store.getState().withCheckpoint(() => {
71
+ throw new Error("boom");
72
+ }),
73
+ ).toThrow("boom");
74
+ expect(store.getState().canUndo()).toBe(false);
75
+ });
76
+
77
+ it("mutationCount ticks on checkpointed changes only", () => {
78
+ const before = store.getState().mutationCount;
79
+ store.getState().withCheckpoint(() => {});
80
+ expect(store.getState().mutationCount).toBe(before);
81
+ store.getState().withCheckpoint(() => store.getState().setCount(5));
82
+ expect(store.getState().mutationCount).toBe(before + 1);
83
+ });
84
+
85
+ it("takeCheckpoint always records, and clearHistory empties both stacks", () => {
86
+ store.getState().takeCheckpoint();
87
+ expect(store.getState().canUndo()).toBe(true);
88
+ store.getState().clearHistory();
89
+ expect(store.getState().canUndo()).toBe(false);
90
+ expect(store.getState().canRedo()).toBe(false);
91
+ });
92
+ });
@@ -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 { StateCreator, StoreMutatorIdentifier } from "zustand";
2
6
 
3
7
  // Opaque type for exporting/importing history state
@@ -99,7 +103,7 @@ export const history =
99
103
  const {
100
104
  limit = 50,
101
105
  partialize = (state) => state,
102
- equality = (before, after) => JSON.stringify(before) !== JSON.stringify(after),
106
+ equality = (before, after) => JSON.stringify(before) === JSON.stringify(after),
103
107
  } = config;
104
108
 
105
109
  return (set, get, store) => {
@@ -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 { MemoryRegistry, type MemoryType, type Memory } from "@foresthubai/workflow-core/memory";
2
6
  import { useEditorStore } from "../stores/editorStore";
3
7
  import { generateId } from "@foresthubai/workflow-core/id";
@@ -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 { OutputBinding, FunctionCallNode } from "@foresthubai/workflow-core/node";
2
6
  import type { Expression } from "@foresthubai/workflow-core";
3
7
  import { toast } from "../hooks/use-toast";
@@ -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 { ModelRegistry, type ModelType, type Model } from "@foresthubai/workflow-core/model";
2
6
  import { useEditorStore } from "../stores/editorStore";
3
7
  import { generateId } from "@foresthubai/workflow-core/id";
@@ -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
  // Presentation-only formatters for inline node display. These render domain
2
6
  // values to human-readable text; they live in the builder (not headless
3
7
  // workflow-core) because formatting for display is an editor concern.
@@ -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 { Parameter } from "@foresthubai/workflow-core/parameter";
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 type { TFunction } from "i18next";
2
6
  import type { NodeDefinition } from "@foresthubai/workflow-core/node";
3
7
  import 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 { declaredVarKey, type DeclaredVariable } from "@foresthubai/workflow-core/variable";
2
6
  import type { DataType } from "@foresthubai/workflow-core";
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 type { Config } from "tailwindcss";
2
6
  import animate from "tailwindcss-animate";
3
7