@kiberon-labs/behave-graph-flow 1.0.0 → 3.0.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 (378) hide show
  1. package/.fallowrc.json +16 -0
  2. package/.storybook/main.ts +32 -0
  3. package/.storybook/manager.ts +6 -0
  4. package/.storybook/preview.ts +64 -0
  5. package/.storybook/styles.css +16 -0
  6. package/.turbo/turbo-build.log +7 -0
  7. package/CHANGELOG.md +368 -0
  8. package/LICENSE +6 -0
  9. package/README.md +2 -2
  10. package/data/Polynomial.json +510 -0
  11. package/data/sequence.json +337 -0
  12. package/data/trigger-event.json +241 -0
  13. package/data/variable-change.json +210 -0
  14. package/dist/AnyControlImpl-Ds-CShIB.js +20 -0
  15. package/dist/AnyControlImpl-Ds-CShIB.js.map +1 -0
  16. package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js +166 -0
  17. package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js.map +1 -0
  18. package/dist/entry.css +4 -0
  19. package/dist/index.css +42 -0
  20. package/dist/index.css.map +1 -0
  21. package/dist/index.d.ts +3597 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +18009 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/noteImpl-KkrrWgJd.js +242 -0
  26. package/dist/noteImpl-KkrrWgJd.js.map +1 -0
  27. package/dist/styles.module-CvmpDkZj.css +3 -0
  28. package/dist/styles.module-CvmpDkZj.css.map +1 -0
  29. package/dist/styles.module-DZxg8aW9.js +271 -0
  30. package/dist/styles.module-DZxg8aW9.js.map +1 -0
  31. package/dist/useChangeNodeData-ChQGK7AI.js +23 -0
  32. package/dist/useChangeNodeData-ChQGK7AI.js.map +1 -0
  33. package/docs/notifications.md +246 -0
  34. package/docs/protocol.md +702 -0
  35. package/docs/specifics.md +191 -0
  36. package/package.json +82 -22
  37. package/postcss.config.ts +3 -4
  38. package/src/annotations/index.ts +32 -0
  39. package/src/components/FloatingToolbar/index.module.css +37 -0
  40. package/src/components/FloatingToolbar/index.tsx +256 -0
  41. package/src/components/Flow.tsx +287 -75
  42. package/src/components/contextMenus/DynamicContextMenu.tsx +85 -0
  43. package/src/components/contextMenus/NodePicker.module.css +274 -0
  44. package/src/components/contextMenus/NodePicker.tsx +481 -0
  45. package/src/components/contextMenus/edge.tsx +22 -0
  46. package/src/components/contextMenus/node.tsx +15 -0
  47. package/src/components/contextMenus/selection.tsx +11 -0
  48. package/src/components/controls/any/AnyControlImpl.tsx +14 -0
  49. package/src/components/controls/any/index.tsx +19 -0
  50. package/src/components/controls/boolean/index.tsx +13 -0
  51. package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
  52. package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
  53. package/src/components/controls/colorPicker/index.module.css +18 -0
  54. package/src/components/controls/colorPicker/index.tsx +61 -0
  55. package/src/components/controls/number/index.tsx +35 -0
  56. package/src/components/controls/string/index.tsx +16 -0
  57. package/src/components/edges/index.tsx +475 -0
  58. package/src/components/edges/offsetBezier.ts +134 -0
  59. package/src/components/hotKeys.tsx +20 -0
  60. package/src/components/layoutController/index.module.css +13 -0
  61. package/src/components/layoutController/index.tsx +140 -0
  62. package/src/components/layoutController/utils.ts +248 -0
  63. package/src/components/menubar/defaults.tsx +516 -0
  64. package/src/components/menubar/index.tsx +49 -0
  65. package/src/components/menubar/menuItem.module.css +31 -0
  66. package/src/components/menubar/menuItem.tsx +65 -0
  67. package/src/components/nodes/behave/Node.module.css +23 -0
  68. package/src/components/nodes/behave/Node.tsx +176 -0
  69. package/src/components/nodes/behave/NodeContainer.module.css +88 -0
  70. package/src/components/nodes/behave/NodeContainer.tsx +46 -0
  71. package/src/components/nodes/behave/index.tsx +14 -0
  72. package/src/components/nodes/group/index.tsx +109 -0
  73. package/src/components/nodes/wrapper/index.tsx +73 -0
  74. package/src/components/nodes/wrapper/styles.module.css +87 -0
  75. package/src/components/notifications/NotificationProvider.tsx +81 -0
  76. package/src/components/notifications/index.ts +2 -0
  77. package/src/components/notifications/utils.ts +71 -0
  78. package/src/components/panels/alignment/index.module.css +10 -0
  79. package/src/components/panels/alignment/index.tsx +244 -0
  80. package/src/components/panels/base/index.tsx +5 -0
  81. package/src/components/panels/base/styles.module.css +12 -0
  82. package/src/components/panels/common/PanelHeader.module.css +24 -0
  83. package/src/components/panels/common/PanelHeader.tsx +22 -0
  84. package/src/components/panels/common/SectionTitle.module.css +13 -0
  85. package/src/components/panels/common/SectionTitle.tsx +10 -0
  86. package/src/components/panels/events/EditEventPanel.tsx +324 -0
  87. package/src/components/panels/events/ManageEventsPanel.tsx +101 -0
  88. package/src/components/panels/events/index.tsx +23 -0
  89. package/src/components/panels/events/styles.module.css +178 -0
  90. package/src/components/panels/graphProperties/index.tsx +125 -0
  91. package/src/components/panels/history/index.tsx +92 -0
  92. package/src/components/panels/history/styles.module.css +97 -0
  93. package/src/components/panels/keymaps/index.module.css +68 -0
  94. package/src/components/panels/keymaps/index.tsx +166 -0
  95. package/src/components/panels/layers/index.tsx +245 -0
  96. package/src/components/panels/layers/styles.module.css +107 -0
  97. package/src/components/panels/legend/index.module.css +6 -0
  98. package/src/components/panels/legend/index.tsx +76 -0
  99. package/src/components/panels/logs/index.module.css +218 -0
  100. package/src/components/panels/logs/index.tsx +288 -0
  101. package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
  102. package/src/components/panels/nodeInputs/InputsGroup.tsx +65 -0
  103. package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
  104. package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
  105. package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
  106. package/src/components/panels/nodeInputs/OutputsGroup.tsx +55 -0
  107. package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
  108. package/src/components/panels/nodeInputs/index.module.css +308 -0
  109. package/src/components/panels/nodeInputs/index.tsx +349 -0
  110. package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
  111. package/src/components/panels/nodeInputs/useNodeInputsData.ts +153 -0
  112. package/src/components/panels/nodePicker/index.tsx +115 -0
  113. package/src/components/panels/panel/index.module.css +66 -0
  114. package/src/components/panels/panel/index.tsx +88 -0
  115. package/src/components/panels/search/index.module.css +16 -0
  116. package/src/components/panels/search/index.tsx +215 -0
  117. package/src/components/panels/systemSettings/ConversionsSettings.tsx +203 -0
  118. package/src/components/panels/systemSettings/index.tsx +251 -0
  119. package/src/components/panels/systemSettings/styles.module.css +138 -0
  120. package/src/components/panels/traces/GridLines.tsx +38 -0
  121. package/src/components/panels/traces/TimeGrid.tsx +48 -0
  122. package/src/components/panels/traces/TraceLane.tsx +62 -0
  123. package/src/components/panels/traces/TraceTooltip.tsx +22 -0
  124. package/src/components/panels/traces/TracesHeader.tsx +56 -0
  125. package/src/components/panels/traces/index.module.css +159 -0
  126. package/src/components/panels/traces/index.tsx +298 -0
  127. package/src/components/panels/traces/types.ts +48 -0
  128. package/src/components/panels/traces/useDerivedSpans.ts +307 -0
  129. package/src/components/panels/traces/utils.ts +33 -0
  130. package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
  131. package/src/components/panels/variables/ManageVariablesScreen.tsx +147 -0
  132. package/src/components/panels/variables/index.tsx +125 -0
  133. package/src/components/panels/variables/styles.module.css +149 -0
  134. package/src/components/primitives/icon.module.css +45 -0
  135. package/src/components/primitives/icon.tsx +38 -0
  136. package/src/components/sockets/input/index.tsx +83 -0
  137. package/src/components/sockets/input/styles.module.css +26 -0
  138. package/src/components/sockets/output/index.tsx +68 -0
  139. package/src/components/sockets/output/styles.module.css +22 -0
  140. package/src/css/notes.css +135 -0
  141. package/src/css/prosemirror.css +57 -0
  142. package/src/css/rc-dock.css +212 -0
  143. package/src/css/rc-menu.css +101 -0
  144. package/src/css/themes/kiberon.css +127 -0
  145. package/src/css/vars.css +198 -0
  146. package/src/css/vscode-elements.css +124 -0
  147. package/src/entry.css +4 -0
  148. package/src/generators/CallSubgraphGenerator.tsx +136 -0
  149. package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
  150. package/src/generators/GraphBoundaryGenerator.module.css +32 -0
  151. package/src/generators/GraphBoundaryGenerator.tsx +193 -0
  152. package/src/generators/SequenceGenerator.tsx +104 -0
  153. package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
  154. package/src/generators/SwitchOnStringGenerator.tsx +263 -0
  155. package/src/generators/callSubgraphSync.ts +126 -0
  156. package/src/generators/registerDefaultGenerators.ts +55 -0
  157. package/src/generators/registerDefaults.ts +26 -0
  158. package/src/hooks/useBehaveGraphFlow.ts +17 -16
  159. package/src/hooks/useFlowHandlers.ts +154 -30
  160. package/src/hooks/useWasdPan.ts +210 -0
  161. package/src/index.css +134 -0
  162. package/src/index.ts +53 -18
  163. package/src/manifest/contributionRegistry.ts +93 -0
  164. package/src/manifest/index.ts +4 -0
  165. package/src/manifest/loadManifest.ts +82 -0
  166. package/src/manifest/manifestPlugin.ts +29 -0
  167. package/src/manifest/passthroughValueType.ts +40 -0
  168. package/src/plugin/alignment/index.ts +91 -0
  169. package/src/plugin/autosave/controller.ts +366 -0
  170. package/src/plugin/autosave/index.tsx +114 -0
  171. package/src/plugin/autosave/panel/BackupPanel.tsx +141 -0
  172. package/src/plugin/autosave/panel/index.tsx +1 -0
  173. package/src/plugin/autosave/panel/styles.module.css +56 -0
  174. package/src/plugin/autosave/settings.ts +65 -0
  175. package/src/plugin/autosave/storage.ts +147 -0
  176. package/src/plugin/docs/index.tsx +297 -0
  177. package/src/plugin/docs/panel/DocumentationBrowserPanelImpl.tsx +200 -0
  178. package/src/plugin/docs/panel/index.tsx +21 -0
  179. package/src/plugin/docs/panel/styles.module.css +174 -0
  180. package/src/plugin/graphrunner/actions.ts +326 -0
  181. package/src/plugin/graphrunner/buttons.tsx +95 -0
  182. package/src/plugin/graphrunner/client.ts +707 -0
  183. package/src/plugin/graphrunner/index.tsx +184 -0
  184. package/src/plugin/graphrunner/panel.tsx +386 -0
  185. package/src/plugin/graphrunner/runController.ts +283 -0
  186. package/src/plugin/graphrunner/runner.ts +187 -0
  187. package/src/plugin/graphrunner/session.ts +243 -0
  188. package/src/plugin/graphrunner/store.ts +196 -0
  189. package/src/plugin/graphrunner/styles.module.css +171 -0
  190. package/src/plugin/graphrunner/transport.ts +250 -0
  191. package/src/plugin/graphrunner/types.ts +693 -0
  192. package/src/plugin/graphrunner-local/execution-utils.ts +637 -0
  193. package/src/plugin/graphrunner-local/index.tsx +172 -0
  194. package/src/plugin/graphrunner-local/panel.tsx +187 -0
  195. package/src/plugin/graphrunner-local/store.ts +41 -0
  196. package/src/plugin/graphrunner-local/styles.module.css +82 -0
  197. package/src/plugin/graphrunner-local/transport.ts +1339 -0
  198. package/src/plugin/graphrunner-local/types.ts +10 -0
  199. package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +635 -0
  200. package/src/plugin/graphrunner-webworker/index.tsx +140 -0
  201. package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
  202. package/src/plugin/graphrunner-webworker/store.ts +98 -0
  203. package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
  204. package/src/plugin/kitchen-sink/index.ts +38 -0
  205. package/src/plugin/layout/dagre.ts +131 -0
  206. package/src/plugin/layout/elk.ts +216 -0
  207. package/src/plugin/layout/index.ts +80 -0
  208. package/src/plugin/notes/FormatToolbar.tsx +200 -0
  209. package/src/plugin/notes/index.tsx +191 -0
  210. package/src/plugin/notes/nodeActions.ts +100 -0
  211. package/src/plugin/notes/note.tsx +20 -0
  212. package/src/plugin/notes/noteImpl.tsx +89 -0
  213. package/src/plugin/realtime/realtimeRunner.ts +624 -0
  214. package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
  215. package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
  216. package/src/specifics/VariableGetSpecific.tsx +110 -0
  217. package/src/specifics/VariableSetSpecific.tsx +110 -0
  218. package/src/store/actions.tsx +698 -0
  219. package/src/store/commands.ts +278 -0
  220. package/src/store/contextMenu.ts +192 -0
  221. package/src/store/controls.tsx +62 -0
  222. package/src/store/conversions.ts +47 -0
  223. package/src/store/documentation.tsx +69 -0
  224. package/src/store/events.tsx +116 -0
  225. package/src/store/flow.tsx +230 -0
  226. package/src/store/graphMeta.ts +39 -0
  227. package/src/store/hotKeys.tsx +364 -0
  228. package/src/store/layers.ts +259 -0
  229. package/src/store/legend.tsx +76 -0
  230. package/src/store/logs.ts +28 -0
  231. package/src/store/menubar.ts +41 -0
  232. package/src/store/refs.ts +84 -0
  233. package/src/store/registry.ts +51 -0
  234. package/src/store/selection.ts +22 -0
  235. package/src/store/settings.ts +99 -0
  236. package/src/store/settingsSchema.ts +210 -0
  237. package/src/store/socketGenerator.tsx +54 -0
  238. package/src/store/specific.tsx +75 -0
  239. package/src/store/specs.tsx +35 -0
  240. package/src/store/tabs.ts +282 -0
  241. package/src/store/toolbar.tsx +45 -0
  242. package/src/store/traces.ts +240 -0
  243. package/src/store/variables.ts +37 -0
  244. package/src/system/graph.ts +131 -0
  245. package/src/system/graphSession.ts +172 -0
  246. package/src/system/index.ts +6 -0
  247. package/src/system/notifications.ts +111 -0
  248. package/src/system/persistence.ts +82 -0
  249. package/src/system/plugin.ts +55 -0
  250. package/src/system/provider.tsx +86 -0
  251. package/src/system/pubsub.ts +323 -0
  252. package/src/system/system.ts +653 -0
  253. package/src/system/tabLoader.tsx +303 -0
  254. package/src/system/undoRedo.ts +103 -0
  255. package/src/transformers/Uigraph.ts +61 -0
  256. package/src/transformers/behaveToFlow.ts +16 -4
  257. package/src/transformers/contract.ts +87 -0
  258. package/src/transformers/flowToBehave.ts +40 -12
  259. package/src/types/NodeMetadata.ts +27 -0
  260. package/src/types/graph.ts +49 -0
  261. package/src/types/nodes.ts +50 -0
  262. package/src/types.ts +18 -0
  263. package/src/util/autoConvert.ts +200 -0
  264. package/src/util/colors.ts +1 -29
  265. package/src/util/downloadJson.ts +18 -0
  266. package/src/util/extractNodeMetadata.ts +16 -0
  267. package/src/util/getPickerFilters.ts +1 -1
  268. package/src/util/isBehaveNode.ts +6 -0
  269. package/src/util/isValidConnection.ts +51 -17
  270. package/src/util/mergeSockets.ts +29 -0
  271. package/src/util/serializeVariables.ts +66 -0
  272. package/src/util/sockets.ts +43 -0
  273. package/stories/apex/layoutController/example-graph.worker.ts +39 -0
  274. package/stories/apex/layoutController/index.stories.tsx +48 -0
  275. package/stories/apex/layoutController/webworker.stories.tsx +103 -0
  276. package/stories/apex/menubar/menubar.stories.tsx +19 -0
  277. package/stories/components/colorpicker/index.stories.tsx +20 -0
  278. package/stories/components/contextMenus/edge.stories.tsx +32 -0
  279. package/stories/components/contextMenus/node.stories.tsx +26 -0
  280. package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
  281. package/stories/components/controls/any/index.stories.tsx +19 -0
  282. package/stories/components/controls/boolean/index.stories.tsx +19 -0
  283. package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
  284. package/stories/components/controls/number/index.stories.tsx +19 -0
  285. package/stories/components/controls/string/index.stories.tsx +19 -0
  286. package/stories/components/nodes/behaveNode.stories.tsx +108 -0
  287. package/stories/components/panels/alignment.stories.tsx +24 -0
  288. package/stories/components/panels/events.stories.tsx +38 -0
  289. package/stories/components/panels/graphRunner.stories.tsx +317 -0
  290. package/stories/components/panels/history.stories.tsx +37 -0
  291. package/stories/components/panels/keymaps.stories.tsx +21 -0
  292. package/stories/components/panels/legend.stories.tsx +37 -0
  293. package/stories/components/panels/logs.stories.tsx +24 -0
  294. package/stories/components/panels/nodeInputs.stories.tsx +21 -0
  295. package/stories/components/panels/nodePicker.stories.tsx +37 -0
  296. package/stories/components/panels/panel.stories.tsx +39 -0
  297. package/stories/components/panels/search.stories.tsx +24 -0
  298. package/stories/components/panels/systemSettings.stories.tsx +26 -0
  299. package/stories/components/panels/traces.stories.tsx +225 -0
  300. package/stories/components/panels/variables.stories.tsx +24 -0
  301. package/stories/defaults/defaultStoryProvider.tsx +170 -0
  302. package/stories/defaults/systemGenerator.ts +43 -0
  303. package/stories/plugins/notes.stories.tsx +100 -0
  304. package/tests/autoConvert.test.ts +329 -0
  305. package/tests/autosavePlugin.test.ts +204 -0
  306. package/tests/callSubgraphSync.test.ts +148 -0
  307. package/tests/commandRegistry.test.ts +137 -0
  308. package/tests/components/edges/offsetBezier.test.ts +51 -0
  309. package/tests/components/layoutController/utils.test.ts +68 -0
  310. package/tests/components/panels/traces/utils.test.ts +52 -0
  311. package/tests/contract.test.ts +51 -0
  312. package/tests/contractSerialize.test.ts +62 -0
  313. package/tests/deriveSpans.test.ts +71 -0
  314. package/tests/flowToBehave.test.ts +27 -4
  315. package/tests/hotkeys.test.ts +79 -0
  316. package/tests/keepAliveLifecycle.test.ts +167 -0
  317. package/tests/loadManifest.test.ts +113 -0
  318. package/tests/noteMarkdown.test.ts +65 -0
  319. package/tests/notesPlugin.test.ts +162 -0
  320. package/tests/notifications.test.ts +87 -0
  321. package/tests/persistence.test.ts +51 -0
  322. package/tests/saveLoad.test.ts +373 -0
  323. package/tests/settings.test.ts +178 -0
  324. package/tests/traceStore.test.ts +46 -0
  325. package/tests/util/calculateNewEdge.test.ts +98 -0
  326. package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
  327. package/tests/util/hasPositionMetaData.test.ts +33 -0
  328. package/tests/util/isBehaveNode.test.ts +22 -0
  329. package/tests/util/isHandleConnected.test.ts +37 -0
  330. package/tests/util/mergeSockets.test.ts +43 -0
  331. package/tests/visual/README.md +64 -0
  332. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
  333. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
  334. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
  335. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
  336. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
  337. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
  338. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
  339. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-localGraphRunner-chromium-win32.png +0 -0
  340. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
  341. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
  342. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
  343. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
  344. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
  345. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
  346. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
  347. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
  348. package/tests/visual/panels.visual.test.tsx +76 -0
  349. package/tests/wasdPan.test.ts +71 -0
  350. package/tsconfig.base.json +39 -0
  351. package/tsconfig.json +18 -59
  352. package/tsconfig.prod.json +23 -0
  353. package/tsdown.config.ts +15 -3
  354. package/typedoc.json +7 -7
  355. package/vite.config.js +7 -0
  356. package/vitest.config.ts +5 -2
  357. package/vitest.visual.config.ts +55 -0
  358. package/src/components/AutoSizeInput.tsx +0 -65
  359. package/src/components/Controls.tsx +0 -87
  360. package/src/components/InputSocket.tsx +0 -142
  361. package/src/components/Node.tsx +0 -68
  362. package/src/components/NodeContainer.tsx +0 -46
  363. package/src/components/NodePicker.tsx +0 -77
  364. package/src/components/OutputSocket.tsx +0 -58
  365. package/src/components/modals/ClearModal.tsx +0 -40
  366. package/src/components/modals/HelpModal.tsx +0 -36
  367. package/src/components/modals/LoadModal.tsx +0 -96
  368. package/src/components/modals/Modal.tsx +0 -64
  369. package/src/components/modals/SaveModal.tsx +0 -60
  370. package/src/hooks/useCustomNodeTypes.tsx +0 -31
  371. package/src/hooks/useGraphRunner.ts +0 -104
  372. package/src/hooks/useMergeMap.ts +0 -14
  373. package/src/hooks/useNodeSpecJson.ts +0 -20
  374. package/src/hooks/useQueriableDefinitions.ts +0 -22
  375. package/src/styles.css +0 -8
  376. package/tailwind.config.ts +0 -19
  377. package/tests/tsconfig.json +0 -10
  378. /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ import * as Popover from '@radix-ui/react-popover';
2
+ import React from 'react';
3
+ import styles from './InputPopover.module.css';
4
+ import { Xmark } from 'iconoir-react';
5
+
6
+ interface IInputPopover {
7
+ children: React.ReactNode;
8
+ trigger: React.ReactNode;
9
+ defaultOpen?: boolean;
10
+ }
11
+
12
+ const InputPopover = ({
13
+ defaultOpen = false,
14
+ children,
15
+ trigger
16
+ }: IInputPopover) => (
17
+ <Popover.Root defaultOpen={defaultOpen}>
18
+ <Popover.Trigger asChild>{trigger}</Popover.Trigger>
19
+ <Popover.Portal>
20
+ <Popover.Content className={styles.popoverContent} sideOffset={5}>
21
+ {children}
22
+ <Popover.Close className={styles.popoverClose} aria-label="Close">
23
+ <Xmark />
24
+ </Popover.Close>
25
+ <Popover.Arrow className={styles.popoverArrow} />
26
+ </Popover.Content>
27
+ </Popover.Portal>
28
+ </Popover.Root>
29
+ );
30
+
31
+ export default InputPopover;
@@ -0,0 +1,18 @@
1
+ .colorPickerTrigger {
2
+ cursor: pointer;
3
+ border-radius: var(--component-radii-sm);
4
+ border: 1px solid var(--color-neutral-stroke-subtle);
5
+ width: 16px;
6
+ height: 16px;
7
+ flex-shrink: 0;
8
+ padding: 0;
9
+
10
+ &:hover {
11
+ outline: 1px solid var(--color-neutral-stroke-default);
12
+ }
13
+ }
14
+
15
+ .popoverCloseRemoveButton {
16
+ all: unset;
17
+ margin: var(--component-spacing-md);
18
+ }
@@ -0,0 +1,61 @@
1
+ import { VscodeButton, VscodeTextfield } from '@vscode-elements/react-elements';
2
+ import { HexColorPicker } from 'react-colorful';
3
+ import { PopoverClose } from '@radix-ui/react-popover';
4
+ import InputPopover from './InputPopover.js';
5
+ import styles from './index.module.css';
6
+
7
+ export function ColorControl({
8
+ value,
9
+ onChange
10
+ }: Pick<ColorPickerPopoverProps, 'value' | 'onChange'>) {
11
+ return (
12
+ <HexColorPicker
13
+ color={value}
14
+ onChange={onChange}
15
+ style={{ flexShrink: 0 }}
16
+ />
17
+ );
18
+ }
19
+
20
+ type ColorPickerPopoverProps = {
21
+ value: string;
22
+ defaultOpen?: boolean;
23
+ onChange: (value: string) => void;
24
+ showRemoveButton?: boolean;
25
+ onRemove?: () => void;
26
+ };
27
+
28
+ export function ColorPickerPopover({
29
+ value,
30
+ defaultOpen = false,
31
+ onChange,
32
+ showRemoveButton = false,
33
+ onRemove
34
+ }: ColorPickerPopoverProps) {
35
+ return (
36
+ <InputPopover
37
+ defaultOpen={defaultOpen}
38
+ trigger={
39
+ <button
40
+ style={{ background: value }}
41
+ className={styles.colorPickerTrigger}
42
+ />
43
+ }
44
+ >
45
+ <ColorControl value={value} onChange={onChange} />
46
+ <VscodeTextfield
47
+ value={value}
48
+ onChange={(event) => {
49
+ onChange((event.target as HTMLInputElement).value);
50
+ }}
51
+ />
52
+ {showRemoveButton && (
53
+ <PopoverClose className={styles.popoverCloseRemoveButton}>
54
+ <VscodeButton onClick={onRemove} style={{ background: 'red' }}>
55
+ Remove color
56
+ </VscodeButton>
57
+ </PopoverClose>
58
+ )}
59
+ </InputPopover>
60
+ );
61
+ }
@@ -0,0 +1,35 @@
1
+ import React, { useCallback } from 'react';
2
+ import type { ControlProps } from '@/store/controls';
3
+ import { VscodeTextfield } from '@vscode-elements/react-elements';
4
+
5
+ export const NumberControl: React.FC<ControlProps> = ({
6
+ value,
7
+ onChange,
8
+ valueType
9
+ }) => {
10
+ const isInteger = valueType === 'integer';
11
+
12
+ const handleChange = useCallback(
13
+ (e: Event) => {
14
+ //WOW the @vscode-elements/react-elements typings are really bad, we have to do this hack to get the value out of the event
15
+ const stringValue = (e as unknown as React.ChangeEvent<HTMLInputElement>)
16
+ .currentTarget.value;
17
+ const num = isInteger
18
+ ? parseInt(stringValue, 10)
19
+ : parseFloat(stringValue);
20
+ if (!isNaN(num)) {
21
+ onChange(num);
22
+ }
23
+ },
24
+ [isInteger, onChange]
25
+ );
26
+
27
+ return (
28
+ <VscodeTextfield
29
+ type="number"
30
+ value={value ?? ''}
31
+ onChange={handleChange}
32
+ step={isInteger ? 1 : undefined}
33
+ />
34
+ );
35
+ };
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import type { ControlProps } from '@/store/controls';
3
+ import {
4
+ VscodeTextarea,
5
+ VscodeTextfield
6
+ } from '@vscode-elements/react-elements';
7
+
8
+ export const StringControl: React.FC<ControlProps> = ({ value, onChange }) => {
9
+ return (
10
+ <VscodeTextarea
11
+ // type="text"
12
+ value={value ?? ''}
13
+ onChange={(e) => onChange((e.currentTarget as HTMLTextAreaElement).value)}
14
+ />
15
+ );
16
+ };
@@ -0,0 +1,475 @@
1
+ import { getBetterBezierPath } from './offsetBezier';
2
+ import {
3
+ getSimpleBezierPath,
4
+ getSmoothStepPath,
5
+ getStraightPath,
6
+ type EdgeProps,
7
+ useReactFlow,
8
+ Position
9
+ } from 'reactflow';
10
+ import { useSystem } from '@/system/provider.js';
11
+ import { useStore } from 'zustand';
12
+ import { EDGE_TYPE } from '@/store/settings';
13
+ import { useState, useCallback, type MouseEvent } from 'react';
14
+
15
+ interface ControlPoint {
16
+ x: number;
17
+ y: number;
18
+ }
19
+
20
+ /** The reactflow path builder that backs a given edge type when there are no
21
+ * control points. Unknown types fall back to the better-bezier builder. */
22
+ function edgeFnForType(edgeType: string) {
23
+ switch (edgeType) {
24
+ case EDGE_TYPE.simpleBezier:
25
+ return getSimpleBezierPath;
26
+ case EDGE_TYPE.smoothStep:
27
+ return getSmoothStepPath;
28
+ case EDGE_TYPE.straight:
29
+ return getStraightPath;
30
+ case EDGE_TYPE.bezier:
31
+ default:
32
+ return getBetterBezierPath;
33
+ }
34
+ }
35
+
36
+ /** Straight polyline through every point. */
37
+ function straightPathThrough(points: ControlPoint[]): string {
38
+ return points
39
+ .map((p, i) => (i === 0 ? `M ${p.x},${p.y}` : `L ${p.x},${p.y}`))
40
+ .join(' ');
41
+ }
42
+
43
+ /** Orthogonal "smooth step" path that jogs at the midpoint of each segment. */
44
+ function smoothStepPathThrough(points: ControlPoint[]): string {
45
+ let path = `M ${points[0]?.x},${points[0]?.y}`;
46
+ for (let i = 0; i < points.length - 1; i++) {
47
+ const current = points[i];
48
+ const next = points[i + 1];
49
+ if (!current || !next) continue;
50
+ const midX = (current.x + next.x) / 2;
51
+ path += ` L ${midX},${current.y} L ${midX},${next.y}`;
52
+ }
53
+ path += ` L ${points[points.length - 1]?.x},${points[points.length - 1]?.y}`;
54
+ return path;
55
+ }
56
+
57
+ /** Curved path through every point, degrading to line/quadratic for 2/3 points. */
58
+ function bezierPathThrough(points: ControlPoint[]): string {
59
+ if (points.length === 2) {
60
+ return `M ${points[0]?.x},${points[0]?.y} L ${points[1]?.x},${points[1]?.y}`;
61
+ }
62
+ if (points.length === 3) {
63
+ return `M ${points[0]?.x},${points[0]?.y} Q ${points[1]?.x},${points[1]?.y} ${points[2]?.x},${points[2]?.y}`;
64
+ }
65
+
66
+ // For multiple control points, chain quadratic segments and finish with a line.
67
+ let path = `M ${points[0]?.x},${points[0]?.y}`;
68
+ for (let i = 0; i < points.length - 1; i++) {
69
+ const p1 = points[i + 1];
70
+ if (!p1) continue;
71
+
72
+ if (i === points.length - 2) {
73
+ path += ` L ${p1.x},${p1.y}`;
74
+ continue;
75
+ }
76
+
77
+ path += ` Q ${p1.x},${p1.y}`;
78
+ const p2 = points[i + 2];
79
+ if (p2) {
80
+ const midX = (p1.x + p2.x) / 2;
81
+ const midY = (p1.y + p2.y) / 2;
82
+ path += ` ${midX},${midY}`;
83
+ }
84
+ }
85
+ return path;
86
+ }
87
+
88
+ // Generate path for different edge types with control points
89
+ function generatePathWithControlPoints(
90
+ sourceX: number,
91
+ sourceY: number,
92
+ targetX: number,
93
+ targetY: number,
94
+ controlPoints: ControlPoint[],
95
+ edgeType: string,
96
+ _sourcePosition?: Position,
97
+ _targetPosition?: Position
98
+ ): string {
99
+ if (controlPoints.length === 0) {
100
+ // No control points, use the default builder for the edge type.
101
+ const [path] = edgeFnForType(edgeType)({
102
+ sourceX,
103
+ sourceY,
104
+ sourcePosition: _sourcePosition,
105
+ targetX,
106
+ targetY,
107
+ targetPosition: _targetPosition
108
+ });
109
+ return path;
110
+ }
111
+
112
+ // Build path through all control points
113
+ const allPoints = [
114
+ { x: sourceX, y: sourceY },
115
+ ...controlPoints,
116
+ { x: targetX, y: targetY }
117
+ ];
118
+
119
+ if (edgeType === EDGE_TYPE.straight) {
120
+ return straightPathThrough(allPoints);
121
+ }
122
+ if (edgeType === EDGE_TYPE.smoothStep) {
123
+ return smoothStepPathThrough(allPoints);
124
+ }
125
+ return bezierPathThrough(allPoints);
126
+ }
127
+
128
+ type CustomEdgeProps = EdgeProps & {
129
+ data: {
130
+ controlPoints?: ControlPoint[];
131
+ text?: string;
132
+ };
133
+ };
134
+
135
+ export const CustomEdge = ({
136
+ id,
137
+ sourceX,
138
+ sourceY,
139
+ targetX,
140
+ targetY,
141
+ sourcePosition,
142
+ targetPosition,
143
+ data,
144
+ markerEnd,
145
+ selected
146
+ }: CustomEdgeProps) => {
147
+ const sys = useSystem();
148
+ const edgeType = useStore(sys.systemSettings, (x) => x.edgeType);
149
+ const snapGrid = useStore(sys.systemSettings, (x) => x.snapGrid);
150
+ const gridSize = useStore(sys.systemSettings, (x) => x.gridSize);
151
+ const { setEdges } = useReactFlow();
152
+
153
+ // Get control points from edge data
154
+ const controlPoints: ControlPoint[] = data?.controlPoints || [];
155
+ const [draggingIndex, setDraggingIndex] = useState<number | null>(null);
156
+
157
+ const handleDoubleClick = useCallback(
158
+ (event: MouseEvent<SVGPathElement>) => {
159
+ event.stopPropagation();
160
+
161
+ // Get click position on SVG
162
+ const svgElement = (event.target as SVGElement).ownerSVGElement;
163
+ if (!svgElement) return;
164
+
165
+ const point = svgElement.createSVGPoint();
166
+ point.x = event.clientX;
167
+ point.y = event.clientY;
168
+ const svgPoint = point.matrixTransform(
169
+ svgElement.getScreenCTM()?.inverse()
170
+ );
171
+
172
+ // Build array of all points (source -> control points -> target)
173
+ const allPoints = [
174
+ { x: sourceX, y: sourceY },
175
+ ...controlPoints,
176
+ { x: targetX, y: targetY }
177
+ ];
178
+
179
+ // Find which segment was clicked by finding closest segment
180
+ let closestSegmentIndex = 0;
181
+ let minDistance = Infinity;
182
+
183
+ for (let i = 0; i < allPoints.length - 1; i++) {
184
+ const p1 = allPoints[i];
185
+ const p2 = allPoints[i + 1];
186
+ if (!p1 || !p2) continue;
187
+
188
+ // Calculate distance from click point to line segment
189
+ const dx = p2.x - p1.x;
190
+ const dy = p2.y - p1.y;
191
+ const lengthSquared = dx * dx + dy * dy;
192
+
193
+ let t = 0;
194
+ if (lengthSquared > 0) {
195
+ t = Math.max(
196
+ 0,
197
+ Math.min(
198
+ 1,
199
+ ((svgPoint.x - p1.x) * dx + (svgPoint.y - p1.y) * dy) /
200
+ lengthSquared
201
+ )
202
+ );
203
+ }
204
+
205
+ const projX = p1.x + t * dx;
206
+ const projY = p1.y + t * dy;
207
+ const distance = Math.sqrt(
208
+ (svgPoint.x - projX) ** 2 + (svgPoint.y - projY) ** 2
209
+ );
210
+
211
+ if (distance < minDistance) {
212
+ minDistance = distance;
213
+ closestSegmentIndex = i;
214
+ }
215
+ }
216
+
217
+ // Insert the new control point at the correct position
218
+ setEdges((edges) =>
219
+ edges.map((edge) => {
220
+ if (edge.id !== id) return edge;
221
+
222
+ const currentPoints = edge.data?.controlPoints || [];
223
+ const newPoints = [...currentPoints];
224
+
225
+ // closestSegmentIndex 0 means between source and first control point (or target if no control points)
226
+ // So we insert at index closestSegmentIndex
227
+ newPoints.splice(closestSegmentIndex, 0, {
228
+ x: svgPoint.x,
229
+ y: svgPoint.y
230
+ });
231
+
232
+ return {
233
+ ...edge,
234
+ data: {
235
+ ...edge.data,
236
+ controlPoints: newPoints
237
+ }
238
+ };
239
+ })
240
+ );
241
+ },
242
+ [id, sourceX, sourceY, targetX, targetY, controlPoints, setEdges]
243
+ );
244
+
245
+ const handleControlPointMouseDown = useCallback(
246
+ (event: MouseEvent<SVGGElement>, index: number) => {
247
+ event.stopPropagation();
248
+ setDraggingIndex(index);
249
+
250
+ const handleMouseMove = (moveEvent: globalThis.MouseEvent) => {
251
+ const svgElement = (event.target as SVGElement).ownerSVGElement;
252
+ if (!svgElement) return;
253
+
254
+ const point = svgElement.createSVGPoint();
255
+ point.x = moveEvent.clientX;
256
+ point.y = moveEvent.clientY;
257
+ const svgPoint = point.matrixTransform(
258
+ svgElement.getScreenCTM()?.inverse()
259
+ );
260
+
261
+ // Snap to grid if enabled
262
+ let x = svgPoint.x;
263
+ let y = svgPoint.y;
264
+ if (snapGrid) {
265
+ x = Math.round(x / gridSize) * gridSize;
266
+ y = Math.round(y / gridSize) * gridSize;
267
+ }
268
+
269
+ setEdges((edges) =>
270
+ edges.map((edge) => {
271
+ if (edge.id !== id) return edge;
272
+ const points: ControlPoint[] = edge.data?.controlPoints || [];
273
+ const newPoints = [...points];
274
+ newPoints[index] = { x, y };
275
+ return {
276
+ ...edge,
277
+ data: {
278
+ ...edge.data,
279
+ controlPoints: newPoints
280
+ }
281
+ };
282
+ })
283
+ );
284
+ };
285
+
286
+ const handleMouseUp = () => {
287
+ setDraggingIndex(null);
288
+ document.removeEventListener('mousemove', handleMouseMove);
289
+ document.removeEventListener('mouseup', handleMouseUp);
290
+ };
291
+
292
+ document.addEventListener('mousemove', handleMouseMove);
293
+ document.addEventListener('mouseup', handleMouseUp);
294
+ },
295
+ [id, snapGrid, gridSize, setEdges]
296
+ );
297
+
298
+ const handleRemoveControlPoint = useCallback(
299
+ (event: MouseEvent, index: number) => {
300
+ event.stopPropagation();
301
+ setEdges((edges) =>
302
+ edges.map((edge) => {
303
+ if (edge.id !== id) return edge;
304
+ const points: ControlPoint[] = edge.data?.controlPoints || [];
305
+ const newPoints = points.filter((_, i) => i !== index);
306
+ return {
307
+ ...edge,
308
+ data: {
309
+ ...edge.data,
310
+ controlPoints: newPoints
311
+ }
312
+ };
313
+ })
314
+ );
315
+ },
316
+ [id, setEdges]
317
+ );
318
+
319
+ const edgePath = generatePathWithControlPoints(
320
+ sourceX,
321
+ sourceY,
322
+ targetX,
323
+ targetY,
324
+ controlPoints,
325
+ edgeType,
326
+ sourcePosition,
327
+ targetPosition
328
+ );
329
+
330
+ return (
331
+ <>
332
+ <path className="react-flow__edge-path-back" d={edgePath} />
333
+ <path
334
+ id={id}
335
+ fill="none"
336
+ className="react-flow__edge-path"
337
+ d={edgePath}
338
+ markerEnd={markerEnd}
339
+ />
340
+ <path
341
+ d={edgePath}
342
+ fill="none"
343
+ strokeOpacity="0"
344
+ strokeWidth="20"
345
+ className="react-flow__edge-interaction"
346
+ onDoubleClick={handleDoubleClick}
347
+ style={{ cursor: 'pointer' }}
348
+ />
349
+
350
+ {/* Render control points - only when selected */}
351
+ {selected &&
352
+ controlPoints.map((point, index) => {
353
+ const isDragging = draggingIndex === index;
354
+ return (
355
+ <g
356
+ key={`cp-${index}`}
357
+ onMouseDown={(e) => handleControlPointMouseDown(e, index)}
358
+ style={{ cursor: isDragging ? 'grabbing' : 'grab' }}
359
+ >
360
+ {/* Large invisible hit area for easier selection */}
361
+ <circle
362
+ cx={point.x}
363
+ cy={point.y}
364
+ r={15}
365
+ fill="transparent"
366
+ strokeWidth={0}
367
+ pointerEvents="all"
368
+ />
369
+ {/* Visible control point */}
370
+ <circle
371
+ cx={point.x}
372
+ cy={point.y}
373
+ r={7}
374
+ fill="#4CAF50"
375
+ stroke="#fff"
376
+ strokeWidth={2}
377
+ pointerEvents="none"
378
+ />
379
+ {/* Remove button (X) */}
380
+ <g
381
+ onClick={(e) => handleRemoveControlPoint(e, index)}
382
+ style={{ cursor: 'pointer', pointerEvents: 'all' }}
383
+ >
384
+ <circle
385
+ cx={point.x + 10}
386
+ cy={point.y - 10}
387
+ r={6}
388
+ fill="#f44336"
389
+ stroke="#fff"
390
+ strokeWidth={1}
391
+ />
392
+ <text
393
+ x={point.x + 10}
394
+ y={point.y - 10}
395
+ textAnchor="middle"
396
+ dominantBaseline="middle"
397
+ fill="#fff"
398
+ fontSize="10"
399
+ fontWeight="bold"
400
+ pointerEvents="none"
401
+ >
402
+ ×
403
+ </text>
404
+ </g>
405
+ </g>
406
+ );
407
+ })}
408
+
409
+ {/* Guide lines showing control point influence - only when selected */}
410
+ {selected &&
411
+ controlPoints.length > 0 &&
412
+ controlPoints[0] &&
413
+ controlPoints[controlPoints.length - 1] && (
414
+ <>
415
+ <line
416
+ x1={sourceX}
417
+ y1={sourceY}
418
+ x2={controlPoints[0].x}
419
+ y2={controlPoints[0].y}
420
+ stroke="#4CAF50"
421
+ strokeWidth={1}
422
+ strokeDasharray="3,3"
423
+ opacity={0.2}
424
+ pointerEvents="none"
425
+ />
426
+ {controlPoints.map((point, index) => {
427
+ if (index < controlPoints.length - 1) {
428
+ const nextPoint = controlPoints[index + 1];
429
+ if (!nextPoint || !point) return null;
430
+ return (
431
+ <line
432
+ key={`guide-${index}`}
433
+ x1={point.x}
434
+ y1={point.y}
435
+ x2={nextPoint.x}
436
+ y2={nextPoint.y}
437
+ stroke="#4CAF50"
438
+ strokeWidth={1}
439
+ strokeDasharray="3,3"
440
+ opacity={0.2}
441
+ pointerEvents="none"
442
+ />
443
+ );
444
+ }
445
+ return null;
446
+ })}
447
+ {controlPoints[controlPoints.length - 1] && (
448
+ <line
449
+ x1={controlPoints[controlPoints.length - 1]!.x}
450
+ y1={controlPoints[controlPoints.length - 1]!.y}
451
+ x2={targetX}
452
+ y2={targetY}
453
+ stroke="#4CAF50"
454
+ strokeWidth={1}
455
+ strokeDasharray="3,3"
456
+ opacity={0.2}
457
+ pointerEvents="none"
458
+ />
459
+ )}
460
+ </>
461
+ )}
462
+
463
+ <text>
464
+ <textPath
465
+ href={`#${id}`}
466
+ style={{ fontSize: 12 }}
467
+ startOffset="50%"
468
+ textAnchor="middle"
469
+ >
470
+ {data?.text}
471
+ </textPath>
472
+ </text>
473
+ </>
474
+ );
475
+ };