@mindlogic-ai/logician-ui 3.1.0 → 3.2.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/dist/components/Icon/_constants/iconList.d.ts +1 -1
  2. package/dist/components/Icon/_constants/iconList.d.ts.map +1 -1
  3. package/dist/components/Icon/_constants/iconList.js +18 -0
  4. package/dist/components/Icon/_constants/iconList.js.map +1 -1
  5. package/dist/components/Icon/_constants/iconList.mjs +20 -2
  6. package/dist/components/Icon/_constants/iconList.mjs.map +1 -1
  7. package/dist/components/Icon/index.d.ts +2 -1
  8. package/dist/components/Icon/index.d.ts.map +1 -1
  9. package/dist/components/Icon/index.js +20 -1
  10. package/dist/components/Icon/index.js.map +1 -1
  11. package/dist/components/Icon/index.mjs +4 -2
  12. package/dist/components/Icon/index.mjs.map +1 -1
  13. package/dist/components/Workflow/Workflow.d.ts +3 -0
  14. package/dist/components/Workflow/Workflow.d.ts.map +1 -0
  15. package/dist/components/Workflow/Workflow.js +109 -0
  16. package/dist/components/Workflow/Workflow.js.map +1 -0
  17. package/dist/components/Workflow/Workflow.mjs +107 -0
  18. package/dist/components/Workflow/Workflow.mjs.map +1 -0
  19. package/dist/components/Workflow/Workflow.translations.json.js +164 -0
  20. package/dist/components/Workflow/Workflow.translations.json.js.map +1 -0
  21. package/dist/components/Workflow/Workflow.translations.json.mjs +138 -0
  22. package/dist/components/Workflow/Workflow.translations.json.mjs.map +1 -0
  23. package/dist/components/Workflow/Workflow.types.d.ts +435 -0
  24. package/dist/components/Workflow/Workflow.types.d.ts.map +1 -0
  25. package/dist/components/Workflow/Workflow.types.js +19 -0
  26. package/dist/components/Workflow/Workflow.types.js.map +1 -0
  27. package/dist/components/Workflow/Workflow.types.mjs +16 -0
  28. package/dist/components/Workflow/Workflow.types.mjs.map +1 -0
  29. package/dist/components/Workflow/WorkflowContext/WorkflowContext.d.ts +10 -0
  30. package/dist/components/Workflow/WorkflowContext/WorkflowContext.d.ts.map +1 -0
  31. package/dist/components/Workflow/WorkflowContext/WorkflowContext.js +163 -0
  32. package/dist/components/Workflow/WorkflowContext/WorkflowContext.js.map +1 -0
  33. package/dist/components/Workflow/WorkflowContext/WorkflowContext.mjs +159 -0
  34. package/dist/components/Workflow/WorkflowContext/WorkflowContext.mjs.map +1 -0
  35. package/dist/components/Workflow/WorkflowContext/WorkflowContext.types.d.ts +117 -0
  36. package/dist/components/Workflow/WorkflowContext/WorkflowContext.types.d.ts.map +1 -0
  37. package/dist/components/Workflow/WorkflowContext/index.d.ts +3 -0
  38. package/dist/components/Workflow/WorkflowContext/index.d.ts.map +1 -0
  39. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.d.ts +19 -0
  40. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.d.ts.map +1 -0
  41. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.js +44 -0
  42. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.js.map +1 -0
  43. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.mjs +42 -0
  44. package/dist/components/Workflow/canvas/Canvas/BranchLabelBadge.mjs.map +1 -0
  45. package/dist/components/Workflow/canvas/Canvas/Canvas.d.ts +10 -0
  46. package/dist/components/Workflow/canvas/Canvas/Canvas.d.ts.map +1 -0
  47. package/dist/components/Workflow/canvas/Canvas/Canvas.js +531 -0
  48. package/dist/components/Workflow/canvas/Canvas/Canvas.js.map +1 -0
  49. package/dist/components/Workflow/canvas/Canvas/Canvas.mjs +529 -0
  50. package/dist/components/Workflow/canvas/Canvas/Canvas.mjs.map +1 -0
  51. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.d.ts +53 -0
  52. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.d.ts.map +1 -0
  53. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.js +96 -0
  54. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.js.map +1 -0
  55. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.mjs +93 -0
  56. package/dist/components/Workflow/canvas/Canvas/Canvas.styles.mjs.map +1 -0
  57. package/dist/components/Workflow/canvas/Canvas/CanvasControls.d.ts +27 -0
  58. package/dist/components/Workflow/canvas/Canvas/CanvasControls.d.ts.map +1 -0
  59. package/dist/components/Workflow/canvas/Canvas/CanvasControls.js +70 -0
  60. package/dist/components/Workflow/canvas/Canvas/CanvasControls.js.map +1 -0
  61. package/dist/components/Workflow/canvas/Canvas/CanvasControls.mjs +68 -0
  62. package/dist/components/Workflow/canvas/Canvas/CanvasControls.mjs.map +1 -0
  63. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.d.ts +10 -0
  64. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.d.ts.map +1 -0
  65. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.js +106 -0
  66. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.js.map +1 -0
  67. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.mjs +104 -0
  68. package/dist/components/Workflow/canvas/Canvas/LabeledEdge.mjs.map +1 -0
  69. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.d.ts +13 -0
  70. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.d.ts.map +1 -0
  71. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.js +18 -0
  72. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.js.map +1 -0
  73. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.mjs +16 -0
  74. package/dist/components/Workflow/canvas/Canvas/edgeLabelVariant.mjs.map +1 -0
  75. package/dist/components/Workflow/canvas/Canvas/index.d.ts +2 -0
  76. package/dist/components/Workflow/canvas/Canvas/index.d.ts.map +1 -0
  77. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.d.ts +30 -0
  78. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.d.ts.map +1 -0
  79. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.js +34 -0
  80. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.js.map +1 -0
  81. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.mjs +32 -0
  82. package/dist/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.mjs.map +1 -0
  83. package/dist/components/Workflow/canvas/CollapsibleSection/index.d.ts +2 -0
  84. package/dist/components/Workflow/canvas/CollapsibleSection/index.d.ts.map +1 -0
  85. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.d.ts +37 -0
  86. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.d.ts.map +1 -0
  87. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.js +33 -0
  88. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.js.map +1 -0
  89. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.mjs +31 -0
  90. package/dist/components/Workflow/canvas/DrawerShell/DrawerHeader.mjs.map +1 -0
  91. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.d.ts +16 -0
  92. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.d.ts.map +1 -0
  93. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.js +54 -0
  94. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.js.map +1 -0
  95. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.mjs +52 -0
  96. package/dist/components/Workflow/canvas/DrawerShell/DrawerIssues.mjs.map +1 -0
  97. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.d.ts +27 -0
  98. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.d.ts.map +1 -0
  99. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.js +178 -0
  100. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.js.map +1 -0
  101. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.mjs +176 -0
  102. package/dist/components/Workflow/canvas/DrawerShell/DrawerShell.mjs.map +1 -0
  103. package/dist/components/Workflow/canvas/DrawerShell/index.d.ts +3 -0
  104. package/dist/components/Workflow/canvas/DrawerShell/index.d.ts.map +1 -0
  105. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.d.ts +12 -0
  106. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.d.ts.map +1 -0
  107. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.js +68 -0
  108. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.js.map +1 -0
  109. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.mjs +66 -0
  110. package/dist/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.mjs.map +1 -0
  111. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.d.ts +19 -0
  112. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.d.ts.map +1 -0
  113. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.js +35 -0
  114. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.js.map +1 -0
  115. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.mjs +32 -0
  116. package/dist/components/Workflow/canvas/EdgeInspector/endpointTitle.mjs.map +1 -0
  117. package/dist/components/Workflow/canvas/EdgeInspector/index.d.ts +3 -0
  118. package/dist/components/Workflow/canvas/EdgeInspector/index.d.ts.map +1 -0
  119. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.d.ts +54 -0
  120. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.d.ts.map +1 -0
  121. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.js +56 -0
  122. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.js.map +1 -0
  123. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.mjs +54 -0
  124. package/dist/components/Workflow/canvas/FieldWrapper/FieldWrapper.mjs.map +1 -0
  125. package/dist/components/Workflow/canvas/FieldWrapper/index.d.ts +3 -0
  126. package/dist/components/Workflow/canvas/FieldWrapper/index.d.ts.map +1 -0
  127. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.d.ts +16 -0
  128. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.d.ts.map +1 -0
  129. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.js +25 -0
  130. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.js.map +1 -0
  131. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.mjs +22 -0
  132. package/dist/components/Workflow/canvas/FloatingCard/FloatingCard.mjs.map +1 -0
  133. package/dist/components/Workflow/canvas/FloatingCard/index.d.ts +2 -0
  134. package/dist/components/Workflow/canvas/FloatingCard/index.d.ts.map +1 -0
  135. package/dist/components/Workflow/canvas/GenericNode/GenericNode.d.ts +14 -0
  136. package/dist/components/Workflow/canvas/GenericNode/GenericNode.d.ts.map +1 -0
  137. package/dist/components/Workflow/canvas/GenericNode/GenericNode.js +61 -0
  138. package/dist/components/Workflow/canvas/GenericNode/GenericNode.js.map +1 -0
  139. package/dist/components/Workflow/canvas/GenericNode/GenericNode.mjs +59 -0
  140. package/dist/components/Workflow/canvas/GenericNode/GenericNode.mjs.map +1 -0
  141. package/dist/components/Workflow/canvas/GenericNode/GenericNode.types.d.ts +11 -0
  142. package/dist/components/Workflow/canvas/GenericNode/GenericNode.types.d.ts.map +1 -0
  143. package/dist/components/Workflow/canvas/GenericNode/index.d.ts +3 -0
  144. package/dist/components/Workflow/canvas/GenericNode/index.d.ts.map +1 -0
  145. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.d.ts +15 -0
  146. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.d.ts.map +1 -0
  147. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.js +145 -0
  148. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.js.map +1 -0
  149. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.mjs +143 -0
  150. package/dist/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.mjs.map +1 -0
  151. package/dist/components/Workflow/canvas/GraphErrorBanner/index.d.ts +2 -0
  152. package/dist/components/Workflow/canvas/GraphErrorBanner/index.d.ts.map +1 -0
  153. package/dist/components/Workflow/canvas/IconTile/IconTile.d.ts +10 -0
  154. package/dist/components/Workflow/canvas/IconTile/IconTile.d.ts.map +1 -0
  155. package/dist/components/Workflow/canvas/IconTile/IconTile.js +21 -0
  156. package/dist/components/Workflow/canvas/IconTile/IconTile.js.map +1 -0
  157. package/dist/components/Workflow/canvas/IconTile/IconTile.mjs +19 -0
  158. package/dist/components/Workflow/canvas/IconTile/IconTile.mjs.map +1 -0
  159. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.d.ts +18 -0
  160. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.d.ts.map +1 -0
  161. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.js +40 -0
  162. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.js.map +1 -0
  163. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.mjs +37 -0
  164. package/dist/components/Workflow/canvas/IconTile/IconTile.styles.mjs.map +1 -0
  165. package/dist/components/Workflow/canvas/IconTile/IconTile.types.d.ts +15 -0
  166. package/dist/components/Workflow/canvas/IconTile/IconTile.types.d.ts.map +1 -0
  167. package/dist/components/Workflow/canvas/IconTile/index.d.ts +4 -0
  168. package/dist/components/Workflow/canvas/IconTile/index.d.ts.map +1 -0
  169. package/dist/components/Workflow/canvas/IssueList/IssueList.d.ts +24 -0
  170. package/dist/components/Workflow/canvas/IssueList/IssueList.d.ts.map +1 -0
  171. package/dist/components/Workflow/canvas/IssueList/IssueList.js +34 -0
  172. package/dist/components/Workflow/canvas/IssueList/IssueList.js.map +1 -0
  173. package/dist/components/Workflow/canvas/IssueList/IssueList.mjs +32 -0
  174. package/dist/components/Workflow/canvas/IssueList/IssueList.mjs.map +1 -0
  175. package/dist/components/Workflow/canvas/IssueList/index.d.ts +2 -0
  176. package/dist/components/Workflow/canvas/IssueList/index.d.ts.map +1 -0
  177. package/dist/components/Workflow/canvas/NodePalette/NodePalette.d.ts +9 -0
  178. package/dist/components/Workflow/canvas/NodePalette/NodePalette.d.ts.map +1 -0
  179. package/dist/components/Workflow/canvas/NodePalette/NodePalette.js +94 -0
  180. package/dist/components/Workflow/canvas/NodePalette/NodePalette.js.map +1 -0
  181. package/dist/components/Workflow/canvas/NodePalette/NodePalette.mjs +92 -0
  182. package/dist/components/Workflow/canvas/NodePalette/NodePalette.mjs.map +1 -0
  183. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.d.ts +7 -0
  184. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.d.ts.map +1 -0
  185. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.js +13 -0
  186. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.js.map +1 -0
  187. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.mjs +10 -0
  188. package/dist/components/Workflow/canvas/NodePalette/NodePalette.styles.mjs.map +1 -0
  189. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.d.ts +10 -0
  190. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.d.ts.map +1 -0
  191. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.js +28 -0
  192. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.js.map +1 -0
  193. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.mjs +26 -0
  194. package/dist/components/Workflow/canvas/NodePalette/NodePaletteToggle.mjs.map +1 -0
  195. package/dist/components/Workflow/canvas/NodePalette/index.d.ts +4 -0
  196. package/dist/components/Workflow/canvas/NodePalette/index.d.ts.map +1 -0
  197. package/dist/components/Workflow/canvas/NodeShell/NodeShell.d.ts +3 -0
  198. package/dist/components/Workflow/canvas/NodeShell/NodeShell.d.ts.map +1 -0
  199. package/dist/components/Workflow/canvas/NodeShell/NodeShell.js +137 -0
  200. package/dist/components/Workflow/canvas/NodeShell/NodeShell.js.map +1 -0
  201. package/dist/components/Workflow/canvas/NodeShell/NodeShell.mjs +135 -0
  202. package/dist/components/Workflow/canvas/NodeShell/NodeShell.mjs.map +1 -0
  203. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.d.ts +66 -0
  204. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.d.ts.map +1 -0
  205. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.js +87 -0
  206. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.js.map +1 -0
  207. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.mjs +77 -0
  208. package/dist/components/Workflow/canvas/NodeShell/NodeShell.styles.mjs.map +1 -0
  209. package/dist/components/Workflow/canvas/NodeShell/NodeShell.types.d.ts +35 -0
  210. package/dist/components/Workflow/canvas/NodeShell/NodeShell.types.d.ts.map +1 -0
  211. package/dist/components/Workflow/canvas/NodeShell/index.d.ts +4 -0
  212. package/dist/components/Workflow/canvas/NodeShell/index.d.ts.map +1 -0
  213. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.d.ts +15 -0
  214. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.d.ts.map +1 -0
  215. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.js +14 -0
  216. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.js.map +1 -0
  217. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.mjs +12 -0
  218. package/dist/components/Workflow/canvas/SeverityDot/SeverityDot.mjs.map +1 -0
  219. package/dist/components/Workflow/canvas/SeverityDot/index.d.ts +2 -0
  220. package/dist/components/Workflow/canvas/SeverityDot/index.d.ts.map +1 -0
  221. package/dist/components/Workflow/canvas/issueSeverity.d.ts +23 -0
  222. package/dist/components/Workflow/canvas/issueSeverity.d.ts.map +1 -0
  223. package/dist/components/Workflow/canvas/issueSeverity.js +51 -0
  224. package/dist/components/Workflow/canvas/issueSeverity.js.map +1 -0
  225. package/dist/components/Workflow/canvas/issueSeverity.mjs +47 -0
  226. package/dist/components/Workflow/canvas/issueSeverity.mjs.map +1 -0
  227. package/dist/components/Workflow/canvas/useFieldFocusRequest.d.ts +14 -0
  228. package/dist/components/Workflow/canvas/useFieldFocusRequest.d.ts.map +1 -0
  229. package/dist/components/Workflow/canvas/useFieldFocusRequest.js +48 -0
  230. package/dist/components/Workflow/canvas/useFieldFocusRequest.js.map +1 -0
  231. package/dist/components/Workflow/canvas/useFieldFocusRequest.mjs +46 -0
  232. package/dist/components/Workflow/canvas/useFieldFocusRequest.mjs.map +1 -0
  233. package/dist/components/Workflow/canvas/workflowLabelProps.d.ts +12 -0
  234. package/dist/components/Workflow/canvas/workflowLabelProps.d.ts.map +1 -0
  235. package/dist/components/Workflow/canvas/workflowLabelProps.js +17 -0
  236. package/dist/components/Workflow/canvas/workflowLabelProps.js.map +1 -0
  237. package/dist/components/Workflow/canvas/workflowLabelProps.mjs +15 -0
  238. package/dist/components/Workflow/canvas/workflowLabelProps.mjs.map +1 -0
  239. package/dist/components/Workflow/connectionRules.d.ts +59 -0
  240. package/dist/components/Workflow/connectionRules.d.ts.map +1 -0
  241. package/dist/components/Workflow/connectionRules.js +150 -0
  242. package/dist/components/Workflow/connectionRules.js.map +1 -0
  243. package/dist/components/Workflow/connectionRules.mjs +145 -0
  244. package/dist/components/Workflow/connectionRules.mjs.map +1 -0
  245. package/dist/components/Workflow/createNode.d.ts +27 -0
  246. package/dist/components/Workflow/createNode.d.ts.map +1 -0
  247. package/dist/components/Workflow/createNode.js +66 -0
  248. package/dist/components/Workflow/createNode.js.map +1 -0
  249. package/dist/components/Workflow/createNode.mjs +62 -0
  250. package/dist/components/Workflow/createNode.mjs.map +1 -0
  251. package/dist/components/Workflow/graphHistory.d.ts +23 -0
  252. package/dist/components/Workflow/graphHistory.d.ts.map +1 -0
  253. package/dist/components/Workflow/graphHistory.js +73 -0
  254. package/dist/components/Workflow/graphHistory.js.map +1 -0
  255. package/dist/components/Workflow/graphHistory.mjs +70 -0
  256. package/dist/components/Workflow/graphHistory.mjs.map +1 -0
  257. package/dist/components/Workflow/graphObserver.d.ts +13 -0
  258. package/dist/components/Workflow/graphObserver.d.ts.map +1 -0
  259. package/dist/components/Workflow/graphObserver.js +11 -0
  260. package/dist/components/Workflow/graphObserver.js.map +1 -0
  261. package/dist/components/Workflow/graphObserver.mjs +8 -0
  262. package/dist/components/Workflow/graphObserver.mjs.map +1 -0
  263. package/dist/components/Workflow/graphReducer.d.ts +75 -0
  264. package/dist/components/Workflow/graphReducer.d.ts.map +1 -0
  265. package/dist/components/Workflow/graphReducer.js +122 -0
  266. package/dist/components/Workflow/graphReducer.js.map +1 -0
  267. package/dist/components/Workflow/graphReducer.mjs +119 -0
  268. package/dist/components/Workflow/graphReducer.mjs.map +1 -0
  269. package/dist/components/Workflow/index.d.ts +22 -0
  270. package/dist/components/Workflow/index.d.ts.map +1 -0
  271. package/dist/components/Workflow/layout/autoLayout.d.ts +49 -0
  272. package/dist/components/Workflow/layout/autoLayout.d.ts.map +1 -0
  273. package/dist/components/Workflow/layout/autoLayout.js +149 -0
  274. package/dist/components/Workflow/layout/autoLayout.js.map +1 -0
  275. package/dist/components/Workflow/layout/autoLayout.mjs +146 -0
  276. package/dist/components/Workflow/layout/autoLayout.mjs.map +1 -0
  277. package/dist/components/Workflow/stories/toyNodeTypes.d.ts +40 -0
  278. package/dist/components/Workflow/stories/toyNodeTypes.d.ts.map +1 -0
  279. package/dist/components/Workflow/useWorkflowIssueMessage.d.ts +15 -0
  280. package/dist/components/Workflow/useWorkflowIssueMessage.d.ts.map +1 -0
  281. package/dist/components/Workflow/useWorkflowIssueMessage.js +45 -0
  282. package/dist/components/Workflow/useWorkflowIssueMessage.js.map +1 -0
  283. package/dist/components/Workflow/useWorkflowIssueMessage.mjs +43 -0
  284. package/dist/components/Workflow/useWorkflowIssueMessage.mjs.map +1 -0
  285. package/dist/components/Workflow/useWorkflowKeyboard.d.ts +10 -0
  286. package/dist/components/Workflow/useWorkflowKeyboard.d.ts.map +1 -0
  287. package/dist/components/Workflow/useWorkflowKeyboard.js +116 -0
  288. package/dist/components/Workflow/useWorkflowKeyboard.js.map +1 -0
  289. package/dist/components/Workflow/useWorkflowKeyboard.mjs +114 -0
  290. package/dist/components/Workflow/useWorkflowKeyboard.mjs.map +1 -0
  291. package/dist/icons.js +17 -0
  292. package/dist/icons.js.map +1 -1
  293. package/dist/icons.mjs +1 -1
  294. package/dist/index.d.ts +1 -0
  295. package/dist/index.d.ts.map +1 -1
  296. package/dist/index.js +38 -0
  297. package/dist/index.js.map +1 -1
  298. package/dist/index.mjs +14 -0
  299. package/dist/index.mjs.map +1 -1
  300. package/dist/test-support/setup.d.ts +5 -0
  301. package/dist/test-support/setup.d.ts.map +1 -0
  302. package/package.json +10 -2
  303. package/src/components/Icon/_constants/iconList.ts +35 -0
  304. package/src/components/Icon/index.tsx +20 -0
  305. package/src/components/Workflow/README.md +362 -0
  306. package/src/components/Workflow/Workflow.translations.json +112 -0
  307. package/src/components/Workflow/Workflow.tsx +189 -0
  308. package/src/components/Workflow/Workflow.types.ts +496 -0
  309. package/src/components/Workflow/WorkflowContext/WorkflowContext.tsx +215 -0
  310. package/src/components/Workflow/WorkflowContext/WorkflowContext.types.ts +122 -0
  311. package/src/components/Workflow/WorkflowContext/index.ts +10 -0
  312. package/src/components/Workflow/WorkflowContext/workflowSelection.test.tsx +93 -0
  313. package/src/components/Workflow/canvas/Canvas/BranchLabelBadge.tsx +69 -0
  314. package/src/components/Workflow/canvas/Canvas/Canvas.styles.ts +91 -0
  315. package/src/components/Workflow/canvas/Canvas/Canvas.tsx +773 -0
  316. package/src/components/Workflow/canvas/Canvas/CanvasControls.tsx +178 -0
  317. package/src/components/Workflow/canvas/Canvas/LabeledEdge.tsx +198 -0
  318. package/src/components/Workflow/canvas/Canvas/edgeLabelVariant.test.ts +26 -0
  319. package/src/components/Workflow/canvas/Canvas/edgeLabelVariant.ts +23 -0
  320. package/src/components/Workflow/canvas/Canvas/index.ts +1 -0
  321. package/src/components/Workflow/canvas/CollapsibleSection/CollapsibleSection.tsx +96 -0
  322. package/src/components/Workflow/canvas/CollapsibleSection/index.ts +4 -0
  323. package/src/components/Workflow/canvas/DrawerShell/DrawerHeader.tsx +104 -0
  324. package/src/components/Workflow/canvas/DrawerShell/DrawerIssues.tsx +115 -0
  325. package/src/components/Workflow/canvas/DrawerShell/DrawerShell.tsx +408 -0
  326. package/src/components/Workflow/canvas/DrawerShell/index.ts +2 -0
  327. package/src/components/Workflow/canvas/EdgeInspector/BuiltInEdgeInspector.tsx +135 -0
  328. package/src/components/Workflow/canvas/EdgeInspector/endpointTitle.ts +38 -0
  329. package/src/components/Workflow/canvas/EdgeInspector/index.ts +2 -0
  330. package/src/components/Workflow/canvas/FieldWrapper/FieldWrapper.tsx +118 -0
  331. package/src/components/Workflow/canvas/FieldWrapper/index.ts +6 -0
  332. package/src/components/Workflow/canvas/FloatingCard/FloatingCard.tsx +37 -0
  333. package/src/components/Workflow/canvas/FloatingCard/index.ts +1 -0
  334. package/src/components/Workflow/canvas/GenericNode/GenericNode.tsx +114 -0
  335. package/src/components/Workflow/canvas/GenericNode/GenericNode.types.ts +10 -0
  336. package/src/components/Workflow/canvas/GenericNode/index.ts +5 -0
  337. package/src/components/Workflow/canvas/GraphErrorBanner/GraphErrorBanner.tsx +284 -0
  338. package/src/components/Workflow/canvas/GraphErrorBanner/index.ts +1 -0
  339. package/src/components/Workflow/canvas/IconTile/IconTile.styles.ts +40 -0
  340. package/src/components/Workflow/canvas/IconTile/IconTile.tsx +36 -0
  341. package/src/components/Workflow/canvas/IconTile/IconTile.types.ts +13 -0
  342. package/src/components/Workflow/canvas/IconTile/index.ts +7 -0
  343. package/src/components/Workflow/canvas/IssueList/IssueList.tsx +84 -0
  344. package/src/components/Workflow/canvas/IssueList/index.ts +1 -0
  345. package/src/components/Workflow/canvas/NodePalette/NodePalette.styles.ts +7 -0
  346. package/src/components/Workflow/canvas/NodePalette/NodePalette.tsx +180 -0
  347. package/src/components/Workflow/canvas/NodePalette/NodePaletteToggle.tsx +39 -0
  348. package/src/components/Workflow/canvas/NodePalette/index.ts +3 -0
  349. package/src/components/Workflow/canvas/NodeShell/NodeShell.styles.ts +84 -0
  350. package/src/components/Workflow/canvas/NodeShell/NodeShell.tsx +321 -0
  351. package/src/components/Workflow/canvas/NodeShell/NodeShell.types.ts +45 -0
  352. package/src/components/Workflow/canvas/NodeShell/index.ts +8 -0
  353. package/src/components/Workflow/canvas/SeverityDot/SeverityDot.tsx +33 -0
  354. package/src/components/Workflow/canvas/SeverityDot/index.ts +1 -0
  355. package/src/components/Workflow/canvas/issueSeverity.ts +48 -0
  356. package/src/components/Workflow/canvas/useFieldFocusRequest.ts +54 -0
  357. package/src/components/Workflow/canvas/workflowLabelProps.ts +11 -0
  358. package/src/components/Workflow/connectionRules.test.ts +326 -0
  359. package/src/components/Workflow/connectionRules.ts +190 -0
  360. package/src/components/Workflow/createNode.test.ts +61 -0
  361. package/src/components/Workflow/createNode.ts +67 -0
  362. package/src/components/Workflow/graphHistory.test.ts +178 -0
  363. package/src/components/Workflow/graphHistory.ts +91 -0
  364. package/src/components/Workflow/graphObserver.ts +21 -0
  365. package/src/components/Workflow/graphReducer.test.ts +314 -0
  366. package/src/components/Workflow/graphReducer.ts +196 -0
  367. package/src/components/Workflow/index.ts +74 -0
  368. package/src/components/Workflow/layout/autoLayout.test.ts +170 -0
  369. package/src/components/Workflow/layout/autoLayout.ts +200 -0
  370. package/src/components/Workflow/stories/Workflow.stories.tsx +111 -0
  371. package/src/components/Workflow/stories/toyNodeTypes.tsx +146 -0
  372. package/src/components/Workflow/useWorkflowIssueMessage.test.ts +101 -0
  373. package/src/components/Workflow/useWorkflowIssueMessage.ts +49 -0
  374. package/src/components/Workflow/useWorkflowKeyboard.ts +126 -0
  375. package/src/index.ts +1 -0
  376. package/src/test-support/setup.ts +11 -0
@@ -0,0 +1,178 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { historyReducer, initHistory, MAX_HISTORY } from './graphHistory';
4
+ import { emptyGraph } from './graphReducer';
5
+ import type { GraphNode } from './Workflow.types';
6
+
7
+ const node = (id: string): GraphNode => ({
8
+ id,
9
+ kind: 'x',
10
+ position: { x: 0, y: 0 },
11
+ config: {},
12
+ });
13
+
14
+ describe('historyReducer', () => {
15
+ it('records a step and undoes it', () => {
16
+ const start = initHistory(emptyGraph);
17
+ const added = historyReducer(start, { type: 'addNode', node: node('n1') });
18
+ expect(added.present.nodes).toHaveLength(1);
19
+ expect(added.past).toHaveLength(1);
20
+
21
+ const undone = historyReducer(added, { type: 'undo' });
22
+ expect(undone.present.nodes).toHaveLength(0);
23
+ expect(undone.future).toHaveLength(1);
24
+ });
25
+
26
+ it('redoes an undone step', () => {
27
+ let state = initHistory(emptyGraph);
28
+ state = historyReducer(state, { type: 'addNode', node: node('n1') });
29
+ state = historyReducer(state, { type: 'undo' });
30
+ state = historyReducer(state, { type: 'redo' });
31
+ expect(state.present.nodes).toHaveLength(1);
32
+ expect(state.future).toHaveLength(0);
33
+ });
34
+
35
+ it('is a no-op when there is nothing to undo or redo', () => {
36
+ const start = initHistory(emptyGraph);
37
+ expect(historyReducer(start, { type: 'undo' })).toBe(start);
38
+ expect(historyReducer(start, { type: 'redo' })).toBe(start);
39
+ });
40
+
41
+ it('drops the redo stack once a new edit lands', () => {
42
+ let state = initHistory(emptyGraph);
43
+ state = historyReducer(state, { type: 'addNode', node: node('n1') });
44
+ state = historyReducer(state, { type: 'undo' });
45
+ expect(state.future).toHaveLength(1);
46
+ state = historyReducer(state, { type: 'addNode', node: node('n2') });
47
+ expect(state.future).toHaveLength(0);
48
+ });
49
+
50
+ it('coalesces consecutive config edits to the same node', () => {
51
+ let state = initHistory({ nodes: [node('n1')], edges: [] });
52
+ state = historyReducer(state, {
53
+ type: 'updateNodeConfig',
54
+ id: 'n1',
55
+ config: { v: 1 },
56
+ });
57
+ state = historyReducer(state, {
58
+ type: 'updateNodeConfig',
59
+ id: 'n1',
60
+ config: { v: 2 },
61
+ });
62
+ // Two edits to one node = one undo step back to the original config.
63
+ expect(state.past).toHaveLength(1);
64
+ const undone = historyReducer(state, { type: 'undo' });
65
+ expect(undone.present.nodes[0].config).toEqual({});
66
+ });
67
+
68
+ it('coalesces consecutive label edits to the same edge and undoes them', () => {
69
+ let state = initHistory({
70
+ nodes: [node('a'), node('b')],
71
+ edges: [{ id: 'e', source: 'a', target: 'b' }],
72
+ });
73
+ state = historyReducer(state, {
74
+ type: 'updateEdge',
75
+ id: 'e',
76
+ patch: { label: 'y' },
77
+ });
78
+ state = historyReducer(state, {
79
+ type: 'updateEdge',
80
+ id: 'e',
81
+ patch: { label: 'ye' },
82
+ });
83
+ state = historyReducer(state, {
84
+ type: 'updateEdge',
85
+ id: 'e',
86
+ patch: { label: 'yes' },
87
+ });
88
+ // Three keystrokes to one edge collapse into a single undo step.
89
+ expect(state.past).toHaveLength(1);
90
+ expect(state.present.edges[0].label).toBe('yes');
91
+ const undone = historyReducer(state, { type: 'undo' });
92
+ expect(undone.present.edges[0].label).toBeUndefined();
93
+ });
94
+
95
+ it('does not coalesce edits to different nodes', () => {
96
+ let state = initHistory({ nodes: [node('n1'), node('n2')], edges: [] });
97
+ state = historyReducer(state, {
98
+ type: 'updateNodeConfig',
99
+ id: 'n1',
100
+ config: { v: 1 },
101
+ });
102
+ state = historyReducer(state, {
103
+ type: 'updateNodeConfig',
104
+ id: 'n2',
105
+ config: { v: 1 },
106
+ });
107
+ expect(state.past).toHaveLength(2);
108
+ });
109
+
110
+ it('does not record a step for a no-op action', () => {
111
+ let state = initHistory(emptyGraph);
112
+ state = historyReducer(state, { type: 'addNode', node: node('n1') });
113
+ // Re-adding an existing id is a no-op in graphReducer (same reference) —
114
+ // it must not push a history step.
115
+ const after = historyReducer(state, {
116
+ type: 'addNode',
117
+ node: node('n1'),
118
+ });
119
+ expect(after).toBe(state);
120
+ });
121
+
122
+ it('clears history on replace', () => {
123
+ let state = initHistory(emptyGraph);
124
+ state = historyReducer(state, { type: 'addNode', node: node('n1') });
125
+ state = historyReducer(state, {
126
+ type: 'replace',
127
+ graph: { nodes: [node('n2')], edges: [] },
128
+ });
129
+ expect(state.past).toHaveLength(0);
130
+ expect(state.future).toHaveLength(0);
131
+ expect(historyReducer(state, { type: 'undo' })).toBe(state);
132
+ });
133
+
134
+ it('records an arrange as one undo step without clearing prior history', () => {
135
+ let state = initHistory({ nodes: [node('n1')], edges: [] });
136
+ // A real edit first, so we can prove the arrange preserves it.
137
+ state = historyReducer(state, {
138
+ type: 'updateNodeConfig',
139
+ id: 'n1',
140
+ config: { v: 1 },
141
+ });
142
+ state = historyReducer(state, {
143
+ type: 'arrangeNodes',
144
+ positions: { n1: { x: 200, y: 100 } },
145
+ });
146
+ // Two distinct undo steps (the edit + the arrange) — unlike `replace`,
147
+ // which would have reset the stack.
148
+ expect(state.past).toHaveLength(2);
149
+ expect(state.present.nodes[0].position).toEqual({ x: 200, y: 100 });
150
+ // One undo reverts just the arrange; the config edit survives.
151
+ const undone = historyReducer(state, { type: 'undo' });
152
+ expect(undone.present.nodes[0].position).toEqual({ x: 0, y: 0 });
153
+ expect(undone.present.nodes[0].config).toEqual({ v: 1 });
154
+ });
155
+
156
+ it('caps the past stack at MAX_HISTORY', () => {
157
+ let state = initHistory(emptyGraph);
158
+ for (let i = 0; i < MAX_HISTORY + 10; i++) {
159
+ state = historyReducer(state, { type: 'addNode', node: node(`n${i}`) });
160
+ }
161
+ expect(state.past).toHaveLength(MAX_HISTORY);
162
+ });
163
+
164
+ it('reverts an auto-connected node and its edge together in one undo', () => {
165
+ let state = initHistory({ nodes: [node('a')], edges: [] });
166
+ state = historyReducer(state, {
167
+ type: 'addNodeWithEdge',
168
+ node: { id: 'b', kind: 'agent', position: { x: 100, y: 0 }, config: {} },
169
+ autoConnectFrom: { edge: { id: 'e1', source: 'a', target: 'b' } },
170
+ });
171
+ expect(state.present.nodes).toHaveLength(2);
172
+ expect(state.present.edges).toHaveLength(1);
173
+ // A single undo must remove BOTH the node and the auto-created edge.
174
+ state = historyReducer(state, { type: 'undo' });
175
+ expect(state.present.nodes).toHaveLength(1);
176
+ expect(state.present.edges).toHaveLength(0);
177
+ });
178
+ });
@@ -0,0 +1,91 @@
1
+ import { type GraphAction, graphReducer } from './graphReducer';
2
+ import type { Graph } from './Workflow.types';
3
+
4
+ /** Max retained undo steps. Older steps are dropped once exceeded. */
5
+ export const MAX_HISTORY = 50;
6
+
7
+ export type HistoryState = {
8
+ past: Graph[];
9
+ present: Graph;
10
+ future: Graph[];
11
+ /**
12
+ * Coalescing key of the action that produced `present`. A new action with
13
+ * the same key merges into the current step instead of pushing a new one,
14
+ * so a burst of edits to one node stays a single undo unit.
15
+ */
16
+ lastKey: string | null;
17
+ };
18
+
19
+ export type HistoryAction = GraphAction | { type: 'undo' } | { type: 'redo' };
20
+
21
+ export const initHistory = (graph: Graph): HistoryState => ({
22
+ past: [],
23
+ present: graph,
24
+ future: [],
25
+ lastKey: null,
26
+ });
27
+
28
+ /**
29
+ * Key used to collapse a run of edits into one undo step. `updateNodeConfig`
30
+ * / `updateNodePosition` targeting the same node coalesce (typing a prompt or
31
+ * dragging a node is one undo); structural actions return `null` (never
32
+ * coalesce).
33
+ */
34
+ const coalesceKey = (action: GraphAction): string | null => {
35
+ switch (action.type) {
36
+ case 'updateNodeConfig':
37
+ case 'updateNodePosition':
38
+ case 'updateEdge':
39
+ return `${action.type}:${action.id}`;
40
+ default:
41
+ return null;
42
+ }
43
+ };
44
+
45
+ export function historyReducer(
46
+ state: HistoryState,
47
+ action: HistoryAction
48
+ ): HistoryState {
49
+ if (action.type === 'undo') {
50
+ if (state.past.length === 0) return state;
51
+ return {
52
+ past: state.past.slice(0, -1),
53
+ present: state.past[state.past.length - 1],
54
+ future: [state.present, ...state.future],
55
+ lastKey: null,
56
+ };
57
+ }
58
+
59
+ if (action.type === 'redo') {
60
+ if (state.future.length === 0) return state;
61
+ const [next, ...rest] = state.future;
62
+ return {
63
+ past: [...state.past, state.present],
64
+ present: next,
65
+ future: rest,
66
+ lastKey: null,
67
+ };
68
+ }
69
+
70
+ const present = graphReducer(state.present, action);
71
+ // Pure no-op actions (dedupe guards, unknown ids) must not create history.
72
+ if (present === state.present) return state;
73
+
74
+ // `replace` is an external resync (draft load, server push), not a user
75
+ // edit — it establishes a fresh baseline, so history is cleared.
76
+ if (action.type === 'replace') {
77
+ return { past: [], present, future: [], lastKey: null };
78
+ }
79
+
80
+ const key = coalesceKey(action);
81
+ if (key !== null && key === state.lastKey) {
82
+ return { ...state, present };
83
+ }
84
+
85
+ return {
86
+ past: [...state.past, state.present].slice(-MAX_HISTORY),
87
+ present,
88
+ future: [],
89
+ lastKey: key,
90
+ };
91
+ }
@@ -0,0 +1,21 @@
1
+ 'use client';
2
+
3
+ import { createContext, useContext } from 'react';
4
+
5
+ import type { Graph } from './Workflow.types';
6
+
7
+ /**
8
+ * Optional ancestor-provided hook to observe an uncontrolled <Workflow>'s
9
+ * graph without taking over its state (which `graph` + `onGraphChange` would).
10
+ *
11
+ * Used by the Storybook JSON-preview decorator so every story can render the
12
+ * serialized graph payload. No provider exists in production, so <Workflow>
13
+ * treats it as a no-op.
14
+ */
15
+ export type WorkflowGraphObserver = (graph: Graph) => void;
16
+
17
+ export const WorkflowGraphObserverContext =
18
+ createContext<WorkflowGraphObserver | null>(null);
19
+
20
+ export const useWorkflowGraphObserver = () =>
21
+ useContext(WorkflowGraphObserverContext);
@@ -0,0 +1,314 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { emptyGraph, graphReducer } from './graphReducer';
4
+ import type { Graph } from './Workflow.types';
5
+
6
+ describe('graphReducer', () => {
7
+ it('adds and removes a node', () => {
8
+ const afterAdd = graphReducer(emptyGraph, {
9
+ type: 'addNode',
10
+ node: { id: 'n1', kind: 'x', position: { x: 0, y: 0 }, config: {} },
11
+ });
12
+ expect(afterAdd.nodes).toHaveLength(1);
13
+ const afterDelete = graphReducer(afterAdd, {
14
+ type: 'deleteNode',
15
+ id: 'n1',
16
+ });
17
+ expect(afterDelete.nodes).toHaveLength(0);
18
+ });
19
+
20
+ it('deduplicates node ids', () => {
21
+ const base = graphReducer(emptyGraph, {
22
+ type: 'addNode',
23
+ node: { id: 'n1', kind: 'x', position: { x: 0, y: 0 }, config: {} },
24
+ });
25
+ const after = graphReducer(base, {
26
+ type: 'addNode',
27
+ node: { id: 'n1', kind: 'x', position: { x: 0, y: 0 }, config: {} },
28
+ });
29
+ expect(after).toBe(base);
30
+ });
31
+
32
+ it('arranges nodes to the given positions', () => {
33
+ const g: Graph = {
34
+ nodes: [
35
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
36
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
37
+ ],
38
+ edges: [],
39
+ };
40
+ const after = graphReducer(g, {
41
+ type: 'arrangeNodes',
42
+ positions: { a: { x: 10, y: 20 }, b: { x: 30, y: 40 } },
43
+ });
44
+ expect(after.nodes).toEqual([
45
+ { id: 'a', kind: 'x', position: { x: 10, y: 20 }, config: {} },
46
+ { id: 'b', kind: 'x', position: { x: 30, y: 40 }, config: {} },
47
+ ]);
48
+ });
49
+
50
+ it('keeps a node missing from the arrange map at its current position', () => {
51
+ const g: Graph = {
52
+ nodes: [
53
+ { id: 'a', kind: 'x', position: { x: 1, y: 1 }, config: {} },
54
+ { id: 'b', kind: 'x', position: { x: 2, y: 2 }, config: {} },
55
+ ],
56
+ edges: [],
57
+ };
58
+ const after = graphReducer(g, {
59
+ type: 'arrangeNodes',
60
+ positions: { a: { x: 10, y: 20 } },
61
+ });
62
+ expect(after.nodes[0].position).toEqual({ x: 10, y: 20 });
63
+ expect(after.nodes[1].position).toEqual({ x: 2, y: 2 });
64
+ });
65
+
66
+ it('is a no-op (same reference) when an arrange moves nothing', () => {
67
+ const g: Graph = {
68
+ nodes: [{ id: 'a', kind: 'x', position: { x: 5, y: 5 }, config: {} }],
69
+ edges: [],
70
+ };
71
+ const after = graphReducer(g, {
72
+ type: 'arrangeNodes',
73
+ positions: { a: { x: 5, y: 5 } },
74
+ });
75
+ expect(after).toBe(g);
76
+ });
77
+
78
+ it('deleting a node cascades its edges', () => {
79
+ const g = {
80
+ nodes: [
81
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
82
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
83
+ ],
84
+ edges: [{ id: 'e', source: 'a', target: 'b' }],
85
+ };
86
+ const after = graphReducer(g, { type: 'deleteNode', id: 'a' });
87
+ expect(after.edges).toHaveLength(0);
88
+ });
89
+
90
+ it('updates node config and position immutably', () => {
91
+ const g = graphReducer(emptyGraph, {
92
+ type: 'addNode',
93
+ node: { id: 'n', kind: 'x', position: { x: 0, y: 0 }, config: { v: 1 } },
94
+ });
95
+ const moved = graphReducer(g, {
96
+ type: 'updateNodePosition',
97
+ id: 'n',
98
+ position: { x: 5, y: 5 },
99
+ });
100
+ expect(moved.nodes[0].position).toEqual({ x: 5, y: 5 });
101
+ expect(g.nodes[0].position).toEqual({ x: 0, y: 0 });
102
+
103
+ const updated = graphReducer(moved, {
104
+ type: 'updateNodeConfig',
105
+ id: 'n',
106
+ config: { v: 2 },
107
+ });
108
+ expect(updated.nodes[0].config).toEqual({ v: 2 });
109
+ });
110
+
111
+ it('updateNodeConfig remaps an outbound edge handle atomically', () => {
112
+ const g: Graph = {
113
+ nodes: [
114
+ { id: 'c', kind: 'classify', position: { x: 0, y: 0 }, config: {} },
115
+ { id: 'a', kind: 'agent', position: { x: 0, y: 0 }, config: {} },
116
+ ],
117
+ edges: [
118
+ { id: 'e1', source: 'c', target: 'a', sourceHandle: 'cat_old' },
119
+ { id: 'e2', source: 'c', target: 'a', sourceHandle: 'cat_keep' },
120
+ ],
121
+ };
122
+ const after = graphReducer(g, {
123
+ type: 'updateNodeConfig',
124
+ id: 'c',
125
+ config: { renamed: true },
126
+ remapEdgeHandle: { from: 'cat_old', to: 'cat_new' },
127
+ });
128
+ expect(after.nodes[0].config).toEqual({ renamed: true });
129
+ expect(after.edges.find((e) => e.id === 'e1')?.sourceHandle).toBe(
130
+ 'cat_new'
131
+ );
132
+ // Untouched: a different handle on the same node, and other nodes.
133
+ expect(after.edges.find((e) => e.id === 'e2')?.sourceHandle).toBe(
134
+ 'cat_keep'
135
+ );
136
+ });
137
+
138
+ it('rejects duplicate edges between the same handles', () => {
139
+ const g = {
140
+ nodes: [
141
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
142
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
143
+ ],
144
+ edges: [
145
+ {
146
+ id: 'e1',
147
+ source: 'a',
148
+ target: 'b',
149
+ sourceHandle: 'out',
150
+ targetHandle: 'in',
151
+ },
152
+ ],
153
+ };
154
+ const after = graphReducer(g, {
155
+ type: 'addEdge',
156
+ edge: {
157
+ id: 'e2',
158
+ source: 'a',
159
+ target: 'b',
160
+ sourceHandle: 'out',
161
+ targetHandle: 'in',
162
+ },
163
+ });
164
+ expect(after.edges).toHaveLength(1);
165
+ });
166
+
167
+ it('deletes an edge by id', () => {
168
+ const g = {
169
+ nodes: [
170
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
171
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
172
+ ],
173
+ edges: [{ id: 'e', source: 'a', target: 'b' }],
174
+ };
175
+ const after = graphReducer(g, { type: 'deleteEdge', id: 'e' });
176
+ expect(after.edges).toHaveLength(0);
177
+ });
178
+
179
+ it('updateEdge merges a partial patch (e.g. label) without touching others', () => {
180
+ const g: Graph = {
181
+ nodes: [
182
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
183
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
184
+ ],
185
+ edges: [
186
+ { id: 'e1', source: 'a', target: 'b' },
187
+ { id: 'e2', source: 'b', target: 'a' },
188
+ ],
189
+ };
190
+ const after = graphReducer(g, {
191
+ type: 'updateEdge',
192
+ id: 'e1',
193
+ patch: { label: 'yes' },
194
+ });
195
+ expect(after.edges[0]).toEqual({
196
+ id: 'e1',
197
+ source: 'a',
198
+ target: 'b',
199
+ sourceHandle: undefined,
200
+ targetHandle: undefined,
201
+ label: 'yes',
202
+ });
203
+ // Untouched edge is preserved; original state is not mutated.
204
+ expect(after.edges[1].label).toBeUndefined();
205
+ expect(g.edges[0].label).toBeUndefined();
206
+ });
207
+
208
+ it('updateEdge is a no-op for an unknown edge id', () => {
209
+ const g = {
210
+ nodes: [{ id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} }],
211
+ edges: [{ id: 'e', source: 'a', target: 'a' }],
212
+ };
213
+ const after = graphReducer(g, {
214
+ type: 'updateEdge',
215
+ id: 'missing',
216
+ patch: { label: 'x' },
217
+ });
218
+ expect(after).toBe(g);
219
+ });
220
+
221
+ it('reconnects an edge endpoint to a new node', () => {
222
+ const g = {
223
+ nodes: [
224
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
225
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
226
+ { id: 'c', kind: 'x', position: { x: 0, y: 0 }, config: {} },
227
+ ],
228
+ edges: [{ id: 'e', source: 'a', target: 'b' }],
229
+ };
230
+ const after = graphReducer(g, {
231
+ type: 'reconnectEdge',
232
+ id: 'e',
233
+ source: 'a',
234
+ target: 'c',
235
+ });
236
+ expect(after.edges).toEqual([{ id: 'e', source: 'a', target: 'c' }]);
237
+ expect(g.edges[0].target).toBe('b');
238
+ });
239
+
240
+ it('reconnectEdge is a no-op for an unknown edge id', () => {
241
+ const g = {
242
+ nodes: [{ id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} }],
243
+ edges: [{ id: 'e', source: 'a', target: 'a' }],
244
+ };
245
+ const after = graphReducer(g, {
246
+ type: 'reconnectEdge',
247
+ id: 'missing',
248
+ source: 'a',
249
+ target: 'a',
250
+ });
251
+ expect(after).toBe(g);
252
+ });
253
+
254
+ it('reconnectEdge rejects a move that duplicates another edge', () => {
255
+ const g = {
256
+ nodes: [
257
+ { id: 'a', kind: 'x', position: { x: 0, y: 0 }, config: {} },
258
+ { id: 'b', kind: 'x', position: { x: 0, y: 0 }, config: {} },
259
+ { id: 'c', kind: 'x', position: { x: 0, y: 0 }, config: {} },
260
+ ],
261
+ edges: [
262
+ { id: 'e1', source: 'a', target: 'b' },
263
+ { id: 'e2', source: 'a', target: 'c' },
264
+ ],
265
+ };
266
+ const after = graphReducer(g, {
267
+ type: 'reconnectEdge',
268
+ id: 'e2',
269
+ source: 'a',
270
+ target: 'b',
271
+ });
272
+ expect(after).toBe(g);
273
+ });
274
+
275
+ it('addNodeWithEdge adds a node and an auto-connect edge atomically', () => {
276
+ const g = {
277
+ nodes: [{ id: 'a', kind: 'agent', position: { x: 0, y: 0 }, config: {} }],
278
+ edges: [],
279
+ };
280
+ const after = graphReducer(g, {
281
+ type: 'addNodeWithEdge',
282
+ node: { id: 'b', kind: 'agent', position: { x: 100, y: 0 }, config: {} },
283
+ autoConnectFrom: {
284
+ edge: { id: 'e1', source: 'a', target: 'b' },
285
+ },
286
+ });
287
+ expect(after.nodes).toHaveLength(2);
288
+ expect(after.edges).toHaveLength(1);
289
+ expect(after.edges[0]).toMatchObject({ source: 'a', target: 'b' });
290
+ });
291
+
292
+ it('addNodeWithEdge adds only the node when autoConnectFrom is null', () => {
293
+ const after = graphReducer(emptyGraph, {
294
+ type: 'addNodeWithEdge',
295
+ node: { id: 'b', kind: 'agent', position: { x: 0, y: 0 }, config: {} },
296
+ autoConnectFrom: null,
297
+ });
298
+ expect(after.nodes).toHaveLength(1);
299
+ expect(after.edges).toHaveLength(0);
300
+ });
301
+
302
+ it('addNodeWithEdge is a no-op for a duplicate node id', () => {
303
+ const g = {
304
+ nodes: [{ id: 'b', kind: 'agent', position: { x: 0, y: 0 }, config: {} }],
305
+ edges: [],
306
+ };
307
+ const after = graphReducer(g, {
308
+ type: 'addNodeWithEdge',
309
+ node: { id: 'b', kind: 'agent', position: { x: 0, y: 0 }, config: {} },
310
+ autoConnectFrom: null,
311
+ });
312
+ expect(after).toBe(g);
313
+ });
314
+ });