@kiberon-labs/behave-graph-flow 1.0.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/.fallowrc.json +16 -0
  2. package/.storybook/main.ts +32 -0
  3. package/.storybook/manager.ts +6 -0
  4. package/.storybook/preview.ts +64 -0
  5. package/.storybook/styles.css +16 -0
  6. package/.turbo/turbo-build.log +7 -0
  7. package/CHANGELOG.md +368 -0
  8. package/LICENSE +6 -0
  9. package/README.md +2 -2
  10. package/data/Polynomial.json +510 -0
  11. package/data/sequence.json +337 -0
  12. package/data/trigger-event.json +241 -0
  13. package/data/variable-change.json +210 -0
  14. package/dist/AnyControlImpl-Ds-CShIB.js +20 -0
  15. package/dist/AnyControlImpl-Ds-CShIB.js.map +1 -0
  16. package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js +166 -0
  17. package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js.map +1 -0
  18. package/dist/entry.css +4 -0
  19. package/dist/index.css +42 -0
  20. package/dist/index.css.map +1 -0
  21. package/dist/index.d.ts +3597 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +18009 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/noteImpl-KkrrWgJd.js +242 -0
  26. package/dist/noteImpl-KkrrWgJd.js.map +1 -0
  27. package/dist/styles.module-CvmpDkZj.css +3 -0
  28. package/dist/styles.module-CvmpDkZj.css.map +1 -0
  29. package/dist/styles.module-DZxg8aW9.js +271 -0
  30. package/dist/styles.module-DZxg8aW9.js.map +1 -0
  31. package/dist/useChangeNodeData-ChQGK7AI.js +23 -0
  32. package/dist/useChangeNodeData-ChQGK7AI.js.map +1 -0
  33. package/docs/notifications.md +246 -0
  34. package/docs/protocol.md +702 -0
  35. package/docs/specifics.md +191 -0
  36. package/package.json +82 -22
  37. package/postcss.config.ts +3 -4
  38. package/src/annotations/index.ts +32 -0
  39. package/src/components/FloatingToolbar/index.module.css +37 -0
  40. package/src/components/FloatingToolbar/index.tsx +256 -0
  41. package/src/components/Flow.tsx +287 -75
  42. package/src/components/contextMenus/DynamicContextMenu.tsx +85 -0
  43. package/src/components/contextMenus/NodePicker.module.css +274 -0
  44. package/src/components/contextMenus/NodePicker.tsx +481 -0
  45. package/src/components/contextMenus/edge.tsx +22 -0
  46. package/src/components/contextMenus/node.tsx +15 -0
  47. package/src/components/contextMenus/selection.tsx +11 -0
  48. package/src/components/controls/any/AnyControlImpl.tsx +14 -0
  49. package/src/components/controls/any/index.tsx +19 -0
  50. package/src/components/controls/boolean/index.tsx +13 -0
  51. package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
  52. package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
  53. package/src/components/controls/colorPicker/index.module.css +18 -0
  54. package/src/components/controls/colorPicker/index.tsx +61 -0
  55. package/src/components/controls/number/index.tsx +35 -0
  56. package/src/components/controls/string/index.tsx +16 -0
  57. package/src/components/edges/index.tsx +475 -0
  58. package/src/components/edges/offsetBezier.ts +134 -0
  59. package/src/components/hotKeys.tsx +20 -0
  60. package/src/components/layoutController/index.module.css +13 -0
  61. package/src/components/layoutController/index.tsx +140 -0
  62. package/src/components/layoutController/utils.ts +248 -0
  63. package/src/components/menubar/defaults.tsx +516 -0
  64. package/src/components/menubar/index.tsx +49 -0
  65. package/src/components/menubar/menuItem.module.css +31 -0
  66. package/src/components/menubar/menuItem.tsx +65 -0
  67. package/src/components/nodes/behave/Node.module.css +23 -0
  68. package/src/components/nodes/behave/Node.tsx +176 -0
  69. package/src/components/nodes/behave/NodeContainer.module.css +88 -0
  70. package/src/components/nodes/behave/NodeContainer.tsx +46 -0
  71. package/src/components/nodes/behave/index.tsx +14 -0
  72. package/src/components/nodes/group/index.tsx +109 -0
  73. package/src/components/nodes/wrapper/index.tsx +73 -0
  74. package/src/components/nodes/wrapper/styles.module.css +87 -0
  75. package/src/components/notifications/NotificationProvider.tsx +81 -0
  76. package/src/components/notifications/index.ts +2 -0
  77. package/src/components/notifications/utils.ts +71 -0
  78. package/src/components/panels/alignment/index.module.css +10 -0
  79. package/src/components/panels/alignment/index.tsx +244 -0
  80. package/src/components/panels/base/index.tsx +5 -0
  81. package/src/components/panels/base/styles.module.css +12 -0
  82. package/src/components/panels/common/PanelHeader.module.css +24 -0
  83. package/src/components/panels/common/PanelHeader.tsx +22 -0
  84. package/src/components/panels/common/SectionTitle.module.css +13 -0
  85. package/src/components/panels/common/SectionTitle.tsx +10 -0
  86. package/src/components/panels/events/EditEventPanel.tsx +324 -0
  87. package/src/components/panels/events/ManageEventsPanel.tsx +101 -0
  88. package/src/components/panels/events/index.tsx +23 -0
  89. package/src/components/panels/events/styles.module.css +178 -0
  90. package/src/components/panels/graphProperties/index.tsx +125 -0
  91. package/src/components/panels/history/index.tsx +92 -0
  92. package/src/components/panels/history/styles.module.css +97 -0
  93. package/src/components/panels/keymaps/index.module.css +68 -0
  94. package/src/components/panels/keymaps/index.tsx +166 -0
  95. package/src/components/panels/layers/index.tsx +245 -0
  96. package/src/components/panels/layers/styles.module.css +107 -0
  97. package/src/components/panels/legend/index.module.css +6 -0
  98. package/src/components/panels/legend/index.tsx +76 -0
  99. package/src/components/panels/logs/index.module.css +218 -0
  100. package/src/components/panels/logs/index.tsx +288 -0
  101. package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
  102. package/src/components/panels/nodeInputs/InputsGroup.tsx +65 -0
  103. package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
  104. package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
  105. package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
  106. package/src/components/panels/nodeInputs/OutputsGroup.tsx +55 -0
  107. package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
  108. package/src/components/panels/nodeInputs/index.module.css +308 -0
  109. package/src/components/panels/nodeInputs/index.tsx +349 -0
  110. package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
  111. package/src/components/panels/nodeInputs/useNodeInputsData.ts +153 -0
  112. package/src/components/panels/nodePicker/index.tsx +115 -0
  113. package/src/components/panels/panel/index.module.css +66 -0
  114. package/src/components/panels/panel/index.tsx +88 -0
  115. package/src/components/panels/search/index.module.css +16 -0
  116. package/src/components/panels/search/index.tsx +215 -0
  117. package/src/components/panels/systemSettings/ConversionsSettings.tsx +203 -0
  118. package/src/components/panels/systemSettings/index.tsx +251 -0
  119. package/src/components/panels/systemSettings/styles.module.css +138 -0
  120. package/src/components/panels/traces/GridLines.tsx +38 -0
  121. package/src/components/panels/traces/TimeGrid.tsx +48 -0
  122. package/src/components/panels/traces/TraceLane.tsx +62 -0
  123. package/src/components/panels/traces/TraceTooltip.tsx +22 -0
  124. package/src/components/panels/traces/TracesHeader.tsx +56 -0
  125. package/src/components/panels/traces/index.module.css +159 -0
  126. package/src/components/panels/traces/index.tsx +298 -0
  127. package/src/components/panels/traces/types.ts +48 -0
  128. package/src/components/panels/traces/useDerivedSpans.ts +307 -0
  129. package/src/components/panels/traces/utils.ts +33 -0
  130. package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
  131. package/src/components/panels/variables/ManageVariablesScreen.tsx +147 -0
  132. package/src/components/panels/variables/index.tsx +125 -0
  133. package/src/components/panels/variables/styles.module.css +149 -0
  134. package/src/components/primitives/icon.module.css +45 -0
  135. package/src/components/primitives/icon.tsx +38 -0
  136. package/src/components/sockets/input/index.tsx +83 -0
  137. package/src/components/sockets/input/styles.module.css +26 -0
  138. package/src/components/sockets/output/index.tsx +68 -0
  139. package/src/components/sockets/output/styles.module.css +22 -0
  140. package/src/css/notes.css +135 -0
  141. package/src/css/prosemirror.css +57 -0
  142. package/src/css/rc-dock.css +212 -0
  143. package/src/css/rc-menu.css +101 -0
  144. package/src/css/themes/kiberon.css +127 -0
  145. package/src/css/vars.css +198 -0
  146. package/src/css/vscode-elements.css +124 -0
  147. package/src/entry.css +4 -0
  148. package/src/generators/CallSubgraphGenerator.tsx +136 -0
  149. package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
  150. package/src/generators/GraphBoundaryGenerator.module.css +32 -0
  151. package/src/generators/GraphBoundaryGenerator.tsx +193 -0
  152. package/src/generators/SequenceGenerator.tsx +104 -0
  153. package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
  154. package/src/generators/SwitchOnStringGenerator.tsx +263 -0
  155. package/src/generators/callSubgraphSync.ts +126 -0
  156. package/src/generators/registerDefaultGenerators.ts +55 -0
  157. package/src/generators/registerDefaults.ts +26 -0
  158. package/src/hooks/useBehaveGraphFlow.ts +17 -16
  159. package/src/hooks/useFlowHandlers.ts +154 -30
  160. package/src/hooks/useWasdPan.ts +210 -0
  161. package/src/index.css +134 -0
  162. package/src/index.ts +53 -18
  163. package/src/manifest/contributionRegistry.ts +93 -0
  164. package/src/manifest/index.ts +4 -0
  165. package/src/manifest/loadManifest.ts +82 -0
  166. package/src/manifest/manifestPlugin.ts +29 -0
  167. package/src/manifest/passthroughValueType.ts +40 -0
  168. package/src/plugin/alignment/index.ts +91 -0
  169. package/src/plugin/autosave/controller.ts +366 -0
  170. package/src/plugin/autosave/index.tsx +114 -0
  171. package/src/plugin/autosave/panel/BackupPanel.tsx +141 -0
  172. package/src/plugin/autosave/panel/index.tsx +1 -0
  173. package/src/plugin/autosave/panel/styles.module.css +56 -0
  174. package/src/plugin/autosave/settings.ts +65 -0
  175. package/src/plugin/autosave/storage.ts +147 -0
  176. package/src/plugin/docs/index.tsx +297 -0
  177. package/src/plugin/docs/panel/DocumentationBrowserPanelImpl.tsx +200 -0
  178. package/src/plugin/docs/panel/index.tsx +21 -0
  179. package/src/plugin/docs/panel/styles.module.css +174 -0
  180. package/src/plugin/graphrunner/actions.ts +326 -0
  181. package/src/plugin/graphrunner/buttons.tsx +95 -0
  182. package/src/plugin/graphrunner/client.ts +707 -0
  183. package/src/plugin/graphrunner/index.tsx +184 -0
  184. package/src/plugin/graphrunner/panel.tsx +386 -0
  185. package/src/plugin/graphrunner/runController.ts +283 -0
  186. package/src/plugin/graphrunner/runner.ts +187 -0
  187. package/src/plugin/graphrunner/session.ts +243 -0
  188. package/src/plugin/graphrunner/store.ts +196 -0
  189. package/src/plugin/graphrunner/styles.module.css +171 -0
  190. package/src/plugin/graphrunner/transport.ts +250 -0
  191. package/src/plugin/graphrunner/types.ts +693 -0
  192. package/src/plugin/graphrunner-local/execution-utils.ts +637 -0
  193. package/src/plugin/graphrunner-local/index.tsx +172 -0
  194. package/src/plugin/graphrunner-local/panel.tsx +187 -0
  195. package/src/plugin/graphrunner-local/store.ts +41 -0
  196. package/src/plugin/graphrunner-local/styles.module.css +82 -0
  197. package/src/plugin/graphrunner-local/transport.ts +1339 -0
  198. package/src/plugin/graphrunner-local/types.ts +10 -0
  199. package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +635 -0
  200. package/src/plugin/graphrunner-webworker/index.tsx +140 -0
  201. package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
  202. package/src/plugin/graphrunner-webworker/store.ts +98 -0
  203. package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
  204. package/src/plugin/kitchen-sink/index.ts +38 -0
  205. package/src/plugin/layout/dagre.ts +131 -0
  206. package/src/plugin/layout/elk.ts +216 -0
  207. package/src/plugin/layout/index.ts +80 -0
  208. package/src/plugin/notes/FormatToolbar.tsx +200 -0
  209. package/src/plugin/notes/index.tsx +191 -0
  210. package/src/plugin/notes/nodeActions.ts +100 -0
  211. package/src/plugin/notes/note.tsx +20 -0
  212. package/src/plugin/notes/noteImpl.tsx +89 -0
  213. package/src/plugin/realtime/realtimeRunner.ts +624 -0
  214. package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
  215. package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
  216. package/src/specifics/VariableGetSpecific.tsx +110 -0
  217. package/src/specifics/VariableSetSpecific.tsx +110 -0
  218. package/src/store/actions.tsx +698 -0
  219. package/src/store/commands.ts +278 -0
  220. package/src/store/contextMenu.ts +192 -0
  221. package/src/store/controls.tsx +62 -0
  222. package/src/store/conversions.ts +47 -0
  223. package/src/store/documentation.tsx +69 -0
  224. package/src/store/events.tsx +116 -0
  225. package/src/store/flow.tsx +230 -0
  226. package/src/store/graphMeta.ts +39 -0
  227. package/src/store/hotKeys.tsx +364 -0
  228. package/src/store/layers.ts +259 -0
  229. package/src/store/legend.tsx +76 -0
  230. package/src/store/logs.ts +28 -0
  231. package/src/store/menubar.ts +41 -0
  232. package/src/store/refs.ts +84 -0
  233. package/src/store/registry.ts +51 -0
  234. package/src/store/selection.ts +22 -0
  235. package/src/store/settings.ts +99 -0
  236. package/src/store/settingsSchema.ts +210 -0
  237. package/src/store/socketGenerator.tsx +54 -0
  238. package/src/store/specific.tsx +75 -0
  239. package/src/store/specs.tsx +35 -0
  240. package/src/store/tabs.ts +282 -0
  241. package/src/store/toolbar.tsx +45 -0
  242. package/src/store/traces.ts +240 -0
  243. package/src/store/variables.ts +37 -0
  244. package/src/system/graph.ts +131 -0
  245. package/src/system/graphSession.ts +172 -0
  246. package/src/system/index.ts +6 -0
  247. package/src/system/notifications.ts +111 -0
  248. package/src/system/persistence.ts +82 -0
  249. package/src/system/plugin.ts +55 -0
  250. package/src/system/provider.tsx +86 -0
  251. package/src/system/pubsub.ts +323 -0
  252. package/src/system/system.ts +653 -0
  253. package/src/system/tabLoader.tsx +303 -0
  254. package/src/system/undoRedo.ts +103 -0
  255. package/src/transformers/Uigraph.ts +61 -0
  256. package/src/transformers/behaveToFlow.ts +16 -4
  257. package/src/transformers/contract.ts +87 -0
  258. package/src/transformers/flowToBehave.ts +40 -12
  259. package/src/types/NodeMetadata.ts +27 -0
  260. package/src/types/graph.ts +49 -0
  261. package/src/types/nodes.ts +50 -0
  262. package/src/types.ts +18 -0
  263. package/src/util/autoConvert.ts +200 -0
  264. package/src/util/colors.ts +1 -29
  265. package/src/util/downloadJson.ts +18 -0
  266. package/src/util/extractNodeMetadata.ts +16 -0
  267. package/src/util/getPickerFilters.ts +1 -1
  268. package/src/util/isBehaveNode.ts +6 -0
  269. package/src/util/isValidConnection.ts +51 -17
  270. package/src/util/mergeSockets.ts +29 -0
  271. package/src/util/serializeVariables.ts +66 -0
  272. package/src/util/sockets.ts +43 -0
  273. package/stories/apex/layoutController/example-graph.worker.ts +39 -0
  274. package/stories/apex/layoutController/index.stories.tsx +48 -0
  275. package/stories/apex/layoutController/webworker.stories.tsx +103 -0
  276. package/stories/apex/menubar/menubar.stories.tsx +19 -0
  277. package/stories/components/colorpicker/index.stories.tsx +20 -0
  278. package/stories/components/contextMenus/edge.stories.tsx +32 -0
  279. package/stories/components/contextMenus/node.stories.tsx +26 -0
  280. package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
  281. package/stories/components/controls/any/index.stories.tsx +19 -0
  282. package/stories/components/controls/boolean/index.stories.tsx +19 -0
  283. package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
  284. package/stories/components/controls/number/index.stories.tsx +19 -0
  285. package/stories/components/controls/string/index.stories.tsx +19 -0
  286. package/stories/components/nodes/behaveNode.stories.tsx +108 -0
  287. package/stories/components/panels/alignment.stories.tsx +24 -0
  288. package/stories/components/panels/events.stories.tsx +38 -0
  289. package/stories/components/panels/graphRunner.stories.tsx +317 -0
  290. package/stories/components/panels/history.stories.tsx +37 -0
  291. package/stories/components/panels/keymaps.stories.tsx +21 -0
  292. package/stories/components/panels/legend.stories.tsx +37 -0
  293. package/stories/components/panels/logs.stories.tsx +24 -0
  294. package/stories/components/panels/nodeInputs.stories.tsx +21 -0
  295. package/stories/components/panels/nodePicker.stories.tsx +37 -0
  296. package/stories/components/panels/panel.stories.tsx +39 -0
  297. package/stories/components/panels/search.stories.tsx +24 -0
  298. package/stories/components/panels/systemSettings.stories.tsx +26 -0
  299. package/stories/components/panels/traces.stories.tsx +225 -0
  300. package/stories/components/panels/variables.stories.tsx +24 -0
  301. package/stories/defaults/defaultStoryProvider.tsx +170 -0
  302. package/stories/defaults/systemGenerator.ts +43 -0
  303. package/stories/plugins/notes.stories.tsx +100 -0
  304. package/tests/autoConvert.test.ts +329 -0
  305. package/tests/autosavePlugin.test.ts +204 -0
  306. package/tests/callSubgraphSync.test.ts +148 -0
  307. package/tests/commandRegistry.test.ts +137 -0
  308. package/tests/components/edges/offsetBezier.test.ts +51 -0
  309. package/tests/components/layoutController/utils.test.ts +68 -0
  310. package/tests/components/panels/traces/utils.test.ts +52 -0
  311. package/tests/contract.test.ts +51 -0
  312. package/tests/contractSerialize.test.ts +62 -0
  313. package/tests/deriveSpans.test.ts +71 -0
  314. package/tests/flowToBehave.test.ts +27 -4
  315. package/tests/hotkeys.test.ts +79 -0
  316. package/tests/keepAliveLifecycle.test.ts +167 -0
  317. package/tests/loadManifest.test.ts +113 -0
  318. package/tests/noteMarkdown.test.ts +65 -0
  319. package/tests/notesPlugin.test.ts +162 -0
  320. package/tests/notifications.test.ts +87 -0
  321. package/tests/persistence.test.ts +51 -0
  322. package/tests/saveLoad.test.ts +373 -0
  323. package/tests/settings.test.ts +178 -0
  324. package/tests/traceStore.test.ts +46 -0
  325. package/tests/util/calculateNewEdge.test.ts +98 -0
  326. package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
  327. package/tests/util/hasPositionMetaData.test.ts +33 -0
  328. package/tests/util/isBehaveNode.test.ts +22 -0
  329. package/tests/util/isHandleConnected.test.ts +37 -0
  330. package/tests/util/mergeSockets.test.ts +43 -0
  331. package/tests/visual/README.md +64 -0
  332. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
  333. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
  334. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
  335. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
  336. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
  337. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
  338. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
  339. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-localGraphRunner-chromium-win32.png +0 -0
  340. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
  341. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
  342. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
  343. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
  344. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
  345. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
  346. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
  347. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
  348. package/tests/visual/panels.visual.test.tsx +76 -0
  349. package/tests/wasdPan.test.ts +71 -0
  350. package/tsconfig.base.json +39 -0
  351. package/tsconfig.json +18 -59
  352. package/tsconfig.prod.json +23 -0
  353. package/tsdown.config.ts +15 -3
  354. package/typedoc.json +7 -7
  355. package/vite.config.js +7 -0
  356. package/vitest.config.ts +5 -2
  357. package/vitest.visual.config.ts +55 -0
  358. package/src/components/AutoSizeInput.tsx +0 -65
  359. package/src/components/Controls.tsx +0 -87
  360. package/src/components/InputSocket.tsx +0 -142
  361. package/src/components/Node.tsx +0 -68
  362. package/src/components/NodeContainer.tsx +0 -46
  363. package/src/components/NodePicker.tsx +0 -77
  364. package/src/components/OutputSocket.tsx +0 -58
  365. package/src/components/modals/ClearModal.tsx +0 -40
  366. package/src/components/modals/HelpModal.tsx +0 -36
  367. package/src/components/modals/LoadModal.tsx +0 -96
  368. package/src/components/modals/Modal.tsx +0 -64
  369. package/src/components/modals/SaveModal.tsx +0 -60
  370. package/src/hooks/useCustomNodeTypes.tsx +0 -31
  371. package/src/hooks/useGraphRunner.ts +0 -104
  372. package/src/hooks/useMergeMap.ts +0 -14
  373. package/src/hooks/useNodeSpecJson.ts +0 -20
  374. package/src/hooks/useQueriableDefinitions.ts +0 -22
  375. package/src/styles.css +0 -8
  376. package/tailwind.config.ts +0 -19
  377. package/tests/tsconfig.json +0 -10
  378. /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { getSocketsByNodeTypeAndHandleType } from '@/util/getSocketsByNodeTypeAndHandleType';
3
+ import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';
4
+
5
+ const specs = [
6
+ {
7
+ type: 'math/add',
8
+ inputs: [{ name: 'a', valueType: 'float' }],
9
+ outputs: [{ name: 'result', valueType: 'float' }]
10
+ }
11
+ ] as unknown as NodeSpecJSON[];
12
+
13
+ describe('getSocketsByNodeTypeAndHandleType', () => {
14
+ it('returns the output sockets for a source handle', () => {
15
+ expect(
16
+ getSocketsByNodeTypeAndHandleType(specs, 'math/add', 'source')
17
+ ).toEqual([{ name: 'result', valueType: 'float' }]);
18
+ });
19
+
20
+ it('returns the input sockets for a target handle', () => {
21
+ expect(
22
+ getSocketsByNodeTypeAndHandleType(specs, 'math/add', 'target')
23
+ ).toEqual([{ name: 'a', valueType: 'float' }]);
24
+ });
25
+
26
+ it('returns undefined for an unknown node type', () => {
27
+ expect(
28
+ getSocketsByNodeTypeAndHandleType(specs, 'does/not/exist', 'source')
29
+ ).toBeUndefined();
30
+ });
31
+ });
@@ -0,0 +1,33 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { hasPositionMetaData } from '@/util/hasPositionMetaData';
3
+ import type { GraphJSON } from '@kiberon-labs/behave-graph';
4
+
5
+ const graph = (nodes: unknown): GraphJSON => ({ nodes }) as GraphJSON;
6
+
7
+ describe('hasPositionMetaData', () => {
8
+ it('returns true when any node carries position metadata', () => {
9
+ expect(
10
+ hasPositionMetaData(
11
+ graph([
12
+ { type: 'a', id: '1' },
13
+ { type: 'b', id: '2', metadata: { positionX: '10', positionY: '20' } }
14
+ ])
15
+ )
16
+ ).toBe(true);
17
+ });
18
+
19
+ it('returns false when no node carries position metadata', () => {
20
+ expect(
21
+ hasPositionMetaData(
22
+ graph([
23
+ { type: 'a', id: '1' },
24
+ { type: 'b', id: '2', metadata: { label: 'hi' } }
25
+ ])
26
+ )
27
+ ).toBe(false);
28
+ });
29
+
30
+ it('returns false when there are no nodes', () => {
31
+ expect(hasPositionMetaData(graph(undefined))).toBe(false);
32
+ });
33
+ });
@@ -0,0 +1,22 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { isBehaveNode } from '@/util/isBehaveNode';
3
+ import type { Node } from 'reactflow';
4
+
5
+ const node = (type: unknown): Node =>
6
+ ({ id: 'n', position: { x: 0, y: 0 }, data: {}, type }) as Node;
7
+
8
+ describe('isBehaveNode', () => {
9
+ it('returns true for node types starting with "behaveNode"', () => {
10
+ expect(isBehaveNode(node('behaveNode'))).toBe(true);
11
+ expect(isBehaveNode(node('behaveNode-flow'))).toBe(true);
12
+ });
13
+
14
+ it('returns false for other node types', () => {
15
+ expect(isBehaveNode(node('comment'))).toBe(false);
16
+ expect(isBehaveNode(node('group'))).toBe(false);
17
+ });
18
+
19
+ it('returns false when the type is missing', () => {
20
+ expect(isBehaveNode(node(undefined))).toBe(false);
21
+ });
22
+ });
@@ -0,0 +1,37 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { isHandleConnected } from '@/util/isHandleConnected';
3
+ import type { Edge } from 'reactflow';
4
+
5
+ const edge = (over: Partial<Edge>): Edge =>
6
+ ({ id: 'e', source: 's', target: 't', ...over }) as Edge;
7
+
8
+ describe('isHandleConnected', () => {
9
+ const edges: Edge[] = [
10
+ edge({
11
+ source: 'n1',
12
+ sourceHandle: 'out',
13
+ target: 'n2',
14
+ targetHandle: 'in'
15
+ })
16
+ ];
17
+
18
+ it('detects a connected source handle', () => {
19
+ expect(isHandleConnected(edges, 'n1', 'out', 'source')).toBe(true);
20
+ });
21
+
22
+ it('detects a connected target handle', () => {
23
+ expect(isHandleConnected(edges, 'n2', 'in', 'target')).toBe(true);
24
+ });
25
+
26
+ it('returns false when the node id does not match', () => {
27
+ expect(isHandleConnected(edges, 'other', 'out', 'source')).toBe(false);
28
+ });
29
+
30
+ it('returns false when the handle id does not match', () => {
31
+ expect(isHandleConnected(edges, 'n1', 'wrong', 'source')).toBe(false);
32
+ });
33
+
34
+ it('returns false for an empty edge list', () => {
35
+ expect(isHandleConnected([], 'n1', 'out', 'source')).toBe(false);
36
+ });
37
+ });
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { mergeSockets } from '@/util/mergeSockets';
3
+
4
+ const specSocket = (name: string, valueType: string) =>
5
+ ({ name, valueType }) as any;
6
+
7
+ describe('mergeSockets', () => {
8
+ it('maps spec sockets to socket-base objects keyed by name', () => {
9
+ const result = mergeSockets([
10
+ specSocket('a', 'flow'),
11
+ specSocket('b', 'string')
12
+ ]);
13
+
14
+ expect(result).toHaveLength(2);
15
+ expect(result.map((s) => s.key)).toEqual(['a', 'b']);
16
+ expect(result[0]).toMatchObject({ key: 'a', name: 'a', valueType: 'flow' });
17
+ });
18
+
19
+ it('returns spec sockets unchanged when no dynamic ports are given', () => {
20
+ const result = mergeSockets([specSocket('a', 'flow')], undefined);
21
+ expect(result).toEqual([{ key: 'a', name: 'a', valueType: 'flow' }]);
22
+ });
23
+
24
+ it('lets a dynamic port override a spec socket with the same key', () => {
25
+ const result = mergeSockets(
26
+ [specSocket('a', 'flow'), specSocket('b', 'string')],
27
+ [{ key: 'b', name: 'b', valueType: 'integer' } as any]
28
+ );
29
+
30
+ expect(result).toHaveLength(2);
31
+ const b = result.find((s) => s.key === 'b');
32
+ expect(b?.valueType).toBe('integer');
33
+ });
34
+
35
+ it('appends dynamic ports that do not match any spec socket', () => {
36
+ const result = mergeSockets(
37
+ [specSocket('a', 'flow')],
38
+ [{ key: 'extra', name: 'extra', valueType: 'boolean' } as any]
39
+ );
40
+
41
+ expect(result.map((s) => s.key)).toEqual(['a', 'extra']);
42
+ });
43
+ });
@@ -0,0 +1,64 @@
1
+ # Visual (pixel) regression tests
2
+
3
+ These tests render React components in a **real browser** (Chromium via Playwright)
4
+ and compare a screenshot against a committed baseline using Vitest's built-in
5
+ [`toMatchScreenshot`](https://vitest.dev/guide/browser/visual-regression-testing)
6
+ assertion. They catch unintended rendering regressions that DOM-only unit tests
7
+ miss.
8
+
9
+ ## Scope
10
+
11
+ Coverage is deliberately minimal and panel-focused: **one snapshot per editor
12
+ panel** (see [`panels.visual.test.tsx`](./panels.visual.test.tsx)), since the
13
+ panels are the composed, regression-prone surfaces. Each panel is rendered
14
+ through the same [`DefaultSystemProvider`](../../stories/defaults/defaultStoryProvider.tsx)
15
+ the Storybook stories use, so it shows representative content.
16
+
17
+ They are intentionally **separate** from the default `pnpm test` run (which uses
18
+ happy-dom) so the heavier browser runner only starts when explicitly requested.
19
+
20
+ ## Running
21
+
22
+ ```bash
23
+ # one-time: install the Chromium binary Playwright drives
24
+ npx playwright install chromium
25
+
26
+ # verify components against the committed baselines
27
+ pnpm test:visual
28
+
29
+ # create/refresh baselines (after an intentional visual change)
30
+ pnpm test:visual:update
31
+ ```
32
+
33
+ ## How it works
34
+
35
+ - Config: [`vitest.visual.config.ts`](../../vitest.visual.config.ts) , browser
36
+ mode, Playwright/Chromium, headless, fixed `900x700` viewport.
37
+ - Test files: `tests/visual/**/*.visual.test.tsx`.
38
+ - Each panel is rendered inside a fixed-size `640x480` frame on the editor
39
+ background so screenshots are bounded and stable. The full app stylesheet
40
+ (`@/index.css`) is imported so `--vscode-*` theme tokens resolve.
41
+ - Baselines live in `__screenshots__/` and are committed. Vitest names them per
42
+ platform (e.g. `*-chromium-win32.png`), because font rendering and
43
+ anti-aliasing differ across operating systems.
44
+
45
+ ## Important: baselines are platform-specific
46
+
47
+ Generate and verify baselines on the **same OS / CI image**. A baseline captured
48
+ on Windows will not match one rendered on Linux. For CI, run
49
+ `pnpm test:visual:update` on the CI platform once (or in a container that matches
50
+ CI) and commit those baselines. The comparator is configured with a small
51
+ `allowedMismatchedPixelRatio` to tolerate negligible anti-aliasing noise.
52
+
53
+ ## Adding a panel
54
+
55
+ When a new panel is added under `src/components/panels`, add one entry to the
56
+ `panels` array in [`panels.visual.test.tsx`](./panels.visual.test.tsx):
57
+
58
+ ```tsx
59
+ ['myPanel', <MyPanel />],
60
+ ```
61
+
62
+ Then run `pnpm test:visual:update` to create the baseline, eyeball the generated
63
+ PNG, and commit it. Keep it to a single representative snapshot per panel , the
64
+ unit tests under `tests/util` and `tests/components` cover finer-grained logic.
@@ -0,0 +1,76 @@
1
+ // Full editor stylesheet (vscode theme vars, rc-dock, reactflow, etc.) so the
2
+ // panels render the way they do in the real app.
3
+ import '@/index.css';
4
+
5
+ import type { ReactElement } from 'react';
6
+ import { afterEach, describe, expect, it } from 'vitest';
7
+ import { page } from 'vitest/browser';
8
+ import { cleanup, render } from 'vitest-browser-react';
9
+ import { DefaultSystemProvider } from '../../stories/defaults/defaultStoryProvider';
10
+
11
+ import { AlignmentPanel } from '@/components/panels/alignment';
12
+ import { EventsPanel } from '@/components/panels/events';
13
+ import { HistoryPanel } from '@/components/panels/history';
14
+ import { KeymapsPanel } from '@/components/panels/keymaps';
15
+ import { LayersPanel } from '@/components/panels/layers';
16
+ import { LegendPanel } from '@/components/panels/legend';
17
+ import { LogsPanel } from '@/components/panels/logs';
18
+ import { NodeInputsPanel } from '@/components/panels/nodeInputs';
19
+ import { NodePickerPanel } from '@/components/panels/nodePicker';
20
+ import { PanelPanel } from '@/components/panels/panel';
21
+ import { SearchPanel } from '@/components/panels/search';
22
+ import { Settings } from '@/components/panels/systemSettings';
23
+ import { TracesPanel } from '@/components/panels/traces';
24
+ import { VariablesPanel } from '@/components/panels/variables';
25
+ import { LocalGraphRunnerPanel } from '@/plugin/graphrunner-local';
26
+
27
+ /**
28
+ * One pixel-snapshot per panel. The shared {@link DefaultSystemProvider} (the
29
+ * same provider the Storybook stories use) supplies a populated System so each
30
+ * panel renders representative content.
31
+ */
32
+ const panels: ReadonlyArray<readonly [name: string, element: ReactElement]> = [
33
+ ['alignment', <AlignmentPanel />],
34
+ ['events', <EventsPanel />],
35
+ ['history', <HistoryPanel />],
36
+ ['keymaps', <KeymapsPanel />],
37
+ ['layers', <LayersPanel />],
38
+ ['legend', <LegendPanel />],
39
+ ['logs', <LogsPanel />],
40
+ ['nodeInputs', <NodeInputsPanel />],
41
+ ['nodePicker', <NodePickerPanel />],
42
+ ['panel', <PanelPanel />],
43
+ ['search', <SearchPanel />],
44
+ ['systemSettings', <Settings />],
45
+ ['traces', <TracesPanel />],
46
+ ['variables', <VariablesPanel />],
47
+ ['localGraphRunner', <LocalGraphRunnerPanel />]
48
+ ];
49
+
50
+ afterEach(() => {
51
+ cleanup();
52
+ });
53
+
54
+ describe('panels (visual)', () => {
55
+ it.each(panels)('renders the %s panel', async (name, element) => {
56
+ render(
57
+ <DefaultSystemProvider>
58
+ <div
59
+ data-testid="panel-frame"
60
+ style={{
61
+ width: 640,
62
+ height: 480,
63
+ overflow: 'auto',
64
+ background: 'var(--vscode-editor-background, #1f1f1f)'
65
+ }}
66
+ >
67
+ {element}
68
+ </div>
69
+ </DefaultSystemProvider>
70
+ );
71
+
72
+ await expect(page.getByTestId('panel-frame')).toMatchScreenshot(
73
+ `panel-${name}`
74
+ );
75
+ });
76
+ });
@@ -0,0 +1,71 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { isEventFromEditable } from '../src/hooks/useWasdPan.js';
3
+
4
+ const keydownOn = (element: HTMLElement): KeyboardEvent => {
5
+ document.body.appendChild(element);
6
+ let captured: KeyboardEvent | undefined;
7
+ element.addEventListener('keydown', (e) => {
8
+ captured = e;
9
+ });
10
+ element.dispatchEvent(
11
+ new KeyboardEvent('keydown', { key: 'w', bubbles: true })
12
+ );
13
+ element.remove();
14
+ if (!captured) throw new Error('keydown was not captured');
15
+ return captured;
16
+ };
17
+
18
+ describe('WASD pan editable guard', () => {
19
+ it('treats form fields as editable (no pan)', () => {
20
+ expect(
21
+ isEventFromEditable(keydownOn(document.createElement('input')))
22
+ ).toBe(true);
23
+ expect(
24
+ isEventFromEditable(keydownOn(document.createElement('textarea')))
25
+ ).toBe(true);
26
+ expect(
27
+ isEventFromEditable(keydownOn(document.createElement('select')))
28
+ ).toBe(true);
29
+ });
30
+
31
+ it('treats contenteditable divs (e.g. the note editor) as editable', () => {
32
+ const editor = document.createElement('div');
33
+ editor.contentEditable = 'true';
34
+ expect(isEventFromEditable(keydownOn(editor))).toBe(true);
35
+ });
36
+
37
+ it('treats inputs inside shadow DOM (e.g. vscode-textfield) as editable', () => {
38
+ // The conversation panel's chat input is a web component; at a window-level
39
+ // listener the event is retargeted to the host element, so the guard must
40
+ // look through composedPath. Simulate that with a shadow-DOM input and a
41
+ // document-level capture listener (composedPath is only populated during
42
+ // dispatch).
43
+ const host = document.createElement('x-textfield');
44
+ const shadow = host.attachShadow({ mode: 'open' });
45
+ const inner = document.createElement('input');
46
+ shadow.appendChild(inner);
47
+ document.body.appendChild(host);
48
+
49
+ let result: boolean | undefined;
50
+ const listener = (e: Event) => {
51
+ result = isEventFromEditable(e as KeyboardEvent);
52
+ };
53
+ document.addEventListener('keydown', listener, { capture: true });
54
+ inner.dispatchEvent(
55
+ new KeyboardEvent('keydown', { key: 'w', bubbles: true, composed: true })
56
+ );
57
+ document.removeEventListener('keydown', listener, { capture: true });
58
+ host.remove();
59
+
60
+ expect(result).toBe(true);
61
+ });
62
+
63
+ it('does not treat plain elements as editable (pan proceeds)', () => {
64
+ expect(isEventFromEditable(keydownOn(document.createElement('div')))).toBe(
65
+ false
66
+ );
67
+ expect(isEventFromEditable(keydownOn(document.createElement('span')))).toBe(
68
+ false
69
+ );
70
+ });
71
+ });
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "display": "Monorepo shared library – base (no references)",
4
+ "compilerOptions": {
5
+ /* Base Options: */
6
+ "esModuleInterop": true,
7
+ "skipLibCheck": true,
8
+ "target": "esnext",
9
+ "allowJs": true,
10
+ "resolveJsonModule": true,
11
+ "moduleDetection": "force",
12
+ "isolatedModules": true,
13
+ "verbatimModuleSyntax": true,
14
+ /* Strictness */
15
+ "strict": true,
16
+ "noUncheckedIndexedAccess": true,
17
+ "noImplicitOverride": true,
18
+ "erasableSyntaxOnly": true,
19
+ /* Opinion */
20
+ "module": "preserve",
21
+ "outDir": "./dist",
22
+ "paths": {
23
+ "@/*": [
24
+ "./src/*"
25
+ ],
26
+ "~/*": [
27
+ "./stories/*"
28
+ ]
29
+ },
30
+ "declaration": true,
31
+ "declarationMap": true,
32
+ "jsx": "react-jsx",
33
+ "lib": [
34
+ "dom",
35
+ "dom.iterable",
36
+ "esnext"
37
+ ],
38
+ },
39
+ }
package/tsconfig.json CHANGED
@@ -1,60 +1,19 @@
1
- {
2
- "$schema": "https://json.schemastore.org/tsconfig",
3
- "display": "Monorepo shared library",
4
- "compilerOptions": {
5
- /* Base Options: */
6
- "esModuleInterop": true,
7
- "skipLibCheck": true,
8
- "target": "esnext",
9
- "allowJs": true,
10
- "resolveJsonModule": true,
11
- "moduleDetection": "force",
12
- "isolatedModules": true,
13
- "verbatimModuleSyntax": true,
14
- /* Strictness */
15
- "strict": true,
16
- "noUncheckedIndexedAccess": true,
17
- "noImplicitOverride": true,
18
- "erasableSyntaxOnly": true,
19
- /* Opinion */
20
- "incremental": true,
21
- "tsBuildInfoFile": "./tsconfig.tsbuildinfo",
22
- "module": "preserve",
23
- "outDir": "./dist",
24
- "baseUrl": ".",
25
- "rootDir": "./src",
26
- "paths": {
27
- "~/*": [
28
- "./src/*"
29
- ],
30
- "@/*": [
31
- "./src/*"
32
- ]
33
- },
34
- /* Required for project references, which provide go-to-definition in your
35
- IDE without first having to build the module, which is essential during development. */
36
- "composite": true,
37
- /* Assuming your bundler will output everything, but we can not have noEmit
38
- enabled because it is not compatible with composite / project references. Also declaration might be required for references to work fully. Not sure yet... */
39
- "declaration": true,
40
- "declarationMap": true,
41
- "jsx": "react-jsx",
42
- "lib": [
43
- "dom",
44
- "dom.iterable",
45
- "esnext"
46
- ],
47
- },
48
- "include": [
49
- "./src",
50
- "./src/**/*.json",
51
- ],
52
- "exclude": [
53
- "!./src/**"
54
- ],
55
- "references": [
56
- {
57
- "path": "../core"
58
- }
59
- ],
1
+ {
2
+ "$schema": "https://json.schemastore.org/tsconfig",
3
+ "display": "Monorepo shared library",
4
+ "extends": "./tsconfig.base.json",
5
+ "compilerOptions": {
6
+ "rootDir": ".",
7
+ /* Required for project references, which provide go-to-definition in your
8
+ IDE without first having to build the module, which is essential during development. */
9
+ "composite": true,
10
+ "incremental": true,
11
+ "tsBuildInfoFile": "./tsconfig.tsbuildinfo",
12
+ },
13
+ "include": [
14
+ "./**/*.ts",
15
+ "./**/*.tsx",
16
+ "./**/*.json",
17
+ ],
18
+ "exclude": []
60
19
  }
@@ -0,0 +1,23 @@
1
+ {
2
+ "extends": "./tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "./src",
5
+ "composite": false,
6
+ "paths": {
7
+ "@/*": [
8
+ "./src/*"
9
+ ],
10
+ "~/*": [
11
+ "./stories/*"
12
+ ],
13
+ "@kiberon-labs/behave-graph": [
14
+ "../core/dist/index.d.ts"
15
+ ]
16
+ },
17
+ },
18
+ "include": [
19
+ "./src",
20
+ "./src/**/*.json",
21
+ ],
22
+ "exclude": [],
23
+ }
package/tsdown.config.ts CHANGED
@@ -1,15 +1,27 @@
1
1
  import { defineConfig } from 'tsdown';
2
+ import LightningCSS from 'unplugin-lightningcss/rolldown';
2
3
 
3
4
  export default defineConfig({
4
- entry: ['./src/index.ts'],
5
+ entry: {
6
+ index: './src/index.ts'
7
+ },
8
+
5
9
  outDir: 'dist',
6
10
  target: 'es2022',
7
11
  sourcemap: true,
12
+ tsconfig: 'tsconfig.prod.json',
8
13
  skipNodeModulesBundle: true,
9
- external: ['@kiberon-labs/behave-graph'],
14
+ copy: [{ from: 'src/entry.css', to: 'dist/entry.css' }],
15
+ plugins: [LightningCSS({ options: { minify: true } })],
16
+ external: [
17
+ '@kiberon-labs/behave-graph',
18
+ '@vscode-elements/react-elements',
19
+ 'rc-dock',
20
+ 'rc-menu'
21
+ ],
10
22
  format: ['esm'],
11
23
  dts: true,
24
+ // unbundle: true,
12
25
  logLevel: 'warn',
13
- unbundle: true,
14
26
  platform: 'neutral'
15
27
  });
package/typedoc.json CHANGED
@@ -1,8 +1,8 @@
1
- {
2
- "extends": [
3
- "../../typedoc.base.jsonc"
4
- ],
5
- "entryPoints": [
6
- "src/index.ts"
7
- ]
1
+ {
2
+ "extends": [
3
+ "../../typedoc.base.jsonc"
4
+ ],
5
+ "entryPoints": [
6
+ "src/index.ts"
7
+ ]
8
8
  }
package/vite.config.js ADDED
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from 'vite';
2
+ import tsconfigPaths from 'vite-tsconfig-paths';
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ plugins: [tsconfigPaths()]
7
+ });
package/vitest.config.ts CHANGED
@@ -3,8 +3,11 @@ import { configDefaults, defineConfig } from 'vitest/config';
3
3
 
4
4
  export default defineConfig({
5
5
  test: {
6
- exclude: [...configDefaults.exclude],
7
- watch: false
6
+ // Visual/pixel regression tests run in a real browser via the dedicated
7
+ // vitest.visual.config.ts , keep them out of the happy-dom unit run.
8
+ exclude: [...configDefaults.exclude, '**/*.visual.test.{ts,tsx}'],
9
+ watch: false,
10
+ environment: 'happy-dom'
8
11
  },
9
12
  resolve: {
10
13
  alias: {