@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,184 @@
1
+ /**
2
+ * WebSocket client plugin for the Behave-Graph Execution Protocol
3
+ * Provides UI and store integration for remote graph execution
4
+ */
5
+
6
+ import { type System } from '../../system/system';
7
+ import { graphRunnerClientStoreFactory } from './store';
8
+ import { GraphRunnerClient } from './client';
9
+ import { GraphRunnerPanel } from './panel';
10
+ import { ErrorBoundary } from 'react-error-boundary';
11
+ import { MenuItemElement } from '../../components/menubar/menuItem';
12
+ import type { StoreApi } from 'zustand';
13
+ import type { GraphRunnerClientStore } from './store';
14
+ import { GraphRunnerButtons } from './buttons';
15
+ import { plugin } from '@/system/plugin';
16
+ import { GraphRunner } from './runner';
17
+ import { GraphRunController } from './runController';
18
+ import type { GraphSession } from '@/system/graphSession';
19
+
20
+ export * from './types';
21
+ export * from './client';
22
+ export * from './transport';
23
+ export * from './panel';
24
+ export * from './runner';
25
+ export * from './runController';
26
+ export * from './store';
27
+ export * from './session';
28
+ /**
29
+ * Options for the GraphRunner plugin
30
+ */
31
+ export interface GraphRunnerClientPluginOptions {
32
+ /**
33
+ * Preconfigured GraphRunner client instance.
34
+ * If provided, the plugin will use this client instead of creating a new one.
35
+ * Useful when the client is already connected via a custom transport (e.g., VSCode IPC).
36
+ */
37
+ client?: GraphRunnerClient;
38
+
39
+ /**
40
+ * Preconfigured store instance.
41
+ * If provided, the plugin will use this store instead of creating a new one.
42
+ * Useful for sharing state with external components.
43
+ */
44
+ store?: StoreApi<GraphRunnerClientStore>;
45
+
46
+ /**
47
+ * Whether to skip automatic connection.
48
+ * Default: false (will attempt to connect if client is not provided or not connected)
49
+ */
50
+ skipAutoConnect?: boolean;
51
+
52
+ /**
53
+ * Whether to add the menu item to the Window menu.
54
+ * Default: true
55
+ */
56
+ addMenuItem?: boolean;
57
+ }
58
+
59
+ /**
60
+ * Plugin initialization function
61
+ * Registers the GraphRunnerClient store and actions with the system
62
+ */
63
+ export async function graphRunnerClientPluginLoader(
64
+ system: System,
65
+ options: GraphRunnerClientPluginOptions = {}
66
+ ) {
67
+ // Use provided store or create a new one
68
+ const store = options.store ?? graphRunnerClientStoreFactory(system);
69
+
70
+ // If a preconfigured client is provided, set it in the store
71
+ if (options.client) {
72
+ store.getState().setClient(options.client);
73
+
74
+ // If client is already connected, update connection state
75
+ if (options.client.isConnected()) {
76
+ store.getState().setConnectionState('connected');
77
+
78
+ // Populate connection info if available
79
+ const connectionInfo = {
80
+ serverId: options.client.getServerId(),
81
+ userId: options.client.getUserId(),
82
+ authenticated: options.client.isAuthenticated(),
83
+ capabilities: options.client.getCachedCapabilities(),
84
+ sessionId: null // Session management is external when client is provided
85
+ };
86
+ store.getState().setConnectionInfo(connectionInfo);
87
+ }
88
+ }
89
+
90
+ // Shared connection. Per-session run controllers are created below.
91
+ const runner = new GraphRunner(system, store);
92
+ system.decorate('runner', runner);
93
+
94
+ // Attach a run controller to every graph session (existing + future) so each
95
+ // open graph runs independently over the shared connection. The editor applies
96
+ // this to graphs already open and to every graph created later, and tears the
97
+ // controller down when a graph's tab is closed.
98
+ system.registerSessionExtension((session: GraphSession) => {
99
+ if (!session.runController) {
100
+ session.decorate(
101
+ 'runController',
102
+ new GraphRunController(session, runner)
103
+ );
104
+ }
105
+ return () => {
106
+ session.runController?.dispose();
107
+ session.decorate('runController', undefined);
108
+ };
109
+ });
110
+
111
+ // Add toolbar buttons for graph execution control. Rendered inside each graph
112
+ // tab, GraphRunnerButtons resolves its own session's controller.
113
+ system.toolbarStore.getState().addGroup({
114
+ id: 'graph-runner-controls',
115
+ label: 'Graph Runner',
116
+ buttons: [<GraphRunnerButtons key="graph-runner-buttons" />]
117
+ });
118
+
119
+ system.hotKeyStore.getState().register({
120
+ action: 'PLAY',
121
+ description: 'Triggers playing the graph',
122
+ trigger: 'p',
123
+ handler: () => {
124
+ const controller = system.session?.runController;
125
+ if (!controller) return;
126
+ if (controller.store.getState().isExecuting) {
127
+ controller.stop();
128
+ } else {
129
+ controller.play();
130
+ }
131
+ }
132
+ });
133
+
134
+ // Register the panel with TabLoader
135
+ system.tabLoader.register('graphRunner', () => {
136
+ return {
137
+ id: 'graphRunner',
138
+ closable: true,
139
+ title: 'Remote Graph Runner',
140
+ group: 'default',
141
+ content: () => (
142
+ <ErrorBoundary fallback={'Error loading Graph Runner panel'}>
143
+ <GraphRunnerPanel system={system} />
144
+ </ErrorBoundary>
145
+ )
146
+ };
147
+ });
148
+
149
+ // Add menu item to Window menu (unless disabled)
150
+ if (options.addMenuItem !== false) {
151
+ const menuStore = system.menubarStore;
152
+ const currentItems = menuStore.getState().items;
153
+ const windowMenu = currentItems.find((menu) => menu.name === 'window');
154
+
155
+ if (windowMenu) {
156
+ // Add the Graph Runner menu item to the Window menu
157
+ const newMenuItem = {
158
+ name: 'graphRunner',
159
+ render: function GraphRunnerMenuItem() {
160
+ return (
161
+ <MenuItemElement
162
+ onClick={() => system.tabStore.getState().openTab('graphRunner')}
163
+ key="graphRunner"
164
+ >
165
+ Remote Graph Runner
166
+ </MenuItemElement>
167
+ );
168
+ }
169
+ };
170
+
171
+ menuStore
172
+ .getState()
173
+ .setSubMenuItems('window', [...windowMenu.items, newMenuItem]);
174
+ }
175
+ }
176
+
177
+ if (!options.skipAutoConnect) {
178
+ await runner.connect();
179
+ }
180
+ }
181
+
182
+ export const graphRunnerClientPlugin = plugin(graphRunnerClientPluginLoader, {
183
+ name: 'graph-runner-client'
184
+ });
@@ -0,0 +1,386 @@
1
+ import React, { useState } from 'react';
2
+ import { useStore } from 'zustand';
3
+ import type { System } from '../../system/system';
4
+ import type { AuthCredentials } from './types';
5
+ import {
6
+ VscodeButton,
7
+ VscodeTextfield,
8
+ VscodeCheckbox,
9
+ VscodeSingleSelect,
10
+ VscodeOption,
11
+ VscodeLabel,
12
+ VscodeBadge,
13
+ VscodeTree,
14
+ VscodeTreeItem,
15
+ VscodeCollapsible
16
+ } from '@vscode-elements/react-elements';
17
+ import styles from './styles.module.css';
18
+
19
+ interface GraphRunnerPanelProps {
20
+ system: System;
21
+ }
22
+
23
+ export const GraphRunnerPanel: React.FC<GraphRunnerPanelProps> = ({
24
+ system
25
+ }) => {
26
+ const store = system.runner.store;
27
+
28
+ const connectionState = useStore(store, (state) => state.connectionState);
29
+ const connectionConfig = useStore(store, (state) => state.connectionConfig);
30
+ const connectionInfo = useStore(store, (state) => state.connectionInfo);
31
+ const error = useStore(store, (state) => state.error);
32
+ const serverVariables = useStore(store, (state) => state.serverVariables);
33
+ const serverEvents = useStore(store, (state) => state.serverEvents);
34
+ const nodeTypes = useStore(store, (state) => state.nodeTypes);
35
+ const messageActivity = useStore(store, (state) => state.messageActivity);
36
+ const clearLogsOnRun = useStore(store, (state) => state.clearLogsOnRun);
37
+ const clearTracesOnRun = useStore(store, (state) => state.clearTracesOnRun);
38
+ const enableTracing = useStore(store, (state) => state.enableTracing);
39
+
40
+ const icons = useStore(system.legendStore, (state) => state.icons);
41
+ const defaultIcon = useStore(
42
+ system.legendStore,
43
+ (state) => state.defaultIcon
44
+ );
45
+
46
+ const [url, setUrl] = useState(connectionConfig.url);
47
+ const [authType, setAuthType] = useState<'none' | 'bearer' | 'apiKey'>(
48
+ connectionConfig.auth.type
49
+ );
50
+ const [authToken, setAuthToken] = useState('');
51
+ const [autoReconnect, setAutoReconnect] = useState(
52
+ connectionConfig.autoReconnect
53
+ );
54
+
55
+ const handleConnect = async () => {
56
+ const auth: AuthCredentials =
57
+ authType === 'bearer'
58
+ ? { type: 'bearer', token: authToken }
59
+ : authType === 'apiKey'
60
+ ? { type: 'apiKey', key: authToken }
61
+ : { type: 'none' };
62
+
63
+ store.getState().setConnectionConfig({ url, auth, autoReconnect });
64
+
65
+ await system.runner.connect();
66
+ };
67
+
68
+ const handleDisconnect = async () => {
69
+ await system.runner.disconnect();
70
+ };
71
+
72
+ const handleRefreshMetadata = async () => {
73
+ await system.runner.refreshMetadata();
74
+ };
75
+
76
+ const handleClearMessages = () => {
77
+ store.getState().clearMessageActivity();
78
+ };
79
+
80
+ const isConnected = connectionState === 'connected';
81
+ const isConnecting =
82
+ connectionState === 'connecting' || connectionState === 'authenticating';
83
+
84
+ return (
85
+ <div className={styles.panel}>
86
+ {/* Scrollable Content Container */}
87
+ <div className={styles.scrollContainer}>
88
+ <h3 className={styles.title}>
89
+ Remote Graph Runner
90
+ <VscodeBadge variant="tab-header-counter">
91
+ {isConnected ? 'Connected' : 'Disconnected'}
92
+ </VscodeBadge>
93
+ </h3>
94
+
95
+ <div>
96
+ {/* Connection Form */}
97
+ <VscodeCollapsible heading="Connection Settings">
98
+ <div className={styles.connectionForm}>
99
+ <div>
100
+ <VscodeLabel>Server URL</VscodeLabel>
101
+ <VscodeTextfield
102
+ value={url}
103
+ onChange={(e: any) => setUrl(e.target.value)}
104
+ placeholder="ws://localhost:8080"
105
+ disabled={isConnected || isConnecting}
106
+ className={styles.formField}
107
+ />
108
+ </div>
109
+
110
+ <div>
111
+ <VscodeLabel>Authentication</VscodeLabel>
112
+ <VscodeSingleSelect
113
+ value={authType}
114
+ onChange={(e: any) =>
115
+ setAuthType(e.target.value as 'none' | 'bearer' | 'apiKey')
116
+ }
117
+ disabled={isConnected || isConnecting}
118
+ className={styles.formField}
119
+ >
120
+ <VscodeOption value="none">None</VscodeOption>
121
+ <VscodeOption value="bearer">Bearer Token</VscodeOption>
122
+ <VscodeOption value="apiKey">API Key</VscodeOption>
123
+ </VscodeSingleSelect>
124
+ </div>
125
+
126
+ {authType !== 'none' && (
127
+ <div>
128
+ <VscodeLabel>
129
+ {authType === 'bearer' ? 'Token' : 'API Key'}
130
+ </VscodeLabel>
131
+ <VscodeTextfield
132
+ type="password"
133
+ value={authToken}
134
+ onChange={(e: any) => setAuthToken(e.target.value)}
135
+ placeholder={
136
+ authType === 'bearer'
137
+ ? 'Enter bearer token'
138
+ : 'Enter API key'
139
+ }
140
+ disabled={isConnected || isConnecting}
141
+ className={styles.formField}
142
+ />
143
+ </div>
144
+ )}
145
+
146
+ <VscodeCheckbox
147
+ checked={autoReconnect}
148
+ onChange={(e: any) => setAutoReconnect(e.target.checked)}
149
+ disabled={isConnected || isConnecting}
150
+ >
151
+ Auto-reconnect
152
+ </VscodeCheckbox>
153
+
154
+ <div className={styles.section}>
155
+ <h4 className={styles.sectionTitle}>Execution Preferences</h4>
156
+ <VscodeCheckbox
157
+ checked={enableTracing}
158
+ onChange={(e: any) =>
159
+ store.getState().setEnableTracing(e.target.checked)
160
+ }
161
+ >
162
+ Enable execution tracing
163
+ </VscodeCheckbox>
164
+ <VscodeCheckbox
165
+ checked={clearLogsOnRun}
166
+ onChange={(e: any) =>
167
+ store.getState().setClearLogsOnRun(e.target.checked)
168
+ }
169
+ >
170
+ Clear logs on new run
171
+ </VscodeCheckbox>
172
+ <VscodeCheckbox
173
+ checked={clearTracesOnRun}
174
+ onChange={(e: any) =>
175
+ store.getState().setClearTracesOnRun(e.target.checked)
176
+ }
177
+ >
178
+ Clear traces on new run
179
+ </VscodeCheckbox>
180
+ </div>
181
+
182
+ <div className={styles.buttonGroup}>
183
+ {!isConnected && (
184
+ <VscodeButton
185
+ onClick={handleConnect}
186
+ disabled={isConnecting || !url}
187
+ className={styles.button}
188
+ >
189
+ {isConnecting ? 'Connecting...' : 'Connect'}
190
+ </VscodeButton>
191
+ )}
192
+ {isConnected && (
193
+ <>
194
+ <VscodeButton
195
+ onClick={handleDisconnect}
196
+ className={styles.button}
197
+ >
198
+ Disconnect
199
+ </VscodeButton>
200
+ <VscodeButton
201
+ onClick={handleRefreshMetadata}
202
+ className={styles.button}
203
+ >
204
+ Refresh
205
+ </VscodeButton>
206
+ </>
207
+ )}
208
+ </div>
209
+ </div>
210
+ </VscodeCollapsible>
211
+
212
+ {/* Error Display */}
213
+ {error && (
214
+ <div className={styles.errorBox}>
215
+ <strong>Error:</strong> {error}
216
+ </div>
217
+ )}
218
+
219
+ {/* Connection Info */}
220
+ {isConnected && (
221
+ <VscodeCollapsible heading="Status">
222
+ <div className={styles.infoBox}>
223
+ <div>
224
+ <strong>Status:</strong> Connected
225
+ </div>
226
+ {connectionInfo.serverId && (
227
+ <div className={styles.infoField}>
228
+ <strong>Server:</strong> {connectionInfo.serverId}
229
+ </div>
230
+ )}
231
+ {connectionInfo.sessionId && (
232
+ <div className={styles.infoField}>
233
+ <strong>Session:</strong> {connectionInfo.sessionId}
234
+ </div>
235
+ )}
236
+ {connectionInfo.userId && (
237
+ <div className={styles.infoField}>
238
+ <strong>User:</strong> {connectionInfo.userId}
239
+ </div>
240
+ )}
241
+ {connectionInfo.capabilities && (
242
+ <div className={styles.infoField}>
243
+ <strong>Capabilities:</strong>{' '}
244
+ {Object.entries(connectionInfo.capabilities)
245
+ .filter(([_, v]) => v === true)
246
+ .map(([k]) => k)
247
+ .join(', ')}
248
+ </div>
249
+ )}
250
+ </div>
251
+ </VscodeCollapsible>
252
+ )}
253
+ {isConnected && (
254
+ <>
255
+ <VscodeCollapsible heading="Variables">
256
+ <VscodeBadge slot="decorations">
257
+ {serverVariables.length}
258
+ </VscodeBadge>
259
+ <VscodeTree>
260
+ {serverVariables.map((variable) => {
261
+ const Icon = icons[variable.valueTypeName] ?? defaultIcon;
262
+ const IconComponent = Icon as React.FC<{ slot?: string }>;
263
+ return (
264
+ <VscodeTreeItem key={variable.name}>
265
+ <IconComponent slot="icon-leaf" />
266
+ <span>{variable.name}</span>
267
+ </VscodeTreeItem>
268
+ );
269
+ })}
270
+ </VscodeTree>
271
+ </VscodeCollapsible>
272
+
273
+ <VscodeCollapsible heading="Events">
274
+ <VscodeBadge slot="decorations">
275
+ {serverEvents.length}
276
+ </VscodeBadge>
277
+
278
+ <div className={styles.tabPanelGap}>
279
+ {serverEvents.length === 0 ? (
280
+ <p className={styles.emptyMessage}>
281
+ No server events available
282
+ </p>
283
+ ) : (
284
+ <VscodeTree>
285
+ {serverEvents.map((event) => (
286
+ <VscodeTreeItem key={event.name}>
287
+ <span className={styles.treeItemTitle}>
288
+ {event.name}
289
+ </span>
290
+ <VscodeTreeItem key={event.name}>
291
+ <span slot="description">{event.description}</span>
292
+ {event.payloadSchema != null ? (
293
+ <pre className={styles.codeBlock}>
294
+ {JSON.stringify(event.payloadSchema, null, 2)}
295
+ </pre>
296
+ ) : null}
297
+ </VscodeTreeItem>
298
+ </VscodeTreeItem>
299
+ ))}
300
+ </VscodeTree>
301
+ )}
302
+ </div>
303
+ </VscodeCollapsible>
304
+
305
+ <VscodeCollapsible heading="Nodes">
306
+ <VscodeBadge slot="decorations">{nodeTypes.length}</VscodeBadge>
307
+ <div className={styles.tabPanelGap}>
308
+ {nodeTypes.length === 0 ? (
309
+ <p className={styles.emptyMessage}>
310
+ No node types available
311
+ </p>
312
+ ) : (
313
+ <VscodeTree>
314
+ {nodeTypes.map((node) => (
315
+ <VscodeTreeItem>
316
+ {node.type}
317
+
318
+ <span slot="description">{node.category}</span>
319
+ </VscodeTreeItem>
320
+ ))}
321
+ </VscodeTree>
322
+ )}
323
+ </div>
324
+ </VscodeCollapsible>
325
+ <VscodeCollapsible heading="Message Activity">
326
+ <VscodeBadge slot="decorations">
327
+ {messageActivity.length}
328
+ </VscodeBadge>
329
+ <div className={styles.tabPanelGapLarge}>
330
+ <div className={styles.messagesToolbar}>
331
+ <div className={styles.messagesCount}>
332
+ {messageActivity.length} message
333
+ {messageActivity.length !== 1 ? 's' : ''}
334
+ </div>
335
+ {messageActivity.length > 0 && (
336
+ <VscodeButton onClick={handleClearMessages}>
337
+ Clear
338
+ </VscodeButton>
339
+ )}
340
+ </div>
341
+ {messageActivity.length === 0 ? (
342
+ <p className={styles.emptyMessage}>No messages yet</p>
343
+ ) : (
344
+ <div className={styles.tabPanelGap}>
345
+ {messageActivity.map((activity) => {
346
+ const time = new Date(
347
+ activity.timestamp
348
+ ).toLocaleTimeString();
349
+ const directionColor =
350
+ activity.direction === 'sent'
351
+ ? 'var(--ds-git-modified)'
352
+ : 'var(--ds-git-added)';
353
+
354
+ return (
355
+ <div key={activity.id} className={styles.messageCard}>
356
+ <div className={styles.messageHeader}>
357
+ <div className={styles.messageDirection}>
358
+ <span
359
+ className={styles.messageDirectionIcon}
360
+ style={{ color: directionColor }}
361
+ >
362
+ {activity.direction === 'sent' ? '→' : '←'}
363
+ </span>
364
+ <span className={styles.messageType}>
365
+ {activity.message.type}
366
+ </span>
367
+ </div>
368
+ <span className={styles.messageTime}>{time}</span>
369
+ </div>
370
+ <pre className={styles.messageContent}>
371
+ {JSON.stringify(activity.message, null, 2)}
372
+ </pre>
373
+ </div>
374
+ );
375
+ })}
376
+ </div>
377
+ )}
378
+ </div>
379
+ </VscodeCollapsible>
380
+ </>
381
+ )}
382
+ </div>
383
+ </div>
384
+ </div>
385
+ );
386
+ };