@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,278 @@
1
+ import { createStore, type StoreApi } from 'zustand';
2
+ import type { EdgeChange, XYPosition } from 'reactflow';
3
+ import type { System } from '@/system/system';
4
+ import type { GraphSession } from '@/system/graphSession';
5
+
6
+ /**
7
+ * Context handed to a command when it runs. Carries the editor + the graph it
8
+ * acts on, plus optional targets so the same command works from a context menu,
9
+ * a hotkey, or a toolbar button.
10
+ */
11
+ export type CommandContext = {
12
+ editor: System;
13
+ session: GraphSession;
14
+ nodeId?: string;
15
+ edgeId?: string;
16
+ sourceId?: string;
17
+ targetId?: string;
18
+ position?: XYPosition;
19
+ };
20
+
21
+ /**
22
+ * A named, dispatchable action. Decouples *what* (id) from *how* (run), so UI
23
+ * surfaces (context menus, hotkeys, menubar, toolbar) reference commands by id
24
+ * instead of reaching into concrete stores.
25
+ */
26
+ export type Command = {
27
+ id: string;
28
+ title?: string;
29
+ /** When present and false, the command is treated as unavailable. */
30
+ isEnabled?: (ctx: CommandContext) => boolean;
31
+ run: (ctx: CommandContext) => void | Promise<void>;
32
+ };
33
+
34
+ export type CommandStore = {
35
+ commands: Map<string, Command>;
36
+ /** Register (or replace) a command. Returns an unregister disposer. */
37
+ register: (command: Command) => () => void;
38
+ unregister: (id: string) => void;
39
+ get: (id: string) => Command | undefined;
40
+ list: () => Command[];
41
+ /** Run a command by id; no-ops (with a warning) if unknown or disabled. */
42
+ run: (id: string, ctx: CommandContext) => void | Promise<void>;
43
+ };
44
+
45
+ export const commandStoreFactory = (): StoreApi<CommandStore> =>
46
+ createStore<CommandStore>((set, get) => ({
47
+ commands: new Map(),
48
+ register: (command) => {
49
+ set((s) => {
50
+ const next = new Map(s.commands);
51
+ next.set(command.id, command);
52
+ return { commands: next };
53
+ });
54
+ return () => get().unregister(command.id);
55
+ },
56
+ unregister: (id) =>
57
+ set((s) => {
58
+ if (!s.commands.has(id)) return s;
59
+ const next = new Map(s.commands);
60
+ next.delete(id);
61
+ return { commands: next };
62
+ }),
63
+ get: (id) => get().commands.get(id),
64
+ list: () => Array.from(get().commands.values()),
65
+ run: (id, ctx) => {
66
+ const command = get().commands.get(id);
67
+ if (!command) {
68
+ console.warn(`[commands] unknown command: ${id}`);
69
+ return;
70
+ }
71
+ if (command.isEnabled && !command.isEnabled(ctx)) return;
72
+ return command.run(ctx);
73
+ }
74
+ }));
75
+
76
+ // --- Default graph commands --------------------------------------------------
77
+ // Transitional: these delegate to the per-session action store. As actions are
78
+ // decomposed (a later slice), the logic can move into the command handlers and
79
+ // the action store can shrink.
80
+
81
+ const actionsOf = (ctx: CommandContext) =>
82
+ ctx.session.actionStore.getState().actions;
83
+
84
+ const centerOnNode = (session: GraphSession, nodeId: string): void => {
85
+ const node = session.nodeStore.getState().nodes.find((n) => n.id === nodeId);
86
+ if (!node) return;
87
+ const x = node.position.x + (node.width ?? 0) / 2;
88
+ const y = node.position.y + (node.height ?? 0) / 2;
89
+ session.refStore
90
+ .getState()
91
+ .getRef('reactflow')
92
+ ?.setCenter(x, y, { duration: 200, zoom: 1 });
93
+ };
94
+
95
+ const reactFlowOf = (session: GraphSession) =>
96
+ session.refStore.getState().getRef('reactflow');
97
+
98
+ /**
99
+ * Register the built-in editor commands. Hosts may override any of them by
100
+ * re-registering with the same id, or add their own.
101
+ */
102
+ export const registerDefaultCommands = (
103
+ store: StoreApi<CommandStore>
104
+ ): void => {
105
+ const { register } = store.getState();
106
+
107
+ register({
108
+ id: 'node.focus',
109
+ title: 'Focus',
110
+ run: (ctx) => {
111
+ if (ctx.nodeId) actionsOf(ctx).focusNode(ctx.nodeId);
112
+ }
113
+ });
114
+ register({
115
+ id: 'node.traceUpstream',
116
+ title: 'Trace Upstream',
117
+ run: (ctx) => {
118
+ if (ctx.nodeId) actionsOf(ctx).traceUpstream(ctx.nodeId);
119
+ }
120
+ });
121
+ register({
122
+ id: 'node.traceDownstream',
123
+ title: 'Trace Downstream',
124
+ run: (ctx) => {
125
+ if (ctx.nodeId) actionsOf(ctx).traceDownstream(ctx.nodeId);
126
+ }
127
+ });
128
+ register({
129
+ id: 'trace.reset',
130
+ title: 'Reset Trace',
131
+ run: (ctx) => actionsOf(ctx).resetTrace()
132
+ });
133
+ register({
134
+ id: 'node.togglePinned',
135
+ title: 'Pin / Unpin',
136
+ run: (ctx) => {
137
+ if (ctx.nodeId) actionsOf(ctx).toggleNodePinned(ctx.nodeId);
138
+ }
139
+ });
140
+ register({
141
+ id: 'node.toggleHidden',
142
+ title: 'Hide / Show',
143
+ run: (ctx) => {
144
+ if (ctx.nodeId) actionsOf(ctx).toggleNodeHidden(ctx.nodeId);
145
+ }
146
+ });
147
+
148
+ register({
149
+ id: 'edge.findSource',
150
+ title: 'Find Source',
151
+ run: (ctx) => {
152
+ if (ctx.sourceId) centerOnNode(ctx.session, ctx.sourceId);
153
+ }
154
+ });
155
+ register({
156
+ id: 'edge.findTarget',
157
+ title: 'Find Target',
158
+ run: (ctx) => {
159
+ if (ctx.targetId) centerOnNode(ctx.session, ctx.targetId);
160
+ }
161
+ });
162
+ register({
163
+ id: 'edge.delete',
164
+ title: 'Delete',
165
+ run: (ctx) => {
166
+ if (!ctx.edgeId) return;
167
+ const change: EdgeChange = { id: ctx.edgeId, type: 'remove' };
168
+ ctx.session.edgeStore.getState().applyEdgeChanges([change]);
169
+ }
170
+ });
171
+
172
+ register({
173
+ id: 'selection.copy',
174
+ title: 'Copy',
175
+ run: (ctx) => actionsOf(ctx).copySelectionToClipboard()
176
+ });
177
+ register({
178
+ id: 'selection.paste',
179
+ title: 'Paste',
180
+ run: (ctx) => actionsOf(ctx).pasteFromClipboard()
181
+ });
182
+ register({
183
+ id: 'selection.group',
184
+ title: 'Group',
185
+ run: (ctx) => actionsOf(ctx).groupNodes()
186
+ });
187
+ register({
188
+ id: 'selection.selectAll',
189
+ title: 'Select All',
190
+ run: (ctx) =>
191
+ ctx.session.nodeStore
192
+ .getState()
193
+ .setNodes((nodes) => nodes.map((n) => ({ ...n, selected: true })))
194
+ });
195
+
196
+ // Editor-level
197
+ register({
198
+ id: 'editor.save',
199
+ title: 'Save Graph',
200
+ run: (ctx) => {
201
+ void actionsOf(ctx).save();
202
+ }
203
+ });
204
+ register({
205
+ id: 'editor.undo',
206
+ title: 'Undo',
207
+ run: (ctx) => ctx.session.undoManager.undo()
208
+ });
209
+ register({
210
+ id: 'editor.redo',
211
+ title: 'Redo',
212
+ run: (ctx) => ctx.session.undoManager.redo()
213
+ });
214
+ register({
215
+ id: 'editor.find',
216
+ title: 'Find',
217
+ run: (ctx) => ctx.editor.tabStore.getState().openTab('find')
218
+ });
219
+ // `editor.autoLayout` is contributed by the optional layout plugin
220
+ // (`@/plugin/layout`), which owns the heavy elkjs/dagre dependencies. When
221
+ // that plugin is not registered the command is simply unavailable and the
222
+ // bound hotkey no-ops.
223
+
224
+ // View
225
+ register({
226
+ id: 'view.fit',
227
+ title: 'Fit View',
228
+ run: (ctx) => {
229
+ reactFlowOf(ctx.session)?.fitView({
230
+ padding: 0.2,
231
+ includeHiddenNodes: true
232
+ });
233
+ }
234
+ });
235
+ register({
236
+ id: 'view.zoomIn',
237
+ title: 'Zoom In',
238
+ run: (ctx) => reactFlowOf(ctx.session)?.zoomIn({ duration: 300 })
239
+ });
240
+ register({
241
+ id: 'view.zoomOut',
242
+ title: 'Zoom Out',
243
+ run: (ctx) => reactFlowOf(ctx.session)?.zoomOut({ duration: 300 })
244
+ });
245
+ register({
246
+ id: 'view.zoomReset',
247
+ title: 'Reset Zoom',
248
+ run: (ctx) => {
249
+ const rf = reactFlowOf(ctx.session);
250
+ if (!rf) return;
251
+ rf.setViewport({ ...rf.getViewport(), zoom: 1 });
252
+ }
253
+ });
254
+ register({
255
+ id: 'view.toggleGrid',
256
+ title: 'Toggle Grid',
257
+ run: (ctx) => {
258
+ const s = ctx.editor.systemSettings.getState();
259
+ s.setShowGrid(!s.showGrid);
260
+ }
261
+ });
262
+ register({
263
+ id: 'view.toggleMinimap',
264
+ title: 'Toggle Minimap',
265
+ run: (ctx) => {
266
+ const s = ctx.editor.systemSettings.getState();
267
+ s.setShowMinimap(!s.showMinimap);
268
+ }
269
+ });
270
+ register({
271
+ id: 'view.toggleSnapGrid',
272
+ title: 'Toggle Snap to Grid',
273
+ run: (ctx) => {
274
+ const s = ctx.editor.systemSettings.getState();
275
+ s.setSnapGrid(!s.snapGrid);
276
+ }
277
+ });
278
+ };
@@ -0,0 +1,192 @@
1
+ import { createStore, type StoreApi } from 'zustand';
2
+ import { hidden, pinned } from '@/annotations';
3
+ import { isBehaveNode } from '@/util/isBehaveNode';
4
+ import type { CommandContext } from './commands';
5
+
6
+ /** Which canvas target a context-menu item applies to. */
7
+ export type ContextMenuTarget = 'node' | 'edge' | 'selection' | 'pane';
8
+
9
+ /**
10
+ * A registrable context-menu entry. Items dispatch either a registered command
11
+ * (`commandId`) or an inline `onSelect`. `group` controls separator placement;
12
+ * `order` controls position within a target. `when` hides the item dynamically.
13
+ */
14
+ export type ContextMenuItem = {
15
+ id: string;
16
+ target: ContextMenuTarget;
17
+ /** Static text, or a function for state-dependent labels (e.g. Pin/Unpin). */
18
+ label: string | ((ctx: CommandContext) => string);
19
+ keybinding?: string;
20
+ /** Ascending sort within the target. */
21
+ order?: number;
22
+ /** Items with different adjacent groups get a separator between them. */
23
+ group?: string | number;
24
+ when?: (ctx: CommandContext) => boolean;
25
+ /** Dispatch a registered command by id. */
26
+ commandId?: string;
27
+ /** Or run inline (takes precedence over commandId). */
28
+ onSelect?: (ctx: CommandContext) => void;
29
+ };
30
+
31
+ export type ContextMenuStore = {
32
+ items: ContextMenuItem[];
33
+ /** Register (or replace by id) an item. Returns an unregister disposer. */
34
+ register: (item: ContextMenuItem) => () => void;
35
+ unregister: (id: string) => void;
36
+ /** Items for a target, sorted by `order`. Filtering by `when` is the caller's. */
37
+ getItems: (target: ContextMenuTarget) => ContextMenuItem[];
38
+ };
39
+
40
+ export const contextMenuStoreFactory = (): StoreApi<ContextMenuStore> =>
41
+ createStore<ContextMenuStore>((set, get) => ({
42
+ items: [],
43
+ register: (item) => {
44
+ set((s) => ({
45
+ items: [...s.items.filter((i) => i.id !== item.id), item]
46
+ }));
47
+ return () => get().unregister(item.id);
48
+ },
49
+ unregister: (id) =>
50
+ set((s) => ({ items: s.items.filter((i) => i.id !== id) })),
51
+ getItems: (target) =>
52
+ get()
53
+ .items.filter((i) => i.target === target)
54
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))
55
+ }));
56
+
57
+ // --- Default context menus ---------------------------------------------------
58
+
59
+ const nodeAt = (ctx: CommandContext) =>
60
+ ctx.session.nodeStore.getState().nodes.find((n) => n.id === ctx.nodeId);
61
+
62
+ const nodeFlag = (ctx: CommandContext, key: string): boolean => {
63
+ const node = nodeAt(ctx);
64
+ return node && 'data' in node
65
+ ? Boolean((node.data.annotations as Record<string, unknown>)?.[key])
66
+ : false;
67
+ };
68
+
69
+ // The default node items only make sense on behave nodes; presentational node
70
+ // types (notes, groups, ...) register their own `when`-scoped items instead.
71
+ const isBehaveTarget = (ctx: CommandContext): boolean => {
72
+ const node = nodeAt(ctx);
73
+ return node !== undefined && isBehaveNode(node);
74
+ };
75
+
76
+ /**
77
+ * Register the built-in context-menu items, dispatching the default commands.
78
+ * Hosts can add/remove/replace items by id without forking the menu components.
79
+ */
80
+ export const registerDefaultContextMenu = (
81
+ store: StoreApi<ContextMenuStore>
82
+ ): void => {
83
+ const { register } = store.getState();
84
+
85
+ // Node
86
+ register({
87
+ id: 'node.focus',
88
+ target: 'node',
89
+ label: 'Focus',
90
+ order: 10,
91
+ group: 'focus',
92
+ when: isBehaveTarget,
93
+ commandId: 'node.focus'
94
+ });
95
+ register({
96
+ id: 'node.traceUpstream',
97
+ target: 'node',
98
+ label: 'Trace Upstream',
99
+ order: 20,
100
+ group: 'trace',
101
+ when: isBehaveTarget,
102
+ commandId: 'node.traceUpstream'
103
+ });
104
+ register({
105
+ id: 'node.traceDownstream',
106
+ target: 'node',
107
+ label: 'Trace Downstream',
108
+ order: 21,
109
+ group: 'trace',
110
+ when: isBehaveTarget,
111
+ commandId: 'node.traceDownstream'
112
+ });
113
+ register({
114
+ id: 'node.resetTrace',
115
+ target: 'node',
116
+ label: 'Reset Trace',
117
+ order: 30,
118
+ group: 'reset',
119
+ when: isBehaveTarget,
120
+ commandId: 'trace.reset'
121
+ });
122
+ register({
123
+ id: 'node.togglePinned',
124
+ target: 'node',
125
+ label: (ctx) => (nodeFlag(ctx, pinned) ? 'Unpin' : 'Pin'),
126
+ order: 40,
127
+ group: 'visibility',
128
+ when: isBehaveTarget,
129
+ commandId: 'node.togglePinned'
130
+ });
131
+ register({
132
+ id: 'node.toggleHidden',
133
+ target: 'node',
134
+ label: (ctx) => (nodeFlag(ctx, hidden) ? 'Show' : 'Hide'),
135
+ order: 41,
136
+ group: 'visibility',
137
+ when: isBehaveTarget,
138
+ commandId: 'node.toggleHidden'
139
+ });
140
+
141
+ // Edge
142
+ register({
143
+ id: 'edge.findSource',
144
+ target: 'edge',
145
+ label: 'Find Source',
146
+ order: 10,
147
+ group: 'find',
148
+ commandId: 'edge.findSource'
149
+ });
150
+ register({
151
+ id: 'edge.findTarget',
152
+ target: 'edge',
153
+ label: 'Find Target',
154
+ order: 11,
155
+ group: 'find',
156
+ commandId: 'edge.findTarget'
157
+ });
158
+ register({
159
+ id: 'edge.delete',
160
+ target: 'edge',
161
+ label: 'Delete',
162
+ order: 20,
163
+ group: 'delete',
164
+ commandId: 'edge.delete'
165
+ });
166
+
167
+ // Selection
168
+ register({
169
+ id: 'selection.copy',
170
+ target: 'selection',
171
+ label: 'Copy',
172
+ order: 10,
173
+ group: 'clipboard',
174
+ commandId: 'selection.copy'
175
+ });
176
+ register({
177
+ id: 'selection.paste',
178
+ target: 'selection',
179
+ label: 'Paste',
180
+ order: 11,
181
+ group: 'clipboard',
182
+ commandId: 'selection.paste'
183
+ });
184
+ register({
185
+ id: 'selection.group',
186
+ target: 'selection',
187
+ label: 'Group',
188
+ order: 20,
189
+ group: 'group',
190
+ commandId: 'selection.group'
191
+ });
192
+ };
@@ -0,0 +1,62 @@
1
+ import { AnyControl } from '@/components/controls/any';
2
+ import { BooleanControl } from '@/components/controls/boolean';
3
+ import { NumberControl } from '@/components/controls/number';
4
+ import { StringControl } from '@/components/controls/string';
5
+ import { ColorControl } from '@/components/controls/colorPicker';
6
+ import {
7
+ Cube,
8
+ Droplet,
9
+ EaseCurveControlPoints,
10
+ Hashtag,
11
+ InputOutput,
12
+ SelectPoint3d,
13
+ Text
14
+ } from 'iconoir-react';
15
+ import { create } from 'zustand';
16
+
17
+ export interface ControlProps<T = any> {
18
+ value: T;
19
+ onChange: (value: T) => void;
20
+ valueType?: string;
21
+ }
22
+
23
+ export type ControlComponent<T = any> = React.FC<ControlProps<T>>;
24
+
25
+ export type ControlsStore = {
26
+ icons: Record<string, React.ComponentType>;
27
+ controls: Record<string, React.FC<ControlProps>>;
28
+ defaultControl: React.FC<ControlProps>;
29
+ registerControl: (name: string, control: React.FC<ControlProps>) => void;
30
+ };
31
+
32
+ export const controlsStoreFactory = () =>
33
+ create<ControlsStore>((set) => ({
34
+ // store the component references (not instantiated elements)
35
+ defaultIcon: SelectPoint3d,
36
+
37
+ defaultControl: AnyControl,
38
+ controls: {
39
+ color: ColorControl,
40
+ string: StringControl,
41
+ number: NumberControl,
42
+ float: NumberControl,
43
+ integer: NumberControl,
44
+ boolean: BooleanControl
45
+ },
46
+ icons: {
47
+ color: Droplet,
48
+ curve: EaseCurveControlPoints,
49
+ string: Text,
50
+ boolean: InputOutput,
51
+ float: Hashtag,
52
+ integer: Hashtag,
53
+ object: Cube
54
+ },
55
+ registerControl: (name: string, control: React.FC<ControlProps>) =>
56
+ set((state) => ({
57
+ controls: {
58
+ ...state.controls,
59
+ [name]: control
60
+ }
61
+ }))
62
+ }));
@@ -0,0 +1,47 @@
1
+ import { create, type StoreApi } from 'zustand';
2
+
3
+ /**
4
+ * A user/plugin-defined automatic type conversion: "when connecting a `from`
5
+ * socket to a `to` socket, splice in `nodeType`". `inputKey`/`outputKey` name
6
+ * the converter's value sockets; when omitted they're resolved from the node
7
+ * spec (first non-flow input/output).
8
+ */
9
+ export type ConversionRule = {
10
+ from: string;
11
+ to: string;
12
+ nodeType: string;
13
+ inputKey?: string;
14
+ outputKey?: string;
15
+ };
16
+
17
+ export type ConversionStore = {
18
+ conversions: ConversionRule[];
19
+ /** Add (or replace the existing rule for the same from→to pair). */
20
+ registerConversion: (rule: ConversionRule) => void;
21
+ removeConversion: (from: string, to: string) => void;
22
+ setConversions: (rules: ConversionRule[]) => void;
23
+ findConversion: (from: string, to: string) => ConversionRule | undefined;
24
+ };
25
+
26
+ export const conversionStoreFactory = (): StoreApi<ConversionStore> =>
27
+ create<ConversionStore>((set, get) => ({
28
+ conversions: [],
29
+ registerConversion: (rule) =>
30
+ set((s) => ({
31
+ conversions: [
32
+ ...s.conversions.filter(
33
+ (c) => !(c.from === rule.from && c.to === rule.to)
34
+ ),
35
+ rule
36
+ ]
37
+ })),
38
+ removeConversion: (from, to) =>
39
+ set((s) => ({
40
+ conversions: s.conversions.filter(
41
+ (c) => !(c.from === from && c.to === to)
42
+ )
43
+ })),
44
+ setConversions: (conversions) => set({ conversions: [...conversions] }),
45
+ findConversion: (from, to) =>
46
+ get().conversions.find((c) => c.from === from && c.to === to)
47
+ }));
@@ -0,0 +1,69 @@
1
+ import { create } from 'zustand';
2
+ import type React from 'react';
3
+
4
+ /**
5
+ * Documentation metadata for a node type
6
+ */
7
+ export type NodeDocumentation = {
8
+ /** The node type this documentation applies to */
9
+ type: string;
10
+ /** Optional icon to display for the node */
11
+ icon?: React.ReactNode;
12
+ /** Short description (one line) */
13
+ shortDescription?: string;
14
+ /** Tags for categorization and search */
15
+ tags?: string[];
16
+ /** Long rich markdown description */
17
+ markdownDescription?: string;
18
+ };
19
+
20
+ export type DocumentationStore = {
21
+ /** Map of node type to documentation */
22
+ docs: Map<string, NodeDocumentation>;
23
+ /** Set documentation for a specific node type */
24
+ setDocumentation: (
25
+ type: string,
26
+ doc: Omit<NodeDocumentation, 'type'>
27
+ ) => void;
28
+ /** Set documentation for multiple node types at once */
29
+ setMultipleDocumentation: (docs: NodeDocumentation[]) => void;
30
+ /** Get documentation for a specific node type */
31
+ getDocumentation: (type: string) => NodeDocumentation | undefined;
32
+ /** Clear all documentation */
33
+ clearDocumentation: () => void;
34
+ /** Remove documentation for a specific type */
35
+ removeDocumentation: (type: string) => void;
36
+ };
37
+
38
+ export const documentationStoreFactory = () => {
39
+ return create<DocumentationStore>((set, get) => ({
40
+ docs: new Map(),
41
+
42
+ setDocumentation: (type: string, doc: Omit<NodeDocumentation, 'type'>) =>
43
+ set((state) => {
44
+ const newDocs = new Map(state.docs);
45
+ newDocs.set(type, { type, ...doc });
46
+ return { docs: newDocs };
47
+ }),
48
+
49
+ setMultipleDocumentation: (docs: NodeDocumentation[]) =>
50
+ set((state) => {
51
+ const newDocs = new Map(state.docs);
52
+ for (const doc of docs) {
53
+ newDocs.set(doc.type, doc);
54
+ }
55
+ return { docs: newDocs };
56
+ }),
57
+
58
+ getDocumentation: (type: string) => get().docs.get(type),
59
+
60
+ clearDocumentation: () => set({ docs: new Map() }),
61
+
62
+ removeDocumentation: (type: string) =>
63
+ set((state) => {
64
+ const newDocs = new Map(state.docs);
65
+ newDocs.delete(type);
66
+ return { docs: newDocs };
67
+ })
68
+ }));
69
+ };