@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
package/src/index.ts CHANGED
@@ -1,27 +1,24 @@
1
- export * from './components/modals/ClearModal.js';
2
- export * from './components/modals/HelpModal.js';
3
- export * from './components/modals/LoadModal.js';
4
- export * from './components/modals/Modal.js';
5
- export * from './components/modals/SaveModal.js';
6
- export * from './components/Controls.js';
7
-
8
- export * from './components/AutoSizeInput.js';
9
- export * from './components/Controls.js';
10
- export * from './components/InputSocket.js';
11
- export * from './components/Node.js';
1
+ import './index.css';
2
+
3
+ export * from './components/sockets/input/index.js';
4
+ export * from './components/nodes/behave/Node.js';
12
5
  export * from './components/Flow.js';
13
- export * from './components/NodeContainer.js';
14
- export * from './components/NodePicker.js';
15
- export * from './components/OutputSocket.js';
6
+ export * from './components/FloatingToolbar/index.js';
7
+ export * from './components/nodes/behave/NodeContainer.js';
8
+ export * from './components/contextMenus/NodePicker.js';
9
+ export * from './components/contextMenus/NodePicker.js';
10
+ export * from './components/sockets/output/index.js';
11
+ export * from './components/menubar/menuItem';
12
+ // Presentational panel primitives, exported so plugin packages (e.g. the AI
13
+ // nodes package's conversation panel) can author panels that match the editor.
14
+ export * from './components/panels/base/index.js';
15
+ export * from './components/primitives/icon.js';
16
16
 
17
+ //================== Reusable hooks =================//
17
18
  export * from './hooks/useChangeNodeData.js';
18
19
  export * from './hooks/useOnPressKey.js';
19
20
  export * from './hooks/useFlowHandlers.js';
20
- export * from './hooks/useGraphRunner.js';
21
21
  export * from './hooks/useBehaveGraphFlow.js';
22
- export * from './hooks/useNodeSpecJson.js';
23
- export * from './hooks/useCustomNodeTypes.js';
24
- export * from './hooks/useMergeMap.js';
25
22
 
26
23
  export * from './transformers/behaveToFlow.js';
27
24
  export * from './transformers/flowToBehave.js';
@@ -35,3 +32,41 @@ export * from './util/hasPositionMetaData.js';
35
32
  export * from './util/isHandleConnected.js';
36
33
  export * from './util/isValidConnection.js';
37
34
  export * from './util/sleep.js';
35
+ export * from './util/serializeVariables.js';
36
+ export * from './util/downloadJson';
37
+
38
+ // New metadata types and utilities (v2.0)
39
+ export * from './types/NodeMetadata.js';
40
+ export * from './util/extractNodeMetadata.js';
41
+
42
+ export * from './system/index.js';
43
+ export * from './components/layoutController/index.js';
44
+
45
+ export * from './store/controls';
46
+ export * from './store/specific';
47
+ export * from './store/socketGenerator';
48
+ export * from './store/documentation';
49
+ export * from './store/toolbar';
50
+ export * from './store/conversions';
51
+ export * from './store/commands';
52
+ export * from './store/contextMenu';
53
+ export * from './store/settingsSchema';
54
+ export { registerDefaults } from './generators/registerDefaults';
55
+
56
+ export * from './annotations/index';
57
+
58
+ export * from './types/graph';
59
+
60
+ //================== Plugins =================//
61
+ export * from './system/plugin';
62
+ export * from './manifest/index.js';
63
+ export * from './plugin/docs/index.js';
64
+ export * from './plugin/alignment/index.js';
65
+ export * from './plugin/layout/index.js';
66
+ export * from './plugin/notes/index.js';
67
+ export * from './plugin/autosave/index.js';
68
+ export * from './plugin/kitchen-sink/index.js';
69
+ export * from './plugin/graphrunner/index.js';
70
+ export * from './plugin/graphrunner-local/index.js';
71
+ export * from './plugin/graphrunner-webworker/index.js';
72
+ export * from './plugin/realtime/realtimeRunner.js';
@@ -0,0 +1,93 @@
1
+ import type { FC } from 'react';
2
+ import type { TabData } from 'rc-dock';
3
+ import {
4
+ ContributionKind,
5
+ type ContributionSpec
6
+ } from '@kiberon-labs/behave-graph';
7
+ import type { System } from '@/system/system';
8
+ import type { ControlProps } from '@/store/controls';
9
+ import type { Specific } from '@/store/specific';
10
+ import type { SocketGenerator } from '@/store/socketGenerator';
11
+ import type { ConversionRule } from '@/store/conversions';
12
+ import type { Command } from '@/store/commands';
13
+ import type { ContextMenuItem } from '@/store/contextMenu';
14
+ import type { ValueTypeMetadata } from '@/types/NodeMetadata';
15
+
16
+ /**
17
+ * Registers a single resolved contribution into the right editor store. `value`
18
+ * is whatever the host's resolver loaded for the contribution's `export` (its
19
+ * concrete shape depends on the kind).
20
+ */
21
+ export type ContributionApplier = (
22
+ system: System,
23
+ contribution: ContributionSpec,
24
+ value: unknown
25
+ ) => void;
26
+
27
+ /** Dispatch table mapping each {@link ContributionKind} to its store action. */
28
+ export const contributionAppliers: Record<string, ContributionApplier> = {
29
+ [ContributionKind.Control]: (system, c, value) => {
30
+ const name = c.bind?.controlName ?? c.bind?.valueType;
31
+ if (!name) {
32
+ throw new Error(
33
+ `control contribution '${c.id}' needs bind.controlName (or bind.valueType)`
34
+ );
35
+ }
36
+ system.controlStore
37
+ .getState()
38
+ .registerControl(name, value as FC<ControlProps>);
39
+ },
40
+
41
+ [ContributionKind.Specific]: (system, _c, value) => {
42
+ system.specificStore.getState().registerSpecific(value as Specific);
43
+ },
44
+
45
+ [ContributionKind.Panel]: (system, c, value) => {
46
+ // A panel resolves to a tab loader `() => TabData`, registered under the
47
+ // contribution id (the tab id the host opens).
48
+ system.tabLoader.register(c.id, value as () => TabData);
49
+ },
50
+
51
+ [ContributionKind.SocketGenerator]: (system, _c, value) => {
52
+ system.socketGeneratorStore
53
+ .getState()
54
+ .registerGenerator(value as SocketGenerator);
55
+ },
56
+
57
+ [ContributionKind.Conversion]: (system, _c, value) => {
58
+ system.conversionStore
59
+ .getState()
60
+ .registerConversion(value as ConversionRule);
61
+ },
62
+
63
+ [ContributionKind.Command]: (system, _c, value) => {
64
+ system.commandStore.getState().register(value as Command);
65
+ },
66
+
67
+ [ContributionKind.ContextMenu]: (system, _c, value) => {
68
+ system.contextMenuStore.getState().register(value as ContextMenuItem);
69
+ },
70
+
71
+ [ContributionKind.ValueType]: (system, c, value) => {
72
+ // Replaces the pass-through value type with the real, function-bearing one.
73
+ const vt = value as ValueTypeMetadata;
74
+ const name = c.bind?.valueType ?? vt.name;
75
+ system.registry.getState().updateValues({ [name]: { ...vt, name } });
76
+ }
77
+ };
78
+
79
+ /** Apply a resolved contribution, warning (not throwing) on an unknown kind. */
80
+ export function applyContribution(
81
+ system: System,
82
+ contribution: ContributionSpec,
83
+ value: unknown
84
+ ): void {
85
+ const applier = contributionAppliers[contribution.kind];
86
+ if (!applier) {
87
+ console.warn(
88
+ `[manifest] no applier for contribution kind '${contribution.kind}' (${contribution.id})`
89
+ );
90
+ return;
91
+ }
92
+ applier(system, contribution, value);
93
+ }
@@ -0,0 +1,4 @@
1
+ export * from './passthroughValueType';
2
+ export * from './contributionRegistry';
3
+ export * from './loadManifest';
4
+ export * from './manifestPlugin';
@@ -0,0 +1,82 @@
1
+ import type {
2
+ ContributionSpec,
3
+ ManifestJSON,
4
+ PackageRequirement
5
+ } from '@kiberon-labs/behave-graph';
6
+ import type { System } from '@/system/system';
7
+ import type { ValueTypeMetadata } from '@/types/NodeMetadata';
8
+ import { passthroughValueType } from './passthroughValueType';
9
+ import { applyContribution } from './contributionRegistry';
10
+
11
+ /**
12
+ * Resolves a contribution's declarative `export` (e.g. `"./ui.js#ImageControl"`)
13
+ * to its actual value. The host owns this because a bundler must know the
14
+ * concrete module — so loading code contributions is always host-mediated and
15
+ * gated behind {@link LoadManifestOptions.trust}.
16
+ */
17
+ export type ContributionResolver = (
18
+ contribution: ContributionSpec,
19
+ manifest: ManifestJSON
20
+ ) => unknown | Promise<unknown>;
21
+
22
+ export type LoadManifestOptions = {
23
+ /**
24
+ * Gate for executing code contributions. Default `false`: only nodes and
25
+ * pass-through value types load (no package code runs). Set true together
26
+ * with {@link LoadManifestOptions.resolve} once the package is trusted.
27
+ */
28
+ trust?: boolean;
29
+ /** Required to load contributions; without it only the static parts load. */
30
+ resolve?: ContributionResolver;
31
+ /**
32
+ * Called for each declared host requirement (persistent backend, config,
33
+ * ...). Lets the host surface a badge or run a backend. No code executes here.
34
+ */
35
+ onRequirement?: (
36
+ requirement: PackageRequirement,
37
+ manifest: ManifestJSON
38
+ ) => void;
39
+ };
40
+
41
+ /**
42
+ * Load a package manifest into the editor.
43
+ *
44
+ * Always (no code execution): registers the node specs and pass-through value
45
+ * types, so the palette is fully populated from JSON alone. Only under explicit
46
+ * `trust` + a `resolve`r does it import and register the package's code
47
+ * contributions. Declared host requirements are surfaced via `onRequirement`.
48
+ */
49
+ export async function loadManifest(
50
+ system: System,
51
+ manifest: ManifestJSON,
52
+ options: LoadManifestOptions = {}
53
+ ): Promise<void> {
54
+ // 1. Static: nodes + pass-through value types. No package code runs.
55
+ const values: Record<string, ValueTypeMetadata> = {};
56
+ for (const value of manifest.values) {
57
+ values[value.name] = passthroughValueType(value);
58
+ }
59
+ system.registry.getState().updateRegistry({ specs: manifest.nodes, values });
60
+
61
+ // 2. Surface host requirements (no code execution).
62
+ if (options.onRequirement && manifest.requirements) {
63
+ for (const requirement of manifest.requirements) {
64
+ options.onRequirement(requirement, manifest);
65
+ }
66
+ }
67
+
68
+ // 3. Code contributions — only when explicitly trusted and a resolver exists.
69
+ if (!options.trust || !options.resolve) return;
70
+ for (const contribution of manifest.contributions) {
71
+ try {
72
+ const value = await options.resolve(contribution, manifest);
73
+ if (value === null || value === undefined) continue;
74
+ applyContribution(system, contribution, value);
75
+ } catch (err) {
76
+ console.error(
77
+ `[manifest] failed to load contribution '${contribution.id}'`,
78
+ err
79
+ );
80
+ }
81
+ }
82
+ }
@@ -0,0 +1,29 @@
1
+ import type { ManifestJSON } from '@kiberon-labs/behave-graph';
2
+ import { plugin } from '@/system/plugin';
3
+ import type { System } from '@/system/system';
4
+ import { loadManifest, type LoadManifestOptions } from './loadManifest';
5
+
6
+ export interface ManifestPluginOptions extends LoadManifestOptions {
7
+ /** Manifests to load, in order (later ones override earlier node types). */
8
+ manifests: ManifestJSON[];
9
+ }
10
+
11
+ export async function manifestPluginLoader(
12
+ system: System,
13
+ options: ManifestPluginOptions
14
+ ): Promise<void> {
15
+ const { manifests, ...loadOptions } = options;
16
+ for (const manifest of manifests) {
17
+ await loadManifest(system, manifest, loadOptions);
18
+ }
19
+ }
20
+
21
+ /**
22
+ * Register one or more package manifests as a single plugin. The static parts
23
+ * (nodes + value types) always load; code contributions load only under
24
+ * `trust` + `resolve` (see {@link LoadManifestOptions}).
25
+ */
26
+ export const manifestPlugin = plugin<ManifestPluginOptions>(
27
+ manifestPluginLoader,
28
+ { name: 'manifest' }
29
+ );
@@ -0,0 +1,40 @@
1
+ import type { ValueTypeSpecJSON } from '@kiberon-labs/behave-graph';
2
+ import type { ValueTypeMetadata } from '@/types/NodeMetadata';
3
+
4
+ const clone = <T>(value: T): T => {
5
+ if (value === null || typeof value !== 'object') return value;
6
+ try {
7
+ return structuredClone(value);
8
+ } catch {
9
+ return JSON.parse(JSON.stringify(value)) as T;
10
+ }
11
+ };
12
+
13
+ /**
14
+ * Build a function-bearing {@link ValueTypeMetadata} from a function-free
15
+ * {@link ValueTypeSpecJSON} carried in a manifest.
16
+ *
17
+ * The editor calls `creator`/`serialize`/`deserialize` at author time (creating
18
+ * variables, editing events, deserializing a graph's variables). A manifest can
19
+ * only ship JSON, so we synthesise pass-through behaviour: the value is already
20
+ * its own JSON form, so (de)serialize are identity and `creator` returns a clone
21
+ * of the declared default. This keeps every existing UI call site working with
22
+ * **zero code execution**. When the package is later trusted-loaded, a
23
+ * `valueType` contribution can replace this with the real implementation.
24
+ */
25
+ export function passthroughValueType(
26
+ spec: ValueTypeSpecJSON
27
+ ): ValueTypeMetadata {
28
+ return {
29
+ name: spec.name,
30
+ creator: () =>
31
+ spec.defaultJSON === null || spec.defaultJSON === undefined
32
+ ? undefined
33
+ : clone(spec.defaultJSON),
34
+ serialize: (value: unknown) => value,
35
+ deserialize: (value: unknown) => value,
36
+ clone: (value: unknown) => clone(value),
37
+ equals: (a: unknown, b: unknown) =>
38
+ a === b || JSON.stringify(a) === JSON.stringify(b)
39
+ };
40
+ }
@@ -0,0 +1,91 @@
1
+ import { align, distribute, ALIGNMENT } from '@/components/panels/alignment';
2
+ import type { GraphSession } from '@/system/graphSession';
3
+ import type { Node } from 'reactflow';
4
+ import { plugin } from '@/system/plugin';
5
+ import type { System } from '@/system/system';
6
+ import { pinned } from '@/annotations';
7
+
8
+ const partitionSelectedNodes = (nodes: Node[]) => {
9
+ return nodes.reduce(
10
+ (acc, node) => {
11
+ if (node.selected && !node.data?.metadata?.[pinned]) {
12
+ acc.selectedNodes.push(node);
13
+ } else {
14
+ acc.unselectedNodes.push(node);
15
+ }
16
+ return acc;
17
+ },
18
+ {
19
+ selectedNodes: [] as Node[],
20
+ unselectedNodes: [] as Node[]
21
+ }
22
+ );
23
+ };
24
+
25
+ export type AlignmentAxis = 'x' | 'y';
26
+ export type AlignmentType = 'start' | 'center' | 'end';
27
+
28
+ declare module '@/system/system' {
29
+ interface GraphPubSys {
30
+ 'alignment:align': {
31
+ type: AlignmentType;
32
+ axis: AlignmentAxis;
33
+ };
34
+ 'alignment:distribute': {
35
+ type: AlignmentType;
36
+ axis: AlignmentAxis;
37
+ };
38
+ }
39
+ }
40
+
41
+ export const setupSessionActions = (session: GraphSession) => {
42
+ // Subscribe to alignment events
43
+ session.pubsub.subscribe('alignment:align', (_, data) => {
44
+ const { nodes, setNodes } = session.nodeStore.getState();
45
+ const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);
46
+
47
+ const alignmentType =
48
+ data.type === 'start'
49
+ ? ALIGNMENT.START
50
+ : data.type === 'center'
51
+ ? ALIGNMENT.CENTER
52
+ : ALIGNMENT.END;
53
+
54
+ align(alignmentType, data.axis)(selectedNodes);
55
+ setNodes([...unselectedNodes, ...selectedNodes]);
56
+ });
57
+
58
+ // Subscribe to distribution events
59
+ session.pubsub.subscribe('alignment:distribute', (_, data) => {
60
+ const { nodes, setNodes } = session.nodeStore.getState();
61
+ const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);
62
+
63
+ const alignmentType =
64
+ data.type === 'start'
65
+ ? ALIGNMENT.START
66
+ : data.type === 'center'
67
+ ? ALIGNMENT.CENTER
68
+ : ALIGNMENT.END;
69
+
70
+ distribute(alignmentType, data.axis)(selectedNodes);
71
+ setNodes([...unselectedNodes, ...selectedNodes]);
72
+ });
73
+ };
74
+
75
+ /**
76
+ * Adds node alignment + distribution to the editor. The behaviour is opt-in: it
77
+ * subscribes each graph's pubsub (via a session extension, so it covers graphs
78
+ * already open and any opened later) to the `alignment:align` /
79
+ * `alignment:distribute` events the FloatingToolbar and Alignment panel publish.
80
+ *
81
+ * Register it directly or via the kitchen-sink plugin. Without it those events
82
+ * have no subscriber and the alignment controls simply no-op.
83
+ */
84
+ export const alignmentPlugin = plugin(
85
+ (system: System) => {
86
+ system.registerSessionExtension((session) => {
87
+ setupSessionActions(session);
88
+ });
89
+ },
90
+ { name: 'alignment' }
91
+ );