@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,702 @@
1
+
2
+ # Behave-Graph Execution Protocol (WebSocket)
3
+
4
+ **Version:** 1.0.0
5
+
6
+ This protocol defines a WebSocket-based interface for decoupled execution of behavior graphs. It supports local or remote execution, tracing, session management, and server-sent events for real-time updates. All requests and responses involving graph execution must include the relevant graph IDs, as graphs may call other graphs.
7
+
8
+ ## Overview
9
+ - **Transport:** WebSocket (JSON messages)
10
+ - **Client:** Graph editor or automation
11
+ - **Server:** Graph execution backend (local or remote)
12
+ - **Feature Discovery:** Clients query server capabilities
13
+ - **Event-Driven:** Server emits events for graph lifecycle, tracing, errors, etc.
14
+ - **Reconnection:** Sessions persist across WebSocket reconnections
15
+ - **Message Ordering:** Events are delivered in execution order per runId
16
+
17
+ ---
18
+
19
+ ## 1. Connection & Protocol Negotiation
20
+
21
+ ### Initial Handshake
22
+
23
+ **CRITICAL:** The `hello` message **MUST** be the first message sent by the client after WebSocket connection is established. The server **MUST** reject any other message type sent before `hello` with an error.
24
+
25
+ ### Protocol Version & Authentication
26
+ - **Client → Server (FIRST MESSAGE ONLY):**
27
+ ```json
28
+ {
29
+ "type": "hello",
30
+ "protocolVersion": "1.0.0",
31
+ "auth": {
32
+ "type": "bearer",
33
+ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
34
+ }
35
+ }
36
+ ```
37
+
38
+ **Authentication Types:**
39
+ - `bearer` , Bearer token (JWT or API key)
40
+ - `apiKey` , Simple API key
41
+ - `none` , No authentication (development only)
42
+
43
+ **Example with API Key:**
44
+ ```json
45
+ {
46
+ "type": "hello",
47
+ "protocolVersion": "1.0.0",
48
+ "auth": {
49
+ "type": "apiKey",
50
+ "key": "your-api-key-here"
51
+ }
52
+ }
53
+ ```
54
+
55
+ **Example without authentication:**
56
+ ```json
57
+ {
58
+ "type": "hello",
59
+ "protocolVersion": "1.0.0",
60
+ "auth": {
61
+ "type": "none"
62
+ }
63
+ }
64
+ ```
65
+
66
+ - **Server → Client (Success):**
67
+ ```json
68
+ {
69
+ "type": "welcome",
70
+ "protocolVersion": "1.0.0",
71
+ "serverId": "backend-1",
72
+ "authenticated": true,
73
+ "userId": "user-123"
74
+ }
75
+ ```
76
+
77
+ **Error Responses:**
78
+
79
+ If versions are incompatible:
80
+ ```json
81
+ {
82
+ "type": "error",
83
+ "code": "PROTOCOL_VERSION_MISMATCH",
84
+ "message": "Unsupported version",
85
+ "supportedVersions": ["1.0.0"]
86
+ }
87
+ ```
88
+
89
+ If authentication fails:
90
+ ```json
91
+ {
92
+ "type": "error",
93
+ "code": "AUTHENTICATION_FAILED",
94
+ "message": "Invalid or expired token"
95
+ }
96
+ ```
97
+
98
+ If hello is not the first message:
99
+ ```json
100
+ {
101
+ "type": "error",
102
+ "code": "PROTOCOL_VIOLATION",
103
+ "message": "Hello message must be sent first"
104
+ }
105
+ ```
106
+
107
+ ---
108
+
109
+ ## 2. Session Management
110
+
111
+ ### Create Session
112
+ - **Client → Server:**
113
+ ```json
114
+ { "type": "createSession", "metadata": { "clientId": "editor-1", "user": "dev" } }
115
+ ```
116
+ - **Server → Client:**
117
+ ```json
118
+ { "type": "sessionCreated", "sessionId": "sess-xyz", "expiresAt": 1234567890 }
119
+ ```
120
+
121
+ ### Resume Session (after reconnection)
122
+ - **Client → Server:**
123
+ ```json
124
+ { "type": "resumeSession", "sessionId": "sess-xyz" }
125
+ ```
126
+ - **Server → Client:**
127
+ ```json
128
+ { "type": "sessionResumed", "sessionId": "sess-xyz", "activeRuns": ["abc123", "def456"] }
129
+ ```
130
+
131
+ ### Close Session
132
+ - **Client → Server:**
133
+ ```json
134
+ { "type": "closeSession", "sessionId": "sess-xyz" }
135
+ ```
136
+ - **Server → Client:**
137
+ ```json
138
+ { "type": "sessionClosed", "sessionId": "sess-xyz" }
139
+ ```
140
+
141
+ ### Heartbeat (every 30s recommended)
142
+ - **Client → Server:**
143
+ ```json
144
+ { "type": "ping", "timestamp": 1234567890 }
145
+ ```
146
+ - **Server → Client:**
147
+ ```json
148
+ { "type": "pong", "timestamp": 1234567890 }
149
+ ```
150
+
151
+ All subsequent requests must include the `sessionId`.
152
+
153
+ ---
154
+
155
+ ## 3. Capabilities
156
+
157
+ ### Capabilities Request
158
+ - **Client → Server:**
159
+ ```json
160
+ { "type": "getCapabilities" }
161
+ ```
162
+ - **Server → Client:**
163
+ ```json
164
+ {
165
+ "type": "capabilities",
166
+ "capabilities": {
167
+ "trace": true,
168
+ "validation": true,
169
+ "graphRegistry": true,
170
+ "eventFiltering": true,
171
+ "batchOperations": true,
172
+ "runHistory": true,
173
+ "runtimeMetadata": true,
174
+ "maxConcurrentRuns": 100
175
+ }
176
+ }
177
+ ```
178
+
179
+ ---
180
+
181
+ ## 4. Runtime Metadata (Optional)
182
+
183
+ These endpoints provide the editor with information about server-side runtime state and constraints.
184
+
185
+ ### Query Server Variables
186
+ ```json
187
+ { "type": "getServerVariables", "sessionId": "sess-xyz" }
188
+ ```
189
+ - **Response:**
190
+ ```json
191
+ {
192
+ "type": "serverVariables",
193
+ "variables": [
194
+ {
195
+ "name": "playerHealth",
196
+ "type": "number",
197
+ "currentValue": 100,
198
+ "readonly": false,
199
+ "description": "Current player health points"
200
+ },
201
+ {
202
+ "name": "gameMode",
203
+ "type": "string",
204
+ "currentValue": "survival",
205
+ "readonly": true,
206
+ "description": "Current game mode"
207
+ }
208
+ ]
209
+ }
210
+ ```
211
+
212
+ ### Query Server Events
213
+ ```json
214
+ { "type": "getServerEvents", "sessionId": "sess-xyz" }
215
+ ```
216
+ - **Response:**
217
+ ```json
218
+ {
219
+ "type": "serverEvents",
220
+ "events": [
221
+ {
222
+ "name": "onPlayerDeath",
223
+ "description": "Triggered when a player dies",
224
+ "payloadSchema": {
225
+ "playerId": "string",
226
+ "cause": "string",
227
+ "position": "vector3"
228
+ }
229
+ },
230
+ {
231
+ "name": "onLevelComplete",
232
+ "description": "Triggered when a level is completed",
233
+ "payloadSchema": {
234
+ "levelId": "number",
235
+ "score": "number",
236
+ "timeElapsed": "number"
237
+ }
238
+ }
239
+ ]
240
+ }
241
+ ```
242
+
243
+ ### Query Socket Constraints
244
+ Get metadata about specific node sockets, including allowed values/types.
245
+
246
+ ```json
247
+ {
248
+ "type": "getSocketConstraints",
249
+ "sessionId": "sess-xyz",
250
+ "nodeType": "math/operation",
251
+ "socketName": "operation"
252
+ }
253
+ ```
254
+ - **Response:**
255
+ ```json
256
+ {
257
+ "type": "socketConstraints",
258
+ "nodeType": "math/operation",
259
+ "socketName": "operation",
260
+ "valueType": "string",
261
+ "constraints": {
262
+ "type": "enum",
263
+ "choices": [
264
+ { "value": "add", "label": "Add (+)" },
265
+ { "value": "subtract", "label": "Subtract (-)" },
266
+ { "value": "multiply", "label": "Multiply (×)" },
267
+ { "value": "divide", "label": "Divide (÷)" }
268
+ ]
269
+ }
270
+ }
271
+ ```
272
+
273
+ ### Query All Node Types
274
+ Get metadata about all available node types and their sockets.
275
+
276
+ ```json
277
+ { "type": "getNodeTypes", "sessionId": "sess-xyz" }
278
+ ```
279
+ - **Response:**
280
+ ```json
281
+ {
282
+ "type": "nodeTypes",
283
+ "nodes": [
284
+ {
285
+ "type": "math/operation",
286
+ "category": "math",
287
+ "label": "Math Operation",
288
+ "description": "Perform mathematical operations",
289
+ "inputs": [
290
+ { "name": "a", "valueType": "number", "required": true },
291
+ { "name": "b", "valueType": "number", "required": true },
292
+ { "name": "operation", "valueType": "string", "hasConstraints": true }
293
+ ],
294
+ "outputs": [
295
+ { "name": "result", "valueType": "number" }
296
+ ]
297
+ }
298
+ ]
299
+ }
300
+ ```
301
+
302
+ ---
303
+
304
+ ## 5. Graph Registry (Optional)
305
+
306
+ ### Register Graph
307
+ ```json
308
+ {
309
+ "type": "registerGraph",
310
+ "sessionId": "sess-xyz",
311
+ "graphId": "my-graph-1",
312
+ "graph": { /* graph definition */ }
313
+ }
314
+ ```
315
+ - **Response:**
316
+ ```json
317
+ { "type": "graphRegistered", "graphId": "my-graph-1" }
318
+ ```
319
+
320
+ ### List Registered Graphs
321
+ ```json
322
+ { "type": "listGraphs", "sessionId": "sess-xyz" }
323
+ ```
324
+ - **Response:**
325
+ ```json
326
+ { "type": "graphList", "graphs": [{ "graphId": "my-graph-1", "registeredAt": 1234567890 }] }
327
+ ```
328
+
329
+ ---
330
+
331
+ ## 6. Graph Validation
332
+
333
+ ### Validate Graph
334
+ ```json
335
+ {
336
+ "type": "validateGraph",
337
+ "sessionId": "sess-xyz",
338
+ "graphId": "my-graph-1",
339
+ "graph": { /* graph definition */ }
340
+ }
341
+ ```
342
+ - **Response:**
343
+ ```json
344
+ {
345
+ "type": "validationResult",
346
+ "graphId": "my-graph-1",
347
+ "valid": false,
348
+ "errors": [
349
+ { "nodeId": "node5", "message": "Missing required input", "severity": "error" }
350
+ ],
351
+ "warnings": [
352
+ { "nodeId": "node10", "message": "Unused output", "severity": "warning" }
353
+ ]
354
+ }
355
+ ```
356
+
357
+ ---
358
+
359
+ ## 7. Commands (Client → Server)
360
+
361
+
362
+ ### Run Graph
363
+ ```json
364
+ {
365
+ "type": "runGraph",
366
+ "sessionId": "sess-xyz",
367
+ "graphId": "main-graph-1",
368
+ "graph": { /* graph definition or omit if registered */ },
369
+ "inputs": { /* optional input values */ },
370
+ "options": {
371
+ "trace": true,
372
+ "eventFilter": { "variables": ["score", "health"], "events": ["onDeath"] },
373
+ "maxExecutionTimeMs": 30000,
374
+ // Whether the run finalizes once no fibres are pending. Defaults to
375
+ // false: the run stays alive (servicing event-node subscriptions such
376
+ // as ai/onToolCall) until stopGraph.
377
+ "autoEnd":true
378
+ }
379
+ }
380
+ ```
381
+ - **Response:**
382
+ ```json
383
+ { "type": "runStarted", "runId": "abc123", "graphId": "main-graph-1", "startedAt": 1234567890 }
384
+ ```
385
+
386
+
387
+ ### Stop Graph
388
+ ```json
389
+ { "type": "stopGraph", "sessionId": "sess-xyz", "runId": "abc123" }
390
+ ```
391
+ - **Response:**
392
+ ```json
393
+ { "type": "stopped", "runId": "abc123", "graphId": "main-graph-1", "reason": "user_requested" }
394
+ ```
395
+
396
+
397
+
398
+ ### Query Status
399
+ ```json
400
+ { "type": "getStatus", "sessionId": "sess-xyz", "runId": "abc123" }
401
+ ```
402
+ - **Response:**
403
+ ```json
404
+ {
405
+ "type": "status",
406
+ "runId": "abc123",
407
+ "graphId": "main-graph-1",
408
+ "status": "running",
409
+ "startedAt": 1234567890,
410
+ "elapsedMs": 1532,
411
+ "currentNodeId": "node42",
412
+ "startedGraphs": [
413
+ { "runId": "child-1", "graphId": "sub-graph-1", "status": "completed" },
414
+ { "runId": "child-2", "graphId": "sub-graph-2", "status": "running" }
415
+ ],
416
+ "performance": {
417
+ "nodesExecuted": 42,
418
+ "eventsEmitted": 15,
419
+ "variableChanges": 8
420
+ }
421
+ }
422
+ ```
423
+
424
+ ### Batch Status Query
425
+ ```json
426
+ { "type": "batchGetStatus", "sessionId": "sess-xyz", "runIds": ["abc123", "def456"] }
427
+ ```
428
+ - **Response:**
429
+ ```json
430
+ {
431
+ "type": "batchStatus",
432
+ "statuses": [
433
+ { "runId": "abc123", "status": "running", "elapsedMs": 1532 },
434
+ { "runId": "def456", "status": "completed", "elapsedMs": 890 }
435
+ ]
436
+ }
437
+ ```
438
+
439
+ ### Subscribe to Events
440
+ ```json
441
+ {
442
+ "type": "subscribe",
443
+ "sessionId": "sess-xyz",
444
+ "runId": "abc123",
445
+ "filter": {
446
+ "eventTypes": ["variableChanged", "eventEmitted"],
447
+ "variableNames": ["score"],
448
+ "eventNames": ["onDeath"]
449
+ }
450
+ }
451
+ ```
452
+
453
+ ### Unsubscribe from Events
454
+ ```json
455
+ { "type": "unsubscribe", "sessionId": "sess-xyz", "runId": "abc123" }
456
+ ```
457
+
458
+ ---
459
+
460
+ ## 8. Run History
461
+
462
+ ### Query Run History
463
+ ```json
464
+ {
465
+ "type": "getRunHistory",
466
+ "sessionId": "sess-xyz",
467
+ "limit": 10,
468
+ "graphId": "main-graph-1"
469
+ }
470
+ ```
471
+ - **Response:**
472
+ ```json
473
+ {
474
+ "type": "runHistory",
475
+ "runs": [
476
+ {
477
+ "runId": "abc123",
478
+ "graphId": "main-graph-1",
479
+ "status": "completed",
480
+ "startedAt": 1234567890,
481
+ "completedAt": 1234567900,
482
+ "elapsedMs": 10000,
483
+ "result": { /* output values */ }
484
+ }
485
+ ]
486
+ }
487
+ ```
488
+
489
+ ---
490
+
491
+ ## 9. Server-Sent Events (Server → Client)
492
+
493
+ ### Graph Lifecycle Events
494
+
495
+ #### Run Started
496
+ ```json
497
+ { "type": "runStarted", "runId": "abc123", "graphId": "main-graph-1", "startedAt": 1234567890 }
498
+ ```
499
+
500
+ #### Completed
501
+ ```json
502
+ {
503
+ "type": "completed",
504
+ "runId": "abc123",
505
+ "graphId": "main-graph-1",
506
+ "completedAt": 1234567900,
507
+ "elapsedMs": 10000,
508
+ "result": { /* output values */ },
509
+ "performance": {
510
+ "nodesExecuted": 150,
511
+ "eventsEmitted": 45,
512
+ "variableChanges": 23
513
+ }
514
+ }
515
+ ```
516
+
517
+ #### Stopped
518
+ ```json
519
+ { "type": "stopped", "runId": "abc123", "graphId": "main-graph-1", "reason": "user_requested" }
520
+ ```
521
+
522
+ #### Error
523
+ ```json
524
+ {
525
+ "type": "error",
526
+ "runId": "abc123",
527
+ "graphId": "main-graph-1",
528
+ "code": "NODE_EXECUTION_ERROR",
529
+ "message": "Division by zero",
530
+ "nodeId": "node42",
531
+ "stack": "..."
532
+ }
533
+ ```
534
+
535
+
536
+
537
+ ### Tracing/Debug Events
538
+
539
+ #### Trace Event
540
+ ```json
541
+ {
542
+ "type": "trace",
543
+ "runId": "abc123",
544
+ "graphId": "main-graph-1",
545
+ "nodeId": "node42",
546
+ "event": "activated",
547
+ "data": { "inputs": { ... }, "outputs": { ... } }
548
+ }
549
+ ```
550
+
551
+ #### Trace Batch Event
552
+ Servers should prefer `traceBatch` over per-event `trace` messages: node
553
+ execution produces two events per node (start and end), so a graph ticking at
554
+ display rate emits hundreds of events per frame. Buffering them and flushing
555
+ one batch per flush window (roughly one frame, ~16ms) keeps the message
556
+ pipeline off the hot path. Clients accept both; single `trace` messages remain
557
+ valid for servers that predate batching. Timestamps are run-relative
558
+ milliseconds, stamped when the event occurred (not when the batch flushed).
559
+
560
+ ```json
561
+ {
562
+ "type": "traceBatch",
563
+ "runId": "abc123",
564
+ "graphId": "main-graph-1",
565
+ "events": [
566
+ { "nodeId": "node42", "event": "start", "data": { "typeName": "flow/branch" }, "timestamp": 1200 },
567
+ { "nodeId": "node42", "event": "end", "data": { "typeName": "flow/branch" }, "timestamp": 1201 }
568
+ ]
569
+ }
570
+ ```
571
+
572
+ #### Log Event
573
+ ```json
574
+ {
575
+ "type": "log",
576
+ "runId": "abc123",
577
+ "graphId": "main-graph-1",
578
+ "level": "info",
579
+ "message": "Processing item 42",
580
+ "data": { /* optional context */ }
581
+ }
582
+ ```
583
+
584
+ ### Variable Change Events
585
+ - `variableChanged` , Emitted when a variable's value changes during execution.
586
+ - Includes: `runId`, `graphId`, `variableName`, `oldValue`, `newValue`, and optionally `nodeId` (if the change was triggered by a node).
587
+
588
+ #### Example Variable Change Event
589
+ ```json
590
+ {
591
+ "type": "variableChanged",
592
+ "runId": "abc123",
593
+ "graphId": "main-graph-1",
594
+ "variableName": "score",
595
+ "oldValue": 10,
596
+ "newValue": 11,
597
+ "nodeId": "node99"
598
+ }
599
+ ```
600
+
601
+ ### Event Emission
602
+ - `eventEmitted` , Emitted when an event is triggered during graph execution.
603
+ - Includes: `runId`, `graphId`, `eventName`, `payload`, and optionally `nodeId` (if the event was triggered by a specific node).
604
+
605
+ #### Example Event Emission
606
+ ```json
607
+ {
608
+ "type": "eventEmitted",
609
+ "runId": "abc123",
610
+ "graphId": "main-graph-1",
611
+ "eventName": "onPlayerDeath",
612
+ "payload": { "playerId": "player123", "cause": "fall" },
613
+ "nodeId": "node55"
614
+ }
615
+ ```
616
+
617
+ ### Node Addition Events
618
+ - `nodeAdded` , Emitted when a node is added to a graph during execution.
619
+ - Includes: `runId`, `graphId`, `nodeId`, `nodeType`, and optionally `nodeData` with the full node configuration.
620
+
621
+ #### Example Node Addition Event
622
+ ```json
623
+ {
624
+ "type": "nodeAdded",
625
+ "runId": "abc123",
626
+ "graphId": "main-graph-1",
627
+ "nodeId": "node42",
628
+ "nodeType": "math/add",
629
+ "nodeData": {
630
+ "id": "node42",
631
+ "type": "math/add",
632
+ "position": { "x": 100, "y": 200 },
633
+ "configuration": {}
634
+ }
635
+ }
636
+ ```
637
+
638
+ ---
639
+
640
+ ## 10. Error Handling
641
+
642
+ ### Error Codes
643
+ - `PROTOCOL_VERSION_MISMATCH` , Incompatible protocol versions
644
+ - `PROTOCOL_VIOLATION` , Protocol rules violated (e.g., hello not sent first)
645
+ - `AUTHENTICATION_FAILED` , Invalid or missing authentication credentials
646
+ - `AUTHENTICATION_REQUIRED` , Authentication is required but not provided
647
+ - `SESSION_NOT_FOUND` , Session does not exist or expired
648
+ - `SESSION_EXPIRED` , Session timed out
649
+ - `INVALID_GRAPH` , Graph definition is malformed
650
+ - `VALIDATION_FAILED` , Graph failed validation
651
+ - `RUN_NOT_FOUND` , Run ID does not exist
652
+ - `NODE_EXECUTION_ERROR` , Error during node execution
653
+ - `TIMEOUT` , Execution exceeded max time
654
+ - `CONCURRENT_LIMIT_EXCEEDED` , Too many concurrent runs
655
+ - `PERMISSION_DENIED` , Unauthorized operation
656
+
657
+ ### Error Response Format
658
+ ```json
659
+ {
660
+ "type": "error",
661
+ "code": "NODE_EXECUTION_ERROR",
662
+ "message": "Division by zero in node42",
663
+ "runId": "abc123",
664
+ "graphId": "main-graph-1",
665
+ "nodeId": "node42",
666
+ "details": { /* additional context */ }
667
+ }
668
+ ```
669
+
670
+ ---
671
+
672
+ ## 11. Extensibility & Best Practices
673
+
674
+ ### Protocol Evolution
675
+ - New message types and capabilities can be added without breaking existing clients
676
+ - Clients must check `capabilities` before using optional features
677
+ - Unknown message types should be ignored (forward compatibility)
678
+ - Protocol version follows semantic versioning
679
+
680
+ ### Performance Recommendations
681
+ - Use event filtering to reduce network traffic
682
+ - Batch status queries when checking multiple runs
683
+ - Register frequently-used graphs to avoid re-sending definitions
684
+ - Implement client-side caching of graph validation results
685
+ - Use heartbeat to detect connection issues early
686
+
687
+ ### Security Considerations
688
+ - **Authentication is strongly recommended for production environments**
689
+ - Use bearer tokens (JWT) for secure, stateless authentication
690
+ - Tokens should have reasonable expiration times (e.g., 1 hour for access tokens)
691
+ - Implement token refresh mechanisms for long-lived sessions
692
+ - Sessions should have reasonable expiration times (default: 1 hour)
693
+ - Implement rate limiting on graph execution and authentication attempts
694
+ - Validate all graph definitions before execution
695
+ - Enforce that `hello` is always the first message (reject connections otherwise)
696
+ - Use TLS/WSS in production to encrypt WebSocket traffic
697
+ - Sanitize error messages to avoid information leakage
698
+
699
+ ---
700
+ ## 12. Typescript interface
701
+
702
+ See the [../src/plugin/graphrunner/types.ts](Typescript interface)