@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,115 @@
1
+ 'use client';
2
+
3
+ import { type ReactNode, useMemo } from 'react';
4
+ import { Box, HStack, VStack } from '@chakra-ui/react';
5
+
6
+ import { AlertTriangle, TbAlertCircle } from '@/components/Icon';
7
+ import { Subtext } from '@/components/Typography';
8
+
9
+ import { useWorkflowIssueMessage } from '../../useWorkflowIssueMessage';
10
+ import type { Issue, IssueSeverity } from '../../Workflow.types';
11
+ import { useWorkflowTranslate } from '../../WorkflowContext';
12
+ import { severityCalloutStyle } from '../issueSeverity';
13
+ import { SeverityDot } from '../SeverityDot';
14
+
15
+ interface DrawerIssuesProps {
16
+ /**
17
+ * Issues to surface in the drawer header band, already filtered by the
18
+ * caller (node drawers pass only orphan / non-field-scoped issues; edge
19
+ * drawers pass all of theirs). Returns null when empty.
20
+ */
21
+ issues: Issue[];
22
+ }
23
+
24
+ /**
25
+ * One severity bucket of node/edge issues, rendered as a tinted callout: a
26
+ * severity icon + a short heading ("Fixes needed" / "Worth checking") on top,
27
+ * then the messages as a bulleted list beneath. Severities never mix in a box
28
+ * so the icon, heading and tint stay meaningful.
29
+ *
30
+ * Markers use the severity's `dark` tone via `SeverityDot` — the CSS list
31
+ * `::marker` defaults to a muted grey that reads as an odd low-contrast dot on
32
+ * the tinted background.
33
+ */
34
+ function IssueCallout({
35
+ severity,
36
+ title,
37
+ issues,
38
+ resolveMessage,
39
+ }: {
40
+ severity: IssueSeverity;
41
+ title: ReactNode;
42
+ issues: Issue[];
43
+ resolveMessage: (issue: Issue) => string;
44
+ }) {
45
+ const { bg, color, borderColor } = severityCalloutStyle(severity);
46
+ const Icon = severity === 'error' ? TbAlertCircle : AlertTriangle;
47
+ return (
48
+ <Box
49
+ border="1px solid"
50
+ borderColor={borderColor}
51
+ borderRadius="md"
52
+ bg={bg}
53
+ px={3}
54
+ py={2}
55
+ >
56
+ <VStack align="stretch" gap={1.5}>
57
+ <HStack gap={1.5} color={color}>
58
+ <Icon boxSize="xs" />
59
+ <Subtext color={color} fontWeight="bold">
60
+ {title}
61
+ </Subtext>
62
+ </HStack>
63
+ <VStack align="stretch" gap={0.5} ps={1}>
64
+ {issues.map((issue, i) => (
65
+ <HStack key={`${issue.code}_${i}`} gap={2} align="flex-start">
66
+ <SeverityDot severity={severity} tone="dark" mt={1.5} />
67
+ <Subtext color={color}>{resolveMessage(issue)}</Subtext>
68
+ </HStack>
69
+ ))}
70
+ </VStack>
71
+ </VStack>
72
+ </Box>
73
+ );
74
+ }
75
+
76
+ /**
77
+ * Header issue band shared by node and edge drawers: groups the given issues
78
+ * by severity and renders one tinted `IssueCallout` per non-empty bucket.
79
+ */
80
+ export function DrawerIssues({ issues }: DrawerIssuesProps) {
81
+ const resolveIssueMessage = useWorkflowIssueMessage();
82
+ const translate = useWorkflowTranslate();
83
+ const grouped = useMemo(
84
+ () => ({
85
+ errors: issues.filter((i) => i.severity === 'error'),
86
+ warnings: issues.filter((i) => i.severity === 'warning'),
87
+ }),
88
+ [issues]
89
+ );
90
+
91
+ if (issues.length === 0) return null;
92
+
93
+ return (
94
+ <Box px={4} py={3}>
95
+ <VStack align="stretch" gap={2}>
96
+ {grouped.errors.length > 0 ? (
97
+ <IssueCallout
98
+ severity="error"
99
+ title={translate('workflow_drawer_issues_error_title')}
100
+ issues={grouped.errors}
101
+ resolveMessage={resolveIssueMessage}
102
+ />
103
+ ) : null}
104
+ {grouped.warnings.length > 0 ? (
105
+ <IssueCallout
106
+ severity="warning"
107
+ title={translate('workflow_drawer_issues_warning_title')}
108
+ issues={grouped.warnings}
109
+ resolveMessage={resolveIssueMessage}
110
+ />
111
+ ) : null}
112
+ </VStack>
113
+ </Box>
114
+ );
115
+ }
@@ -0,0 +1,408 @@
1
+ 'use client';
2
+
3
+ import { type ComponentType, type ReactNode, useEffect, useMemo } from 'react';
4
+ import { Box, chakra } from '@chakra-ui/react';
5
+
6
+ import { Button } from '@/components/Button';
7
+ import { TbX } from '@/components/Icon';
8
+ import { Menu } from '@/components/Menu';
9
+ import { Text } from '@/components/Typography';
10
+
11
+ import { renamedOutputHandle } from '../../connectionRules';
12
+ import { cloneNode } from '../../createNode';
13
+ import type {
14
+ DockSide,
15
+ EdgeDrawerRenderProps,
16
+ GraphEdge,
17
+ GraphNode,
18
+ Issue,
19
+ } from '../../Workflow.types';
20
+ import { useWorkflow, useWorkflowTranslate } from '../../WorkflowContext';
21
+ import { BuiltInEdgeInspector, endpointTitle } from '../EdgeInspector';
22
+ import { FloatingCard } from '../FloatingCard';
23
+ import { DrawerHeader } from './DrawerHeader';
24
+ import { DrawerIssues } from './DrawerIssues';
25
+
26
+ export type NodeInspectorProps = {
27
+ /**
28
+ * Which side the inspector docks on. `'right'` (default) renders after the
29
+ * canvas; `'left'` orders it before the canvas (use when another surface owns
30
+ * the right rail). Also drives the top gutter — a left dock sits higher since
31
+ * it has no top-right action card to clear.
32
+ */
33
+ dock?: DockSide;
34
+ /**
35
+ * Optional host renderer for the edge inspector body. When omitted, edges get
36
+ * a built-in inspector (editable label + read-only endpoints + delete).
37
+ */
38
+ renderEdgeDrawer?: ComponentType<EdgeDrawerRenderProps>;
39
+ };
40
+
41
+ /**
42
+ * The built-in node/edge inspector. Mount it as a child of `<Workflow>` to get
43
+ * the default floating drawer; omit it to own inspection entirely (drive your
44
+ * own UI off `onSelectionChange`). A node and an edge share this surface: the
45
+ * editor's `drawerTarget` selects which branch renders. Node bodies come from
46
+ * the host node-type registry (`def.renderDrawer`); edge bodies come from the
47
+ * optional `renderEdgeDrawer`, falling back to a built-in label + endpoints
48
+ * inspector. Renders even in read-only mode (controls disable themselves).
49
+ */
50
+ export function NodeInspector({
51
+ dock = 'right',
52
+ renderEdgeDrawer,
53
+ }: NodeInspectorProps) {
54
+ const {
55
+ graph,
56
+ dispatch,
57
+ getNodeType,
58
+ editor,
59
+ setDrawerTarget,
60
+ issuesByNode,
61
+ issuesByEdge,
62
+ readOnly,
63
+ hostBridge,
64
+ } = useWorkflow();
65
+
66
+ const target = editor.drawerTarget;
67
+ const node: GraphNode | null =
68
+ target?.type === 'node'
69
+ ? (graph.nodes.find((n) => n.id === target.id) ?? null)
70
+ : null;
71
+ const edge: GraphEdge | null =
72
+ target?.type === 'edge'
73
+ ? (graph.edges.find((e) => e.id === target.id) ?? null)
74
+ : null;
75
+
76
+ // Target points at something that no longer exists (e.g. just deleted) —
77
+ // clear it defensively so the drawer doesn't get stuck open on a ghost.
78
+ useEffect(() => {
79
+ if (target && !node && !edge) setDrawerTarget(null);
80
+ }, [target, node, edge, setDrawerTarget]);
81
+
82
+ // Render even when read-only: node/edge inspectors disable their own controls
83
+ // via the `readOnly` flag, so the drawer stays a legible read-only view (used
84
+ // by the version-history preview). Callers that want it gone simply don't
85
+ // mount <NodeInspector>.
86
+ if (!target) return null;
87
+ if (target.type === 'node') {
88
+ if (!node) return null;
89
+ return (
90
+ // Keyed by node id so switching between two same-kind nodes remounts the
91
+ // drawer — without this, scroll offset and collapsed-section state from
92
+ // the previous node carry over to the next one.
93
+ <NodeDrawer
94
+ key={node.id}
95
+ node={node}
96
+ issuesByNode={issuesByNode}
97
+ hostBridge={hostBridge}
98
+ readOnly={readOnly}
99
+ dock={dock}
100
+ dispatch={dispatch}
101
+ getNodeType={getNodeType}
102
+ graphNodes={graph.nodes}
103
+ setDrawerTarget={setDrawerTarget}
104
+ />
105
+ );
106
+ }
107
+ if (!edge) return null;
108
+ return (
109
+ <EdgeDrawer
110
+ edge={edge}
111
+ issues={issuesByEdge[edge.id] ?? []}
112
+ hostBridge={hostBridge}
113
+ readOnly={readOnly}
114
+ dock={dock}
115
+ RenderEdge={renderEdgeDrawer}
116
+ />
117
+ );
118
+ }
119
+
120
+ /**
121
+ * Shared drawer chrome: a floating `Card` inspector with a header + scrollable
122
+ * body. Kept in its own column (rather than overlaying) so it never covers the
123
+ * canvas MiniMap; the margin gutter detaches it from the edges and the top
124
+ * inset clears any floating action controls a host renders in the canvas
125
+ * top-right.
126
+ *
127
+ * `alignSelf="flex-start"` opts the card out of the flex row's stretch so it
128
+ * sizes to its content rather than the full canvas height; `maxHeight` caps it
129
+ * at the available column (minus the `mt`/`mb` gutters, kept in sync via the
130
+ * spacing CSS vars) so a long inspector still scrolls its body instead of
131
+ * overflowing.
132
+ */
133
+ function DrawerFrame({
134
+ header,
135
+ children,
136
+ dock,
137
+ }: {
138
+ header: ReactNode;
139
+ children: ReactNode;
140
+ dock: DockSide;
141
+ }) {
142
+ // A right dock clears the host's top-right action card (mt=20); a left dock
143
+ // (version-history preview) has nothing above it, so it sits at the same top
144
+ // gutter as the palette (mt=4).
145
+ const topInset = dock === 'left' ? 4 : 20;
146
+ return (
147
+ <FloatingCard
148
+ // A left dock renders before the canvas in the flex row; a right dock
149
+ // after. The host hides the palette when docking left, so order:-1 lands
150
+ // the inspector at the left edge.
151
+ order={dock === 'left' ? -1 : undefined}
152
+ mt={topInset}
153
+ mb={4}
154
+ mx={4}
155
+ alignSelf="flex-start"
156
+ maxHeight={`calc(100% - var(--chakra-spacing-${topInset}) - var(--chakra-spacing-4))`}
157
+ display="flex"
158
+ flexDirection="column"
159
+ >
160
+ {header}
161
+ <Box flex="1" minHeight={0} overflowY="auto">
162
+ {children}
163
+ </Box>
164
+ </FloatingCard>
165
+ );
166
+ }
167
+
168
+ /**
169
+ * Wraps an inspector body in a disabled `<fieldset>` when read-only (version
170
+ * preview). A disabled fieldset natively disables every form control nested in
171
+ * it — inputs, textareas, selects, buttons, switches — so the whole inspector
172
+ * goes read-only without each node type having to gate every control. The
173
+ * header (close button) lives outside this, so the drawer can still be closed.
174
+ */
175
+ function ReadOnlyFieldset({
176
+ readOnly,
177
+ children,
178
+ }: {
179
+ readOnly: boolean;
180
+ children: ReactNode;
181
+ }) {
182
+ return (
183
+ <chakra.fieldset disabled={readOnly} border="0" m={0} p={0} minW={0}>
184
+ {children}
185
+ </chakra.fieldset>
186
+ );
187
+ }
188
+
189
+ function NodeDrawer({
190
+ node,
191
+ issuesByNode,
192
+ hostBridge,
193
+ readOnly,
194
+ dock,
195
+ dispatch,
196
+ getNodeType,
197
+ graphNodes,
198
+ setDrawerTarget,
199
+ }: {
200
+ node: GraphNode;
201
+ issuesByNode: Record<string, Issue[]>;
202
+ hostBridge: unknown;
203
+ readOnly: boolean;
204
+ dock: DockSide;
205
+ dispatch: ReturnType<typeof useWorkflow>['dispatch'];
206
+ getNodeType: ReturnType<typeof useWorkflow>['getNodeType'];
207
+ graphNodes: GraphNode[];
208
+ setDrawerTarget: ReturnType<typeof useWorkflow>['setDrawerTarget'];
209
+ }) {
210
+ const translate = useWorkflowTranslate();
211
+ const def = getNodeType(node.kind);
212
+ const issues = useMemo<Issue[]>(
213
+ () => issuesByNode[node.id] ?? [],
214
+ [issuesByNode, node.id]
215
+ );
216
+ // Field-scoped issues render inline beneath their inputs via FieldWrapper.
217
+ // Only node-scoped issues that DON'T target a specific field (e.g.
218
+ // graph-level "unreachable from start") still need a header surface.
219
+ const orphanIssues = useMemo(
220
+ () => issues.filter((i) => !i.fieldKey),
221
+ [issues]
222
+ );
223
+
224
+ if (!def) return null;
225
+
226
+ const Render = def.renderDrawer;
227
+ const Icon = def.icon;
228
+ // Title the drawer with the instance (an agent's name), not the kind — with
229
+ // several same-kind nodes the kind alone doesn't say which one is open. The
230
+ // kind stays visible as the subtitle (dropped when the node is unnamed and
231
+ // the title already IS the kind label).
232
+ const instanceTitle = endpointTitle(node, def, node.id);
233
+ // Single dispatch path for every config write, so a handle rename (e.g. a
234
+ // renamed Classify category, whose handle is `cat_<name>`) always moves its
235
+ // edge instead of orphaning it.
236
+ const applyConfig = (next: unknown) =>
237
+ dispatch({
238
+ type: 'updateNodeConfig',
239
+ id: node.id,
240
+ config: next,
241
+ remapEdgeHandle: renamedOutputHandle(def.handles, node.config, next),
242
+ });
243
+
244
+ const header = (
245
+ <DrawerHeader
246
+ icon={
247
+ <Box color="slate.1200" display="flex" alignItems="center">
248
+ <Icon boxSize="xs" />
249
+ </Box>
250
+ }
251
+ title={instanceTitle}
252
+ subtitle={instanceTitle === def.label ? undefined : def.label}
253
+ lineClampTitle
254
+ menuItems={
255
+ // No mutating actions in read-only (version preview) — selection stays
256
+ // enabled so the node is still inspectable, but Duplicate/Delete are
257
+ // hidden so the previewed graph can't be edited.
258
+ !readOnly && !def.placement?.pinned ? (
259
+ <>
260
+ <Menu.Item
261
+ value="duplicate"
262
+ onClick={() => {
263
+ const clone = cloneNode(node, graphNodes);
264
+ dispatch({ type: 'addNode', node: clone });
265
+ setDrawerTarget({ type: 'node', id: clone.id });
266
+ }}
267
+ >
268
+ {translate('workflow_node_duplicate') as string}
269
+ </Menu.Item>
270
+ <Menu.Item
271
+ value="delete"
272
+ color="danger.main"
273
+ onClick={() => {
274
+ dispatch({ type: 'deleteNode', id: node.id });
275
+ setDrawerTarget(null);
276
+ }}
277
+ >
278
+ {translate('workflow_node_delete') as string}
279
+ </Menu.Item>
280
+ </>
281
+ ) : undefined
282
+ }
283
+ onClose={() => setDrawerTarget(null)}
284
+ />
285
+ );
286
+
287
+ return (
288
+ <DrawerFrame header={header} dock={dock}>
289
+ <DrawerIssues issues={orphanIssues} />
290
+ <ReadOnlyFieldset readOnly={readOnly}>
291
+ {Render ? (
292
+ <Render
293
+ id={node.id}
294
+ config={node.config}
295
+ issues={issues}
296
+ readOnly={readOnly}
297
+ hostBridge={hostBridge}
298
+ onChange={applyConfig}
299
+ />
300
+ ) : (
301
+ <Text color="slate.600" fontSize="sm" px={4} py={4}>
302
+ {translate('workflow_drawer_empty_settings')}
303
+ </Text>
304
+ )}
305
+ </ReadOnlyFieldset>
306
+ </DrawerFrame>
307
+ );
308
+ }
309
+
310
+ function EdgeDrawer({
311
+ edge,
312
+ issues,
313
+ hostBridge,
314
+ readOnly,
315
+ dock,
316
+ RenderEdge,
317
+ }: {
318
+ edge: GraphEdge;
319
+ issues: Issue[];
320
+ hostBridge: unknown;
321
+ readOnly: boolean;
322
+ dock: DockSide;
323
+ RenderEdge?: ComponentType<EdgeDrawerRenderProps>;
324
+ }) {
325
+ const translate = useWorkflowTranslate();
326
+ const { graph, dispatch, getNodeType, setDrawerTarget, setSelectedEdgeId } =
327
+ useWorkflow();
328
+
329
+ const sourceNode = graph.nodes.find((n) => n.id === edge.source);
330
+ const targetNode = graph.nodes.find((n) => n.id === edge.target);
331
+ const connectionTitle = translate('workflow_edge_connection', {
332
+ source: endpointTitle(
333
+ sourceNode,
334
+ sourceNode ? getNodeType(sourceNode.kind) : undefined,
335
+ edge.source
336
+ ),
337
+ target: endpointTitle(
338
+ targetNode,
339
+ targetNode ? getNodeType(targetNode.kind) : undefined,
340
+ edge.target
341
+ ),
342
+ }) as string;
343
+
344
+ const onChange = (next: GraphEdge) =>
345
+ dispatch({
346
+ type: 'updateEdge',
347
+ id: edge.id,
348
+ patch: { label: next.label },
349
+ });
350
+
351
+ const onDelete = () => {
352
+ dispatch({ type: 'deleteEdge', id: edge.id });
353
+ setDrawerTarget(null);
354
+ setSelectedEdgeId(null);
355
+ };
356
+
357
+ const header = (
358
+ // Delete moved out of the kebab into an explicit button at the foot of the
359
+ // drawer (below), so it's discoverable when you just click an edge — the
360
+ // hover-X on the canvas only appears over the edge's name badge now.
361
+ <DrawerHeader
362
+ title={connectionTitle}
363
+ lineClampTitle
364
+ onClose={() => setDrawerTarget(null)}
365
+ />
366
+ );
367
+
368
+ return (
369
+ <DrawerFrame header={header} dock={dock}>
370
+ <DrawerIssues issues={issues} />
371
+ <ReadOnlyFieldset readOnly={readOnly}>
372
+ {RenderEdge ? (
373
+ <RenderEdge
374
+ edge={edge}
375
+ onChange={onChange}
376
+ issues={issues}
377
+ readOnly={readOnly}
378
+ hostBridge={hostBridge}
379
+ />
380
+ ) : (
381
+ <BuiltInEdgeInspector
382
+ edge={edge}
383
+ onChange={onChange}
384
+ issues={issues}
385
+ readOnly={readOnly}
386
+ hostBridge={hostBridge}
387
+ />
388
+ )}
389
+ </ReadOnlyFieldset>
390
+ {/* Explicit delete affordance for the edge — outside the read-only
391
+ fieldset, and hidden entirely in the version-history preview. */}
392
+ {readOnly ? null : (
393
+ <Box borderTopWidth="1px" borderColor="slate.200" px={4} py={3}>
394
+ <Button
395
+ size="sm"
396
+ variant="outline"
397
+ colorPalette="danger"
398
+ width="100%"
399
+ onClick={onDelete}
400
+ >
401
+ <TbX boxSize="xs" />
402
+ {translate('workflow_edge_delete') as string}
403
+ </Button>
404
+ </Box>
405
+ )}
406
+ </DrawerFrame>
407
+ );
408
+ }
@@ -0,0 +1,2 @@
1
+ export type { NodeInspectorProps } from './DrawerShell';
2
+ export { NodeInspector } from './DrawerShell';
@@ -0,0 +1,135 @@
1
+ 'use client';
2
+
3
+ import { Box, Stack, VStack } from '@chakra-ui/react';
4
+
5
+ import { Input } from '@/components/Input';
6
+ import { Subtext } from '@/components/Typography';
7
+
8
+ import type {
9
+ EdgeDrawerRenderProps,
10
+ GraphNode,
11
+ NodeTypeDef,
12
+ } from '../../Workflow.types';
13
+ import { useWorkflow, useWorkflowTranslate } from '../../WorkflowContext';
14
+ import { FieldWrapper } from '../FieldWrapper';
15
+ import { endpointTitle, findPort } from './endpointTitle';
16
+
17
+ /**
18
+ * Author-facing line for the port an edge endpoint sits on. A resolved port
19
+ * shows its label (Pass / 분기 1 — the same text LabeledEdge rides on the
20
+ * wire) or nothing when unlabeled (raw ids like `out` are wiring detail). A
21
+ * DANGLING handle — one no current port matches, e.g. after restoring a
22
+ * snapshot whose category was renamed — falls back to the raw id, the only
23
+ * clue left for diagnosing the broken wire.
24
+ */
25
+ function portLabel(
26
+ node: GraphNode | undefined,
27
+ def: NodeTypeDef | undefined,
28
+ side: 'inputs' | 'outputs',
29
+ handleId: string | undefined
30
+ ): string | undefined {
31
+ if (!node || !def || !handleId) return undefined;
32
+ const port = findPort(node, def, side, handleId);
33
+ return port ? port.label : handleId;
34
+ }
35
+
36
+ /**
37
+ * Built-in edge inspector body rendered in `DrawerShell` when the host does not
38
+ * supply a `renderEdgeDrawer`. Shows an editable label plus read-only endpoint
39
+ * info (source title → target title, and handle ids when present). Label edits
40
+ * flow through `onChange` (an `updateEdge` dispatch) so they are undoable.
41
+ *
42
+ * Deliberately uses only generic primitives (logician-ui + FieldWrapper) so the
43
+ * framework core stays domain-free.
44
+ */
45
+ export function BuiltInEdgeInspector({
46
+ edge,
47
+ onChange,
48
+ readOnly,
49
+ }: EdgeDrawerRenderProps) {
50
+ const translate = useWorkflowTranslate();
51
+ const { graph, getNodeType } = useWorkflow();
52
+
53
+ const sourceNode = graph.nodes.find((n) => n.id === edge.source);
54
+ const targetNode = graph.nodes.find((n) => n.id === edge.target);
55
+ const sourceDef = sourceNode ? getNodeType(sourceNode.kind) : undefined;
56
+ const targetDef = targetNode ? getNodeType(targetNode.kind) : undefined;
57
+ const sourceTitle = endpointTitle(sourceNode, sourceDef, edge.source);
58
+ const targetTitle = endpointTitle(targetNode, targetDef, edge.target);
59
+
60
+ return (
61
+ <Box px={4} py={4}>
62
+ <VStack align="stretch" gap={4}>
63
+ <FieldWrapper
64
+ // Edges have no field-scoped issues in `issuesByField` (which is keyed
65
+ // by nodeId), so this lookup is intentionally empty — FieldWrapper is
66
+ // reused purely for its label + layout.
67
+ nodeId={edge.id}
68
+ fieldKey="label"
69
+ label={translate('workflow_edge_label_label') as string}
70
+ >
71
+ {({ borderColor }) => (
72
+ <Input
73
+ borderColor={borderColor}
74
+ value={edge.label ?? ''}
75
+ disabled={readOnly}
76
+ placeholder={
77
+ translate('workflow_edge_label_placeholder') as string
78
+ }
79
+ onChange={(e) =>
80
+ onChange({ ...edge, label: e.target.value || undefined })
81
+ }
82
+ />
83
+ )}
84
+ </FieldWrapper>
85
+
86
+ <Stack gap={1.5}>
87
+ <Subtext fontWeight="semibold" color="slate.1300">
88
+ {translate('workflow_edge_endpoints_heading') as string}
89
+ </Subtext>
90
+ <Stack gap={2}>
91
+ <EndpointRow
92
+ label={translate('workflow_edge_source_label') as string}
93
+ title={sourceTitle}
94
+ portLabel={portLabel(
95
+ sourceNode,
96
+ sourceDef,
97
+ 'outputs',
98
+ edge.sourceHandle
99
+ )}
100
+ />
101
+ <EndpointRow
102
+ label={translate('workflow_edge_target_label') as string}
103
+ title={targetTitle}
104
+ portLabel={portLabel(
105
+ targetNode,
106
+ targetDef,
107
+ 'inputs',
108
+ edge.targetHandle
109
+ )}
110
+ />
111
+ </Stack>
112
+ </Stack>
113
+ </VStack>
114
+ </Box>
115
+ );
116
+ }
117
+
118
+ /** One read-only endpoint line: role label, resolved node title, optional port label. */
119
+ function EndpointRow({
120
+ label,
121
+ title,
122
+ portLabel,
123
+ }: {
124
+ label: string;
125
+ title: string;
126
+ portLabel?: string;
127
+ }) {
128
+ return (
129
+ <Stack gap={0.5}>
130
+ <Subtext color="slate.900">{label}</Subtext>
131
+ <Subtext color="slate.1200">{title}</Subtext>
132
+ {portLabel ? <Subtext color="slate.700">{portLabel}</Subtext> : null}
133
+ </Stack>
134
+ );
135
+ }
@@ -0,0 +1,38 @@
1
+ import type { GraphNode, HandleDef, NodeTypeDef } from '../../Workflow.types';
2
+
3
+ /**
4
+ * Author-facing title for an edge endpoint: the node-type's per-instance title
5
+ * (e.g. an agent's name) when available, else the type label, else the raw id.
6
+ *
7
+ * Shared by the edge inspector (drawer header connection title + endpoint info).
8
+ */
9
+ export function endpointTitle(
10
+ node: GraphNode | undefined,
11
+ def: NodeTypeDef | undefined,
12
+ fallbackId: string
13
+ ): string {
14
+ if (node && def?.getInstanceTitle) {
15
+ const title = def.getInstanceTitle(node.config);
16
+ if (title) return title;
17
+ }
18
+ return def?.label ?? fallbackId;
19
+ }
20
+
21
+ /**
22
+ * Resolve the port an edge endpoint sits on, from the owning node's current
23
+ * handle set. `undefined` when the handle id no longer matches any port — a
24
+ * dangling endpoint (e.g. a restored snapshot referencing a renamed Classify
25
+ * category).
26
+ *
27
+ * Shared by the canvas wire label (LabeledEdge) and the edge inspector so the
28
+ * two surfaces can't drift on how a port is named.
29
+ */
30
+ export function findPort(
31
+ node: GraphNode | undefined,
32
+ def: NodeTypeDef | undefined,
33
+ side: 'inputs' | 'outputs',
34
+ handleId: string | undefined
35
+ ): HandleDef | undefined {
36
+ if (!node || !def || !handleId) return undefined;
37
+ return def.handles(node.config)[side].find((h) => h.id === handleId);
38
+ }
@@ -0,0 +1,2 @@
1
+ export { BuiltInEdgeInspector } from './BuiltInEdgeInspector';
2
+ export { endpointTitle, findPort } from './endpointTitle';