@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,707 @@
1
+ /**
2
+ * Graph Runner client implementation with abstracted transport layer
3
+ */
4
+
5
+ import type {
6
+ EventFilter,
7
+ GraphRunnerCapabilities,
8
+ GraphRunnerClientConfig,
9
+ GraphRunnerMessage,
10
+ ServerGraphRunnerMessage,
11
+ RunStatus,
12
+ ServerEvent,
13
+ ServerVariable,
14
+ SocketConstraint
15
+ } from './types';
16
+ import {
17
+ WebSocketTransport,
18
+ type ITransport,
19
+ type TransportState
20
+ } from './transport';
21
+ import type { NodeSpecJSON, GraphJSON } from '@kiberon-labs/behave-graph';
22
+
23
+ /**
24
+ * Extract message type by its 'type' field
25
+ */
26
+ type ExtractMessage<T extends string> = Extract<
27
+ ServerGraphRunnerMessage,
28
+ { type: T }
29
+ >;
30
+
31
+ /**
32
+ * Map of client request message types to their expected server response types
33
+ */
34
+ type RequestResponseMap = {
35
+ createSession: 'sessionCreated';
36
+ resumeSession: 'sessionResumed';
37
+ closeSession: 'sessionClosed';
38
+ getCapabilities: 'capabilities';
39
+ batchGetStatus: 'batchStatus';
40
+ getRunHistory: 'runHistory';
41
+ getServerVariables: 'serverVariables';
42
+ getServerEvents: 'serverEvents';
43
+ getSocketConstraints: 'socketConstraints';
44
+ registerGraph: 'graphRegistered';
45
+ getNodeTypes: 'nodeTypes';
46
+ validateGraph: 'validationResult';
47
+ runGraph: 'runStarted';
48
+ stopGraph: 'stopped';
49
+ getStatus: 'status';
50
+ listGraphs: 'graphList';
51
+ };
52
+
53
+ /**
54
+ * Extract the response type for a given request type
55
+ */
56
+ type ResponseForRequest<T extends keyof RequestResponseMap> = ExtractMessage<
57
+ RequestResponseMap[T]
58
+ >;
59
+
60
+ /**
61
+ * Handler for messages received from the server
62
+ * Generic type parameter ensures the handler receives the correct message type
63
+ */
64
+ type ServerMessageHandler<T extends ServerGraphRunnerMessage['type']> = (
65
+ message: ExtractMessage<T>
66
+ ) => void;
67
+
68
+ /**
69
+ * Client for the Behave-Graph Execution Protocol
70
+ * Supports multiple transport implementations (WebSocket, HTTP, etc.)
71
+ */
72
+ export class GraphRunnerClient {
73
+ public transport: ITransport;
74
+ private config: GraphRunnerClientConfig;
75
+ private messageHandlers = new Map<string, Set<ServerMessageHandler<any>>>();
76
+ private sessionId: string | null = null;
77
+ private capabilities: GraphRunnerCapabilities | null = null;
78
+ private serverId: string | null = null;
79
+ private authenticated = false;
80
+ private userId: string | null = null;
81
+ private pendingRequests = new Map<
82
+ string,
83
+ { resolve: (value: any) => void; reject: (error: any) => void }
84
+ >();
85
+ private connectionState:
86
+ | 'disconnected'
87
+ | 'connecting'
88
+ | 'authenticating'
89
+ | 'connected' = 'disconnected';
90
+
91
+ constructor(config: GraphRunnerClientConfig) {
92
+ this.config = config;
93
+
94
+ // Use provided transport or create default WebSocket transport
95
+ if (config.transport) {
96
+ this.transport = config.transport;
97
+ } else if (config.url) {
98
+ this.transport = new WebSocketTransport({
99
+ url: config.url,
100
+ reconnectInterval: config.reconnectInterval,
101
+ heartbeatInterval: config.heartbeatInterval
102
+ });
103
+ } else {
104
+ throw new Error('Either transport or url must be provided');
105
+ }
106
+
107
+ // Set up transport handlers
108
+ this.transport.onMessage((message) =>
109
+ this.handleMessage(message as unknown as ServerGraphRunnerMessage)
110
+ );
111
+ this.transport.onStateChange((state) =>
112
+ this.handleTransportStateChange(state)
113
+ );
114
+ this.transport.onError((error) => this.handleTransportError(error));
115
+ }
116
+
117
+ async connect(): Promise<void> {
118
+ return new Promise((resolve, reject) => {
119
+ this.connectionState = 'connecting';
120
+
121
+ // Wait for transport to connect
122
+ this.transport
123
+ .connect()
124
+ .then(() => {
125
+ this.connectionState = 'authenticating';
126
+
127
+ // Wait for welcome message
128
+ const welcomeHandler = (msg: ServerGraphRunnerMessage) => {
129
+ if (msg.type === 'welcome') {
130
+ this.serverId = msg.serverId;
131
+ this.authenticated = msg.authenticated;
132
+ this.userId = msg.userId ?? null;
133
+ this.connectionState = 'connected';
134
+ this.off('welcome', welcomeHandler);
135
+ this.off('error', welcomeHandler);
136
+ resolve();
137
+ } else if (msg.type === 'error') {
138
+ this.connectionState = 'disconnected';
139
+ this.off('welcome', welcomeHandler);
140
+ this.off('error', welcomeHandler);
141
+ reject(new Error(`Connection failed: ${msg.message}`));
142
+ }
143
+ };
144
+
145
+ this.on('welcome', welcomeHandler);
146
+ this.on('error', welcomeHandler);
147
+
148
+ // Send hello message
149
+ this.send({
150
+ type: 'hello',
151
+ protocolVersion: this.config.protocolVersion ?? '1.0.0',
152
+ auth: this.config.auth ?? { type: 'none' }
153
+ });
154
+ })
155
+ .then(async () => {
156
+ await this.getCapabilities();
157
+ })
158
+ .catch((error) => {
159
+ this.connectionState = 'disconnected';
160
+ reject(error);
161
+ });
162
+ });
163
+ }
164
+
165
+ disconnect(): void {
166
+ this.transport.disconnect();
167
+ this.connectionState = 'disconnected';
168
+ }
169
+
170
+ async createSession(metadata?: Record<string, unknown>): Promise<string> {
171
+ const response = await this.request<'createSession'>({
172
+ type: 'createSession',
173
+ metadata: metadata ?? this.config.metadata
174
+ });
175
+ this.sessionId = response.sessionId;
176
+ return response.sessionId;
177
+ }
178
+
179
+ async resumeSession(sessionId: string): Promise<string[]> {
180
+ const response = await this.request<'resumeSession'>({
181
+ type: 'resumeSession',
182
+ sessionId
183
+ });
184
+ this.sessionId = sessionId;
185
+ return response.activeRuns;
186
+ }
187
+
188
+ async closeSession(): Promise<void> {
189
+ if (!this.sessionId) return;
190
+ await this.request({ type: 'closeSession', sessionId: this.sessionId });
191
+ this.sessionId = null;
192
+ }
193
+
194
+ async getCapabilities(): Promise<GraphRunnerCapabilities> {
195
+ const response = await this.request<'getCapabilities'>({
196
+ type: 'getCapabilities'
197
+ });
198
+ this.capabilities = response.capabilities;
199
+ return response.capabilities;
200
+ }
201
+
202
+ async getServerVariables(): Promise<ServerVariable[]> {
203
+ this.ensureSession();
204
+ const response = await this.request<'getServerVariables'>({
205
+ type: 'getServerVariables',
206
+ sessionId: this.sessionId!
207
+ });
208
+ return response.variables;
209
+ }
210
+
211
+ async getServerEvents(): Promise<ServerEvent[]> {
212
+ this.ensureSession();
213
+ const response = await this.request<'getServerEvents'>({
214
+ type: 'getServerEvents',
215
+ sessionId: this.sessionId!
216
+ });
217
+ return response.events;
218
+ }
219
+
220
+ async getSocketConstraints(
221
+ nodeType: string,
222
+ socketName: string
223
+ ): Promise<{
224
+ valueType: string;
225
+ constraints: SocketConstraint;
226
+ }> {
227
+ this.ensureSession();
228
+ const response = await this.request<'getSocketConstraints'>({
229
+ type: 'getSocketConstraints',
230
+ sessionId: this.sessionId!,
231
+ nodeType,
232
+ socketName
233
+ });
234
+ return {
235
+ valueType: response.valueType,
236
+ constraints: response.constraints
237
+ };
238
+ }
239
+
240
+ async getNodeTypes(): Promise<NodeSpecJSON[]> {
241
+ this.ensureSession();
242
+ const response = await this.request<'getNodeTypes'>({
243
+ type: 'getNodeTypes',
244
+ sessionId: this.sessionId!
245
+ });
246
+ return response.nodes;
247
+ }
248
+
249
+ async registerGraph(graphId: string, graph: GraphJSON): Promise<void> {
250
+ this.ensureSession();
251
+ await this.request<'registerGraph'>({
252
+ type: 'registerGraph',
253
+ sessionId: this.sessionId!,
254
+ graphId,
255
+ graph
256
+ });
257
+ }
258
+
259
+ async listGraphs(): Promise<
260
+ Array<{ graphId: string; registeredAt: number }>
261
+ > {
262
+ this.ensureSession();
263
+ const response = await this.request<'listGraphs'>({
264
+ type: 'listGraphs',
265
+ sessionId: this.sessionId!
266
+ });
267
+ return response.graphs;
268
+ }
269
+
270
+ async validateGraph(
271
+ graphId: string,
272
+ graph: unknown
273
+ ): Promise<{
274
+ valid: boolean;
275
+ errors: Array<{ nodeId: string; message: string; severity: string }>;
276
+ warnings: Array<{ nodeId: string; message: string; severity: string }>;
277
+ }> {
278
+ this.ensureSession();
279
+ const response = await this.request<'validateGraph'>({
280
+ type: 'validateGraph',
281
+ sessionId: this.sessionId!,
282
+ graphId,
283
+ graph
284
+ });
285
+ return {
286
+ valid: response.valid,
287
+ errors: response.errors,
288
+ warnings: response.warnings
289
+ };
290
+ }
291
+
292
+ async runGraph(
293
+ graphId: string,
294
+ options?: { graph?: unknown; inputs?: unknown; trace?: boolean }
295
+ ): Promise<string> {
296
+ this.ensureSession();
297
+ const response = await this.request<'runGraph'>({
298
+ type: 'runGraph',
299
+ sessionId: this.sessionId!,
300
+ graphId,
301
+ graph: options?.graph as GraphJSON,
302
+ inputs: options?.inputs,
303
+ options: {
304
+ // Default off , tracing is a debugging aid with a real per-node cost;
305
+ // callers opt in explicitly (the run controller passes the panel's
306
+ // "Enable execution tracing" preference).
307
+ trace: options?.trace ?? false
308
+ }
309
+ });
310
+
311
+ return response.runId;
312
+ }
313
+
314
+ async stopGraph(runId: string): Promise<void> {
315
+ this.ensureSession();
316
+ await this.request({
317
+ type: 'stopGraph',
318
+ sessionId: this.sessionId!,
319
+ runId
320
+ });
321
+ }
322
+
323
+ async getStatus(runId: string) {
324
+ this.ensureSession();
325
+ const response = await this.request({
326
+ type: 'getStatus',
327
+ sessionId: this.sessionId!,
328
+ runId
329
+ });
330
+ return response;
331
+ }
332
+
333
+ async batchGetStatus(
334
+ runIds: string[]
335
+ ): Promise<Array<{ runId: string; status: RunStatus; elapsedMs: number }>> {
336
+ this.ensureSession();
337
+ const response = await this.request({
338
+ type: 'batchGetStatus',
339
+ sessionId: this.sessionId!,
340
+ runIds
341
+ });
342
+ return response.statuses;
343
+ }
344
+
345
+ async subscribe(runId: string, filter?: EventFilter): Promise<void> {
346
+ this.ensureSession();
347
+ this.send({
348
+ type: 'subscribe',
349
+ sessionId: this.sessionId!,
350
+ runId,
351
+ filter
352
+ });
353
+ }
354
+
355
+ async unsubscribe(runId: string): Promise<void> {
356
+ this.ensureSession();
357
+ this.send({
358
+ type: 'unsubscribe',
359
+ sessionId: this.sessionId!,
360
+ runId
361
+ });
362
+ }
363
+
364
+ /**
365
+ * Send a nodeAdded event
366
+ * Used to notify the server when a node is added to the graph during execution
367
+ */
368
+ sendNodeAdded(
369
+ runId: string,
370
+ graphId: string,
371
+ nodeId: string,
372
+ nodeType: string,
373
+ nodeData?: unknown
374
+ ): void {
375
+ this.send({
376
+ type: 'nodeAdded',
377
+ runId,
378
+ graphId,
379
+ nodeId,
380
+ nodeType,
381
+ nodeData
382
+ });
383
+ }
384
+
385
+ async getRunHistory(options?: { limit?: number; graphId?: string }): Promise<
386
+ Array<{
387
+ runId: string;
388
+ graphId: string;
389
+ status: RunStatus;
390
+ startedAt: number;
391
+ completedAt?: number;
392
+ elapsedMs: number;
393
+ result?: unknown;
394
+ }>
395
+ > {
396
+ this.ensureSession();
397
+ const response = await this.request({
398
+ type: 'getRunHistory',
399
+ sessionId: this.sessionId!,
400
+ limit: options?.limit,
401
+ graphId: options?.graphId
402
+ });
403
+ return response.runs;
404
+ }
405
+
406
+ // Realtime modification methods
407
+
408
+ addNode(
409
+ runId: string,
410
+ nodeId: string,
411
+ nodeType: string,
412
+ nodeData?: Record<string, unknown>,
413
+ position?: { x: number; y: number }
414
+ ): void {
415
+ this.ensureSession();
416
+ this.send({
417
+ type: 'addNode',
418
+ sessionId: this.sessionId!,
419
+ runId,
420
+ nodeId,
421
+ nodeType,
422
+ nodeData,
423
+ position
424
+ });
425
+ }
426
+
427
+ removeNode(runId: string, nodeId: string): void {
428
+ this.ensureSession();
429
+ this.send({
430
+ type: 'removeNode',
431
+ sessionId: this.sessionId!,
432
+ runId,
433
+ nodeId
434
+ });
435
+ }
436
+
437
+ updateSocketValue(
438
+ runId: string,
439
+ nodeId: string,
440
+ socketName: string,
441
+ value: unknown
442
+ ): void {
443
+ this.ensureSession();
444
+ this.send({
445
+ type: 'updateSocketValue',
446
+ sessionId: this.sessionId!,
447
+ runId,
448
+ nodeId,
449
+ socketName,
450
+ value
451
+ });
452
+ }
453
+
454
+ updateNodeParam(
455
+ runId: string,
456
+ nodeId: string,
457
+ paramName: string,
458
+ value: unknown
459
+ ): void {
460
+ this.ensureSession();
461
+ this.send({
462
+ type: 'updateNodeParam',
463
+ sessionId: this.sessionId!,
464
+ runId,
465
+ nodeId,
466
+ paramName,
467
+ value
468
+ });
469
+ }
470
+
471
+ createLink(
472
+ runId: string,
473
+ fromNodeId: string,
474
+ fromSocket: string,
475
+ toNodeId: string,
476
+ toSocket: string
477
+ ): void {
478
+ this.ensureSession();
479
+ this.send({
480
+ type: 'createLink',
481
+ sessionId: this.sessionId!,
482
+ runId,
483
+ fromNodeId,
484
+ fromSocket,
485
+ toNodeId,
486
+ toSocket
487
+ });
488
+ }
489
+
490
+ removeLink(
491
+ runId: string,
492
+ fromNodeId: string,
493
+ fromSocket: string,
494
+ toNodeId: string,
495
+ toSocket: string
496
+ ): void {
497
+ this.ensureSession();
498
+ this.send({
499
+ type: 'removeLink',
500
+ sessionId: this.sessionId!,
501
+ runId,
502
+ fromNodeId,
503
+ fromSocket,
504
+ toNodeId,
505
+ toSocket
506
+ });
507
+ }
508
+
509
+ directExecuteNode(
510
+ runId: string,
511
+ nodeId: string,
512
+ inputSocketName: string,
513
+ inputValue: unknown,
514
+ autoExecMode: 'new' | 'current' = 'current'
515
+ ): void {
516
+ this.ensureSession();
517
+ this.send({
518
+ type: 'directExecuteNode',
519
+ sessionId: this.sessionId!,
520
+ runId,
521
+ nodeId,
522
+ inputSocketName,
523
+ inputValue,
524
+ autoExecMode
525
+ });
526
+ }
527
+
528
+ on<T extends ServerGraphRunnerMessage['type']>(
529
+ messageType: T,
530
+ handler: ServerMessageHandler<T>
531
+ ): void {
532
+ if (!this.messageHandlers.has(messageType)) {
533
+ this.messageHandlers.set(messageType, new Set());
534
+ }
535
+ this.messageHandlers.get(messageType)!.add(handler);
536
+ }
537
+
538
+ off<T extends ServerGraphRunnerMessage['type']>(
539
+ messageType: T,
540
+ handler: ServerMessageHandler<T>
541
+ ): void {
542
+ const handlers = this.messageHandlers.get(messageType);
543
+ if (handlers) {
544
+ handlers.delete(handler);
545
+ }
546
+ }
547
+
548
+ getConnectionState():
549
+ | 'disconnected'
550
+ | 'connecting'
551
+ | 'authenticating'
552
+ | 'connected' {
553
+ return this.connectionState;
554
+ }
555
+
556
+ getSessionId(): string | null {
557
+ return this.sessionId;
558
+ }
559
+
560
+ getCachedCapabilities(): GraphRunnerCapabilities | null {
561
+ return this.capabilities;
562
+ }
563
+
564
+ isAuthenticated(): boolean {
565
+ return this.authenticated;
566
+ }
567
+
568
+ getUserId(): string | null {
569
+ return this.userId;
570
+ }
571
+
572
+ getServerId(): string | null {
573
+ return this.serverId;
574
+ }
575
+
576
+ isConnected(): boolean {
577
+ return this.connectionState === 'connected';
578
+ }
579
+
580
+ private send(message: GraphRunnerMessage): void {
581
+ this.transport.send(message);
582
+ // Track sent message if callback is configured
583
+ if (this.config.onMessageActivity) {
584
+ this.config.onMessageActivity('sent', message);
585
+ }
586
+ }
587
+
588
+ private handleMessage(message: ServerGraphRunnerMessage): void {
589
+ // Track received message if callback is configured
590
+ if (this.config.onMessageActivity) {
591
+ this.config.onMessageActivity(
592
+ 'received',
593
+ message as unknown as GraphRunnerMessage
594
+ );
595
+ }
596
+
597
+ // Notify all handlers for this message type
598
+ const handlers = this.messageHandlers.get(message.type);
599
+ if (handlers) {
600
+ handlers.forEach((handler) => handler(message));
601
+ }
602
+
603
+ // Also notify wildcard handlers
604
+ const wildcardHandlers = this.messageHandlers.get('*');
605
+ if (wildcardHandlers) {
606
+ wildcardHandlers.forEach((handler) => handler(message));
607
+ }
608
+ }
609
+
610
+ private handleTransportStateChange(state: TransportState): void {
611
+ // Map transport state to connection state
612
+ if (state === 'disconnected') {
613
+ this.connectionState = 'disconnected';
614
+ } else if (state === 'connecting') {
615
+ this.connectionState = 'connecting';
616
+ }
617
+ }
618
+
619
+ private handleTransportError(error: Error): void {
620
+ console.error('Transport error:', error);
621
+ // Reject all pending requests
622
+ this.pendingRequests.forEach(({ reject }) => {
623
+ reject(error);
624
+ });
625
+ this.pendingRequests.clear();
626
+ }
627
+
628
+ private async request<T extends keyof RequestResponseMap>(
629
+ message: Extract<GraphRunnerMessage, { type: T }>
630
+ ): Promise<ResponseForRequest<T>> {
631
+ return new Promise((resolve, reject) => {
632
+ const requestId = this.generateRequestId();
633
+ this.pendingRequests.set(requestId, { resolve, reject });
634
+
635
+ const timeout = setTimeout(() => {
636
+ this.pendingRequests.delete(requestId);
637
+ reject(new Error('Request timeout'));
638
+ }, 30000);
639
+
640
+ const responseType = this.getExpectedResponseType(
641
+ (message as { type: T }).type
642
+ );
643
+
644
+ const handler = (msg: ExtractMessage<typeof responseType>) => {
645
+ clearTimeout(timeout);
646
+ this.pendingRequests.delete(requestId);
647
+ this.off(responseType, handler);
648
+ resolve(msg as ResponseForRequest<T>);
649
+ };
650
+
651
+ const errorHandler = (msg: ExtractMessage<'error'>) => {
652
+ clearTimeout(timeout);
653
+ this.pendingRequests.delete(requestId);
654
+ this.off(responseType, handler);
655
+ this.off('error', errorHandler);
656
+ reject(new Error(msg.message));
657
+ };
658
+
659
+ this.on(responseType, handler);
660
+ this.on('error', errorHandler);
661
+
662
+ try {
663
+ this.send(message);
664
+ } catch (error) {
665
+ clearTimeout(timeout);
666
+ this.pendingRequests.delete(requestId);
667
+ this.off(responseType, handler);
668
+ this.off('error', errorHandler);
669
+ reject(error);
670
+ }
671
+ });
672
+ }
673
+
674
+ private ensureSession(): void {
675
+ if (!this.sessionId) {
676
+ throw new Error('No active session. Call createSession() first.');
677
+ }
678
+ }
679
+
680
+ private generateRequestId(): string {
681
+ return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
682
+ }
683
+
684
+ private getExpectedResponseType<T extends keyof RequestResponseMap>(
685
+ requestType: T
686
+ ): RequestResponseMap[T] {
687
+ const responseMap: RequestResponseMap = {
688
+ createSession: 'sessionCreated',
689
+ resumeSession: 'sessionResumed',
690
+ closeSession: 'sessionClosed',
691
+ getCapabilities: 'capabilities',
692
+ getServerVariables: 'serverVariables',
693
+ getServerEvents: 'serverEvents',
694
+ getSocketConstraints: 'socketConstraints',
695
+ getNodeTypes: 'nodeTypes',
696
+ registerGraph: 'graphRegistered',
697
+ listGraphs: 'graphList',
698
+ validateGraph: 'validationResult',
699
+ runGraph: 'runStarted',
700
+ stopGraph: 'stopped',
701
+ getStatus: 'status',
702
+ batchGetStatus: 'batchStatus',
703
+ getRunHistory: 'runHistory'
704
+ };
705
+ return responseMap[requestType];
706
+ }
707
+ }