@kiberon-labs/behave-graph-flow 1.0.0 → 2.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 (314) hide show
  1. package/.fallowrc.json +16 -0
  2. package/.storybook/main.ts +32 -0
  3. package/.storybook/preview.ts +16 -0
  4. package/.storybook/styles.css +10 -0
  5. package/.storybook/vscode.css +814 -0
  6. package/.turbo/turbo-build.log +7 -0
  7. package/LICENSE +6 -0
  8. package/README.md +2 -2
  9. package/data/Polynomial.json +510 -0
  10. package/data/sequence.json +337 -0
  11. package/data/trigger-event.json +241 -0
  12. package/data/variable-change.json +210 -0
  13. package/dist/entry.css +4 -0
  14. package/dist/index.css +39 -0
  15. package/dist/index.css.map +1 -0
  16. package/dist/index.d.ts +2282 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +14873 -0
  19. package/dist/index.js.map +1 -0
  20. package/docs/notifications.md +246 -0
  21. package/docs/protocol.md +679 -0
  22. package/docs/specifics.md +191 -0
  23. package/package.json +85 -21
  24. package/postcss.config.ts +3 -4
  25. package/src/annotations/index.ts +32 -0
  26. package/src/components/FloatingToolbar/index.module.css +45 -0
  27. package/src/components/FloatingToolbar/index.tsx +256 -0
  28. package/src/components/Flow.tsx +276 -75
  29. package/src/components/contextMenus/NodePicker.module.css +274 -0
  30. package/src/components/contextMenus/NodePicker.tsx +481 -0
  31. package/src/components/contextMenus/edge.tsx +108 -0
  32. package/src/components/contextMenus/node.tsx +155 -0
  33. package/src/components/contextMenus/selection.tsx +77 -0
  34. package/src/components/controls/any/index.tsx +8 -0
  35. package/src/components/controls/boolean/index.tsx +13 -0
  36. package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
  37. package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
  38. package/src/components/controls/colorPicker/index.module.css +18 -0
  39. package/src/components/controls/colorPicker/index.tsx +61 -0
  40. package/src/components/controls/number/index.tsx +35 -0
  41. package/src/components/controls/string/index.tsx +16 -0
  42. package/src/components/edges/index.tsx +469 -0
  43. package/src/components/edges/offsetBezier.ts +134 -0
  44. package/src/components/hotKeys.tsx +20 -0
  45. package/src/components/layoutController/index.module.css +10 -0
  46. package/src/components/layoutController/index.tsx +117 -0
  47. package/src/components/layoutController/utils.ts +205 -0
  48. package/src/components/menubar/defaults.tsx +480 -0
  49. package/src/components/menubar/index.tsx +49 -0
  50. package/src/components/menubar/menuItem.module.css +16 -0
  51. package/src/components/menubar/menuItem.tsx +32 -0
  52. package/src/components/nodes/behave/Node.module.css +23 -0
  53. package/src/components/nodes/behave/Node.tsx +176 -0
  54. package/src/components/nodes/behave/NodeContainer.module.css +87 -0
  55. package/src/components/nodes/behave/NodeContainer.tsx +46 -0
  56. package/src/components/nodes/behave/index.tsx +14 -0
  57. package/src/components/nodes/comment/FormatToolbar.tsx +118 -0
  58. package/src/components/nodes/comment/comment.tsx +103 -0
  59. package/src/components/nodes/comment/styles.module.css +150 -0
  60. package/src/components/nodes/group/index.tsx +109 -0
  61. package/src/components/nodes/wrapper/index.tsx +73 -0
  62. package/src/components/nodes/wrapper/styles.module.css +113 -0
  63. package/src/components/notifications/NotificationProvider.tsx +81 -0
  64. package/src/components/notifications/index.ts +2 -0
  65. package/src/components/notifications/utils.ts +71 -0
  66. package/src/components/panels/alignment/index.module.css +20 -0
  67. package/src/components/panels/alignment/index.tsx +244 -0
  68. package/src/components/panels/base/index.tsx +5 -0
  69. package/src/components/panels/base/styles.module.css +12 -0
  70. package/src/components/panels/conversation/index.module.css +151 -0
  71. package/src/components/panels/conversation/index.tsx +162 -0
  72. package/src/components/panels/events/CustomEventsEditor.tsx +384 -0
  73. package/src/components/panels/events/EditEventPanel.tsx +315 -0
  74. package/src/components/panels/events/ManageEventsPanel.tsx +98 -0
  75. package/src/components/panels/events/index.tsx +23 -0
  76. package/src/components/panels/events/styles.module.css +236 -0
  77. package/src/components/panels/history/index.tsx +92 -0
  78. package/src/components/panels/history/styles.module.css +106 -0
  79. package/src/components/panels/keymaps/index.module.css +78 -0
  80. package/src/components/panels/keymaps/index.tsx +167 -0
  81. package/src/components/panels/layers/index.tsx +240 -0
  82. package/src/components/panels/layers/styles.module.css +110 -0
  83. package/src/components/panels/legend/index.module.css +6 -0
  84. package/src/components/panels/legend/index.tsx +76 -0
  85. package/src/components/panels/logs/index.module.css +212 -0
  86. package/src/components/panels/logs/index.tsx +288 -0
  87. package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
  88. package/src/components/panels/nodeInputs/InputsGroup.tsx +64 -0
  89. package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
  90. package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
  91. package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
  92. package/src/components/panels/nodeInputs/OutputsGroup.tsx +65 -0
  93. package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
  94. package/src/components/panels/nodeInputs/index.module.css +284 -0
  95. package/src/components/panels/nodeInputs/index.tsx +339 -0
  96. package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
  97. package/src/components/panels/nodeInputs/useNodeInputsData.ts +173 -0
  98. package/src/components/panels/nodePicker/index.tsx +115 -0
  99. package/src/components/panels/panel/index.module.css +66 -0
  100. package/src/components/panels/panel/index.tsx +88 -0
  101. package/src/components/panels/search/index.module.css +66 -0
  102. package/src/components/panels/search/index.tsx +215 -0
  103. package/src/components/panels/systemSettings/index.tsx +206 -0
  104. package/src/components/panels/systemSettings/styles.module.css +11 -0
  105. package/src/components/panels/traces/GridLines.tsx +38 -0
  106. package/src/components/panels/traces/TimeGrid.tsx +48 -0
  107. package/src/components/panels/traces/TraceLane.tsx +62 -0
  108. package/src/components/panels/traces/TraceTooltip.tsx +22 -0
  109. package/src/components/panels/traces/TracesHeader.tsx +56 -0
  110. package/src/components/panels/traces/index.module.css +166 -0
  111. package/src/components/panels/traces/index.tsx +294 -0
  112. package/src/components/panels/traces/types.ts +48 -0
  113. package/src/components/panels/traces/useDerivedSpans.ts +212 -0
  114. package/src/components/panels/traces/utils.ts +25 -0
  115. package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
  116. package/src/components/panels/variables/ManageVariablesScreen.tsx +144 -0
  117. package/src/components/panels/variables/index.tsx +125 -0
  118. package/src/components/panels/variables/styles.module.css +236 -0
  119. package/src/components/primitives/icon.module.css +45 -0
  120. package/src/components/primitives/icon.tsx +38 -0
  121. package/src/components/sockets/input/index.tsx +76 -0
  122. package/src/components/sockets/input/styles.module.css +27 -0
  123. package/src/components/sockets/output/index.tsx +61 -0
  124. package/src/components/sockets/output/styles.module.css +27 -0
  125. package/src/css/prosemirror.css +57 -0
  126. package/src/css/rc-dock.css +112 -0
  127. package/src/css/rc-menu.css +100 -0
  128. package/src/css/vars.css +14 -0
  129. package/src/css/vscode.css +13 -0
  130. package/src/entry.css +4 -0
  131. package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
  132. package/src/generators/SequenceGenerator.tsx +104 -0
  133. package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
  134. package/src/generators/SwitchOnStringGenerator.tsx +263 -0
  135. package/src/generators/registerDefaultGenerators.ts +34 -0
  136. package/src/hooks/useBehaveGraphFlow.ts +17 -16
  137. package/src/hooks/useDetachNodes.ts +39 -0
  138. package/src/hooks/useFlowHandlers.ts +115 -29
  139. package/src/hooks/useWasdPan.ts +188 -0
  140. package/src/index.css +146 -0
  141. package/src/index.ts +36 -18
  142. package/src/layout/dagre.tsx +119 -0
  143. package/src/layout/elk.ts +200 -0
  144. package/src/plugin/alignment/index.ts +81 -0
  145. package/src/plugin/docs/index.tsx +299 -0
  146. package/src/plugin/docs/panel/index.tsx +200 -0
  147. package/src/plugin/docs/panel/styles.module.css +174 -0
  148. package/src/plugin/graphrunner/actions.ts +253 -0
  149. package/src/plugin/graphrunner/buttons.tsx +87 -0
  150. package/src/plugin/graphrunner/client.ts +704 -0
  151. package/src/plugin/graphrunner/index.tsx +255 -0
  152. package/src/plugin/graphrunner/panel.tsx +386 -0
  153. package/src/plugin/graphrunner/runner.ts +358 -0
  154. package/src/plugin/graphrunner/session.ts +243 -0
  155. package/src/plugin/graphrunner/store.ts +206 -0
  156. package/src/plugin/graphrunner/styles.module.css +211 -0
  157. package/src/plugin/graphrunner/transport.ts +224 -0
  158. package/src/plugin/graphrunner/types.ts +672 -0
  159. package/src/plugin/graphrunner-local/execution-utils.ts +457 -0
  160. package/src/plugin/graphrunner-local/index.tsx +166 -0
  161. package/src/plugin/graphrunner-local/panel.tsx +231 -0
  162. package/src/plugin/graphrunner-local/store.ts +41 -0
  163. package/src/plugin/graphrunner-local/styles.module.css +101 -0
  164. package/src/plugin/graphrunner-local/transport.ts +1372 -0
  165. package/src/plugin/graphrunner-local/types.ts +10 -0
  166. package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +633 -0
  167. package/src/plugin/graphrunner-webworker/index.tsx +146 -0
  168. package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
  169. package/src/plugin/graphrunner-webworker/store.ts +89 -0
  170. package/src/plugin/graphrunner-webworker/types.ts +17 -0
  171. package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
  172. package/src/plugin/realtime/realtimeRunner.ts +570 -0
  173. package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
  174. package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
  175. package/src/specifics/VariableGetSpecific.tsx +110 -0
  176. package/src/specifics/VariableSetSpecific.tsx +110 -0
  177. package/src/specifics/registerDefaultSpecifics.ts +5 -0
  178. package/src/store/actions.tsx +698 -0
  179. package/src/store/chat.ts +73 -0
  180. package/src/store/controls.tsx +62 -0
  181. package/src/store/documentation.tsx +69 -0
  182. package/src/store/events.tsx +116 -0
  183. package/src/store/flow.tsx +245 -0
  184. package/src/store/graphRunnerClient.ts +110 -0
  185. package/src/store/hotKeys.tsx +323 -0
  186. package/src/store/layers.ts +259 -0
  187. package/src/store/legend.tsx +76 -0
  188. package/src/store/logs.ts +28 -0
  189. package/src/store/menubar.ts +41 -0
  190. package/src/store/refs.ts +84 -0
  191. package/src/store/registry.ts +43 -0
  192. package/src/store/selection.ts +22 -0
  193. package/src/store/settings.ts +99 -0
  194. package/src/store/socketGenerator.tsx +54 -0
  195. package/src/store/specific.tsx +75 -0
  196. package/src/store/specs.tsx +35 -0
  197. package/src/store/tabs.ts +278 -0
  198. package/src/store/toolbar.tsx +45 -0
  199. package/src/store/traces.ts +240 -0
  200. package/src/store/variables.ts +37 -0
  201. package/src/system/graph.ts +134 -0
  202. package/src/system/index.ts +3 -0
  203. package/src/system/notifications.ts +98 -0
  204. package/src/system/plugin.ts +27 -0
  205. package/src/system/provider.tsx +22 -0
  206. package/src/system/pubsub.ts +323 -0
  207. package/src/system/system.ts +223 -0
  208. package/src/system/tabLoader.tsx +265 -0
  209. package/src/system/undoRedo.ts +103 -0
  210. package/src/transformers/Uigraph.ts +60 -0
  211. package/src/transformers/behaveToFlow.ts +16 -4
  212. package/src/transformers/flowToBehave.ts +32 -12
  213. package/src/types/NodeMetadata.ts +27 -0
  214. package/src/types/graph.ts +49 -0
  215. package/src/types/nodes.ts +45 -0
  216. package/src/types.ts +16 -0
  217. package/src/util/colors.ts +1 -29
  218. package/src/util/downloadJson.ts +18 -0
  219. package/src/util/extractNodeMetadata.ts +16 -0
  220. package/src/util/getPickerFilters.ts +1 -1
  221. package/src/util/isBehaveNode.ts +6 -0
  222. package/src/util/isValidConnection.ts +28 -15
  223. package/src/util/mergeSockets.ts +29 -0
  224. package/src/util/serializeVariables.ts +66 -0
  225. package/src/util/sockets.ts +43 -0
  226. package/stories/apex/layoutController/example-graph.worker.ts +39 -0
  227. package/stories/apex/layoutController/index.stories.tsx +48 -0
  228. package/stories/apex/layoutController/webworker.stories.tsx +103 -0
  229. package/stories/apex/menubar/menubar.stories.tsx +19 -0
  230. package/stories/components/colorpicker/index.stories.tsx +20 -0
  231. package/stories/components/contextMenus/edge.stories.tsx +32 -0
  232. package/stories/components/contextMenus/node.stories.tsx +26 -0
  233. package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
  234. package/stories/components/controls/any/index.stories.tsx +19 -0
  235. package/stories/components/controls/boolean/index.stories.tsx +19 -0
  236. package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
  237. package/stories/components/controls/number/index.stories.tsx +19 -0
  238. package/stories/components/controls/string/index.stories.tsx +19 -0
  239. package/stories/components/nodes/behaveNode.stories.tsx +108 -0
  240. package/stories/components/nodes/comment.stories.tsx +106 -0
  241. package/stories/components/panels/alignment.stories.tsx +24 -0
  242. package/stories/components/panels/events.stories.tsx +38 -0
  243. package/stories/components/panels/graphRunner.stories.tsx +317 -0
  244. package/stories/components/panels/history.stories.tsx +37 -0
  245. package/stories/components/panels/keymaps.stories.tsx +21 -0
  246. package/stories/components/panels/legend.stories.tsx +37 -0
  247. package/stories/components/panels/logs.stories.tsx +24 -0
  248. package/stories/components/panels/nodeInputs.stories.tsx +21 -0
  249. package/stories/components/panels/nodePicker.stories.tsx +37 -0
  250. package/stories/components/panels/panel.stories.tsx +39 -0
  251. package/stories/components/panels/search.stories.tsx +24 -0
  252. package/stories/components/panels/systemSettings.stories.tsx +26 -0
  253. package/stories/components/panels/traces.stories.tsx +225 -0
  254. package/stories/components/panels/variables.stories.tsx +24 -0
  255. package/stories/defaults/defaultStoryProvider.tsx +167 -0
  256. package/stories/defaults/systemGenerator.ts +38 -0
  257. package/tests/components/edges/offsetBezier.test.ts +51 -0
  258. package/tests/components/layoutController/utils.test.ts +68 -0
  259. package/tests/components/panels/traces/utils.test.ts +52 -0
  260. package/tests/flowToBehave.test.ts +26 -4
  261. package/tests/notifications.test.ts +87 -0
  262. package/tests/saveLoad.test.ts +372 -0
  263. package/tests/util/calculateNewEdge.test.ts +98 -0
  264. package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
  265. package/tests/util/hasPositionMetaData.test.ts +33 -0
  266. package/tests/util/isBehaveNode.test.ts +22 -0
  267. package/tests/util/isHandleConnected.test.ts +37 -0
  268. package/tests/util/mergeSockets.test.ts +43 -0
  269. package/tests/visual/README.md +64 -0
  270. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
  271. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
  272. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
  273. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
  274. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
  275. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
  276. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
  277. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
  278. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
  279. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
  280. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
  281. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
  282. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
  283. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
  284. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
  285. package/tests/visual/panels.visual.test.tsx +76 -0
  286. package/tsconfig.base.json +39 -0
  287. package/tsconfig.json +18 -59
  288. package/tsconfig.prod.json +23 -0
  289. package/tsdown.config.ts +15 -3
  290. package/typedoc.json +7 -7
  291. package/vite.config.js +7 -0
  292. package/vitest.config.ts +5 -2
  293. package/vitest.visual.config.ts +48 -0
  294. package/src/components/AutoSizeInput.tsx +0 -65
  295. package/src/components/Controls.tsx +0 -87
  296. package/src/components/InputSocket.tsx +0 -142
  297. package/src/components/Node.tsx +0 -68
  298. package/src/components/NodeContainer.tsx +0 -46
  299. package/src/components/NodePicker.tsx +0 -77
  300. package/src/components/OutputSocket.tsx +0 -58
  301. package/src/components/modals/ClearModal.tsx +0 -40
  302. package/src/components/modals/HelpModal.tsx +0 -36
  303. package/src/components/modals/LoadModal.tsx +0 -96
  304. package/src/components/modals/Modal.tsx +0 -64
  305. package/src/components/modals/SaveModal.tsx +0 -60
  306. package/src/hooks/useCustomNodeTypes.tsx +0 -31
  307. package/src/hooks/useGraphRunner.ts +0 -104
  308. package/src/hooks/useMergeMap.ts +0 -14
  309. package/src/hooks/useNodeSpecJson.ts +0 -20
  310. package/src/hooks/useQueriableDefinitions.ts +0 -22
  311. package/src/styles.css +0 -8
  312. package/tailwind.config.ts +0 -19
  313. package/tests/tsconfig.json +0 -10
  314. /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["classes","_disconnected0","_name0","_row0","_hidden0","_socket0","InputSocket: React.FC<InputSocketProps>","useStore","Icon","styles","categoryColorMap: Record<NodeSpecJSON['category'], string>","classes","_title0","_content0","_container0","_actions0","_header0","NodeContainer: React.FC<PropsWithChildren<NodeProps>>","styles","classes","_hidden0","_name0","_row0","useStore","Icon","styles","pair: [T | undefined, U | undefined]","inputs: SocketBase[]","outputs: SocketBase[]","classes","_subtitle0","_header0","_controls0","_title0","classNames","styles","classes","handleChange","useStore","specificNode: SpecificNode","generatorNode: SocketGeneratorNode","NodeContainer","styles","InputSocket","nodes: Node[]","edges: Edge[]","node: IBehaveNode","uuidv4","nextTabs: TabBase[]","defaultLayout: LayoutBase","updatedLayout: LayoutBase","floatPanel: PanelBase","floatbox: BoxBase","classes","_title0","_description0","classes","_root0","styles","styles","description","useStore","classes","_emptyState0","_row0","_toolbar0","classes","_icon0","Icon: React.FC<IconProps>","classNames","styles","LEVELS: readonly LogSeverity[]","LOG_COLORS: Record<LogSeverity, string>","IconType: Record<LogSeverity, React.ReactNode>","styles","useStore","counts: Record<LogSeverity, number>","copyToClipboard","classes","_root0","_treeItemContent0","_header0","_list0","_treeItemTitle0","_editorHeader0","_editorActions0","_section0","_emptyState0","_headerTitle0","_emptyStateText0","_editorFields0","useStore","styles","useStore","useStore","styles","useStore","newPanel: PanelBase","classes","_sectionTitle0","_tabs0","_panel0","_emptyState0","_infoButton0","_toolbar0","NodeTitleEditor: React.FC<NodeTitleEditorProps>","styles","MultipleNodesView: React.FC<MultipleNodesViewProps>","styles","SocketGenerators: React.FC<SocketGeneratorsProps>","styles","InputControl: React.FC<InputControlProps>","styles","InputsGroup: React.FC<InputsGroupProps>","styles","OutputsGroup: React.FC<OutputsGroupProps>","styles","NodeSettings: React.FC<NodeSettingsProps>","styles","useStore","inputs: Array<{\n name: string;\n valueType: string;\n defaultValue?: any;\n choices?: Array<{ text: string; value: any }>;\n value: any;\n connected: boolean;\n }>","outputs: Array<{\n name: string;\n valueType: string;\n connected: boolean;\n }>","nextAnnotations: Record<string, any>","useStore","newHiddenInputs: Record<string, boolean>","newHiddenOutputs: Record<string, boolean>","styles","classes","_content0","_row0","_root0","partitionSelectedNodes","align","styles","classes","_container0","useStore","styles","classes","_buttonGroup0","_helpText0","_root0","_content0","_header0","_table0","_actionCell0","useStore","styles","classes","_header0","_formField0","_actions0","_root0","_content0","ManageEventsPanel: React.FC<ManageEventsPanelProps>","useStore","created: CustomEventJSON","styles","EditEventPanel: React.FC<EditEventPanelProps>","useStore","parameters","styles","classes","_title0","_empty0","_root0","_header0","_subtitle0","EMPTY: DerivedData","ticks: Tick[]","buckets: Array<import('@/store/traces').TraceSpan[]>","laneData: LaneData[]","tmp: Array<{\n span: import('@/store/traces').TraceSpan;\n leftPct: number;\n widthPct: number;\n rightPct: number;\n durationMs: number;\n }>","stackRight: number[]","visualSpans: VisualSpan[]","TracesHeader","styles","TICK_STYLE: React.CSSProperties","LABEL_STYLE: React.CSSProperties","TimeGrid","padding","LINE_STYLE_BASE: React.CSSProperties","GridLines","padding","TraceLane","styles","TraceTooltip","styles","useStore","styles","classes","useStore","Icon","klasses","classes","_row0","_empty0","_root0","_list0","_sectionTitle0","useStore","styles","HotKeys","HotKeysComp","useStore","classes","_tags0","_tag0","_list0","_container0","_content0","_empty0","NodePicker: React.FC<NodePickerProps>","next: ExtendedNodeSpecJSON[]","description","groupsToRender: Array<[string, ExtendedNodeSpecJSON[]]>","styles","useStore","uuidv4","classes","_header0","_container0","_title0","_badge0","styles","classes","_header0","_container0","_fadeIn0","_title0","styles","useStore","classes","_header0","_title0","_container0","getAnnotatedLayerId","useStore","styles","HotKeys","classes","_root0","children","styles","useStore","useStore","positionMap: Record<string, Position>","nodes","graph: ElkNode","padding","ex: any","list: string[]","result: boolean | string","useStore","controlPoints: ControlPoint[]","NodeResizer","classes","styles","editor","onResize: OnResize","styles","useStore","GroupNode","variables: Record<string, any>","nativeNodeChanges","BooleanControl: React.FC<ControlProps>","NumberControl: React.FC<ControlProps>","handleChange","StringControl: React.FC<ControlProps>","classes","classes","Graph","inMemoryClipboard: string | null","newNode: IBehaveNode","uuidv4","text: string | null","newNodes: Node[]","newEdges: Edge[]","prevSelected: Record<string, boolean>","padding","groupNode: Node","nodes","connectedEngine: Engine | undefined","onStart: ((node: INode) => void) | undefined","onEnd: ((node: INode) => void) | undefined","rafHandle: number | undefined","span: TraceSpan","NAME","CustomEventOnTriggeredSpecific: React.FC<SpecificRenderProps>","useStore","NAME","CustomEventTriggerSpecific: React.FC<SpecificRenderProps>","useStore","NAME","VariableGetSpecific: React.FC<SpecificRenderProps>","useStore","NAME","VariableSetSpecific: React.FC<SpecificRenderProps>","useStore","defaultSpecifics: Specific[]","layerId","nextNodeLayers: Record<string, string>","nextLayers: Record<string, Layer>","Graph","plugin","variableJson: VariableJSON","graph: GraphJSON","nodeSpec","behaveNode: NodeJSON","useStore","graphJson","nodes","edges","uuidv4","socket","uuidv4","reactFlowInstance","clsx","change: EdgeChange","NAME","SwitchOnStringGenerator: React.FC<SocketGeneratorRenderProps>","newCases: Record<string, string>","numCases","NAME","SwitchOnIntegerGenerator: React.FC<SocketGeneratorRenderProps>","newCases: Record<string, bigint>","numCases","NAME","CustomEventOnTriggeredGenerator: React.FC<SocketGeneratorRenderProps>","useStore","outputs: Socket[]","SequenceGenerator: React.FC<SocketGeneratorRenderProps>","outputs: { name: string; key: string; valueType: string }[]","classes","_buttonGroup0","_panel0","FloatingToolbar: React.FC","useStore","styles","Flow: React.FC","useStore","classes","NotificationProvider: React.FC","groups: Record<string, TabGroup>","buttons: React.ReactElement[]","styles","useStore","classes","_section0","_title0","_sectionTitle0","useStore","styles","flowDocs: NodeDocumentation[]","mathDocs: NodeDocumentation[]","logicDocs: NodeDocumentation[]","variableDocs: NodeDocumentation[]","eventDocs: NodeDocumentation[]","message: ServerGraphRunnerMessage","classes","_panel0","_scrollContainer0","_formField0","_title0","GraphRunnerPanel: React.FC<GraphRunnerPanelProps>","useStore","auth: AuthCredentials","styles","useStore","mergedConfig: SessionConfig","session: Session","constraints: {\n type: 'enum' | 'range' | 'pattern' | 'custom';\n choices?: Array<{ value: unknown; label: string }>;\n min?: number;\n max?: number;\n pattern?: string;\n validator?: string;\n }","nodes: NodeSpecJSON[]","sleep","sessionConfig: SessionConfig","run: ActiveRun","useStore","styles"],"sources":["../src/util/getSocketsByNodeTypeAndHandleType.ts","../src/util/isHandleConnected.ts","../src/util/mergeSockets.ts","../src/util/isValidConnection.ts","../src/system/provider.tsx","../src/components/sockets/input/styles.module.css?css_module","../src/components/sockets/input/index.tsx","../src/hooks/useChangeNodeData.ts","../src/util/colors.ts","../src/components/nodes/behave/NodeContainer.module.css?css_module","../src/components/nodes/behave/NodeContainer.tsx","../src/components/sockets/output/styles.module.css?css_module","../src/components/sockets/output/index.tsx","../src/util/sockets.ts","../src/components/nodes/wrapper/styles.module.css?css_module","../src/annotations/index.ts","../src/components/nodes/wrapper/index.tsx","../src/components/nodes/behave/Node.module.css?css_module","../src/components/nodes/behave/Node.tsx","../src/transformers/behaveToFlow.ts","../src/system/undoRedo.ts","../src/store/tabs.ts","../src/store/settings.ts","../src/components/panels/systemSettings/styles.module.css?css_module","../src/components/panels/base/styles.module.css?css_module","../src/components/panels/base/index.tsx","../src/components/panels/systemSettings/index.tsx","../src/components/panels/logs/index.module.css?css_module","../src/components/primitives/icon.module.css?css_module","../src/components/primitives/icon.tsx","../src/components/panels/logs/index.tsx","../src/components/panels/variables/styles.module.css?css_module","../src/components/panels/variables/CreateVariableScreen.tsx","../src/store/refs.ts","../src/components/panels/variables/ManageVariablesScreen.tsx","../src/components/panels/variables/index.tsx","../src/components/layoutController/utils.ts","../src/components/panels/nodeInputs/index.module.css?css_module","../src/components/panels/nodeInputs/NodeTitleEditor.tsx","../src/components/panels/nodeInputs/MultipleNodesView.tsx","../src/components/panels/nodeInputs/SocketGenerators.tsx","../src/components/panels/nodeInputs/InputControl.tsx","../src/components/panels/nodeInputs/InputsGroup.tsx","../src/components/panels/nodeInputs/OutputsGroup.tsx","../src/components/panels/nodeInputs/NodeSettings.tsx","../src/components/panels/nodeInputs/useNodeInputsData.ts","../src/components/panels/nodeInputs/useNodeHandlers.ts","../src/components/panels/nodeInputs/index.tsx","../src/components/panels/alignment/index.module.css?css_module","../src/components/panels/alignment/index.tsx","../src/components/panels/search/index.module.css?css_module","../src/components/panels/search/index.tsx","../src/components/panels/keymaps/index.module.css?css_module","../src/components/panels/keymaps/index.tsx","../src/components/panels/events/styles.module.css?css_module","../src/components/panels/events/ManageEventsPanel.tsx","../src/components/panels/events/EditEventPanel.tsx","../src/components/panels/events/index.tsx","../src/components/panels/traces/index.module.css?css_module","../src/components/panels/traces/utils.ts","../src/components/panels/traces/useDerivedSpans.ts","../src/components/panels/traces/TracesHeader.tsx","../src/components/panels/traces/TimeGrid.tsx","../src/components/panels/traces/GridLines.tsx","../src/components/panels/traces/TraceLane.tsx","../src/components/panels/traces/TraceTooltip.tsx","../src/components/panels/traces/index.tsx","../src/components/panels/legend/index.module.css?css_module","../src/components/panels/legend/index.tsx","../src/components/panels/history/styles.module.css?css_module","../src/components/panels/history/index.tsx","../src/components/hotKeys.tsx","../src/hooks/useOnPressKey.ts","../src/components/contextMenus/NodePicker.module.css?css_module","../src/components/contextMenus/NodePicker.tsx","../src/components/panels/nodePicker/index.tsx","../src/components/panels/panel/index.module.css?css_module","../src/components/panels/panel/index.tsx","../src/components/panels/conversation/index.module.css?css_module","../src/components/panels/conversation/index.tsx","../src/components/panels/layers/styles.module.css?css_module","../src/components/panels/layers/index.tsx","../src/system/tabLoader.tsx","../src/store/logs.ts","../src/store/legend.tsx","../src/components/menubar/menuItem.module.css?css_module","../src/components/menubar/menuItem.tsx","../src/components/menubar/defaults.tsx","../src/components/menubar/index.tsx","../src/store/menubar.ts","../src/layout/dagre.tsx","../src/layout/elk.ts","../src/store/hotKeys.tsx","../src/system/pubsub.ts","../src/components/edges/offsetBezier.ts","../src/components/edges/index.tsx","../src/util/autoLayout.ts","../src/util/hasPositionMetaData.ts","../src/components/nodes/group/index.tsx","../src/components/nodes/comment/styles.module.css?css_module","../src/components/nodes/comment/FormatToolbar.tsx","../src/components/nodes/comment/comment.tsx","../src/components/nodes/behave/index.tsx","../src/store/flow.tsx","../src/components/controls/any/index.tsx","../src/components/controls/boolean/index.tsx","../src/components/controls/number/index.tsx","../src/components/controls/string/index.tsx","../src/components/controls/colorPicker/InputPopover.module.css?css_module","../src/components/controls/colorPicker/index.module.css?css_module","../src/components/controls/colorPicker/index.tsx","../src/store/controls.tsx","../src/store/variables.ts","../src/store/selection.ts","../src/system/graph.ts","../src/transformers/Uigraph.ts","../src/store/actions.tsx","../src/store/registry.ts","../src/store/specs.tsx","../src/store/traces.ts","../src/specifics/CustomEventOnTriggeredSpecific.tsx","../src/specifics/CustomEventTriggerSpecific.tsx","../src/specifics/VariableGetSpecific.tsx","../src/specifics/VariableSetSpecific.tsx","../src/store/specific.tsx","../src/store/socketGenerator.tsx","../src/store/events.tsx","../src/store/documentation.tsx","../src/store/toolbar.tsx","../src/store/layers.ts","../src/system/plugin.ts","../src/plugin/alignment/index.ts","../src/system/notifications.ts","../src/store/chat.ts","../src/system/system.ts","../src/util/serializeVariables.ts","../src/util/isBehaveNode.ts","../src/transformers/flowToBehave.ts","../src/hooks/useBehaveGraphFlow.ts","../src/util/calculateNewEdge.ts","../src/util/getPickerFilters.ts","../src/hooks/useFlowHandlers.ts","../src/hooks/useWasdPan.ts","../src/components/contextMenus/node.tsx","../src/components/contextMenus/edge.tsx","../src/components/contextMenus/selection.tsx","../src/generators/SwitchOnStringGenerator.tsx","../src/generators/SwitchOnIntegerGenerator.tsx","../src/generators/CustomEventOnTriggeredGenerator.tsx","../src/generators/SequenceGenerator.tsx","../src/generators/registerDefaultGenerators.ts","../src/components/FloatingToolbar/index.module.css?css_module","../src/components/FloatingToolbar/index.tsx","../src/components/Flow.tsx","../src/util/sleep.ts","../src/util/downloadJson.ts","../src/util/extractNodeMetadata.ts","../src/components/layoutController/index.module.css?css_module","../src/components/notifications/NotificationProvider.tsx","../src/components/layoutController/index.tsx","../src/plugin/docs/panel/styles.module.css?css_module","../src/plugin/docs/panel/index.tsx","../src/plugin/docs/index.tsx","../src/plugin/graphrunner/store.ts","../src/plugin/graphrunner/transport.ts","../src/plugin/graphrunner/client.ts","../src/plugin/graphrunner/styles.module.css?css_module","../src/plugin/graphrunner/panel.tsx","../src/plugin/graphrunner/buttons.tsx","../src/plugin/graphrunner/actions.ts","../src/plugin/graphrunner/runner.ts","../src/plugin/graphrunner/session.ts","../src/plugin/graphrunner/index.tsx","../src/plugin/graphrunner-local/execution-utils.ts","../src/plugin/graphrunner-local/transport.ts","../src/plugin/graphrunner-local/store.ts","../src/plugin/graphrunner-local/styles.module.css?css_module","../src/plugin/graphrunner-local/panel.tsx","../src/plugin/graphrunner-local/index.tsx"],"sourcesContent":["import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\n\nexport const getSocketsByNodeTypeAndHandleType = (\n nodes: NodeSpecJSON[],\n nodeType: string | undefined,\n handleType: 'source' | 'target' | null\n) => {\n const nodeSpec = nodes.find((node) => node.type === nodeType);\n if (nodeSpec === undefined) return;\n return handleType === 'source' ? nodeSpec.outputs : nodeSpec.inputs;\n};\n","import type { Edge } from 'reactflow';\n\nexport const isHandleConnected = (\n edges: Edge[],\n nodeId: string,\n handleId: string,\n type: 'source' | 'target'\n) => {\n return edges.some(\n (edge) => edge[type] === nodeId && edge[`${type}Handle`] === handleId\n );\n};\n","import type {\n InputSocketSpecJSON,\n OutputSocketSpecJSON\n} from '@kiberon-labs/behave-graph';\nimport type { SocketBase } from '../types.js';\n\ntype SpecSocket = InputSocketSpecJSON | OutputSocketSpecJSON;\n\nfunction toSocketBase(socket: SpecSocket): SocketBase {\n return { ...socket, key: socket.name };\n}\n\n/**\n * Merges spec sockets with dynamic port overrides.\n * Spec sockets use 'name' as identifier, dynamic ports use 'key'.\n * Dynamic ports can override spec sockets when their key matches the spec socket's name.\n */\nexport function mergeSockets(\n specSockets: SpecSocket[],\n dynamicPorts?: SocketBase[]\n): SocketBase[] {\n const socketsMap = new Map(specSockets.map((s) => [s.name, toSocketBase(s)]));\n\n if (dynamicPorts) {\n dynamicPorts.forEach((s) => socketsMap.set(s.key, s));\n }\n\n return Array.from(socketsMap.values());\n}\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { Connection, ReactFlowInstance } from 'reactflow';\nimport { getSocketsByNodeTypeAndHandleType } from './getSocketsByNodeTypeAndHandleType.js';\nimport { isHandleConnected } from './isHandleConnected.js';\nimport { mergeSockets } from './mergeSockets.js';\nimport type { IBehaveNode } from '@/types/nodes.js';\n\nexport const isValidConnection = (\n connection: Connection,\n instance: ReactFlowInstance,\n specJSON: NodeSpecJSON[]\n) => {\n if (connection.source === null || connection.target === null) return false;\n\n const sourceNode = instance.getNode(connection.source) as IBehaveNode;\n const targetNode = instance.getNode(connection.target) as IBehaveNode;\n const edges = instance.getEdges();\n\n if (sourceNode === undefined || targetNode === undefined) return false;\n\n // Get spec sockets\n const sourceSpecSockets = getSocketsByNodeTypeAndHandleType(\n specJSON,\n sourceNode.data?.type,\n 'source'\n );\n const targetSpecSockets = getSocketsByNodeTypeAndHandleType(\n specJSON,\n targetNode.data?.type,\n 'target'\n );\n\n if (sourceSpecSockets === undefined || targetSpecSockets === undefined)\n return false;\n\n // Merge spec sockets with dynamic ports\n const sourceSockets = mergeSockets(\n sourceSpecSockets,\n sourceNode.data.dynamicPorts?.outputs\n );\n const targetSockets = mergeSockets(\n targetSpecSockets,\n targetNode.data.dynamicPorts?.inputs\n );\n\n const sourceSocket = sourceSockets.find(\n (s) => s.name === connection.sourceHandle\n );\n const targetSocket = targetSockets.find(\n (s) => s.name === connection.targetHandle\n );\n\n if (sourceSocket === undefined || targetSocket === undefined) return false;\n\n // only flow sockets can have two inputs\n if (\n targetSocket.valueType !== 'flow' &&\n isHandleConnected(edges, targetNode.id, targetSocket.key, 'target')\n ) {\n return false;\n }\n\n return sourceSocket.valueType === targetSocket.valueType;\n};\n","import React, { createContext, useContext, type ReactNode } from 'react';\nimport type { System } from './system';\n\nexport const SystemContext = createContext<System | undefined>(undefined);\n\nexport type SystemProviderProps = {\n children: ReactNode;\n value: System;\n};\nexport function SystemProvider({ children, value }: SystemProviderProps) {\n return <SystemContext value={value}>{children}</SystemContext>;\n}\n\nexport function useSystem(): System {\n const context = useContext(SystemContext);\n\n if (context === undefined) {\n throw new Error('useSystem must be used within a SystemProvider');\n }\n\n return context;\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/sockets/input/styles.module_built.css\";\nconst classes = {\"disconnected\":\"VKTv4W_disconnected\",\"name\":\"VKTv4W_name\",\"row\":\"VKTv4W_row\",\"hidden\":\"VKTv4W_hidden\",\"socket\":\"VKTv4W_socket\"}\nexport default classes\n\nconst _disconnected0 = classes[\"disconnected\"]\nexport { _disconnected0 as \"disconnected\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _hidden0 = classes[\"hidden\"]\nexport { _hidden0 as \"hidden\" }\n\nconst _socket0 = classes[\"socket\"]\nexport { _socket0 as \"socket\" }\n","import type {\n InputSocketSpecJSON,\n NodeSpecJSON\n} from '@kiberon-labs/behave-graph';\n\nimport cx from 'classnames';\nimport React from 'react';\nimport { type Connection, Handle, Position, useReactFlow } from 'reactflow';\n\nimport { isValidConnection } from '../../../util/isValidConnection.js';\nimport { NavArrowRightSolid } from 'iconoir-react';\nimport { useSystem } from '@/system/provider.js';\nimport { useStore } from 'zustand';\n\nimport styles from './styles.module.css';\n\nexport type InputSocketProps = {\n hide: boolean;\n hideName?: boolean;\n connected: boolean;\n value: any | undefined;\n onChange: (key: string, value: any) => void;\n specJSON: NodeSpecJSON[];\n} & InputSocketSpecJSON;\n\nconst InputSocket: React.FC<InputSocketProps> = ({\n connected,\n specJSON,\n hideName,\n hide,\n ...rest\n}) => {\n const { name, valueType } = rest;\n const instance = useReactFlow();\n const sys = useSystem();\n const { valueTypeColors, icons, defaultIcon } = useStore(sys.legendStore);\n const Icon = icons[valueType] ?? defaultIcon;\n\n const isFlowSocket = valueType === 'flow';\n\n let colorName = valueTypeColors[valueType];\n if (colorName === undefined) {\n colorName = '#c2410c';\n }\n const showName =\n hideName !== true && (isFlowSocket === false || name !== 'flow');\n\n return (\n <div className={cx(styles.row, hide ? styles.hidden : undefined)}>\n {isFlowSocket && <NavArrowRightSolid />}\n {showName && <div className={styles.name}>{name}</div>}\n\n <Handle\n id={name}\n type=\"target\"\n title={valueType}\n position={Position.Left}\n style={{\n borderColor: colorName,\n background: colorName\n }}\n className={cx(\n styles.socket,\n connected ? undefined : styles.disconnected\n )}\n isValidConnection={(connection: Connection) =>\n isValidConnection(connection, instance, specJSON)\n }\n >\n <Icon />\n </Handle>\n </div>\n );\n};\n\nexport default InputSocket;\n","import { useCallback } from 'react';\nimport { useReactFlow } from 'reactflow';\n\nexport const useChangeNodeData = (id: string) => {\n const instance = useReactFlow();\n\n return useCallback(\n (key: string, value: any) => {\n instance.setNodes((nodes) =>\n nodes.map((n) => {\n if (n.id !== id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n [key]: value\n }\n };\n })\n );\n },\n [instance, id]\n );\n};\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\n\nexport const categoryColorMap: Record<NodeSpecJSON['category'], string> = {\n Event: 'red',\n Logic: 'green',\n Variable: 'purple',\n Query: 'purple',\n Action: 'blue',\n Flow: 'gray',\n Effect: 'lime',\n Time: 'gray',\n None: 'gray'\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/nodes/behave/NodeContainer.module_built.css\";\nconst classes = {\"selected\":\"o6IlGa_selected\",\"title\":\"o6IlGa_title\",\"green\":\"o6IlGa_green\",\"blue\":\"o6IlGa_blue\",\"gray\":\"o6IlGa_gray\",\"red\":\"o6IlGa_red\",\"white\":\"o6IlGa_white\",\"purple\":\"o6IlGa_purple\",\"lime\":\"o6IlGa_lime\",\"content\":\"o6IlGa_content\",\"container\":\"o6IlGa_container\",\"actions\":\"o6IlGa_actions\",\"header\":\"o6IlGa_header\"}\nexport default classes\n\nconst _selected0 = classes[\"selected\"]\nexport { _selected0 as \"selected\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _green0 = classes[\"green\"]\nexport { _green0 as \"green\" }\n\nconst _blue0 = classes[\"blue\"]\nexport { _blue0 as \"blue\" }\n\nconst _gray0 = classes[\"gray\"]\nexport { _gray0 as \"gray\" }\n\nconst _red0 = classes[\"red\"]\nexport { _red0 as \"red\" }\n\nconst _white0 = classes[\"white\"]\nexport { _white0 as \"white\" }\n\nconst _purple0 = classes[\"purple\"]\nexport { _purple0 as \"purple\" }\n\nconst _lime0 = classes[\"lime\"]\nexport { _lime0 as \"lime\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n","import { NodeCategory, type NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport cx from 'classnames';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { categoryColorMap } from '../../../util/colors.js';\n\nimport styles from './NodeContainer.module.css';\n\ntype NodeProps = {\n title: string;\n category?: NodeSpecJSON['category'];\n selected?: boolean;\n titleBarActions?: React.ReactElement;\n};\n\nconst NodeContainer: React.FC<PropsWithChildren<NodeProps>> = ({\n title,\n category = NodeCategory.None,\n selected,\n titleBarActions,\n children\n}) => {\n let colorName = categoryColorMap[category];\n if (colorName === undefined) {\n colorName = 'red';\n }\n\n const colorClass = styles[colorName];\n const hasActions = Boolean(titleBarActions);\n\n return (\n <div\n className={cx(styles.container, colorClass, selected && styles.selected)}\n >\n <div className={styles.header}>\n <div className={styles.title}>{title}</div>\n {hasActions && (\n <div className={cx(styles.actions, 'nodrag')}>{titleBarActions}</div>\n )}\n </div>\n <div className={styles.content}>{children}</div>\n </div>\n );\n};\n\nexport default NodeContainer;\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/sockets/output/styles.module_built.css\";\nconst classes = {\"hidden\":\"yuNsAq_hidden\",\"name\":\"yuNsAq_name\",\"socket\":\"yuNsAq_socket\",\"disconnected\":\"yuNsAq_disconnected\",\"row\":\"yuNsAq_row\"}\nexport default classes\n\nconst _hidden0 = classes[\"hidden\"]\nexport { _hidden0 as \"hidden\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _socket0 = classes[\"socket\"]\nexport { _socket0 as \"socket\" }\n\nconst _disconnected0 = classes[\"disconnected\"]\nexport { _disconnected0 as \"disconnected\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n","import type {\n NodeSpecJSON,\n OutputSocketSpecJSON\n} from '@kiberon-labs/behave-graph';\nimport cx from 'classnames';\nimport { type Connection, Handle, Position, useReactFlow } from 'reactflow';\nimport { isValidConnection } from '../../../util/isValidConnection.js';\nimport { NavArrowRightSolid } from 'iconoir-react';\nimport { useSystem } from '@/system/provider.js';\nimport { useStore } from 'zustand';\nimport styles from './styles.module.css';\n\nexport type OutputSocketProps = {\n connected: boolean;\n hide?: boolean;\n specJSON: NodeSpecJSON[];\n} & OutputSocketSpecJSON;\n\nexport default function OutputSocket({\n specJSON,\n connected,\n hide,\n valueType,\n name\n}: OutputSocketProps) {\n const instance = useReactFlow();\n const sys = useSystem();\n const { valueTypeColors, icons, defaultIcon } = useStore(sys.legendStore);\n const Icon = icons[valueType] ?? defaultIcon;\n\n const isFlowSocket = valueType === 'flow';\n let colorName = valueTypeColors[valueType];\n if (colorName === undefined) {\n colorName = 'red';\n }\n const [backgroundColor, borderColor] = [colorName, colorName];\n const showName = isFlowSocket === false || name !== 'flow';\n\n return (\n <div className={cx(styles.row, hide ? styles.hidden : undefined)}>\n {showName && <div className={styles.name}>{name}</div>}\n {isFlowSocket && <NavArrowRightSolid />}\n\n <Handle\n id={name}\n type=\"source\"\n position={Position.Right}\n style={{\n borderColor: borderColor,\n background: connected ? backgroundColor : undefined\n }}\n className={cx(styles.socket)}\n isValidConnection={(connection: Connection) =>\n isValidConnection(connection, instance, specJSON)\n }\n >\n <Icon />\n </Handle>\n </div>\n );\n}\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\n\nimport type { SocketBase, DynamicPorts } from '../types.js';\nimport { mergeSockets } from './mergeSockets.js';\n\nconst getPairs = <T, U>(arr1: T[], arr2: U[]) => {\n const max = Math.max(arr1.length, arr2.length);\n const pairs = [];\n for (let i = 0; i < max; i++) {\n const pair: [T | undefined, U | undefined] = [arr1[i], arr2[i]];\n pairs.push(pair);\n }\n return pairs;\n};\n\ntype Configuration = Record<string, any>;\n\nexport function configureSockets(\n config: Configuration,\n spec: NodeSpecJSON,\n ports?: DynamicPorts\n) {\n const configInputs = config?.socketInputs || [];\n\n const configOutputs = config?.socketOutputs || [];\n\n // Merge spec sockets with ports overrides (specifics can override subset of sockets)\n const baseInputs = mergeSockets(spec.inputs, ports?.inputs);\n const baseOutputs = mergeSockets(spec.outputs, ports?.outputs);\n\n const inputs: SocketBase[] = [...baseInputs, ...configInputs];\n const outputs: SocketBase[] = [...baseOutputs, ...configOutputs];\n\n const flowInputs = inputs.filter((input) => input.valueType === 'flow');\n const flowOutputs = outputs.filter((output) => output.valueType === 'flow');\n\n const valueInputs = inputs.filter((input) => input.valueType !== 'flow');\n const valueOutputs = outputs.filter((output) => output.valueType !== 'flow');\n\n const pairs = getPairs(flowInputs, [...flowOutputs, ...valueOutputs]);\n\n return { pairs, valueInputs, valueOutputs, flowInputs, flowOutputs };\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/nodes/wrapper/styles.module_built.css\";\nconst classes = {\"subtitle\":\"_1e74Uq_subtitle\",\"pulse-border\":\"_1e74Uq_pulse-border\",\"nodeContent\":\"_1e74Uq_nodeContent\",\"icons\":\"_1e74Uq_icons\",\"headerContent\":\"_1e74Uq_headerContent\",\"hidden\":\"_1e74Uq_hidden\",\"header\":\"_1e74Uq_header\",\"titleContainer\":\"_1e74Uq_titleContainer\",\"error\":\"_1e74Uq_error\",\"collapserContainer\":\"_1e74Uq_collapserContainer\",\"controls\":\"_1e74Uq_controls\",\"smallIcon\":\"_1e74Uq_smallIcon\",\"executing\":\"_1e74Uq_executing\",\"title\":\"_1e74Uq_title\",\"descriptionIcon\":\"_1e74Uq_descriptionIcon\",\"nodeWrapper\":\"_1e74Uq_nodeWrapper\",\"collapserContent\":\"_1e74Uq_collapserContent\",\"pinned\":\"_1e74Uq_pinned\"}\nexport default classes\n\nconst _subtitle0 = classes[\"subtitle\"]\nexport { _subtitle0 as \"subtitle\" }\n\nconst _pulse_border0 = classes[\"pulse-border\"]\nexport { _pulse_border0 as \"pulse-border\" }\n\nconst _nodeContent0 = classes[\"nodeContent\"]\nexport { _nodeContent0 as \"nodeContent\" }\n\nconst _icons0 = classes[\"icons\"]\nexport { _icons0 as \"icons\" }\n\nconst _headerContent0 = classes[\"headerContent\"]\nexport { _headerContent0 as \"headerContent\" }\n\nconst _hidden0 = classes[\"hidden\"]\nexport { _hidden0 as \"hidden\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _titleContainer0 = classes[\"titleContainer\"]\nexport { _titleContainer0 as \"titleContainer\" }\n\nconst _error0 = classes[\"error\"]\nexport { _error0 as \"error\" }\n\nconst _collapserContainer0 = classes[\"collapserContainer\"]\nexport { _collapserContainer0 as \"collapserContainer\" }\n\nconst _controls0 = classes[\"controls\"]\nexport { _controls0 as \"controls\" }\n\nconst _smallIcon0 = classes[\"smallIcon\"]\nexport { _smallIcon0 as \"smallIcon\" }\n\nconst _executing0 = classes[\"executing\"]\nexport { _executing0 as \"executing\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _descriptionIcon0 = classes[\"descriptionIcon\"]\nexport { _descriptionIcon0 as \"descriptionIcon\" }\n\nconst _nodeWrapper0 = classes[\"nodeWrapper\"]\nexport { _nodeWrapper0 as \"nodeWrapper\" }\n\nconst _collapserContent0 = classes[\"collapserContent\"]\nexport { _collapserContent0 as \"collapserContent\" }\n\nconst _pinned0 = classes[\"pinned\"]\nexport { _pinned0 as \"pinned\" }\n","//Used on ports to indicate meta from a ui\n\n/**\n * Indicates that the port can be completely deleted\n */\nexport const nonDeletable = 'ui.nonDeletable';\n/**\n * Indicates that the port can be reset to its default value / type\n */\nexport const resetable = 'ui.resetable';\n/**\n * Indicates that the port cannot be edited\n */\nexport const readonly = 'ui.readonly';\n/**\n * Indicates that the port is hidden from the user\n */\nexport const hidden = 'ui.hidden';\n\n//Used on nodes and graph\nexport const annotatedTitle = 'ui.title';\nexport const description = 'ui.description';\nexport const executing = 'ui.executing';\nexport const pinned = 'ui.pinned';\nexport const layerId = 'ui.layerId';\n\n//Used exclusively on graph\nexport const uiVersion = 'ui.version';\n\nexport const realtime = 'ui.realtime';\n//UI annotation to detect realtime output nodes, which are used to display outputs in the UI without affecting the actual graph outputs\nexport const AnnotatedOutput = 'ui.annotatedOutput';\n","import React, { useMemo } from 'react';\nimport styles from './styles.module.css';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport classNames from 'classnames';\nimport {\n annotatedTitle,\n description,\n executing,\n hidden,\n pinned\n} from '@/annotations';\nimport { MessageText, PinSolid } from 'iconoir-react';\n\ninterface NodeProps {\n icon?: React.ReactNode;\n subtitle?: string;\n error?: Error | null;\n isAsync?: boolean;\n children?: React.ReactNode;\n controls?: React.ReactNode;\n style?: React.CSSProperties;\n metadata?: Record<string, any>;\n}\n\nexport const BaseNodeWrapper = (props: NodeProps) => {\n const { icon, metadata, subtitle, error, children, controls, ...rest } =\n props;\n\n const title = metadata?.[annotatedTitle];\n const isExecuting = metadata?.[executing];\n const isHidden = metadata?.[hidden];\n const isPinned = metadata?.[pinned];\n const hasDescription = metadata?.[description];\n\n return (\n <ErrorBoundary fallback={<div>Error occurred</div>}>\n <div\n className={classNames(\n styles.nodeWrapper,\n error && styles.error,\n isExecuting && styles.executing,\n isHidden && styles.hidden,\n isPinned && styles.pinned\n )}\n >\n <div\n className={classNames(!isPinned && 'reactflow-draggable-handle')}\n {...rest}\n >\n <div className={styles.header}>\n <div className={styles.headerContent}>\n {icon}\n <div className={styles.titleContainer}>\n <span className={styles.title}>{title}</span>\n {subtitle && (\n <span className={styles.subtitle}>{subtitle}</span>\n )}\n </div>\n </div>\n <div className={styles.controls}>{controls}</div>\n <div className={styles.icons}>\n {hasDescription && <MessageText className={styles.smallIcon} />}\n {isPinned && <PinSolid className={styles.smallIcon} />}\n </div>\n </div>\n\n <div />\n {children}\n </div>\n </div>\n </ErrorBoundary>\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/nodes/behave/Node.module_built.css\";\nconst classes = {\"pairRow\":\"oZj_Cq_pairRow\",\"valueInputRow\":\"oZj_Cq_valueInputRow\"}\nexport default classes\n\nconst _pairRow0 = classes[\"pairRow\"]\nexport { _pairRow0 as \"pairRow\" }\n\nconst _valueInputRow0 = classes[\"valueInputRow\"]\nexport { _valueInputRow0 as \"valueInputRow\" }\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport { useMemo, useState } from 'react';\nimport { useEdges, type NodeProps } from 'reactflow';\nimport { useStore } from 'zustand';\nimport { useChangeNodeData } from '../../../hooks/useChangeNodeData.js';\nimport { isHandleConnected } from '../../../util/isHandleConnected.js';\nimport InputSocket from '../../sockets/input/index.js';\nimport NodeContainer from './NodeContainer.js';\nimport OutputSocket from '../../sockets/output/index.js';\nimport { configureSockets } from '@/util/sockets.js';\nimport { BaseNodeWrapper } from '../wrapper/index.js';\nimport { useSystem } from '@/system/provider.js';\nimport type { SpecificNode } from '@/store/specific';\nimport type { SocketGeneratorNode } from '@/store/socketGenerator';\nimport styles from './Node.module.css';\nimport type { IBehaveNode } from '@/types/nodes.js';\n\nexport type BehaveNodeProps = NodeProps<IBehaveNode['data']> & {\n spec: NodeSpecJSON;\n allSpecs: NodeSpecJSON[];\n};\n\nexport const Node = ({\n id,\n data,\n spec,\n selected,\n allSpecs\n}: BehaveNodeProps) => {\n const system = useSystem();\n const edges = useEdges();\n const handleChange = useChangeNodeData(id);\n const [socketsVisible, _setSocketsVisible] = useState(true);\n const specifics = useStore(system.specificStore, (s) => s.specifics);\n const titleBarActions = useStore(\n system.specificStore,\n (s) => s.titleBarActions\n );\n const generators = useStore(system.socketGeneratorStore, (s) => s.generators);\n const generatorLocation = useStore(\n system.systemSettings,\n (s) => s.generatorLocation\n );\n\n // Early return if spec is not available yet\n if (!spec) {\n return null;\n }\n\n const { pairs, valueInputs } = useMemo(\n () => configureSockets(data.configuration, spec, data.dynamicPorts),\n [data.configuration, spec, data.dynamicPorts]\n );\n\n const matchingSpecifics = useMemo(() => {\n if (!spec) return [];\n return specifics.filter((x) => x.check(spec));\n }, [spec, specifics]);\n\n const matchingGenerators = useMemo(() => {\n if (!spec || generatorLocation !== 'inline') return [];\n return generators.filter((x) => x.check(spec));\n }, [spec, generators, generatorLocation]);\n\n const specificNode: SpecificNode = useMemo(\n () => ({\n id,\n data,\n spec,\n selected: !!selected\n }),\n [data, id, selected, spec]\n );\n\n const generatorNode: SocketGeneratorNode = useMemo(\n () => ({\n id,\n data,\n spec,\n selected: !!selected\n }),\n [data, id, selected, spec]\n );\n\n const hiddenInputs = useMemo(() => {\n return data.annotations?.hiddenInputs ?? {};\n }, [data.annotations]);\n\n const hiddenOutputs = useMemo(() => {\n return data.annotations?.hiddenOutputs ?? {};\n }, [data.annotations]);\n\n const shouldShowInput = (inputName: string) => {\n const isConnected = isHandleConnected(edges, id, inputName, 'target');\n const isHidden = hiddenInputs[inputName] ?? false;\n return !isHidden || isConnected;\n };\n\n const shouldShowOutput = (outputName: string) => {\n const isConnected = isHandleConnected(edges, id, outputName, 'source');\n const isHidden = hiddenOutputs[outputName] ?? false;\n return !isHidden || isConnected;\n };\n\n return (\n <BaseNodeWrapper metadata={data.annotations}>\n <NodeContainer\n title={spec.label}\n category={spec.category}\n selected={selected}\n titleBarActions={titleBarActions[spec.type]}\n >\n {pairs.map(([input, output], ix) => {\n const showInput = !input || shouldShowInput(input.name);\n const showOutput = !output || shouldShowOutput(output.name);\n if (!showInput && !showOutput) return null;\n return (\n <div key={ix} className={styles.pairRow}>\n {input && (\n <InputSocket\n {...input}\n hide={!showInput}\n specJSON={allSpecs}\n value={input.defaultValue}\n onChange={handleChange}\n connected={isHandleConnected(edges, id, input.name, 'target')}\n />\n )}\n {output && (\n <OutputSocket\n {...output}\n hide={!showOutput}\n specJSON={allSpecs}\n connected={isHandleConnected(\n edges,\n id,\n output.name,\n 'source'\n )}\n />\n )}\n </div>\n );\n })}\n {valueInputs.map((input, ix) => {\n if (!shouldShowInput(input.name)) return null;\n\n return (\n <div key={`valueInput-${ix}`} className={styles.valueInputRow}>\n <InputSocket\n {...input}\n specJSON={allSpecs}\n hide={!socketsVisible}\n value={input.defaultValue}\n onChange={handleChange}\n connected={isHandleConnected(edges, id, input.name, 'target')}\n />\n </div>\n );\n })}\n\n {matchingGenerators.map((generator) => {\n const GeneratorRenderer = generator.render;\n return (\n <GeneratorRenderer key={generator.name} node={generatorNode} />\n );\n })}\n\n {matchingSpecifics.map((specific) => {\n const SpecificRenderer = specific.render;\n return <SpecificRenderer key={specific.name} node={specificNode} />;\n })}\n </NodeContainer>\n </BaseNodeWrapper>\n );\n};\n","import type { IBehaveNode } from '@/types/nodes';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport type { Edge, Node } from 'reactflow';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport const behaveToFlow = (graph: GraphJSON): [Node[], Edge[]] => {\n const nodes: Node[] = [];\n const edges: Edge[] = [];\n\n graph.nodes?.forEach((nodeJSON) => {\n const node: IBehaveNode = {\n id: nodeJSON.id,\n type: 'behaveNode',\n position: {\n x: nodeJSON.metadata?.positionX\n ? Number(nodeJSON.metadata?.positionX)\n : 0,\n y: nodeJSON.metadata?.positionY\n ? Number(nodeJSON.metadata?.positionY)\n : 0\n },\n data: {\n annotations: {},\n configuration: {},\n type: nodeJSON.type,\n ports: {},\n dynamicPorts: {}\n }\n };\n\n nodes.push(node);\n\n if (nodeJSON.configuration && typeof nodeJSON.configuration === 'object') {\n node.data.configuration = { ...nodeJSON.configuration };\n }\n\n if (nodeJSON.parameters) {\n for (const [inputKey, input] of Object.entries(nodeJSON.parameters)) {\n if ('link' in input && input.link !== undefined) {\n edges.push({\n id: uuidv4(),\n source: input.link.nodeId,\n sourceHandle: input.link.socket,\n target: nodeJSON.id,\n targetHandle: inputKey\n });\n }\n if ('value' in input) {\n node.data.ports ??= {};\n node.data.ports[inputKey] = input.value;\n }\n }\n }\n\n if (nodeJSON.flows) {\n for (const [inputKey, link] of Object.entries(nodeJSON.flows)) {\n edges.push({\n id: uuidv4(),\n source: nodeJSON.id,\n sourceHandle: inputKey,\n target: link.nodeId,\n targetHandle: link.socket\n });\n }\n }\n });\n\n return [nodes, edges];\n};\n","import { create } from 'zustand';\n\nexport interface Command {\n name: string;\n execute(): void;\n undo(): void;\n /**\n * Optional redo method if different from execute\n */\n redo?(): void;\n}\n\nexport type UndoStackEntry = {\n name: string;\n};\n\nexport type UndoStore = {\n canUndo: boolean;\n canRedo: boolean;\n history: UndoStackEntry[];\n redoStack: UndoStackEntry[];\n setSnapshot: (snapshot: {\n canUndo: boolean;\n canRedo: boolean;\n history: UndoStackEntry[];\n redoStack: UndoStackEntry[];\n }) => void;\n};\n\nexport const undoStoreFactory = () =>\n create<UndoStore>((set) => ({\n canUndo: false,\n canRedo: false,\n history: [],\n redoStack: [],\n setSnapshot: (snapshot) => set(() => snapshot)\n }));\n\nexport class UndoManager {\n private history: Command[] = [];\n private stack: Command[] = [];\n private limit = 100; // optional limit\n public store = undoStoreFactory();\n\n constructor() {\n this.syncStore();\n }\n\n private syncStore() {\n this.store.getState().setSnapshot({\n canUndo: this.canUndo(),\n canRedo: this.canRedo(),\n history: this.history.map((c) => ({ name: c.name })),\n redoStack: this.stack.map((c) => ({ name: c.name }))\n });\n }\n\n execute(command: Command) {\n command.execute();\n this.history.push(command);\n this.stack = []; // clear redo stack\n\n if (this.history.length > this.limit) {\n this.history.shift();\n }\n\n this.syncStore();\n }\n\n undo() {\n const command = this.history.pop();\n if (command) {\n command.undo();\n this.stack.push(command);\n this.syncStore();\n }\n }\n\n redo() {\n const command = this.stack.pop();\n if (command) {\n if (command.redo) {\n command.redo();\n } else {\n command.execute();\n }\n this.history.push(command);\n this.syncStore();\n }\n }\n\n canUndo() {\n return this.history.length > 0;\n }\n canRedo() {\n return this.stack.length > 0;\n }\n clear() {\n this.history = [];\n this.stack = [];\n this.syncStore();\n }\n}\n","import type { BoxBase, LayoutBase, PanelBase, TabBase } from 'rc-dock';\nimport { create } from 'zustand';\n\nfunction isPanelBase(value: BoxBase | PanelBase): value is PanelBase {\n return Array.isArray((value as PanelBase).tabs);\n}\n\nfunction hasChildren(value: BoxBase | PanelBase): value is BoxBase {\n return Array.isArray((value as BoxBase).children);\n}\n\nfunction upsertTabInPanel(panel: PanelBase, tabId: string): PanelBase {\n const tabs = panel.tabs ?? [];\n const exists = tabs.some((t) => t.id === tabId);\n const nextTabs: TabBase[] = exists ? tabs : [...tabs, { id: tabId }];\n return {\n ...panel,\n tabs: nextTabs,\n activeId: tabId\n };\n}\n\nfunction recurseFocusTab(\n base: BoxBase | PanelBase,\n tabId: string\n): { updated: BoxBase | PanelBase; found: boolean } {\n if (isPanelBase(base)) {\n const hasTab = base.tabs?.some((t) => t.id === tabId);\n if (!hasTab) {\n return { updated: base, found: false };\n }\n return {\n updated: {\n ...base,\n activeId: tabId\n },\n found: true\n };\n }\n\n if (hasChildren(base)) {\n let found = false;\n const updatedChildren = base.children.map((child) => {\n if (found) return child;\n const res = recurseFocusTab(child, tabId);\n found = res.found;\n return res.updated;\n });\n return { updated: { ...base, children: updatedChildren }, found };\n }\n\n return { updated: base, found: false };\n}\n\nfunction recurseUpsertTabInPanelId(\n base: BoxBase | PanelBase,\n panelId: string,\n tabId: string\n): { updated: BoxBase | PanelBase; done: boolean } {\n if (isPanelBase(base)) {\n if (base.id !== panelId) {\n return { updated: base, done: false };\n }\n return { updated: upsertTabInPanel(base, tabId), done: true };\n }\n\n if (hasChildren(base)) {\n let done = false;\n const updatedChildren = base.children.map((child) => {\n if (done) return child;\n const res = recurseUpsertTabInPanelId(child, panelId, tabId);\n done = res.done;\n return res.updated;\n });\n return { updated: { ...base, children: updatedChildren }, done };\n }\n\n return { updated: base, done: false };\n}\n\nfunction recurseUpsertTabInFirstPanel(\n base: BoxBase | PanelBase,\n tabId: string\n): { updated: BoxBase | PanelBase; done: boolean } {\n if (isPanelBase(base)) {\n return { updated: upsertTabInPanel(base, tabId), done: true };\n }\n\n if (hasChildren(base)) {\n let done = false;\n const updatedChildren = base.children.map((child) => {\n if (done) return child;\n const res = recurseUpsertTabInFirstPanel(child, tabId);\n done = res.done;\n return res.updated;\n });\n return { updated: { ...base, children: updatedChildren }, done };\n }\n\n return { updated: base, done: false };\n}\n\nconst defaultLayout: LayoutBase = {\n dockbox: {\n mode: 'vertical',\n children: [\n {\n mode: 'horizontal',\n children: [\n {\n size: 2,\n mode: 'vertical',\n children: [\n {\n mode: 'horizontal',\n children: [\n {\n size: 3,\n mode: 'vertical',\n children: [\n {\n tabs: [\n {\n id: 'variables'\n },\n {\n id: 'layers'\n },\n {\n id: 'events'\n },\n {\n id: 'traces'\n }\n ]\n }\n ]\n },\n {\n size: 17,\n mode: 'vertical',\n children: [\n {\n id: 'graphs',\n size: 700,\n group: 'graph',\n tabs: [\n {\n id: 'graph'\n }\n ]\n }\n ]\n },\n {\n size: 4,\n mode: 'vertical',\n children: [\n {\n size: 12,\n tabs: [\n {\n id: 'nodeInputs'\n },\n {\n id: 'system:settings'\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n ]\n }\n};\n\nexport type TabStore = {\n currentPanel?: string;\n layout: LayoutBase;\n setLayout: (layout: LayoutBase) => void;\n setCurrentPanel: (currentPanel: string) => void;\n openTab: (tabId: string, options?: { panelId?: string }) => void;\n};\n\nexport const tabStoreFactory = () =>\n create<TabStore>((set) => ({\n currentPanel: 'string',\n layout: defaultLayout,\n setLayout: (layout: LayoutBase) => set(() => ({ layout })),\n setCurrentPanel: (currentPanel: string) => set(() => ({ currentPanel })),\n openTab: (tabId: string, options?: { panelId?: string }) =>\n set((state) => {\n // 1) If the tab already exists anywhere, just focus it.\n let found = false;\n let updatedLayout: LayoutBase = state.layout;\n\n const focusIn = (box?: BoxBase) => {\n if (!box || found) return box;\n const res = recurseFocusTab(box, tabId);\n found = res.found;\n return res.updated as BoxBase;\n };\n\n updatedLayout = {\n ...updatedLayout,\n dockbox: focusIn(updatedLayout.dockbox) ?? updatedLayout.dockbox,\n floatbox: updatedLayout.floatbox\n ? (focusIn(updatedLayout.floatbox) as BoxBase)\n : updatedLayout.floatbox,\n maxbox: updatedLayout.maxbox\n ? (focusIn(updatedLayout.maxbox) as BoxBase)\n : updatedLayout.maxbox,\n windowbox: updatedLayout.windowbox\n ? (focusIn(updatedLayout.windowbox) as BoxBase)\n : updatedLayout.windowbox\n };\n\n if (found) {\n return { layout: updatedLayout };\n }\n\n // 2) Otherwise, insert it into a target panel (prefer explicit panelId).\n const targetPanelId =\n options?.panelId ?? (tabId === 'graph' ? 'graphs' : undefined);\n\n if (targetPanelId) {\n const res = recurseUpsertTabInPanelId(\n updatedLayout.dockbox,\n targetPanelId,\n tabId\n );\n if (res.done) {\n return {\n layout: { ...updatedLayout, dockbox: res.updated as BoxBase }\n };\n }\n }\n\n // 3) Fallback: add to the first docked panel with tabs.\n const fallback = recurseUpsertTabInFirstPanel(\n updatedLayout.dockbox,\n tabId\n );\n if (fallback.done) {\n return {\n layout: { ...updatedLayout, dockbox: fallback.updated as BoxBase }\n };\n }\n\n // 4) Last resort: create a floating panel.\n const floatPanel: PanelBase = {\n x: 120,\n y: 120,\n w: 420,\n h: 320,\n tabs: [{ id: tabId }],\n activeId: tabId,\n group: 'popout'\n };\n\n const floatbox: BoxBase = updatedLayout.floatbox\n ? {\n ...updatedLayout.floatbox,\n children: [...(updatedLayout.floatbox.children ?? []), floatPanel]\n }\n : {\n mode: 'float',\n children: [floatPanel]\n };\n\n return { layout: { ...updatedLayout, floatbox } };\n })\n }));\n","import { create } from 'zustand';\n\nexport const EDGE_TYPE = {\n bezier: 'Bezier',\n smoothStep: 'Smooth step',\n straight: 'Straight',\n simpleBezier: 'Simple Bezier'\n} as const;\n\nexport type EdgeType = (typeof EDGE_TYPE)[keyof typeof EDGE_TYPE];\n\nexport const LAYOUT_TYPE = {\n dagre: 'Dagre',\n elkForce: 'Elk - Force',\n elkRect: 'Elk - Rect',\n elkLayered: 'Elk - Layered'\n} as const;\n\nexport type LayoutType = (typeof LAYOUT_TYPE)[keyof typeof LAYOUT_TYPE];\n\nexport type GeneratorLocation = 'inline' | 'panel';\n\nexport type SystemSettingsStore = {\n debugMode: boolean;\n showTimings: boolean;\n showMinimap: boolean;\n showGrid: boolean;\n showSearch: boolean;\n showMenu: boolean;\n edgeType: EdgeType;\n layoutType: LayoutType;\n delayedUpdate: boolean;\n inlineTypes: boolean;\n inlineValues: boolean;\n connectOnClick: boolean;\n snapGrid: boolean;\n gridSize: number;\n generatorLocation: GeneratorLocation;\n setDebugMode: (debugMode: boolean) => void;\n setShowTimings: (showTimings: boolean) => void;\n setShowMinimap: (showMinimap: boolean) => void;\n setShowGrid: (showGrid: boolean) => void;\n setShowSearch: (showSearch: boolean) => void;\n setEdgeType: (edgeType: EdgeType) => void;\n setLayoutType: (layoutType: LayoutType) => void;\n setDelayedUpdate: (delayedUpdate: boolean) => void;\n setInlineTypes: (inlineTypes: boolean) => void;\n setInlineValues: (inlineValues: boolean) => void;\n setConnectOnClick: (connectOnClick: boolean) => void;\n setSnapGrid: (snapGrid: boolean) => void;\n setGridSize: (gridSize: number) => void;\n setGeneratorLocation: (generatorLocation: GeneratorLocation) => void;\n};\n\nexport const systemSettingsFactory = () =>\n create<SystemSettingsStore>((set) => ({\n edgeType: EDGE_TYPE.bezier,\n layoutType: LAYOUT_TYPE.dagre,\n debugMode: false,\n showMenu: true,\n showTimings: false,\n showMinimap: false,\n showGrid: true,\n showSearch: false,\n /**\n * Whether to delay the update of a node when a value is changed\n */\n delayedUpdate: false,\n /**\n * Whether to show the types inline with the nodes\n */\n inlineTypes: false,\n /**\n * Whether to show the values inline with the nodes\n */\n inlineValues: false,\n connectOnClick: true,\n snapGrid: false,\n gridSize: 15,\n generatorLocation: 'panel',\n setShowMenu: (showMenu: boolean) => set(() => ({ showMenu })),\n setEdgeType: (edgeType: EdgeType) => set(() => ({ edgeType })),\n setLayoutType: (layoutType: LayoutType) => set(() => ({ layoutType })),\n setDebugMode: (debugMode: boolean) => set(() => ({ debugMode })),\n setShowTimings: (showTimings: boolean) => set(() => ({ showTimings })),\n setShowMinimap: (showMinimap: boolean) => set(() => ({ showMinimap })),\n setShowGrid: (showGrid: boolean) => set(() => ({ showGrid })),\n setShowSearch: (showSearch: boolean) => set(() => ({ showSearch })),\n setDelayedUpdate: (delayedUpdate: boolean) =>\n set(() => ({ delayedUpdate })),\n setInlineTypes: (inlineTypes: boolean) => set(() => ({ inlineTypes })),\n setInlineValues: (inlineValues: boolean) => set(() => ({ inlineValues })),\n setConnectOnClick: (connectOnClick: boolean) =>\n set(() => ({ connectOnClick })),\n setSnapGrid: (snapGrid: boolean) => set(() => ({ snapGrid })),\n setGridSize: (gridSize: number) => set(() => ({ gridSize })),\n setGeneratorLocation: (generatorLocation: GeneratorLocation) =>\n set(() => ({ generatorLocation }))\n }));\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/systemSettings/styles.module_built.css\";\nconst classes = {\"title\":\"pTBRlW_title\",\"description\":\"pTBRlW_description\"}\nexport default classes\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _description0 = classes[\"description\"]\nexport { _description0 as \"description\" }\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/base/styles.module_built.css\";\nconst classes = {\"root\":\"G4S1uq_root\"}\nexport default classes\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n","import styles from './styles.module.css';\n\nexport const BasePanel = ({ children }: { children: React.ReactNode }) => {\n return <div className={styles.root}>{children}</div>;\n};\n","import { useSystem } from '@/system/provider';\nimport {\n EDGE_TYPE,\n LAYOUT_TYPE,\n type EdgeType,\n type LayoutType\n} from '@/store/settings';\n\nimport {\n VscodeCheckbox,\n VscodeDivider,\n VscodeLabel,\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\nimport { useStore } from 'zustand';\nimport styles from './styles.module.css';\nimport { BasePanel } from '../base';\n\nconst EdgeValues = Object.values(EDGE_TYPE);\nconst LayoutValues = Object.values(LAYOUT_TYPE);\n\nconst SectionTitle = ({ children }: { children: React.ReactNode }) => {\n return <div className={styles.title}>{children}</div>;\n};\n\nconst Description = ({ children }: { children: React.ReactNode }) => {\n return (\n <div\n style={{\n fontSize: '0.85em',\n color: 'var(--vscode-descriptionForeground)',\n opacity: 0.9\n }}\n >\n {children}\n </div>\n );\n};\n\nconst SelectSetting = ({\n label,\n description,\n value,\n onChange,\n children\n}: {\n label: string;\n description: React.ReactNode;\n value: string;\n onChange: (value: string) => void;\n children: React.ReactNode;\n}) => {\n return (\n <div className=\"flex flex-col gap-1 justify-start\">\n <VscodeLabel>{label}</VscodeLabel>\n <Description>{description}</Description>\n <VscodeSingleSelect\n value={value}\n onChange={(e: any) => {\n const next = e?.target?.value as string | undefined;\n if (next) onChange(next);\n }}\n >\n {children}\n </VscodeSingleSelect>\n </div>\n );\n};\n\nconst ToggleSetting = ({\n label,\n description,\n checked,\n onChange\n}: {\n label: string;\n description: React.ReactNode;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) => {\n return (\n <div className=\"flex gap-2 justify-start\">\n <VscodeCheckbox\n toggle\n checked={checked}\n onChange={(event: any) => onChange(Boolean(event?.target?.checked))}\n />\n <div className=\"flex flex-col justify-start gap-0.5\">\n <VscodeLabel>{label}</VscodeLabel>\n <Description>{description}</Description>\n </div>\n </div>\n );\n};\n\nexport const Settings = () => {\n const system = useSystem();\n\n const settings = useStore(system.systemSettings);\n\n return (\n <BasePanel>\n <div className=\"flex flex-col gap-3\">\n <SectionTitle>Layout</SectionTitle>\n <SelectSetting\n label=\"Edge Type\"\n description=\"Select the type of edge to use in the graph editor.\"\n value={settings.edgeType}\n onChange={(value) => settings.setEdgeType(value as EdgeType)}\n >\n <VscodeOption value=\"\">Select an edge type...</VscodeOption>\n {EdgeValues.map((type) => (\n <VscodeOption key={type} value={type}>\n {type}\n </VscodeOption>\n ))}\n </SelectSetting>\n\n <SelectSetting\n label=\"Layout Type\"\n description=\"Select the type of layout engine to use in the graph editor.\"\n value={settings.layoutType}\n onChange={(value) => settings.setLayoutType(value as LayoutType)}\n >\n <VscodeOption value=\"\">Select a layout type...</VscodeOption>\n {LayoutValues.map((type) => (\n <VscodeOption key={type} value={type}>\n {type}\n </VscodeOption>\n ))}\n </SelectSetting>\n\n <VscodeDivider />\n\n <SectionTitle>Accessibility</SectionTitle>\n <ToggleSetting\n label=\"Show inline types\"\n description={\n 'Adds additional spans to help differentiate types for colorblind users.'\n }\n checked={settings.inlineTypes}\n onChange={(value) => settings.setInlineTypes(value)}\n />\n\n <VscodeDivider />\n\n <SectionTitle>Interaction</SectionTitle>\n <ToggleSetting\n label=\"Use delayed interaction\"\n description={'Forces a user to click save to update port.'}\n checked={settings.delayedUpdate}\n onChange={(value) => settings.setDelayedUpdate(value)}\n />\n <ToggleSetting\n label=\"Click to connect\"\n description={\n 'Allows you to quick connect nodes by clicking on the 2 port.'\n }\n checked={settings.connectOnClick}\n onChange={(value) => settings.setConnectOnClick(value)}\n />\n\n <VscodeDivider />\n\n <SectionTitle>Display</SectionTitle>\n <ToggleSetting\n label=\"Show inline values\"\n description={\n 'Shows values directly on the node. Useful for debugging but can be cluttered.'\n }\n checked={settings.inlineValues}\n onChange={(value) => settings.setInlineValues(value)}\n />\n <ToggleSetting\n label=\"Show Minimap\"\n description={'Shows the minimap in the graph editing area.'}\n checked={settings.showMinimap}\n onChange={(value) => settings.setShowMinimap(value)}\n />\n <ToggleSetting\n label=\"Show Grid\"\n description={'Shows the grid in the graph editing area.'}\n checked={settings.showGrid}\n onChange={(value) => settings.setShowGrid(value)}\n />\n <ToggleSetting\n label=\"Snap to Grid\"\n description={'Snaps nodes to the grid while dragging.'}\n checked={settings.snapGrid}\n onChange={(value) => settings.setSnapGrid(value)}\n />\n\n <VscodeDivider />\n\n <SectionTitle>Performance</SectionTitle>\n <ToggleSetting\n label=\"Show execution time\"\n description={'Shows how long it takes for a node to process.'}\n checked={settings.showTimings}\n onChange={(value) => settings.setShowTimings(value)}\n />\n </div>\n </BasePanel>\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/logs/index.module_built.css\";\nconst classes = {\"logCount\":\"g0WdIG_logCount\",\"actionActive\":\"g0WdIG_actionActive\",\"logsContainer\":\"g0WdIG_logsContainer\",\"searchField\":\"g0WdIG_searchField\",\"searchBar\":\"g0WdIG_searchBar\",\"filters\":\"g0WdIG_filters\",\"levelChipLabel\":\"g0WdIG_levelChipLabel\",\"levelChipCount\":\"g0WdIG_levelChipCount\",\"rowMessage\":\"g0WdIG_rowMessage\",\"searchIcon\":\"g0WdIG_searchIcon\",\"highlight\":\"g0WdIG_highlight\",\"levelChip\":\"g0WdIG_levelChip\",\"rowIcon\":\"g0WdIG_rowIcon\",\"toolbarActions\":\"g0WdIG_toolbarActions\",\"logsList\":\"g0WdIG_logsList\",\"rowTime\":\"g0WdIG_rowTime\",\"levelOff\":\"g0WdIG_levelOff\",\"emptyState\":\"g0WdIG_emptyState\",\"row\":\"g0WdIG_row\",\"toolbar\":\"g0WdIG_toolbar\",\"levelChipIcon\":\"g0WdIG_levelChipIcon\",\"searchInput\":\"g0WdIG_searchInput\"}\nexport default classes\n\nconst _logCount0 = classes[\"logCount\"]\nexport { _logCount0 as \"logCount\" }\n\nconst _actionActive0 = classes[\"actionActive\"]\nexport { _actionActive0 as \"actionActive\" }\n\nconst _logsContainer0 = classes[\"logsContainer\"]\nexport { _logsContainer0 as \"logsContainer\" }\n\nconst _searchField0 = classes[\"searchField\"]\nexport { _searchField0 as \"searchField\" }\n\nconst _searchBar0 = classes[\"searchBar\"]\nexport { _searchBar0 as \"searchBar\" }\n\nconst _filters0 = classes[\"filters\"]\nexport { _filters0 as \"filters\" }\n\nconst _levelChipLabel0 = classes[\"levelChipLabel\"]\nexport { _levelChipLabel0 as \"levelChipLabel\" }\n\nconst _levelChipCount0 = classes[\"levelChipCount\"]\nexport { _levelChipCount0 as \"levelChipCount\" }\n\nconst _rowMessage0 = classes[\"rowMessage\"]\nexport { _rowMessage0 as \"rowMessage\" }\n\nconst _searchIcon0 = classes[\"searchIcon\"]\nexport { _searchIcon0 as \"searchIcon\" }\n\nconst _highlight0 = classes[\"highlight\"]\nexport { _highlight0 as \"highlight\" }\n\nconst _levelChip0 = classes[\"levelChip\"]\nexport { _levelChip0 as \"levelChip\" }\n\nconst _rowIcon0 = classes[\"rowIcon\"]\nexport { _rowIcon0 as \"rowIcon\" }\n\nconst _toolbarActions0 = classes[\"toolbarActions\"]\nexport { _toolbarActions0 as \"toolbarActions\" }\n\nconst _logsList0 = classes[\"logsList\"]\nexport { _logsList0 as \"logsList\" }\n\nconst _rowTime0 = classes[\"rowTime\"]\nexport { _rowTime0 as \"rowTime\" }\n\nconst _levelOff0 = classes[\"levelOff\"]\nexport { _levelOff0 as \"levelOff\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n\nconst _levelChipIcon0 = classes[\"levelChipIcon\"]\nexport { _levelChipIcon0 as \"levelChipIcon\" }\n\nconst _searchInput0 = classes[\"searchInput\"]\nexport { _searchInput0 as \"searchInput\" }\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/primitives/icon.module_built.css\";\nconst classes = {\"icon\":\"JtM8cG_icon\",\"small\":\"JtM8cG_small\",\"disabled\":\"JtM8cG_disabled\",\"medium\":\"JtM8cG_medium\",\"large\":\"JtM8cG_large\"}\nexport default classes\n\nconst _icon0 = classes[\"icon\"]\nexport { _icon0 as \"icon\" }\n\nconst _small0 = classes[\"small\"]\nexport { _small0 as \"small\" }\n\nconst _disabled0 = classes[\"disabled\"]\nexport { _disabled0 as \"disabled\" }\n\nconst _medium0 = classes[\"medium\"]\nexport { _medium0 as \"medium\" }\n\nconst _large0 = classes[\"large\"]\nexport { _large0 as \"large\" }\n","import React from 'react';\nimport styles from './icon.module.css';\nimport classNames from 'classnames';\n\ninterface IconProps extends React.HTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;\n title?: string;\n disabled?: boolean;\n className?: string;\n size?: 'small' | 'medium' | 'large';\n}\n\nexport const Icon: React.FC<IconProps> = ({\n children,\n onClick,\n title,\n disabled = false,\n className,\n size = 'small'\n}) => {\n return (\n <button\n className={classNames(\n styles.icon,\n styles[size],\n disabled && styles.disabled,\n className\n )}\n onClick={onClick}\n disabled={disabled}\n title={title}\n type=\"button\"\n >\n {children}\n </button>\n );\n};\n","import React, { useCallback, useEffect, useRef, useMemo } from 'react';\nimport {\n Search,\n Xmark,\n Download,\n TrashSolid,\n WarningCircle,\n InfoCircle,\n InfoCircleSolid,\n WarningCircleSolid,\n ArrowDownCircle,\n ArrowDownCircleSolid,\n Clock,\n ClockSolid\n} from 'iconoir-react';\nimport { VscodeTextfield } from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\nimport clsx from 'clsx';\nimport { BasePanel } from '../base';\nimport type { LogSeverity } from '@kiberon-labs/behave-graph';\nimport styles from './index.module.css';\nimport { Icon } from '@/components/primitives/icon';\n\nconst LEVELS: readonly LogSeverity[] = ['verbose', 'info', 'warning', 'error'];\n\nconst LOG_COLORS: Record<LogSeverity, string> = {\n verbose: 'var(--vscode-terminal-ansiCyan, #29b8db)',\n info: 'var(--vscode-charts-blue, #3794ff)',\n warning: 'var(--vscode-editorWarning-foreground, #cca700)',\n error: 'var(--vscode-editorError-foreground, #f48771)'\n};\n\nconst IconType: Record<LogSeverity, React.ReactNode> = {\n verbose: <InfoCircleSolid />,\n info: <InfoCircle />,\n warning: <WarningCircle />,\n error: <WarningCircleSolid />\n};\n\nconst pad = (value: number, length = 2) => String(value).padStart(length, '0');\n\n/** VS Code style log timestamp: 24h clock with milliseconds. */\nconst formatTimestamp = (date: Date) =>\n `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(\n date.getSeconds()\n )}.${pad(date.getMilliseconds(), 3)}`;\n\nconst escapeRegExp = (value: string) =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/** Splits a message into plain/highlighted segments for the active search term. */\nconst renderMessage = (message: string, term: string): React.ReactNode => {\n if (!term) return message;\n const regex = new RegExp(`(${escapeRegExp(term)})`, 'ig');\n const parts = message.split(regex);\n return parts.map((part, index) =>\n part.toLowerCase() === term.toLowerCase() ? (\n <mark key={index} className={styles.highlight}>\n {part}\n </mark>\n ) : (\n <React.Fragment key={index}>{part}</React.Fragment>\n )\n );\n};\n\nexport function LogsPanel() {\n const system = useSystem();\n const logs = useStore(system.logsStore, (x) => x.logs);\n const clearLogs = useStore(system.logsStore, (x) => x.clear);\n\n const [searchText, setSearchText] = React.useState('');\n const [currentSearchTerm, setCurrentSearchTerm] = React.useState('');\n const [autoScroll, setAutoScroll] = React.useState(true);\n const [showTimestamps, setShowTimestamps] = React.useState(true);\n const [selectedLevels, setSelectedLevels] = React.useState<Set<LogSeverity>>(\n new Set(LEVELS)\n );\n\n const messagesEndRef = useRef<null | HTMLDivElement>(null);\n\n useEffect(() => {\n if (autoScroll) {\n messagesEndRef.current?.scrollIntoView({ block: 'end' });\n }\n }, [logs, autoScroll]);\n\n const onSearchChange = useCallback((e: any) => {\n const next = e.target.value as string;\n setSearchText(next);\n // live-filter as the user types, like the VS Code filter box\n setCurrentSearchTerm(next);\n }, []);\n\n const clearSearch = useCallback(() => {\n setSearchText('');\n setCurrentSearchTerm('');\n }, []);\n\n const toggleLevel = useCallback((level: LogSeverity) => {\n setSelectedLevels((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(level)) {\n newSet.delete(level);\n } else {\n newSet.add(level);\n }\n return newSet;\n });\n }, []);\n\n const filteredLogs = useMemo(() => {\n let result = logs.filter((log) => selectedLevels.has(log.type));\n\n if (currentSearchTerm) {\n const lowerCaseSearchText = currentSearchTerm.toLowerCase();\n result = result.filter((log) => {\n const logDataString = log.data.message.toLowerCase();\n const logTypeString = log.type.toLowerCase();\n return (\n logDataString.includes(lowerCaseSearchText) ||\n logTypeString.includes(lowerCaseSearchText)\n );\n });\n }\n\n return result;\n }, [logs, currentSearchTerm, selectedLevels]);\n\n const levelCounts = useMemo(() => {\n const counts: Record<LogSeverity, number> = {\n verbose: 0,\n info: 0,\n warning: 0,\n error: 0\n };\n for (const log of logs) counts[log.type]++;\n return counts;\n }, [logs]);\n\n const exportLogs = useCallback(() => {\n const logData = filteredLogs.map((log) => ({\n timestamp: log.time.toISOString(),\n level: log.type,\n message: log.data.message\n }));\n const blob = new Blob([JSON.stringify(logData, null, 2)], {\n type: 'application/json'\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `logs-${new Date().toISOString()}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, [filteredLogs]);\n\n const copyToClipboard = useCallback(\n (text: string) => {\n navigator.clipboard.writeText(text).then(() => {\n system.notifications.success('Copied to clipboard');\n });\n },\n [system]\n );\n\n return (\n <BasePanel>\n {/* Toolbar */}\n <div className={styles.toolbar}>\n <div className={styles.searchBar}>\n <div className={styles.searchField}>\n <Search className={styles.searchIcon} width={14} height={14} />\n <VscodeTextfield\n className={styles.searchInput}\n value={searchText}\n placeholder=\"Filter logs\"\n onChange={onSearchChange}\n onKeyDown={(e) => {\n if (e.key === 'Escape') clearSearch();\n }}\n />\n {searchText && (\n <Icon title=\"Clear filter\" onClick={clearSearch}>\n <Xmark width={14} height={14} />\n </Icon>\n )}\n </div>\n\n <div className={styles.toolbarActions}>\n <Icon\n title={autoScroll ? 'Auto-scroll on' : 'Auto-scroll off'}\n className={clsx(autoScroll && styles.actionActive)}\n onClick={() => setAutoScroll((v) => !v)}\n >\n {autoScroll ? <ArrowDownCircleSolid /> : <ArrowDownCircle />}\n </Icon>\n <Icon\n title={showTimestamps ? 'Hide timestamps' : 'Show timestamps'}\n className={clsx(showTimestamps && styles.actionActive)}\n onClick={() => setShowTimestamps((v) => !v)}\n >\n {showTimestamps ? <ClockSolid /> : <Clock />}\n </Icon>\n <Icon title=\"Export logs\" onClick={exportLogs}>\n <Download />\n </Icon>\n <Icon title=\"Clear logs\" onClick={clearLogs}>\n <TrashSolid />\n </Icon>\n </div>\n </div>\n\n {/* Level filter toggles */}\n <div className={styles.filters}>\n {LEVELS.map((level) => {\n const active = selectedLevels.has(level);\n return (\n <button\n type=\"button\"\n key={level}\n className={clsx(styles.levelChip, !active && styles.levelOff)}\n style={{ ['--chip-color' as string]: LOG_COLORS[level] }}\n onClick={() => toggleLevel(level)}\n aria-pressed={active}\n title={`${active ? 'Hide' : 'Show'} ${level} logs`}\n >\n <span className={styles.levelChipIcon}>{IconType[level]}</span>\n <span className={styles.levelChipLabel}>{level}</span>\n <span className={styles.levelChipCount}>\n {levelCounts[level]}\n </span>\n </button>\n );\n })}\n <span className={styles.logCount}>\n {filteredLogs.length === logs.length\n ? `${logs.length} logs`\n : `${filteredLogs.length} / ${logs.length} logs`}\n </span>\n </div>\n </div>\n\n {/* Log list */}\n <div className={styles.logsContainer}>\n {filteredLogs.length === 0 ? (\n <div className={styles.emptyState}>\n {logs.length === 0\n ? 'No logs to display.'\n : 'No logs match the current filter.'}\n </div>\n ) : (\n <div className={styles.logsList} role=\"log\" aria-live=\"polite\">\n {filteredLogs.map((log, index) => (\n <div\n key={index}\n className={styles.row}\n data-severity={log.type}\n onDoubleClick={() => copyToClipboard(log.data.message)}\n title=\"Double-click to copy\"\n >\n <span\n className={styles.rowIcon}\n style={{ color: LOG_COLORS[log.type] }}\n aria-label={log.type}\n >\n {IconType[log.type]}\n </span>\n {showTimestamps && (\n <time className={styles.rowTime}>\n {formatTimestamp(log.time)}\n </time>\n )}\n <span className={styles.rowMessage}>\n {renderMessage(log.data.message, currentSearchTerm)}\n </span>\n </div>\n ))}\n <div ref={messagesEndRef} />\n </div>\n )}\n </div>\n </BasePanel>\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/variables/styles.module_built.css\";\nconst classes = {\"sectionPadded\":\"_9RH7Bq_sectionPadded\",\"root\":\"_9RH7Bq_root\",\"listItemContent\":\"_9RH7Bq_listItemContent\",\"treeItemContent\":\"_9RH7Bq_treeItemContent\",\"treeItemMeta\":\"_9RH7Bq_treeItemMeta\",\"fieldLabel\":\"_9RH7Bq_fieldLabel\",\"header\":\"_9RH7Bq_header\",\"treeItemText\":\"_9RH7Bq_treeItemText\",\"list\":\"_9RH7Bq_list\",\"selectedEditor\":\"_9RH7Bq_selectedEditor\",\"editorTitle\":\"_9RH7Bq_editorTitle\",\"treeItemTitle\":\"_9RH7Bq_treeItemTitle\",\"editorHeader\":\"_9RH7Bq_editorHeader\",\"tree\":\"_9RH7Bq_tree\",\"editorActions\":\"_9RH7Bq_editorActions\",\"treeItemInfo\":\"_9RH7Bq_treeItemInfo\",\"treeItemID\":\"_9RH7Bq_treeItemID\",\"variableList\":\"_9RH7Bq_variableList\",\"field\":\"_9RH7Bq_field\",\"section\":\"_9RH7Bq_section\",\"emptyState\":\"_9RH7Bq_emptyState\",\"listItem\":\"_9RH7Bq_listItem\",\"editorVariableName\":\"_9RH7Bq_editorVariableName\",\"headerTitle\":\"_9RH7Bq_headerTitle\",\"fieldControl\":\"_9RH7Bq_fieldControl\",\"emptyStateText\":\"_9RH7Bq_emptyStateText\",\"emptyStateHint\":\"_9RH7Bq_emptyStateHint\",\"headerRow\":\"_9RH7Bq_headerRow\",\"editorFields\":\"_9RH7Bq_editorFields\",\"treeItemName\":\"_9RH7Bq_treeItemName\",\"treeItemSub\":\"_9RH7Bq_treeItemSub\",\"headerRowPadded\":\"_9RH7Bq_headerRowPadded\",\"treeItemIcon\":\"_9RH7Bq_treeItemIcon\",\"actionsRow\":\"_9RH7Bq_actionsRow\",\"treeItemRow\":\"_9RH7Bq_treeItemRow\"}\nexport default classes\n\nconst _sectionPadded0 = classes[\"sectionPadded\"]\nexport { _sectionPadded0 as \"sectionPadded\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _listItemContent0 = classes[\"listItemContent\"]\nexport { _listItemContent0 as \"listItemContent\" }\n\nconst _treeItemContent0 = classes[\"treeItemContent\"]\nexport { _treeItemContent0 as \"treeItemContent\" }\n\nconst _treeItemMeta0 = classes[\"treeItemMeta\"]\nexport { _treeItemMeta0 as \"treeItemMeta\" }\n\nconst _fieldLabel0 = classes[\"fieldLabel\"]\nexport { _fieldLabel0 as \"fieldLabel\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _treeItemText0 = classes[\"treeItemText\"]\nexport { _treeItemText0 as \"treeItemText\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _selectedEditor0 = classes[\"selectedEditor\"]\nexport { _selectedEditor0 as \"selectedEditor\" }\n\nconst _editorTitle0 = classes[\"editorTitle\"]\nexport { _editorTitle0 as \"editorTitle\" }\n\nconst _treeItemTitle0 = classes[\"treeItemTitle\"]\nexport { _treeItemTitle0 as \"treeItemTitle\" }\n\nconst _editorHeader0 = classes[\"editorHeader\"]\nexport { _editorHeader0 as \"editorHeader\" }\n\nconst _tree0 = classes[\"tree\"]\nexport { _tree0 as \"tree\" }\n\nconst _editorActions0 = classes[\"editorActions\"]\nexport { _editorActions0 as \"editorActions\" }\n\nconst _treeItemInfo0 = classes[\"treeItemInfo\"]\nexport { _treeItemInfo0 as \"treeItemInfo\" }\n\nconst _treeItemID0 = classes[\"treeItemID\"]\nexport { _treeItemID0 as \"treeItemID\" }\n\nconst _variableList0 = classes[\"variableList\"]\nexport { _variableList0 as \"variableList\" }\n\nconst _field0 = classes[\"field\"]\nexport { _field0 as \"field\" }\n\nconst _section0 = classes[\"section\"]\nexport { _section0 as \"section\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _listItem0 = classes[\"listItem\"]\nexport { _listItem0 as \"listItem\" }\n\nconst _editorVariableName0 = classes[\"editorVariableName\"]\nexport { _editorVariableName0 as \"editorVariableName\" }\n\nconst _headerTitle0 = classes[\"headerTitle\"]\nexport { _headerTitle0 as \"headerTitle\" }\n\nconst _fieldControl0 = classes[\"fieldControl\"]\nexport { _fieldControl0 as \"fieldControl\" }\n\nconst _emptyStateText0 = classes[\"emptyStateText\"]\nexport { _emptyStateText0 as \"emptyStateText\" }\n\nconst _emptyStateHint0 = classes[\"emptyStateHint\"]\nexport { _emptyStateHint0 as \"emptyStateHint\" }\n\nconst _headerRow0 = classes[\"headerRow\"]\nexport { _headerRow0 as \"headerRow\" }\n\nconst _editorFields0 = classes[\"editorFields\"]\nexport { _editorFields0 as \"editorFields\" }\n\nconst _treeItemName0 = classes[\"treeItemName\"]\nexport { _treeItemName0 as \"treeItemName\" }\n\nconst _treeItemSub0 = classes[\"treeItemSub\"]\nexport { _treeItemSub0 as \"treeItemSub\" }\n\nconst _headerRowPadded0 = classes[\"headerRowPadded\"]\nexport { _headerRowPadded0 as \"headerRowPadded\" }\n\nconst _treeItemIcon0 = classes[\"treeItemIcon\"]\nexport { _treeItemIcon0 as \"treeItemIcon\" }\n\nconst _actionsRow0 = classes[\"actionsRow\"]\nexport { _actionsRow0 as \"actionsRow\" }\n\nconst _treeItemRow0 = classes[\"treeItemRow\"]\nexport { _treeItemRow0 as \"treeItemRow\" }\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport { Variable } from '@kiberon-labs/behave-graph';\nimport { useSystem } from '@/system/provider';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeSingleSelect,\n VscodeOption,\n VscodeLabel\n} from '@vscode-elements/react-elements';\nimport styles from './styles.module.css';\n\ntype Props = {\n onBack: () => void;\n onCancel: () => void;\n onCreated?: (variableKey: string) => void;\n};\n\nexport function CreateVariableScreen({ onBack, onCancel, onCreated }: Props) {\n const system = useSystem();\n const registry = useStore(system.registry);\n const setVariable = useStore(system.variableStore, (x) => x.setVariable);\n const controls = useStore(system.controlStore, (x) => x.controls);\n const defaultControl = useStore(system.controlStore, (x) => x.defaultControl);\n\n const [newVarName, setNewVarName] = useState('');\n const [newVarType, setNewVarType] = useState('string');\n const [newVarInitialValue, setNewVarInitialValue] = useState<any>('');\n\n const availableTypes = useMemo(() => {\n return Object.keys(registry.values).sort();\n }, [registry.values]);\n\n const getControlComponent = useCallback(\n (valueType: string) => {\n return controls[valueType] || defaultControl;\n },\n [controls, defaultControl]\n );\n\n const NewVarControlComponent = useMemo(() => {\n return getControlComponent(newVarType);\n }, [getControlComponent, newVarType]);\n\n const resetForm = useCallback(() => {\n setNewVarName('');\n const valueType = registry.values[newVarType];\n if (valueType) {\n setNewVarInitialValue(valueType.creator());\n }\n }, [registry.values, newVarType]);\n\n const handleCreate = useCallback(() => {\n if (!newVarName.trim()) return;\n\n const valueType = registry.values[newVarType];\n if (!valueType) {\n console.error(`Value type ${newVarType} not found in registry`);\n return;\n }\n\n const newVariable = new Variable(\n newVarName,\n newVarName,\n newVarType,\n newVarInitialValue\n );\n\n setVariable(newVarName, newVariable);\n onCreated?.(newVarName);\n resetForm();\n onBack();\n }, [\n newVarName,\n newVarType,\n newVarInitialValue,\n registry.values,\n setVariable,\n onCreated,\n resetForm,\n onBack\n ]);\n\n const handleCancel = useCallback(() => {\n resetForm();\n onCancel();\n }, [resetForm, onCancel]);\n\n const handleBack = useCallback(() => {\n resetForm();\n onBack();\n }, [resetForm, onBack]);\n\n return (\n <>\n <div className={styles.headerRow}>\n <h3\n style={{\n fontSize: '1.1em',\n fontWeight: 'bold'\n }}\n >\n Create Variable\n </h3>\n\n <VscodeButton secondary onClick={handleBack}>\n Back\n </VscodeButton>\n </div>\n\n <div className={`${styles.section} ${styles.sectionPadded}`}>\n <div className={styles.field}>\n <VscodeLabel>Name:</VscodeLabel>\n <VscodeTextfield\n value={newVarName}\n placeholder=\"Variable name...\"\n onChange={(e: any) => setNewVarName(e.target.value)}\n />\n </div>\n\n <div className={styles.field}>\n <VscodeLabel>Type:</VscodeLabel>\n <VscodeSingleSelect\n value={newVarType}\n onChange={(e: any) => {\n const valueType = registry.values[e.target.value];\n if (valueType?.serialize && valueType?.creator) {\n setNewVarInitialValue(valueType.serialize(valueType.creator()));\n }\n setNewVarType(e.target.value);\n }}\n >\n {availableTypes.map((type) => (\n <VscodeOption key={type} value={type}>\n {type}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n </div>\n\n <div className={styles.field}>\n <VscodeLabel>Initial Value:</VscodeLabel>\n <NewVarControlComponent\n value={newVarInitialValue}\n onChange={setNewVarInitialValue}\n valueType={newVarType}\n />\n </div>\n\n <div className={styles.actionsRow}>\n <VscodeButton onClick={handleCreate} disabled={!newVarName.trim()}>\n Save\n </VscodeButton>\n <VscodeButton secondary onClick={handleCancel}>\n Cancel\n </VscodeButton>\n </div>\n </div>\n </>\n );\n}\n","import type { ReactFlowInstance } from 'reactflow';\nimport { create, useStore, type StoreApi } from 'zustand';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport type { XYPosition } from 'reactflow';\n\nexport type Refs = {\n reactflow: ReactFlowInstance;\n nodePickerPosition?: XYPosition;\n selectedDocumentationType?: string;\n};\n\nexport type RefStore = {\n refs: Refs;\n setRef: <T extends keyof Refs>(key: T, ref: Refs[T]) => void;\n getRef: <T extends keyof Refs>(key: T) => Refs[T] | undefined;\n removeRef: (key: keyof Refs) => void;\n hasRef: (key: keyof Refs) => boolean;\n};\n\nexport const refStoreFactory = () =>\n create<RefStore>()(\n subscribeWithSelector((set, get) => ({\n refs: {} as Refs,\n\n setRef: <T extends keyof Refs>(key: T, ref: Refs[T]) => {\n set((state) => ({\n refs: {\n ...state.refs,\n [key]: ref\n }\n }));\n },\n\n getRef: <T extends keyof Refs>(key: T) => {\n return get().refs[key] as Refs[T] | undefined;\n },\n\n removeRef: (key: keyof Refs) => {\n set((state) => {\n const { [key]: _, ...rest } = state.refs;\n return { refs: rest as Refs };\n });\n },\n\n hasRef: (key: string) => {\n return key in get().refs;\n }\n }))\n );\n\n/**\n * Subscribe to changes of a specific ref\n * @param store - The ref store\n * @param key - The key of the ref to watch\n * @param callback - Callback fired when the ref changes\n * @returns Unsubscribe function\n */\nexport function subscribeToRef<T extends keyof Refs>(\n store: StoreApi<RefStore>,\n key: T,\n callback: (ref: Refs[T] | undefined) => void\n) {\n return store.subscribe((state, prevState) => {\n const current = state.refs[key] as Refs[T] | undefined;\n const previous = prevState.refs[key] as Refs[T] | undefined;\n if (current !== previous) {\n return current;\n }\n callback(current);\n });\n}\n\n/**\n * Hook to access the current value of a ref from the store\n * @param store - The ref store\n * @param key - The key of the ref\n * @returns The current value of the ref or null\n */\nexport function useRefFromStore<T extends keyof Refs>(\n store: StoreApi<RefStore>,\n key: T\n): Refs[T] | undefined {\n return useStore(store, (state) => state.refs[key] as Refs[T] | undefined);\n}\n","import React from 'react';\nimport type { VariableJSON } from '@kiberon-labs/behave-graph';\nimport {\n VscodeButton,\n VscodeDivider,\n VscodeTree,\n VscodeTreeItem\n} from '@vscode-elements/react-elements';\nimport { Plus, TrashSolid } from 'iconoir-react';\nimport styles from './styles.module.css';\nimport { useSystem } from '@/system';\nimport { useStore } from 'zustand';\nimport { Icon } from '@/components/primitives/icon';\n\ntype ValueControlProps = {\n value: any;\n onChange: (value: any) => void;\n valueType: string;\n};\n\ntype Props = {\n variables: Record<string, VariableJSON>;\n selectedVarKey: string;\n onSelectVariable: (key: string) => void;\n onDeleteVariable: (key: string) => void;\n onNewVariable: () => void;\n\n selectedVariable: VariableJSON | null;\n editValue: any;\n onChangeEditValue: (value: any) => void;\n SelectedVarControlComponent: React.ComponentType<ValueControlProps>;\n onUpdateVariable: () => void;\n};\n\nexport function ManageVariablesScreen({\n selectedVarKey: _selectedVarKey,\n onSelectVariable,\n onDeleteVariable,\n onNewVariable,\n selectedVariable,\n editValue,\n onChangeEditValue,\n SelectedVarControlComponent,\n onUpdateVariable\n}: Props) {\n const system = useSystem();\n const icons = useStore(system.legendStore, (x) => x.icons);\n const variables = useStore(system.variableStore, (x) => x.variables);\n\n const handleTreeSelect = (ev: unknown) => {\n const detail = (ev as CustomEvent<any>)?.detail;\n const selectedItems = Array.isArray(detail)\n ? detail\n : detail?.selectedItems;\n const firstSelected = selectedItems?.[0] as HTMLElement | undefined;\n const key = firstSelected?.dataset?.varKey;\n\n if (key) {\n onSelectVariable(key);\n }\n };\n\n return (\n <div className={styles.root}>\n <div className={styles.header}>\n <div className={styles.headerTitle}>Variables</div>\n <Icon title=\"New variable\" onClick={onNewVariable}>\n <Plus />\n </Icon>\n </div>\n <VscodeDivider />\n\n <div className={styles.variableList}>\n {Object.keys(variables).length === 0 ? (\n <div className={styles.emptyState}>\n <div className={styles.emptyStateText}>No variables defined</div>\n <div className={styles.emptyStateHint}>\n Click the \"+\" button to create your first variable\n </div>\n </div>\n ) : (\n <VscodeTree\n className={styles.tree}\n onVscTreeSelect={handleTreeSelect}\n >\n {Object.entries(variables).map(([name, variable]) => (\n <VscodeTreeItem\n key={name}\n data-var-key={name}\n active={variable.id == selectedVariable?.id}\n >\n <div className={styles.treeItemContent}>\n <div className={styles.treeItemIcon}>\n {icons[variable.valueTypeName] &&\n React.createElement(icons[variable.valueTypeName]!)}\n </div>\n <div className={styles.treeItemInfo} title={variable.id}>\n {variable.name}\n </div>\n </div>\n </VscodeTreeItem>\n ))}\n </VscodeTree>\n )}\n </div>\n\n {selectedVariable && (\n <div className={styles.selectedEditor}>\n <div className={styles.editorHeader}>\n <div className={styles.editorTitle}>Edit Variable</div>\n <div className={styles.editorVariableName}>\n {selectedVariable.name}\n </div>\n </div>\n\n <div className={styles.editorFields}>\n <label className={styles.fieldLabel}>Current Value</label>\n <div className={styles.fieldControl}>\n <SelectedVarControlComponent\n value={editValue}\n onChange={onChangeEditValue}\n valueType={selectedVariable.valueTypeName}\n />\n </div>\n </div>\n\n <div className={styles.editorActions}>\n <VscodeButton\n secondary\n iconOnly\n title=\"Delete variable\"\n onClick={() => {\n onDeleteVariable(selectedVariable.name);\n }}\n >\n <TrashSolid />\n </VscodeButton>\n <VscodeButton onClick={onUpdateVariable}>Update Value</VscodeButton>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import React, { useState, useCallback } from 'react';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\nimport { CreateVariableScreen } from './CreateVariableScreen';\nimport { ManageVariablesScreen } from './ManageVariablesScreen';\nimport { BasePanel } from '../base';\n\ntype VariablesPanelScreen = 'manage' | 'create';\n\nexport function VariablesPanel() {\n const system = useSystem();\n const variables = useStore(system.variableStore, (x) => x.variables);\n const setVariable = useStore(system.variableStore, (x) => x.setVariable);\n const removeVariable = useStore(\n system.variableStore,\n (x) => x.removeVariable\n );\n const controls = useStore(system.controlStore, (x) => x.controls);\n const defaultControl = useStore(system.controlStore, (x) => x.defaultControl);\n\n // Get the appropriate control component for a value type\n const getControlComponent = useCallback(\n (valueType: string) => {\n return controls[valueType] || defaultControl;\n },\n [controls, defaultControl]\n );\n\n const [screen, setScreen] = useState<VariablesPanelScreen>('manage');\n\n // Section 2 & 3: Select and edit existing variable\n const [selectedVarId, setSelectedVarId] = useState<string>('');\n const [editValue, setEditValue] = useState<any>('');\n\n // Handle selecting a variable\n const handleSelectVariable = useCallback(\n (varKey: string) => {\n setSelectedVarId(varKey);\n const variable = variables[varKey];\n\n if (variable) {\n setEditValue(variable.initialValue);\n }\n },\n [variables]\n );\n\n // Handle updating selected variable\n const handleUpdateVariable = useCallback(() => {\n if (!selectedVarId || !variables[selectedVarId]) {\n return;\n }\n\n const variable = variables[selectedVarId];\n // Force re-render by updating the store\n setVariable(selectedVarId, {\n ...variable,\n initialValue: editValue\n });\n }, [selectedVarId, editValue, variables, setVariable]);\n\n // Handle deleting a variable\n const handleDeleteVariable = useCallback(\n (varName: string) => {\n removeVariable(varName);\n if (varName === selectedVarId) {\n setSelectedVarId('');\n setEditValue('');\n }\n },\n [removeVariable, selectedVarId, variables]\n );\n\n const selectedVariable = selectedVarId\n ? (variables[selectedVarId] ?? null)\n : null;\n const SelectedVarControlComponent = selectedVariable\n ? getControlComponent(selectedVariable.valueTypeName)\n : defaultControl;\n\n const goToCreate = useCallback(() => {\n setScreen('create');\n }, []);\n\n const goToManage = useCallback(() => {\n setScreen('manage');\n }, []);\n\n const handleCreatedVariable = useCallback(\n (variableKey: string) => {\n setSelectedVarId(variableKey);\n const created = system.variableStore.getState().variables[variableKey];\n if (created) {\n setEditValue(created.initialValue);\n }\n },\n [system.variableStore]\n );\n\n return (\n <BasePanel>\n {screen === 'create' && (\n <CreateVariableScreen\n onBack={goToManage}\n onCancel={goToManage}\n onCreated={handleCreatedVariable}\n />\n )}\n {screen === 'manage' && (\n <ManageVariablesScreen\n variables={variables}\n selectedVarKey={selectedVarId}\n onSelectVariable={handleSelectVariable}\n onDeleteVariable={handleDeleteVariable}\n onNewVariable={goToCreate}\n selectedVariable={selectedVariable}\n editValue={editValue}\n onChangeEditValue={setEditValue}\n SelectedVarControlComponent={SelectedVarControlComponent}\n onUpdateVariable={handleUpdateVariable}\n />\n )}\n </BasePanel>\n );\n}\n","import type { BoxBase, LayoutBase, PanelBase, TabData } from 'rc-dock';\n\nexport function recurseFindGraphPanel(\n base: BoxBase | PanelBase\n): PanelBase | null {\n if (base.id === 'graphs') {\n return base as PanelBase;\n }\n //Check if it has children\n if ((base as BoxBase).children) {\n for (const child of (base as BoxBase).children) {\n const found = recurseFindGraphPanel(child);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function findGraphPanel(layout: LayoutBase): PanelBase | null {\n //We need to recursively search for the graph panel\n // It is most likely in the dockbox\n const dockbox = recurseFindGraphPanel(layout.dockbox);\n if (dockbox) {\n return dockbox;\n }\n if (layout.floatbox) {\n const floatBox = recurseFindGraphPanel(layout.floatbox);\n if (floatBox) {\n return floatBox;\n }\n } else if (layout.maxbox) {\n const tab = recurseFindGraphPanel(layout.maxbox);\n if (tab) {\n return tab;\n }\n } else if (layout.windowbox) {\n const tab = recurseFindGraphPanel(layout.windowbox);\n if (tab) {\n return tab;\n }\n }\n return null;\n}\n\nfunction recurseFindTab(\n base: BoxBase | PanelBase,\n tabId: string\n): PanelBase | null {\n // Check if this is a panel with tabs\n if ((base as PanelBase).tabs) {\n const panel = base as PanelBase;\n const hasTab = panel.tabs?.some((tab) => tab.id === tabId);\n if (hasTab) {\n return panel;\n }\n }\n\n // Check if it has children\n if ((base as BoxBase).children) {\n for (const child of (base as BoxBase).children) {\n const found = recurseFindTab(child, tabId);\n if (found) {\n return found;\n }\n }\n }\n return null;\n}\n\nexport function findTabInLayout(\n layout: LayoutBase,\n tabId: string\n): PanelBase | null {\n // Search in dockbox\n if (layout.dockbox) {\n const found = recurseFindTab(layout.dockbox, tabId);\n if (found) return found;\n }\n\n // Search in floatbox\n if (layout.floatbox) {\n const found = recurseFindTab(layout.floatbox, tabId);\n if (found) return found;\n }\n\n // Search in maxbox\n if (layout.maxbox) {\n const found = recurseFindTab(layout.maxbox, tabId);\n if (found) return found;\n }\n\n // Search in windowbox\n if (layout.windowbox) {\n const found = recurseFindTab(layout.windowbox, tabId);\n if (found) return found;\n }\n\n return null;\n}\n\nfunction removeTabFromPanel(panel: PanelBase, tabId: string): PanelBase {\n return {\n ...panel,\n tabs: panel.tabs?.filter((tab) => tab.id !== tabId)\n };\n}\n\nfunction recursiveRemoveTab(\n base: BoxBase | PanelBase,\n tabId: string\n): BoxBase | PanelBase | null {\n // If this is a panel with tabs, remove the tab\n if ((base as PanelBase).tabs) {\n const panel = base as PanelBase;\n const hasTab = panel.tabs?.some((tab) => tab.id === tabId);\n if (hasTab) {\n const updatedPanel = removeTabFromPanel(panel, tabId);\n // If panel has no more tabs, return null to remove it\n if (!updatedPanel.tabs || updatedPanel.tabs.length === 0) {\n return null;\n }\n return updatedPanel;\n }\n return panel;\n }\n\n // If it has children, recursively update them\n if ((base as BoxBase).children) {\n const box = base as BoxBase;\n const updatedChildren = box.children\n .map((child) => recursiveRemoveTab(child, tabId))\n .filter((child) => child !== null) as (BoxBase | PanelBase)[];\n\n // If no children left, return null\n if (updatedChildren.length === 0) {\n return null;\n }\n\n return {\n ...box,\n children: updatedChildren\n };\n }\n\n return base;\n}\n\nexport function removeTabFromLayout(\n layout: LayoutBase,\n tabId: string\n): LayoutBase {\n const newLayout = { ...layout };\n\n if (newLayout.dockbox) {\n const updated = recursiveRemoveTab(newLayout.dockbox, tabId);\n if (updated) {\n newLayout.dockbox = updated as BoxBase;\n }\n }\n\n if (newLayout.floatbox) {\n const updated = recursiveRemoveTab(newLayout.floatbox, tabId);\n if (updated) {\n newLayout.floatbox = updated as BoxBase;\n } else {\n delete newLayout.floatbox;\n }\n }\n\n return newLayout;\n}\n\nexport function addFloatingTab(\n layout: LayoutBase,\n tabData: Partial<TabData>,\n position: { left: number; top: number; width: number; height: number }\n): LayoutBase {\n const newLayout = { ...layout };\n\n // Create or update floatbox\n const newPanel: PanelBase = {\n x: position.left,\n y: position.top,\n w: position.width,\n h: position.height,\n tabs: [tabData],\n group: tabData.group || 'popout'\n };\n\n if (!newLayout.floatbox) {\n newLayout.floatbox = {\n mode: 'float',\n children: [newPanel]\n };\n } else {\n newLayout.floatbox = {\n ...newLayout.floatbox,\n children: [...(newLayout.floatbox.children || []), newPanel]\n };\n }\n\n return newLayout;\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/nodeInputs/index.module_built.css\";\nconst classes = {\"sectionTitle\":\"_1lC7Cq_sectionTitle\",\"inputRow\":\"_1lC7Cq_inputRow\",\"annotationsPre\":\"_1lC7Cq_annotationsPre\",\"inputControlWrapper\":\"_1lC7Cq_inputControlWrapper\",\"settingsRow\":\"_1lC7Cq_settingsRow\",\"connectedMessage\":\"_1lC7Cq_connectedMessage\",\"annotationsEmpty\":\"_1lC7Cq_annotationsEmpty\",\"nodeCardTitle\":\"_1lC7Cq_nodeCardTitle\",\"panelTitle\":\"_1lC7Cq_panelTitle\",\"stackGap2Padded\":\"_1lC7Cq_stackGap2Padded\",\"nodeCard\":\"_1lC7Cq_nodeCard\",\"nodeCardMeta\":\"_1lC7Cq_nodeCardMeta\",\"annotationsTitle\":\"_1lC7Cq_annotationsTitle\",\"inputWithToggle\":\"_1lC7Cq_inputWithToggle\",\"noInputs\":\"_1lC7Cq_noInputs\",\"panelScrollable\":\"_1lC7Cq_panelScrollable\",\"panelTitleTextfield\":\"_1lC7Cq_panelTitleTextfield\",\"tabs\":\"_1lC7Cq_tabs\",\"cardPadding\":\"_1lC7Cq_cardPadding\",\"listGap1\":\"_1lC7Cq_listGap1\",\"panelTitleEdit\":\"_1lC7Cq_panelTitleEdit\",\"inputSubtext\":\"_1lC7Cq_inputSubtext\",\"annotationsSection\":\"_1lC7Cq_annotationsSection\",\"stackColPadded\":\"_1lC7Cq_stackColPadded\",\"annotationsValue\":\"_1lC7Cq_annotationsValue\",\"stackCol\":\"_1lC7Cq_stackCol\",\"stackGap2\":\"_1lC7Cq_stackGap2\",\"panel\":\"_1lC7Cq_panel\",\"emptyState\":\"_1lC7Cq_emptyState\",\"inputName\":\"_1lC7Cq_inputName\",\"annotationsList\":\"_1lC7Cq_annotationsList\",\"infoButton\":\"_1lC7Cq_infoButton\",\"inputMeta\":\"_1lC7Cq_inputMeta\",\"nodeTitleIcon\":\"_1lC7Cq_nodeTitleIcon\",\"annotationsListItem\":\"_1lC7Cq_annotationsListItem\",\"visibilityToggle\":\"_1lC7Cq_visibilityToggle\",\"panelTitleContainer\":\"_1lC7Cq_panelTitleContainer\",\"panelHeader\":\"_1lC7Cq_panelHeader\",\"panelId\":\"_1lC7Cq_panelId\",\"toolbar\":\"_1lC7Cq_toolbar\"}\nexport default classes\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _inputRow0 = classes[\"inputRow\"]\nexport { _inputRow0 as \"inputRow\" }\n\nconst _annotationsPre0 = classes[\"annotationsPre\"]\nexport { _annotationsPre0 as \"annotationsPre\" }\n\nconst _inputControlWrapper0 = classes[\"inputControlWrapper\"]\nexport { _inputControlWrapper0 as \"inputControlWrapper\" }\n\nconst _settingsRow0 = classes[\"settingsRow\"]\nexport { _settingsRow0 as \"settingsRow\" }\n\nconst _connectedMessage0 = classes[\"connectedMessage\"]\nexport { _connectedMessage0 as \"connectedMessage\" }\n\nconst _annotationsEmpty0 = classes[\"annotationsEmpty\"]\nexport { _annotationsEmpty0 as \"annotationsEmpty\" }\n\nconst _nodeCardTitle0 = classes[\"nodeCardTitle\"]\nexport { _nodeCardTitle0 as \"nodeCardTitle\" }\n\nconst _panelTitle0 = classes[\"panelTitle\"]\nexport { _panelTitle0 as \"panelTitle\" }\n\nconst _stackGap2Padded0 = classes[\"stackGap2Padded\"]\nexport { _stackGap2Padded0 as \"stackGap2Padded\" }\n\nconst _nodeCard0 = classes[\"nodeCard\"]\nexport { _nodeCard0 as \"nodeCard\" }\n\nconst _nodeCardMeta0 = classes[\"nodeCardMeta\"]\nexport { _nodeCardMeta0 as \"nodeCardMeta\" }\n\nconst _annotationsTitle0 = classes[\"annotationsTitle\"]\nexport { _annotationsTitle0 as \"annotationsTitle\" }\n\nconst _inputWithToggle0 = classes[\"inputWithToggle\"]\nexport { _inputWithToggle0 as \"inputWithToggle\" }\n\nconst _noInputs0 = classes[\"noInputs\"]\nexport { _noInputs0 as \"noInputs\" }\n\nconst _panelScrollable0 = classes[\"panelScrollable\"]\nexport { _panelScrollable0 as \"panelScrollable\" }\n\nconst _panelTitleTextfield0 = classes[\"panelTitleTextfield\"]\nexport { _panelTitleTextfield0 as \"panelTitleTextfield\" }\n\nconst _tabs0 = classes[\"tabs\"]\nexport { _tabs0 as \"tabs\" }\n\nconst _cardPadding0 = classes[\"cardPadding\"]\nexport { _cardPadding0 as \"cardPadding\" }\n\nconst _listGap10 = classes[\"listGap1\"]\nexport { _listGap10 as \"listGap1\" }\n\nconst _panelTitleEdit0 = classes[\"panelTitleEdit\"]\nexport { _panelTitleEdit0 as \"panelTitleEdit\" }\n\nconst _inputSubtext0 = classes[\"inputSubtext\"]\nexport { _inputSubtext0 as \"inputSubtext\" }\n\nconst _annotationsSection0 = classes[\"annotationsSection\"]\nexport { _annotationsSection0 as \"annotationsSection\" }\n\nconst _stackColPadded0 = classes[\"stackColPadded\"]\nexport { _stackColPadded0 as \"stackColPadded\" }\n\nconst _annotationsValue0 = classes[\"annotationsValue\"]\nexport { _annotationsValue0 as \"annotationsValue\" }\n\nconst _stackCol0 = classes[\"stackCol\"]\nexport { _stackCol0 as \"stackCol\" }\n\nconst _stackGap20 = classes[\"stackGap2\"]\nexport { _stackGap20 as \"stackGap2\" }\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _inputName0 = classes[\"inputName\"]\nexport { _inputName0 as \"inputName\" }\n\nconst _annotationsList0 = classes[\"annotationsList\"]\nexport { _annotationsList0 as \"annotationsList\" }\n\nconst _infoButton0 = classes[\"infoButton\"]\nexport { _infoButton0 as \"infoButton\" }\n\nconst _inputMeta0 = classes[\"inputMeta\"]\nexport { _inputMeta0 as \"inputMeta\" }\n\nconst _nodeTitleIcon0 = classes[\"nodeTitleIcon\"]\nexport { _nodeTitleIcon0 as \"nodeTitleIcon\" }\n\nconst _annotationsListItem0 = classes[\"annotationsListItem\"]\nexport { _annotationsListItem0 as \"annotationsListItem\" }\n\nconst _visibilityToggle0 = classes[\"visibilityToggle\"]\nexport { _visibilityToggle0 as \"visibilityToggle\" }\n\nconst _panelTitleContainer0 = classes[\"panelTitleContainer\"]\nexport { _panelTitleContainer0 as \"panelTitleContainer\" }\n\nconst _panelHeader0 = classes[\"panelHeader\"]\nexport { _panelHeader0 as \"panelHeader\" }\n\nconst _panelId0 = classes[\"panelId\"]\nexport { _panelId0 as \"panelId\" }\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { VscodeTextfield } from '@vscode-elements/react-elements';\nimport { InfoCircle } from 'iconoir-react';\nimport { annotatedTitle } from '@/annotations';\nimport type { IBehaveNode } from '@/types/nodes.js';\nimport styles from './index.module.css';\n\ninterface NodeTitleEditorProps {\n selectedNode: IBehaveNode;\n nodeLabel: string;\n onSave: (annotationKey: string, value: string) => void;\n nodeType?: string;\n nodeIcon?: React.ReactNode;\n hasDocumentation?: boolean;\n onShowDocumentation?: (nodeType: string) => void;\n}\n\nexport const NodeTitleEditor: React.FC<NodeTitleEditorProps> = ({\n selectedNode,\n nodeLabel,\n onSave,\n nodeType,\n nodeIcon,\n hasDocumentation,\n onShowDocumentation\n}) => {\n const [isEditingTitle, setIsEditingTitle] = useState(false);\n const [titleDraft, setTitleDraft] = useState('');\n\n const annotations = (selectedNode as any)?.data?.annotations;\n\n const annotationTitle = React.useMemo(() => {\n if (\n !annotations ||\n typeof annotations !== 'object' ||\n Array.isArray(annotations)\n )\n return undefined;\n const title = annotations?.[annotatedTitle];\n return typeof title === 'string' ? title : undefined;\n }, [annotations]);\n\n const displayedTitle = React.useMemo(() => {\n const trimmed = annotationTitle?.trim();\n return trimmed ? trimmed : nodeLabel;\n }, [annotationTitle, nodeLabel]);\n\n useEffect(() => {\n setIsEditingTitle(false);\n setTitleDraft('');\n }, [selectedNode.id]);\n\n const handleSaveTitle = (rawTitle: string) => {\n onSave(annotatedTitle, rawTitle);\n setIsEditingTitle(false);\n };\n\n const handleShowDocs = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onShowDocumentation && nodeType) {\n onShowDocumentation(nodeType);\n }\n },\n [onShowDocumentation, nodeType]\n );\n\n if (!isEditingTitle) {\n return (\n <>\n <div className={styles.panelTitleContainer}>\n {nodeIcon && <div className={styles.nodeTitleIcon}>{nodeIcon}</div>}\n <div\n className={styles.panelTitle}\n onDoubleClick={() => {\n setTitleDraft(displayedTitle);\n setIsEditingTitle(true);\n }}\n title=\"Double-click to rename\"\n >\n {displayedTitle}\n </div>\n {hasDocumentation && onShowDocumentation && (\n <button\n className={styles.infoButton}\n onClick={handleShowDocs}\n title=\"Show documentation\"\n >\n <InfoCircle />\n </button>\n )}\n </div>\n <div className={styles.panelId}>{selectedNode.id}</div>\n </>\n );\n }\n\n return (\n <>\n <div className={styles.panelTitleEdit}>\n <VscodeTextfield\n className={styles.panelTitleTextfield}\n value={titleDraft}\n onInput={(e: any) => setTitleDraft(e?.target?.value ?? '')}\n onBlur={() => {\n handleSaveTitle(titleDraft);\n }}\n onKeyDown={(e: any) => {\n if (e?.key === 'Enter') {\n e?.preventDefault?.();\n handleSaveTitle(titleDraft);\n }\n\n if (e?.key === 'Escape') {\n e?.preventDefault?.();\n setIsEditingTitle(false);\n setTitleDraft('');\n }\n }}\n />\n </div>\n <div className={styles.panelId}>{selectedNode.id}</div>\n </>\n );\n};\n","import React from 'react';\nimport { VscodeDivider } from '@vscode-elements/react-elements';\nimport type { Node } from 'reactflow';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport styles from './index.module.css';\n\ninterface MultipleNodesViewProps {\n selectedNodes: Node[];\n allSpecsJson: NodeSpecJSON[];\n}\n\nexport const MultipleNodesView: React.FC<MultipleNodesViewProps> = ({\n selectedNodes,\n allSpecsJson\n}) => {\n return (\n <div className={styles.panel}>\n <div className={styles.sectionTitle}>\n Multiple Nodes Selected ({selectedNodes.length})\n </div>\n <VscodeDivider />\n <div className={styles.listGap1}>\n {selectedNodes.map((node) => {\n const spec = allSpecsJson.find((s) => s.type === node.type);\n return (\n <div key={node.id} className={styles.nodeCard}>\n <div className={styles.nodeCardTitle}>\n {spec?.label || node.type}\n </div>\n <div className={styles.nodeCardMeta}>ID: {node.id}</div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { VscodeCollapsible } from '@vscode-elements/react-elements';\nimport type {\n SocketGenerator,\n SocketGeneratorNode\n} from '@/store/socketGenerator';\nimport styles from './index.module.css';\n\ninterface SocketGeneratorsProps {\n generators: SocketGenerator[];\n generatorNode: SocketGeneratorNode;\n}\n\nexport const SocketGenerators: React.FC<SocketGeneratorsProps> = ({\n generators,\n generatorNode\n}) => {\n if (generators.length === 0) return null;\n\n return (\n <VscodeCollapsible title=\"Socket Generator\" open>\n <div className={styles.stackColPadded}>\n {generators.map((generator) => {\n const GeneratorRenderer = generator.render;\n return (\n <GeneratorRenderer key={generator.name} node={generatorNode} />\n );\n })}\n </div>\n </VscodeCollapsible>\n );\n};\n","import React from 'react';\nimport {\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\nimport type { ControlComponent } from '@/store/controls';\nimport styles from './index.module.css';\nimport type { ChoiceJSON } from '@kiberon-labs/behave-graph';\n\ninterface InputControlProps {\n input: {\n name: string;\n valueType: string;\n defaultValue?: any;\n choices?: ChoiceJSON;\n value: any;\n connected: boolean;\n };\n ControlComponent: ControlComponent;\n onValueChange: (inputName: string, newValue: any) => void;\n}\n\nexport const InputControl: React.FC<InputControlProps> = ({\n input,\n ControlComponent,\n onValueChange\n}) => {\n return (\n <div className={styles.inputRow}>\n <div className={styles.inputMeta}>\n <div className={styles.inputName} title={input.valueType}>\n {input.name}\n </div>\n <div className={styles.inputSubtext}>\n {input.connected ? 'Connected' : input.valueType}\n </div>\n </div>\n\n <div>\n {input.connected ? (\n <div className={styles.connectedMessage}>Socket is connected</div>\n ) : input.choices && input.choices.length > 0 ? (\n <VscodeSingleSelect\n value={input.value ?? ''}\n onChange={(e: any) => onValueChange(input.name, e?.target?.value)}\n >\n {input.choices.map((choice) => (\n <VscodeOption key={choice.text} value={choice.value}>\n {choice.text}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n ) : (\n <ControlComponent\n value={input.value}\n onChange={(newValue) => onValueChange(input.name, newValue)}\n valueType={input.valueType}\n />\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { InputControl } from './InputControl';\nimport type { ControlComponent } from '@/store/controls';\nimport styles from './index.module.css';\nimport { EyeClosed, EyeSolid } from 'iconoir-react';\nimport { Icon } from '@/components/primitives/icon';\nimport type { ChoiceJSON } from '@kiberon-labs/behave-graph';\n\nexport interface InputItem {\n name: string;\n valueType: string;\n defaultValue?: unknown;\n choices?: ChoiceJSON;\n value: unknown;\n connected: boolean;\n}\n\ninterface InputsGroupProps {\n inputs: InputItem[];\n controls: Record<string, ControlComponent>;\n defaultControl: ControlComponent;\n onValueChange: (inputName: string, newValue: unknown) => void;\n hiddenInputs?: Record<string, boolean>;\n onToggleInput?: (inputName: string) => void;\n}\n\nexport const InputsGroup: React.FC<InputsGroupProps> = ({\n inputs,\n controls,\n defaultControl,\n onValueChange,\n hiddenInputs = {},\n onToggleInput\n}) => {\n if (inputs.length === 0) return null;\n return (\n <div className={styles.stackColPadded}>\n {inputs.map((input) => {\n const Control = controls[input.valueType] ?? defaultControl;\n const isHidden = hiddenInputs[input.name] ?? false;\n\n return (\n <div key={input.name} className={styles.inputWithToggle}>\n {onToggleInput && (\n <Icon\n onClick={() => onToggleInput(input.name)}\n title={isHidden ? 'Show input on node' : 'Hide input on node'}\n >\n {isHidden ? <EyeClosed /> : <EyeSolid />}\n </Icon>\n )}\n <div className={styles.inputControlWrapper}>\n <InputControl\n input={input}\n ControlComponent={Control}\n onValueChange={onValueChange}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport styles from './index.module.css';\nimport { EyeClosed, EyeSolid } from 'iconoir-react';\nimport { Icon } from '@/components/primitives/icon';\n\nexport interface OutputItem {\n name: string;\n valueType: string;\n connected: boolean;\n}\n\ninterface OutputsGroupProps {\n outputs: OutputItem[];\n hiddenOutputs?: Record<string, boolean>;\n onToggleOutput?: (outputName: string) => void;\n}\n\nexport const OutputsGroup: React.FC<OutputsGroupProps> = ({\n outputs,\n hiddenOutputs = {},\n onToggleOutput\n}) => {\n if (outputs.length === 0) return null;\n return (\n <div className={styles.stackColPadded}>\n {outputs.map((output) => {\n const isHidden = hiddenOutputs[output.name] ?? false;\n\n return (\n <div key={output.name} className={styles.inputWithToggle}>\n {onToggleOutput && (\n <Icon\n onClick={() => onToggleOutput(output.name)}\n title={isHidden ? 'Show output on node' : 'Hide output on node'}\n >\n {isHidden ? <EyeClosed /> : <EyeSolid />}\n </Icon>\n )}\n <div className={styles.inputControlWrapper}>\n <div className={styles.inputRow}>\n <div className={styles.inputMeta}>\n <div className={styles.inputName} title={output.valueType}>\n {output.name}\n </div>\n <div className={styles.inputSubtext}>\n {output.connected ? 'Connected' : output.valueType}\n </div>\n </div>\n <div>\n {output.connected ? (\n <div className={styles.connectedMessage}>\n Socket is connected\n </div>\n ) : (\n <div className={styles.connectedMessage}>Not connected</div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { VscodeDivider, VscodeTextarea } from '@vscode-elements/react-elements';\nimport { description } from '@/annotations';\nimport type { IBehaveNode } from '@/types/nodes.js';\nimport styles from './index.module.css';\n\ninterface NodeSettingsProps {\n selectedNode: IBehaveNode;\n onSave: (annotationKey: string, value: string) => void;\n}\n\nexport const NodeSettings: React.FC<NodeSettingsProps> = ({\n selectedNode,\n onSave\n}) => {\n const annotations = selectedNode.data?.annotations;\n const currentDescription = annotations?.[description] ?? '';\n const [descriptionDraft, setDescriptionDraft] = useState(currentDescription);\n\n useEffect(() => {\n setDescriptionDraft(currentDescription);\n }, [currentDescription]);\n\n const handleSaveDescription = (rawDescription: string) => {\n onSave(description, rawDescription);\n };\n\n return (\n <div className={styles.stackGap2}>\n <div className={styles.stackGap2Padded}>\n <div className={styles.settingsRow}>\n <div>Type</div>\n <div>{selectedNode.data.type}</div>\n </div>\n <div className={styles.settingsRow}>\n <div>ID</div>\n <div>{selectedNode.id}</div>\n </div>\n\n <VscodeDivider />\n\n <div className={styles.descriptionSection}>\n <div className={styles.descriptionTitle}>Description</div>\n <VscodeTextarea\n placeholder=\"No description provided.\"\n className={styles.descriptionTextarea}\n value={descriptionDraft}\n onInput={(e: any) => setDescriptionDraft(e?.target?.value ?? '')}\n onBlur={() => {\n handleSaveDescription(descriptionDraft);\n }}\n onKeyDown={(e: any) => {\n if (e?.key === 'Escape') {\n e?.preventDefault?.();\n setDescriptionDraft('');\n }\n }}\n rows={4}\n />\n </div>\n\n <VscodeDivider />\n\n <div className={styles.annotationsSection}>\n <div className={styles.annotationsTitle}>Annotations</div>\n {annotations == null ? (\n <div className={styles.annotationsEmpty}>No annotations.</div>\n ) : typeof annotations === 'string' ||\n typeof annotations === 'number' ||\n typeof annotations === 'boolean' ? (\n <div className={styles.annotationsValue}>{String(annotations)}</div>\n ) : Array.isArray(annotations) &&\n annotations.every(\n (x) => typeof x === 'string' || typeof x === 'number'\n ) ? (\n <ul className={styles.annotationsList}>\n {annotations.map((x, i) => (\n <li key={i} className={styles.annotationsListItem}>\n {String(x)}\n </li>\n ))}\n </ul>\n ) : (\n <pre className={styles.annotationsPre}>\n {JSON.stringify(annotations, null, 2)}\n </pre>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import { useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport { configureSockets } from '@/util/sockets';\nimport { isHandleConnected } from '@/util/isHandleConnected';\nimport type { IBehaveNode } from '@/types/nodes';\nimport type { System } from '@/system';\n\nexport function useNodeInputsData(system: System) {\n const selectedNodeId = useStore(\n system.selectionStore,\n (x) => x.selectedNodeId\n );\n const nodes = useStore(system.nodeStore, (x) => x.nodes);\n const edges = useStore(system.edgeStore, (x) => x.edges);\n const controls = useStore(system.controlStore, (x) => x.controls);\n const defaultControl = useStore(system.controlStore, (x) => x.defaultControl);\n const generators = useStore(system.socketGeneratorStore, (s) => s.generators);\n const generatorLocation = useStore(\n system.systemSettings,\n (s) => s.generatorLocation\n );\n\n const allSpecsJson = useStore(system.specStore, (x) => x.specs);\n\n const selectedNodes = useMemo(() => {\n return nodes.filter(\n (n) => (n as IBehaveNode).type == 'behaveNode' && n.selected\n );\n }, [nodes]);\n\n const selectedNode = useMemo(() => {\n if (!selectedNodeId) return null;\n return nodes.find(\n (n) => (n as IBehaveNode).type === 'behaveNode' && n.id === selectedNodeId\n ) as IBehaveNode | null;\n }, [selectedNodeId, nodes]);\n\n const nodeSpec = useMemo(() => {\n if (!selectedNode) return null;\n return allSpecsJson.find((spec) => spec.type === selectedNode.data.type);\n }, [selectedNode, allSpecsJson]);\n\n const inputsWithControls = useMemo(() => {\n if (!selectedNode || !nodeSpec) return [];\n\n const { pairs, valueInputs } = configureSockets(\n selectedNode.data.configuration,\n nodeSpec,\n selectedNode.data.dynamicPorts\n );\n const inputs: Array<{\n name: string;\n valueType: string;\n defaultValue?: any;\n choices?: Array<{ text: string; value: any }>;\n value: any;\n connected: boolean;\n }> = [];\n\n for (const [input] of pairs) {\n if (input && input.valueType !== 'flow') {\n inputs.push({\n name: input.name,\n valueType: input.valueType,\n defaultValue: input.defaultValue,\n choices: input.choices,\n value: selectedNode.data.ports?.[input.name] ?? input.defaultValue,\n connected: isHandleConnected(\n edges,\n selectedNode.id,\n input.name,\n 'target'\n )\n });\n }\n }\n\n for (const input of valueInputs) {\n inputs.push({\n name: input.name,\n valueType: input.valueType,\n defaultValue: input.defaultValue,\n choices: input.choices,\n value: selectedNode.data.ports?.[input.name] ?? input.defaultValue,\n connected: isHandleConnected(\n edges,\n selectedNode.id,\n input.name,\n 'target'\n )\n });\n }\n\n return inputs;\n }, [selectedNode, nodeSpec, edges]);\n\n const outputsWithInfo = useMemo(() => {\n if (!selectedNode || !nodeSpec) return [];\n\n const { pairs, valueOutputs } = configureSockets(\n selectedNode.data.configuration,\n nodeSpec,\n selectedNode.data.dynamicPorts\n );\n\n const outputs: Array<{\n name: string;\n valueType: string;\n connected: boolean;\n }> = [];\n\n // Collect flow-paired outputs (non-flow)\n for (const [, output] of pairs) {\n if (output && output.valueType !== 'flow') {\n outputs.push({\n name: output.name,\n valueType: output.valueType,\n connected: isHandleConnected(\n edges,\n selectedNode.id,\n output.name,\n 'source'\n )\n });\n }\n }\n\n // Value-only outputs\n for (const output of valueOutputs) {\n outputs.push({\n name: output.name,\n valueType: output.valueType,\n connected: isHandleConnected(\n edges,\n selectedNode.id,\n output.name,\n 'source'\n )\n });\n }\n\n return outputs;\n }, [selectedNode, nodeSpec, edges]);\n\n const matchingGenerators = useMemo(() => {\n if (!nodeSpec || generatorLocation !== 'panel') return [];\n return generators.filter((x) => x.check(nodeSpec));\n }, [nodeSpec, generators, generatorLocation]);\n\n const generatorNode = useMemo(() => {\n if (!selectedNode || !nodeSpec) return null;\n return {\n id: selectedNode.id,\n data: selectedNode.data,\n spec: nodeSpec,\n selected: !!selectedNode.selected\n };\n }, [selectedNode, nodeSpec]);\n\n return {\n allSpecsJson,\n selectedNodes,\n selectedNode,\n nodeSpec,\n inputsWithControls,\n outputsWithInfo,\n\n matchingGenerators,\n generatorNode,\n controls,\n defaultControl\n };\n}\n","import { useCallback } from 'react';\nimport type { IBehaveNode } from '@/types/nodes';\nimport type { System } from '@/system';\n\nexport function useNodeHandlers(\n system: System,\n selectedNode: IBehaveNode | null\n) {\n const handleSaveTitle = useCallback(\n (annotationKey: string, rawValue: string) => {\n if (!selectedNode) return;\n\n const trimmed = rawValue.trim();\n\n const currentAnnotations = (selectedNode as any)?.data\n ?.annotations as unknown;\n const isPlainObject =\n !!currentAnnotations &&\n typeof currentAnnotations === 'object' &&\n !Array.isArray(currentAnnotations);\n\n const nextAnnotations: Record<string, any> = isPlainObject\n ? { ...(currentAnnotations as any) }\n : {};\n if (!trimmed) {\n delete nextAnnotations[annotationKey];\n } else {\n nextAnnotations[annotationKey] = trimmed;\n }\n\n const updatedNode = {\n ...selectedNode,\n data: {\n ...selectedNode.data,\n annotations: nextAnnotations\n }\n };\n\n system.nodeStore\n .getState()\n .setNodes((prev) =>\n prev.map((n) => (n.id === selectedNode.id ? updatedNode : n))\n );\n },\n [selectedNode, system.nodeStore]\n );\n\n const handleValueChange = useCallback(\n (inputName: string, newValue: any) => {\n if (!selectedNode) return;\n\n const updatedNode = {\n ...selectedNode,\n data: {\n ...selectedNode.data,\n ports: {\n ...selectedNode.data.ports,\n [inputName]: newValue\n }\n }\n };\n\n system.nodeStore\n .getState()\n .setNodes((prev) =>\n prev.map((n) => (n.id === selectedNode.id ? updatedNode : n))\n );\n },\n [selectedNode, system.nodeStore]\n );\n\n return {\n handleSaveTitle,\n handleValueChange\n };\n}\n","import React, { useCallback, useMemo } from 'react';\nimport { useSystem } from '@/system/provider';\nimport {\n VscodeTabHeader,\n VscodeTabPanel,\n VscodeTabs,\n VscodeToolbarContainer\n} from '@vscode-elements/react-elements';\nimport { useStore } from 'zustand';\nimport {\n findTabInLayout,\n removeTabFromLayout,\n addFloatingTab\n} from '@/components/layoutController/utils';\n\nimport styles from './index.module.css';\nimport { BasePanel } from '../base';\nimport { NodeTitleEditor } from './NodeTitleEditor';\nimport { MultipleNodesView } from './MultipleNodesView';\nimport { SocketGenerators } from './SocketGenerators';\nimport { InputsGroup } from './InputsGroup';\nimport { OutputsGroup } from './OutputsGroup';\nimport { NodeSettings } from './NodeSettings';\nimport { useNodeInputsData } from './useNodeInputsData';\nimport { useNodeHandlers } from './useNodeHandlers';\nimport { EyeClosed, EyeSolid } from 'iconoir-react';\nimport { Icon } from '@/components/primitives/icon';\n\nexport function NodeInputsPanel() {\n const system = useSystem();\n const documentation = useStore(system.documentationStore, (x) => x.docs);\n\n const {\n allSpecsJson,\n selectedNodes,\n selectedNode,\n nodeSpec,\n inputsWithControls,\n outputsWithInfo,\n matchingGenerators,\n generatorNode,\n controls,\n defaultControl\n } = useNodeInputsData(system);\n\n const { handleSaveTitle, handleValueChange } = useNodeHandlers(\n system,\n selectedNode\n );\n\n const hiddenInputs = useMemo(() => {\n return selectedNode?.data.annotations?.hiddenInputs ?? {};\n }, [selectedNode]);\n\n const hiddenOutputs = useMemo(() => {\n return selectedNode?.data.annotations?.hiddenOutputs ?? {};\n }, [selectedNode]);\n\n const handleToggleInput = useCallback(\n (inputName: string) => {\n if (!selectedNode) return;\n\n const currentHidden = hiddenInputs[inputName] ?? false;\n const newHiddenInputs = {\n ...hiddenInputs,\n [inputName]: !currentHidden\n };\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) =>\n n.id === selectedNode.id\n ? {\n ...n,\n data: {\n ...(n as any).data,\n annotations: {\n ...(n as any).data.annotations,\n hiddenInputs: newHiddenInputs\n }\n }\n }\n : n\n )\n );\n },\n [selectedNode, hiddenInputs, system]\n );\n\n const handleToggleOutput = useCallback(\n (outputName: string) => {\n if (!selectedNode) return;\n\n const currentHidden = hiddenOutputs[outputName] ?? false;\n const newHiddenOutputs = {\n ...hiddenOutputs,\n [outputName]: !currentHidden\n };\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) =>\n n.id === selectedNode.id\n ? {\n ...n,\n data: {\n ...(n as any).data,\n annotations: {\n ...(n as any).data.annotations,\n hiddenOutputs: newHiddenOutputs\n }\n }\n }\n : n\n )\n );\n },\n [selectedNode, hiddenOutputs, system]\n );\n\n const handleToggleAllInputs = useCallback(() => {\n if (!selectedNode) return;\n\n const allHidden = inputsWithControls.every(\n (input) => hiddenInputs[input.name]\n );\n const newHiddenInputs: Record<string, boolean> = {};\n\n inputsWithControls.forEach((input) => {\n newHiddenInputs[input.name] = !allHidden;\n });\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) =>\n n.id === selectedNode.id\n ? {\n ...n,\n data: {\n ...(n as any).data,\n annotations: {\n ...(n as any).data.annotations,\n hiddenInputs: newHiddenInputs\n }\n }\n }\n : n\n )\n );\n }, [selectedNode, inputsWithControls, hiddenInputs, system]);\n\n const handleToggleAllOutputs = useCallback(() => {\n if (!selectedNode) return;\n\n const allHidden = outputsWithInfo.every(\n (output) => hiddenOutputs[output.name]\n );\n const newHiddenOutputs: Record<string, boolean> = {};\n\n outputsWithInfo.forEach((output) => {\n newHiddenOutputs[output.name] = !allHidden;\n });\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) =>\n n.id === selectedNode.id\n ? {\n ...n,\n data: {\n ...(n as any).data,\n annotations: {\n ...(n as any).data.annotations,\n hiddenOutputs: newHiddenOutputs\n }\n }\n }\n : n\n )\n );\n }, [selectedNode, outputsWithInfo, hiddenOutputs, system]);\n\n const handleShowDocumentation = useCallback(\n (nodeType: string) => {\n // Set the selected documentation type\n system.refStore.getState().setRef('selectedDocumentationType', nodeType);\n\n // Open documentation browser panel\n const currentLayout = system.tabStore.getState().layout;\n\n // Close existing doc browser if open\n const existingPanel = findTabInLayout(currentLayout, 'docbrowser');\n let layoutToUse = currentLayout;\n if (existingPanel) {\n layoutToUse = removeTabFromLayout(currentLayout, 'docbrowser');\n }\n\n // Create new floating panel\n const tabData = {\n id: 'docbrowser'\n };\n\n const newLayout = addFloatingTab(layoutToUse, tabData, {\n left: 100,\n top: 100,\n width: 600,\n height: 700\n });\n\n system.tabStore.getState().setLayout(newLayout);\n },\n [system]\n );\n\n const hasDocumentation = useCallback(\n (nodeType: string) => {\n const doc = documentation?.get(nodeType);\n return !!(doc?.markdownDescription || doc?.shortDescription);\n },\n [documentation]\n );\n\n const getNodeIcon = useCallback(\n (nodeType: string) => {\n const doc = documentation?.get(nodeType);\n return doc?.icon;\n },\n [documentation]\n );\n\n // Handle multiple node selection\n if (selectedNodes.length > 1) {\n return (\n <MultipleNodesView\n selectedNodes={selectedNodes}\n allSpecsJson={allSpecsJson}\n />\n );\n }\n\n if (!selectedNode || !nodeSpec) {\n return (\n <BasePanel>\n <div className={styles.emptyState}>\n No node selected. Select a node to edit its inputs.\n </div>\n </BasePanel>\n );\n }\n\n return (\n <BasePanel>\n <NodeTitleEditor\n selectedNode={selectedNode}\n nodeLabel={nodeSpec?.label ?? ''}\n onSave={handleSaveTitle}\n nodeType={selectedNode.data.type}\n nodeIcon={getNodeIcon(selectedNode.data.type)}\n hasDocumentation={hasDocumentation(selectedNode.data.type)}\n onShowDocumentation={handleShowDocumentation}\n />\n\n <VscodeToolbarContainer className={styles.toolbar}>\n <VscodeTabs className={styles.tabs}>\n <VscodeTabHeader>Properties</VscodeTabHeader>\n <VscodeTabPanel>\n {inputsWithControls.length > 0 && (\n <div className={styles.panelHeader}>\n <Icon\n onClick={handleToggleAllInputs}\n title=\"Toggle all input visibility\"\n >\n {inputsWithControls.every(\n (input) => hiddenInputs[input.name]\n ) ? (\n <EyeSolid />\n ) : (\n <EyeClosed />\n )}\n </Icon>\n </div>\n )}\n\n {generatorNode && (\n <SocketGenerators\n generators={matchingGenerators}\n generatorNode={generatorNode}\n />\n )}\n {inputsWithControls.length === 0 &&\n matchingGenerators.length === 0 && (\n <div className={styles.noInputs}>\n This node has no editable inputs.\n </div>\n )}\n <InputsGroup\n inputs={inputsWithControls}\n controls={controls}\n defaultControl={defaultControl}\n onValueChange={handleValueChange}\n hiddenInputs={hiddenInputs}\n onToggleInput={handleToggleInput}\n />\n </VscodeTabPanel>\n <VscodeTabHeader>Outputs</VscodeTabHeader>\n <VscodeTabPanel>\n {outputsWithInfo.length > 0 && (\n <div className={styles.panelHeader}>\n <Icon\n onClick={handleToggleAllOutputs}\n title=\"Toggle all output visibility\"\n >\n {outputsWithInfo.every(\n (output) => hiddenOutputs[output.name]\n ) ? (\n <EyeSolid />\n ) : (\n <EyeClosed />\n )}\n </Icon>\n </div>\n )}\n {outputsWithInfo.length === 0 && (\n <div className={styles.noInputs}>This node has no outputs.</div>\n )}\n <OutputsGroup\n outputs={outputsWithInfo}\n hiddenOutputs={hiddenOutputs}\n onToggleOutput={handleToggleOutput}\n />\n </VscodeTabPanel>\n <VscodeTabHeader>Settings</VscodeTabHeader>\n <VscodeTabPanel>\n <NodeSettings\n selectedNode={selectedNode}\n onSave={handleSaveTitle}\n />\n </VscodeTabPanel>\n </VscodeTabs>\n </VscodeToolbarContainer>\n </BasePanel>\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/alignment/index.module_built.css\";\nconst classes = {\"content\":\"_0jNqVG_content\",\"row\":\"_0jNqVG_row\",\"root\":\"_0jNqVG_root\"}\nexport default classes\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n","import type { Node } from 'reactflow';\nimport {\n AlignHorizontalCenters,\n AlignHorizontalCentersSolid,\n AlignVerticalCenters,\n AlignVerticalCentersSolid,\n CompAlignBottom,\n CompAlignBottomSolid,\n CompAlignLeft,\n CompAlignLeftSolid,\n CompAlignRight,\n CompAlignRightSolid,\n CompAlignTop,\n CompAlignTopSolid\n} from 'iconoir-react';\nimport { VscodeButton } from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system/provider';\nimport type { System } from '@/system';\nimport styles from './index.module.css';\nimport { BasePanel } from '../base';\n\nconst partitionSelectedNodes = (nodes: Node[]) => {\n return nodes.reduce(\n (acc, node) => {\n if (node.selected) {\n acc.selectedNodes.push(node);\n } else {\n acc.unselectedNodes.push(node);\n }\n\n return acc;\n },\n {\n selectedNodes: [] as Node[],\n unselectedNodes: [] as Node[]\n }\n );\n};\n\nconst handleChange =\n (system: System) => (updater: (selectedNodes: Node[]) => void) => {\n const { nodes, setNodes } = system.nodeStore.getState();\n\n const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);\n //Assume it changes it directly\n updater(selectedNodes);\n //Make sure unselected nodes are processed first for cases like groups\n setNodes([...unselectedNodes, ...selectedNodes]);\n };\n\nexport const ALIGNMENT = {\n START: 0,\n CENTER: 1,\n END: 2\n} as const;\n\nexport type Alignment = (typeof ALIGNMENT)[keyof typeof ALIGNMENT];\n\nexport const align =\n (align: Alignment, prop: 'x' | 'y' = 'x') =>\n (selectedNodes: Node[]) => {\n // Align selected nodes to the left\n let v = 0;\n switch (align) {\n case ALIGNMENT.START:\n v = Math.min(...selectedNodes.map((node) => node.position[prop]));\n break;\n case ALIGNMENT.CENTER: {\n const vmin = Math.min(\n ...selectedNodes.map((node) => node.position[prop])\n );\n const vmax = Math.max(\n ...selectedNodes.map((node) => node.position[prop])\n );\n v = (vmin + vmax) / 2;\n break;\n }\n default:\n v = Math.max(...selectedNodes.map((node) => node.position[prop]));\n }\n selectedNodes.forEach((node) => {\n node.position[prop] = v;\n });\n };\n\nexport const distribute =\n (align: Alignment, prop: 'x' | 'y' = 'x') =>\n (selectedNodes: Node[]) => {\n if (selectedNodes.length < 3) {\n return;\n }\n\n //Sort the nodes by position\n selectedNodes = [...selectedNodes].sort(\n (a, b) => a.position[prop] - b.position[prop]\n );\n\n const getLength = (node: Node) => {\n if (prop === 'x') {\n return node.width ?? 0;\n }\n return node.height ?? 0;\n };\n\n const getPos = (node: Node) => {\n switch (align) {\n case ALIGNMENT.START:\n return node.position[prop];\n case ALIGNMENT.CENTER:\n return node.position[prop] + getLength(node) / 2;\n default:\n return node.position[prop] + getLength(node);\n }\n };\n\n const startNode = selectedNodes.reduce((acc, node) => {\n return getPos(node) < getPos(acc) ? node : acc;\n }, selectedNodes[0] as Node);\n\n const endNode = selectedNodes.reduce((acc, node) => {\n return getPos(node) > getPos(acc) ? node : acc;\n }, selectedNodes[0] as Node);\n //Get the total length\n const incrementLength =\n (getPos(endNode) - getPos(startNode)) / (selectedNodes.length - 1);\n\n selectedNodes.forEach((node, i) => {\n node.position[prop] = startNode.position[prop] + i * incrementLength;\n });\n };\n\nexport function AlignmentPanel() {\n const graphEditor = useSystem();\n const updateNodes = handleChange(graphEditor);\n\n return (\n <BasePanel>\n <div className={styles.content}>\n <span>Align</span>\n <div className={styles.row}>\n <VscodeButton\n secondary\n title=\"Align X Left\"\n onClick={() => updateNodes(align(ALIGNMENT.START))}\n icon-only\n >\n <CompAlignLeft />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Align X Center\"\n onClick={() => updateNodes(align(ALIGNMENT.CENTER))}\n icon-only\n >\n <AlignHorizontalCenters />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Align X Right\"\n onClick={() => updateNodes(align(ALIGNMENT.END))}\n icon-only\n >\n <CompAlignRight />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Align Y Top\"\n onClick={() => updateNodes(align(ALIGNMENT.START, 'y'))}\n icon-only\n >\n <CompAlignTop />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Align Y Middle\"\n onClick={() => updateNodes(align(ALIGNMENT.CENTER, 'y'))}\n icon-only\n >\n <AlignVerticalCenters />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Align Y Bottom\"\n onClick={() => updateNodes(align(ALIGNMENT.END, 'y'))}\n icon-only\n >\n <CompAlignBottom />\n </VscodeButton>\n </div>\n <span>Distribute</span>\n <div className={styles.row}>\n <VscodeButton\n secondary\n title=\"Distribute horizontally left\"\n icon-only\n onClick={() => updateNodes(distribute(ALIGNMENT.START))}\n >\n <CompAlignLeftSolid />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Distribute horizontally center\"\n onClick={() => updateNodes(distribute(ALIGNMENT.CENTER))}\n icon-only\n >\n <AlignHorizontalCentersSolid />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Distribute horizontally right\"\n icon-only\n onClick={() => updateNodes(distribute(ALIGNMENT.END))}\n >\n <CompAlignRightSolid />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Distribute vertically top\"\n onClick={() => updateNodes(distribute(ALIGNMENT.START, 'y'))}\n icon-only\n >\n <CompAlignTopSolid />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Distribute vertically center\"\n onClick={() => updateNodes(distribute(ALIGNMENT.CENTER, 'y'))}\n icon-only\n >\n <AlignVerticalCentersSolid />\n </VscodeButton>\n <VscodeButton\n secondary\n title=\"Distribute vertically bottom\"\n onClick={() => updateNodes(distribute(ALIGNMENT.END, 'y'))}\n icon-only\n >\n <CompAlignBottomSolid />\n </VscodeButton>\n </div>\n </div>\n </BasePanel>\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/search/index.module_built.css\";\nconst classes = {\"fullWidth\":\"ATQk8G_fullWidth\",\"resultId\":\"ATQk8G_resultId\",\"container\":\"ATQk8G_container\",\"resultType\":\"ATQk8G_resultType\",\"resultItem\":\"ATQk8G_resultItem\",\"searchRow\":\"ATQk8G_searchRow\",\"searchGroup\":\"ATQk8G_searchGroup\",\"resultsList\":\"ATQk8G_resultsList\",\"resultsContainer\":\"ATQk8G_resultsContainer\"}\nexport default classes\n\nconst _fullWidth0 = classes[\"fullWidth\"]\nexport { _fullWidth0 as \"fullWidth\" }\n\nconst _resultId0 = classes[\"resultId\"]\nexport { _resultId0 as \"resultId\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _resultType0 = classes[\"resultType\"]\nexport { _resultType0 as \"resultType\" }\n\nconst _resultItem0 = classes[\"resultItem\"]\nexport { _resultItem0 as \"resultItem\" }\n\nconst _searchRow0 = classes[\"searchRow\"]\nexport { _searchRow0 as \"searchRow\" }\n\nconst _searchGroup0 = classes[\"searchGroup\"]\nexport { _searchGroup0 as \"searchGroup\" }\n\nconst _resultsList0 = classes[\"resultsList\"]\nexport { _resultsList0 as \"resultsList\" }\n\nconst _resultsContainer0 = classes[\"resultsContainer\"]\nexport { _resultsContainer0 as \"resultsContainer\" }\n","import { annotatedTitle } from '@/annotations/index.js';\nimport React from 'react';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeSingleSelect,\n VscodeOption,\n VscodeLabel,\n VscodeTreeItem,\n VscodeTree,\n VscodeCollapsible,\n VscodeBadge\n} from '@vscode-elements/react-elements';\nimport { useRefFromStore, useSystem } from '@/system';\nimport type { Node } from 'reactflow';\nimport { Search } from 'iconoir-react';\nimport Fuse from 'fuse.js';\nimport { useStore } from 'zustand';\nimport { BasePanel } from '../base';\nimport styles from './index.module.css';\nimport { Icon } from '@/components/primitives/icon';\n\ntype AnnotatedNode = Node & {\n annotations: Record<string, string>;\n};\n\ntype SearchResult = {\n id: string;\n type: string;\n title?: string;\n};\n\nexport const SearchPanel = () => {\n const [id, setId] = React.useState('');\n const [title, setTitle] = React.useState('');\n const [nodeType, setNodeType] = React.useState('');\n const [searchResults, setSearchResults] = React.useState<SearchResult[]>([]);\n\n const sys = useSystem();\n const graphNodes = useStore(sys.nodeStore, (s) => s.nodes);\n const reactflow = useRefFromStore(sys.refStore, 'reactflow');\n\n // Get available node types from the current graph\n const availableNodeTypes = React.useMemo(() => {\n const types = new Set<string>();\n\n for (const node of graphNodes) {\n const type = node?.data?.type;\n if (typeof type === 'string' && type.length > 0) {\n types.add(type);\n }\n }\n\n return [...types].sort();\n }, [graphNodes]);\n\n const onClick = () => {\n if (!reactflow) {\n return;\n }\n\n const nodes = sys.nodeStore.getState().nodes;\n const graphNodes = Object.values(nodes);\n\n // Find all nodes matching the ID (partial match)\n const matchingNodes = graphNodes.filter((n) =>\n n.id.toLowerCase().includes(id.toLowerCase())\n );\n\n const results: SearchResult[] = matchingNodes.map((n) => ({\n id: n.id,\n type: n.data.type,\n title: (n as AnnotatedNode).annotations?.[annotatedTitle]\n }));\n\n setSearchResults(results);\n };\n\n const onClickTitle = () => {\n if (!reactflow) {\n return;\n }\n\n const nodes = sys.nodeStore.getState().nodes;\n const graphNodes = Object.values(nodes);\n\n // Filter nodes that have titles\n const nodesWithTitles = graphNodes.map((n) => ({\n node: n,\n title: (n as AnnotatedNode).data.type\n }));\n\n // Use Fuse.js for fuzzy search\n const fuse = new Fuse(nodesWithTitles, {\n keys: ['title'],\n threshold: 0.4, // Lower = more strict, Higher = more fuzzy (0.0 = exact, 1.0 = match anything)\n includeScore: true,\n ignoreLocation: true\n });\n\n const fuseResults = fuse.search(title);\n const matchingNodes = fuseResults.map((result) => result.item.node);\n\n const results: SearchResult[] = matchingNodes.map((n) => ({\n id: n.id,\n type: n.data.type,\n title: (n as AnnotatedNode).annotations?.[annotatedTitle]\n }));\n\n setSearchResults(results);\n };\n\n const onClickType = () => {\n if (!reactflow || !nodeType) {\n return;\n }\n\n const nodes = sys.nodeStore.getState().nodes;\n const graphNodes = Object.values(nodes);\n\n // Find all nodes matching the selected type\n const matchingNodes = graphNodes.filter((n) => n.data.type === nodeType);\n\n const results: SearchResult[] = matchingNodes.map((n) => ({\n id: n.id,\n type: n.data.type,\n title: (n as AnnotatedNode).annotations?.[annotatedTitle]\n }));\n\n setSearchResults(results);\n };\n\n const handleTreeSelect = (ev: unknown) => {\n const detail = (ev as CustomEvent<any>)?.detail;\n const selectedItems = Array.isArray(detail)\n ? detail\n : detail?.selectedItems;\n const firstSelected = selectedItems?.[0] as HTMLElement | undefined;\n const key = firstSelected?.dataset?.varKey;\n\n if (key) {\n sys.actionStore.getState().actions.focusNode(key);\n }\n };\n\n return (\n <BasePanel>\n <span style={{ fontWeight: 'bold', fontSize: '1.1em' }}>Find Node</span>\n\n <div className={styles.searchGroup}>\n <VscodeLabel>Find by ID</VscodeLabel>\n <div className={styles.searchRow}>\n <VscodeTextfield\n className={styles.fullWidth}\n value={id}\n onChange={(e: any) => setId(e.target.value)}\n />\n <Icon onClick={onClick}>\n <Search />\n </Icon>\n </div>\n </div>\n\n <div className={styles.searchGroup}>\n <VscodeLabel>Find by Title</VscodeLabel>\n <div className={styles.searchRow}>\n <VscodeTextfield\n className={styles.fullWidth}\n value={title}\n onChange={(e: any) => setTitle(e.target.value)}\n />\n <Icon onClick={onClickTitle}>\n <Search />\n </Icon>\n </div>\n </div>\n\n <div className={styles.searchGroup}>\n <VscodeLabel>Find by Type</VscodeLabel>\n\n <VscodeSingleSelect\n className={styles.fullWidth}\n value={nodeType}\n onChange={(e: any) => setNodeType(e.target.value)}\n >\n <VscodeOption value=\"\">Select a type...</VscodeOption>\n {availableNodeTypes.map((type) => (\n <VscodeOption key={type} value={type}>\n {type}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n <VscodeButton onClick={onClickType} disabled={!nodeType}>\n Search\n </VscodeButton>\n </div>\n\n {searchResults.length > 0 && (\n <VscodeCollapsible title=\"Results\" open>\n <VscodeBadge slot=\"decorations\">{searchResults.length}</VscodeBadge>\n <VscodeTree onVscTreeSelect={handleTreeSelect}>\n {searchResults.map((result) => (\n <VscodeTreeItem key={result.id} data-var-key={result.id}>\n <span>\n # {result.id} / {result.title}\n </span>\n <span slot=\"description\">{result.type}</span>\n </VscodeTreeItem>\n ))}\n </VscodeTree>\n </VscodeCollapsible>\n )}\n </BasePanel>\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/keymaps/index.module_built.css\";\nconst classes = {\"buttonGroup\":\"Gx7a7W_buttonGroup\",\"helpText\":\"Gx7a7W_helpText\",\"root\":\"Gx7a7W_root\",\"actionLabel\":\"Gx7a7W_actionLabel\",\"textfield\":\"Gx7a7W_textfield\",\"content\":\"Gx7a7W_content\",\"header\":\"Gx7a7W_header\",\"table\":\"Gx7a7W_table\",\"actionId\":\"Gx7a7W_actionId\",\"keybindingCell\":\"Gx7a7W_keybindingCell\",\"actionCell\":\"Gx7a7W_actionCell\",\"keyBadge\":\"Gx7a7W_keyBadge\",\"actionInfo\":\"Gx7a7W_actionInfo\",\"actionsCell\":\"Gx7a7W_actionsCell\"}\nexport default classes\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\n\nconst _helpText0 = classes[\"helpText\"]\nexport { _helpText0 as \"helpText\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _actionLabel0 = classes[\"actionLabel\"]\nexport { _actionLabel0 as \"actionLabel\" }\n\nconst _textfield0 = classes[\"textfield\"]\nexport { _textfield0 as \"textfield\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _table0 = classes[\"table\"]\nexport { _table0 as \"table\" }\n\nconst _actionId0 = classes[\"actionId\"]\nexport { _actionId0 as \"actionId\" }\n\nconst _keybindingCell0 = classes[\"keybindingCell\"]\nexport { _keybindingCell0 as \"keybindingCell\" }\n\nconst _actionCell0 = classes[\"actionCell\"]\nexport { _actionCell0 as \"actionCell\" }\n\nconst _keyBadge0 = classes[\"keyBadge\"]\nexport { _keyBadge0 as \"keyBadge\" }\n\nconst _actionInfo0 = classes[\"actionInfo\"]\nexport { _actionInfo0 as \"actionInfo\" }\n\nconst _actionsCell0 = classes[\"actionsCell\"]\nexport { _actionsCell0 as \"actionsCell\" }\n","import { useSystem } from '@/system/provider';\nimport {\n VscodeButton,\n VscodeLabel,\n VscodeTextfield,\n VscodeTable,\n VscodeTableBody,\n VscodeTableCell,\n VscodeTableHeader,\n VscodeTableHeaderCell,\n VscodeTableRow\n} from '@vscode-elements/react-elements';\nimport { useState } from 'react';\nimport { useStore } from 'zustand';\nimport styles from './index.module.css';\nimport { BasePanel } from '../base';\n\nexport const KeymapsPanel = () => {\n const system = useSystem();\n const keymap = useStore(system.hotKeyStore, (s) => s.keymap);\n const descriptions = useStore(system.hotKeyStore, (s) => s.descriptions);\n const register = useStore(system.hotKeyStore, (s) => s.register);\n\n const [editingKey, setEditingKey] = useState<string | null>(null);\n const [editValue, setEditValue] = useState('');\n\n const handleEdit = (action: string) => {\n const current = keymap[action];\n setEditingKey(action);\n setEditValue(Array.isArray(current) ? current.join(', ') : current || '');\n };\n\n const handleSave = (action: string) => {\n const trimmedValue = editValue.trim();\n if (trimmedValue) {\n // Parse the input - if it contains commas, treat as array\n const newValue = trimmedValue.includes(',')\n ? trimmedValue\n .split(',')\n .map((k) => k.trim())\n .filter((k) => k.length > 0)\n : trimmedValue;\n\n register({\n action,\n trigger: newValue\n });\n }\n setEditingKey(null);\n setEditValue('');\n };\n\n const handleCancel = () => {\n setEditingKey(null);\n setEditValue('');\n };\n\n const handleReset = (action: string) => {\n // Reset to default - you might want to store defaults separately\n // For now, this just clears the binding\n const confirmed = confirm(`Reset keybinding for ${action}?`);\n if (confirmed) {\n register({\n action,\n trigger: ''\n });\n setEditingKey(null);\n }\n };\n\n const formatKeymap = (value: string | string[] | undefined): string => {\n if (!value) {\n return 'Not set';\n }\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n return value;\n };\n\n const getDescription = (action: string): string => {\n return descriptions[action] || action;\n };\n\n // Get all actions from keymap\n const actions = Object.keys(keymap).sort();\n\n return (\n <BasePanel>\n <div className={styles.content}>\n <div className={styles.header}>\n <VscodeLabel>Keyboard Shortcuts</VscodeLabel>\n <span className={styles.helpText}>\n Customize keyboard shortcuts for various actions. Use commas to\n separate multiple key combinations.\n </span>\n </div>\n\n <VscodeTable className={styles.table} zebra>\n <VscodeTableHeader slot=\"header\">\n <VscodeTableHeaderCell>Command</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Key Binding</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Actions</VscodeTableHeaderCell>\n </VscodeTableHeader>\n <VscodeTableBody slot=\"body\">\n {actions.map((action) => (\n <VscodeTableRow key={action}>\n <VscodeTableCell className={styles.actionCell}>\n <div className={styles.actionInfo}>\n <div className={styles.actionLabel}>\n {getDescription(action)}\n </div>\n <code className={styles.actionId}>{action}</code>\n </div>\n </VscodeTableCell>\n\n <VscodeTableCell className={styles.keybindingCell}>\n {editingKey === action ? (\n <VscodeTextfield\n value={editValue}\n onChange={(e) => {\n const target = e.target as HTMLInputElement;\n setEditValue(target.value);\n }}\n placeholder=\"e.g., ctrl+k or ctrl+k, command+k\"\n className={styles.textfield}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n handleSave(action);\n } else if (e.key === 'Escape') {\n handleCancel();\n }\n }}\n autoFocus\n />\n ) : (\n <span className={styles.keyBadge}>\n {formatKeymap(keymap[action])}\n </span>\n )}\n </VscodeTableCell>\n\n <VscodeTableCell className={styles.actionsCell}>\n {editingKey === action ? (\n <div className={styles.buttonGroup}>\n <VscodeButton onClick={() => handleSave(action)}>\n Save\n </VscodeButton>\n <VscodeButton onClick={handleCancel}>Cancel</VscodeButton>\n <VscodeButton onClick={() => handleReset(action)}>\n Reset\n </VscodeButton>\n </div>\n ) : (\n <VscodeButton onClick={() => handleEdit(action)}>\n Edit\n </VscodeButton>\n )}\n </VscodeTableCell>\n </VscodeTableRow>\n ))}\n </VscodeTableBody>\n </VscodeTable>\n </div>\n </BasePanel>\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/events/styles.module_built.css\";\nconst classes = {\"parametersEmpty\":\"vQ4f7a_parametersEmpty\",\"parameterFieldLabel\":\"vQ4f7a_parameterFieldLabel\",\"emptyState\":\"vQ4f7a_emptyState\",\"editorHeader\":\"vQ4f7a_editorHeader\",\"eventActions\":\"vQ4f7a_eventActions\",\"header\":\"vQ4f7a_header\",\"parametersHeader\":\"vQ4f7a_parametersHeader\",\"formField\":\"vQ4f7a_formField\",\"parametersGrid\":\"vQ4f7a_parametersGrid\",\"parametersGridHeader\":\"vQ4f7a_parametersGridHeader\",\"parameterField\":\"vQ4f7a_parameterField\",\"emptyStateText\":\"vQ4f7a_emptyStateText\",\"editorFields\":\"vQ4f7a_editorFields\",\"parameterDelete\":\"vQ4f7a_parameterDelete\",\"formGrid\":\"vQ4f7a_formGrid\",\"col1\":\"vQ4f7a_col1\",\"parametersTitle\":\"vQ4f7a_parametersTitle\",\"editorActions\":\"vQ4f7a_editorActions\",\"eventItem\":\"vQ4f7a_eventItem\",\"eventName\":\"vQ4f7a_eventName\",\"actions\":\"vQ4f7a_actions\",\"editRoot\":\"vQ4f7a_editRoot\",\"col4\":\"vQ4f7a_col4\",\"col8\":\"vQ4f7a_col8\",\"eventList\":\"vQ4f7a_eventList\",\"parameterRow\":\"vQ4f7a_parameterRow\",\"parametersContent\":\"vQ4f7a_parametersContent\",\"root\":\"vQ4f7a_root\",\"parametersSection\":\"vQ4f7a_parametersSection\",\"controlWrapper\":\"vQ4f7a_controlWrapper\",\"content\":\"vQ4f7a_content\",\"eventInfo\":\"vQ4f7a_eventInfo\",\"headerTitle\":\"vQ4f7a_headerTitle\",\"formLabel\":\"vQ4f7a_formLabel\",\"eventMeta\":\"vQ4f7a_eventMeta\",\"col3\":\"vQ4f7a_col3\"}\nexport default classes\n\nconst _parametersEmpty0 = classes[\"parametersEmpty\"]\nexport { _parametersEmpty0 as \"parametersEmpty\" }\n\nconst _parameterFieldLabel0 = classes[\"parameterFieldLabel\"]\nexport { _parameterFieldLabel0 as \"parameterFieldLabel\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _editorHeader0 = classes[\"editorHeader\"]\nexport { _editorHeader0 as \"editorHeader\" }\n\nconst _eventActions0 = classes[\"eventActions\"]\nexport { _eventActions0 as \"eventActions\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _parametersHeader0 = classes[\"parametersHeader\"]\nexport { _parametersHeader0 as \"parametersHeader\" }\n\nconst _formField0 = classes[\"formField\"]\nexport { _formField0 as \"formField\" }\n\nconst _parametersGrid0 = classes[\"parametersGrid\"]\nexport { _parametersGrid0 as \"parametersGrid\" }\n\nconst _parametersGridHeader0 = classes[\"parametersGridHeader\"]\nexport { _parametersGridHeader0 as \"parametersGridHeader\" }\n\nconst _parameterField0 = classes[\"parameterField\"]\nexport { _parameterField0 as \"parameterField\" }\n\nconst _emptyStateText0 = classes[\"emptyStateText\"]\nexport { _emptyStateText0 as \"emptyStateText\" }\n\nconst _editorFields0 = classes[\"editorFields\"]\nexport { _editorFields0 as \"editorFields\" }\n\nconst _parameterDelete0 = classes[\"parameterDelete\"]\nexport { _parameterDelete0 as \"parameterDelete\" }\n\nconst _formGrid0 = classes[\"formGrid\"]\nexport { _formGrid0 as \"formGrid\" }\n\nconst _col10 = classes[\"col1\"]\nexport { _col10 as \"col1\" }\n\nconst _parametersTitle0 = classes[\"parametersTitle\"]\nexport { _parametersTitle0 as \"parametersTitle\" }\n\nconst _editorActions0 = classes[\"editorActions\"]\nexport { _editorActions0 as \"editorActions\" }\n\nconst _eventItem0 = classes[\"eventItem\"]\nexport { _eventItem0 as \"eventItem\" }\n\nconst _eventName0 = classes[\"eventName\"]\nexport { _eventName0 as \"eventName\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n\nconst _editRoot0 = classes[\"editRoot\"]\nexport { _editRoot0 as \"editRoot\" }\n\nconst _col40 = classes[\"col4\"]\nexport { _col40 as \"col4\" }\n\nconst _col80 = classes[\"col8\"]\nexport { _col80 as \"col8\" }\n\nconst _eventList0 = classes[\"eventList\"]\nexport { _eventList0 as \"eventList\" }\n\nconst _parameterRow0 = classes[\"parameterRow\"]\nexport { _parameterRow0 as \"parameterRow\" }\n\nconst _parametersContent0 = classes[\"parametersContent\"]\nexport { _parametersContent0 as \"parametersContent\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _parametersSection0 = classes[\"parametersSection\"]\nexport { _parametersSection0 as \"parametersSection\" }\n\nconst _controlWrapper0 = classes[\"controlWrapper\"]\nexport { _controlWrapper0 as \"controlWrapper\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _eventInfo0 = classes[\"eventInfo\"]\nexport { _eventInfo0 as \"eventInfo\" }\n\nconst _headerTitle0 = classes[\"headerTitle\"]\nexport { _headerTitle0 as \"headerTitle\" }\n\nconst _formLabel0 = classes[\"formLabel\"]\nexport { _formLabel0 as \"formLabel\" }\n\nconst _eventMeta0 = classes[\"eventMeta\"]\nexport { _eventMeta0 as \"eventMeta\" }\n\nconst _col30 = classes[\"col3\"]\nexport { _col30 as \"col3\" }\n","import React, { useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeDivider,\n VscodeTree,\n VscodeTreeItem\n} from '@vscode-elements/react-elements';\nimport { Plus, Edit } from 'iconoir-react';\n\nimport { useSystem } from '@/system';\nimport styles from './styles.module.css';\nimport { BasePanel } from '../base';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport { Icon } from '@/components/primitives/icon';\n\ntype CustomEventJSON = NonNullable<GraphJSON['customEvents']>[number];\n\nconst nextNumericId = (events: Array<{ id: string }>) => {\n const used = new Set(events.map((e) => String(e.id)));\n let i = 0;\n while (used.has(String(i))) i += 1;\n return String(i);\n};\n\ninterface ManageEventsPanelProps {\n onSelectEvent: (eventUiId: string) => void;\n}\n\nexport const ManageEventsPanel: React.FC<ManageEventsPanelProps> = ({\n onSelectEvent\n}) => {\n const system = useSystem();\n const rawEvents = useStore(system.eventsStore, (s) => s.customEvents);\n\n const persistedEvents = useMemo(() => Object.values(rawEvents), [rawEvents]);\n\n const addNewEvent = () => {\n const nextId = nextNumericId(persistedEvents);\n const created: CustomEventJSON = {\n id: nextId,\n name: 'NewCustomEvent',\n parameters: []\n };\n\n system.eventsStore.getState().addCustomEvent(created);\n onSelectEvent(created.id);\n };\n\n return (\n <BasePanel>\n <div className={styles.root}>\n <div className={styles.header}>\n <h2 className={styles.headerTitle}>Custom Events</h2>\n <Icon title=\"New event\" onClick={addNewEvent}>\n <Plus />\n </Icon>\n </div>\n <VscodeDivider />\n <div className={styles.content}>\n {persistedEvents.length === 0 ? (\n <div className={styles.emptyState}>\n <div className={styles.emptyStateText}>No custom events yet.</div>\n </div>\n ) : (\n <VscodeTree>\n {persistedEvents.map((evt) => {\n const eventId = String(evt.id ?? '');\n const paramCount = (evt.parameters ?? []).length;\n\n return (\n <VscodeTreeItem key={evt.id}>\n <div className={styles.eventName}>\n {evt.name ?? 'CustomEvent'}\n </div>\n <div slot=\"description\">\n <div className={styles.eventMeta}>\n ID: {eventId} • {paramCount} parameter\n {paramCount !== 1 ? 's' : ''}\n </div>\n </div>\n <div slot=\"actions\">\n <Icon\n title=\"Edit event\"\n onClick={() => onSelectEvent(eventId)}\n >\n <Edit width={16} height={16} />\n </Icon>\n </div>\n </VscodeTreeItem>\n );\n })}\n </VscodeTree>\n )}\n </div>\n </div>\n </BasePanel>\n );\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeBadge,\n VscodeButton,\n VscodeOption,\n VscodeSingleSelect,\n VscodeTextfield\n} from '@vscode-elements/react-elements';\n\nimport { useSystem } from '@/system';\nimport { BasePanel } from '../base';\nimport styles from './styles.module.css';\nimport type { ExtendedCustomEventJSON } from '@/store/events';\nimport { Plus, Trash, ArrowLeft, FloppyDisk, TrashSolid } from 'iconoir-react';\nimport { Icon } from '@/components/primitives/icon';\n\ntype CustomEventParameterJSON = NonNullable<\n ExtendedCustomEventJSON['parameters']\n>[number];\n\ninterface EditEventPanelProps {\n eventUiId: string | null;\n onBack: () => void;\n}\n\nexport const EditEventPanel: React.FC<EditEventPanelProps> = ({\n eventUiId,\n onBack\n}) => {\n const system = useSystem();\n\n const rawEvents = useStore(system.eventsStore, (s) => s.customEvents);\n\n const controls = useStore(system.controlStore, (s) => s.controls);\n const defaultControl = useStore(system.controlStore, (s) => s.defaultControl);\n const registry = useStore(system.registry);\n\n const valueTypeOptions = useMemo(\n () => Object.keys(controls).sort((a, b) => a.localeCompare(b)),\n [controls]\n );\n\n const [draftEvent, setDraftEvent] = useState<ExtendedCustomEventJSON | null>(\n null\n );\n const [isDirty, setIsDirty] = useState(true);\n const isReadonly = draftEvent?.readonly === true;\n // Load event when eventUiId changes\n useEffect(() => {\n if (!eventUiId) {\n setDraftEvent(null);\n setIsDirty(true);\n return;\n }\n\n const event = rawEvents[eventUiId];\n if (event) {\n setDraftEvent({ ...event });\n setIsDirty(true);\n }\n }, [eventUiId, rawEvents]);\n\n const updateDraft = (patch: Partial<ExtendedCustomEventJSON>) => {\n if (!draftEvent || isReadonly) return;\n setDraftEvent({ ...draftEvent, ...patch });\n setIsDirty(true);\n };\n\n const addParameter = () => {\n if (!draftEvent || isReadonly) return;\n\n const vt = valueTypeOptions[0] ?? 'string';\n const valueType = registry.values[vt];\n const defaultValue = valueType ? valueType.creator() : '';\n\n const parameters = [\n ...(draftEvent.parameters ?? []),\n {\n name: 'param',\n valueTypeName: vt,\n defaultValue\n }\n ];\n\n updateDraft({ parameters });\n };\n\n const updateParameter = (\n index: number,\n patch: Partial<CustomEventParameterJSON>\n ) => {\n if (!draftEvent || isReadonly) return;\n\n const parameters = [...(draftEvent.parameters ?? [])];\n if (!parameters[index]) return;\n\n // If valueTypeName is being changed, reset defaultValue to the new type's default\n if (\n patch.valueTypeName !== undefined &&\n patch.valueTypeName !== parameters[index]?.valueTypeName\n ) {\n const valueType = registry.values[patch.valueTypeName];\n if (valueType) {\n patch.defaultValue = valueType.creator();\n }\n }\n\n parameters[index] = {\n ...parameters[index],\n ...patch\n } as CustomEventParameterJSON;\n updateDraft({ parameters });\n };\n\n const removeParameter = (index: number) => {\n if (!draftEvent || isReadonly) return;\n\n const parameters = [...(draftEvent.parameters ?? [])];\n parameters.splice(index, 1);\n updateDraft({ parameters });\n };\n\n const saveEvent = () => {\n if (!draftEvent || !eventUiId || isReadonly) return;\n system.eventsStore.getState().addCustomEvent(draftEvent);\n setIsDirty(false);\n onBack();\n };\n\n const deleteEvent = () => {\n if (!draftEvent || isReadonly) return;\n\n system.eventsStore.getState().removeCustomEvent(String(draftEvent.id));\n onBack();\n };\n\n if (!draftEvent) {\n return (\n <BasePanel>\n <div className=\"h-full w-full flex items-center justify-center p-4\">\n <div className=\"text-gray-500 text-center\">\n Select an event to edit\n </div>\n </div>\n </BasePanel>\n );\n }\n\n const parameters = draftEvent.parameters ?? [];\n\n return (\n <BasePanel>\n <div className={styles.editRoot}>\n <div className={styles.editorHeader}>\n <VscodeButton\n iconOnly\n secondary\n onClick={onBack}\n title=\"Back to list\"\n >\n <ArrowLeft width={16} height={16} />\n </VscodeButton>\n <h2 className={styles.headerTitle}>\n Edit Event\n {isReadonly && <VscodeBadge>Read-only</VscodeBadge>}\n </h2>\n </div>\n\n <div className={styles.editorFields}>\n <div className={styles.formGrid}>\n <div className={`${styles.formField}`}>\n <div className={styles.formLabel}>id</div>\n <VscodeTextfield\n value={String(draftEvent.id)}\n onInput={(e: Event) => {\n const target = e.target as HTMLInputElement;\n updateDraft({ id: String(target.value) });\n }}\n disabled={isReadonly}\n />\n </div>\n\n <div className={`${styles.formField}`}>\n <div className={styles.formLabel}>name</div>\n <VscodeTextfield\n value={String(draftEvent.name)}\n onInput={(e: Event) => {\n const target = e.target as HTMLInputElement;\n updateDraft({ name: String(target.value) });\n }}\n disabled={isReadonly}\n />\n </div>\n </div>\n </div>\n\n <div className={styles.parametersSection}>\n <div className={styles.parametersHeader}>\n <div className={styles.parametersTitle}>Parameters</div>\n {!isReadonly && (\n <Icon title=\"Add parameter\" onClick={addParameter}>\n <Plus />\n </Icon>\n )}\n </div>\n <div className={styles.parametersContent}>\n {parameters.length === 0 ? (\n <div className={styles.parametersEmpty}>No parameters.</div>\n ) : (\n <div className={styles.parametersGrid}>\n {parameters.map((param, index) => {\n const Control =\n controls[String(param.valueTypeName)] ?? defaultControl;\n\n return (\n <div key={index} className={styles.parameterRow}>\n <div className={styles.parameterField}>\n <div>\n <div className={styles.parameterFieldLabel}>name</div>\n {!isReadonly && (\n <Icon\n className={styles.parameterDelete}\n title=\"Delete parameter\"\n onClick={() => removeParameter(index)}\n >\n <TrashSolid />\n </Icon>\n )}\n </div>\n <VscodeTextfield\n style={{ width: '100%' }}\n value={String(param.name)}\n onInput={(e: Event) => {\n const target = e.target as HTMLInputElement;\n updateParameter(index, {\n name: String(target.value)\n });\n }}\n disabled={isReadonly}\n />\n </div>\n\n <div className={styles.parameterField}>\n <div className={styles.parameterFieldLabel}>type</div>\n <VscodeSingleSelect\n value={String(param.valueTypeName)}\n onChange={(e: Event) => {\n const target = e.target as HTMLSelectElement;\n updateParameter(index, {\n valueTypeName: String(target.value)\n });\n }}\n disabled={isReadonly}\n >\n {valueTypeOptions.map((vt) => (\n <VscodeOption key={vt} value={vt}>\n {vt}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n </div>\n\n <div className={styles.parameterField}>\n <div className={styles.parameterFieldLabel}>\n default\n </div>\n <div\n className={styles.controlWrapper}\n style={{\n opacity: isReadonly ? 0.5 : 1,\n pointerEvents: isReadonly ? 'none' : 'auto'\n }}\n >\n <Control\n value={param.defaultValue}\n onChange={(v) =>\n updateParameter(index, { defaultValue: v })\n }\n valueType={String(param.valueTypeName)}\n />\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n <div className={styles.editorActions}>\n <div className={styles.actions}>\n <VscodeButton\n iconOnly\n onClick={saveEvent}\n disabled={!isDirty || isReadonly}\n >\n <FloppyDisk width={16} height={16} />\n Save\n </VscodeButton>\n <VscodeButton\n iconOnly\n secondary\n onClick={deleteEvent}\n disabled={isReadonly}\n >\n <Trash width={16} height={16} />\n </VscodeButton>\n </div>\n </div>\n </div>\n </BasePanel>\n );\n};\n","import React, { useState } from 'react';\n\nimport { ManageEventsPanel } from './ManageEventsPanel';\nimport { EditEventPanel } from './EditEventPanel';\n\n/**\n * Events Panel\n * Focus: define Custom Events (with arbitrary parameters) for the current graph.\n */\nexport const EventsPanel = () => {\n const [selectedEventUiId, setSelectedEventUiId] = useState<string | null>(\n null\n );\n\n return selectedEventUiId ? (\n <EditEventPanel\n eventUiId={selectedEventUiId}\n onBack={() => setSelectedEventUiId(null)}\n />\n ) : (\n <ManageEventsPanel onSelectEvent={setSelectedEventUiId} />\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/traces/index.module_built.css\";\nconst classes = {\"scroll\":\"na343q_scroll\",\"tooltipDuration\":\"na343q_tooltipDuration\",\"title\":\"na343q_title\",\"statValue\":\"na343q_statValue\",\"empty\":\"na343q_empty\",\"span\":\"na343q_span\",\"windowSelect\":\"na343q_windowSelect\",\"tooltip\":\"na343q_tooltip\",\"root\":\"na343q_root\",\"tooltipNodeId\":\"na343q_tooltipNodeId\",\"tooltipTitle\":\"na343q_tooltipTitle\",\"spanLabel\":\"na343q_spanLabel\",\"stats\":\"na343q_stats\",\"laneRow\":\"na343q_laneRow\",\"header\":\"na343q_header\",\"lanes\":\"na343q_lanes\",\"windowLabel\":\"na343q_windowLabel\",\"subtitle\":\"na343q_subtitle\",\"windowControls\":\"na343q_windowControls\"}\nexport default classes\n\nconst _scroll0 = classes[\"scroll\"]\nexport { _scroll0 as \"scroll\" }\n\nconst _tooltipDuration0 = classes[\"tooltipDuration\"]\nexport { _tooltipDuration0 as \"tooltipDuration\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _statValue0 = classes[\"statValue\"]\nexport { _statValue0 as \"statValue\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _span0 = classes[\"span\"]\nexport { _span0 as \"span\" }\n\nconst _windowSelect0 = classes[\"windowSelect\"]\nexport { _windowSelect0 as \"windowSelect\" }\n\nconst _tooltip0 = classes[\"tooltip\"]\nexport { _tooltip0 as \"tooltip\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _tooltipNodeId0 = classes[\"tooltipNodeId\"]\nexport { _tooltipNodeId0 as \"tooltipNodeId\" }\n\nconst _tooltipTitle0 = classes[\"tooltipTitle\"]\nexport { _tooltipTitle0 as \"tooltipTitle\" }\n\nconst _spanLabel0 = classes[\"spanLabel\"]\nexport { _spanLabel0 as \"spanLabel\" }\n\nconst _stats0 = classes[\"stats\"]\nexport { _stats0 as \"stats\" }\n\nconst _laneRow0 = classes[\"laneRow\"]\nexport { _laneRow0 as \"laneRow\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _lanes0 = classes[\"lanes\"]\nexport { _lanes0 as \"lanes\" }\n\nconst _windowLabel0 = classes[\"windowLabel\"]\nexport { _windowLabel0 as \"windowLabel\" }\n\nconst _subtitle0 = classes[\"subtitle\"]\nexport { _subtitle0 as \"subtitle\" }\n\nconst _windowControls0 = classes[\"windowControls\"]\nexport { _windowControls0 as \"windowControls\" }\n","export const hashToHue = (str: string): number => {\n let hash = 0;\n for (let i = 0; i < str.length; i++)\n hash = (hash * 31 + str.charCodeAt(i)) | 0;\n return Math.abs(hash) % 360;\n};\n\nexport const clamp = (v: number, min: number, max: number): number =>\n Math.max(min, Math.min(max, v));\n\nconst NICE_INTERVALS = [\n 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000\n] as const;\n\n/**\n * Picks a \"nice\" round interval for time-axis grid lines.\n * Targets roughly 8 ticks across the visible range.\n */\nexport const calculateTimeInterval = (rangeMs: number): number => {\n const rawInterval = rangeMs / 8;\n for (const mag of NICE_INTERVALS) {\n if (mag >= rawInterval) return mag;\n }\n return NICE_INTERVALS[NICE_INTERVALS.length - 1]!;\n};\n","import { useMemo } from 'react';\nimport type { SpanCollector } from '@/store/traces';\nimport type {\n DerivedData,\n LaneData,\n Tick,\n ViewState,\n VisualSpan\n} from './types';\nimport { calculateTimeInterval, clamp, hashToHue } from './utils';\n\nconst MIN_WIDTH_PCT = 0.5;\nconst OVERLAP_EPSILON_PCT = 0.5;\n\nconst EMPTY: DerivedData = {\n now: 0,\n size: 0,\n lanes: 0,\n minStart: 0,\n maxEnd: 0,\n range: 1,\n viewStart: 0,\n viewEnd: 0,\n viewRange: 1,\n buckets: [],\n laneData: [],\n ticks: []\n};\n\nfunction computeTicks(\n viewStart: number,\n viewEnd: number,\n viewRange: number\n): Tick[] {\n const interval = calculateTimeInterval(viewRange);\n const firstTick = Math.ceil(viewStart / interval) * interval;\n const ticks: Tick[] = [];\n for (let t = firstTick; t <= viewEnd; t += interval) {\n const leftPct = ((t - viewStart) / viewRange) * 100;\n if (leftPct >= 0 && leftPct <= 100) {\n ticks.push({ time: t, leftPct });\n }\n }\n return ticks;\n}\n\nexport function useDerivedSpans(\n collector: SpanCollector,\n version: number,\n windowMs: number,\n view: ViewState\n): DerivedData {\n return useMemo(() => {\n const now = performance.now();\n const { capacity, size, writeIndex, spans } = collector;\n\n if (size <= 0) return { ...EMPTY, now };\n\n let minStart = Number.POSITIVE_INFINITY;\n let maxEnd = Number.NEGATIVE_INFINITY;\n let maxLane = -1;\n\n const buckets: Array<import('@/store/traces').TraceSpan[]> = [];\n\n const startIndex = (writeIndex - size + capacity) % capacity;\n for (let i = 0; i < size; i++) {\n const idx = (startIndex + i) % capacity;\n const s = spans[idx];\n if (!s) continue;\n\n const end = Number.isNaN(s.end) ? now : s.end;\n minStart = Math.min(minStart, s.start);\n maxEnd = Math.max(maxEnd, end);\n maxLane = Math.max(maxLane, s.lane);\n\n (buckets[s.lane] ??= []).push(s);\n }\n\n if (\n !Number.isFinite(minStart) ||\n !Number.isFinite(maxEnd) ||\n maxEnd <= minStart\n ) {\n return {\n ...EMPTY,\n now,\n size,\n lanes: maxLane + 1,\n buckets,\n laneData: []\n };\n }\n\n const fullRange = Math.max(1, maxEnd - minStart);\n\n const desiredRange = windowMs <= 0 ? fullRange : Math.max(1, windowMs);\n const desiredStart = Math.max(minStart, maxEnd - desiredRange);\n\n const effectiveRange = clamp(\n view.follow ? desiredRange : view.range,\n 1,\n fullRange\n );\n const effectiveStart = clamp(\n view.follow ? desiredStart : view.start,\n minStart,\n maxEnd - effectiveRange\n );\n\n const viewStart = effectiveStart;\n const viewEnd = viewStart + effectiveRange;\n const viewRange = effectiveRange;\n\n const laneData: LaneData[] = Array.from({ length: maxLane + 1 }, () => ({\n stackCount: 1,\n visualSpans: [] as VisualSpan[]\n }));\n\n for (let lane = 0; lane <= maxLane; lane++) {\n const laneSpans = buckets[lane];\n if (!laneSpans || laneSpans.length === 0) {\n laneData[lane] = { stackCount: 1, visualSpans: [] };\n continue;\n }\n\n const tmp: Array<{\n span: import('@/store/traces').TraceSpan;\n leftPct: number;\n widthPct: number;\n rightPct: number;\n durationMs: number;\n }> = [];\n\n for (const s of laneSpans) {\n const end = Number.isNaN(s.end) ? now : s.end;\n if (end < viewStart || s.start > viewEnd) continue;\n\n const visibleStart = Math.max(s.start, viewStart);\n const visibleEnd = Math.min(end, viewEnd);\n if (visibleEnd <= visibleStart) continue;\n\n const rawLeft = ((visibleStart - viewStart) / viewRange) * 100;\n const rawWidth = ((visibleEnd - visibleStart) / viewRange) * 100;\n const leftPct = clamp(rawLeft, 0, 100);\n const widthPct = clamp(\n Math.max(MIN_WIDTH_PCT, rawWidth),\n 0,\n 100 - leftPct\n );\n const rightPct = leftPct + widthPct;\n const durationMs = Math.max(0, end - s.start);\n\n tmp.push({ span: s, leftPct, widthPct, rightPct, durationMs });\n }\n\n tmp.sort((a, b) => a.leftPct - b.leftPct);\n\n const stackRight: number[] = [];\n const visualSpans: VisualSpan[] = [];\n\n for (const v of tmp) {\n let stack = 0;\n for (; stack < stackRight.length; stack++) {\n if (v.leftPct >= stackRight[stack]! + OVERLAP_EPSILON_PCT) break;\n }\n if (stack === stackRight.length) stackRight.push(v.rightPct);\n else stackRight[stack] = Math.max(stackRight[stack]!, v.rightPct);\n\n const hue = hashToHue(v.span.nodeId);\n const isOpen = Number.isNaN(v.span.end);\n const lightness = clamp(56 - stack * 7, 30, 60);\n const bg = isOpen\n ? `hsla(${hue}, 80%, ${clamp(lightness + 6, 30, 65)}%, 0.35)`\n : `hsla(${hue}, 80%, ${lightness}%, 0.6)`;\n const border = `hsla(${hue}, 90%, ${clamp(lightness + 22, 45, 80)}%, 0.95)`;\n\n visualSpans.push({\n span: v.span,\n leftPct: v.leftPct,\n widthPct: v.widthPct,\n rightPct: v.rightPct,\n durationMs: v.durationMs,\n stack,\n bg,\n border\n });\n }\n\n laneData[lane] = {\n stackCount: Math.max(1, stackRight.length),\n visualSpans\n };\n }\n\n const ticks = computeTicks(viewStart, viewEnd, viewRange);\n\n return {\n now,\n size,\n lanes: maxLane + 1,\n minStart,\n maxEnd,\n range: fullRange,\n viewStart,\n viewEnd,\n viewRange,\n buckets,\n laneData,\n ticks\n };\n }, [collector, version, windowMs, view.follow, view.range, view.start]);\n}\n","import { memo } from 'react';\nimport { VscodeButton } from '@vscode-elements/react-elements';\nimport styles from './index.module.css';\n\ntype TracesHeaderProps = {\n size: number;\n lanes: number;\n windowMs: number;\n expanded: boolean;\n onWindowChange: (ms: number) => void;\n onToggleExpanded: () => void;\n};\n\nexport const TracesHeader = memo(function TracesHeader({\n size,\n lanes,\n windowMs,\n expanded,\n onWindowChange,\n onToggleExpanded\n}: TracesHeaderProps) {\n return (\n <div className={styles.header}>\n <h2 className={styles.title}>Traces</h2>\n <div className={styles.subtitle}>Node execution spans</div>\n <div className={styles.windowControls}>\n <label className={styles.windowLabel}>\n <span>Window</span>\n <select\n className={styles.windowSelect}\n value={windowMs}\n onChange={(e) => onWindowChange(Number(e.target.value))}\n >\n <option value={100}>100 ms</option>\n <option value={500}>500 ms</option>\n <option value={1000}>1 s</option>\n <option value={5000}>5 s</option>\n <option value={30000}>30 s</option>\n <option value={0}>Fit all</option>\n </select>\n </label>\n <VscodeButton onClick={onToggleExpanded} type=\"button\">\n {expanded ? 'Condensed' : 'Expanded'}\n </VscodeButton>\n </div>\n <div className={styles.stats}>\n <div>\n <span className={styles.statValue}>{size}</span> spans\n </div>\n <div>\n <span className={styles.statValue}>{lanes}</span> lanes\n </div>\n </div>\n </div>\n );\n});\n","import { memo } from 'react';\nimport type { Tick } from './types';\n\nconst TICK_STYLE: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n bottom: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center'\n};\n\nconst LABEL_STYLE: React.CSSProperties = {\n fontSize: '10px',\n color: 'var(--vscode-descriptionForeground)',\n padding: '2px 4px',\n whiteSpace: 'nowrap'\n};\n\ntype TimeGridProps = {\n ticks: Tick[];\n padding: number;\n};\n\nexport const TimeGrid = memo(function TimeGrid({\n ticks,\n padding\n}: TimeGridProps) {\n return (\n <div\n style={{\n position: 'sticky',\n top: 0,\n height: 24,\n background: 'var(--vscode-editor-background)',\n borderBottom: '1px solid var(--vscode-panel-border)',\n zIndex: 10,\n padding: `0 ${padding}px`\n }}\n >\n {ticks.map(({ time, leftPct }) => (\n <div key={time} style={{ ...TICK_STYLE, left: `${leftPct}%` }}>\n <div style={LABEL_STYLE}>{time.toFixed(0)}ms</div>\n </div>\n ))}\n </div>\n );\n});\n","import { memo } from 'react';\nimport type { Tick } from './types';\n\nconst LINE_STYLE_BASE: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n bottom: 0,\n width: 1,\n backgroundColor: 'var(--vscode-panel-border)',\n opacity: 0.3\n};\n\ntype GridLinesProps = {\n ticks: Tick[];\n padding: number;\n};\n\nexport const GridLines = memo(function GridLines({\n ticks,\n padding\n}: GridLinesProps) {\n return (\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: padding,\n right: padding,\n bottom: 0,\n pointerEvents: 'none'\n }}\n >\n {ticks.map(({ time, leftPct }) => (\n <div key={time} style={{ ...LINE_STYLE_BASE, left: `${leftPct}%` }} />\n ))}\n </div>\n );\n});\n","import { memo } from 'react';\nimport type { LaneData } from './types';\nimport styles from './index.module.css';\n\ntype TraceLaneProps = {\n laneData: LaneData;\n laneHeight: number;\n expanded: boolean;\n hoveredSpanId: number | undefined;\n};\n\n/**\n * Renders a single lane's spans.\n *\n * Event handling for hover/click is delegated to the parent scroll\n * container via `data-*` attributes — no per-span closures needed.\n */\nexport const TraceLane = memo(function TraceLane({\n laneData,\n laneHeight,\n expanded,\n hoveredSpanId\n}: TraceLaneProps) {\n return (\n <div\n className={styles.laneRow}\n style={{ height: laneHeight * laneData.stackCount }}\n >\n {laneData.visualSpans.map((v) => {\n const isHover = hoveredSpanId === v.span.id;\n const showLabel = expanded && v.widthPct > 5;\n return (\n <div\n key={v.span.id}\n data-trace-span=\"\"\n data-span-id={v.span.id}\n data-node-id={v.span.nodeId}\n data-span-name={v.span.name}\n data-span-duration={v.durationMs.toFixed(2)}\n className={styles.span}\n style={{\n top: v.stack * laneHeight + 3,\n height: laneHeight - 6,\n left: `${v.leftPct}%`,\n width: `${v.widthPct}%`,\n minWidth: 3,\n backgroundColor: v.bg,\n borderColor: isHover ? 'rgba(229,231,235,0.9)' : v.border\n }}\n title={`${v.span.name}\\n${v.durationMs.toFixed(2)} ms\\n${v.span.nodeId}`}\n >\n {showLabel && (\n <span className={styles.spanLabel}>\n {v.span.name} ({v.durationMs.toFixed(1)}ms)\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n});\n","import { memo } from 'react';\nimport type { HoverInfo } from './types';\nimport styles from './index.module.css';\n\ntype TraceTooltipProps = {\n hover: HoverInfo | null;\n};\n\nexport const TraceTooltip = memo(function TraceTooltip({\n hover\n}: TraceTooltipProps) {\n if (!hover?.span) return null;\n return (\n <div className={styles.tooltip}>\n <div className={styles.tooltipTitle}>{hover.span.name}</div>\n <div className={styles.tooltipDuration}>\n {hover.durationMs?.toFixed(2)} ms\n </div>\n <div className={styles.tooltipNodeId}>{hover.span.nodeId}</div>\n </div>\n );\n});\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useStore } from 'zustand';\nimport { useSystem } from '@/system';\nimport type { TraceSpan } from '@/store/traces';\nimport { VscodeButton, VscodeDivider } from '@vscode-elements/react-elements';\nimport styles from './index.module.css';\nimport { BasePanel } from '../base';\nimport type { HoverInfo, ViewState } from './types';\nimport { clamp } from './utils';\nimport { useDerivedSpans } from './useDerivedSpans';\nimport { TracesHeader } from './TracesHeader';\nimport { TimeGrid } from './TimeGrid';\nimport { GridLines } from './GridLines';\nimport { TraceLane } from './TraceLane';\nimport { TraceTooltip } from './TraceTooltip';\n\nconst PADDING = 8;\n\nexport function TracesPanel() {\n const system = useSystem();\n const version = useStore(system.traceStore, (s) => s.version);\n const clear = useStore(system.traceStore, (s) => s.clear);\n const collector = system.traceStore.getState().collector;\n\n const [hover, setHover] = useState<HoverInfo | null>(null);\n const [windowMs, setWindowMs] = useState<number>(5000);\n const [expanded, setExpanded] = useState<boolean>(false);\n const [view, setView] = useState<ViewState>(() => ({\n start: 0,\n range: 5000,\n follow: true\n }));\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const dragRef = useRef<{\n dragging: boolean;\n startClientX: number;\n startViewStart: number;\n startViewRange: number;\n }>({\n dragging: false,\n startClientX: 0,\n startViewStart: 0,\n startViewRange: 0\n });\n\n const laneHeight = expanded ? 32 : 16;\n\n const derived = useDerivedSpans(collector, version, windowMs, view);\n\n // Keep the view aligned to the selector when following.\n useEffect(() => {\n if (derived.size <= 0 || !view.follow) return;\n const desiredRange = windowMs <= 0 ? derived.range : Math.max(1, windowMs);\n const range = clamp(desiredRange, 1, derived.range);\n const start = clamp(\n derived.maxEnd - range,\n derived.minStart,\n derived.maxEnd - range\n );\n setView((v) =>\n v.range === range && v.start === start ? v : { ...v, range, start }\n );\n }, [\n derived.size,\n derived.range,\n derived.minStart,\n derived.maxEnd,\n windowMs,\n view.follow\n ]);\n\n const clampViewStart = useCallback(\n (start: number, range: number) =>\n clamp(start, derived.minStart, derived.maxEnd - range),\n [derived.minStart, derived.maxEnd]\n );\n\n // ---------- Event delegation for span hover / click ----------\n\n const findSpanElement = (target: EventTarget | null): HTMLElement | null => {\n let el = target as HTMLElement | null;\n while (el && !el.hasAttribute('data-trace-span')) {\n if (el === scrollRef.current) return null;\n el = el.parentElement;\n }\n return el;\n };\n\n const handleDelegatedMouseOver = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const spanEl = findSpanElement(e.target);\n if (!spanEl) return;\n const name = spanEl.getAttribute('data-span-name') ?? '';\n const nodeId = spanEl.getAttribute('data-node-id') ?? '';\n const durationMs = Number(\n spanEl.getAttribute('data-span-duration') ?? '0'\n );\n const id = Number(spanEl.getAttribute('data-span-id') ?? '0');\n setHover({\n span: { id, nodeId, name } as TraceSpan,\n durationMs\n });\n },\n []\n );\n\n const handleDelegatedMouseOut = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const spanEl = findSpanElement(e.relatedTarget);\n if (!spanEl) setHover(null);\n },\n []\n );\n\n const handleDelegatedClick = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n const spanEl = findSpanElement(e.target);\n if (!spanEl) return;\n const nodeId = spanEl.getAttribute('data-node-id');\n if (!nodeId) return;\n system.actionStore.getState().actions.focusNode(nodeId);\n system.selectionStore.getState().setSelectedNodeId(nodeId);\n },\n [system.actionStore, system.selectionStore]\n );\n\n // ---------- Wheel zoom / pan ----------\n\n const handleWheel = useCallback(\n (e: React.WheelEvent<HTMLDivElement>) => {\n if (derived.size === 0) return;\n\n const el = scrollRef.current;\n if (el) {\n const canScroll = el.scrollHeight > el.clientHeight;\n if (canScroll) {\n const atTop = el.scrollTop <= 0;\n const atBottom =\n el.scrollTop + el.clientHeight >= el.scrollHeight - 1;\n const wouldScroll =\n (e.deltaY > 0 && !atBottom) || (e.deltaY < 0 && !atTop);\n if (wouldScroll && !e.shiftKey) return;\n }\n }\n\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const x = clamp(e.clientX - rect.left, 0, rect.width);\n const t =\n derived.viewStart + (x / Math.max(1, rect.width)) * derived.viewRange;\n\n if (e.shiftKey) {\n const deltaT = (e.deltaY / Math.max(1, rect.width)) * derived.viewRange;\n setView((v) => {\n const start = clampViewStart(v.start + deltaT, v.range);\n return { ...v, start, follow: false };\n });\n e.preventDefault();\n return;\n }\n\n const zoomFactor = Math.exp(e.deltaY * 0.0015);\n setView((v) => {\n const nextRange = clamp(v.range * zoomFactor, 1, derived.range);\n const k = x / Math.max(1, rect.width);\n const nextStart = clampViewStart(t - k * nextRange, nextRange);\n return {\n ...v,\n range: nextRange,\n start: nextStart,\n follow: false\n };\n });\n e.preventDefault();\n },\n [\n derived.size,\n derived.viewStart,\n derived.viewRange,\n derived.range,\n clampViewStart\n ]\n );\n\n // ---------- Drag pan ----------\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (derived.size === 0) return;\n const target = e.target as HTMLElement | null;\n if (target?.closest('[data-trace-span]')) return;\n dragRef.current.dragging = true;\n dragRef.current.startClientX = e.clientX;\n dragRef.current.startViewStart = derived.viewStart;\n dragRef.current.startViewRange = derived.viewRange;\n setView((v) => ({ ...v, follow: false }));\n },\n [derived.size, derived.viewStart, derived.viewRange]\n );\n\n const handleMouseMove = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (!dragRef.current.dragging) return;\n const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect();\n const dx = e.clientX - dragRef.current.startClientX;\n const deltaT =\n (-dx / Math.max(1, rect.width)) * dragRef.current.startViewRange;\n const nextStart = clampViewStart(\n dragRef.current.startViewStart + deltaT,\n dragRef.current.startViewRange\n );\n setView((v) => ({ ...v, start: nextStart }));\n },\n [clampViewStart]\n );\n\n const stopDrag = useCallback(() => {\n dragRef.current.dragging = false;\n }, []);\n\n // ---------- Header callbacks ----------\n\n const handleWindowChange = useCallback((ms: number) => {\n setWindowMs(ms);\n setView((v) => ({ ...v, follow: true }));\n }, []);\n\n const handleToggleExpanded = useCallback(() => {\n setExpanded((prev) => !prev);\n }, []);\n\n const handleClear = useCallback(() => clear(), [clear]);\n\n return (\n <BasePanel>\n <TracesHeader\n size={derived.size}\n lanes={derived.lanes}\n windowMs={windowMs}\n expanded={expanded}\n onWindowChange={handleWindowChange}\n onToggleExpanded={handleToggleExpanded}\n />\n <VscodeDivider />\n\n {derived.size === 0 ? (\n <div className={styles.empty}>\n No spans captured yet. Run/trigger the graph to record node execution.\n </div>\n ) : (\n <div\n ref={scrollRef}\n className={styles.scroll}\n onWheel={handleWheel}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={stopDrag}\n onMouseLeave={stopDrag}\n onMouseOver={handleDelegatedMouseOver}\n onMouseOut={handleDelegatedMouseOut}\n onClick={handleDelegatedClick}\n style={{\n cursor: dragRef.current.dragging ? 'grabbing' : 'grab'\n }}\n >\n <TimeGrid ticks={derived.ticks} padding={PADDING} />\n\n <div\n className={styles.lanes}\n style={{ padding: PADDING, position: 'relative' }}\n >\n <GridLines ticks={derived.ticks} padding={PADDING} />\n\n {derived.laneData.map((ld, lane) => (\n <TraceLane\n key={lane}\n laneData={ld}\n laneHeight={laneHeight}\n expanded={expanded}\n hoveredSpanId={hover?.span?.id}\n />\n ))}\n </div>\n\n <TraceTooltip hover={hover} />\n </div>\n )}\n\n <VscodeButton onClick={handleClear} type=\"button\">\n Clear\n </VscodeButton>\n </BasePanel>\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/legend/index.module_built.css\";\nconst classes = {\"legendCol\":\"_6cvDJG_legendCol\"}\nexport default classes\n\nconst _legendCol0 = classes[\"legendCol\"]\nexport { _legendCol0 as \"legendCol\" }\n","import cx from 'classnames';\nimport React from 'react';\nimport { useStore } from 'zustand';\n\nimport { useSystem } from '@/system/provider';\nimport {\n VscodeTable,\n VscodeTableBody,\n VscodeTableCell,\n VscodeTableHeader,\n VscodeTableHeaderCell,\n VscodeTableRow\n} from '@vscode-elements/react-elements';\nimport { BasePanel } from '../base';\nimport klasses from './index.module.css';\n\nexport function LegendPanel() {\n const system = useSystem();\n const { valueTypeColors, icons, defaultIcon } = useStore(system.legendStore);\n\n const entries = React.useMemo(() => {\n const keys = new Set<string>([\n ...Object.keys(valueTypeColors),\n ...Object.keys(icons)\n ]);\n\n return [...keys]\n .sort((a, b) => a.localeCompare(b))\n .map((valueType) => {\n const Icon = icons[valueType] ?? defaultIcon;\n const color = valueTypeColors[valueType];\n const [bgClass, borderClass] = [color, color];\n\n return {\n valueType,\n Icon,\n bgClass,\n borderClass\n };\n });\n }, [defaultIcon, icons, valueTypeColors]);\n\n return (\n <BasePanel>\n <div className=\"flex flex-col gap-1\">\n <VscodeTable zebra columns={['50', '50', 'auto']}>\n <VscodeTableHeader>\n <VscodeTableHeaderCell>Color</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Icon</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Type</VscodeTableHeaderCell>\n </VscodeTableHeader>\n <VscodeTableBody>\n {entries.map(({ valueType, Icon, bgClass, borderClass }) => (\n <VscodeTableRow key={valueType}>\n <VscodeTableCell>\n <div\n style={{\n border: borderClass,\n background: bgClass\n }}\n className={cx(klasses.legendCol, bgClass, borderClass)}\n title={valueType}\n />\n </VscodeTableCell>\n <VscodeTableCell>\n <Icon />\n </VscodeTableCell>\n <VscodeTableCell>{valueType}</VscodeTableCell>\n </VscodeTableRow>\n ))}\n </VscodeTableBody>\n </VscodeTable>\n </div>\n </BasePanel>\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/history/styles.module_built.css\";\nconst classes = {\"redo\":\"LpoP_G_redo\",\"row\":\"LpoP_G_row\",\"empty\":\"LpoP_G_empty\",\"root\":\"LpoP_G_root\",\"list\":\"LpoP_G_list\",\"nowLabel\":\"LpoP_G_nowLabel\",\"sectionTitle\":\"LpoP_G_sectionTitle\",\"index\":\"LpoP_G_index\",\"countBadge\":\"LpoP_G_countBadge\",\"name\":\"LpoP_G_name\",\"undo\":\"LpoP_G_undo\",\"badgeCell\":\"LpoP_G_badgeCell\",\"kindBadge\":\"LpoP_G_kindBadge\",\"now\":\"LpoP_G_now\"}\nexport default classes\n\nconst _redo0 = classes[\"redo\"]\nexport { _redo0 as \"redo\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _nowLabel0 = classes[\"nowLabel\"]\nexport { _nowLabel0 as \"nowLabel\" }\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _index0 = classes[\"index\"]\nexport { _index0 as \"index\" }\n\nconst _countBadge0 = classes[\"countBadge\"]\nexport { _countBadge0 as \"countBadge\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _undo0 = classes[\"undo\"]\nexport { _undo0 as \"undo\" }\n\nconst _badgeCell0 = classes[\"badgeCell\"]\nexport { _badgeCell0 as \"badgeCell\" }\n\nconst _kindBadge0 = classes[\"kindBadge\"]\nexport { _kindBadge0 as \"kindBadge\" }\n\nconst _now0 = classes[\"now\"]\nexport { _now0 as \"now\" }\n","import React from 'react';\nimport { VscodeBadge, VscodeDivider } from '@vscode-elements/react-elements';\nimport { useStore } from 'zustand';\nimport { useSystem } from '@/system/provider';\nimport styles from './styles.module.css';\nimport { BasePanel } from '../base';\n\nexport function HistoryPanel() {\n const system = useSystem();\n const history = useStore(system.undoManager.store, (s) => s.history);\n const redoStack = useStore(system.undoManager.store, (s) => s.redoStack);\n\n const historyNewestFirst = React.useMemo(\n () => [...history].reverse(),\n [history]\n );\n\n const Row = ({\n kind,\n index,\n name\n }: {\n kind: 'undo' | 'redo';\n index: number;\n name: string;\n }) => {\n return (\n <div\n className={`${styles.row} ${kind === 'undo' ? styles.undo : styles.redo}`}\n title={name}\n >\n <div className={styles.badgeCell}>\n <VscodeBadge className={styles.kindBadge}>\n {kind === 'undo' ? 'Undo' : 'Redo'}\n </VscodeBadge>\n </div>\n <div className={styles.index}>{index}</div>\n <div className={styles.name}>{name}</div>\n </div>\n );\n };\n\n return (\n <BasePanel>\n <div className={styles.sectionTitle}>\n <div>Previous</div>\n <VscodeBadge className={styles.countBadge}>\n {history.length}\n </VscodeBadge>\n </div>\n\n <div className={styles.list}>\n {historyNewestFirst.map((entry, idx) => (\n <Row\n key={`${entry.name}-${idx}`}\n kind=\"undo\"\n index={historyNewestFirst.length - idx}\n name={entry.name}\n />\n ))}\n {historyNewestFirst.length === 0 && (\n <div className={styles.empty}>No previous actions</div>\n )}\n </div>\n\n <div className={styles.now}>\n <VscodeDivider />\n <div className={styles.nowLabel}>Now</div>\n </div>\n\n <div className={styles.sectionTitle}>\n <div>Future</div>\n <VscodeBadge className={styles.countBadge}>\n {redoStack.length}\n </VscodeBadge>\n </div>\n\n {redoStack.length !== 0 && (\n <div className={styles.list}>\n {redoStack.map((entry, idx) => (\n <Row\n key={`${entry.name}-${idx}`}\n kind=\"redo\"\n index={idx + 1}\n name={entry.name}\n />\n ))}\n </div>\n )}\n </BasePanel>\n );\n}\n","import { HotKeys as HotKeysComp } from 'react-hotkeys';\nimport { useSystem } from '@/system';\nimport { useStore } from 'zustand';\n\nexport const HotKeys = ({ children }: { children: React.ReactNode }) => {\n const sys = useSystem();\n const keyMap = useStore(sys.hotKeyStore, (x) => x.keymap);\n const handlers = useStore(sys.hotKeyStore, (x) => x.handlers);\n\n return (\n <HotKeysComp\n keyMap={keyMap}\n handlers={handlers}\n allowChanges={true}\n style={{ height: '100%', width: '100%' }}\n >\n {children}\n </HotKeysComp>\n );\n};\n","import { useEffect } from 'react';\n\nexport const useOnPressKey = (\n key: string,\n callback: (e: KeyboardEvent) => void\n) => {\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.code === key) {\n callback(e);\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [key, callback]);\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/contextMenus/NodePicker.module_built.css\";\nconst classes = {\"viewToggles\":\"oeIJiq_viewToggles\",\"nodeTitle\":\"oeIJiq_nodeTitle\",\"tags\":\"oeIJiq_tags\",\"gridView\":\"oeIJiq_gridView\",\"sidebarItemActive\":\"oeIJiq_sidebarItemActive\",\"tag\":\"oeIJiq_tag\",\"nodeText\":\"oeIJiq_nodeText\",\"card\":\"oeIJiq_card\",\"cardInner\":\"oeIJiq_cardInner\",\"icon\":\"oeIJiq_icon\",\"list\":\"oeIJiq_list\",\"sidebar\":\"oeIJiq_sidebar\",\"grid\":\"oeIJiq_grid\",\"container\":\"oeIJiq_container\",\"cardThumb\":\"oeIJiq_cardThumb\",\"sidebarList\":\"oeIJiq_sidebarList\",\"nodeSub\":\"oeIJiq_nodeSub\",\"nodeRow\":\"oeIJiq_nodeRow\",\"topbar\":\"oeIJiq_topbar\",\"content\":\"oeIJiq_content\",\"main\":\"oeIJiq_main\",\"search\":\"oeIJiq_search\",\"groupTitle\":\"oeIJiq_groupTitle\",\"infoButton\":\"oeIJiq_infoButton\",\"empty\":\"oeIJiq_empty\",\"thumb\":\"oeIJiq_thumb\",\"footer\":\"oeIJiq_footer\",\"sidebarItem\":\"oeIJiq_sidebarItem\"}\nexport default classes\n\nconst _viewToggles0 = classes[\"viewToggles\"]\nexport { _viewToggles0 as \"viewToggles\" }\n\nconst _nodeTitle0 = classes[\"nodeTitle\"]\nexport { _nodeTitle0 as \"nodeTitle\" }\n\nconst _tags0 = classes[\"tags\"]\nexport { _tags0 as \"tags\" }\n\nconst _gridView0 = classes[\"gridView\"]\nexport { _gridView0 as \"gridView\" }\n\nconst _sidebarItemActive0 = classes[\"sidebarItemActive\"]\nexport { _sidebarItemActive0 as \"sidebarItemActive\" }\n\nconst _tag0 = classes[\"tag\"]\nexport { _tag0 as \"tag\" }\n\nconst _nodeText0 = classes[\"nodeText\"]\nexport { _nodeText0 as \"nodeText\" }\n\nconst _card0 = classes[\"card\"]\nexport { _card0 as \"card\" }\n\nconst _cardInner0 = classes[\"cardInner\"]\nexport { _cardInner0 as \"cardInner\" }\n\nconst _icon0 = classes[\"icon\"]\nexport { _icon0 as \"icon\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _sidebar0 = classes[\"sidebar\"]\nexport { _sidebar0 as \"sidebar\" }\n\nconst _grid0 = classes[\"grid\"]\nexport { _grid0 as \"grid\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _cardThumb0 = classes[\"cardThumb\"]\nexport { _cardThumb0 as \"cardThumb\" }\n\nconst _sidebarList0 = classes[\"sidebarList\"]\nexport { _sidebarList0 as \"sidebarList\" }\n\nconst _nodeSub0 = classes[\"nodeSub\"]\nexport { _nodeSub0 as \"nodeSub\" }\n\nconst _nodeRow0 = classes[\"nodeRow\"]\nexport { _nodeRow0 as \"nodeRow\" }\n\nconst _topbar0 = classes[\"topbar\"]\nexport { _topbar0 as \"topbar\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _main0 = classes[\"main\"]\nexport { _main0 as \"main\" }\n\nconst _search0 = classes[\"search\"]\nexport { _search0 as \"search\" }\n\nconst _groupTitle0 = classes[\"groupTitle\"]\nexport { _groupTitle0 as \"groupTitle\" }\n\nconst _infoButton0 = classes[\"infoButton\"]\nexport { _infoButton0 as \"infoButton\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _thumb0 = classes[\"thumb\"]\nexport { _thumb0 as \"thumb\" }\n\nconst _footer0 = classes[\"footer\"]\nexport { _footer0 as \"footer\" }\n\nconst _sidebarItem0 = classes[\"sidebarItem\"]\nexport { _sidebarItem0 as \"sidebarItem\" }\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport type { XYPosition } from 'reactflow';\n\nimport {\n VscodeBadge,\n VscodeButton,\n VscodeCollapsible,\n VscodeTextfield\n} from '@vscode-elements/react-elements';\nimport { List, ViewGrid, ViewStructureUp, InfoCircle } from 'iconoir-react';\n\nimport { useOnPressKey } from '../../hooks/useOnPressKey.js';\nimport type { NodeDocumentation } from '../../store/documentation.js';\nimport styles from './NodePicker.module.css';\n\nexport type NodePickerFilters = {\n handleType: 'source' | 'target';\n valueType: string;\n};\n\nexport type NodePickerViewMode = 'list' | 'grid' | 'tree';\n\nexport type ExtendedNodeSpecJSON = NodeSpecJSON & {\n nodeType?: string;\n description?: string;\n icon?: React.ReactNode;\n tags?: string[];\n markdownDescription?: string;\n};\n\nexport type NodePickerProps = {\n position: XYPosition;\n filters?: NodePickerFilters;\n onPickNode: (node: ExtendedNodeSpecJSON, position: XYPosition) => void;\n onClose: () => void;\n specJSON: ExtendedNodeSpecJSON[];\n documentation?: Map<string, NodeDocumentation>;\n onShowDocumentation?: (nodeType: string) => void;\n defaultViewMode?: NodePickerViewMode;\n};\n\nfunction normalizeCategory(category: unknown): string {\n if (typeof category === 'string' && category.trim().length > 0) {\n return category.trim();\n }\n return 'Other';\n}\n\nfunction normalizeLabel(spec: ExtendedNodeSpecJSON): string {\n // Most specs have `label`, but keep it defensive.\n const label = typeof spec.label === 'string' ? spec.label : '';\n return label.trim().length > 0 ? label.trim() : spec.type;\n}\n\nexport const NodePicker: React.FC<NodePickerProps> = ({\n position,\n onPickNode,\n onClose,\n filters,\n specJSON,\n onShowDocumentation,\n documentation,\n defaultViewMode = 'list'\n}: NodePickerProps) => {\n const searchContainerRef = useRef<HTMLDivElement | null>(null);\n const [search, setSearch] = useState('');\n const [activeCategory, setActiveCategory] = useState<string>('All');\n const [viewMode, setViewMode] = useState<NodePickerViewMode>(defaultViewMode);\n\n useOnPressKey('Escape', onClose);\n\n // Merge documentation with specs\n const enrichedSpecs = useMemo(() => {\n if (!documentation) return specJSON;\n\n return specJSON.map((spec) => {\n const doc = documentation.get(spec.type);\n if (!doc) return spec;\n\n return {\n ...spec,\n icon: doc.icon ?? spec.icon,\n description: doc.shortDescription ?? spec.description,\n tags: doc.tags ?? spec.tags,\n markdownDescription: doc.markdownDescription ?? spec.markdownDescription\n };\n });\n }, [specJSON, documentation]);\n\n useEffect(() => {\n const focusSearch = () => {\n const host = searchContainerRef.current?.querySelector(\n 'vscode-textfield'\n ) as HTMLInputElement | null;\n if (!host) return;\n\n if (typeof host.focus === 'function') {\n host.focus();\n }\n\n const input = host.shadowRoot?.querySelector('input, textarea') as\n | HTMLInputElement\n | HTMLTextAreaElement\n | null;\n input?.focus();\n };\n\n const timeoutId = window.setTimeout(focusSearch, 0);\n const rafId = window.requestAnimationFrame(focusSearch);\n\n return () => {\n window.clearTimeout(timeoutId);\n window.cancelAnimationFrame(rafId);\n };\n }, []);\n\n const filteredSpecs = useMemo(() => {\n if (!enrichedSpecs) return [];\n\n let next: ExtendedNodeSpecJSON[] = enrichedSpecs;\n\n if (filters) {\n next = next.filter((node) => {\n const sockets =\n filters.handleType === 'source' ? node.outputs : node.inputs;\n return sockets.some((socket) => socket.valueType === filters.valueType);\n });\n }\n\n const term = search.trim().toLowerCase();\n if (term.length > 0) {\n next = next.filter((node) => {\n const label = normalizeLabel(node).toLowerCase();\n const type = node.type.toLowerCase();\n const description = (node.description || '').toLowerCase();\n const tags = node.tags?.map((t) => t.toLowerCase()) || [];\n\n return (\n label.includes(term) ||\n type.includes(term) ||\n description.includes(term) ||\n tags.some((tag) => tag.includes(term))\n );\n });\n }\n\n return next;\n }, [filters, search, enrichedSpecs]);\n\n const categories = useMemo(() => {\n const set = new Set<string>();\n for (const spec of filteredSpecs) {\n set.add(normalizeCategory(spec.category));\n }\n return ['All', ...Array.from(set).sort((a, b) => a.localeCompare(b))];\n }, [filteredSpecs]);\n\n const visibleSpecs = useMemo(() => {\n if (activeCategory === 'All') return filteredSpecs;\n return filteredSpecs.filter(\n (spec) => normalizeCategory(spec.category) === activeCategory\n );\n }, [activeCategory, filteredSpecs]);\n\n const grouped = useMemo(() => {\n const map = new Map<string, ExtendedNodeSpecJSON[]>();\n for (const spec of visibleSpecs) {\n const cat = normalizeCategory(spec.category);\n const arr = map.get(cat) ?? [];\n arr.push(spec);\n map.set(cat, arr);\n }\n\n for (const [cat, arr] of map.entries()) {\n arr.sort((a, b) => normalizeLabel(a).localeCompare(normalizeLabel(b)));\n map.set(cat, arr);\n }\n\n return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));\n }, [visibleSpecs]);\n\n const groupsToRender: Array<[string, ExtendedNodeSpecJSON[]]> =\n useMemo(() => {\n if (activeCategory === 'All') {\n return grouped;\n }\n return [[activeCategory, visibleSpecs]];\n }, [activeCategory, grouped, visibleSpecs]);\n\n const resultsCount = visibleSpecs.length;\n\n const pick = useCallback(\n (type: ExtendedNodeSpecJSON) => {\n onPickNode(type, position);\n },\n [onPickNode, position]\n );\n\n const onPressEnterQuickPick = useCallback(\n (e: KeyboardEvent) => {\n if (e.repeat) return;\n if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return;\n if (resultsCount < 1) return;\n\n e.preventDefault();\n pick(visibleSpecs[0]!);\n },\n [pick, resultsCount, visibleSpecs]\n );\n\n useOnPressKey('Enter', onPressEnterQuickPick);\n useOnPressKey('NumpadEnter', onPressEnterQuickPick);\n\n if (!specJSON) return null;\n\n const renderThumb = (spec: ExtendedNodeSpecJSON, size: 'small' | 'large') => {\n if (spec.icon) {\n return <div className={styles.icon}>{spec.icon}</div>;\n }\n\n const label = normalizeLabel(spec);\n const letter = label.slice(0, 1).toUpperCase();\n\n return (\n <div\n style={{\n fontSize: size === 'large' ? 18 : 12,\n opacity: 0.85,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center'\n }}\n >\n {letter}\n </div>\n );\n };\n\n const renderTags = (spec: ExtendedNodeSpecJSON) => {\n if (!spec.tags || spec.tags.length === 0) return null;\n return (\n <div className={styles.tags}>\n {spec.tags.map((tag, index) => (\n <span key={index} className={styles.tag}>\n {tag}\n </span>\n ))}\n </div>\n );\n };\n\n const handleShowDocs = useCallback(\n (e: React.MouseEvent, nodeType: string) => {\n e.stopPropagation();\n if (onShowDocumentation) {\n onShowDocumentation(nodeType);\n }\n },\n [onShowDocumentation]\n );\n\n const hasDocumentation = useCallback(\n (spec: ExtendedNodeSpecJSON) => {\n const doc = documentation?.get(spec.type);\n return !!(\n doc?.markdownDescription ||\n doc?.shortDescription ||\n spec.description\n );\n },\n [documentation]\n );\n\n return (\n <div className={styles.container} role=\"dialog\" aria-label=\"Add Node\">\n <div className={styles.topbar}>\n <div className={styles.search} ref={searchContainerRef}>\n <VscodeTextfield\n style={{ width: '100%' }}\n type=\"text\"\n placeholder=\"Search nodes\"\n value={search}\n onInput={(e: any) => setSearch(e.target.value)}\n />\n </div>\n <div className={styles.viewToggles}>\n <VscodeButton\n iconOnly\n secondary\n title=\"List view\"\n onClick={() => setViewMode('list')}\n >\n <List />\n </VscodeButton>\n <VscodeButton\n iconOnly\n secondary\n title=\"Grid view\"\n onClick={() => setViewMode('grid')}\n >\n <ViewGrid />\n </VscodeButton>\n <VscodeButton\n iconOnly\n secondary\n title=\"Tree view\"\n onClick={() => setViewMode('tree')}\n >\n <ViewStructureUp />\n </VscodeButton>\n </div>\n </div>\n <div className={styles.grid}>\n <div className={styles.sidebar}>\n <div className={styles.sidebarList}>\n {categories.map((cat) => (\n <div\n key={cat}\n className={\n cat === activeCategory\n ? `${styles.sidebarItem} ${styles.sidebarItemActive}`\n : styles.sidebarItem\n }\n onClick={() => setActiveCategory(cat)}\n >\n {cat}\n </div>\n ))}\n </div>\n </div>\n\n <div className={styles.main}>\n <div className={styles.content}>\n {resultsCount === 0 ? (\n <div className={styles.empty}>No nodes match your search.</div>\n ) : viewMode === 'grid' ? (\n <div className={styles.gridView}>\n {visibleSpecs.map((spec) => (\n <div\n key={spec.type}\n className={styles.card}\n onClick={() => pick(spec)}\n title={\n spec.markdownDescription || spec.description || spec.type\n }\n >\n <div className={styles.cardInner}>\n <div title={spec.type} className={styles.cardThumb}>\n {renderThumb(spec, 'large')}\n </div>\n <div className={styles.nodeText}>\n <div className={styles.nodeTitle}>\n {normalizeLabel(spec)}\n </div>\n {spec.description ? (\n <div className={styles.nodeSub}>\n {spec.description}\n </div>\n ) : null}\n {renderTags(spec)}\n </div>\n </div>\n </div>\n ))}\n </div>\n ) : viewMode === 'tree' ? (\n <div>\n {groupsToRender.map(([cat, specs]) => (\n <VscodeCollapsible\n key={cat}\n title={`${cat} (${specs.length})`}\n open\n >\n <div className={styles.list}>\n {specs.map((spec) => (\n <div\n key={spec.type}\n title={spec.markdownDescription || spec.type}\n className={styles.nodeRow}\n onClick={() => pick(spec)}\n >\n <div className={styles.thumb}>\n {renderThumb(spec, 'small')}\n </div>\n <div className={styles.nodeText}>\n <div className={styles.nodeTitle}>\n {normalizeLabel(spec)}\n </div>\n {spec.description ? (\n <div className={styles.nodeSub}>\n {spec.description}\n </div>\n ) : null}\n {renderTags(spec)}\n </div>\n {hasDocumentation(spec) && (\n <button\n className={styles.infoButton}\n onClick={(e) => handleShowDocs(e, spec.type)}\n title=\"Show documentation\"\n >\n <InfoCircle />\n </button>\n )}\n </div>\n ))}\n </div>\n </VscodeCollapsible>\n ))}\n </div>\n ) : (\n // list view\n <div>\n {groupsToRender.map(([cat, specs]) => (\n <div key={cat}>\n {activeCategory === 'All' && (\n <div className={styles.groupTitle}>{cat}</div>\n )}\n\n <div className={styles.list}>\n {specs.map((spec) => (\n <div\n key={spec.type}\n title={spec.markdownDescription || spec.type}\n className={styles.nodeRow}\n onClick={() => pick(spec)}\n >\n <div className={styles.thumb}>\n {renderThumb(spec, 'small')}\n </div>\n <div className={styles.nodeText}>\n <div className={styles.nodeTitle}>\n {normalizeLabel(spec)}\n </div>\n {spec.description ? (\n <div className={styles.nodeSub}>\n {spec.description}\n </div>\n ) : null}\n {renderTags(spec)}\n </div>\n {hasDocumentation(spec) && (\n <button\n className={styles.infoButton}\n onClick={(e) => handleShowDocs(e, spec.type)}\n title=\"Show documentation\"\n >\n <InfoCircle />\n </button>\n )}\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n\n <div className={styles.footer}>\n <div>\n <VscodeBadge>\n {resultsCount} result{resultsCount === 1 ? '' : 's'}\n </VscodeBadge>\n </div>\n <div>Esc to close</div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\nimport { NodePicker } from '@/components/contextMenus/NodePicker';\nimport type { ExtendedNodeSpecJSON } from '@/components/contextMenus/NodePicker';\nimport type { XYPosition } from 'reactflow';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n removeTabFromLayout,\n addFloatingTab,\n findTabInLayout\n} from '@/components/layoutController/utils';\n\nexport function NodePickerPanel() {\n const sys = useSystem();\n const specJson = useStore(sys.specStore, (x) => x.specs);\n const documentation = useStore(sys.documentationStore, (x) => x.docs);\n const reactflowRef = useStore(sys.refStore, (x) => x.refs.reactflow);\n const screenPosition = useStore(\n sys.refStore,\n (x) => x.refs.nodePickerPosition\n );\n\n // Convert screen position to flow position\n const flowPosition = useMemo(() => {\n if (reactflowRef && screenPosition && reactflowRef.screenToFlowPosition) {\n return reactflowRef.screenToFlowPosition(screenPosition);\n }\n return { x: 0, y: 0 };\n }, [reactflowRef, screenPosition]);\n\n // For now, we'll use undefined which means no filtering\n const nodePickFilters = undefined;\n const closeNodePicker = useCallback(() => {\n const currentLayout = sys.tabStore.getState().layout;\n const newLayout = removeTabFromLayout(currentLayout, 'nodepicker');\n sys.tabStore.getState().setLayout(newLayout);\n }, [sys]);\n\n const handleShowDocumentation = useCallback(\n (nodeType: string) => {\n // Set the selected documentation type\n sys.refStore.getState().setRef('selectedDocumentationType', nodeType);\n\n // Open documentation browser panel\n const currentLayout = sys.tabStore.getState().layout;\n\n // Close existing doc browser if open\n const existingPanel = findTabInLayout(currentLayout, 'docbrowser');\n let layoutToUse = currentLayout;\n if (existingPanel) {\n layoutToUse = removeTabFromLayout(currentLayout, 'docbrowser');\n }\n\n // Create new floating panel\n const tabData = {\n id: 'docbrowser'\n };\n\n const newLayout = addFloatingTab(layoutToUse, tabData, {\n left: 100,\n top: 100,\n width: 600,\n height: 700\n });\n\n sys.tabStore.getState().setLayout(newLayout);\n },\n [sys]\n );\n\n const handleAddNode = useCallback(\n (spec: ExtendedNodeSpecJSON, position: XYPosition) => {\n const newNode = {\n id: uuidv4(),\n type: spec.nodeType ?? 'behaveNode',\n position,\n data: {\n configuration: {},\n type: spec.type,\n ports: {}\n }\n };\n\n sys.undoManager.execute({\n name: `Add node (${spec.type})`,\n execute: () => {\n sys.nodeStore.getState().addNode(newNode);\n },\n undo: () => {\n sys.nodeStore\n .getState()\n .setNodes((existing) =>\n existing.filter((n) => n.id !== newNode.id)\n );\n }\n });\n\n closeNodePicker();\n },\n [closeNodePicker, sys]\n );\n\n return (\n <NodePicker\n position={flowPosition}\n filters={nodePickFilters}\n onPickNode={handleAddNode}\n onClose={closeNodePicker}\n specJSON={specJson}\n documentation={documentation}\n onShowDocumentation={handleShowDocumentation}\n />\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/panel/index.module_built.css\";\nconst classes = {\"header\":\"CoEoEq_header\",\"groupCell\":\"CoEoEq_groupCell\",\"container\":\"CoEoEq_container\",\"titleCell\":\"CoEoEq_titleCell\",\"title\":\"CoEoEq_title\",\"optionsCell\":\"CoEoEq_optionsCell\",\"badge\":\"CoEoEq_badge\",\"actionCell\":\"CoEoEq_actionCell\",\"table\":\"CoEoEq_table\",\"idCell\":\"CoEoEq_idCell\",\"count\":\"CoEoEq_count\"}\nexport default classes\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _groupCell0 = classes[\"groupCell\"]\nexport { _groupCell0 as \"groupCell\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _titleCell0 = classes[\"titleCell\"]\nexport { _titleCell0 as \"titleCell\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _optionsCell0 = classes[\"optionsCell\"]\nexport { _optionsCell0 as \"optionsCell\" }\n\nconst _badge0 = classes[\"badge\"]\nexport { _badge0 as \"badge\" }\n\nconst _actionCell0 = classes[\"actionCell\"]\nexport { _actionCell0 as \"actionCell\" }\n\nconst _table0 = classes[\"table\"]\nexport { _table0 as \"table\" }\n\nconst _idCell0 = classes[\"idCell\"]\nexport { _idCell0 as \"idCell\" }\n\nconst _count0 = classes[\"count\"]\nexport { _count0 as \"count\" }\n","import React, { useMemo } from 'react';\nimport { useSystem } from '@/system/provider';\nimport {\n VscodeButton,\n VscodeTable,\n VscodeTableBody,\n VscodeTableCell,\n VscodeTableHeader,\n VscodeTableHeaderCell,\n VscodeTableRow\n} from '@vscode-elements/react-elements';\nimport { BasePanel } from '../base';\nimport styles from './index.module.css';\n\nexport const PanelPanel = () => {\n const system = useSystem();\n\n // Get all registered panels from the TabLoader\n const registeredPanels = useMemo(() => {\n const panels = Object.keys(system.tabLoader.tabs).map((id) => {\n const tabData = system.tabLoader.tabs[id]?.();\n return {\n id,\n title: tabData?.title || id,\n group: tabData?.group || 'default',\n closable: tabData?.closable ?? true,\n cached: tabData?.cached ?? false\n };\n });\n\n // Sort by title for easier browsing\n return panels.sort((a, b) => a.title.localeCompare(b.title));\n }, [system.tabLoader.tabs]);\n\n const handleOpenPanel = (panelId: string) => {\n system.tabStore.getState().openTab(panelId);\n };\n\n return (\n <BasePanel>\n <div className={styles.container}>\n <div className={styles.header}>\n <h2 className={styles.title}>Registered Panels</h2>\n <div className={styles.count}>{registeredPanels.length} panels</div>\n </div>\n\n <VscodeTable className={styles.table}>\n <VscodeTableHeader slot=\"header\">\n <VscodeTableHeaderCell>Panel</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>ID</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Group</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Options</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Action</VscodeTableHeaderCell>\n </VscodeTableHeader>\n <VscodeTableBody slot=\"body\">\n {registeredPanels.map((panel) => (\n <VscodeTableRow key={panel.id}>\n <VscodeTableCell className={styles.titleCell}>\n {panel.title}\n </VscodeTableCell>\n <VscodeTableCell className={styles.idCell}>\n <code>{panel.id}</code>\n </VscodeTableCell>\n <VscodeTableCell className={styles.groupCell}>\n {panel.group}\n </VscodeTableCell>\n <VscodeTableCell className={styles.optionsCell}>\n {panel.cached && <span className={styles.badge}>cached</span>}\n {!panel.closable && (\n <span className={styles.badge}>not closable</span>\n )}\n </VscodeTableCell>\n <VscodeTableCell className={styles.actionCell}>\n <VscodeButton\n onClick={() => handleOpenPanel(panel.id)}\n secondary\n >\n Open\n </VscodeButton>\n </VscodeTableCell>\n </VscodeTableRow>\n ))}\n </VscodeTableBody>\n </VscodeTable>\n </div>\n </BasePanel>\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/conversation/index.module_built.css\";\nconst classes = {\"inputArea\":\"uhpTzG_inputArea\",\"header\":\"uhpTzG_header\",\"systemMessage\":\"uhpTzG_systemMessage\",\"assistantMessage\":\"uhpTzG_assistantMessage\",\"messageList\":\"uhpTzG_messageList\",\"noAgent\":\"uhpTzG_noAgent\",\"container\":\"uhpTzG_container\",\"systemBubble\":\"uhpTzG_systemBubble\",\"userMessage\":\"uhpTzG_userMessage\",\"fadeIn\":\"uhpTzG_fadeIn\",\"timestamp\":\"uhpTzG_timestamp\",\"headerActions\":\"uhpTzG_headerActions\",\"message\":\"uhpTzG_message\",\"title\":\"uhpTzG_title\",\"userBubble\":\"uhpTzG_userBubble\",\"bubble\":\"uhpTzG_bubble\",\"assistantBubble\":\"uhpTzG_assistantBubble\",\"streamingIndicator\":\"uhpTzG_streamingIndicator\",\"roleLabel\":\"uhpTzG_roleLabel\",\"textInput\":\"uhpTzG_textInput\",\"blink\":\"uhpTzG_blink\"}\nexport default classes\n\nconst _inputArea0 = classes[\"inputArea\"]\nexport { _inputArea0 as \"inputArea\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _systemMessage0 = classes[\"systemMessage\"]\nexport { _systemMessage0 as \"systemMessage\" }\n\nconst _assistantMessage0 = classes[\"assistantMessage\"]\nexport { _assistantMessage0 as \"assistantMessage\" }\n\nconst _messageList0 = classes[\"messageList\"]\nexport { _messageList0 as \"messageList\" }\n\nconst _noAgent0 = classes[\"noAgent\"]\nexport { _noAgent0 as \"noAgent\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _systemBubble0 = classes[\"systemBubble\"]\nexport { _systemBubble0 as \"systemBubble\" }\n\nconst _userMessage0 = classes[\"userMessage\"]\nexport { _userMessage0 as \"userMessage\" }\n\nconst _fadeIn0 = classes[\"fadeIn\"]\nexport { _fadeIn0 as \"fadeIn\" }\n\nconst _timestamp0 = classes[\"timestamp\"]\nexport { _timestamp0 as \"timestamp\" }\n\nconst _headerActions0 = classes[\"headerActions\"]\nexport { _headerActions0 as \"headerActions\" }\n\nconst _message0 = classes[\"message\"]\nexport { _message0 as \"message\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _userBubble0 = classes[\"userBubble\"]\nexport { _userBubble0 as \"userBubble\" }\n\nconst _bubble0 = classes[\"bubble\"]\nexport { _bubble0 as \"bubble\" }\n\nconst _assistantBubble0 = classes[\"assistantBubble\"]\nexport { _assistantBubble0 as \"assistantBubble\" }\n\nconst _streamingIndicator0 = classes[\"streamingIndicator\"]\nexport { _streamingIndicator0 as \"streamingIndicator\" }\n\nconst _roleLabel0 = classes[\"roleLabel\"]\nexport { _roleLabel0 as \"roleLabel\" }\n\nconst _textInput0 = classes[\"textInput\"]\nexport { _textInput0 as \"textInput\" }\n\nconst _blink0 = classes[\"blink\"]\nexport { _blink0 as \"blink\" }\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { VscodeButton, VscodeTextfield } from '@vscode-elements/react-elements';\nimport { Trash, SendDiagonal } from 'iconoir-react';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\nimport { BasePanel } from '../base';\nimport { Icon } from '@/components/primitives/icon';\nimport type { ChatMessage } from '@/store/chat';\nimport styles from './index.module.css';\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit'\n });\n}\n\nfunction MessageBubble({ message }: { message: ChatMessage }) {\n const roleClass =\n message.role === 'user'\n ? styles.userMessage\n : message.role === 'assistant'\n ? styles.assistantMessage\n : styles.systemMessage;\n\n const bubbleClass =\n message.role === 'user'\n ? styles.userBubble\n : message.role === 'assistant'\n ? styles.assistantBubble\n : styles.systemBubble;\n\n return (\n <div className={`${styles.message} ${roleClass}`}>\n <span className={styles.roleLabel}>{message.role}</span>\n <div className={`${styles.bubble} ${bubbleClass}`}>\n {message.content}\n {message.isStreaming && <span className={styles.streamingIndicator} />}\n </div>\n <span className={styles.timestamp}>{formatTime(message.timestamp)}</span>\n </div>\n );\n}\n\nexport function ConversationPanel() {\n const system = useSystem();\n const messages = useStore(system.chatStore, (s) => s.messages);\n const agent = useStore(system.chatStore, (s) => s.agent);\n const isStreaming = useStore(system.chatStore, (s) => s.isStreaming);\n const inputValue = useStore(system.chatStore, (s) => s.inputValue);\n const setInputValue = useStore(system.chatStore, (s) => s.setInputValue);\n const clearMessages = useStore(system.chatStore, (s) => s.clearMessages);\n\n const messagesEndRef = useRef<HTMLDivElement | null>(null);\n\n const scrollToBottom = useCallback(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, []);\n\n useEffect(() => {\n scrollToBottom();\n }, [messages, scrollToBottom]);\n\n const handleSend = useCallback(() => {\n const trimmed = inputValue.trim();\n if (!trimmed || !agent || isStreaming) {\n return;\n }\n\n system.chatStore.getState().setInputValue('');\n\n // Publish the user message — the AI subsystem adds it to\n // memory which fires listeners that sync to the chat store.\n system.pubsub.publish('chat:userMessage', {\n content: trimmed\n });\n }, [inputValue, agent, isStreaming, system]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n },\n [handleSend]\n );\n\n const handleInputChange = useCallback(\n (e: Event) => {\n const target = e.target as HTMLInputElement;\n setInputValue(target.value);\n },\n [setInputValue]\n );\n\n if (!agent) {\n return (\n <BasePanel>\n <div className={styles.container}>\n <div className={styles.noAgent}>\n <p>No agent connected.</p>\n <p>\n Use the <strong>Setup UI</strong> node to connect an agent to this\n panel.\n </p>\n </div>\n </div>\n </BasePanel>\n );\n }\n\n return (\n <BasePanel>\n <div className={styles.container}>\n <div className={styles.header}>\n <h3 className={styles.title}>Conversation</h3>\n <div className={styles.headerActions}>\n <VscodeButton\n secondary\n onClick={clearMessages}\n title=\"Clear messages\"\n >\n <Icon slot=\"start\">\n <Trash />\n </Icon>\n </VscodeButton>\n </div>\n </div>\n\n <div className={styles.messageList}>\n {messages.map((msg) => (\n <MessageBubble key={msg.id} message={msg} />\n ))}\n <div ref={messagesEndRef} />\n </div>\n\n <div className={styles.inputArea}>\n <VscodeTextfield\n className={styles.textInput}\n placeholder={\n isStreaming ? 'Waiting for response...' : 'Type a message...'\n }\n value={inputValue}\n onInput={handleInputChange}\n onKeyDown={handleKeyDown}\n disabled={isStreaming}\n />\n <VscodeButton\n onClick={handleSend}\n disabled={isStreaming || !inputValue.trim()}\n title=\"Send\"\n >\n <Icon slot=\"start\">\n <SendDiagonal />\n </Icon>\n </VscodeButton>\n </div>\n </div>\n </BasePanel>\n );\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/layers/styles.module_built.css\";\nconst classes = {\"header\":\"ExR4dG_header\",\"title\":\"ExR4dG_title\",\"nameInput\":\"ExR4dG_nameInput\",\"list\":\"ExR4dG_list\",\"opacityLabel\":\"ExR4dG_opacityLabel\",\"controls\":\"ExR4dG_controls\",\"subtitle\":\"ExR4dG_subtitle\",\"checkboxLabel\":\"ExR4dG_checkboxLabel\",\"layerName\":\"ExR4dG_layerName\",\"badge\":\"ExR4dG_badge\",\"container\":\"ExR4dG_container\",\"rowTop\":\"ExR4dG_rowTop\",\"addRow\":\"ExR4dG_addRow\",\"actions\":\"ExR4dG_actions\",\"row\":\"ExR4dG_row\"}\nexport default classes\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _nameInput0 = classes[\"nameInput\"]\nexport { _nameInput0 as \"nameInput\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _opacityLabel0 = classes[\"opacityLabel\"]\nexport { _opacityLabel0 as \"opacityLabel\" }\n\nconst _controls0 = classes[\"controls\"]\nexport { _controls0 as \"controls\" }\n\nconst _subtitle0 = classes[\"subtitle\"]\nexport { _subtitle0 as \"subtitle\" }\n\nconst _checkboxLabel0 = classes[\"checkboxLabel\"]\nexport { _checkboxLabel0 as \"checkboxLabel\" }\n\nconst _layerName0 = classes[\"layerName\"]\nexport { _layerName0 as \"layerName\" }\n\nconst _badge0 = classes[\"badge\"]\nexport { _badge0 as \"badge\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _rowTop0 = classes[\"rowTop\"]\nexport { _rowTop0 as \"rowTop\" }\n\nconst _addRow0 = classes[\"addRow\"]\nexport { _addRow0 as \"addRow\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n","import { BasePanel } from '@/components/panels/base';\nimport { layerId } from '@/annotations';\nimport { useSystem } from '@/system/provider';\nimport { VscodeButton, VscodeDivider } from '@vscode-elements/react-elements';\nimport { useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport styles from './styles.module.css';\n\ntype NodeWithAnnotations = {\n id: string;\n selected?: boolean;\n data?: {\n annotations?: Record<string, unknown>;\n };\n};\n\nconst getAnnotatedLayerId = (node: NodeWithAnnotations): string | undefined => {\n const value = node.data?.annotations?.[layerId];\n return typeof value === 'string' ? value : undefined;\n};\n\nconst clampOpacityFromPercent = (percent: number): number => {\n if (Number.isNaN(percent)) return 1;\n return Math.max(0, Math.min(100, percent)) / 100;\n};\n\nexport function LayersPanel() {\n const system = useSystem();\n\n const layers = useStore(system.layerStore, (state) => state.layers);\n const nodeLayers = useStore(system.layerStore, (state) => state.nodeLayers);\n const defaultLayerId = useStore(\n system.layerStore,\n (state) => state.defaultLayerId\n );\n\n const nodes = useStore(system.nodeStore, (state) => state.nodes);\n\n const [newLayerName, setNewLayerName] = useState('');\n\n const selectedNodeIds = useMemo(() => {\n return nodes.filter((node) => node.selected).map((node) => node.id);\n }, [nodes]);\n\n const layerRows = useMemo(() => {\n const entries = Object.values(layers);\n return entries.sort((a, b) => {\n if (a.id === defaultLayerId) return -1;\n if (b.id === defaultLayerId) return 1;\n return a.name.localeCompare(b.name);\n });\n }, [defaultLayerId, layers]);\n\n const selectedLayerId = useMemo(() => {\n if (selectedNodeIds.length === 0) return undefined;\n\n const effectiveLayerIds = selectedNodeIds.map((nodeId) => {\n const node = nodes.find((candidate) => candidate.id === nodeId);\n if (!node) return defaultLayerId;\n return (\n nodeLayers[nodeId] ??\n getAnnotatedLayerId(node as NodeWithAnnotations) ??\n defaultLayerId\n );\n });\n\n const first = effectiveLayerIds[0];\n const sameLayer = effectiveLayerIds.every((id) => id === first);\n return sameLayer ? first : undefined;\n }, [defaultLayerId, nodeLayers, nodes, selectedNodeIds]);\n\n const updateNodeAnnotationsForLayer = (\n nodeIds: string[],\n nextLayerId: string\n ): void => {\n system.nodeStore.getState().setNodes((existing) =>\n existing.map((node) => {\n if (!nodeIds.includes(node.id)) return node;\n\n const dataRecord =\n node.data && typeof node.data === 'object'\n ? (node.data as Record<string, unknown>)\n : {};\n\n const annotationsRecord =\n dataRecord.annotations && typeof dataRecord.annotations === 'object'\n ? (dataRecord.annotations as Record<string, unknown>)\n : {};\n\n return {\n ...node,\n data: {\n ...dataRecord,\n annotations: {\n ...annotationsRecord,\n [layerId]: nextLayerId\n }\n }\n };\n })\n );\n };\n\n const handleCreateLayer = (): void => {\n const nextName = newLayerName.trim();\n if (!nextName) return;\n\n system.layerStore.getState().createLayer(nextName);\n setNewLayerName('');\n };\n\n const handleAssignSelected = (targetLayerId: string): void => {\n if (selectedNodeIds.length === 0) return;\n\n selectedNodeIds.forEach((nodeId) => {\n system.layerStore.getState().setNodeLayer(nodeId, targetLayerId);\n });\n updateNodeAnnotationsForLayer(selectedNodeIds, targetLayerId);\n };\n\n const handleRemoveLayer = (targetLayerId: string): void => {\n if (targetLayerId === defaultLayerId) return;\n\n const affectedNodeIds = Object.entries(nodeLayers)\n .filter(([, mappedLayerId]) => mappedLayerId === targetLayerId)\n .map(([nodeId]) => nodeId);\n\n system.layerStore.getState().removeLayer(targetLayerId);\n\n if (affectedNodeIds.length > 0) {\n updateNodeAnnotationsForLayer(affectedNodeIds, defaultLayerId);\n }\n };\n\n return (\n <BasePanel>\n <div className={styles.container}>\n <div className={styles.header}>\n <span className={styles.title}>Layers</span>\n <span className={styles.subtitle}>\n {selectedNodeIds.length} selected node\n {selectedNodeIds.length === 1 ? '' : 's'}\n </span>\n </div>\n\n <div className={styles.addRow}>\n <input\n className={styles.nameInput}\n value={newLayerName}\n onChange={(event) => setNewLayerName(event.target.value)}\n placeholder=\"New layer name\"\n />\n <VscodeButton onClick={handleCreateLayer}>Add Layer</VscodeButton>\n </div>\n\n <VscodeDivider />\n\n <div className={styles.list}>\n {layerRows.map((layer) => {\n const isDefault = layer.id === defaultLayerId;\n const isSelectedLayer = selectedLayerId === layer.id;\n\n return (\n <div className={styles.row} key={layer.id}>\n <div className={styles.rowTop}>\n <input\n className={styles.layerName}\n value={layer.name}\n onChange={(event) =>\n system.layerStore\n .getState()\n .renameLayer(layer.id, event.target.value)\n }\n aria-label={`Layer name ${layer.name}`}\n />\n {isDefault && <span className={styles.badge}>default</span>}\n {isSelectedLayer && (\n <span className={styles.badge}>selected</span>\n )}\n </div>\n\n <div className={styles.controls}>\n <label className={styles.checkboxLabel}>\n <input\n type=\"checkbox\"\n checked={layer.visible}\n onChange={(event) =>\n system.layerStore\n .getState()\n .setLayerVisibility(layer.id, event.target.checked)\n }\n />\n Visible\n </label>\n\n <label className={styles.opacityLabel}>\n Opacity\n <input\n type=\"range\"\n min={0}\n max={100}\n value={Math.round(layer.opacity * 100)}\n onChange={(event) =>\n system.layerStore\n .getState()\n .setLayerOpacity(\n layer.id,\n clampOpacityFromPercent(\n Number.parseInt(event.target.value, 10)\n )\n )\n }\n />\n <span>{Math.round(layer.opacity * 100)}%</span>\n </label>\n </div>\n\n <div className={styles.actions}>\n <VscodeButton\n onClick={() => handleAssignSelected(layer.id)}\n disabled={selectedNodeIds.length === 0}\n >\n Assign Selected\n </VscodeButton>\n <VscodeButton\n secondary\n disabled={isDefault}\n onClick={() => handleRemoveLayer(layer.id)}\n >\n Delete\n </VscodeButton>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </BasePanel>\n );\n}\n","import { Flow } from '@/components/Flow';\nimport type { TabBase, TabData } from 'rc-dock';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport type { System } from './system';\nimport { Settings } from '@/components/panels/systemSettings';\nimport { LogsPanel } from '@/components/panels/logs';\nimport { VariablesPanel } from '@/components/panels/variables';\nimport { NodeInputsPanel } from '@/components/panels/nodeInputs';\nimport { AlignmentPanel } from '@/components/panels/alignment';\nimport { SearchPanel } from '@/components/panels/search';\nimport { KeymapsPanel } from '@/components/panels/keymaps';\nimport { EventsPanel } from '@/components/panels/events';\nimport { TracesPanel } from '@/components/panels/traces';\nimport { LegendPanel } from '@/components/panels/legend';\nimport { HistoryPanel } from '@/components/panels/history';\nimport { HotKeys } from '@/components/hotKeys';\nimport { NodePickerPanel } from '@/components/panels/nodePicker';\nimport { PanelPanel } from '@/components/panels/panel';\nimport { ConversationPanel } from '@/components/panels/conversation';\nimport { LayersPanel } from '@/components/panels/layers';\n\nexport class TabLoader {\n public readonly tabs: Record<string, () => TabData> = {};\n\n constructor(_system: System) {\n this.register('graph', () => {\n return {\n id: 'graph',\n closable: true,\n cached: true,\n group: 'graph',\n title: 'Graph',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <HotKeys>\n <Flow />\n </HotKeys>\n </ErrorBoundary>\n )\n };\n });\n\n this.register('system:settings', () => {\n return {\n id: 'system:settings',\n closable: true,\n group: 'default',\n title: 'System Settings',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <Settings />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('distribution', () => {\n return {\n id: 'distribution',\n closable: true,\n group: 'default',\n title: 'Distribution + Alignment',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <AlignmentPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('variables', () => {\n return {\n id: 'variables',\n closable: true,\n title: 'Variables',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <VariablesPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('logs', () => {\n return {\n id: 'logs',\n closable: true,\n title: 'Logs',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <LogsPanel />\n </ErrorBoundary>\n )\n };\n });\n this.register('find', () => {\n return {\n id: 'find',\n closable: true,\n title: 'Find',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <SearchPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('nodeInputs', () => {\n return {\n id: 'nodeInputs',\n closable: true,\n title: 'Node Inputs',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <NodeInputsPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('keymaps', () => {\n return {\n id: 'keymaps',\n closable: true,\n title: 'Keyboard Shortcuts',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <KeymapsPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('events', () => {\n return {\n id: 'events',\n closable: true,\n title: 'Events',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <EventsPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('traces', () => {\n return {\n id: 'traces',\n closable: true,\n title: 'Traces',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <TracesPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('legend', () => {\n return {\n id: 'legend',\n closable: true,\n title: 'Legend',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <LegendPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('history', () => {\n return {\n id: 'history',\n closable: true,\n title: 'History',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <HistoryPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('layers', () => {\n return {\n id: 'layers',\n closable: true,\n title: 'Layers',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <LayersPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('nodepicker', () => {\n return {\n id: 'nodepicker',\n closable: true,\n cached: true,\n title: 'Add Node',\n group: 'headless',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <NodePickerPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('panels', () => {\n return {\n id: 'panels',\n closable: true,\n title: 'Panels',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <PanelPanel />\n </ErrorBoundary>\n )\n };\n });\n\n this.register('conversation', () => {\n return {\n id: 'conversation',\n closable: true,\n cached: true,\n title: 'Conversation',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <ConversationPanel />\n </ErrorBoundary>\n )\n };\n });\n }\n\n load(tab: TabBase): TabData | undefined {\n if (!tab.id) {\n return;\n }\n return this.tabs[tab.id]?.();\n }\n\n register(id: string, loader: () => TabData) {\n this.tabs[id] = loader;\n }\n}\n","import type { LogSeverity } from '@kiberon-labs/behave-graph';\nimport { create } from 'zustand';\n\ninterface ILogMessage {\n message: string;\n}\n\nexport interface ILog {\n data: ILogMessage;\n time: Date;\n type: LogSeverity;\n}\n\nexport type LogStore = {\n logs: ILog[];\n append: (log: ILog) => void;\n clear: () => void;\n};\n\nexport const logStoreFactory = () =>\n create<LogStore>((set) => ({\n logs: [],\n append: (log: ILog) =>\n set((state) => {\n return { logs: [...state.logs, log] };\n }),\n clear: () => set(() => ({ logs: [] }))\n }));\n","import {\n Cube,\n Droplet,\n EaseCurveControlPoints,\n Hashtag,\n InputOutput,\n SelectPoint3d,\n Text\n} from 'iconoir-react';\nimport { create } from 'zustand';\n\nexport type LegendStore = {\n icons: Record<string, React.ComponentType>;\n defaultIcon: React.ComponentType;\n valueTypeColors: Record<string, string>;\n categoryColors: Record<string, string>;\n setIcon: (key: string, icon: React.ComponentType) => void;\n setValueTypeColor: (key: string, color: string) => void;\n setCategoryColor: (key: string, color: string) => void;\n};\n\nexport const legendStoreFactory = () =>\n create<LegendStore>((set) => ({\n // store the component references (not instantiated elements)\n defaultIcon: SelectPoint3d,\n categoryColors: {\n Event: '#f14445',\n Logic: '#16a34a',\n Variable: '#a855f7',\n Query: '#a855f7',\n Action: '#0891b2',\n Flow: '#6c727e',\n Effect: '#84cc16',\n Time: '#6c727e',\n None: '#6c727e'\n },\n valueTypeColors: {\n flow: '#ffffff',\n number: '#16a34a',\n float: '#16a34a',\n integer: '#84cc16',\n boolean: '#0891b2',\n string: '#a855f7',\n object: '#f97316'\n },\n icons: {\n color: Droplet,\n curve: EaseCurveControlPoints,\n string: Text,\n boolean: InputOutput,\n float: Hashtag,\n integer: Hashtag,\n object: Cube\n },\n setIcon: (key: string, icon: React.ComponentType) =>\n set((state) => ({\n icons: {\n ...state.icons,\n [key]: icon\n }\n })),\n setValueTypeColor: (key: string, color: string) =>\n set((state) => ({\n valueTypeColors: {\n ...state.valueTypeColors,\n [key]: color\n }\n })),\n setCategoryColor: (key: string, color: string) =>\n set((state) => ({\n categoryColors: {\n ...state.categoryColors,\n [key]: color\n }\n }))\n }));\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/menubar/menuItem.module_built.css\";\nconst classes = {\"root\":\"lDoYmW_root\",\"inner\":\"lDoYmW_inner\"}\nexport default classes\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _inner0 = classes[\"inner\"]\nexport { _inner0 as \"inner\" }\n","import { Item } from 'rc-menu';\nimport React from 'react';\n\nimport styles from './menuItem.module.css';\n\nexport type IMenuItemElement = React.ComponentProps<typeof Item> & {\n icon?: React.ReactNode;\n /**\n * Needed to hack into the inner part of the menu item\n */\n inner?: (children: React.ReactNode) => React.ReactNode;\n};\n\n/**\n * You must provide a unique key for each item\n */\nexport const MenuItemElement = ({\n inner = (children: React.ReactNode) => children,\n children,\n ...rest\n}: IMenuItemElement) => {\n return (\n // @ts-expect-error This is the correct attribute\n <Item selectable={'false'} {...rest}>\n {inner(\n <div className={styles.root}>\n <div className={styles.inner}>{children}</div>\n </div>\n )}\n </Item>\n );\n};\n","import { AlignmentPanel } from '../panels/alignment/index.js';\nimport { LegendPanel } from '../panels/legend/index.js';\nimport { LogsPanel } from '../panels/logs/index.js';\nimport { MenuItemElement } from './menuItem.js';\nimport { Settings } from '../panels/systemSettings';\nimport { KeymapsPanel } from '../panels/keymaps';\nimport type { LayoutBase, TabData } from 'rc-dock';\nimport { type JSX } from 'react';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport type { UIGraphJSON } from '@/types/graph.js';\n\nimport {\n Archive,\n Download,\n PagePlusIn,\n Redo,\n SettingsProfiles,\n Trash,\n Undo,\n Upload\n} from 'iconoir-react';\nimport { Seperator, type IMenu, type IMenuItem } from '@/store/menubar.js';\nimport { useSystem } from '@/system/index.js';\nimport { useStore } from 'zustand';\nimport {\n findTabInLayout,\n removeTabFromLayout,\n addFloatingTab,\n findGraphPanel\n} from '../layoutController/utils.js';\nimport { SearchPanel } from '../panels/search/index.js';\nimport { VariablesPanel } from '../panels/variables/index.js';\nimport { EventsPanel } from '../panels/events/index.js';\nimport { HistoryPanel } from '../panels/history/index.js';\nimport { PanelPanel } from '../panels/panel/index.js';\n\nasync function readJsonFile(file: File): Promise<unknown> {\n const text = await file.text();\n return JSON.parse(text);\n}\n\nfunction isLayoutBase(value: unknown): value is LayoutBase {\n if (!value || typeof value !== 'object') return false;\n // Minimal sanity check for rc-dock layout\n return 'dockbox' in (value as Record<string, unknown>);\n}\n\nexport interface IWindowButton {\n //Id of the tab\n id: string;\n title: string;\n //name ofthe menu item\n name: string;\n icon?: JSX.Element;\n content: JSX.Element;\n}\n/**\n * A simple button that toggles a window panel\n * @param param0\n * @returns\n */\nexport const windowButton = ({\n name,\n id,\n title,\n icon,\n content\n}: IWindowButton): IMenuItem => ({\n name: name,\n render: function Toggle() {\n const system = useSystem();\n\n const onToggle = () => {\n const currentLayout = system.tabStore.getState().layout;\n const existingPanel = findTabInLayout(currentLayout, id);\n\n if (existingPanel) {\n // Tab exists, remove it\n const newLayout = removeTabFromLayout(currentLayout, id);\n system.tabStore.getState().setLayout(newLayout);\n } else {\n // Tab doesn't exist, add it as a floating panel\n const tabData: TabData = {\n id,\n title,\n content: () => content,\n cached: true,\n group: 'popout'\n };\n\n const newLayout = addFloatingTab(currentLayout, tabData, {\n left: 500,\n top: 300,\n width: 320,\n height: 400\n });\n\n system.tabStore.getState().setLayout(newLayout);\n }\n };\n return (\n <MenuItemElement onClick={onToggle} key={title} icon={icon}>\n {title}\n </MenuItemElement>\n );\n }\n});\n\nexport const defaultMenuDataFactory = (): IMenu => ({\n items: [\n {\n title: 'File',\n name: 'file',\n items: [\n {\n name: 'newGraph',\n render: (rest) => {\n return (\n <MenuItemElement key=\"new\" icon={<PagePlusIn />} {...rest}>\n New Graph\n </MenuItemElement>\n );\n }\n },\n new Seperator(),\n {\n name: 'saveBehave',\n render: function SaveGraph(rest) {\n const system = useSystem();\n\n const onSave = () => {\n system.flowStore.getState().invalidateCache();\n const graph = system.flowStore.getState().getGraph();\n system.pubsub.publish('graph:inner:saved', graph);\n };\n\n return (\n <MenuItemElement\n key={'saveBehave'}\n icon={<Download />}\n onClick={onSave}\n {...rest}\n >\n Save inner Behave Graph\n </MenuItemElement>\n );\n }\n },\n {\n name: 'loadBehave',\n render: function LoadGraph(rest) {\n const system = useSystem();\n\n const onLoad = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json,application/json';\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const parsed = (await readJsonFile(file)) as GraphJSON;\n system.flowStore.getState().setGraph(parsed);\n\n const reactflow = system.refStore\n .getState()\n .getRef('reactflow');\n setTimeout(() => {\n reactflow?.fitView();\n }, 100);\n } catch (err) {\n console.error('Failed to load graph', err);\n }\n };\n input.click();\n };\n\n return (\n <MenuItemElement\n key={'loadBehave'}\n icon={<Upload />}\n onClick={onLoad}\n {...rest}\n >\n Load inner Behave Graph\n </MenuItemElement>\n );\n }\n },\n new Seperator(),\n {\n name: 'saveUI',\n render: function SaveGraph(rest) {\n const system = useSystem();\n\n const onSave = () => {\n system.actionStore.getState().actions.save();\n };\n\n return (\n <MenuItemElement\n key={'saveUI'}\n icon={<Download />}\n onClick={onSave}\n {...rest}\n >\n Save Graph\n </MenuItemElement>\n );\n }\n },\n {\n name: 'loadUI',\n render: function LoadGraph(rest) {\n const system = useSystem();\n\n const onLoad = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json,application/json';\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const parsed = (await readJsonFile(file)) as UIGraphJSON;\n\n // UIGraphJSON format - deserialize UI state and load inner graph\n system.graph.deseralize(parsed);\n system.flowStore\n .getState()\n .setGraph(parsed.flow, { skipLayout: true });\n } catch (err) {\n console.error('Failed to load graph', err);\n }\n };\n input.click();\n };\n\n return (\n <MenuItemElement\n key={'loadUI'}\n icon={<Upload />}\n onClick={onLoad}\n {...rest}\n >\n Load Graph\n </MenuItemElement>\n );\n }\n },\n new Seperator(),\n {\n name: 'clear',\n render: function ClearGraph({ key, ...rest }) {\n const system = useSystem();\n\n const onClear = () => {\n system.graph.clear();\n system.flowStore.getState().invalidateCache();\n };\n\n return (\n <MenuItemElement\n key={key}\n icon={<Trash />}\n onClick={onClear}\n {...rest}\n >\n Clear\n </MenuItemElement>\n );\n }\n }\n ]\n },\n {\n title: 'Edit',\n name: 'edit',\n items: [\n {\n name: 'undo',\n render: ({ key, ...rest }) => {\n const sys = useSystem();\n\n const canUndo = useStore(sys.undoManager.store, (s) => s.canUndo);\n return (\n <MenuItemElement\n onClick={() => canUndo && sys.undoManager.undo()}\n disabled={!canUndo}\n key={key}\n icon={<Undo />}\n {...rest}\n >\n Undo\n </MenuItemElement>\n );\n }\n },\n {\n name: 'redo',\n render: ({ key, ...rest }) => {\n const sys = useSystem();\n\n const canRedo = useStore(sys.undoManager.store, (s) => s.canRedo);\n return (\n <MenuItemElement\n onClick={() => canRedo && sys.undoManager.redo()}\n disabled={!canRedo}\n key={key}\n icon={<Redo />}\n {...rest}\n >\n Redo\n </MenuItemElement>\n );\n }\n },\n new Seperator(),\n {\n name: 'cut',\n render: ({ key, ...rest }) => (\n <MenuItemElement key={key} icon={<Redo />} {...rest}>\n Cut\n </MenuItemElement>\n )\n },\n {\n name: 'copy',\n render: ({ key, ...rest }) => (\n <MenuItemElement key={key} icon={<Redo />} {...rest}>\n Copy\n </MenuItemElement>\n )\n },\n {\n name: 'paste',\n render: ({ key, ...rest }) => (\n <MenuItemElement key={key} icon={<Redo />} {...rest}>\n Paste\n </MenuItemElement>\n )\n },\n new Seperator(),\n windowButton({\n name: 'find',\n id: 'find',\n title: 'Find',\n content: <SearchPanel />\n })\n ]\n },\n {\n name: 'window',\n title: 'Window',\n items: [\n windowButton({\n name: 'history',\n id: 'history',\n title: 'History',\n content: <HistoryPanel />\n }),\n windowButton({\n name: 'logs',\n id: 'logs',\n title: 'Logs',\n icon: <Archive />,\n content: <LogsPanel />\n }),\n windowButton({\n name: 'variables',\n id: 'variables',\n title: 'Variables',\n content: <VariablesPanel />\n }),\n windowButton({\n name: 'events',\n id: 'events',\n title: 'Events',\n content: <EventsPanel />\n }),\n windowButton({\n name: 'legend',\n id: 'legend',\n title: 'Legend',\n content: <LegendPanel />\n }),\n windowButton({\n name: 'alignment',\n id: 'distribution',\n title: 'Alignment + Distribution',\n content: <AlignmentPanel />\n }),\n windowButton({\n name: 'settings',\n id: 'system:settings',\n title: 'Settings',\n icon: <SettingsProfiles />,\n content: <Settings />\n }),\n windowButton({\n name: 'keymaps',\n id: 'keymaps',\n title: 'Keyboard Shortcuts',\n icon: <SettingsProfiles />,\n content: <KeymapsPanel />\n }),\n windowButton({\n name: 'panels',\n id: 'panels',\n title: 'Panels',\n content: <PanelPanel />\n }),\n\n new Seperator(),\n\n {\n name: 'saveLayout',\n render: function SaveLayout(rest) {\n const system = useSystem();\n\n const saveLayout = () => {\n const layout = system.tabStore.getState().layout;\n system.pubsub.publish('layout:saved', layout);\n };\n\n return (\n <MenuItemElement\n icon={<Download />}\n onClick={saveLayout}\n {...rest}\n >\n Save Layout\n </MenuItemElement>\n );\n }\n },\n {\n name: 'loadLayout',\n render: function LoadLayout(rest) {\n const system = useSystem();\n\n const loadLayout = () => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.json,application/json';\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n try {\n const parsed = await readJsonFile(file);\n if (!isLayoutBase(parsed)) {\n throw new Error('Invalid layout file');\n }\n\n system.tabStore.getState().setLayout(parsed);\n\n const graphPanel = findGraphPanel(parsed);\n if (graphPanel?.activeId) {\n system.tabStore\n .getState()\n .setCurrentPanel(graphPanel.activeId);\n }\n } catch (err) {\n console.error('Failed to load layout', err);\n }\n };\n input.click();\n };\n\n return (\n <MenuItemElement icon={<Upload />} onClick={loadLayout} {...rest}>\n Load Layout\n </MenuItemElement>\n );\n }\n }\n ]\n }\n ]\n});\n","import Menu, { Divider, Item as MenuItem, SubMenu } from 'rc-menu';\nimport React, { useMemo } from 'react';\nimport { Seperator, type ISubMenu } from '../../store/menubar.js';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\n\nexport type IItem = React.ComponentProps<typeof MenuItem> & {\n icon?: React.ReactNode;\n};\n\nconst SubMenuComponent = ({ submenu }: { submenu: ISubMenu }) => {\n //Note that eventKey should not be used per the docs\n //https://github.com/react-component/menu/blob/master/src/SubMenu/index.tsx\n //However just populating the key seems to be broken\n return (\n <SubMenu\n title={submenu.title}\n eventKey={'xx' + submenu.name}\n key={submenu.name}\n >\n {submenu.items\n .map((item, i) => {\n if (item instanceof Seperator) {\n return <Divider key={i} />;\n }\n return item.render({ key: item.name });\n })\n .flat()}\n </SubMenu>\n );\n};\n\nexport const MenuBar = () => {\n const system = useSystem();\n const { show, items } = useStore(system.menubarStore);\n\n const menuItems = useMemo(\n () =>\n items.map((submenu) => {\n return <SubMenuComponent submenu={submenu} key={submenu.name} />;\n }),\n [items]\n );\n\n return show ? <Menu mode={'horizontal'}>{menuItems}</Menu> : null;\n};\n\nexport * from './defaults.js';\nexport * from './menuItem.js';\n","import { defaultMenuDataFactory } from '@/components/menubar';\nimport { createStore } from 'zustand';\n\nexport type IMenuItem = {\n name: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n render: (rest: { [key: string]: any }) => React.ReactNode;\n};\n\nexport type ISubMenu = {\n title: string;\n name: string;\n items: (IMenuItem | Seperator)[];\n};\nexport type IMenu = {\n items: ISubMenu[];\n};\n\nexport class Seperator {}\n\nexport type MenuBarStore = {\n show: boolean;\n setShow: (show: boolean) => void;\n items: ISubMenu[];\n setItems: (items: ISubMenu[]) => void;\n setSubMenuItems: (menuName: string, items: (IMenuItem | Seperator)[]) => void;\n};\n\nexport const menubarStoreFactory = () =>\n createStore<MenuBarStore>((set) => ({\n show: true,\n setShow: (show) => set({ show }),\n items: defaultMenuDataFactory().items,\n setItems: (items) => set({ items }),\n setSubMenuItems: (menuName, items) =>\n set((state) => ({\n items: state.items.map((subMenu) =>\n subMenu.name === menuName ? { ...subMenu, items } : subMenu\n )\n }))\n }));\n","import { Position } from 'reactflow';\nimport type { Edge, Node } from 'reactflow';\nimport dagre from 'dagre';\nimport type { System } from '@/system';\nimport { pinned } from '@/annotations';\n\n// the layout direction (T = top, R = right, B = bottom, L = left, TB = top to bottom, ...)\nexport type Direction = 'TB' | 'LR' | 'RL' | 'BT';\n\nexport type Options = {\n direction: Direction;\n};\n\nconst getDimensions = (node: Node) => {\n return {\n width: node.style?.width ?? node.width ?? 300,\n height: node.style?.height ?? node.height ?? 200\n };\n};\n\nconst dagreGraph = new dagre.graphlib!.Graph();\ndagreGraph.setDefaultEdgeLabel(() => ({}));\n\nconst positionMap: Record<string, Position> = {\n T: Position.Top,\n L: Position.Left,\n R: Position.Right,\n B: Position.Bottom\n};\n\nexport function applyDagreLayout(\n system: System,\n options: Options | undefined = { direction: 'LR' }\n) {\n const { direction } = options;\n const { nodes, setNodes } = system.nodeStore.getState();\n const { edges } = system.edgeStore.getState();\n\n if (!nodes.length) {\n return;\n }\n\n dagreGraph.setGraph({ rankdir: direction });\n\n // Add nodes to layout: exclude pinned nodes and child nodes inside groups\n // Include both regular nodes and group nodes\n const layoutNodes = nodes.filter((node) => {\n if ('data' in node) {\n const isPinned = node.data.annotations?.[pinned];\n const isInGroup = !!node.parentId;\n return !isPinned && !isInGroup;\n }\n return false;\n });\n\n layoutNodes.forEach((node: Node) => {\n dagreGraph.setNode(node.id, getDimensions(node));\n });\n\n // Create a map for quick parent lookup\n const nodeParentMap = new Map<string, string>();\n nodes.forEach((node) => {\n if (node.parentId) {\n nodeParentMap.set(node.id, node.parentId);\n }\n });\n\n // Function to get the top-level node or group for layout\n const getLayoutNode = (nodeId: string): string => {\n const parentId = nodeParentMap.get(nodeId);\n return parentId ?? nodeId;\n };\n\n // Track unique edges at the layout level to avoid duplicates\n const layoutEdges = new Set<string>();\n\n edges.forEach((edge: Edge) => {\n const layoutSource = getLayoutNode(edge.source);\n const layoutTarget = getLayoutNode(edge.target);\n\n // Skip self-loops (edges within the same group)\n if (layoutSource === layoutTarget) {\n return;\n }\n\n const edgeKey = `${layoutSource}->${layoutTarget}`;\n if (!layoutEdges.has(edgeKey)) {\n layoutEdges.add(edgeKey);\n dagreGraph.setEdge(layoutSource, layoutTarget);\n }\n });\n\n dagre.layout(dagreGraph);\n\n setNodes((nodes) => {\n const layoutedNodes = nodes.map((node) => {\n // Skip pinned nodes - keep their current position\n const isPinned = 'data' in node && node.data.annotations?.[pinned];\n if (isPinned) {\n return node;\n }\n\n // Skip nodes inside groups - they maintain relative positions\n if (node.parentId) {\n return node;\n }\n\n const { x, y } = dagreGraph.node(node.id);\n\n return {\n ...node,\n sourcePosition: positionMap[direction[1]!],\n targetPosition: positionMap[direction[0]!],\n position: { x, y }\n };\n });\n return layoutedNodes;\n });\n}\n","import type { System } from '@/system';\nimport ELK, {\n type ElkExtendedEdge,\n type ElkNode,\n type ElkPort\n} from 'elkjs/lib/elk.bundled.js';\nimport type { Edge, Node } from 'reactflow';\nimport { pinned } from '@/annotations';\n\nconst layoutOptions = {\n // 'elk.algorithm': 'layered',\n 'elk.direction': 'RIGHT',\n 'elk.layered.spacing.edgeNodeBetweenLayers': '40',\n 'elk.spacing.nodeNode': '40',\n 'elk.layered.nodePlacement.strategy': 'SIMPLE'\n};\n\nexport type LayoutAlgorithm =\n | 'org.eclipse.elk.layered'\n | 'org.eclipse.elk.force'\n | 'org.eclipse.elk.rectpacking';\n\nconst elk = new ELK();\n\nconst getLayoutedNodes = async (\n nodes: Node[],\n edges: Edge[],\n algorithm: LayoutAlgorithm\n) => {\n // Filter out pinned nodes, group nodes, and nodes inside groups\n const layoutNodes = nodes.filter((node) => {\n const isPinned = 'data' in node && node.data.annotations?.[pinned];\n const isInGroup = !!node.parentId;\n const isGroup = node.type === 'group';\n return !isPinned && !isInGroup && !isGroup;\n });\n\n //Convert the edges to a lookup map\n const edgeOut = new Map<string, Edge[]>();\n const edgeIn = new Map<string, Edge[]>();\n\n edges.forEach((edge) => {\n if (!edgeOut.has(edge.source)) {\n edgeOut.set(edge.source, []);\n }\n edgeOut.get(edge.source)!.push(edge);\n\n if (!edgeIn.has(edge.target)) {\n edgeIn.set(edge.target, []);\n }\n edgeIn.get(edge.target)!.push(edge);\n });\n\n const graph: ElkNode = {\n id: 'root',\n layoutOptions: { 'elk.algorithm': algorithm, ...layoutOptions },\n children: layoutNodes.map((n) => {\n //lookup the edges for this node\n const outgoingEdges = edgeIn.get(n.id) || [];\n const incomingEdges = edgeOut.get(n.id) || [];\n\n // we need unique ids for the handles (called 'ports' in elkjs) for the layouting\n // an id is structured like: nodeId-source/target-id\n\n const targetPorts = outgoingEdges.map((e) => {\n return {\n id: e.sourceHandle as string,\n width: 10,\n height: 10,\n properties: {\n side: 'WEST'\n }\n } as ElkPort;\n });\n\n const sourcePorts = incomingEdges.map(\n (e) =>\n ({\n id: e.targetHandle as string,\n width: 10,\n height: 10,\n properties: {\n side: 'EAST'\n }\n }) as ElkPort\n );\n\n return {\n id: n.id,\n width: n.width ?? 150,\n height: n.height ?? 50,\n // ⚠️ we need to tell elk that the ports are fixed, in order to reduce edge crossings\n properties: {\n 'org.eclipse.elk.portConstraints': 'FIXED_ORDER'\n },\n // we are also passing the id, so we can also handle edges without a sourceHandle or targetHandle option\n ports: [...targetPorts, ...sourcePorts]\n };\n }),\n edges: edges.map(\n (e) =>\n ({\n id: e.id,\n sources: [e.sourceHandle || e.source],\n targets: [e.targetHandle || e.target]\n }) as ElkExtendedEdge\n )\n };\n\n const layoutedGraph = await elk.layout(graph);\n\n const layoutedNodes = nodes.map((node) => {\n // Skip pinned nodes - keep their current position\n const isPinned = 'data' in node && node.data.annotations?.[pinned];\n if (isPinned) {\n return node;\n }\n\n // Skip group nodes for now - we'll position them based on children\n if (node.type === 'group') {\n return node;\n }\n\n // Skip nodes inside groups - they maintain relative positions\n if (node.parentId) {\n return node;\n }\n\n const layoutedNode = layoutedGraph.children?.find(\n (lgNode) => lgNode.id === node.id\n );\n\n return {\n ...node,\n position: {\n x: layoutedNode?.x ?? 0,\n y: layoutedNode?.y ?? 0\n }\n };\n });\n\n // Update group positions and sizes based on their children\n const padding = 25;\n return layoutedNodes.map((node) => {\n if (node.type !== 'group') return node;\n\n const children = layoutedNodes.filter((n) => n.parentId === node.id);\n if (children.length === 0) return node;\n\n // Calculate bounding box of children (in absolute coordinates)\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n children.forEach((child) => {\n const childX = child.positionAbsolute?.x ?? child.position.x;\n const childY = child.positionAbsolute?.y ?? child.position.y;\n const childWidth = child.width ?? 150;\n const childHeight = child.height ?? 50;\n\n minX = Math.min(minX, childX);\n minY = Math.min(minY, childY);\n maxX = Math.max(maxX, childX + childWidth);\n maxY = Math.max(maxY, childY + childHeight);\n });\n\n // Position group with padding around children\n return {\n ...node,\n position: {\n x: minX - padding,\n y: minY - padding\n },\n style: {\n ...node.style,\n width: maxX - minX + padding * 2,\n height: maxY - minY + padding * 2\n }\n };\n });\n};\n\nexport const applyElkLayout = async (\n sys: System,\n algorithm: LayoutAlgorithm\n) => {\n const nodeStore = sys.nodeStore.getState();\n const nodes = Object.values(nodeStore.nodes);\n const edges = Object.values(sys.edgeStore.getState().edges);\n const reactflow = sys.refStore.getState().getRef('reactflow');\n\n if (!reactflow) {\n return;\n }\n\n const layoutedNodes = await getLayoutedNodes(nodes, edges, algorithm);\n\n nodeStore.setNodes(layoutedNodes);\n};\n","import { applyDagreLayout } from '@/layout/dagre';\nimport { applyElkLayout } from '@/layout/elk';\nimport type { System } from '@/system';\nimport { create } from 'zustand';\n\ntype Handler = (e?: KeyboardEvent) => any;\n\nexport type HotkeyStore = {\n keymap: Record<string, string | string[]>;\n handlers: Record<string, Handler>;\n descriptions: Record<string, string>;\n register(val: {\n action: string;\n trigger: string | string[];\n description?: string;\n handler?: Handler;\n }): void;\n registerDescription(action: string, description: string): void;\n registerHandler(action: string, handler: Handler): void;\n};\n\nexport const hotKeyStoreFactory = (sys: System) =>\n create<HotkeyStore>((set) => ({\n keymap: {\n SELECT_ALL: 'ctrl+a',\n DUPLICATE: ['command+d', 'ctrl+d'],\n GROUP: 'ctrl+g',\n SAVE: 'ctrl+s',\n FIND: ['ctrl+f', 'command+f'],\n AUTO_LAYOUT: 'shift+alt+f',\n COPY: ['command+c', 'ctrl+c'],\n PASTE: ['command+v', 'ctrl+v'],\n DELETE: ['delete', 'del', 'backspace'],\n UNDO: ['command+z', 'ctrl+z'],\n REDO: ['command+shift+z', 'ctrl+shift+z'],\n SAVE_VIEWPORT: [\n 'command+1',\n 'command+2',\n 'command+3',\n 'command+4',\n 'command+5',\n 'command+6',\n 'command+7',\n 'command+8',\n 'command+9',\n 'ctrl+1',\n 'ctrl+2',\n 'ctrl+3',\n 'ctrl+4',\n 'ctrl+5',\n 'ctrl+6',\n 'ctrl+7',\n 'ctrl+8',\n 'ctrl+9'\n ],\n RECALL_VIEWPORT: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],\n ZOOM_IN: ['ctrl+plus', 'command+plus'],\n ZOOM_OUT: ['command+-', 'ctrl+-'],\n ZOOM_RESET: 'ctrl+0',\n TOGGLE_GRID: ['command+shift+g', 'ctrl+shift+g'],\n TOGGLE_MINIMAP: ['command+shift+m', 'ctrl+shift+m'],\n TOGGLE_SNAP_GRID: ['command+shift+s', 'ctrl+shift+s'],\n FIT_VIEW: ['f'],\n TRACE_DOWNSTREAM: 'ctrl+shift+right',\n TRACE_UPSTREAM: 'ctrl+shift+left'\n },\n descriptions: {\n TRACE_DOWNSTREAM: 'Trace Downstream',\n TRACE_UPSTREAM: 'Trace Upstream',\n AUTO_LAYOUT: 'Auto Layout',\n COPY: 'Copy',\n PASTE: 'Paste',\n DELETE: 'Delete',\n UNDO: 'Undo',\n REDO: 'Redo',\n SELECT_ALL: 'Select All',\n DUPLICATE: 'Duplicate',\n GROUP: 'Group',\n SAVE: 'Save',\n FIND: 'Find',\n FIT_VIEW: 'Fit View',\n ZOOM_IN: 'Zoom In',\n ZOOM_OUT: 'Zoom Out',\n ZOOM_RESET: 'Zoom Reset',\n TOGGLE_GRID: 'Toggle Grid',\n TOGGLE_MINIMAP: 'Toggle Minimap',\n TOGGLE_SNAP_GRID: 'Toggle Snap Grid',\n SAVE_VIEWPORT: 'Save Viewport',\n RECALL_VIEWPORT: 'Recall Viewport'\n },\n handlers: {\n SAVE: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n sys.actionStore.getState().actions.save();\n },\n\n GROUP: () => {\n sys.actionStore.getState().actions.groupNodes();\n },\n\n COPY: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n sys.actionStore.getState().actions.copySelectionToClipboard();\n },\n PASTE: async (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n await sys.actionStore.getState().actions.pasteFromClipboard();\n },\n TRACE_UPSTREAM: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n const selection = sys.selectionStore.getState().selectedNodeId;\n if (!selection) {\n return;\n }\n sys.actionStore.getState().actions.traceUpstream(selection);\n }\n },\n TRACE_DOWNSTREAM: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n const selection = sys.selectionStore.getState().selectedNodeId;\n if (!selection) {\n return;\n }\n sys.actionStore.getState().actions.traceDownstream(selection);\n }\n },\n FIT_VIEW: (event) => {\n if (event) {\n event.preventDefault();\n const reactFlowInstance = sys.refStore.getState().getRef('reactflow');\n reactFlowInstance?.fitView({\n padding: 0.2,\n includeHiddenNodes: true\n });\n }\n },\n\n TOGGLE_SNAP_GRID: (event) => {\n if (event) {\n event.preventDefault();\n const settings = sys.systemSettings.getState();\n settings.setSnapGrid(!settings.snapGrid);\n }\n },\n TOGGLE_GRID: (event) => {\n if (event) {\n event.preventDefault();\n const settings = sys.systemSettings.getState();\n settings.setShowGrid(!settings.showGrid);\n }\n },\n SAVE_VIEWPORT: (event) => {\n if (event) {\n event?.preventDefault();\n const reactFlowInstance = sys.refStore.getState().getRef('reactflow');\n const graph = sys.graph;\n if (reactFlowInstance) {\n const currentViewport = reactFlowInstance.getViewport();\n const key = event.key; // Get pressed key (e.g., '1', '2', etc.)\n const viewportIndex = parseInt(key) - 1; // Calculate 0-based index\n\n if (viewportIndex >= 0 && viewportIndex < 9) {\n graph.setViewport(viewportIndex, currentViewport);\n sys.notifications.info(`Saved viewport ${viewportIndex + 1}`);\n }\n }\n }\n },\n RECALL_VIEWPORT: (event) => {\n if (event) {\n event.preventDefault();\n const key = event.key;\n const graph = sys.graph;\n const reactFlowInstance = sys.refStore.getState().getRef('reactflow');\n\n const viewportIndex = parseInt(key) - 1;\n\n if (viewportIndex >= 0 && viewportIndex < 9 && reactFlowInstance) {\n const viewport = graph.viewports[viewportIndex];\n if (!viewport) {\n sys.pubsub.publish('missingViewPort', {\n index: viewportIndex\n });\n return;\n }\n reactFlowInstance.setViewport(viewport);\n }\n }\n },\n SELECT_ALL: (event) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n sys.nodeStore.getState().setNodes((nodes) => {\n return nodes.map((x) => {\n return {\n ...x,\n selected: true\n };\n });\n });\n }\n },\n ZOOM_IN: (event) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n sys.refStore\n .getState()\n .getRef('reactflow')\n ?.zoomIn({ duration: 300 });\n }\n },\n ZOOM_OUT: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n sys.refStore\n .getState()\n .getRef('reactflow')\n ?.zoomOut({ duration: 300 });\n }\n },\n RESET_ZOOM: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n const reactflow = sys.refStore.getState().getRef('reactflow');\n\n if (!reactflow) return;\n\n const existing = reactflow.getViewport();\n reactflow.setViewport({ ...existing, zoom: 1 });\n }\n },\n AUTO_LAYOUT: (event) => {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n\n switch (sys.systemSettings.getState().layoutType) {\n case 'Dagre':\n applyDagreLayout(sys);\n break;\n case 'Elk - Layered':\n applyElkLayout(sys, 'org.eclipse.elk.layered');\n break;\n case 'Elk - Force':\n applyElkLayout(sys, 'org.eclipse.elk.force');\n break;\n case 'Elk - Rect':\n applyElkLayout(sys, 'org.eclipse.elk.rectpacking');\n break;\n }\n }\n },\n UNDO: (event) => {\n if (event) {\n event.preventDefault();\n sys.undoManager.undo();\n }\n },\n REDO: (event) => {\n if (event) {\n event.preventDefault();\n sys.undoManager.redo();\n }\n },\n FIND: (event) => {\n if (event) {\n event.preventDefault();\n sys.tabStore.getState().openTab('find');\n }\n }\n },\n\n register(val) {\n set((s) => ({\n handlers: {\n ...s.handlers,\n ...(val.handler ? { [val.action]: val.handler } : {})\n },\n keymap: {\n ...s.keymap,\n [val.action]: val.trigger\n },\n descriptions: {\n ...s.descriptions,\n ...(val.description ? { [val.action]: val.description } : {})\n }\n }));\n },\n registerHandler(name, handler) {\n set((s) => ({\n handlers: {\n ...s.handlers,\n [name]: handler\n }\n }));\n },\n registerDescription(name, desc) {\n set((s) => ({\n descriptions: {\n ...s.descriptions,\n [name]: desc\n }\n }));\n }\n }));\n","export interface TopicEvents {\n // This interface is meant to be extended in other parts of the application\n // using module augmentation.\n // Example:\n // declare module './pubsub' {\n // export interface TopicEvents {\n // 'user.created': { id: string; name: string };\n // 'notification': string;\n // }\n // }\n [topic: string]: any;\n}\n\ntype Subscriber<Events extends TopicEvents, K extends keyof Events> = (\n message: K,\n data: Events[K]\n) => void;\n\ntype AnySubscriber = (message: string, data: any) => void;\n\nexport class PubSub<Events extends TopicEvents = TopicEvents> {\n private messages: Record<string, Record<string, AnySubscriber>> = {};\n private lastUid = -1;\n private static readonly ALL_SUBSCRIBING_MSG = '*';\n\n private hasKeys(obj: object): boolean {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return true;\n }\n }\n return false;\n }\n\n private throwException(ex: Error) {\n return function reThrowException() {\n throw ex;\n };\n }\n\n private callSubscriberWithDelayedExceptions(\n subscriber: AnySubscriber,\n message: string,\n data: any\n ) {\n try {\n subscriber(message, data);\n } catch (ex: any) {\n setTimeout(this.throwException(ex), 0);\n }\n }\n\n private callSubscriberWithImmediateExceptions(\n subscriber: AnySubscriber,\n message: string,\n data: any\n ) {\n subscriber(message, data);\n }\n\n private deliverMessage(\n originalMessage: string,\n matchedMessage: string,\n data: any,\n immediateExceptions?: boolean\n ) {\n const subscribers = this.messages[matchedMessage];\n const callSubscriber = immediateExceptions\n ? this.callSubscriberWithImmediateExceptions\n : this.callSubscriberWithDelayedExceptions;\n\n if (!Object.prototype.hasOwnProperty.call(this.messages, matchedMessage)) {\n return;\n }\n\n for (const s in subscribers) {\n if (Object.prototype.hasOwnProperty.call(subscribers, s)) {\n callSubscriber.call(this, subscribers[s]!, originalMessage, data);\n }\n }\n }\n\n private createDeliveryFunction<K extends keyof Events & string>(\n message: K,\n data: Events[K],\n immediateExceptions?: boolean\n ): () => void {\n return () => {\n const messageString = message as string;\n let topic = messageString;\n let position = topic.lastIndexOf('.');\n\n this.deliverMessage(\n messageString,\n messageString,\n data,\n immediateExceptions\n );\n\n while (position !== -1) {\n topic = topic.substr(0, position);\n position = topic.lastIndexOf('.');\n this.deliverMessage(messageString, topic, data, immediateExceptions);\n }\n\n this.deliverMessage(\n messageString,\n PubSub.ALL_SUBSCRIBING_MSG,\n data,\n immediateExceptions\n );\n };\n }\n\n private hasDirectSubscribersFor(message: string): boolean {\n const topic = String(message);\n return (\n Object.prototype.hasOwnProperty.call(this.messages, topic) &&\n this.hasKeys(this.messages[topic]!)\n );\n }\n\n private messageHasSubscribers(message: string): boolean {\n let topic = String(message);\n let found =\n this.hasDirectSubscribersFor(topic) ||\n this.hasDirectSubscribersFor(PubSub.ALL_SUBSCRIBING_MSG);\n let position = topic.lastIndexOf('.');\n\n while (!found && position !== -1) {\n topic = topic.substr(0, position);\n position = topic.lastIndexOf('.');\n found = this.hasDirectSubscribersFor(topic);\n }\n\n return found;\n }\n\n private internalPublish<K extends keyof Events & string>(\n message: K,\n data: Events[K],\n sync: boolean,\n immediateExceptions: boolean = false\n ): boolean {\n const messageString = message as string;\n\n const deliver = this.createDeliveryFunction(\n message,\n data,\n immediateExceptions\n );\n const hasSubscribers = this.messageHasSubscribers(messageString);\n\n if (!hasSubscribers) {\n return false;\n }\n\n if (sync) {\n deliver();\n } else {\n setTimeout(deliver, 0);\n }\n return true;\n }\n\n public publishHook<K extends keyof Events & string>(\n message: K,\n data: Events[K]\n ): boolean {\n return this.internalPublish(message, data, false, true);\n }\n\n public publish<K extends keyof Events & string>(\n message: K,\n data: Events[K]\n ): boolean {\n return this.internalPublish(message, data, false);\n }\n\n public publishSync<K extends keyof Events & string>(\n message: K,\n data: Events[K]\n ): boolean {\n return this.internalPublish(message, data, true);\n }\n\n public subscribe<K extends keyof Events & string>(\n message: K,\n func: Subscriber<Events, K>\n ): string | false {\n if (typeof func !== 'function') {\n return false;\n }\n\n const messageString = message as string;\n\n if (!Object.prototype.hasOwnProperty.call(this.messages, messageString)) {\n this.messages[messageString] = {};\n }\n\n const token = `uid_${String(++this.lastUid)}`;\n this.messages[messageString]![token] = func as AnySubscriber;\n\n return token;\n }\n\n public subscribeAll(func: AnySubscriber): string | false {\n return this.subscribe(PubSub.ALL_SUBSCRIBING_MSG, func);\n }\n\n public subscribeOnce<K extends keyof Events & string>(\n message: K,\n func: Subscriber<Events, K>\n ): this {\n const token = this.subscribe(message, (msg, data) => {\n this.unsubscribe(token as string);\n func(msg, data);\n });\n return this;\n }\n\n public clearAllSubscriptions(): void {\n this.messages = {};\n }\n\n public clearSubscriptions(topic: string): void {\n for (const m in this.messages) {\n if (\n Object.prototype.hasOwnProperty.call(this.messages, m) &&\n m.indexOf(topic) === 0\n ) {\n delete this.messages[m];\n }\n }\n }\n\n public countSubscriptions(topic: string): number {\n let count = 0;\n for (const m in this.messages) {\n if (\n Object.prototype.hasOwnProperty.call(this.messages, m) &&\n m.indexOf(topic) === 0\n ) {\n for (const token in this.messages[m]) {\n if (Object.prototype.hasOwnProperty.call(this.messages[m], token)) {\n count++;\n }\n }\n }\n }\n return count;\n }\n\n public getSubscriptions(topic: string): string[] {\n const list: string[] = [];\n for (const m in this.messages) {\n if (\n Object.prototype.hasOwnProperty.call(this.messages, m) &&\n m.indexOf(topic) === 0\n ) {\n list.push(m);\n }\n }\n return list;\n }\n\n private descendantTopicExists(topic: string): boolean {\n for (const m in this.messages) {\n if (\n Object.prototype.hasOwnProperty.call(this.messages, m) &&\n m.indexOf(topic) === 0\n ) {\n return true;\n }\n }\n return false;\n }\n\n public unsubscribe(value: string | Function): boolean | string {\n const isTopic =\n typeof value === 'string' &&\n (Object.prototype.hasOwnProperty.call(this.messages, value) ||\n this.descendantTopicExists(value));\n const isToken = !isTopic && typeof value === 'string';\n const isFunction = typeof value === 'function';\n let result: boolean | string = false;\n\n if (isTopic) {\n this.clearSubscriptions(value as string);\n return true; // Indicate success\n }\n\n for (const m in this.messages) {\n if (Object.prototype.hasOwnProperty.call(this.messages, m)) {\n const message = this.messages[m];\n\n if (!message) {\n continue;\n }\n\n if (isToken && message[value as string]) {\n delete message[value as string];\n result = value;\n break;\n }\n\n if (isFunction) {\n for (const t in message) {\n if (\n Object.prototype.hasOwnProperty.call(message, t) &&\n message[t] === value\n ) {\n delete message[t];\n result = true;\n }\n }\n }\n }\n }\n\n return result;\n }\n}\n","import { Position, getBezierPath } from 'reactflow';\nimport type { EdgeProps } from 'reactflow';\n\nexport type BetterBezierEdgeProps<T = unknown> = EdgeProps<T> & {\n pathOptions?: {\n offset?: number;\n };\n};\n\nexport interface GetBetterBezierPathParams {\n sourceX: number;\n sourceY: number;\n sourcePosition?: Position;\n targetX: number;\n targetY: number;\n targetPosition?: Position;\n offset?: number;\n}\n\ninterface GetControlParams {\n pos: Position;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nfunction getControl({\n pos,\n x1,\n y1,\n x2,\n y2\n}: GetControlParams): [number, number] {\n if (pos === Position.Left || pos === Position.Right) {\n return [0.5 * (x1 + x2), y1];\n }\n\n return [x1, 0.5 * (y1 + y2)];\n}\n\nexport function getBetterBezierPath({\n sourceX,\n sourceY,\n sourcePosition = Position.Bottom,\n targetX,\n targetY,\n targetPosition = Position.Top,\n offset = 75\n}: GetBetterBezierPathParams): [\n path: string,\n labelX: number,\n labelY: number,\n offsetX: number,\n offsetY: number\n] {\n let [sourceControlX, sourceControlY] = getControl({\n pos: sourcePosition,\n x1: sourceX,\n y1: sourceY,\n x2: targetX,\n y2: targetY\n });\n let [targetControlX, targetControlY] = getControl({\n pos: targetPosition,\n x1: targetX,\n y1: targetY,\n x2: sourceX,\n y2: sourceY\n });\n\n if (offset) {\n switch (sourcePosition) {\n case Position.Top:\n sourceControlX = sourceX;\n sourceControlY = sourceY - offset;\n break;\n case Position.Bottom:\n sourceControlX = sourceX;\n sourceControlY = sourceY + offset;\n break;\n case Position.Left:\n sourceControlX = sourceX - offset;\n sourceControlY = sourceY;\n break;\n case Position.Right:\n sourceControlX = sourceX + offset;\n sourceControlY = sourceY;\n break;\n default:\n sourceControlX = sourceX + offset;\n sourceControlY = sourceY;\n }\n\n switch (targetPosition) {\n case Position.Top:\n targetControlX = targetX;\n targetControlY = targetY - offset;\n break;\n case Position.Bottom:\n targetControlX = targetX;\n targetControlY = targetY + offset;\n break;\n case Position.Left:\n targetControlX = targetX - offset;\n targetControlY = targetY;\n break;\n case Position.Right:\n targetControlX = targetX + offset;\n targetControlY = targetY;\n break;\n default:\n targetControlX = targetX - offset;\n targetControlY = targetY;\n }\n }\n\n const [, labelX, labelY, offsetX, offsetY] = getBezierPath({\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition\n });\n\n return [\n `M${sourceX},${sourceY} C${sourceControlX},${sourceControlY} ${targetControlX},${targetControlY} ${targetX},${targetY}`,\n labelX,\n labelY,\n offsetX,\n offsetY\n ];\n}\n","import { getBetterBezierPath } from './offsetBezier';\nimport {\n getSimpleBezierPath,\n getSmoothStepPath,\n getStraightPath,\n type EdgeProps,\n useReactFlow,\n Position\n} from 'reactflow';\nimport { useSystem } from '@/system/provider.js';\nimport { useStore } from 'zustand';\nimport { EDGE_TYPE } from '@/store/settings';\nimport { useState, useCallback, type MouseEvent } from 'react';\n\ninterface ControlPoint {\n x: number;\n y: number;\n}\n\n// Generate path for different edge types with control points\nfunction generatePathWithControlPoints(\n sourceX: number,\n sourceY: number,\n targetX: number,\n targetY: number,\n controlPoints: ControlPoint[],\n edgeType: string,\n _sourcePosition?: Position,\n _targetPosition?: Position\n): string {\n if (controlPoints.length === 0) {\n // No control points, use default edge type\n let edgeFn;\n switch (edgeType) {\n case EDGE_TYPE.bezier:\n edgeFn = getBetterBezierPath;\n break;\n case EDGE_TYPE.simpleBezier:\n edgeFn = getSimpleBezierPath;\n break;\n case EDGE_TYPE.smoothStep:\n edgeFn = getSmoothStepPath;\n break;\n case EDGE_TYPE.straight:\n edgeFn = getStraightPath;\n break;\n default:\n edgeFn = getBetterBezierPath;\n }\n\n const [path] = edgeFn({\n sourceX,\n sourceY,\n sourcePosition: _sourcePosition,\n targetX,\n targetY,\n targetPosition: _targetPosition\n });\n return path;\n }\n\n // Build path through all control points\n const allPoints = [\n { x: sourceX, y: sourceY },\n ...controlPoints,\n { x: targetX, y: targetY }\n ];\n\n if (edgeType === EDGE_TYPE.straight) {\n // Straight lines through all points\n const pathParts = allPoints.map((p, i) =>\n i === 0 ? `M ${p.x},${p.y}` : `L ${p.x},${p.y}`\n );\n return pathParts.join(' ');\n } else if (edgeType === EDGE_TYPE.smoothStep) {\n // Smooth step style through control points\n let path = `M ${allPoints[0]?.x},${allPoints[0]?.y}`;\n for (let i = 0; i < allPoints.length - 1; i++) {\n const current = allPoints[i];\n const next = allPoints[i + 1];\n if (!current || !next) continue;\n const midX = (current.x + next.x) / 2;\n // Create smooth step\n path += ` L ${midX},${current.y} L ${midX},${next.y}`;\n }\n path += ` L ${allPoints[allPoints.length - 1]?.x},${allPoints[allPoints.length - 1]?.y}`;\n return path;\n } else {\n // Bezier curve through all points\n if (allPoints.length === 2) {\n return `M ${allPoints[0]?.x},${allPoints[0]?.y} L ${allPoints[1]?.x},${allPoints[1]?.y}`;\n } else if (allPoints.length === 3) {\n return `M ${allPoints[0]?.x},${allPoints[0]?.y} Q ${allPoints[1]?.x},${allPoints[1]?.y} ${allPoints[2]?.x},${allPoints[2]?.y}`;\n } else {\n // For multiple control points, use cubic bezier segments\n let path = `M ${allPoints[0]?.x},${allPoints[0]?.y}`;\n for (let i = 0; i < allPoints.length - 1; i++) {\n const p1 = allPoints[i + 1];\n if (!p1) continue;\n\n if (i === allPoints.length - 2) {\n // Last segment\n path += ` L ${p1.x},${p1.y}`;\n } else {\n // Smooth curve using quadratic bezier\n path += ` Q ${p1.x},${p1.y}`;\n if (i < allPoints.length - 2) {\n const p2 = allPoints[i + 2];\n if (p2) {\n const midX = (p1.x + p2.x) / 2;\n const midY = (p1.y + p2.y) / 2;\n path += ` ${midX},${midY}`;\n }\n }\n }\n }\n return path;\n }\n }\n}\n\ntype CustomEdgeProps = EdgeProps & {\n data: {\n controlPoints?: ControlPoint[];\n text?: string;\n };\n};\n\nexport const CustomEdge = ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n data,\n markerEnd,\n selected\n}: CustomEdgeProps) => {\n const sys = useSystem();\n const edgeType = useStore(sys.systemSettings, (x) => x.edgeType);\n const snapGrid = useStore(sys.systemSettings, (x) => x.snapGrid);\n const gridSize = useStore(sys.systemSettings, (x) => x.gridSize);\n const { setEdges } = useReactFlow();\n\n // Get control points from edge data\n const controlPoints: ControlPoint[] = data?.controlPoints || [];\n const [draggingIndex, setDraggingIndex] = useState<number | null>(null);\n\n const handleDoubleClick = useCallback(\n (event: MouseEvent<SVGPathElement>) => {\n event.stopPropagation();\n\n // Get click position on SVG\n const svgElement = (event.target as SVGElement).ownerSVGElement;\n if (!svgElement) return;\n\n const point = svgElement.createSVGPoint();\n point.x = event.clientX;\n point.y = event.clientY;\n const svgPoint = point.matrixTransform(\n svgElement.getScreenCTM()?.inverse()\n );\n\n // Build array of all points (source -> control points -> target)\n const allPoints = [\n { x: sourceX, y: sourceY },\n ...controlPoints,\n { x: targetX, y: targetY }\n ];\n\n // Find which segment was clicked by finding closest segment\n let closestSegmentIndex = 0;\n let minDistance = Infinity;\n\n for (let i = 0; i < allPoints.length - 1; i++) {\n const p1 = allPoints[i];\n const p2 = allPoints[i + 1];\n if (!p1 || !p2) continue;\n\n // Calculate distance from click point to line segment\n const dx = p2.x - p1.x;\n const dy = p2.y - p1.y;\n const lengthSquared = dx * dx + dy * dy;\n\n let t = 0;\n if (lengthSquared > 0) {\n t = Math.max(\n 0,\n Math.min(\n 1,\n ((svgPoint.x - p1.x) * dx + (svgPoint.y - p1.y) * dy) /\n lengthSquared\n )\n );\n }\n\n const projX = p1.x + t * dx;\n const projY = p1.y + t * dy;\n const distance = Math.sqrt(\n (svgPoint.x - projX) ** 2 + (svgPoint.y - projY) ** 2\n );\n\n if (distance < minDistance) {\n minDistance = distance;\n closestSegmentIndex = i;\n }\n }\n\n // Insert the new control point at the correct position\n setEdges((edges) =>\n edges.map((edge) => {\n if (edge.id !== id) return edge;\n\n const currentPoints = edge.data?.controlPoints || [];\n const newPoints = [...currentPoints];\n\n // closestSegmentIndex 0 means between source and first control point (or target if no control points)\n // So we insert at index closestSegmentIndex\n newPoints.splice(closestSegmentIndex, 0, {\n x: svgPoint.x,\n y: svgPoint.y\n });\n\n return {\n ...edge,\n data: {\n ...edge.data,\n controlPoints: newPoints\n }\n };\n })\n );\n },\n [id, sourceX, sourceY, targetX, targetY, controlPoints, setEdges]\n );\n\n const handleControlPointMouseDown = useCallback(\n (event: MouseEvent<SVGGElement>, index: number) => {\n event.stopPropagation();\n setDraggingIndex(index);\n\n const handleMouseMove = (moveEvent: globalThis.MouseEvent) => {\n const svgElement = (event.target as SVGElement).ownerSVGElement;\n if (!svgElement) return;\n\n const point = svgElement.createSVGPoint();\n point.x = moveEvent.clientX;\n point.y = moveEvent.clientY;\n const svgPoint = point.matrixTransform(\n svgElement.getScreenCTM()?.inverse()\n );\n\n // Snap to grid if enabled\n let x = svgPoint.x;\n let y = svgPoint.y;\n if (snapGrid) {\n x = Math.round(x / gridSize) * gridSize;\n y = Math.round(y / gridSize) * gridSize;\n }\n\n setEdges((edges) =>\n edges.map((edge) => {\n if (edge.id !== id) return edge;\n const points: ControlPoint[] = edge.data?.controlPoints || [];\n const newPoints = [...points];\n newPoints[index] = { x, y };\n return {\n ...edge,\n data: {\n ...edge.data,\n controlPoints: newPoints\n }\n };\n })\n );\n };\n\n const handleMouseUp = () => {\n setDraggingIndex(null);\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [id, snapGrid, gridSize, setEdges]\n );\n\n const handleRemoveControlPoint = useCallback(\n (event: MouseEvent, index: number) => {\n event.stopPropagation();\n setEdges((edges) =>\n edges.map((edge) => {\n if (edge.id !== id) return edge;\n const points: ControlPoint[] = edge.data?.controlPoints || [];\n const newPoints = points.filter((_, i) => i !== index);\n return {\n ...edge,\n data: {\n ...edge.data,\n controlPoints: newPoints\n }\n };\n })\n );\n },\n [id, setEdges]\n );\n\n const edgePath = generatePathWithControlPoints(\n sourceX,\n sourceY,\n targetX,\n targetY,\n controlPoints,\n edgeType,\n sourcePosition,\n targetPosition\n );\n\n return (\n <>\n <path className=\"react-flow__edge-path-back\" d={edgePath} />\n <path\n id={id}\n fill=\"none\"\n className=\"react-flow__edge-path\"\n d={edgePath}\n markerEnd={markerEnd}\n />\n <path\n d={edgePath}\n fill=\"none\"\n strokeOpacity=\"0\"\n strokeWidth=\"20\"\n className=\"react-flow__edge-interaction\"\n onDoubleClick={handleDoubleClick}\n style={{ cursor: 'pointer' }}\n />\n\n {/* Render control points - only when selected */}\n {selected &&\n controlPoints.map((point, index) => {\n const isDragging = draggingIndex === index;\n return (\n <g\n key={`cp-${index}`}\n onMouseDown={(e) => handleControlPointMouseDown(e, index)}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n {/* Large invisible hit area for easier selection */}\n <circle\n cx={point.x}\n cy={point.y}\n r={15}\n fill=\"transparent\"\n strokeWidth={0}\n pointerEvents=\"all\"\n />\n {/* Visible control point */}\n <circle\n cx={point.x}\n cy={point.y}\n r={7}\n fill=\"#4CAF50\"\n stroke=\"#fff\"\n strokeWidth={2}\n pointerEvents=\"none\"\n />\n {/* Remove button (X) */}\n <g\n onClick={(e) => handleRemoveControlPoint(e, index)}\n style={{ cursor: 'pointer', pointerEvents: 'all' }}\n >\n <circle\n cx={point.x + 10}\n cy={point.y - 10}\n r={6}\n fill=\"#f44336\"\n stroke=\"#fff\"\n strokeWidth={1}\n />\n <text\n x={point.x + 10}\n y={point.y - 10}\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n fill=\"#fff\"\n fontSize=\"10\"\n fontWeight=\"bold\"\n pointerEvents=\"none\"\n >\n ×\n </text>\n </g>\n </g>\n );\n })}\n\n {/* Guide lines showing control point influence - only when selected */}\n {selected &&\n controlPoints.length > 0 &&\n controlPoints[0] &&\n controlPoints[controlPoints.length - 1] && (\n <>\n <line\n x1={sourceX}\n y1={sourceY}\n x2={controlPoints[0].x}\n y2={controlPoints[0].y}\n stroke=\"#4CAF50\"\n strokeWidth={1}\n strokeDasharray=\"3,3\"\n opacity={0.2}\n pointerEvents=\"none\"\n />\n {controlPoints.map((point, index) => {\n if (index < controlPoints.length - 1) {\n const nextPoint = controlPoints[index + 1];\n if (!nextPoint || !point) return null;\n return (\n <line\n key={`guide-${index}`}\n x1={point.x}\n y1={point.y}\n x2={nextPoint.x}\n y2={nextPoint.y}\n stroke=\"#4CAF50\"\n strokeWidth={1}\n strokeDasharray=\"3,3\"\n opacity={0.2}\n pointerEvents=\"none\"\n />\n );\n }\n return null;\n })}\n {controlPoints[controlPoints.length - 1] && (\n <line\n x1={controlPoints[controlPoints.length - 1]!.x}\n y1={controlPoints[controlPoints.length - 1]!.y}\n x2={targetX}\n y2={targetY}\n stroke=\"#4CAF50\"\n strokeWidth={1}\n strokeDasharray=\"3,3\"\n opacity={0.2}\n pointerEvents=\"none\"\n />\n )}\n </>\n )}\n\n <text>\n <textPath\n href={`#${id}`}\n style={{ fontSize: 12 }}\n startOffset=\"50%\"\n textAnchor=\"middle\"\n >\n {data?.text}\n </textPath>\n </text>\n </>\n );\n};\n","import type { Edge, Node } from 'reactflow';\n\nexport const autoLayout = (nodes: Node[], _edges: Edge[]) => {\n let x = 0;\n nodes.forEach((node) => {\n node.position.x = x;\n x += 200;\n });\n};\n","import type { GraphJSON } from '@kiberon-labs/behave-graph';\n\nexport const hasPositionMetaData = (graph: GraphJSON): boolean => {\n if (graph.nodes === undefined) return false;\n return graph.nodes.some(\n (node) =>\n node.metadata?.positionX !== undefined ||\n node.metadata?.positionY !== undefined\n );\n};\n","import {\n type NodeProps,\n NodeToolbar,\n getNodesBounds,\n useStore\n} from 'reactflow';\nimport { NodeResizer } from '@reactflow/node-resizer';\nimport { useCallback, type ComponentType } from 'react';\nimport { VscodeButton } from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system/provider';\nimport type { IGroupNode } from '@/types/nodes';\n\nconst lineStyle = { borderColor: 'white' };\nconst padding = 25;\n\nfunction GroupNode(props: NodeProps<IGroupNode['data']>) {\n const { id, data } = props;\n const system = useSystem();\n const { minWidth, minHeight, hasChildNodes } = useStore((store) => {\n const childNodes = Array.from(store.nodeInternals.values()).filter(\n (n) => n.parentId === id\n );\n const rect = getNodesBounds(childNodes);\n\n return {\n minWidth: rect.width + padding * 2,\n minHeight: rect.height + padding * 2,\n hasChildNodes: childNodes.length > 0\n };\n }, isEqual);\n\n const onDelete = useCallback(() => {\n system.actionStore.getState().actions.deleteNodes([id]);\n }, [system, id]);\n\n const onDetach = useCallback(() => {\n system.actionStore.getState().actions.ungroupNodes(id);\n }, [system, id]);\n\n const onColorChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n system.actionStore\n .getState()\n .actions.updateGroupColor(id, e.target.value);\n },\n [system, id]\n );\n\n return (\n <div\n style={{\n height: '100%',\n width: '100%',\n position: 'relative',\n background: `${data.color || '#FF0000'}40`\n }}\n >\n <NodeResizer\n lineStyle={lineStyle}\n minWidth={minWidth}\n minHeight={minHeight}\n />\n\n <NodeToolbar className=\"nodrag\">\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <input\n type=\"color\"\n value={data.color || '#FF0000'}\n onChange={onColorChange}\n style={{\n width: '32px',\n height: '28px',\n border: '1px solid var(--vscode-input-border)',\n borderRadius: '4px',\n cursor: 'pointer',\n backgroundColor: 'transparent'\n }}\n title=\"Change group color\"\n />\n <VscodeButton secondary onClick={onDelete}>\n Delete\n </VscodeButton>\n {hasChildNodes && (\n <VscodeButton secondary onClick={onDetach}>\n Ungroup\n </VscodeButton>\n )}\n </div>\n </NodeToolbar>\n </div>\n );\n}\n\nGroupNode as ComponentType<NodeProps<IGroupNode['data']>>;\ntype IsEqualCompareObj = {\n minWidth: number;\n minHeight: number;\n hasChildNodes: boolean;\n};\n\nfunction isEqual(prev: IsEqualCompareObj, next: IsEqualCompareObj): boolean {\n return (\n prev.minWidth === next.minWidth &&\n prev.minHeight === next.minHeight &&\n prev.hasChildNodes === next.hasChildNodes\n );\n}\n\nexport default GroupNode as ComponentType<NodeProps<IGroupNode['data']>>;\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/nodes/comment/styles.module_built.css\";\nconst classes = {\"editorContent\":\"cXhyVq_editorContent\",\"editorContainer\":\"cXhyVq_editorContainer\",\"commentNode\":\"cXhyVq_commentNode\",\"fadeIn\":\"cXhyVq_fadeIn\",\"isActive\":\"cXhyVq_isActive\",\"separator\":\"cXhyVq_separator\",\"bubbleMenu\":\"cXhyVq_bubbleMenu\",\"menuBar\":\"cXhyVq_menuBar\"}\nexport default classes\n\nconst _editorContent0 = classes[\"editorContent\"]\nexport { _editorContent0 as \"editorContent\" }\n\nconst _editorContainer0 = classes[\"editorContainer\"]\nexport { _editorContainer0 as \"editorContainer\" }\n\nconst _commentNode0 = classes[\"commentNode\"]\nexport { _commentNode0 as \"commentNode\" }\n\nconst _fadeIn0 = classes[\"fadeIn\"]\nexport { _fadeIn0 as \"fadeIn\" }\n\nconst _isActive0 = classes[\"isActive\"]\nexport { _isActive0 as \"isActive\" }\n\nconst _separator0 = classes[\"separator\"]\nexport { _separator0 as \"separator\" }\n\nconst _bubbleMenu0 = classes[\"bubbleMenu\"]\nexport { _bubbleMenu0 as \"bubbleMenu\" }\n\nconst _menuBar0 = classes[\"menuBar\"]\nexport { _menuBar0 as \"menuBar\" }\n","import styles from './styles.module.css';\nimport type { Editor } from '@tiptap/react';\nimport { Code, List, NumberedListLeft, Quote } from 'iconoir-react';\n\ninterface FormatToolbarProps {\n editor: Editor;\n}\n\nexport const FormatToolbar = ({ editor }: FormatToolbarProps) => {\n return (\n <div className={styles.bubbleMenu}>\n <div className={styles.menuBar}>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBold().run()}\n className={editor.isActive('bold') ? styles.isActive : ''}\n title=\"Bold\"\n >\n <strong>B</strong>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleItalic().run()}\n className={editor.isActive('italic') ? styles.isActive : ''}\n title=\"Italic\"\n >\n <em>I</em>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleStrike().run()}\n className={editor.isActive('strike') ? styles.isActive : ''}\n title=\"Strikethrough\"\n >\n <s>S</s>\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleCode().run()}\n className={editor.isActive('code') ? styles.isActive : ''}\n title=\"Code\"\n >\n <Code />\n </button>\n <div className={styles.separator} />\n <button\n type=\"button\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 1 }).run()\n }\n className={\n editor.isActive('heading', { level: 1 }) ? styles.isActive : ''\n }\n title=\"Heading 1\"\n >\n H1\n </button>\n <button\n type=\"button\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 2 }).run()\n }\n className={\n editor.isActive('heading', { level: 2 }) ? styles.isActive : ''\n }\n title=\"Heading 2\"\n >\n H2\n </button>\n <button\n type=\"button\"\n onClick={() =>\n editor.chain().focus().toggleHeading({ level: 3 }).run()\n }\n className={\n editor.isActive('heading', { level: 3 }) ? styles.isActive : ''\n }\n title=\"Heading 3\"\n >\n H3\n </button>\n <div className={styles.separator} />\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n className={editor.isActive('bulletList') ? styles.isActive : ''}\n title=\"Bullet List\"\n >\n <List />\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n className={editor.isActive('orderedList') ? styles.isActive : ''}\n title=\"Numbered List\"\n >\n <NumberedListLeft />\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n className={editor.isActive('codeBlock') ? styles.isActive : ''}\n title=\"Code Block\"\n >\n <Code />\n </button>\n <button\n type=\"button\"\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n className={editor.isActive('blockquote') ? styles.isActive : ''}\n title=\"Quote\"\n >\n <Quote />\n </button>\n </div>\n </div>\n );\n};\n","import styles from './styles.module.css';\nimport { memo, useEffect, useRef, useState } from 'react';\nimport { NodeResizer, type OnResize } from 'reactflow';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport { useChangeNodeData } from '@/hooks/useChangeNodeData';\nimport { BaseNodeWrapper } from '../wrapper';\nimport { Markdown } from 'tiptap-markdown';\nimport type { ICommentNode } from '@/types/nodes';\nimport { FormatToolbar } from './FormatToolbar';\nimport type { NodeProps } from 'reactflow';\n\nconst CommentNodeRaw = ({\n data,\n selected,\n id\n}: NodeProps<ICommentNode['data']>) => {\n const [isEditing, setIsEditing] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const handleNodeChange = useChangeNodeData(id);\n\n const editor = useEditor({\n extensions: [StarterKit, Markdown],\n content: data.text || '> Comment',\n editable: isEditing,\n editorProps: {\n attributes: {\n class: 'prose prose-sm focus:outline-none w-full h-full nodrag',\n style: `font-size: ${data.fontSize || 'medium'}; padding: 0.5rem;`\n }\n },\n onUpdate: ({ editor }) => {\n const markdown = (\n editor.storage as { markdown?: { getMarkdown(): string } }\n ).markdown;\n if (markdown) {\n handleNodeChange('text', markdown.getMarkdown());\n }\n }\n });\n\n useEffect(() => {\n if (editor) {\n editor.setEditable(isEditing);\n }\n }, [isEditing, editor]);\n\n useEffect(() => {\n if (editor && data.fontSize) {\n const editorElement = editor.view.dom as HTMLElement;\n editorElement.style.fontSize = data.fontSize;\n }\n }, [data.fontSize, editor]);\n\n const onResize: OnResize = (event, params) => {\n if (!containerRef.current) return;\n containerRef.current.style.height = `${params.height}px`;\n containerRef.current.style.width = `${params.width}px`;\n };\n\n const handleDoubleClick = () => {\n setIsEditing(true);\n setTimeout(() => {\n editor?.commands.focus();\n }, 0);\n };\n\n const handleBlur = (e: React.FocusEvent) => {\n // Check if the new focus target is within the editor\n const relatedTarget = e.relatedTarget as Node;\n if (containerRef.current?.contains(relatedTarget)) {\n return; // Don't close if focus is moving within the editor\n }\n\n setTimeout(() => {\n setIsEditing(false);\n }, 200);\n };\n\n return (\n <BaseNodeWrapper metadata={data.annotations}>\n <div className={styles.commentNode}>\n <NodeResizer\n onResize={onResize}\n color=\"#ff0071\"\n isVisible={selected || false}\n />\n\n <div\n ref={containerRef}\n className={styles.editorContainer}\n onDoubleClick={handleDoubleClick}\n onBlur={handleBlur}\n >\n {editor && isEditing && <FormatToolbar editor={editor} />}\n <EditorContent editor={editor} className={styles.editorContent} />\n </div>\n </div>\n </BaseNodeWrapper>\n );\n};\n\nexport const CommentNode = memo(CommentNodeRaw);\n","import type { NodeProps } from 'reactflow';\nimport { Node } from './Node';\nimport { useSystem } from '@/system/provider.js';\nimport { useStore } from 'zustand';\nimport type { IBehaveNode } from '@/types/nodes.js';\n\nexport const BehaveNode = (props: NodeProps<IBehaveNode['data']>) => {\n const sys = useSystem();\n const allSpecs = useStore(sys.specStore, (s) => s.specs);\n const specDict = useStore(sys.specStore, (s) => s.specDict);\n return (\n <Node spec={specDict[props.data.type]!} allSpecs={allSpecs} {...props} />\n );\n};\n","import { CustomEdge } from '@/components/edges';\nimport type { System } from '@/system';\nimport { behaveToFlow } from '@/transformers/behaveToFlow';\nimport { flowToBehave } from '@/transformers/flowToBehave';\nimport { autoLayout } from '@/util/autoLayout';\nimport { hasPositionMetaData } from '@/util/hasPositionMetaData';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport {\n applyEdgeChanges,\n type Edge,\n type Node,\n type EdgeChange,\n type NodeChange,\n applyNodeChanges as nativeNodeChanges,\n type EdgeProps,\n type NodeProps\n} from 'reactflow';\nimport { create } from 'zustand';\nimport { nonDeletable } from '@/annotations';\nimport GroupNode from '@/components/nodes/group';\nimport { CommentNode } from '@/components/nodes/comment/comment';\nimport { BehaveNode } from '@/components/nodes/behave';\n\nexport type FlowStore = {\n graphJson: GraphJSON | null;\n setGraph: (graph: GraphJSON, options?: { skipLayout?: boolean }) => void;\n getGraph: () => GraphJSON;\n nodeTypes: Record<string, React.ComponentType<NodeProps>>;\n edgeTypes: Record<string, React.ComponentType<EdgeProps>>;\n invalidateCache: () => void;\n registerNodeType: (\n type: string,\n component: React.ComponentType<NodeProps>\n ) => void;\n registerEdgeType: (\n type: string,\n component: React.ComponentType<EdgeProps>\n ) => void;\n};\n\n// const specJson = useStore(sys.specStore, (s) => s.specs);\n// const [customNodeTypes, setCustomNodeTypes] = useState<NodeTypes>();\n// useEffect(() => {\n// if (!specJson) return;\n// const customNodeTypes: Record<\n// AnyNodeType,\n// React.ComponentType<any>\n// > = getCustomNodeTypes(specJson);\n\n// customNodeTypes['commentNode'] = CommentNode;\n// customNodeTypes['group'] = GroupNode;\n// // customNodeTypes['behaveNode:ai'] = AINode;\n\n// setCustomNodeTypes(customNodeTypes);\n// }, [specJson]);\n\nexport const flowStoreFactory = (system: System) => {\n const flowStore = create<FlowStore>((set, get) => ({\n graphJson: null,\n nodeTypes: {\n group: GroupNode,\n commentNode: CommentNode,\n behaveNode: BehaveNode\n },\n invalidateCache: () => set({ graphJson: null }),\n getGraph: () => {\n const cached = get().graphJson;\n if (cached) {\n return cached;\n }\n\n const nodes = system.nodeStore.getState().nodes;\n const edges = system.edgeStore.getState().edges;\n const _variables = system.variableStore.getState().variables;\n const specs = system.specStore.getState().specs;\n\n const computed = flowToBehave(system, nodes, edges, specs);\n\n set({ graphJson: computed });\n return computed;\n },\n\n setGraph: (graphJson: GraphJSON, options?: { skipLayout?: boolean }) => {\n system.eventsStore\n .getState()\n .setCustomEvents(\n Object.fromEntries(\n (graphJson.customEvents ?? []).map((evt) => [evt.id, evt])\n )\n );\n\n // Parse variables from JSON directly (no need to instantiate graph)\n const variables: Record<string, any> = {};\n if (graphJson.variables) {\n graphJson.variables.forEach((varJson) => {\n const valueType =\n system.registry.getState().values[varJson.valueTypeName];\n const initialValue = valueType?.deserialize\n ? valueType.deserialize(varJson.initialValue)\n : varJson.initialValue;\n\n variables[varJson.id] = {\n id: varJson.id,\n name: varJson.name,\n valueTypeName: varJson.valueTypeName,\n initialValue\n };\n });\n }\n\n // Only convert and set nodes/edges if not skipping layout\n // (when loading UIGraphJSON, nodes/edges are already set by deseralize)\n if (!options?.skipLayout) {\n const [nodes, edges] = behaveToFlow(graphJson);\n\n if (!hasPositionMetaData(graphJson)) {\n autoLayout(nodes, edges);\n }\n system.nodeStore.getState().setNodes(nodes);\n system.edgeStore.getState().setEdges(edges);\n }\n\n // custom events stored in system.eventsStore\n system.variableStore.getState().setVariables(variables);\n get().invalidateCache();\n },\n edgeTypes: {\n default: CustomEdge as React.ComponentType<EdgeProps>\n },\n\n registerNodeType(type: string, component: React.ComponentType<NodeProps>) {\n set((state) => ({\n nodeTypes: {\n ...state.nodeTypes,\n [type]: component\n }\n }));\n },\n registerEdgeType(type: string, component: React.ComponentType<EdgeProps>) {\n set((state) => ({\n edgeTypes: {\n ...state.edgeTypes,\n [type]: component\n }\n }));\n }\n }));\n\n system.nodeStore.subscribe(() => {\n flowStore.getState().invalidateCache();\n });\n\n system.eventsStore.subscribe(() => {\n flowStore.getState().invalidateCache();\n });\n\n return flowStore;\n};\n\nexport type NodeStore = {\n nodes: Node[];\n addNode: (node: Node) => void;\n setNodes: (nodes: Node[] | ((existing: Node[]) => Node[])) => void;\n clearNodes: () => void;\n applyNodeChanges: (changes: NodeChange[]) => void;\n};\n\nexport const nodeStoreFactory = (system: System) =>\n create<NodeStore>((set) => ({\n nodes: [],\n addNode(node) {\n set((x) => ({ nodes: [...x.nodes, node] }));\n system.pubsub.publish('node:added', node);\n },\n applyNodeChanges(changes: NodeChange[]) {\n set((p) => {\n // Filter out remove changes for nodes with nonDeletable annotation\n const filteredChanges = changes.filter((change) => {\n if (change.type === 'remove') {\n const node = p.nodes.find((n) => n.id === change.id);\n if (node?.data?.metadata?.[nonDeletable]) {\n return false;\n }\n // Publish nodeRemoved event for deletable nodes\n if (node) {\n system.pubsub.publish('node:removed', node);\n }\n }\n return true;\n });\n return {\n nodes: nativeNodeChanges(filteredChanges, p.nodes)\n };\n });\n },\n setNodes(nodes) {\n set((p) => ({\n nodes: typeof nodes === 'function' ? nodes(p.nodes) : nodes\n }));\n },\n clearNodes() {\n set(() => ({ nodes: [] }));\n }\n }));\n\nexport type EdgeStore = {\n edges: Edge[];\n addEdge: (edge: Edge) => void;\n setEdges: (edges: Edge[]) => void;\n clearEdges: () => void;\n applyEdgeChanges: (changes: EdgeChange[]) => void;\n};\n\nexport const edgeStoreFactory = (_system: System) =>\n create<EdgeStore>((set) => ({\n edges: [],\n\n addEdge(edge) {\n set((x) => ({ edges: [...x.edges, edge] }));\n },\n applyEdgeChanges(changes: EdgeChange[]) {\n set((p) => {\n // Publish events for edge removals\n changes.forEach((change) => {\n if (change.type === 'remove') {\n const edge = p.edges.find((e) => e.id === change.id);\n if (edge) {\n _system.pubsub.publish('edge:removed', edge);\n }\n }\n });\n return {\n edges: applyEdgeChanges(changes, p.edges)\n };\n });\n },\n\n setEdges(edges) {\n set(() => ({ edges }));\n },\n\n clearEdges() {\n set(() => ({ edges: [] }));\n }\n }));\n","import type { ControlProps } from '@/store/controls';\nimport { JsonEditor } from 'json-edit-react';\n\nexport const AnyControl = (props: ControlProps) => {\n return (\n <JsonEditor data={props.value} setData={(data) => props.onChange(data)} />\n );\n};\n","import React from 'react';\nimport type { ControlProps } from '@/store/controls';\nimport { VscodeCheckbox } from '@vscode-elements/react-elements';\n\nexport const BooleanControl: React.FC<ControlProps> = ({ value, onChange }) => {\n return (\n <VscodeCheckbox\n type=\"checkbox\"\n checked={!!value}\n onChange={(e) => onChange((e.currentTarget as HTMLInputElement).checked)}\n />\n );\n};\n","import React, { useCallback } from 'react';\nimport type { ControlProps } from '@/store/controls';\nimport { VscodeTextfield } from '@vscode-elements/react-elements';\n\nexport const NumberControl: React.FC<ControlProps> = ({\n value,\n onChange,\n valueType\n}) => {\n const isInteger = valueType === 'integer';\n\n const handleChange = useCallback(\n (e: Event) => {\n //WOW the @vscode-elements/react-elements typings are really bad, we have to do this hack to get the value out of the event\n const stringValue = (e as unknown as React.ChangeEvent<HTMLInputElement>)\n .currentTarget.value;\n const num = isInteger\n ? parseInt(stringValue, 10)\n : parseFloat(stringValue);\n if (!isNaN(num)) {\n onChange(num);\n }\n },\n [isInteger, onChange]\n );\n\n return (\n <VscodeTextfield\n type=\"number\"\n value={value ?? ''}\n onChange={handleChange}\n step={isInteger ? 1 : undefined}\n />\n );\n};\n","import React from 'react';\nimport type { ControlProps } from '@/store/controls';\nimport {\n VscodeTextarea,\n VscodeTextfield\n} from '@vscode-elements/react-elements';\n\nexport const StringControl: React.FC<ControlProps> = ({ value, onChange }) => {\n return (\n <VscodeTextarea\n // type=\"text\"\n value={value ?? ''}\n onChange={(e) => onChange((e.currentTarget as HTMLTextAreaElement).value)}\n />\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/controls/colorPicker/InputPopover.module_built.css\";\nconst classes = {\"popoverContent\":\"TSabVa_popoverContent\",\"slideLeftAndFade\":\"TSabVa_slideLeftAndFade\",\"slideDownAndFade\":\"TSabVa_slideDownAndFade\",\"slideUpAndFade\":\"TSabVa_slideUpAndFade\",\"slideRightAndFade\":\"TSabVa_slideRightAndFade\",\"popoverArrow\":\"TSabVa_popoverArrow\",\"popoverClose\":\"TSabVa_popoverClose\"}\nexport default classes\n\nconst _popoverContent0 = classes[\"popoverContent\"]\nexport { _popoverContent0 as \"popoverContent\" }\n\nconst _slideLeftAndFade0 = classes[\"slideLeftAndFade\"]\nexport { _slideLeftAndFade0 as \"slideLeftAndFade\" }\n\nconst _slideDownAndFade0 = classes[\"slideDownAndFade\"]\nexport { _slideDownAndFade0 as \"slideDownAndFade\" }\n\nconst _slideUpAndFade0 = classes[\"slideUpAndFade\"]\nexport { _slideUpAndFade0 as \"slideUpAndFade\" }\n\nconst _slideRightAndFade0 = classes[\"slideRightAndFade\"]\nexport { _slideRightAndFade0 as \"slideRightAndFade\" }\n\nconst _popoverArrow0 = classes[\"popoverArrow\"]\nexport { _popoverArrow0 as \"popoverArrow\" }\n\nconst _popoverClose0 = classes[\"popoverClose\"]\nexport { _popoverClose0 as \"popoverClose\" }\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/controls/colorPicker/index.module_built.css\";\nconst classes = {\"popoverCloseRemoveButton\":\"jBt58a_popoverCloseRemoveButton\",\"colorPickerTrigger\":\"jBt58a_colorPickerTrigger\"}\nexport default classes\n\nconst _popoverCloseRemoveButton0 = classes[\"popoverCloseRemoveButton\"]\nexport { _popoverCloseRemoveButton0 as \"popoverCloseRemoveButton\" }\n\nconst _colorPickerTrigger0 = classes[\"colorPickerTrigger\"]\nexport { _colorPickerTrigger0 as \"colorPickerTrigger\" }\n","import { VscodeButton, VscodeTextfield } from '@vscode-elements/react-elements';\nimport { HexColorPicker } from 'react-colorful';\nimport { PopoverClose } from '@radix-ui/react-popover';\nimport InputPopover from './InputPopover.js';\nimport styles from './index.module.css';\n\nexport function ColorControl({\n value,\n onChange\n}: Pick<ColorPickerPopoverProps, 'value' | 'onChange'>) {\n return (\n <HexColorPicker\n color={value}\n onChange={onChange}\n style={{ flexShrink: 0 }}\n />\n );\n}\n\ntype ColorPickerPopoverProps = {\n value: string;\n defaultOpen?: boolean;\n onChange: (value: string) => void;\n showRemoveButton?: boolean;\n onRemove?: () => void;\n};\n\nexport function ColorPickerPopover({\n value,\n defaultOpen = false,\n onChange,\n showRemoveButton = false,\n onRemove\n}: ColorPickerPopoverProps) {\n return (\n <InputPopover\n defaultOpen={defaultOpen}\n trigger={\n <button\n style={{ background: value }}\n className={styles.colorPickerTrigger}\n />\n }\n >\n <ColorControl value={value} onChange={onChange} />\n <VscodeTextfield\n value={value}\n onChange={(event) => {\n onChange((event.target as HTMLInputElement).value);\n }}\n />\n {showRemoveButton && (\n <PopoverClose className={styles.popoverCloseRemoveButton}>\n <VscodeButton onClick={onRemove} style={{ background: 'red' }}>\n Remove color\n </VscodeButton>\n </PopoverClose>\n )}\n </InputPopover>\n );\n}\n","import { AnyControl } from '@/components/controls/any';\nimport { BooleanControl } from '@/components/controls/boolean';\nimport { NumberControl } from '@/components/controls/number';\nimport { StringControl } from '@/components/controls/string';\nimport { ColorControl } from '@/components/controls/colorPicker';\nimport {\n Cube,\n Droplet,\n EaseCurveControlPoints,\n Hashtag,\n InputOutput,\n SelectPoint3d,\n Text\n} from 'iconoir-react';\nimport { create } from 'zustand';\n\nexport interface ControlProps<T = any> {\n value: T;\n onChange: (value: T) => void;\n valueType?: string;\n}\n\nexport type ControlComponent<T = any> = React.FC<ControlProps<T>>;\n\nexport type ControlsStore = {\n icons: Record<string, React.ComponentType>;\n controls: Record<string, React.FC<ControlProps>>;\n defaultControl: React.FC<ControlProps>;\n registerControl: (name: string, control: React.FC<ControlProps>) => void;\n};\n\nexport const controlsStoreFactory = () =>\n create<ControlsStore>((set) => ({\n // store the component references (not instantiated elements)\n defaultIcon: SelectPoint3d,\n\n defaultControl: AnyControl,\n controls: {\n color: ColorControl,\n string: StringControl,\n number: NumberControl,\n float: NumberControl,\n integer: NumberControl,\n boolean: BooleanControl\n },\n icons: {\n color: Droplet,\n curve: EaseCurveControlPoints,\n string: Text,\n boolean: InputOutput,\n float: Hashtag,\n integer: Hashtag,\n object: Cube\n },\n registerControl: (name: string, control: React.FC<ControlProps>) =>\n set((state) => ({\n controls: {\n ...state.controls,\n [name]: control\n }\n }))\n }));\n","import type { VariableJSON } from '@kiberon-labs/behave-graph';\n\nimport { create } from 'zustand';\n\ntype GraphVariables = {\n [key: string]: VariableJSON;\n};\n\nexport type VariableStore = {\n variables: GraphVariables;\n setVariable: (key: string, value: VariableJSON) => void;\n setVariables: (variables: GraphVariables) => void;\n removeVariable: (key: string) => void;\n};\n\nexport const variableStoreFactory = () =>\n create<VariableStore>((set) => ({\n variables: {},\n setVariables: (variables: GraphVariables) =>\n set(() => ({\n variables\n })),\n setVariable: (key: string, value: VariableJSON) => {\n set((state) => ({\n variables: {\n ...state.variables,\n [key]: value\n }\n }));\n },\n removeVariable: (key: string) =>\n set((state) => {\n const newVariables = { ...state.variables };\n delete newVariables[key];\n return { variables: newVariables };\n })\n }));\n","import type { System } from '@/system';\nimport { create } from 'zustand';\n\nexport type SelectionStore = {\n selectedNodeId: string | null;\n setSelectedNodeId: (nodeId: string | null) => void;\n};\n\nexport const selectionStoreFactory = (system: System) => {\n const store = create<SelectionStore>((set) => ({\n selectedNodeId: null,\n setSelectedNodeId: (selectedNodeId: string | null) =>\n set(() => ({ selectedNodeId }))\n }));\n //Track side effect of selected node in the node store\n system.nodeStore.subscribe((state) => {\n const selectedNode = state.nodes.find((n) => n.selected);\n store.getState().setSelectedNodeId(selectedNode?.id ?? null);\n });\n\n return store;\n};\n","import type { Viewport } from 'reactflow';\nimport type { System } from './system';\nimport type { Edge } from 'reactflow';\nimport type { UIGraphJSON } from '@/types/graph';\n\n/**\n * This is our internal graph representation that we use to perform transformations on\n * It represents the general graph structure, not the underlying behavior graph instance\n */\nexport class Graph {\n public readonly viewports: Viewport[] = [];\n private sys: System;\n\n protected annotations: { [key: string]: any } = {};\n\n constructor(system: System) {\n this.sys = system;\n }\n\n setViewport(index: number, viewport: Viewport) {\n this.viewports[index] = viewport;\n this.sys.pubsub.publish('saveViewport', {\n index: index,\n viewport: viewport\n });\n }\n\n /**\n * Clears the graph\n */\n clear() {\n const nodes = this.sys.nodeStore.getState().nodes;\n const edges = this.sys.edgeStore.getState().edges;\n this.sys.undoManager.execute({\n name: 'Clear graph',\n undo: () => {\n this.sys.nodeStore.getState().setNodes(Object.values(nodes));\n this.sys.edgeStore.getState().setEdges(Object.values(edges));\n },\n execute: () => {\n this.sys.nodeStore.getState().setNodes([]);\n this.sys.edgeStore.getState().setEdges([]);\n }\n });\n }\n\n /**\n * Return all edges that point into the nodes inputs.\n * O(m) the amount of edges\n */\n inEdges(nodeId: string, sourceHandle?: string): Edge[] {\n //Get the edges\n const edges = this.sys.edgeStore.getState().edges;\n\n return Object.values(edges).filter((x) => {\n if (x.target !== nodeId) {\n return false;\n }\n if (sourceHandle) {\n return x.targetHandle === sourceHandle;\n }\n return true;\n });\n }\n\n /**\n * Return all edges that are pointed out by node v.\n * O(m) the amount of edges\n */\n outEdges(nodeId: string, targetHandle?: string): Edge[] {\n //Get the edges\n const edges = this.sys.edgeStore.getState().edges;\n\n return Object.values(edges).filter((x) => {\n if (x.source !== nodeId) {\n return false;\n }\n if (targetHandle) {\n return x.targetHandle === targetHandle;\n }\n return true;\n });\n }\n\n serialize(): UIGraphJSON {\n return {\n v: '1.0.0',\n name: 'Untitled Graph',\n user: {\n viewport: this.viewports[0] || { x: 0, y: 0, zoom: 1 }\n },\n annotations: this.annotations,\n data: {\n layers: this.sys.layerStore.getState().serialize()\n },\n flow: {},\n nodes: Object.values(this.sys.nodeStore.getState().nodes),\n edges: Object.values(this.sys.edgeStore.getState().edges)\n };\n }\n\n getAnnotations() {\n return { ...this.annotations };\n }\n\n setAnnotations(annotations: { [key: string]: any }) {\n this.annotations = {\n ...this.annotations,\n ...annotations\n };\n this.sys.pubsub.publish('graphAnnotationsChanged', this.getAnnotations());\n }\n\n deseralize(data: UIGraphJSON) {\n //Load nodes\n this.sys.nodeStore.getState().setNodes(data.nodes);\n this.sys.edgeStore.getState().setEdges(data.edges);\n this.annotations = data.annotations || {};\n this.sys.layerStore.getState().deserialize(data.data?.layers);\n\n // Restore viewport\n if (data.user?.viewport) {\n const reactflow = this.sys.refStore.getState().getRef('reactflow');\n if (reactflow) {\n reactflow.setViewport(data.user.viewport);\n }\n }\n\n // Restore multiple viewports if they exist\n if (data.user?.viewports) {\n this.viewports.splice(0, this.viewports.length, ...data.user.viewports);\n }\n }\n}\n","import type { System } from '@/system/system';\nimport { annotatedTitle, uiVersion } from '@/annotations';\nimport type { UIGraphJSON } from '@/types/graph';\n\nconst DEFAULT_UI_GRAPH_VERSION = '1.0.0';\nconst DEFAULT_UI_GRAPH_NAME = 'Untitled Graph';\n\nfunction getStringAnnotation(\n annotations: Record<string, unknown>,\n key: string\n): string | undefined {\n const value = annotations[key];\n return typeof value === 'string' && value.trim().length > 0\n ? value\n : undefined;\n}\n\n/**\n * Assembles the full UI graph definition for saving.\n */\nexport function buildUIGraphJSON(system: System): UIGraphJSON {\n system.flowStore.getState().invalidateCache();\n\n const flow = system.flowStore.getState().getGraph();\n const nodes = system.nodeStore.getState().nodes;\n const edges = system.edgeStore.getState().edges;\n\n const annotations = system.graph.getAnnotations?.() ?? {};\n\n const reactflow = system.refStore.getState().getRef('reactflow');\n const viewport = reactflow?.getViewport?.() ??\n system.graph.viewports[0] ?? { x: 0, y: 0, zoom: 1 };\n\n const graphVersion =\n getStringAnnotation(annotations, uiVersion) ?? DEFAULT_UI_GRAPH_VERSION;\n const graphName =\n getStringAnnotation(annotations, annotatedTitle) ??\n flow.name ??\n DEFAULT_UI_GRAPH_NAME;\n\n const viewports = system.graph.viewports.length\n ? system.graph.viewports.map((v) => ({ x: v.x, y: v.y, zoom: v.zoom }))\n : undefined;\n\n return {\n v: graphVersion,\n name: graphName,\n annotations,\n data: {\n layers: system.layerStore.getState().serialize()\n },\n flow,\n nodes,\n edges,\n user: {\n viewport: { x: viewport.x, y: viewport.y, zoom: viewport.zoom },\n viewports\n }\n };\n}\n","import type { System } from '@/system';\nimport { Graph } from 'graphlib';\nimport { create } from 'zustand';\nimport copyToClipboard from 'copy-to-clipboard';\nimport type { Edge, Node, XYPosition } from 'reactflow';\nimport { getNodesBounds } from 'reactflow';\nimport { v4 as uuidv4 } from 'uuid';\nimport { hidden, pinned } from '@/annotations';\nimport { buildUIGraphJSON } from '@/transformers/Uigraph';\nimport type { UIGraphJSON } from '../types/graph';\nimport type { IBehaveNode } from '@/types/nodes';\n\nconst FILTERED_CLASS_NAME = 'filtered';\n\ntype NodeClipboardPayloadV1 = {\n type: 'behave-graph/flow-nodes';\n v: 1;\n nodes: Node[];\n edges?: Edge[];\n};\n\nconst NODE_CLIPBOARD_PREFIX = 'behave-graph:nodes:';\n\nlet inMemoryClipboard: string | null = null;\nlet pasteSequence = 0;\n\nconst encodeNodeClipboardPayload = (payload: NodeClipboardPayloadV1) =>\n `${NODE_CLIPBOARD_PREFIX}${JSON.stringify(payload)}`;\n\nconst decodeNodeClipboardPayload = (\n text: string\n): NodeClipboardPayloadV1 | null => {\n try {\n const raw = text.startsWith(NODE_CLIPBOARD_PREFIX)\n ? text.slice(NODE_CLIPBOARD_PREFIX.length)\n : text;\n const parsed = JSON.parse(raw) as Partial<NodeClipboardPayloadV1>;\n if (parsed?.type !== 'behave-graph/flow-nodes') return null;\n if (parsed?.v !== 1) return null;\n if (!Array.isArray(parsed?.nodes)) return null;\n if (parsed?.edges && !Array.isArray(parsed.edges)) return null;\n return parsed as NodeClipboardPayloadV1;\n } catch {\n return null;\n }\n};\n\nconst deepClone = <T,>(value: T): T => {\n const sc = (globalThis as any).structuredClone as\n | ((value: any) => any)\n | undefined;\n if (typeof sc === 'function') {\n return sc(value) as T;\n }\n return JSON.parse(JSON.stringify(value)) as T;\n};\n\n/**\n * Extend or modify this interface to add more actions as needed.\n */\nexport interface Actions {\n traceUpstream: (nodeId: string) => void;\n traceDownstream: (nodeId: string) => void;\n focusNode: (nodeId: string) => void;\n resetTrace: () => void;\n addBehaveNode: (nodeType: string, position: XYPosition) => void;\n copySelectionToClipboard: () => void;\n pasteFromClipboard: () => Promise<void>;\n toggleNodeHidden: (nodeId: string) => void;\n toggleNodePinned: (nodeId: string) => void;\n groupNodes: () => void;\n ungroupNodes: (groupId: string) => void;\n deleteNodes: (nodeIds: string[]) => void;\n updateGroupColor: (groupId: string, color: string) => void;\n // Triggers the save graph\n save: () => Promise<UIGraphJSON>;\n}\n\nexport type ActionStore = {\n actions: Actions;\n setAction: <K extends keyof Actions>(key: K, action: Actions[K]) => void;\n getAction: <K extends keyof Actions>(key: K) => Actions[K] | undefined;\n};\n\n/**\n * Converts to a graph lib graph\n * @param sys\n * @returns\n */\nconst convertToGraph = (sys: System) => {\n const nodes = sys.nodeStore.getState().nodes;\n const edges = sys.edgeStore.getState().edges;\n\n const graph = new Graph({ multigraph: true });\n nodes.forEach((node) => graph.setNode(node.id));\n edges.forEach((edge) => graph.setEdge(edge.source, edge.target));\n return graph;\n};\n\nconst findAllUpstream = (id: string, graph: Graph): string[] => {\n return (graph.predecessors(id) || []).flatMap((x) =>\n [x].concat(findAllUpstream(x, graph))\n );\n};\n\nconst findAllDownstream = (id: string, graph: Graph): string[] => {\n return (graph.successors(id) || []).flatMap((x) =>\n [x].concat(findAllDownstream(x, graph))\n );\n};\n\nconst createNodeLookup = (nodes: string[]) => {\n return nodes.reduce(\n (acc, node) => {\n acc[node] = true;\n return acc;\n },\n {} as Record<string, boolean>\n );\n};\n\nconst applyFilters = (sys: System, lookup: Record<string, boolean>) => {\n sys.nodeStore.getState().setNodes((nodes) => {\n const newNodes = nodes.map((x) => {\n if (!lookup[x.id]) {\n return {\n ...x,\n className: FILTERED_CLASS_NAME // clsx(x.className ?? '', FILTERED_CLASS_NAME)\n };\n }\n return {\n ...x,\n className: (x.className ?? '')\n .split(' ')\n .filter((c) => c !== FILTERED_CLASS_NAME)\n .join(' ')\n };\n });\n return newNodes;\n });\n};\n\nexport const actionStoreFactory = (sys: System) =>\n create<ActionStore>((set, get) => ({\n actions: {\n save: async () => {\n try {\n const uiGraph = buildUIGraphJSON(sys);\n sys.pubsub.publish('graph:saved', uiGraph);\n return uiGraph;\n } catch (err) {\n sys.notifications.error('Failed to save graph');\n throw err;\n }\n },\n traceUpstream: (nodeId: string) => {\n const graph = convertToGraph(sys);\n const foundNodes = createNodeLookup(\n findAllUpstream(nodeId, graph).concat([nodeId])\n );\n applyFilters(sys, foundNodes);\n },\n traceDownstream: (nodeId: string) => {\n const graph = convertToGraph(sys);\n const foundNodes = createNodeLookup(\n findAllDownstream(nodeId, graph).concat([nodeId])\n );\n\n applyFilters(sys, foundNodes);\n },\n resetTrace: () => {\n sys.nodeStore.getState().setNodes((nodes) =>\n nodes.map((x) => {\n //Remove filtering\n return {\n ...x,\n className: (x.className ?? '')\n .split(' ')\n .filter((c) => c !== FILTERED_CLASS_NAME)\n .join(' ')\n };\n })\n );\n },\n focusNode: (nodeId: string) => {\n const reactflow = sys.refStore.getState().getRef('reactflow');\n if (!reactflow) {\n return;\n }\n\n const node = reactflow.getNodes().find((n) => n.id === nodeId);\n\n if (node) {\n reactflow.fitView({\n padding: 0.2,\n duration: 200,\n includeHiddenNodes: true,\n nodes: [node]\n });\n }\n },\n addBehaveNode: (nodeType: string, position: XYPosition) => {\n const newNode: IBehaveNode = {\n id: uuidv4(),\n type: 'behaveNode',\n position,\n data: {\n configuration: {},\n type: nodeType,\n ports: {},\n dynamicPorts: {}\n }\n };\n\n sys.undoManager.execute({\n name: `Add node (${nodeType})`,\n execute: () => {\n sys.nodeStore.getState().addNode(newNode);\n },\n undo: () => {\n sys.nodeStore\n .getState()\n .setNodes((existing) =>\n existing.filter((n) => n.id !== newNode.id)\n );\n }\n });\n },\n copySelectionToClipboard: () => {\n const selected = sys.nodeStore\n .getState()\n .nodes.filter((n) => n.selected);\n\n if (selected.length === 0) return;\n\n const selectedIds = new Set(selected.map((n) => n.id));\n const selectedEdges = sys.edgeStore\n .getState()\n .edges.filter(\n (e) => selectedIds.has(e.source) && selectedIds.has(e.target)\n );\n\n pasteSequence = 0;\n const payload: NodeClipboardPayloadV1 = {\n type: 'behave-graph/flow-nodes',\n v: 1,\n nodes: selected,\n edges: selectedEdges\n };\n\n const encoded = encodeNodeClipboardPayload(payload);\n inMemoryClipboard = encoded;\n copyToClipboard(encoded);\n },\n pasteFromClipboard: async () => {\n let text: string | null = inMemoryClipboard;\n if (typeof navigator !== 'undefined' && navigator.clipboard?.readText) {\n try {\n text = await navigator.clipboard.readText();\n } catch {\n // ignore and fall back to in-memory clipboard\n }\n }\n\n if (!text) return;\n const payload = decodeNodeClipboardPayload(text);\n if (!payload) return;\n\n const sourceNodes = payload.nodes;\n if (!sourceNodes.length) return;\n\n const sourceEdges = payload.edges ?? [];\n\n const selectedIds = new Set(sourceNodes.map((n) => n.id));\n const idMap = new Map<string, string>();\n for (const node of sourceNodes) {\n idMap.set(node.id, uuidv4());\n }\n\n const offset = 20 * (pasteSequence + 1);\n const dx = offset;\n const dy = offset;\n\n const newNodes: Node[] = sourceNodes.map((n) => {\n const cloned = deepClone(n);\n const newId = idMap.get(cloned.id);\n if (!newId) return cloned;\n\n const hasValidParent =\n !!cloned.parentId && selectedIds.has(cloned.parentId);\n\n // If the parent isn't being copied too, detach so it pastes in global space\n if (cloned.parentId && !hasValidParent) {\n const posAbs = cloned.positionAbsolute as\n | { x: number; y: number }\n | undefined;\n if (posAbs) {\n cloned.position = { x: posAbs.x, y: posAbs.y };\n }\n cloned.parentId = undefined;\n cloned.extent = undefined;\n }\n\n cloned.id = newId;\n cloned.selected = true;\n\n if (cloned.parentId && hasValidParent) {\n cloned.parentId = idMap.get(cloned.parentId) ?? cloned.parentId;\n }\n\n cloned.position = {\n x: (cloned.position?.x ?? 0) + dx,\n y: (cloned.position?.y ?? 0) + dy\n };\n\n const abs = cloned.positionAbsolute as\n | { x: number; y: number }\n | undefined;\n if (abs) {\n cloned.positionAbsolute = { x: abs.x + dx, y: abs.y + dy };\n }\n\n return cloned;\n });\n\n const newEdges: Edge[] = sourceEdges\n .filter((e) => idMap.has(e.source) && idMap.has(e.target))\n .map((e) => {\n const cloned = deepClone(e);\n cloned.id = uuidv4();\n cloned.source = idMap.get(e.source) ?? e.source;\n cloned.target = idMap.get(e.target) ?? e.target;\n return cloned;\n });\n\n const newIds = new Set(newNodes.map((n) => n.id));\n const newEdgeIds = new Set(newEdges.map((e) => e.id));\n const prevSelected: Record<string, boolean> = {};\n for (const node of sys.nodeStore.getState().nodes) {\n prevSelected[node.id] = !!node.selected;\n }\n\n sys.undoManager.execute({\n name: 'Paste',\n execute: () => {\n sys.nodeStore.getState().setNodes((nodes) => {\n const unselected = nodes.map((n) => ({ ...n, selected: false }));\n return [...unselected, ...newNodes];\n });\n if (newEdges.length) {\n const existingEdges = sys.edgeStore.getState().edges;\n sys.edgeStore\n .getState()\n .setEdges([...existingEdges, ...newEdges]);\n }\n },\n undo: () => {\n sys.nodeStore\n .getState()\n .setNodes((nodes) =>\n nodes\n .filter((n) => !newIds.has(n.id))\n .map((n) => ({ ...n, selected: prevSelected[n.id] ?? false }))\n );\n if (newEdgeIds.size) {\n sys.edgeStore\n .getState()\n .setEdges(\n sys.edgeStore\n .getState()\n .edges.filter((e) => !newEdgeIds.has(e.id))\n );\n }\n }\n });\n\n pasteSequence += 1;\n },\n toggleNodeHidden: (nodeId: string) => {\n const currentNode = sys.nodeStore\n .getState()\n .nodes.find((n) => n.id === nodeId);\n\n if (!currentNode || !('data' in currentNode)) return;\n\n const currentHiddenState =\n currentNode.data.annotations?.[hidden] ?? false;\n const newHiddenState = !currentHiddenState;\n\n sys.undoManager.execute({\n name: newHiddenState ? 'Hide node' : 'Show node',\n execute: () => {\n sys.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) =>\n node.id === nodeId && 'data' in node\n ? {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [hidden]: newHiddenState\n }\n }\n }\n : node\n )\n );\n },\n undo: () => {\n sys.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) =>\n node.id === nodeId && 'data' in node\n ? {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [hidden]: currentHiddenState\n }\n }\n }\n : node\n )\n );\n }\n });\n },\n toggleNodePinned: (nodeId: string) => {\n const currentNode = sys.nodeStore\n .getState()\n .nodes.find((n) => n.id === nodeId);\n\n if (!currentNode || !('data' in currentNode)) return;\n\n const currentPinnedState =\n currentNode.data.annotations?.[pinned] ?? false;\n const newPinnedState = !currentPinnedState;\n\n sys.undoManager.execute({\n name: newPinnedState ? 'Pin node' : 'Unpin node',\n execute: () => {\n sys.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) =>\n node.id === nodeId && 'data' in node\n ? {\n ...node,\n draggable: !newPinnedState,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [pinned]: newPinnedState\n }\n }\n }\n : node\n )\n );\n },\n undo: () => {\n sys.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) =>\n node.id === nodeId && 'data' in node\n ? {\n ...node,\n draggable: currentPinnedState,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [pinned]: currentPinnedState\n }\n }\n }\n : node\n )\n );\n }\n });\n },\n groupNodes: () => {\n const nodes = sys.nodeStore.getState().nodes;\n // Only group nodes that don't already have a parent\n const selectedNodes = nodes.filter((n) => n.selected && !n.parentId);\n\n if (selectedNodes.length === 0) return;\n\n // Calculate bounds of selected nodes\n const rect = getNodesBounds(selectedNodes);\n const groupId = uuidv4();\n\n const padding = 25;\n const groupNode: Node = {\n id: groupId,\n type: 'group',\n position: { x: rect.x - padding, y: rect.y - padding },\n data: { color: '#6366f1' },\n style: {\n width: rect.width + padding * 2,\n height: rect.height + padding * 2\n },\n selected: false,\n draggable: true\n };\n\n // Store original state for undo\n const originalNodes = selectedNodes.map((n) => ({\n id: n.id,\n parentId: n.parentId,\n position: { ...n.position },\n extent: n.extent\n }));\n\n sys.undoManager.execute({\n name: 'Group nodes',\n execute: () => {\n sys.nodeStore.getState().setNodes((nodes) => {\n const updatedNodes = nodes.map((node) => {\n const selectedNode = selectedNodes.find(\n (sn) => sn.id === node.id\n );\n if (!selectedNode) return node;\n\n return {\n ...node,\n parentId: groupId,\n position: {\n x: node.position.x - rect.x + padding,\n y: node.position.y - rect.y + padding\n },\n extent: 'parent' as const\n };\n });\n\n // Add group node at the head of the array\n return [groupNode, ...updatedNodes];\n });\n },\n undo: () => {\n sys.nodeStore.getState().setNodes((nodes) => {\n // Remove the group node and restore original state\n const filteredNodes = nodes.filter((n) => n.id !== groupId);\n return filteredNodes.map((node) => {\n const original = originalNodes.find((on) => on.id === node.id);\n if (!original) return node;\n\n return {\n ...node,\n parentId: original.parentId,\n position: original.position,\n extent: original.extent\n };\n });\n });\n }\n });\n },\n ungroupNodes: (groupId: string) => {\n const nodes = sys.nodeStore.getState().nodes;\n const childNodes = nodes.filter((n) => n.parentId === groupId);\n\n if (childNodes.length === 0) return;\n\n const groupNode = nodes.find((n) => n.id === groupId);\n if (!groupNode) return;\n\n // Store original state for undo\n const originalChildNodes = childNodes.map((n) => ({\n id: n.id,\n parentId: n.parentId,\n position: { ...n.position },\n extent: n.extent\n }));\n\n sys.undoManager.execute({\n name: 'Ungroup nodes',\n execute: () => {\n sys.nodeStore.getState().setNodes((nodes) => {\n return nodes\n .filter((n) => n.id !== groupId)\n .map((node) => {\n const childNode = childNodes.find((cn) => cn.id === node.id);\n if (!childNode) return node;\n\n const posAbs = node.positionAbsolute || node.position;\n return {\n ...node,\n parentId: undefined,\n position: {\n x: posAbs.x,\n y: posAbs.y\n },\n extent: undefined\n };\n });\n });\n },\n undo: () => {\n sys.nodeStore.getState().setNodes((nodes) => {\n const restoredNodes = nodes.map((node) => {\n const original = originalChildNodes.find(\n (on) => on.id === node.id\n );\n if (!original) return node;\n\n return {\n ...node,\n parentId: original.parentId,\n position: original.position,\n extent: original.extent\n };\n });\n\n // Add back the group node at the head\n return [groupNode, ...restoredNodes];\n });\n }\n });\n },\n deleteNodes: (nodeIds: string[]) => {\n const nodes = sys.nodeStore.getState().nodes;\n const edges = sys.edgeStore.getState().edges;\n\n // Get edges connected to these nodes\n const edgesToDelete = edges.filter(\n (e) => nodeIds.includes(e.source) || nodeIds.includes(e.target)\n );\n\n sys.undoManager.execute({\n name:\n nodeIds.length === 1\n ? 'Delete node'\n : `Delete ${nodeIds.length} nodes`,\n execute: () => {\n sys.edgeStore\n .getState()\n .setEdges(\n edges.filter((e) => !edgesToDelete.some((ed) => ed.id === e.id))\n );\n sys.nodeStore\n .getState()\n .setNodes(nodes.filter((n) => !nodeIds.includes(n.id)));\n },\n undo: () => {\n sys.nodeStore.getState().setNodes([...nodes]);\n sys.edgeStore.getState().setEdges([...edges]);\n }\n });\n },\n updateGroupColor: (groupId: string, color: string) => {\n const nodes = sys.nodeStore.getState().nodes;\n const groupNode = nodes.find((n) => n.id === groupId);\n\n if (!groupNode) return;\n\n const oldColor = groupNode.data?.color || '#6366f1';\n\n sys.undoManager.execute({\n name: 'Change group color',\n execute: () => {\n sys.nodeStore\n .getState()\n .setNodes(\n nodes.map((n) =>\n n.id === groupId ? { ...n, data: { ...n.data, color } } : n\n )\n );\n },\n undo: () => {\n sys.nodeStore\n .getState()\n .setNodes(\n sys.nodeStore\n .getState()\n .nodes.map((n) =>\n n.id === groupId\n ? { ...n, data: { ...n.data, color: oldColor } }\n : n\n )\n );\n }\n });\n }\n },\n setAction: (key, action) =>\n set((state) => ({\n actions: {\n ...state.actions,\n [key]: action\n }\n })),\n getAction: (key) => {\n const state = get();\n return state.actions[key];\n }\n }));\n","import { create } from 'zustand';\nimport type { INodeRegistry, ValueTypeMetadata } from '../types/NodeMetadata';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\n\nexport type RegistryStore = {\n readonly values: Record<string, ValueTypeMetadata>;\n readonly specs: NodeSpecJSON[];\n\n getRegistry: () => INodeRegistry;\n updateRegistry: (registry: INodeRegistry) => void;\n updateValues: (values: Record<string, ValueTypeMetadata>) => void;\n updateSpecs: (specs: NodeSpecJSON[]) => void;\n};\n\nexport const registryStoreFactory = () =>\n create<RegistryStore>((set, get) => ({\n values: {},\n specs: [],\n\n getRegistry: (): INodeRegistry => {\n const state = get();\n return {\n values: state.values,\n specs: state.specs\n };\n },\n\n updateRegistry: (registry: INodeRegistry) =>\n set((x) => ({\n values: { ...x.values, ...registry.values },\n specs: [...registry.specs]\n })),\n\n updateValues: (values: Record<string, ValueTypeMetadata>) =>\n set((x) => ({\n values: { ...x.values, ...values }\n })),\n\n updateSpecs: (specs: NodeSpecJSON[]) =>\n set(() => ({\n specs\n }))\n }));\n","import type { System } from '@/system';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport { create } from 'zustand';\n\nexport type SpecsStore = {\n specs: NodeSpecJSON[];\n specDict: Record<string, NodeSpecJSON>;\n setSpecs: (specs: NodeSpecJSON[]) => void;\n};\n\nexport const specsStoreFactory = (sys: System) => {\n const store = create<SpecsStore>((set) => ({\n specs: [],\n specDict: {},\n setSpecs: (specs: NodeSpecJSON[]) =>\n set(() => ({\n specs,\n specDict: specs.reduce(\n (dict, spec) => {\n dict[spec.type] = spec;\n return dict;\n },\n {} as Record<string, NodeSpecJSON>\n )\n }))\n }));\n\n // Subscribe to registry changes to sync specs\n sys.registry.subscribe((registryState) => {\n const registry = registryState.getRegistry();\n store.getState().setSpecs(registry.specs);\n });\n\n return store;\n};\n","import type { Engine, INode } from '@kiberon-labs/behave-graph';\nimport { create } from 'zustand';\nimport type { System } from '@/system';\n\nexport type TraceSpan = {\n id: number;\n nodeId: string;\n name: string;\n start: number;\n end: number; // NaN while open\n lane: number;\n};\n\nexport type SpanCollector = {\n capacity: number;\n spans: TraceSpan[];\n writeIndex: number;\n size: number;\n nextId: number;\n openByNodeId: Map<string, number[]>;\n laneOpen: boolean[];\n};\n\nconst createCollector = (capacity: number): SpanCollector => ({\n capacity,\n spans: Array.from({ length: capacity }) as TraceSpan[],\n writeIndex: 0,\n size: 0,\n nextId: 1,\n openByNodeId: new Map(),\n laneOpen: []\n});\n\nconst getNodeName = (node: INode): string =>\n node.label ?? node.description?.typeName ?? node.id;\n\nconst allocateLane = (collector: SpanCollector): number => {\n for (let i = 0; i < collector.laneOpen.length; i++) {\n if (!collector.laneOpen[i]) {\n collector.laneOpen[i] = true;\n return i;\n }\n }\n collector.laneOpen.push(true);\n return collector.laneOpen.length - 1;\n};\n\nconst removeIndexFromArrayInPlace = (arr: number[], index: number): void => {\n const idx = arr.indexOf(index);\n if (idx >= 0) arr.splice(idx, 1);\n};\n\nconst evictIfNeeded = (collector: SpanCollector, now: number): void => {\n const i = collector.writeIndex;\n const existing = collector.spans[i];\n if (!existing) return;\n\n // If we are about to overwrite an open span, force-close it.\n if (Number.isNaN(existing.end)) {\n existing.end = now;\n collector.laneOpen[existing.lane] = false;\n const stack = collector.openByNodeId.get(existing.nodeId);\n if (stack) {\n removeIndexFromArrayInPlace(stack, i);\n if (stack.length === 0) collector.openByNodeId.delete(existing.nodeId);\n }\n }\n};\n\nexport type TraceStore = {\n version: number;\n collector: SpanCollector;\n clear: () => void;\n connectEngine: (engine?: Engine) => void;\n recordNodeStart: (node: INode, startTime?: number) => void;\n recordNodeEnd: (node: INode, endTime?: number) => void;\n addSpan: (span: Omit<TraceSpan, 'id'>) => void;\n updateSpan: (nodeId: string, updates: Partial<TraceSpan>) => void;\n};\n\nexport const traceStoreFactory = (_: System) => {\n let connectedEngine: Engine | undefined;\n let onStart: ((node: INode) => void) | undefined;\n let onEnd: ((node: INode) => void) | undefined;\n\n let rafHandle: number | undefined;\n let dirty = false;\n\n const scheduleFlush = (\n set: (fn: (s: TraceStore) => Partial<TraceStore>) => void\n ) => {\n dirty = true;\n if (rafHandle !== undefined) return;\n rafHandle = window.requestAnimationFrame(() => {\n rafHandle = undefined;\n if (!dirty) return;\n dirty = false;\n set((s) => ({ version: s.version + 1 }));\n });\n };\n\n const store = create<TraceStore>((set, get) => ({\n version: 0,\n collector: createCollector(10_000),\n\n clear: () => {\n const c = get().collector;\n c.spans = Array.from({ length: c.capacity }) as TraceSpan[];\n c.writeIndex = 0;\n c.size = 0;\n c.nextId = 1;\n c.openByNodeId.clear();\n c.laneOpen = [];\n set((s) => ({ version: s.version + 1 }));\n },\n\n connectEngine: (engine?: Engine) => {\n if (connectedEngine && onStart && onEnd) {\n connectedEngine.onNodeExecutionStart.removeListener(onStart);\n connectedEngine.onNodeExecutionEnd.removeListener(onEnd);\n }\n\n connectedEngine = engine;\n\n if (!engine) return;\n\n onStart = (node) => {\n get().recordNodeStart(node);\n };\n\n onEnd = (node) => {\n get().recordNodeEnd(node);\n };\n\n engine.onNodeExecutionStart.addListener(onStart);\n engine.onNodeExecutionEnd.addListener(onEnd);\n },\n\n recordNodeStart: (node, startTime) => {\n const c = get().collector;\n const now = startTime ?? performance.now();\n\n evictIfNeeded(c, now);\n\n const lane = allocateLane(c);\n const index = c.writeIndex;\n\n const span: TraceSpan = {\n id: c.nextId++,\n nodeId: node.id,\n name: getNodeName(node),\n start: now,\n end: Number.NaN,\n lane\n };\n\n c.spans[index] = span;\n\n const stack = c.openByNodeId.get(node.id) ?? [];\n stack.push(index);\n c.openByNodeId.set(node.id, stack);\n\n c.writeIndex = (c.writeIndex + 1) % c.capacity;\n c.size = Math.min(c.capacity, c.size + 1);\n\n scheduleFlush(set);\n },\n\n recordNodeEnd: (node, endTime) => {\n const c = get().collector;\n const stack = c.openByNodeId.get(node.id);\n if (!stack || stack.length === 0) return;\n\n const index = stack.pop()!;\n if (stack.length === 0) c.openByNodeId.delete(node.id);\n\n const span = c.spans[index];\n if (!span || !Number.isNaN(span.end)) return;\n\n span.end = endTime ?? performance.now();\n c.laneOpen[span.lane] = false;\n\n scheduleFlush(set);\n },\n\n addSpan: (spanData) => {\n const c = get().collector;\n\n // Evict if needed\n if (c.size >= c.capacity) {\n evictIfNeeded(c, spanData.start);\n }\n\n // Allocate lane if not provided\n const lane = spanData.lane ?? allocateLane(c);\n const index = c.writeIndex;\n\n const span: TraceSpan = {\n id: c.nextId++,\n ...spanData,\n lane\n };\n\n c.spans[index] = span;\n\n const stack = c.openByNodeId.get(span.nodeId) ?? [];\n stack.push(index);\n c.openByNodeId.set(span.nodeId, stack);\n\n c.writeIndex = (c.writeIndex + 1) % c.capacity;\n c.size = Math.min(c.capacity, c.size + 1);\n\n scheduleFlush(set);\n },\n\n updateSpan: (nodeId, updates) => {\n const c = get().collector;\n const stack = c.openByNodeId.get(nodeId);\n if (!stack || stack.length === 0) return;\n\n const index = stack[stack.length - 1]!;\n const span = c.spans[index];\n if (!span) return;\n\n Object.assign(span, updates);\n\n if (updates.end !== undefined && !Number.isNaN(updates.end)) {\n stack.pop();\n if (stack.length === 0) c.openByNodeId.delete(nodeId);\n if (span.lane !== undefined) {\n c.laneOpen[span.lane] = false;\n }\n }\n\n scheduleFlush(set);\n }\n }));\n\n return store;\n};\n","import React, { useEffect, useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\n\nimport { useSystem } from '@/system/provider';\nimport type { SpecificRenderProps } from '@/store/specific';\n\nconst NAME = 'customEvent/onTriggered.customEventId';\n\nexport function getCustomEventOnTriggeredSpecific() {\n return {\n name: NAME,\n check: (spec: any) => spec?.type === 'customEvent/onTriggered',\n render: CustomEventOnTriggeredSpecific\n };\n}\n\nconst CustomEventOnTriggeredSpecific: React.FC<SpecificRenderProps> = ({\n node\n}) => {\n const system = useSystem();\n const customEvents = useStore(system.eventsStore, (s) => s.customEvents);\n\n const options = useMemo(() => {\n return Object.values(customEvents)\n .map((evt) => ({\n id: evt.id === undefined || evt.id === null ? '' : String(evt.id),\n name:\n evt.name === undefined || evt.name === null ? '' : String(evt.name)\n }))\n .filter((x) => x.id);\n }, [customEvents]);\n\n const value = useMemo(() => {\n const v = node.data?.configuration?.customEventId;\n return v === undefined || v === null ? '' : String(v);\n }, [node.data]);\n\n const setNodeConfigValue = (nextValue: string) => {\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data?.configuration,\n customEventId: nextValue\n }\n }\n };\n })\n );\n };\n\n useEffect(() => {\n if (value) return;\n const first = options[0];\n if (!first) return;\n setNodeConfigValue(first.id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options.length, node.id]);\n\n return (\n <div style={{ paddingLeft: 8, paddingRight: 8, paddingBottom: 8 }}>\n <div style={{ fontSize: 12, opacity: 0.9, marginBottom: 4 }}>\n customEventId\n </div>\n <VscodeSingleSelect\n value={value}\n onChange={(e: any) =>\n setNodeConfigValue(String(e?.target?.value ?? ''))\n }\n disabled={options.length === 0}\n >\n {options.length === 0 ? (\n <VscodeOption value=\"\">No custom events</VscodeOption>\n ) : (\n options.map((opt) => (\n <VscodeOption key={opt.id} value={opt.id}>\n {opt.name ? `${opt.name} (${opt.id})` : opt.id}\n </VscodeOption>\n ))\n )}\n </VscodeSingleSelect>\n </div>\n );\n};\n","import React, { useCallback, useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\n\nimport { useSystem } from '@/system/provider';\nimport type { SpecificRenderProps } from '@/store/specific';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { Socket } from '@/types';\nimport type { IBehaveNode } from '@/types/nodes';\n\nconst NAME = 'customEvent/trigger.customEventId';\n\nexport function getCustomEventTriggerSpecific() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) => spec?.type === 'customEvent/trigger',\n render: CustomEventTriggerSpecific\n };\n}\n\nconst CustomEventTriggerSpecific: React.FC<SpecificRenderProps> = ({\n node\n}) => {\n const system = useSystem();\n const customEvents = useStore(system.eventsStore, (s) => s.customEvents);\n\n const options = useMemo(() => {\n return Object.values(customEvents)\n .map((evt: any) => ({\n id: evt?.id === undefined || evt?.id === null ? '' : String(evt.id),\n name:\n evt?.name === undefined || evt?.name === null ? '' : String(evt.name),\n parameters: evt?.parameters ?? []\n }))\n .filter((x) => x.id);\n }, [customEvents]);\n\n const value = useMemo(() => {\n const v = node.data.configuration?.customEventId;\n return v === undefined || v === null ? '' : String(v);\n }, [node.data]);\n\n const setNodeConfigValue = useCallback(\n (nextValue: string) => {\n // Allow clearing the selection\n if (!nextValue) {\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data?.configuration,\n customEventId: ''\n }\n }\n };\n })\n );\n return;\n }\n\n const selectedEvent = options.find((opt) => opt.id === nextValue);\n if (!selectedEvent) return;\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n // Build input ports based on event parameters\n const parameterInputs = (selectedEvent.parameters ?? []).reduce(\n (\n acc: Record<string, Socket>,\n param: { name: string; valueTypeName: string }\n ) => {\n acc[param.name] = {\n name: param.name || 'value',\n key: param.name || 'value',\n valueType: param.valueTypeName || 'string'\n };\n return acc;\n },\n {}\n );\n\n // Update configuration and ports with the selected event\n\n const updatedNode = {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data?.configuration,\n customEventId: nextValue\n },\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n inputs: Object.values(parameterInputs)\n }\n }\n } as IBehaveNode;\n\n return updatedNode;\n })\n );\n },\n [node.id, system, options]\n );\n\n return (\n <div style={{ paddingLeft: 8, paddingRight: 8, paddingBottom: 8 }}>\n <div style={{ fontSize: 12, opacity: 0.9, marginBottom: 4 }}>Event</div>\n <VscodeSingleSelect\n value={value}\n onChange={(e: any) =>\n setNodeConfigValue(String(e?.target?.value ?? ''))\n }\n disabled={options.length === 0}\n >\n {options.length === 0 ? (\n <VscodeOption value=\"\">No custom events</VscodeOption>\n ) : (\n <>\n <VscodeOption value=\"\">Select an event...</VscodeOption>\n {options.map((opt) => (\n <VscodeOption key={opt.id} value={opt.id}>\n {opt.name ? `${opt.name}` : `Event ${opt.id}`}\n {opt.parameters.length > 0 &&\n ` (${opt.parameters.length} param${opt.parameters.length > 1 ? 's' : ''})`}\n </VscodeOption>\n ))}\n </>\n )}\n </VscodeSingleSelect>\n </div>\n );\n};\n","import React, { useCallback, useEffect, useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\n\nimport { useSystem } from '@/system/provider';\nimport type { SpecificRenderProps } from '@/store/specific';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\n\nconst NAME = 'variable/get.variableId';\n\nexport function getVariableGetSpecific() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) => spec?.type === 'variable/get',\n render: VariableGetSpecific\n };\n}\n\nconst VariableGetSpecific: React.FC<SpecificRenderProps> = ({ node }) => {\n const system = useSystem();\n const variables = useStore(system.variableStore, (s) => s.variables);\n\n const options = useMemo(() => {\n return Object.entries(variables).map(([id, variable]) => ({\n id,\n name: variable.name,\n valueType: variable.valueTypeName\n }));\n }, [variables]);\n\n const value = useMemo(() => {\n const v = node.data.configuration?.variableId;\n return v === undefined || v === null ? '' : String(v);\n }, [node.data]);\n\n const setNodeConfigValue = useCallback(\n (nextValue: string) => {\n const selectedVariable = variables[nextValue];\n if (!selectedVariable) return;\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n: any) => {\n if (n.id !== node.id) return n;\n\n // Update configuration and ports with the selected variable\n const updatedNode = {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data?.configuration,\n variableId: nextValue\n },\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n outputs: [\n {\n name: 'value',\n key: 'value',\n valueType: selectedVariable.valueTypeName\n }\n ]\n }\n }\n };\n\n return updatedNode;\n })\n );\n },\n [node.id, system, variables]\n );\n\n useEffect(() => {\n if (value || options.length === 0) return;\n const first = options[0];\n if (!first) return;\n setNodeConfigValue(first.id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options.length, node.id]);\n\n return (\n <div style={{ paddingLeft: 8, paddingRight: 8, paddingBottom: 8 }}>\n <div style={{ fontSize: 12, opacity: 0.9, marginBottom: 4 }}>\n Variable\n </div>\n <VscodeSingleSelect\n value={value}\n style={{ width: '200px' }}\n onChange={(e: any) =>\n setNodeConfigValue(String(e?.target?.value ?? ''))\n }\n disabled={options.length === 0}\n >\n {options.length === 0 ? (\n <VscodeOption value=\"\">No variables</VscodeOption>\n ) : (\n options.map((opt) => (\n <VscodeOption key={opt.id} value={opt.id}>\n {opt.name} ({opt.valueType})\n </VscodeOption>\n ))\n )}\n </VscodeSingleSelect>\n </div>\n );\n};\n","import React, { useCallback, useEffect, useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\n\nimport { useSystem } from '@/system/provider';\nimport type { SpecificRenderProps } from '@/store/specific';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\n\nconst NAME = 'variable/set.variableId';\n\nexport function getVariableSetSpecific() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) => spec?.type === 'variable/set',\n render: VariableSetSpecific\n };\n}\n\nconst VariableSetSpecific: React.FC<SpecificRenderProps> = ({ node }) => {\n const system = useSystem();\n const variables = useStore(system.variableStore, (s) => s.variables);\n\n const options = useMemo(() => {\n return Object.entries(variables).map(([id, variable]) => ({\n id,\n name: variable.name,\n valueType: variable.valueTypeName\n }));\n }, [variables]);\n\n const value = useMemo(() => {\n const v = node.data.configuration?.variableId;\n return v === undefined || v === null ? '' : String(v);\n }, [node.data]);\n\n const setNodeConfigValue = useCallback(\n (nextValue: string) => {\n const selectedVariable = variables[nextValue];\n if (!selectedVariable) return;\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n: any) => {\n if (n.id !== node.id) return n;\n\n // Update configuration and ports with the selected variable\n const updatedNode = {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data?.configuration,\n variableId: nextValue\n },\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n inputs: [\n {\n name: 'value',\n key: 'value',\n valueType: selectedVariable.valueTypeName\n }\n ]\n }\n }\n };\n\n return updatedNode;\n })\n );\n },\n [node.id, system, variables]\n );\n\n useEffect(() => {\n if (value || options.length === 0) return;\n const first = options[0];\n if (!first) return;\n setNodeConfigValue(first.id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options.length, node.id]);\n\n return (\n <div style={{ paddingLeft: 8, paddingRight: 8, paddingBottom: 8 }}>\n <div style={{ fontSize: 12, opacity: 0.9, marginBottom: 4 }}>\n Variable\n </div>\n <VscodeSingleSelect\n style={{ width: '200px' }}\n value={value}\n onChange={(e: any) =>\n setNodeConfigValue(String(e?.target?.value ?? ''))\n }\n disabled={options.length === 0}\n >\n {options.length === 0 ? (\n <VscodeOption value=\"\">No variables</VscodeOption>\n ) : (\n options.map((opt) => (\n <VscodeOption key={opt.id} value={opt.id}>\n {opt.name} ({opt.valueType})\n </VscodeOption>\n ))\n )}\n </VscodeSingleSelect>\n </div>\n );\n};\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { ComponentType } from 'react';\nimport { create } from 'zustand';\nimport { getCustomEventOnTriggeredSpecific } from '@/specifics/CustomEventOnTriggeredSpecific';\nimport { getCustomEventTriggerSpecific } from '@/specifics/CustomEventTriggerSpecific';\nimport { getVariableGetSpecific } from '@/specifics/VariableGetSpecific';\nimport { getVariableSetSpecific } from '@/specifics/VariableSetSpecific';\nimport type { IBehaveNode } from '@/types/nodes';\n\nexport type SpecificNode = {\n id: string;\n data: IBehaveNode['data'];\n spec: NodeSpecJSON;\n selected: boolean;\n};\n\nexport type SpecificRenderProps = {\n node: SpecificNode;\n};\n\nexport type Specific = {\n name: string;\n check: (spec: NodeSpecJSON) => boolean;\n render: ComponentType<SpecificRenderProps>;\n};\n\nexport type SpecificStore = {\n specifics: Specific[];\n titleBarActions: Record<string, React.ReactElement>;\n registerSpecific: (specific: Specific) => void;\n unregisterSpecific: (name: string) => void;\n registryTitleBarAction: (name: string, action: React.ReactElement) => void;\n};\n\nconst defaultSpecifics: Specific[] = [\n getCustomEventOnTriggeredSpecific(),\n getCustomEventTriggerSpecific(),\n getVariableGetSpecific(),\n getVariableSetSpecific()\n];\n\nexport const specificStoreFactory = () =>\n create<SpecificStore>((set) => ({\n specifics: defaultSpecifics,\n\n registerSpecific: (specific) =>\n set((state) => {\n const existingIndex = state.specifics.findIndex(\n (x) => x.name === specific.name\n );\n\n if (existingIndex === -1) {\n return {\n specifics: [...state.specifics, specific]\n };\n }\n\n const next = state.specifics.slice();\n next[existingIndex] = specific;\n return { specifics: next };\n }),\n\n unregisterSpecific: (name) =>\n set((state) => ({\n specifics: state.specifics.filter((x) => x.name !== name)\n })),\n titleBarActions: {},\n registryTitleBarAction: (name: string, action: React.ReactElement) =>\n set((state) => ({\n titleBarActions: {\n ...state.titleBarActions,\n [name]: action\n }\n }))\n }));\n","import type { IBehaveNode } from '@/types/nodes';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { ComponentType } from 'react';\nimport { create } from 'zustand';\n\nexport type SocketGeneratorNode = {\n id: string;\n data: IBehaveNode['data'];\n spec: NodeSpecJSON;\n selected: boolean;\n};\n\nexport type SocketGeneratorRenderProps = {\n node: SocketGeneratorNode;\n};\n\nexport type SocketGenerator = {\n name: string;\n check: (spec: NodeSpecJSON) => boolean;\n render: ComponentType<SocketGeneratorRenderProps>;\n};\n\nexport type SocketGeneratorStore = {\n generators: SocketGenerator[];\n registerGenerator: (generator: SocketGenerator) => void;\n unregisterGenerator: (name: string) => void;\n};\n\nexport const socketGeneratorStoreFactory = () =>\n create<SocketGeneratorStore>((set) => ({\n generators: [],\n\n registerGenerator: (generator) =>\n set((state) => {\n const existingIndex = state.generators.findIndex(\n (x) => x.name === generator.name\n );\n\n if (existingIndex === -1) {\n return {\n generators: [...state.generators, generator]\n };\n }\n\n const next = state.generators.slice();\n next[existingIndex] = generator;\n return { generators: next };\n }),\n\n unregisterGenerator: (name) =>\n set((state) => ({\n generators: state.generators.filter((x) => x.name !== name)\n }))\n }));\n","import { create } from 'zustand';\nimport type {\n CustomEventJSON,\n CustomEventParameterJSON\n} from '@kiberon-labs/behave-graph';\nexport type ExtendedCustomEventJSON = CustomEventJSON & {\n readonly?: boolean;\n};\n\nexport type EventsStore = {\n customEvents: Record<string, ExtendedCustomEventJSON>;\n setCustomEvents: (\n customEvents: Record<string, ExtendedCustomEventJSON>\n ) => void;\n getCustomEvents: () => ExtendedCustomEventJSON[];\n addCustomEvent: (customEvent: ExtendedCustomEventJSON) => void;\n removeCustomEvent: (id: string) => void;\n\n addParameter: (\n eventId: string,\n parameter?: Partial<CustomEventParameterJSON>\n ) => void;\n updateParameter: (\n eventId: string,\n index: number,\n patch: Partial<CustomEventParameterJSON>\n ) => void;\n removeParameter: (eventId: string, index: number) => void;\n};\n\nexport const eventsStoreFactory = () =>\n create<EventsStore>((set, get) => ({\n customEvents: {},\n setCustomEvents: (customEvents) => {\n set({ customEvents });\n },\n getCustomEvents: () => Object.values(get().customEvents ?? {}),\n\n addCustomEvent: (customEvent) => {\n set((t) => ({\n customEvents: { ...t.customEvents, [customEvent.id]: customEvent }\n }));\n },\n\n removeCustomEvent: (id) => {\n const current = get().customEvents ?? {};\n const next = { ...current };\n delete next[String(id)];\n\n set({ customEvents: next });\n },\n addParameter: (eventId, parameter) => {\n const current = get().customEvents;\n\n const newEvent = current[eventId];\n if (!newEvent) return;\n\n const withUpdated = {\n ...newEvent,\n parameters: [\n ...((newEvent.parameters ?? []) as CustomEventParameterJSON[]),\n {\n name: parameter?.name ? String(parameter.name) : 'param',\n valueTypeName: parameter?.valueTypeName\n ? String(parameter.valueTypeName)\n : 'string',\n defaultValue: parameter?.defaultValue\n }\n ]\n } as CustomEventJSON;\n set({\n customEvents: {\n ...current,\n [eventId]: withUpdated\n }\n });\n },\n\n updateParameter: (eventId, index, patch) => {\n const current = get().customEvents;\n\n const ev = current[eventId];\n if (!ev) return;\n\n set({\n customEvents: {\n ...current,\n [eventId]: {\n ...ev,\n parameters: ev.parameters?.map((param, i) => {\n if (i !== index) return param;\n\n return { ...param, ...patch };\n })\n }\n }\n });\n },\n\n removeParameter: (eventId, index) => {\n const current = get().customEvents;\n\n const ev = current[eventId];\n if (!ev) return;\n\n set({\n customEvents: {\n ...current,\n [eventId]: {\n ...ev,\n parameters: ev.parameters?.filter((_, i) => i !== index) ?? []\n }\n }\n });\n }\n }));\n","import { create } from 'zustand';\nimport type React from 'react';\n\n/**\n * Documentation metadata for a node type\n */\nexport type NodeDocumentation = {\n /** The node type this documentation applies to */\n type: string;\n /** Optional icon to display for the node */\n icon?: React.ReactNode;\n /** Short description (one line) */\n shortDescription?: string;\n /** Tags for categorization and search */\n tags?: string[];\n /** Long rich markdown description */\n markdownDescription?: string;\n};\n\nexport type DocumentationStore = {\n /** Map of node type to documentation */\n docs: Map<string, NodeDocumentation>;\n /** Set documentation for a specific node type */\n setDocumentation: (\n type: string,\n doc: Omit<NodeDocumentation, 'type'>\n ) => void;\n /** Set documentation for multiple node types at once */\n setMultipleDocumentation: (docs: NodeDocumentation[]) => void;\n /** Get documentation for a specific node type */\n getDocumentation: (type: string) => NodeDocumentation | undefined;\n /** Clear all documentation */\n clearDocumentation: () => void;\n /** Remove documentation for a specific type */\n removeDocumentation: (type: string) => void;\n};\n\nexport const documentationStoreFactory = () => {\n return create<DocumentationStore>((set, get) => ({\n docs: new Map(),\n\n setDocumentation: (type: string, doc: Omit<NodeDocumentation, 'type'>) =>\n set((state) => {\n const newDocs = new Map(state.docs);\n newDocs.set(type, { type, ...doc });\n return { docs: newDocs };\n }),\n\n setMultipleDocumentation: (docs: NodeDocumentation[]) =>\n set((state) => {\n const newDocs = new Map(state.docs);\n for (const doc of docs) {\n newDocs.set(doc.type, doc);\n }\n return { docs: newDocs };\n }),\n\n getDocumentation: (type: string) => get().docs.get(type),\n\n clearDocumentation: () => set({ docs: new Map() }),\n\n removeDocumentation: (type: string) =>\n set((state) => {\n const newDocs = new Map(state.docs);\n newDocs.delete(type);\n return { docs: newDocs };\n })\n }));\n};\n","import { createStore } from 'zustand';\nimport React from 'react';\n\nexport type ToolbarButtonGroup = {\n id: string;\n label?: string;\n buttons: (ToolbarButton | React.ReactNode)[];\n};\n\nexport type ToolbarButton = {\n id: string;\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n disabled?: boolean | (() => boolean);\n};\n\nexport type ToolbarStore = {\n visible: boolean;\n setVisible: (visible: boolean) => void;\n groups: ToolbarButtonGroup[];\n setGroups: (groups: ToolbarButtonGroup[]) => void;\n addGroup: (group: ToolbarButtonGroup) => void;\n removeGroup: (groupId: string) => void;\n updateGroup: (groupId: string, group: Partial<ToolbarButtonGroup>) => void;\n};\n\nexport const toolbarStoreFactory = () =>\n createStore<ToolbarStore>((set) => ({\n visible: true,\n setVisible: (visible) => set({ visible }),\n groups: [],\n setGroups: (groups) => set({ groups }),\n addGroup: (group) => set((state) => ({ groups: [...state.groups, group] })),\n removeGroup: (groupId) =>\n set((state) => ({\n groups: state.groups.filter((g) => g.id !== groupId)\n })),\n updateGroup: (groupId, updates) =>\n set((state) => ({\n groups: state.groups.map((g) =>\n g.id === groupId ? { ...g, ...updates } : g\n )\n }))\n }));\n","import type { System } from '@/system';\nimport { create } from 'zustand';\n\nconst DEFAULT_LAYER_ID = 'default';\nconst DEFAULT_LAYER_NAME = 'Default';\n\nexport type Layer = {\n id: string;\n name: string;\n visible: boolean;\n opacity: number;\n};\n\nexport type SerializedLayers = {\n defaultLayerId: string;\n layers: Layer[];\n nodeLayers: Record<string, string>;\n};\n\nexport type LayerStore = {\n defaultLayerId: string;\n layers: Record<string, Layer>;\n nodeLayers: Record<string, string>;\n createLayer: (name: string) => string;\n renameLayer: (layerId: string, name: string) => void;\n setLayerVisibility: (layerId: string, visible: boolean) => void;\n setLayerOpacity: (layerId: string, opacity: number) => void;\n removeLayer: (layerId: string) => void;\n setNodeLayer: (nodeId: string, layerId: string) => void;\n clearNodeLayer: (nodeId: string) => void;\n getNodeLayer: (nodeId: string) => Layer;\n serialize: () => SerializedLayers;\n deserialize: (serialized?: SerializedLayers) => void;\n pruneNodeAssignments: (nodeIds: string[]) => void;\n};\n\nconst clampOpacity = (opacity: number): number => {\n if (Number.isNaN(opacity)) return 1;\n return Math.max(0, Math.min(1, opacity));\n};\n\nconst createDefaultLayer = (): Layer => ({\n id: DEFAULT_LAYER_ID,\n name: DEFAULT_LAYER_NAME,\n visible: true,\n opacity: 1\n});\n\nconst createLayerId = (): string => {\n const suffix = Math.random().toString(36).slice(2, 8);\n return `layer-${Date.now()}-${suffix}`;\n};\n\nexport const layerStoreFactory = (system: System) => {\n const store = create<LayerStore>((set, get) => ({\n defaultLayerId: DEFAULT_LAYER_ID,\n layers: {\n [DEFAULT_LAYER_ID]: createDefaultLayer()\n },\n nodeLayers: {},\n\n createLayer: (name) => {\n const normalized = name.trim() || 'Layer';\n const id = createLayerId();\n set((state) => ({\n layers: {\n ...state.layers,\n [id]: {\n id,\n name: normalized,\n visible: true,\n opacity: 1\n }\n }\n }));\n return id;\n },\n\n renameLayer: (layerId, name) => {\n const normalized = name.trim();\n if (!normalized) return;\n set((state) => {\n const existing = state.layers[layerId];\n if (!existing) return state;\n return {\n layers: {\n ...state.layers,\n [layerId]: {\n ...existing,\n name: normalized\n }\n }\n };\n });\n },\n\n setLayerVisibility: (layerId, visible) => {\n set((state) => {\n const existing = state.layers[layerId];\n if (!existing) return state;\n return {\n layers: {\n ...state.layers,\n [layerId]: {\n ...existing,\n visible\n }\n }\n };\n });\n },\n\n setLayerOpacity: (layerId, opacity) => {\n const safeOpacity = clampOpacity(opacity);\n set((state) => {\n const existing = state.layers[layerId];\n if (!existing) return state;\n return {\n layers: {\n ...state.layers,\n [layerId]: {\n ...existing,\n opacity: safeOpacity\n }\n }\n };\n });\n },\n\n removeLayer: (layerId) => {\n set((state) => {\n if (layerId === state.defaultLayerId) return state;\n if (!state.layers[layerId]) return state;\n\n const nextLayers = { ...state.layers };\n delete nextLayers[layerId];\n\n const nextNodeLayers: Record<string, string> = {};\n Object.entries(state.nodeLayers).forEach(([nodeId, mappedLayerId]) => {\n nextNodeLayers[nodeId] =\n mappedLayerId === layerId ? state.defaultLayerId : mappedLayerId;\n });\n\n return {\n layers: nextLayers,\n nodeLayers: nextNodeLayers\n };\n });\n },\n\n setNodeLayer: (nodeId, layerId) => {\n set((state) => {\n const resolvedLayerId = state.layers[layerId]\n ? layerId\n : state.defaultLayerId;\n\n return {\n nodeLayers: {\n ...state.nodeLayers,\n [nodeId]: resolvedLayerId\n }\n };\n });\n },\n\n clearNodeLayer: (nodeId) => {\n set((state) => {\n const next = { ...state.nodeLayers };\n delete next[nodeId];\n return {\n nodeLayers: next\n };\n });\n },\n\n getNodeLayer: (nodeId) => {\n const state = get();\n const mappedLayerId = state.nodeLayers[nodeId] ?? state.defaultLayerId;\n return state.layers[mappedLayerId] ?? state.layers[state.defaultLayerId]!;\n },\n\n serialize: () => {\n const state = get();\n return {\n defaultLayerId: state.defaultLayerId,\n layers: Object.values(state.layers),\n nodeLayers: { ...state.nodeLayers }\n };\n },\n\n deserialize: (serialized) => {\n const baseDefaultLayer = createDefaultLayer();\n if (!serialized) {\n set({\n defaultLayerId: DEFAULT_LAYER_ID,\n layers: { [DEFAULT_LAYER_ID]: baseDefaultLayer },\n nodeLayers: {}\n });\n return;\n }\n\n const requestedDefault = serialized.defaultLayerId || DEFAULT_LAYER_ID;\n const nextLayers: Record<string, Layer> = {\n [DEFAULT_LAYER_ID]: baseDefaultLayer\n };\n\n for (const candidate of serialized.layers ?? []) {\n if (!candidate?.id) continue;\n nextLayers[candidate.id] = {\n id: candidate.id,\n name: candidate.name?.trim() || candidate.id,\n visible: candidate.visible !== false,\n opacity: clampOpacity(candidate.opacity)\n };\n }\n\n const defaultLayerId = nextLayers[requestedDefault]\n ? requestedDefault\n : DEFAULT_LAYER_ID;\n\n const nextNodeLayers: Record<string, string> = {};\n Object.entries(serialized.nodeLayers ?? {}).forEach(\n ([nodeId, mapped]) => {\n nextNodeLayers[nodeId] = nextLayers[mapped] ? mapped : defaultLayerId;\n }\n );\n\n set({\n defaultLayerId,\n layers: nextLayers,\n nodeLayers: nextNodeLayers\n });\n },\n\n pruneNodeAssignments: (nodeIds) => {\n const valid = new Set(nodeIds);\n set((state) => {\n const nextNodeLayers: Record<string, string> = {};\n Object.entries(state.nodeLayers).forEach(([nodeId, mapped]) => {\n if (!valid.has(nodeId)) return;\n nextNodeLayers[nodeId] = state.layers[mapped]\n ? mapped\n : state.defaultLayerId;\n });\n\n return {\n nodeLayers: nextNodeLayers\n };\n });\n }\n }));\n\n system.nodeStore.subscribe((nodeState) => {\n const nodeIds = nodeState.nodes.map((node) => node.id);\n store.getState().pruneNodeAssignments(nodeIds);\n });\n\n return store;\n};\n","import type { System } from '.';\n\n/**\n * Plugin initialization function type\n * @template TOptions - Type of options object passed to the plugin\n */\nexport interface Plugin<TOptions = void> {\n (system: System, options: TOptions): void | Promise<void>;\n}\nexport type PluginOpts = {\n name: string;\n};\n\nexport type LoadablePlugin<TOptions = void> = {\n loader: Plugin<TOptions>;\n opts: PluginOpts;\n};\n\nexport const plugin = <TOptions = void>(\n registerfunc: Plugin<TOptions>,\n opts: PluginOpts\n): LoadablePlugin<TOptions> => {\n return {\n loader: registerfunc,\n opts: opts\n };\n};\n","import { align, distribute, ALIGNMENT } from '@/components/panels/alignment';\nimport { type System } from '../../system';\nimport type { Node } from 'reactflow';\nimport { plugin } from '@/system/plugin';\nimport { pinned } from '@/annotations';\n\nconst partitionSelectedNodes = (nodes: Node[]) => {\n return nodes.reduce(\n (acc, node) => {\n if (node.selected && !node.data?.metadata?.[pinned]) {\n acc.selectedNodes.push(node);\n } else {\n acc.unselectedNodes.push(node);\n }\n return acc;\n },\n {\n selectedNodes: [] as Node[],\n unselectedNodes: [] as Node[]\n }\n );\n};\n\nexport type AlignmentAxis = 'x' | 'y';\nexport type AlignmentType = 'start' | 'center' | 'end';\n\ndeclare module '@/system/system' {\n interface PubSys {\n 'alignment:align': {\n type: AlignmentType;\n axis: AlignmentAxis;\n };\n 'alignment:distribute': {\n type: AlignmentType;\n axis: AlignmentAxis;\n };\n }\n}\n\nexport const setupSystemActions = (system: System) => {\n // Subscribe to alignment events\n system.pubsub.subscribe('alignment:align', (_, data) => {\n const { nodes, setNodes } = system.nodeStore.getState();\n const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);\n\n const alignmentType =\n data.type === 'start'\n ? ALIGNMENT.START\n : data.type === 'center'\n ? ALIGNMENT.CENTER\n : ALIGNMENT.END;\n\n align(alignmentType, data.axis)(selectedNodes);\n setNodes([...unselectedNodes, ...selectedNodes]);\n });\n\n // Subscribe to distribution events\n system.pubsub.subscribe('alignment:distribute', (_, data) => {\n const { nodes, setNodes } = system.nodeStore.getState();\n const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);\n\n const alignmentType =\n data.type === 'start'\n ? ALIGNMENT.START\n : data.type === 'center'\n ? ALIGNMENT.CENTER\n : ALIGNMENT.END;\n\n distribute(alignmentType, data.axis)(selectedNodes);\n setNodes([...unselectedNodes, ...selectedNodes]);\n });\n};\n\nexport const alignmentPlugin = plugin(\n (system) => {\n setupSystemActions(system);\n },\n {\n name: 'alignment'\n }\n);\n","import type { System } from '@/system/system';\nimport type { Renderable, Toast } from 'react-hot-toast';\n\nexport type NotificationType = 'info' | 'success' | 'error' | 'loading';\n\nexport interface NotificationOptions {\n /**\n * Toast ID for programmatic dismissal\n */\n id?: string;\n /**\n * Duration in milliseconds. Set to Infinity to persist until manually dismissed\n */\n duration?: number;\n /**\n * Position on screen\n */\n position?: Toast['position'];\n /**\n * Custom icon\n */\n icon?: Renderable;\n /**\n * Custom styles\n */\n style?: React.CSSProperties;\n /**\n * Custom class name\n */\n className?: string;\n /**\n * Accessible aria-live value\n */\n ariaLive?: Toast['ariaProps'];\n}\n\nexport class Notifications {\n private readonly system: System;\n constructor(system: System) {\n this.system = system;\n }\n /**\n * Dismiss a specific toast or all toasts\n */\n dismissNotification(toastId?: string): void {\n this.system.pubsub.publish('notification:dismiss', { toastId });\n }\n\n /**\n * Show a notification toast\n */\n notify(\n message: string,\n type: NotificationType = 'info',\n options?: NotificationOptions\n ): void {\n this.system.pubsub.publish('notification', {\n type,\n message,\n options\n });\n }\n\n /**\n * Show a success notification\n */\n success(message: string, options?: NotificationOptions): void {\n this.notify(message, 'success', options);\n }\n\n /**\n * Show an error notification\n */\n error(message: string, options?: NotificationOptions): void {\n this.notify(message, 'error', options);\n }\n\n /**\n * Show a loading notification\n */\n loading(message: string, options?: NotificationOptions): void {\n this.notify(message, 'loading', options);\n }\n\n /**\n * Show an info notification\n */\n info(message: string, options?: NotificationOptions): void {\n this.notify(message, 'info', options);\n }\n\n /**\n * Dismiss a specific toast or all toasts\n */\n dismiss(toastId?: string): void {\n this.system.pubsub.publish('notification:dismiss', { toastId });\n }\n}\n","import { create } from 'zustand';\n\nexport interface AgentConfig {\n model?: string;\n systemPrompt?: string;\n}\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp: Date;\n isStreaming?: boolean;\n}\n\nexport type ChatStore = {\n messages: ChatMessage[];\n agent: AgentConfig | undefined;\n isStreaming: boolean;\n inputValue: string;\n\n setAgent: (agent: AgentConfig) => void;\n clearAgent: () => void;\n addMessage: (message: ChatMessage) => void;\n updateStreamingMessage: (id: string, content: string) => void;\n finalizeStreamingMessage: (id: string) => void;\n setIsStreaming: (streaming: boolean) => void;\n setInputValue: (value: string) => void;\n clearMessages: () => void;\n};\n\nlet messageCounter = 0;\n\nexport function createMessageId(): string {\n messageCounter += 1;\n return `msg-${Date.now()}-${String(messageCounter)}`;\n}\n\nexport const chatStoreFactory = () =>\n create<ChatStore>((set) => ({\n messages: [],\n agent: undefined,\n isStreaming: false,\n inputValue: '',\n\n setAgent: (agent: AgentConfig) => set({ agent }),\n clearAgent: () => set({ agent: undefined }),\n\n addMessage: (message: ChatMessage) =>\n set((state) => ({\n messages: [...state.messages, message]\n })),\n\n updateStreamingMessage: (id: string, content: string) =>\n set((state) => ({\n messages: state.messages.map((msg) =>\n msg.id === id ? { ...msg, content } : msg\n )\n })),\n\n finalizeStreamingMessage: (id: string) =>\n set((state) => ({\n messages: state.messages.map((msg) =>\n msg.id === id ? { ...msg, isStreaming: false } : msg\n )\n })),\n\n setIsStreaming: (streaming: boolean) => set({ isStreaming: streaming }),\n\n setInputValue: (value: string) => set({ inputValue: value }),\n\n clearMessages: () => set({ messages: [] })\n }));\n","import { UndoManager } from './undoRedo';\nimport { type StoreApi } from 'zustand';\nimport type { Edge, Node, Viewport } from 'reactflow';\nimport { tabStoreFactory, type TabStore } from '@/store/tabs';\nimport { TabLoader } from './tabLoader';\nimport {\n systemSettingsFactory,\n type SystemSettingsStore\n} from '../store/settings.js';\nimport { logStoreFactory, type LogStore } from '@/store/logs';\nimport { legendStoreFactory, type LegendStore } from '@/store/legend';\nimport { menubarStoreFactory, type MenuBarStore } from '@/store/menubar';\nimport { hotKeyStoreFactory, type HotkeyStore } from '@/store/hotKeys';\nimport { PubSub } from './pubsub';\nimport {\n edgeStoreFactory,\n flowStoreFactory,\n nodeStoreFactory,\n type EdgeStore,\n type FlowStore,\n type NodeStore\n} from '@/store/flow';\nimport { controlsStoreFactory, type ControlsStore } from '@/store/controls';\nimport { variableStoreFactory, type VariableStore } from '@/store/variables';\nimport { selectionStoreFactory, type SelectionStore } from '@/store/selection';\nimport { refStoreFactory, type RefStore } from '@/store/refs';\nimport { Graph } from './graph';\nimport { actionStoreFactory, type ActionStore } from '@/store/actions';\nimport { registryStoreFactory, type RegistryStore } from '@/store/registry';\nimport { specsStoreFactory, type SpecsStore } from '@/store/specs';\nimport { traceStoreFactory, type TraceStore } from '@/store/traces';\nimport { specificStoreFactory, type SpecificStore } from '@/store/specific';\nimport {\n socketGeneratorStoreFactory,\n type SocketGeneratorStore\n} from '@/store/socketGenerator';\nimport { eventsStoreFactory, type EventsStore } from '@/store/events';\nimport {\n documentationStoreFactory,\n type DocumentationStore\n} from '@/store/documentation';\nimport { toolbarStoreFactory, type ToolbarStore } from '@/store/toolbar';\nimport { layerStoreFactory, type LayerStore } from '@/store/layers';\nimport { setupSystemActions } from '@/plugin/alignment';\nimport { Notifications } from './notifications';\nimport { chatStoreFactory, type ChatStore } from '@/store/chat';\nimport type { Renderable } from 'react-hot-toast';\nimport type { INodeRegistry } from '@/types/NodeMetadata';\nimport type { LoadablePlugin } from './plugin';\nimport type { UIGraphJSON } from '@/types/graph';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport type { LayoutBase } from 'rc-dock';\n\nexport type NotificationType = 'info' | 'success' | 'error' | 'loading';\n\nexport interface NotificationData {\n type: NotificationType;\n message: string;\n options?: {\n id?: string;\n duration?: number;\n position?: any;\n icon?: Renderable;\n style?: React.CSSProperties;\n className?: string;\n ariaLive?: any;\n };\n}\n\nexport interface PubSys {\n 'edge:added': Edge;\n 'node:added': Node;\n 'edge:removed': Edge;\n 'node:removed': Node;\n graphAnnotationsChanged: {\n [key: string]: any;\n };\n 'aiNode:trigger': {\n nodeId: string;\n };\n saveViewport: {\n index: number;\n viewport: Viewport;\n };\n missingViewPort: {\n index: number;\n };\n\n notification: NotificationData;\n 'notification:dismiss': {\n toastId?: string;\n };\n 'layout:saved': LayoutBase;\n 'graph:saved': UIGraphJSON;\n 'graph:inner:saved': GraphJSON;\n 'chat:userMessage': {\n content: string;\n };\n}\n\n/**\n * Use this to extend the System interface when adding plugins\n */\nexport interface ISystem {}\n\nexport class System implements ISystem {\n public readonly actionStore: StoreApi<ActionStore>;\n public readonly pubsub = new PubSub<PubSys>();\n public readonly undoManager = new UndoManager();\n public readonly flowStore: StoreApi<FlowStore>;\n public readonly controlStore: StoreApi<ControlsStore>;\n public readonly variableStore: StoreApi<VariableStore>;\n public readonly selectionStore: StoreApi<SelectionStore>;\n public readonly refStore: StoreApi<RefStore>;\n public readonly tabStore: StoreApi<TabStore>;\n protected deps: Record<string, unknown> = {};\n public readonly registry: StoreApi<RegistryStore>;\n public readonly tabLoader: TabLoader;\n public readonly systemSettings: StoreApi<SystemSettingsStore>;\n public readonly logsStore: StoreApi<LogStore>;\n public readonly legendStore: StoreApi<LegendStore>;\n public readonly hotKeyStore: StoreApi<HotkeyStore>;\n public readonly edgeStore: StoreApi<EdgeStore>;\n public readonly nodeStore: StoreApi<NodeStore>;\n public readonly specStore: StoreApi<SpecsStore>;\n public readonly specificStore: StoreApi<SpecificStore>;\n public readonly socketGeneratorStore: StoreApi<SocketGeneratorStore>;\n public readonly eventsStore: StoreApi<EventsStore>;\n public readonly documentationStore: StoreApi<DocumentationStore>;\n public readonly toolbarStore: StoreApi<ToolbarStore>;\n public readonly layerStore: StoreApi<LayerStore>;\n public readonly menubarStore: StoreApi<MenuBarStore>;\n public readonly graph: Graph;\n public readonly traceStore: StoreApi<TraceStore>;\n public readonly chatStore: StoreApi<ChatStore>;\n public readonly notifications: Notifications = new Notifications(this);\n\n /**\n * Create a new System instance\n * @param registry - INodeRegistry containing nodes and values metadata\n */\n constructor(registry?: INodeRegistry) {\n this.tabStore = tabStoreFactory();\n this.controlStore = controlsStoreFactory();\n this.variableStore = variableStoreFactory();\n this.refStore = refStoreFactory();\n this.systemSettings = systemSettingsFactory();\n this.logsStore = logStoreFactory();\n this.legendStore = legendStoreFactory();\n this.eventsStore = eventsStoreFactory();\n this.nodeStore = nodeStoreFactory(this);\n this.edgeStore = edgeStoreFactory(this);\n this.flowStore = flowStoreFactory(this);\n this.selectionStore = selectionStoreFactory(this);\n this.hotKeyStore = hotKeyStoreFactory(this);\n this.actionStore = actionStoreFactory(this);\n this.registry = registryStoreFactory();\n this.specStore = specsStoreFactory(this);\n this.socketGeneratorStore = socketGeneratorStoreFactory();\n this.specificStore = specificStoreFactory();\n this.documentationStore = documentationStoreFactory();\n this.toolbarStore = toolbarStoreFactory();\n this.layerStore = layerStoreFactory(this);\n\n this.chatStore = chatStoreFactory();\n this.graph = new Graph(this);\n\n // Handle registry initialization\n if (registry) {\n this.registry.getState().updateRegistry(registry);\n this.specStore.getState().setSpecs(registry.specs);\n }\n\n this.menubarStore = menubarStoreFactory();\n this.tabLoader = new TabLoader(this);\n\n this.traceStore = traceStoreFactory(this);\n\n // Setup system-level action subscribers\n setupSystemActions(this);\n }\n\n /**\n * Adds a new dependency to the system\n * @param name\n * @param val\n */\n decorate(name: keyof System, val: any) {\n //@ts-ignore\n this[name] = val;\n }\n\n /**\n * Load a plugin into the system\n * @param pluginInit - Plugin initialization function\n * @param options - Optional configuration options for the plugin\n * @template TOptions - Type of options object\n *\n * @example\n * // Plugin without options\n * system.registerPlugin(docsPlugin);\n *\n * @example\n * // Plugin with typed options\n * interface MyPluginOptions {\n * enabled: boolean;\n * apiKey: string;\n * }\n *\n * const myPlugin: Plugin<MyPluginOptions> = (system, options) => {\n * console.log('Plugin enabled:', options.enabled);\n * };\n *\n * system.registerPlugin(myPlugin, { enabled: true, apiKey: 'secret' });\n */\n async registerPlugin<TOptions = void>(\n plugin: LoadablePlugin<TOptions>,\n options?: TOptions\n ): Promise<void> {\n await plugin.loader(this, options as TOptions);\n console.log(`Plugin loaded: ${plugin.opts.name}`);\n }\n}\n","/**\n * Serialize variables to JSON using pure metadata\n * This replaces the need for WriteVariablesToJSON from @kiberon-labs/behave-graph\n */\n\nimport type { INodeRegistry } from '../types/NodeMetadata';\n\nexport interface VariableJSON {\n id: string;\n name: string;\n valueTypeName: string;\n initialValue: any;\n label?: string;\n metadata?: Record<string, any>;\n}\n\nexport interface Variable {\n id: string;\n name: string;\n valueTypeName: string;\n initialValue: any;\n label?: string;\n metadata?: Record<string, any>;\n}\n\n/**\n * Serialize a single variable to JSON\n */\nexport function serializeVariable(\n variable: Variable,\n registry: INodeRegistry\n): VariableJSON {\n const valueType = registry.values[variable.valueTypeName];\n const serializedValue = valueType?.serialize\n ? valueType.serialize(variable.initialValue)\n : variable.initialValue;\n\n const variableJson: VariableJSON = {\n id: variable.id,\n name: variable.name,\n valueTypeName: variable.valueTypeName,\n initialValue: serializedValue\n };\n\n if (variable.label && variable.label.length > 0) {\n variableJson.label = variable.label;\n }\n\n if (variable.metadata && Object.keys(variable.metadata).length > 0) {\n variableJson.metadata = variable.metadata;\n }\n\n return variableJson;\n}\n\n/**\n * Serialize multiple variables to JSON array\n */\nexport function writeVariablesToJSON(\n registry: INodeRegistry,\n variables: Record<string, Variable>\n): VariableJSON[] {\n return Object.values(variables).map((variable) =>\n serializeVariable(variable, registry)\n );\n}\n","import type { IBehaveNode } from '@/types/nodes';\nimport type { Node } from 'reactflow';\n\nexport function isBehaveNode(node: Node): node is IBehaveNode {\n return typeof node.type === 'string' && node.type.startsWith('behaveNode');\n}\n","import type {\n GraphJSON,\n NodeJSON,\n NodeSpecJSON\n} from '@kiberon-labs/behave-graph';\nimport type { Edge, Node } from 'reactflow';\nimport { System } from '../system/system';\nimport { writeVariablesToJSON } from '../util/serializeVariables';\nimport { isBehaveNode } from '@/util/isBehaveNode';\n\nconst isNullish = (value: any): value is null | undefined =>\n value === undefined || value === null;\n\nexport const flowToBehave = (\n system: System,\n nodes: Node[],\n edges: Edge[],\n nodeSpecJSON: NodeSpecJSON[]\n): GraphJSON => {\n const graph: GraphJSON = {\n nodes: [],\n variables: [],\n customEvents: system.eventsStore.getState().getCustomEvents()\n };\n\n const registry = system.registry.getState();\n const varStore = system.variableStore.getState().variables;\n\n nodes.forEach((node) => {\n if (!isBehaveNode(node)) return;\n\n const nodeType = node.data.type as string;\n\n const nodeSpec = nodeSpecJSON.find(\n (nodeSpec) => nodeSpec.type === nodeType\n );\n\n if (nodeSpec === undefined) return;\n\n const behaveNode: NodeJSON = {\n id: node.id,\n type: nodeType\n };\n\n const configuration = node.data?.configuration;\n if (\n configuration &&\n typeof configuration === 'object' &&\n Array.isArray(configuration) === false &&\n Object.keys(configuration).length > 0\n ) {\n behaveNode.configuration = { ...configuration };\n }\n\n Object.entries(node.data.ports ?? {}).forEach(([key, value]) => {\n if (behaveNode.parameters === undefined) {\n behaveNode.parameters = {};\n }\n behaveNode.parameters[key] = { value: value };\n });\n\n edges\n .filter((edge) => edge.target === node.id)\n .forEach((edge) => {\n const inputSpec = nodeSpec.inputs.find(\n (input) => input.name === edge.targetHandle\n );\n if (inputSpec && inputSpec.valueType === 'flow') {\n // skip flows\n return;\n }\n if (behaveNode.parameters === undefined) {\n behaveNode.parameters = {};\n }\n if (isNullish(edge.targetHandle)) return;\n if (isNullish(edge.sourceHandle)) return;\n\n behaveNode.parameters[edge.targetHandle] = {\n link: { nodeId: edge.source, socket: edge.sourceHandle }\n };\n });\n\n edges\n .filter((edge) => edge.source === node.id)\n .forEach((edge) => {\n const outputSpec = nodeSpec.outputs.find(\n (output) => output.name === edge.sourceHandle\n );\n if (outputSpec && outputSpec.valueType !== 'flow') {\n return;\n }\n if (behaveNode.flows === undefined) {\n behaveNode.flows = {};\n }\n if (isNullish(edge.targetHandle)) return;\n if (isNullish(edge.sourceHandle)) return;\n\n behaveNode.flows[edge.sourceHandle] = {\n nodeId: edge.target,\n socket: edge.targetHandle\n };\n });\n\n // TODO filter out any orphan nodes at this point, to avoid errors further down inside behave-graph\n\n graph.nodes?.push(behaveNode);\n });\n\n if (Object.keys(varStore).length > 0) {\n graph.variables = writeVariablesToJSON(registry, varStore);\n }\n return graph;\n};\n","import type { GraphJSON, NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport { useCallback, useEffect, useState } from 'react';\nimport { behaveToFlow } from '../transformers/behaveToFlow.js';\nimport { flowToBehave } from '../transformers/flowToBehave.js';\nimport { autoLayout } from '../util/autoLayout.js';\nimport { hasPositionMetaData } from '../util/hasPositionMetaData.js';\nimport { useSystem } from '@/system/provider.js';\nimport { useStore } from 'zustand';\n\n/**\n * Hook that returns the nodes and edges for react-flow, and the graphJson for the behave-graph.\n * If nodes or edges are changes, the graph json is updated automatically.\n * The graph json can be set manually, in which case the nodes and edges are updated to match the graph json.\n * @param param0\n * @returns\n */\nexport const useBehaveGraphFlow = ({\n initialGraphJson,\n specJson\n}: {\n initialGraphJson: GraphJSON;\n specJson: NodeSpecJSON[] | undefined;\n}) => {\n const [graphJson, setStoredGraphJson] = useState<GraphJSON | undefined>();\n const sys = useSystem();\n\n const {\n nodes,\n setNodes,\n applyNodeChanges: onNodesChange\n } = useStore(sys.nodeStore);\n\n const {\n edges,\n setEdges,\n applyEdgeChanges: onEdgesChange\n } = useStore(sys.edgeStore);\n\n const setGraphJson = useCallback(\n (graphJson: GraphJSON) => {\n if (!graphJson) return;\n\n const [nodes, edges] = behaveToFlow(graphJson);\n\n if (hasPositionMetaData(graphJson) === false) {\n autoLayout(nodes, edges);\n }\n\n setNodes(nodes);\n setEdges(edges);\n setStoredGraphJson(graphJson);\n },\n [setEdges, setNodes]\n );\n\n useEffect(() => {\n if (!initialGraphJson) return;\n setGraphJson(initialGraphJson);\n }, [initialGraphJson, setGraphJson]);\n\n useEffect(() => {\n if (!specJson) return;\n // when nodes and edges are updated, update the graph json with the flow to behave behavior\n const graphJson = flowToBehave(sys, nodes, edges, specJson);\n setStoredGraphJson(graphJson);\n }, [nodes, edges, specJson]);\n\n return {\n nodes,\n edges,\n onEdgesChange,\n onNodesChange,\n setGraphJson,\n graphJson\n };\n};\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { Node, OnConnectStartParams } from 'reactflow';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { getSocketsByNodeTypeAndHandleType } from './getSocketsByNodeTypeAndHandleType.js';\n\nexport const calculateNewEdge = (\n originNode: Node,\n destinationNodeType: string,\n destinationNodeId: string,\n connection: OnConnectStartParams,\n specJSON: NodeSpecJSON[]\n) => {\n const sockets = getSocketsByNodeTypeAndHandleType(\n specJSON,\n originNode.type,\n connection.handleType\n );\n const originSocket = sockets?.find(\n (socket) => socket.name === connection.handleId\n );\n\n const newSockets = getSocketsByNodeTypeAndHandleType(\n specJSON,\n destinationNodeType,\n connection.handleType === 'source' ? 'target' : 'source'\n );\n const newSocket = newSockets?.find(\n (socket) => socket.valueType === originSocket?.valueType\n );\n\n if (connection.handleType === 'source') {\n return {\n id: uuidv4(),\n source: connection.nodeId ?? '',\n sourceHandle: connection.handleId,\n target: destinationNodeId,\n targetHandle: newSocket?.name\n };\n }\n\n return {\n id: uuidv4(),\n target: connection.nodeId ?? '',\n targetHandle: connection.handleId,\n source: destinationNodeId,\n sourceHandle: newSocket?.name\n };\n};\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { Node, OnConnectStartParams } from 'reactflow';\nimport type { NodePickerFilters } from '../components/contextMenus/NodePicker.js';\nimport { getSocketsByNodeTypeAndHandleType } from './getSocketsByNodeTypeAndHandleType.js';\n\nexport const getNodePickerFilters = (\n nodes: Node[],\n params: OnConnectStartParams | undefined,\n specJSON: NodeSpecJSON[] | undefined\n): NodePickerFilters | undefined => {\n if (params === undefined) return;\n\n const originNode = nodes.find((node) => node.id === params.nodeId);\n if (originNode === undefined) return;\n\n const sockets = specJSON\n ? getSocketsByNodeTypeAndHandleType(\n specJSON,\n originNode.type,\n params.handleType\n )\n : undefined;\n\n const socket = sockets?.find((socket) => socket.name === params.handleId);\n\n if (socket === undefined) return;\n\n return {\n handleType: params.handleType === 'source' ? 'target' : 'source',\n valueType: socket.valueType\n };\n};\n","import type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport {\n type MouseEvent as ReactMouseEvent,\n useCallback,\n useEffect,\n useState\n} from 'react';\nimport type {\n Connection,\n ConnectionStatus,\n Node,\n OnConnectStartParams,\n XYPosition\n} from 'reactflow';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { calculateNewEdge } from '../util/calculateNewEdge.js';\nimport { getNodePickerFilters } from '../util/getPickerFilters.js';\nimport { useBehaveGraphFlow } from './useBehaveGraphFlow.js';\nimport { useSystem } from '@/system/provider.js';\nimport type { ExtendedNodeSpecJSON } from '@/components/contextMenus/NodePicker.js';\nimport {\n addFloatingTab,\n findTabInLayout,\n removeTabFromLayout\n} from '@/components/layoutController/utils.js';\n\ntype BehaveGraphFlow = ReturnType<typeof useBehaveGraphFlow>;\n\nconst useNodePickFilters = ({\n nodes,\n lastConnectStart,\n specJSON\n}: {\n nodes: Node[];\n lastConnectStart: OnConnectStartParams | undefined;\n specJSON: NodeSpecJSON[] | undefined;\n}) => {\n const [nodePickFilters, setNodePickFilters] = useState(\n getNodePickerFilters(nodes, lastConnectStart, specJSON)\n );\n\n useEffect(() => {\n setNodePickFilters(getNodePickerFilters(nodes, lastConnectStart, specJSON));\n }, [nodes, lastConnectStart, specJSON]);\n\n return nodePickFilters;\n};\n\nexport const useFlowHandlers = ({\n onEdgesChange,\n onNodesChange,\n nodes,\n specJSON\n}: Pick<BehaveGraphFlow, 'onEdgesChange' | 'onNodesChange'> & {\n nodes: Node[];\n specJSON: NodeSpecJSON[] | undefined;\n}) => {\n const sys = useSystem();\n const [lastConnectStart, setLastConnectStart] =\n useState<OnConnectStartParams>();\n const [nodePickerVisibility, setNodePickerVisibility] =\n useState<XYPosition>();\n const onConnect = useCallback(\n (connection: Connection) => {\n if (connection.source === null) return;\n if (connection.target === null) return;\n\n const newEdge = {\n id: uuidv4(),\n source: connection.source,\n target: connection.target,\n sourceHandle: connection.sourceHandle,\n targetHandle: connection.targetHandle\n };\n sys.pubsub.publish('edge:added', newEdge);\n onEdgesChange([\n {\n type: 'add',\n item: newEdge\n }\n ]);\n },\n [onEdgesChange]\n );\n\n const closeNodePicker = useCallback(() => {\n setLastConnectStart(undefined);\n setNodePickerVisibility(undefined);\n\n // Close the nodepicker panel from rc-dock\n const currentLayout = sys.tabStore.getState().layout;\n const newLayout = removeTabFromLayout(currentLayout, 'nodepicker');\n sys.tabStore.getState().setLayout(newLayout);\n }, [sys]);\n\n const handleAddNode = useCallback(\n (spec: ExtendedNodeSpecJSON, position: XYPosition) => {\n closeNodePicker();\n const newNode = {\n id: uuidv4(),\n type: spec.nodeType ?? 'behaveNode',\n position,\n data: {\n configuration: {},\n type: spec.type,\n ports: {}\n }\n };\n\n sys.undoManager.execute({\n name: `Add node (${spec.type})`,\n execute: () => {\n sys.nodeStore.getState().addNode(newNode);\n },\n undo: () => {\n sys.nodeStore\n .getState()\n .setNodes((existing) =>\n existing.filter((n) => n.id !== newNode.id)\n );\n }\n });\n\n if (lastConnectStart === undefined) return;\n\n // add an edge if we started on a socket\n const originNode = nodes.find(\n (node) => node.id === lastConnectStart.nodeId\n );\n if (originNode === undefined) return;\n if (!specJSON) return;\n onEdgesChange([\n {\n type: 'add',\n item: calculateNewEdge(\n originNode,\n spec.type,\n newNode.id,\n lastConnectStart,\n specJSON\n )\n }\n ]);\n },\n [\n closeNodePicker,\n lastConnectStart,\n nodes,\n onEdgesChange,\n onNodesChange,\n specJSON\n ]\n );\n\n const handleStartConnect = useCallback(\n (e: ReactMouseEvent, params: OnConnectStartParams) => {\n setLastConnectStart(params);\n },\n []\n );\n\n const handleStopConnect = useCallback(\n (e: MouseEvent, _connectionState: ConnectionStatus) => {\n const element = e.target as HTMLElement;\n if (element.classList.contains('react-flow__pane')) {\n const screenPos = { x: e.clientX, y: e.clientY };\n setNodePickerVisibility(screenPos);\n\n // Store screen position for NodePickerPanel to use\n sys.refStore.getState().setRef('nodePickerPosition', screenPos);\n\n // Open as floating rc-dock panel\n const currentLayout = sys.tabStore.getState().layout;\n\n // Close existing nodepicker if open\n const existingPanel = findTabInLayout(currentLayout, 'nodepicker');\n let layoutToUse = currentLayout;\n if (existingPanel) {\n layoutToUse = removeTabFromLayout(currentLayout, 'nodepicker');\n }\n\n // Create new floating panel with minimal tab data\n // The actual content will be loaded by tabLoader\n const tabData = {\n id: 'nodepicker',\n group: 'headless'\n };\n\n const newLayout = addFloatingTab(layoutToUse, tabData, {\n left: e.clientX,\n top: e.clientY,\n width: 600,\n height: 500\n });\n\n sys.tabStore.getState().setLayout(newLayout);\n } else {\n setLastConnectStart(undefined);\n }\n },\n [sys]\n );\n\n const handlePaneClick = useCallback(\n () => closeNodePicker(),\n [closeNodePicker]\n );\n\n const handlePaneContextMenu = useCallback(\n (e: ReactMouseEvent) => {\n e.preventDefault();\n const screenPos = { x: e.clientX, y: e.clientY };\n setNodePickerVisibility(screenPos);\n\n // Store screen position for NodePickerPanel to use\n sys.refStore.getState().setRef('nodePickerPosition', screenPos);\n\n // Open as floating rc-dock panel\n const currentLayout = sys.tabStore.getState().layout;\n\n // Close existing nodepicker if open\n const existingPanel = findTabInLayout(currentLayout, 'nodepicker');\n let layoutToUse = currentLayout;\n if (existingPanel) {\n layoutToUse = removeTabFromLayout(currentLayout, 'nodepicker');\n }\n\n // Create new floating panel with minimal tab data\n // The actual content will be loaded by tabLoader\n const tabData = {\n id: 'nodepicker',\n group: 'headless'\n };\n\n const newLayout = addFloatingTab(layoutToUse, tabData, {\n left: e.clientX,\n top: e.clientY,\n width: 600,\n height: 500\n });\n\n sys.tabStore.getState().setLayout(newLayout);\n },\n [sys]\n );\n\n const nodePickFilters = useNodePickFilters({\n nodes,\n lastConnectStart,\n specJSON\n });\n\n return {\n onConnect,\n handleStartConnect,\n handleStopConnect,\n handlePaneClick,\n handlePaneContextMenu,\n lastConnectStart,\n nodePickerVisibility,\n handleAddNode,\n closeNodePicker,\n nodePickFilters\n };\n};\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { ReactFlowInstance } from 'reactflow';\n\nexport type UseWasdPanOptions = {\n getReactFlowInstance: () => ReactFlowInstance | undefined;\n speed?: number;\n speedWithShift?: number;\n dtCapSeconds?: number;\n enabled?: boolean;\n};\n\nconst isEventFromEditable = (event: KeyboardEvent) => {\n const target = event.target as HTMLElement | null;\n const tag = target?.tagName?.toLowerCase();\n //Just a patch to avoid pan when focus is in input/textarea or contenteditable element\n return tag !== 'div';\n};\n\nexport const useWasdPan = ({\n getReactFlowInstance,\n speed = 650,\n speedWithShift = 1400,\n dtCapSeconds = 0.05,\n enabled = true\n}: UseWasdPanOptions) => {\n const wasdRef = useRef({\n w: false,\n a: false,\n s: false,\n d: false,\n shift: false\n });\n const rafRef = useRef<number | null>(null);\n const lastFrameRef = useRef<number | null>(null);\n\n const cancelPanLoop = useCallback(() => {\n if (rafRef.current != null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastFrameRef.current = null;\n }, []);\n\n const startPanLoop = useCallback(() => {\n if (rafRef.current != null) return;\n\n const tick = (now: number) => {\n const last = lastFrameRef.current;\n lastFrameRef.current = now;\n const dtMs = last == null ? 0 : now - last;\n const dt = Math.min(dtCapSeconds, dtMs / 1000);\n\n const state = wasdRef.current;\n const any = state.w || state.a || state.s || state.d;\n const reactFlowInstance = getReactFlowInstance();\n\n if (!enabled || !any) {\n cancelPanLoop();\n return;\n }\n\n // The reactflow ref can be temporarily unavailable during re-mounts.\n // If we cancel here while the user is still holding a key, we might never\n // restart because we ignore keydown repeats.\n if (!reactFlowInstance) {\n rafRef.current = requestAnimationFrame(tick);\n return;\n }\n\n const appliedSpeed = state.shift ? speedWithShift : speed;\n const step = appliedSpeed * dt;\n\n let dx = 0;\n let dy = 0;\n if (state.a) dx += step;\n if (state.d) dx -= step;\n if (state.w) dy += step;\n if (state.s) dy -= step;\n\n if (dx !== 0 || dy !== 0) {\n const viewport = reactFlowInstance.getViewport();\n reactFlowInstance.setViewport({\n ...viewport,\n x: viewport.x + dx,\n y: viewport.y + dy\n });\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n }, [\n cancelPanLoop,\n dtCapSeconds,\n enabled,\n getReactFlowInstance,\n speed,\n speedWithShift\n ]);\n\n useEffect(() => {\n if (!enabled) {\n wasdRef.current = {\n w: false,\n a: false,\n s: false,\n d: false,\n shift: false\n };\n cancelPanLoop();\n return;\n }\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (isEventFromEditable(event)) return;\n if (event.ctrlKey || event.metaKey || event.altKey) return;\n\n const key = event.key?.toLowerCase();\n if (\n key !== 'w' &&\n key !== 'a' &&\n key !== 's' &&\n key !== 'd' &&\n key !== 'shift'\n ) {\n return;\n }\n\n if (key === 'shift') {\n wasdRef.current.shift = true;\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (key === 'w') wasdRef.current.w = true;\n if (key === 'a') wasdRef.current.a = true;\n if (key === 's') wasdRef.current.s = true;\n if (key === 'd') wasdRef.current.d = true;\n\n startPanLoop();\n };\n\n const onKeyUp = (event: KeyboardEvent) => {\n const key = event.key?.toLowerCase();\n if (key === 'shift') {\n wasdRef.current.shift = false;\n return;\n }\n\n if (key === 'w') wasdRef.current.w = false;\n if (key === 'a') wasdRef.current.a = false;\n if (key === 's') wasdRef.current.s = false;\n if (key === 'd') wasdRef.current.d = false;\n\n const state = wasdRef.current;\n if (!(state.w || state.a || state.s || state.d)) {\n cancelPanLoop();\n }\n };\n\n const onBlur = () => {\n wasdRef.current = {\n w: false,\n a: false,\n s: false,\n d: false,\n shift: false\n };\n cancelPanLoop();\n };\n\n window.addEventListener('keydown', onKeyDown, { capture: true });\n window.addEventListener('keyup', onKeyUp, { capture: true });\n window.addEventListener('blur', onBlur);\n\n return () => {\n window.removeEventListener('keydown', onKeyDown, {\n capture: true\n });\n window.removeEventListener('keyup', onKeyUp, { capture: true });\n window.removeEventListener('blur', onBlur);\n cancelPanLoop();\n };\n }, [cancelPanLoop, enabled, startPanLoop]);\n};\n","import { useReactFlow } from 'reactflow';\nimport type { CSSProperties } from 'react';\nimport { useCallback } from 'react';\nimport clsx from 'classnames';\nimport {\n VscodeContextMenu,\n VscodeContextMenuItem,\n VscodeDivider\n} from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system';\nimport { hidden, pinned } from '@/annotations';\n\nexport interface INodeContextMenuProps extends CSSProperties {\n nodeID: string;\n}\n\nexport const NodeContextMenu = ({ nodeID, ...rest }: INodeContextMenuProps) => {\n const reactFlowInstance = useReactFlow();\n const sys = useSystem();\n\n // Get the current node to check if it's hidden\n const currentNode = sys.nodeStore\n .getState()\n .nodes.find((n) => n.id === nodeID);\n const isHidden =\n currentNode && 'data' in currentNode\n ? (currentNode.data.annotations?.[hidden] ?? false)\n : false;\n const isPinned =\n currentNode && 'data' in currentNode\n ? (currentNode.data.annotations?.[pinned] ?? false)\n : false;\n\n const focus = useCallback(() => {\n const nodeSearch = sys.nodeStore.getState().nodes;\n const reactFlowInstance = sys.refStore.getState().getRef('reactflow');\n const nodes = nodeID\n ? nodeSearch.filter((x) => x.id === nodeID)\n : nodeSearch.filter((x) => x.selected);\n if (nodes) {\n const focalCenter = nodes.reduce(\n (acc, node) => {\n return {\n x: acc.x + node.position.x + (node.width || 0) / 2,\n y: acc.y + node.position.y + (node.height || 0) / 2\n };\n },\n { x: 0, y: 0 }\n );\n\n reactFlowInstance?.setCenter(focalCenter.x, focalCenter.y, {\n duration: 200,\n zoom: 1\n });\n }\n }, [nodeID]);\n\n const onResetTrace = useCallback(() => {\n reactFlowInstance.setNodes((nodes) =>\n nodes.map((x) => {\n //Remove filtering\n return {\n ...x,\n className: clsx(x.className, {\n filtered: false\n })\n };\n })\n );\n }, [reactFlowInstance]);\n\n const onSelect = useCallback(\n (e: any) => {\n switch (e.detail.value) {\n case 'traceUpstream':\n sys.actionStore.getState().actions.traceUpstream(nodeID);\n break;\n case 'traceDownstream':\n sys.actionStore.getState().actions.traceDownstream(nodeID);\n break;\n case 'resetTrace':\n sys.actionStore.getState().actions.resetTrace();\n break;\n\n case 'focus':\n focus();\n break;\n\n case 'pin':\n sys.actionStore.getState().actions.toggleNodePinned(nodeID);\n break;\n case 'hide':\n sys.actionStore.getState().actions.toggleNodeHidden(nodeID);\n break;\n }\n },\n [focus, nodeID, sys]\n );\n\n return (\n <VscodeContextMenu\n show\n onVscContextMenuSelect={onSelect}\n style={{ zIndex: 2000, position: 'absolute', ...rest }}\n data={[\n {\n label: 'Focus',\n keybinding: 'Ctrl+Shift+F',\n value: 'focus'\n },\n {\n separator: true\n },\n {\n label: 'Trace Upstream',\n keybinding: 'Ctrl+Shift+R',\n value: 'traceUpstream'\n },\n {\n label: 'Trace Downstream',\n keybinding: 'Ctrl+Shift+T',\n value: 'traceDownstream'\n },\n {\n separator: true\n },\n {\n label: 'Reset Trace',\n keybinding: 'Ctrl+Shift+G',\n value: 'resetTrace'\n },\n\n {\n separator: true\n },\n {\n label: isPinned ? 'Unpin' : 'Pin',\n value: 'pin'\n },\n {\n label: isHidden ? 'Show' : 'Hide',\n value: 'hide'\n }\n ]}\n >\n <VscodeContextMenuItem onClick={focus}>Focus</VscodeContextMenuItem>\n <VscodeDivider />\n\n <VscodeContextMenuItem onClick={onResetTrace}>\n Reset Trace\n </VscodeContextMenuItem>\n <VscodeDivider />\n </VscodeContextMenu>\n );\n};\n","import type { CSSProperties } from 'react';\nimport { useCallback } from 'react';\nimport type { EdgeChange } from 'reactflow';\nimport {\n VscodeContextMenu,\n VscodeContextMenuItem,\n VscodeDivider\n} from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system';\n\nexport interface IEdgeContextMenuProps extends CSSProperties {\n edgeID: string;\n sourceID: string;\n targetID: string;\n}\n\nexport const EdgeContextMenu = ({\n edgeID,\n sourceID,\n targetID,\n ...rest\n}: IEdgeContextMenuProps) => {\n const sys = useSystem();\n\n const centerOnNode = useCallback(\n (nodeId: string) => {\n const node = sys.nodeStore.getState().nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const x = node.position.x + (node.width ?? 0) / 2;\n const y = node.position.y + (node.height ?? 0) / 2;\n\n sys.refStore.getState().getRef('reactflow')?.setCenter(x, y, {\n duration: 200,\n zoom: 1\n });\n },\n [sys]\n );\n\n const findSource = useCallback(\n () => centerOnNode(sourceID),\n [centerOnNode, sourceID]\n );\n const findTarget = useCallback(\n () => centerOnNode(targetID),\n [centerOnNode, targetID]\n );\n\n const deleteEdge = useCallback(() => {\n const change: EdgeChange = {\n id: edgeID,\n type: 'remove'\n };\n sys.edgeStore.getState().applyEdgeChanges([change]);\n }, [edgeID, sys.edgeStore]);\n\n const onSelect = useCallback(\n (e: any) => {\n switch (e.detail.value) {\n case 'findSource':\n findSource();\n break;\n case 'findTarget':\n findTarget();\n break;\n case 'delete':\n deleteEdge();\n break;\n }\n },\n [deleteEdge, findSource, findTarget]\n );\n\n return (\n <VscodeContextMenu\n show\n onVscContextMenuSelect={onSelect}\n style={{ zIndex: 2000, position: 'absolute', ...rest }}\n data={[\n {\n label: 'Find Source',\n value: 'findSource'\n },\n {\n label: 'Find Target',\n value: 'findTarget'\n },\n {\n separator: true\n },\n {\n label: 'Delete',\n value: 'delete'\n }\n ]}\n >\n <VscodeContextMenuItem onClick={findSource}>\n Find Source\n </VscodeContextMenuItem>\n <VscodeContextMenuItem onClick={findTarget}>\n Find Target\n </VscodeContextMenuItem>\n <VscodeDivider />\n <VscodeContextMenuItem onClick={deleteEdge}>Delete</VscodeContextMenuItem>\n </VscodeContextMenu>\n );\n};\n","import type { CSSProperties } from 'react';\nimport { useCallback } from 'react';\nimport {\n VscodeContextMenu,\n VscodeContextMenuItem,\n VscodeDivider\n} from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system';\n\nexport interface ISelectionContextMenuProps extends CSSProperties {}\n\nexport const SelectionContextMenu = ({\n ...rest\n}: ISelectionContextMenuProps) => {\n const sys = useSystem();\n\n const onCopy = useCallback(() => {\n sys.actionStore.getState().actions.copySelectionToClipboard();\n }, [sys]);\n\n const onPaste = useCallback(async () => {\n await sys.actionStore.getState().actions.pasteFromClipboard();\n }, [sys]);\n\n const onGroup = useCallback(() => {\n sys.actionStore.getState().actions.groupNodes();\n }, [sys]);\n\n const onSelect = useCallback(\n (e: any) => {\n switch (e.detail.value) {\n case 'copy':\n onCopy();\n break;\n case 'paste':\n void onPaste();\n break;\n case 'group':\n onGroup();\n break;\n }\n },\n [onCopy, onGroup, onPaste]\n );\n\n return (\n <VscodeContextMenu\n show\n onVscContextMenuSelect={onSelect}\n style={{ zIndex: 2000, position: 'absolute', ...rest }}\n data={[\n {\n label: 'Copy',\n keybinding: 'Ctrl+C',\n value: 'copy'\n },\n {\n label: 'Paste',\n keybinding: 'Ctrl+V',\n value: 'paste'\n },\n {\n separator: true\n },\n {\n label: 'Group',\n value: 'group'\n }\n ]}\n >\n <VscodeContextMenuItem onClick={onCopy}>Copy</VscodeContextMenuItem>\n <VscodeContextMenuItem onClick={onPaste}>Paste</VscodeContextMenuItem>\n <VscodeDivider />\n <VscodeContextMenuItem onClick={onGroup}>Group</VscodeContextMenuItem>\n </VscodeContextMenu>\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeSingleSelect,\n VscodeOption\n} from '@vscode-elements/react-elements';\nimport { Plus, Minus } from 'iconoir-react';\n\nimport { useSystem } from '@/system/provider';\nimport type { SocketGeneratorRenderProps } from '@/store/socketGenerator';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph/Graphs/IO/NodeSpecJSON';\n\nconst NAME = 'flow/switch/string.socketGenerator';\n\nexport function getSwitchOnStringGenerator() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) => spec?.type === 'flow/switch/string',\n render: SwitchOnStringGenerator\n };\n}\n\nconst SwitchOnStringGenerator: React.FC<SocketGeneratorRenderProps> = ({\n node\n}) => {\n const system = useSystem();\n\n const numCases = node.data.configuration?.numCases ?? 0;\n const caseLabels = node.data.configuration?.caseLabels ?? {};\n const caseValues = node.data.configuration?.cases ?? {};\n\n const [selectedCase, setSelectedCase] = useState<number>(1);\n\n const updateNumCases = useCallback(\n (newNumCases: number) => {\n if (newNumCases < 0) return;\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n: any) => {\n if (n.id !== node.id) return n;\n\n // Preserve existing case values when changing numCases\n const existingCases = n.data?.configuration?.cases ?? {};\n const newCases: Record<string, string> = {};\n for (let i = 1; i <= newNumCases; i++) {\n const key = `${i}`;\n newCases[key] = existingCases[key] ?? `case${i}`;\n }\n\n // Generate input sockets for each case\n const inputs = [];\n for (let i = 1; i <= newNumCases; i++) {\n const key = `${i}`;\n inputs.push({\n name: n.data?.configuration?.caseLabels?.[key] || `Case ${i}`,\n key,\n valueType: 'string'\n });\n }\n\n // Generate output sockets for each case\n const outputs = [];\n for (let i = 1; i <= newNumCases; i++) {\n const label =\n n.data?.configuration?.caseLabels?.[`${i}`] || `Case ${i}`;\n outputs.push({\n name: label,\n key: `${i}`,\n valueType: 'flow'\n });\n }\n // Add default output\n outputs.push({\n name: 'default',\n key: 'default',\n valueType: 'flow'\n });\n\n return {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data?.configuration,\n numCases: newNumCases,\n cases: newCases\n },\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n inputs,\n outputs\n }\n }\n };\n })\n );\n\n if (selectedCase > newNumCases && newNumCases > 0) {\n setSelectedCase(newNumCases);\n }\n },\n [node.id, system, selectedCase]\n );\n\n const updateCaseValue = useCallback(\n (caseIndex: number, value: string) => {\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n: any) => {\n if (n.id !== node.id) return n;\n\n const updatedCases = {\n ...n.data?.configuration?.cases,\n [`${caseIndex}`]: value\n };\n\n const updatedLabels = {\n ...n.data?.configuration?.caseLabels,\n [`${caseIndex}`]: value || `Case ${caseIndex}`\n };\n\n // Update input sockets\n const numCases = n.data?.configuration?.numCases ?? 0;\n const inputs = [];\n for (let i = 1; i <= numCases; i++) {\n const key = `${i}`;\n inputs.push({\n name: updatedLabels[key] || `Case ${i}`,\n key,\n valueType: 'string'\n });\n }\n\n // Regenerate output sockets with updated labels\n const outputs = [];\n for (let i = 1; i <= numCases; i++) {\n const label = updatedLabels[`${i}`] || `Case ${i}`;\n outputs.push({\n name: label,\n key: `${i}`,\n valueType: 'flow'\n });\n }\n outputs.push({\n name: 'default',\n key: 'default',\n valueType: 'flow'\n });\n\n return {\n ...n,\n data: {\n ...n.data,\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n inputs,\n outputs\n },\n configuration: {\n ...n.data?.configuration,\n cases: updatedCases,\n caseLabels: updatedLabels\n }\n }\n };\n })\n );\n },\n [node.id, system]\n );\n\n const addCase = useCallback(() => {\n const newCount = numCases + 1;\n updateNumCases(newCount);\n setSelectedCase(newCount);\n }, [numCases, updateNumCases]);\n\n const removeCase = useCallback(() => {\n updateNumCases(Math.max(0, numCases - 1));\n }, [numCases, updateNumCases]);\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4\n }}\n >\n <div style={{ fontSize: 12, opacity: 0.9 }}>Cases: {numCases}</div>\n </div>\n\n {numCases > 0 && (\n <>\n <div style={{ fontSize: 11, opacity: 0.8, marginBottom: -4 }}>\n Edit Case\n </div>\n <VscodeSingleSelect\n value={String(selectedCase)}\n onChange={(e: any) => setSelectedCase(Number(e.target.value))}\n >\n {Array.from({ length: numCases }, (_, i) => i + 1).map(\n (caseIndex) => (\n <VscodeOption key={caseIndex} value={String(caseIndex)}>\n {caseLabels[`${caseIndex}`] || `Case ${caseIndex}`}\n </VscodeOption>\n )\n )}\n </VscodeSingleSelect>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <label style={{ fontSize: 11, opacity: 0.8 }}>Match Value</label>\n <VscodeTextfield\n value={caseValues[`${selectedCase}`] ?? ''}\n onInput={(e: any) =>\n updateCaseValue(selectedCase, e.target.value)\n }\n placeholder={`String value for case ${selectedCase}`}\n />\n </div>\n </>\n )}\n\n <div style={{ display: 'flex', gap: 4, marginTop: 4 }}>\n <VscodeButton\n onClick={addCase}\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4\n }}\n >\n <Plus width={16} height={16} />\n Add Case\n </VscodeButton>\n <VscodeButton\n onClick={removeCase}\n disabled={numCases === 0}\n style={{\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4\n }}\n >\n <Minus width={16} height={16} />\n Remove\n </VscodeButton>\n </div>\n </div>\n );\n};\n","import React, { useCallback, useState } from 'react';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeSingleSelect,\n VscodeOption\n} from '@vscode-elements/react-elements';\nimport { Plus, Minus } from 'iconoir-react';\n\nimport { useSystem } from '@/system/provider';\nimport type { SocketGeneratorRenderProps } from '@/store/socketGenerator';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph/Graphs/IO/NodeSpecJSON';\n\nconst NAME = 'flow/switch/integer.socketGenerator';\n\nexport function getSwitchOnIntegerGenerator() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) => spec?.type === 'flow/switch/integer',\n render: SwitchOnIntegerGenerator\n };\n}\n\nconst SwitchOnIntegerGenerator: React.FC<SocketGeneratorRenderProps> = ({\n node\n}) => {\n const system = useSystem();\n\n const numCases = node.data.configuration?.numCases ?? 0;\n const caseLabels = node.data.configuration?.caseLabels ?? {};\n const caseValues = node.data.configuration?.cases ?? {};\n\n const [selectedCase, setSelectedCase] = useState<number>(1);\n\n const updateNumCases = useCallback(\n (newNumCases: number) => {\n if (newNumCases < 0) return;\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n\n // Preserve existing case values when changing numCases\n const existingCases = n.data?.configuration?.cases ?? {};\n const newCases: Record<string, bigint> = {};\n for (let i = 1; i <= newNumCases; i++) {\n const key = `${i}`;\n newCases[key] = existingCases[key] ?? BigInt(i);\n }\n\n // Generate input sockets for each case\n const inputs = [];\n for (let i = 1; i <= newNumCases; i++) {\n const key = `${i}`;\n inputs.push({\n name: n.data.configuration?.caseLabels?.[key] || key,\n key,\n valueType: 'integer'\n });\n }\n\n // Generate output sockets for each case\n const outputs = [];\n for (let i = 1; i <= newNumCases; i++) {\n const label = n.data.configuration?.caseLabels?.[`${i}`] || `${i}`;\n outputs.push({\n name: label,\n key: `${i}`,\n valueType: 'flow'\n });\n }\n // Add default output\n outputs.push({\n name: 'default',\n key: 'default',\n valueType: 'flow'\n });\n\n return {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data.configuration,\n numCases: newNumCases,\n cases: newCases\n },\n dynamicPorts: {\n ...n.data.dynamicPorts,\n inputs,\n outputs\n }\n }\n };\n })\n );\n\n if (selectedCase > newNumCases && newNumCases > 0) {\n setSelectedCase(newNumCases);\n }\n },\n [node.id, system, selectedCase]\n );\n\n const updateCaseValue = useCallback(\n (caseIndex: number, value: string) => {\n const intValue =\n value === ''\n ? BigInt(caseIndex)\n : BigInt(parseInt(value, 10) || caseIndex);\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n: any) => {\n if (n.id !== node.id) return n;\n\n const updatedCases = {\n ...n.data?.configuration?.cases,\n [`${caseIndex}`]: intValue\n };\n\n const updatedLabels = {\n ...n.data?.configuration?.caseLabels,\n [`${caseIndex}`]: value || `${caseIndex}`\n };\n\n // Update input sockets\n const numCases = n.data?.configuration?.numCases ?? 0;\n const inputs = [];\n for (let i = 1; i <= numCases; i++) {\n const key = `${i}`;\n inputs.push({\n name: updatedLabels[key] || key,\n key,\n valueType: 'integer'\n });\n }\n\n // Regenerate output sockets with updated labels\n const outputs = [];\n for (let i = 1; i <= numCases; i++) {\n const label = updatedLabels[`${i}`] || `${i}`;\n outputs.push({\n name: label,\n key: `${i}`,\n valueType: 'flow'\n });\n }\n outputs.push({\n name: 'default',\n key: 'default',\n valueType: 'flow'\n });\n\n return {\n ...n,\n data: {\n ...n.data,\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n inputs,\n outputs\n },\n configuration: {\n ...n.data?.configuration,\n cases: updatedCases,\n caseLabels: updatedLabels\n }\n }\n };\n })\n );\n },\n [node.id, system]\n );\n\n const addCase = useCallback(() => {\n const newCount = numCases + 1;\n updateNumCases(newCount);\n setSelectedCase(newCount);\n }, [numCases, updateNumCases]);\n\n const removeCase = useCallback(() => {\n updateNumCases(Math.max(0, numCases - 1));\n }, [numCases, updateNumCases]);\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4\n }}\n >\n <div style={{ fontSize: 12, opacity: 0.9 }}>Cases: {numCases}</div>\n </div>\n\n {numCases > 0 && (\n <>\n <div style={{ fontSize: 11, opacity: 0.8, marginBottom: -4 }}>\n Edit Case\n </div>\n <VscodeSingleSelect\n value={String(selectedCase)}\n onChange={(e: any) => setSelectedCase(Number(e.target.value))}\n >\n {Array.from({ length: numCases }, (_, i) => i + 1).map(\n (caseIndex) => (\n <VscodeOption key={caseIndex} value={String(caseIndex)}>\n {caseLabels[`${caseIndex}`] || `Case ${caseIndex}`}\n </VscodeOption>\n )\n )}\n </VscodeSingleSelect>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <label style={{ fontSize: 11, opacity: 0.8 }}>Match Value</label>\n <VscodeTextfield\n type=\"number\"\n value={\n caseValues[`${selectedCase}`] !== undefined\n ? String(caseValues[`${selectedCase}`])\n : ''\n }\n onInput={(e: any) =>\n updateCaseValue(selectedCase, e.target.value)\n }\n placeholder={`Integer value for case ${selectedCase}`}\n />\n </div>\n </>\n )}\n\n <div style={{ display: 'flex', gap: 4, marginTop: 4 }}>\n <VscodeButton onClick={addCase} title=\"Add Case\" iconOnly>\n <Plus />\n </VscodeButton>\n <VscodeButton\n onClick={removeCase}\n secondary\n iconOnly\n title=\"Remove Case\"\n disabled={numCases === 0}\n >\n <Minus />\n </VscodeButton>\n </div>\n </div>\n );\n};\n","import React, { useEffect } from 'react';\nimport { useStore } from 'zustand';\nimport { useSystem } from '@/system/provider';\nimport type { SocketGeneratorRenderProps } from '@/store/socketGenerator';\nimport type { Socket } from '@/types';\nimport type { IBehaveNode } from '@/types/nodes.js';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph/Graphs/IO/NodeSpecJSON';\n\nconst NAME = 'customEvent/onTriggered.socketGenerator';\n\nexport function getCustomEventOnTriggeredGenerator() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) => spec?.type === 'customEvent/onTriggered',\n render: CustomEventOnTriggeredGenerator\n };\n}\n\nconst CustomEventOnTriggeredGenerator: React.FC<SocketGeneratorRenderProps> = ({\n node\n}) => {\n const system = useSystem();\n const customEvents = useStore(system.eventsStore, (s) => s.customEvents);\n\n const customEventId = node.data.configuration?.customEventId;\n\n useEffect(() => {\n // Find the selected custom event\n const event = customEvents[customEventId];\n\n if (!event) {\n // No event selected or event not found - clear parameter outputs\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n outputs: []\n }\n }\n };\n })\n );\n return;\n }\n\n // Generate output sockets based on event parameters (not including flow)\n const outputs: Socket[] = [];\n\n // Add output for each parameter\n if (event.parameters && Array.isArray(event.parameters)) {\n event.parameters.forEach((param: any) => {\n outputs.push({\n name: param.name || 'param',\n key: param.name || 'param',\n valueType: param.valueTypeName || 'string'\n });\n });\n }\n\n // Update node ports\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n dynamicPorts: {\n ...n.data?.dynamicPorts,\n outputs\n }\n }\n } as IBehaveNode;\n })\n );\n }, [customEventId, customEvents, node.id, system.nodeStore]);\n\n // This generator doesn't render any UI\n return null;\n};\n","import React, { useCallback } from 'react';\nimport { VscodeButton } from '@vscode-elements/react-elements';\nimport { Plus, Minus } from 'iconoir-react';\n\nimport { useSystem } from '@/system/provider';\nimport type { SocketGeneratorRenderProps } from '@/store/socketGenerator';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph/Graphs/IO/NodeSpecJSON';\n\nconst NAME = 'flow/sequence.socketGenerator';\n\nexport function getSequenceGenerator() {\n return {\n name: NAME,\n check: (spec: NodeSpecJSON) =>\n (spec as { type?: string })?.type === 'flow/sequence',\n render: SequenceGenerator\n };\n}\n\nconst SequenceGenerator: React.FC<SocketGeneratorRenderProps> = ({ node }) => {\n const system = useSystem();\n\n const numOutputs = node.data.configuration?.numOutputs ?? 0;\n\n const updateNumOutputs = useCallback(\n (newNumOutputs: number) => {\n if (newNumOutputs < 1) return;\n\n const outputs: { name: string; key: string; valueType: string }[] = [];\n for (let i = 1; i <= newNumOutputs; i++) {\n outputs.push({\n name: `${i}`,\n key: `${i}`,\n valueType: 'flow'\n });\n }\n\n system.nodeStore.getState().setNodes((prev) =>\n prev.map((n) => {\n if (n.id !== node.id) return n;\n return {\n ...n,\n data: {\n ...n.data,\n configuration: {\n ...n.data.configuration,\n numOutputs: newNumOutputs\n },\n dynamicPorts: {\n ...n.data.dynamicPorts,\n outputs\n }\n }\n };\n })\n );\n },\n [node.id, system]\n );\n\n const addOutput = useCallback(() => {\n updateNumOutputs(numOutputs + 1);\n }, [numOutputs, updateNumOutputs]);\n\n const removeOutput = useCallback(() => {\n updateNumOutputs(Math.max(1, numOutputs - 1));\n }, [numOutputs, updateNumOutputs]);\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 8\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 4\n }}\n >\n <div style={{ fontSize: 12, opacity: 0.9 }}>Outputs: {numOutputs}</div>\n </div>\n\n <div style={{ display: 'flex', gap: 4, marginTop: 4 }}>\n <VscodeButton onClick={addOutput} title=\"Add Output\" iconOnly>\n <Plus />\n </VscodeButton>\n <VscodeButton\n onClick={removeOutput}\n secondary\n iconOnly\n title=\"Remove Output\"\n disabled={numOutputs === 1}\n >\n <Minus />\n </VscodeButton>\n </div>\n </div>\n );\n};\n","import type { System } from '@/system/system';\nimport { getSwitchOnStringGenerator } from '../generators/SwitchOnStringGenerator';\nimport { getSwitchOnIntegerGenerator } from '../generators/SwitchOnIntegerGenerator';\nimport { getCustomEventOnTriggeredGenerator } from '../generators/CustomEventOnTriggeredGenerator';\nimport { getSequenceGenerator } from '../generators/SequenceGenerator';\n\nexport function registerDefaultSocketGenerators(system: System): () => void {\n const store = system.socketGeneratorStore.getState();\n\n const switchOnString = getSwitchOnStringGenerator();\n store.registerGenerator(switchOnString);\n\n const switchOnInteger = getSwitchOnIntegerGenerator();\n store.registerGenerator(switchOnInteger);\n\n const customEventOnTriggered = getCustomEventOnTriggeredGenerator();\n store.registerGenerator(customEventOnTriggered);\n\n const sequence = getSequenceGenerator();\n store.registerGenerator(sequence);\n\n return () => {\n system.socketGeneratorStore\n .getState()\n .unregisterGenerator(switchOnString.name);\n system.socketGeneratorStore\n .getState()\n .unregisterGenerator(switchOnInteger.name);\n system.socketGeneratorStore\n .getState()\n .unregisterGenerator(customEventOnTriggered.name);\n system.socketGeneratorStore.getState().unregisterGenerator(sequence.name);\n };\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/FloatingToolbar/index.module_built.css\";\nconst classes = {\"toolbar\":\"YfUpeW_toolbar\",\"buttonGroup\":\"YfUpeW_buttonGroup\",\"panel\":\"YfUpeW_panel\",\"contextMenu\":\"YfUpeW_contextMenu\",\"zoomLevel\":\"YfUpeW_zoomLevel\"}\nexport default classes\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _contextMenu0 = classes[\"contextMenu\"]\nexport { _contextMenu0 as \"contextMenu\" }\n\nconst _zoomLevel0 = classes[\"zoomLevel\"]\nexport { _zoomLevel0 as \"zoomLevel\" }\n","import React, { useCallback, useState, useRef } from 'react';\nimport { Panel, useViewport } from 'reactflow';\nimport {\n VscodeButton,\n VscodeContextMenu\n} from '@vscode-elements/react-elements';\nimport { ZoomIn, ZoomOut, AlignLeft, LayoutRight } from 'iconoir-react';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\nimport styles from './index.module.css';\nimport { useRefFromStore } from '@/system';\nimport type { ToolbarButton } from '@/store/toolbar';\nimport type { AlignmentAxis, AlignmentType } from '@/plugin/alignment';\n\nexport const FloatingToolbar: React.FC = () => {\n const system = useSystem();\n const visible = useStore(system.toolbarStore, (x) => x.visible);\n const customGroups = useStore(system.toolbarStore, (x) => x.groups);\n const reactFlowInstance = useRefFromStore(system.refStore, 'reactflow');\n const { zoom } = useViewport();\n const currentZoom = Math.round(zoom * 100);\n const [alignMenuOpen, setAlignMenuOpen] = useState(false);\n const [distributeMenuOpen, setDistributeMenuOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 });\n const alignBtnRef = useRef<any>(null);\n const distributeBtnRef = useRef<any>(null);\n\n const publishAlignment = useCallback(\n (type: AlignmentType, axis: AlignmentAxis) => {\n system.pubsub.publishSync('alignment:align', { type, axis });\n },\n [system]\n );\n\n const publishDistribution = useCallback(\n (type: AlignmentType, axis: AlignmentAxis) => {\n system.pubsub.publishSync('alignment:distribute', { type, axis });\n },\n [system]\n );\n\n const handleZoomIn = useCallback(() => {\n reactFlowInstance?.zoomIn();\n }, [reactFlowInstance]);\n\n const handleZoomOut = useCallback(() => {\n reactFlowInstance?.zoomOut();\n }, [reactFlowInstance]);\n\n const handleAlignSelect = useCallback(\n (e: any) => {\n setAlignMenuOpen(false);\n const value = e.detail?.value;\n switch (value) {\n case 'left':\n publishAlignment('start', 'x');\n break;\n case 'center-h':\n publishAlignment('center', 'x');\n break;\n case 'right':\n publishAlignment('end', 'x');\n break;\n case 'top':\n publishAlignment('start', 'y');\n break;\n case 'center-v':\n publishAlignment('center', 'y');\n break;\n case 'bottom':\n publishAlignment('end', 'y');\n break;\n }\n },\n [publishAlignment]\n );\n\n const handleDistributeSelect = useCallback(\n (e: any) => {\n setDistributeMenuOpen(false);\n const value = e.detail?.value;\n switch (value) {\n case 'left':\n publishDistribution('start', 'x');\n break;\n case 'center-h':\n publishDistribution('center', 'x');\n break;\n case 'right':\n publishDistribution('end', 'x');\n break;\n case 'top':\n publishDistribution('start', 'y');\n break;\n case 'center-v':\n publishDistribution('center', 'y');\n break;\n case 'bottom':\n publishDistribution('end', 'y');\n break;\n }\n },\n [publishDistribution]\n );\n\n if (!visible) return null;\n\n return (\n <>\n <Panel position=\"top-center\" className={styles.panel}>\n <div className={styles.toolbar}>\n {/* Zoom Controls */}\n <div className={styles.buttonGroup}>\n <VscodeButton\n secondary\n iconOnly\n title=\"Zoom In\"\n onClick={handleZoomIn}\n >\n <ZoomIn />\n </VscodeButton>\n <span className={styles.zoomLevel}>{currentZoom}%</span>\n <VscodeButton\n secondary\n iconOnly\n title=\"Zoom Out\"\n onClick={handleZoomOut}\n >\n <ZoomOut />\n </VscodeButton>\n </div>\n\n {/* Align Button */}\n <div className={styles.buttonGroup}>\n <VscodeButton\n ref={alignBtnRef}\n secondary\n iconOnly\n title=\"Align\"\n onClick={() => {\n const rect = alignBtnRef.current?.getBoundingClientRect();\n if (rect) {\n setMenuPosition({ top: rect.bottom, left: rect.left });\n setAlignMenuOpen(!alignMenuOpen);\n }\n }}\n >\n <AlignLeft />\n </VscodeButton>\n </div>\n\n {/* Distribute Button */}\n <div className={styles.buttonGroup}>\n <VscodeButton\n ref={distributeBtnRef}\n secondary\n iconOnly\n title=\"Distribute\"\n onClick={() => {\n const rect = distributeBtnRef.current?.getBoundingClientRect();\n if (rect) {\n setMenuPosition({ top: rect.bottom, left: rect.left });\n setDistributeMenuOpen(!distributeMenuOpen);\n }\n }}\n >\n <LayoutRight />\n </VscodeButton>\n </div>\n\n {/* Custom Groups */}\n {customGroups.map((group) => (\n <div key={group.id} className={styles.buttonGroup}>\n {(Array.isArray(group.buttons) ? group.buttons : []).map(\n (button: ToolbarButton | React.ReactNode, index: number) => {\n // Support custom ReactNode buttons\n if (React.isValidElement(button)) {\n return (\n <React.Fragment key={index}>{button}</React.Fragment>\n );\n }\n\n // Standard button definition\n const typedButton = button as ToolbarButton;\n const isDisabled =\n typeof typedButton.disabled === 'function'\n ? typedButton.disabled()\n : typedButton.disabled;\n\n return (\n <VscodeButton\n key={typedButton.id}\n secondary\n iconOnly\n title={typedButton.label}\n onClick={typedButton.onClick}\n disabled={isDisabled}\n >\n {typedButton.icon}\n </VscodeButton>\n );\n }\n )}\n </div>\n ))}\n </div>\n </Panel>\n\n {/* Align Context Menu */}\n {alignMenuOpen && (\n <VscodeContextMenu\n show\n onVscContextMenuSelect={handleAlignSelect}\n style={{\n position: 'fixed',\n top: `${menuPosition.top}px`,\n left: `${menuPosition.left}px`,\n zIndex: 2000\n }}\n data={[\n { label: 'Align Left', value: 'left' },\n { label: 'Align Center Horizontal', value: 'center-h' },\n { label: 'Align Right', value: 'right' },\n { separator: true },\n { label: 'Align Top', value: 'top' },\n { label: 'Align Center Vertical', value: 'center-v' },\n { label: 'Align Bottom', value: 'bottom' }\n ]}\n />\n )}\n\n {/* Distribute Context Menu */}\n {distributeMenuOpen && (\n <VscodeContextMenu\n show\n onVscContextMenuSelect={handleDistributeSelect}\n style={{\n position: 'fixed',\n top: `${menuPosition.top}px`,\n left: `${menuPosition.left}px`,\n zIndex: 2000\n }}\n data={[\n { label: 'Distribute Horizontal Left', value: 'left' },\n { label: 'Distribute Horizontal Center', value: 'center-h' },\n { label: 'Distribute Horizontal Right', value: 'right' },\n { separator: true },\n { label: 'Distribute Vertical Top', value: 'top' },\n { label: 'Distribute Vertical Center', value: 'center-v' },\n { label: 'Distribute Vertical Bottom', value: 'bottom' }\n ]}\n />\n )}\n </>\n );\n};\n","import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState\n} from 'react';\nimport {\n Background,\n BackgroundVariant,\n type Edge as ReactFlowEdge,\n MiniMap,\n ReactFlow,\n type Node as ReactFlowNode,\n type ReactFlowInstance\n} from 'reactflow';\n\nimport { useBehaveGraphFlow } from '../hooks/useBehaveGraphFlow.js';\nimport { useFlowHandlers } from '../hooks/useFlowHandlers.js';\nimport { useWasdPan } from '../hooks/useWasdPan.js';\nimport { useSystem } from '@/system/provider.js';\nimport { useStore } from 'zustand';\nimport {\n NodeContextMenu,\n type INodeContextMenuProps\n} from './contextMenus/node.js';\nimport {\n EdgeContextMenu,\n type IEdgeContextMenuProps\n} from './contextMenus/edge.js';\nimport {\n SelectionContextMenu,\n type ISelectionContextMenuProps\n} from './contextMenus/selection.js';\nimport { registerDefaultSocketGenerators } from '@/generators/registerDefaultGenerators';\nimport { FloatingToolbar } from './FloatingToolbar';\nimport { layerId } from '@/annotations';\n\nconst REACTFLOW_NODE = 'react-flow__node';\n\nconst getAnnotatedLayerId = (node: ReactFlowNode): string | undefined => {\n if (!node.data || typeof node.data !== 'object') return undefined;\n const record = node.data as { annotations?: Record<string, unknown> };\n const value = record.annotations?.[layerId];\n return typeof value === 'string' ? value : undefined;\n};\n\nconst isNodeVisibleInLayers = (\n node: ReactFlowNode,\n params: {\n layers: Record<string, { visible: boolean }>;\n nodeLayers: Record<string, string>;\n defaultLayerId: string;\n }\n): boolean => {\n const mappedLayerId =\n params.nodeLayers[node.id] ??\n getAnnotatedLayerId(node) ??\n params.defaultLayerId;\n const layer =\n params.layers[mappedLayerId] ?? params.layers[params.defaultLayerId];\n return layer?.visible !== false;\n};\n\nexport const Flow: React.FC = () => {\n const system = useSystem();\n const getGraphJson = useStore(system.flowStore, (x) => x.getGraph);\n const specJson = useStore(system.specStore, (x) => x.specs);\n const showGrid = useStore(system.systemSettings, (x) => x.showGrid);\n const showMinimap = useStore(system.systemSettings, (x) => x.showMinimap);\n const snapToGrid = useStore(system.systemSettings, (x) => x.snapGrid);\n const gridSize = useStore(system.systemSettings, (x) => x.gridSize);\n const edgeTypes = useStore(system.flowStore, (x) => x.edgeTypes);\n const nodeTypes = useStore(system.flowStore, (x) => x.nodeTypes);\n const layers = useStore(system.layerStore, (x) => x.layers);\n const nodeLayers = useStore(system.layerStore, (x) => x.nodeLayers);\n const defaultLayerId = useStore(system.layerStore, (x) => x.defaultLayerId);\n\n const ref = useRef<HTMLDivElement>(null);\n const setRef = useStore(system.refStore, (x) => x.setRef);\n\n const getReactFlowInstance = useCallback(\n () => system.refStore.getState().getRef('reactflow'),\n [system.refStore]\n );\n\n useWasdPan({ getReactFlowInstance });\n\n // Set reactflow ref\n const setReactflowRef = React.useCallback(\n (reactFlowInstance: ReactFlowInstance) => {\n if (reactFlowInstance) {\n setRef('reactflow', reactFlowInstance);\n }\n },\n [setRef]\n );\n\n const graph = useMemo(() => getGraphJson(), []);\n\n useEffect(() => {\n const cleanupGenerators = registerDefaultSocketGenerators(system);\n\n return () => {\n cleanupGenerators();\n };\n }, [system]);\n\n const { nodes, edges, onNodesChange, onEdgesChange } = useBehaveGraphFlow({\n initialGraphJson: graph,\n specJson\n });\n\n const {\n onConnect,\n handleStartConnect,\n handleStopConnect,\n handlePaneClick,\n handlePaneContextMenu\n } = useFlowHandlers({\n nodes,\n onEdgesChange,\n onNodesChange,\n specJSON: specJson\n });\n\n const [menu, setMenu] = useState<INodeContextMenuProps | null>(null);\n const [edgeMenu, setEdgeMenu] = useState<IEdgeContextMenuProps | null>(null);\n const [selectionMenu, setSelectionMenu] =\n useState<ISelectionContextMenuProps | null>(null);\n const onNodeContextMenu = useCallback(\n (event: React.MouseEvent<Element, MouseEvent>) => {\n // Prevent native context menu from showing\n event.preventDefault();\n setEdgeMenu(null);\n setSelectionMenu(null);\n const offset = ref.current?.getBoundingClientRect();\n //Keep ascending till we find the .react-flow__node\n let target = event.target as HTMLElement | null;\n let nodeID = null;\n while (target && !target.classList.contains(REACTFLOW_NODE)) {\n target = target.parentElement;\n }\n if (target) {\n nodeID = target.getAttribute('data-id');\n }\n setMenu({\n //We should be safe here as reactflow only triggers this on nodes\n nodeID: nodeID!,\n top: event.clientY - (offset?.top ?? 0),\n left: event.clientX - (offset?.left ?? 0)\n });\n },\n [setMenu, setEdgeMenu]\n );\n\n const onEdgeContextMenu = useCallback(\n (event: React.MouseEvent, edge: any) => {\n event.preventDefault();\n event.stopPropagation();\n setMenu(null);\n setSelectionMenu(null);\n const offset = ref.current?.getBoundingClientRect();\n setEdgeMenu({\n edgeID: edge.id,\n sourceID: edge.source,\n targetID: edge.target,\n top: event.clientY - (offset?.top ?? 0),\n left: event.clientX - (offset?.left ?? 0)\n });\n },\n [setEdgeMenu, setMenu]\n );\n\n const onSelectionContextMenu = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setMenu(null);\n setEdgeMenu(null);\n const offset = ref.current?.getBoundingClientRect();\n setSelectionMenu({\n top: event.clientY - (offset?.top ?? 0),\n left: event.clientX - (offset?.left ?? 0)\n });\n },\n [setMenu, setEdgeMenu, setSelectionMenu]\n );\n\n const snapGrid = useMemo(() => {\n return [gridSize, gridSize] as [number, number];\n }, [gridSize]);\n\n const onPaneClick = useCallback(() => {\n setMenu(null);\n setEdgeMenu(null);\n setSelectionMenu(null);\n handlePaneClick();\n }, [setMenu, setEdgeMenu, setSelectionMenu, handlePaneClick]);\n\n const renderedNodes = useMemo(() => {\n return nodes.map((node) => {\n const mappedLayerId =\n nodeLayers[node.id] ?? getAnnotatedLayerId(node) ?? defaultLayerId;\n const layer = layers[mappedLayerId] ?? layers[defaultLayerId];\n if (!layer) return node;\n\n return {\n ...node,\n hidden: !layer.visible,\n style: {\n ...(node.style ?? {}),\n opacity: layer.opacity\n }\n };\n });\n }, [defaultLayerId, layers, nodeLayers, nodes]);\n\n const renderedEdges = useMemo(() => {\n const nodesById = new Map<string, ReactFlowNode>();\n nodes.forEach((node) => {\n nodesById.set(node.id, node);\n });\n\n return edges.map((edge: ReactFlowEdge) => {\n const sourceNode = nodesById.get(edge.source);\n const targetNode = nodesById.get(edge.target);\n\n // If either endpoint is missing just leave the edge as-is\n if (!sourceNode || !targetNode) return edge;\n\n const sourceVisible = isNodeVisibleInLayers(sourceNode, {\n layers,\n nodeLayers,\n defaultLayerId\n });\n const targetVisible = isNodeVisibleInLayers(targetNode, {\n layers,\n nodeLayers,\n defaultLayerId\n });\n\n const shouldHide = !sourceVisible || !targetVisible;\n\n // Return as hidden when an endpoint node is in a hidden layer.\n // Using `hidden` rather than filtering so ReactFlow still tracks the\n // connection and handles continue to render as connected.\n if (shouldHide === edge.hidden) return edge;\n return { ...edge, hidden: shouldHide };\n });\n }, [defaultLayerId, edges, layers, nodeLayers, nodes]);\n\n return (\n <>\n <ReactFlow\n style={{ flex: 1 }}\n ref={ref}\n onInit={setReactflowRef}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n elevateEdgesOnSelect={true}\n nodes={renderedNodes}\n edges={renderedEdges}\n onSelectionContextMenu={onSelectionContextMenu}\n onNodeContextMenu={onNodeContextMenu}\n // @ts-ignore\n onEdgeContextMenu={onEdgeContextMenu}\n maxZoom={Infinity}\n minZoom={-Infinity}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n // @ts-ignore\n onConnectStart={handleStartConnect}\n // @ts-ignore\n onConnectEnd={handleStopConnect}\n snapToGrid={snapToGrid}\n snapGrid={snapGrid}\n fitView\n //TODO. Reconsier this prop for performance\n onlyRenderVisibleElements={true}\n onPaneClick={onPaneClick}\n onPaneContextMenu={handlePaneContextMenu}\n proOptions={{ hideAttribution: true }}\n >\n {showGrid && (\n <Background\n variant={BackgroundVariant.Lines}\n gap={90}\n color=\"#373737\"\n style={{ backgroundColor: 'var(--colors-bgCanvas)' }}\n />\n )}\n {showMinimap && <MiniMap />}\n {menu && <NodeContextMenu {...menu} />}\n {edgeMenu && <EdgeContextMenu {...edgeMenu} />}\n {selectionMenu && <SelectionContextMenu {...selectionMenu} />}\n <FloatingToolbar />\n </ReactFlow>\n </>\n );\n};\n","/* eslint-disable no-promise-executor-return */\nexport function sleep(durationInSeconds: number) {\n return new Promise((resolve) =>\n setTimeout(resolve, Math.round(durationInSeconds * 1000))\n );\n}\n","/**\n * Use this on a subscription to the graph:save event to trigger a download of the graph JSON data. This is useful for users who want to keep a local backup of their graphs, or for debugging purposes.\n * @param filename\n * @param data\n */\nexport function downloadJson(filename: string, data: unknown) {\n const blob = new Blob([JSON.stringify(data, null, 2)], {\n type: 'application/json'\n });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n","import {\n writeNodeSpecsToJSON,\n type IRegistry\n} from '@kiberon-labs/behave-graph';\nimport type { INodeRegistry } from '../types/NodeMetadata.js';\n\n/**\n * Extract pure node metadata from a behave-graph registry.\n * Used by the visual graph editor to initialize a System without execution dependencies.\n */\nexport function extractNodeMetadata(registry: IRegistry): INodeRegistry {\n return {\n values: registry.values,\n specs: writeNodeSpecsToJSON(registry)\n };\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/layoutController/index.module_built.css\";\nconst classes = {\"panelExtra\":\"H8EqXq_panelExtra\",\"root\":\"H8EqXq_root\"}\nexport default classes\n\nconst _panelExtra0 = classes[\"panelExtra\"]\nexport { _panelExtra0 as \"panelExtra\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n","import React, { useEffect } from 'react';\nimport toast, { Toaster } from 'react-hot-toast';\nimport { useSystem } from '@/system/provider';\n\n/**\n * NotificationProvider listens to pubsub notification events and displays toasts\n */\nexport const NotificationProvider: React.FC = () => {\n const system = useSystem();\n\n useEffect(() => {\n // Subscribe to notification events\n const token = system.pubsub.subscribe('notification', (_, data) => {\n const { type, message, options } = data;\n\n switch (type) {\n case 'success':\n toast.success(message, options);\n break;\n case 'error':\n toast.error(message, options);\n break;\n case 'loading':\n toast.loading(message, options);\n break;\n case 'info':\n default:\n toast(message, options);\n break;\n }\n });\n\n // Subscribe to notification dismiss events\n const dismissToken = system.pubsub.subscribe(\n 'notification:dismiss',\n (_, data) => {\n if (data.toastId) {\n toast.dismiss(data.toastId);\n } else {\n toast.dismiss();\n }\n }\n );\n\n // Cleanup subscriptions on unmount\n return () => {\n if (token) {\n system.pubsub.unsubscribe(token);\n }\n if (dismissToken) {\n system.pubsub.unsubscribe(dismissToken);\n }\n };\n }, [system.pubsub]);\n\n return (\n <Toaster\n position=\"bottom-right\"\n toastOptions={{\n duration: 4000,\n style: {\n background: 'var(--colors-bgSecondary, #2a2a2a)',\n color: 'var(--colors-text, #ffffff)',\n border: '1px solid var(--colors-border, #404040)'\n },\n success: {\n iconTheme: {\n primary: 'var(--colors-success, #22c55e)',\n secondary: 'var(--colors-bgSecondary, #2a2a2a)'\n }\n },\n error: {\n iconTheme: {\n primary: 'var(--colors-error, #ef4444)',\n secondary: 'var(--colors-bgSecondary, #2a2a2a)'\n }\n }\n }}\n />\n );\n};\n","import type { LayoutBase, TabBase, TabData, TabGroup } from 'rc-dock';\nimport { DockLayout } from 'rc-dock';\nimport React, { useCallback } from 'react';\nimport { VscodeButton } from '@vscode-elements/react-elements';\nimport { Reduce, Maximize, Xmark } from 'iconoir-react';\nimport { useSystem } from '@/system/provider.js';\nimport { MenuBar } from '../menubar';\nimport { useStore } from 'zustand';\nimport { findGraphPanel } from './utils';\n\nimport styles from './index.module.css';\nimport { NotificationProvider } from '../notifications';\n\nconst groups: Record<string, TabGroup> = {\n default: {\n animated: false,\n floatable: true\n },\n headless: {\n floatable: true,\n maximizable: true,\n disableDock: true,\n panelExtra: () => <></>\n },\n popout: {\n animated: false,\n floatable: true,\n\n panelExtra: (panelData, context) => {\n const buttons: React.ReactElement[] = [];\n buttons.push(\n <VscodeButton\n secondary\n iconOnly\n key=\"close\"\n title=\"Close\"\n onClick={() => context.dockMove(panelData, null, 'remove')}\n >\n <Xmark />\n </VscodeButton>\n );\n return <div className={styles.panelExtra}>{buttons}</div>;\n }\n },\n /**\n * Note that the graph has a huge issue when ran in a popout window, as such we disable it for now\n */\n graph: {\n animated: false,\n floatable: true,\n panelExtra: (panelData, context) => {\n const buttons: React.ReactElement[] = [];\n if (panelData?.parent?.mode !== 'window') {\n const maxxed = panelData?.parent?.mode === 'maximize';\n buttons.push(\n <VscodeButton\n key=\"maximize\"\n secondary\n title={\n panelData?.parent?.mode === 'maximize' ? 'Restore' : 'Maximize'\n }\n iconOnly\n onClick={() => context.dockMove(panelData, null, 'maximize')}\n >\n {maxxed ? <Reduce /> : <Maximize />}\n </VscodeButton>\n );\n }\n\n return <div className={styles.panelExtra}>{buttons}</div>;\n }\n }\n};\n\nexport const LayoutController = (props: {}) => {\n const system = useSystem();\n const showMenu = useStore(system.systemSettings, (x) => x.showMenu);\n const setCurrentPanel = useStore(system.tabStore, (s) => s.setCurrentPanel);\n const setLayout = useStore(system.tabStore, (s) => s.setLayout);\n const layout = useStore(system.tabStore, (s) => s.layout);\n\n const loadTab = useCallback(\n (tab: TabBase): TabData => {\n const loaded = system.tabLoader.load(tab);\n if (!loaded) {\n return tab as TabData;\n }\n return loaded;\n },\n [system, props]\n );\n\n const onLayoutChange = (newLayout: LayoutBase) => {\n //We need to find the graph tab container in the newlayout\n const graphContainer = findGraphPanel(newLayout);\n\n if (graphContainer?.activeId) {\n //Get the active Id to find the currently selected graph\n setCurrentPanel(graphContainer.activeId!);\n }\n setLayout(newLayout);\n };\n\n return (\n <div className={styles.root}>\n {showMenu && <MenuBar />}\n <DockLayout\n layout={layout}\n groups={groups}\n loadTab={loadTab}\n style={{ flex: 1, height: '100%', width: '100%' }}\n onLayoutChange={onLayoutChange}\n />\n <NotificationProvider />\n </div>\n );\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/plugin/docs/panel/styles.module_built.css\";\nconst classes = {\"section\":\"hf8PDW_section\",\"socketName\":\"hf8PDW_socketName\",\"container\":\"hf8PDW_container\",\"emptySub\":\"hf8PDW_emptySub\",\"tags\":\"hf8PDW_tags\",\"nodeType\":\"hf8PDW_nodeType\",\"socketList\":\"hf8PDW_socketList\",\"socketItem\":\"hf8PDW_socketItem\",\"emptyIcon\":\"hf8PDW_emptyIcon\",\"title\":\"hf8PDW_title\",\"header\":\"hf8PDW_header\",\"tag\":\"hf8PDW_tag\",\"noContent\":\"hf8PDW_noContent\",\"empty\":\"hf8PDW_empty\",\"sectionTitle\":\"hf8PDW_sectionTitle\",\"description\":\"hf8PDW_description\",\"iconLarge\":\"hf8PDW_iconLarge\",\"socketIcon\":\"hf8PDW_socketIcon\",\"socketType\":\"hf8PDW_socketType\",\"emptyText\":\"hf8PDW_emptyText\",\"content\":\"hf8PDW_content\",\"titleSection\":\"hf8PDW_titleSection\"}\nexport default classes\n\nconst _section0 = classes[\"section\"]\nexport { _section0 as \"section\" }\n\nconst _socketName0 = classes[\"socketName\"]\nexport { _socketName0 as \"socketName\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _emptySub0 = classes[\"emptySub\"]\nexport { _emptySub0 as \"emptySub\" }\n\nconst _tags0 = classes[\"tags\"]\nexport { _tags0 as \"tags\" }\n\nconst _nodeType0 = classes[\"nodeType\"]\nexport { _nodeType0 as \"nodeType\" }\n\nconst _socketList0 = classes[\"socketList\"]\nexport { _socketList0 as \"socketList\" }\n\nconst _socketItem0 = classes[\"socketItem\"]\nexport { _socketItem0 as \"socketItem\" }\n\nconst _emptyIcon0 = classes[\"emptyIcon\"]\nexport { _emptyIcon0 as \"emptyIcon\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _tag0 = classes[\"tag\"]\nexport { _tag0 as \"tag\" }\n\nconst _noContent0 = classes[\"noContent\"]\nexport { _noContent0 as \"noContent\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _description0 = classes[\"description\"]\nexport { _description0 as \"description\" }\n\nconst _iconLarge0 = classes[\"iconLarge\"]\nexport { _iconLarge0 as \"iconLarge\" }\n\nconst _socketIcon0 = classes[\"socketIcon\"]\nexport { _socketIcon0 as \"socketIcon\" }\n\nconst _socketType0 = classes[\"socketType\"]\nexport { _socketType0 as \"socketType\" }\n\nconst _emptyText0 = classes[\"emptyText\"]\nexport { _emptyText0 as \"emptyText\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _titleSection0 = classes[\"titleSection\"]\nexport { _titleSection0 as \"titleSection\" }\n","import { useMemo, useCallback } from 'react';\nimport { useEditor, EditorContent } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport { useSystem } from '@/system/provider';\nimport { Markdown } from 'tiptap-markdown';\nimport { useStore } from 'zustand';\nimport type { ExtendedNodeSpecJSON } from '@/components/contextMenus/NodePicker';\nimport { useOnPressKey } from '@/hooks/useOnPressKey';\nimport { removeTabFromLayout } from '@/components/layoutController/utils';\nimport styles from './styles.module.css';\n\nexport function DocumentationBrowserPanel() {\n const sys = useSystem();\n const selectedNodeType = useStore(\n sys.refStore,\n (x) => x.refs.selectedDocumentationType\n );\n const documentation = useStore(sys.documentationStore, (x) => x.docs);\n const specs = useStore(sys.specStore, (x) => x.specs);\n const icons = useStore(sys.legendStore, (x) => x.icons);\n const defaultIcon = useStore(sys.legendStore, (x) => x.defaultIcon);\n const valueTypeColors = useStore(sys.legendStore, (x) => x.valueTypeColors);\n\n const nodeSpec = useMemo((): ExtendedNodeSpecJSON | null => {\n if (!selectedNodeType) return null;\n return specs.find((s) => s.type === selectedNodeType) ?? null;\n }, [selectedNodeType, specs]);\n\n const getIconForType = useCallback(\n (valueType: string) => {\n const IconComponent = icons[valueType] || defaultIcon;\n return IconComponent;\n },\n [icons, defaultIcon]\n );\n\n const getColorForType = useCallback(\n (valueType: string) => {\n return valueTypeColors[valueType] || '#6c727e';\n },\n [valueTypeColors]\n );\n\n const nodeDoc = useMemo(() => {\n if (!selectedNodeType) return null;\n return documentation.get(selectedNodeType);\n }, [selectedNodeType, documentation]);\n\n const editor = useEditor(\n {\n extensions: [StarterKit, Markdown],\n content: nodeDoc?.markdownDescription || '',\n editable: false\n },\n [nodeDoc?.markdownDescription]\n );\n\n const closePanel = useCallback(() => {\n const currentLayout = sys.tabStore.getState().layout;\n const newLayout = removeTabFromLayout(currentLayout, 'docbrowser');\n sys.tabStore.getState().setLayout(newLayout);\n }, [sys]);\n\n useOnPressKey('Escape', closePanel);\n\n if (!selectedNodeType) {\n return (\n <div className={styles.container}>\n <div className={styles.empty}>\n <div className={styles.emptyIcon}>📚</div>\n <div className={styles.emptyText}>No documentation selected</div>\n <div className={styles.emptySub}>\n Click the info icon on a node to view its documentation\n </div>\n </div>\n </div>\n );\n }\n\n const hasMarkdown = nodeDoc?.markdownDescription;\n const hasShortDescription =\n nodeDoc?.shortDescription || nodeSpec?.description;\n const hasTags = nodeDoc?.tags && nodeDoc.tags.length > 0;\n\n return (\n <div className={styles.container}>\n <div className={styles.header}>\n <div className={styles.titleSection}>\n {nodeDoc?.icon && (\n <div className={styles.iconLarge}>{nodeDoc.icon}</div>\n )}\n <div>\n <h2 className={styles.title}>\n {nodeSpec?.label || selectedNodeType}\n </h2>\n <div className={styles.nodeType}>{selectedNodeType}</div>\n </div>\n </div>\n {hasTags && nodeDoc?.tags && (\n <div className={styles.tags}>\n {nodeDoc.tags.map((tag, index) => (\n <span key={index} className={styles.tag}>\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n\n <div className={styles.content}>\n {hasShortDescription && (\n <div className={styles.description}>\n {nodeDoc?.shortDescription || nodeSpec?.description}\n </div>\n )}\n\n {hasMarkdown && nodeDoc?.markdownDescription ? (\n <EditorContent editor={editor} />\n ) : (\n <div className={styles.noContent}>\n <p>No detailed documentation available for this node.</p>\n </div>\n )}\n\n {nodeSpec && (\n <>\n {nodeSpec.inputs && nodeSpec.inputs.length > 0 && (\n <div className={styles.section}>\n <h3 className={styles.sectionTitle}>Inputs</h3>\n <div className={styles.socketList}>\n {nodeSpec.inputs.map((input, index) => {\n const IconComponent = getIconForType(input.valueType);\n const color = getColorForType(input.valueType);\n return (\n <div key={index} className={styles.socketItem}>\n <div className={styles.socketIcon} style={{ color }}>\n <IconComponent />\n </div>\n <div className={styles.socketName}>{input.name}</div>\n <div className={styles.socketType} style={{ color }}>\n {input.valueType}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {nodeSpec.outputs && nodeSpec.outputs.length > 0 && (\n <div className={styles.section}>\n <h3 className={styles.sectionTitle}>Outputs</h3>\n <div className={styles.socketList}>\n {nodeSpec.outputs.map((output, index) => {\n const IconComponent = getIconForType(output.valueType);\n const color = getColorForType(output.valueType);\n return (\n <div key={index} className={styles.socketItem}>\n <div className={styles.socketIcon} style={{ color }}>\n <IconComponent />\n </div>\n <div className={styles.socketName}>{output.name}</div>\n <div className={styles.socketType} style={{ color }}>\n {output.valueType}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {nodeSpec.configuration && nodeSpec.configuration.length > 0 && (\n <div className={styles.section}>\n <h3 className={styles.sectionTitle}>Configuration</h3>\n <div className={styles.socketList}>\n {nodeSpec.configuration.map((config, index) => {\n const IconComponent = getIconForType(config.valueType);\n const color = getColorForType(config.valueType);\n return (\n <div key={index} className={styles.socketItem}>\n <div className={styles.socketIcon} style={{ color }}>\n <IconComponent />\n </div>\n <div className={styles.socketName}>{config.name}</div>\n <div className={styles.socketType} style={{ color }}>\n {config.valueType}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n","import { type System } from '@/system/system';\nimport type { NodeDocumentation } from '@/store/documentation';\nimport { BounceRight, Flash, PauseWindow } from 'iconoir-react';\nimport { DocumentationBrowserPanel } from './panel';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport { MenuItemElement } from '../../components/menubar/menuItem';\nimport { plugin } from '@/system/plugin';\n\n/**\n * This is a plugin that sets up default documentation for core behave-graph nodes.\n * It uses the documentation store to add rich markdown descriptions,\n * short descriptions, and tags for various node types.\n * @param sys\n */\nexport const docsPluginLoader = (sys: System, _options: void) => {\n const docStore = sys.documentationStore.getState();\n\n sys.tabLoader.register('docbrowser', () => {\n return {\n id: 'docbrowser',\n closable: true,\n cached: true,\n title: 'Documentation',\n group: 'headless',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <DocumentationBrowserPanel />\n </ErrorBoundary>\n )\n };\n });\n\n // Flow control nodes\n const flowDocs: NodeDocumentation[] = [\n {\n type: 'flow/debounce',\n shortDescription: 'Debounce rapid flow executions',\n tags: ['flow', 'control', 'async'],\n markdownDescription: `\nPrevents a flow from executing too frequently by enforcing a minimum delay between executions.\n`,\n icon: <BounceRight />\n },\n\n {\n type: 'customEvent/trigger',\n shortDescription: 'Trigger a custom event by name',\n tags: ['event', 'custom', 'trigger'],\n markdownDescription: `\nTriggers a custom event by name, allowing other parts of the graph to respond to it.\n\nYou will need to pass through the required parameters of the event when triggering it.\n `.trim(),\n icon: <Flash />\n },\n\n {\n type: 'time/delay',\n shortDescription: 'Delay execution for a specified duration',\n tags: ['time', 'async', 'delay', 'control'],\n markdownDescription: `\nPauses execution for a specified number of seconds before continuing.\n\nUseful for creating timed behaviors, animations, or cooldown mechanics.\n `.trim(),\n icon: <PauseWindow />\n },\n\n {\n type: 'debug/expectTrue',\n shortDescription: 'Asserts that a condition is true during execution',\n tags: ['debug', 'assertion', 'testing'],\n markdownDescription: `\n## Purpose\nThe Assert Expect True node is a debugging and validation tool used during graph execution to verify runtime conditions. It validates that a boolean condition evaluates to true at a specific point in the execution flow.\n\n## Use Cases\nTesting & Debugging: Validate that graph logic produces expected intermediate results\nRuntime Invariants: Enforce constraints that must always hold true during execution\nQuality Assurance: Catch logic errors early in development by asserting expected states\nDocumentation: The description field serves as inline documentation of assumptions\n\n`.trim()\n },\n\n {\n icon: (\n <img src=\"https://imgs.search.brave.com/I24-hRYZL3tBnj1vmcr525tMOtlP-GFWPoS1qr7tMdo/rs:fit:860:0:0:0/g:ce/aHR0cHM6Ly9pbWcu/aWNvbnM4LmNvbS9l/eHRlcm5hbC1mbGF0/aWNvbnMtbGluZWFs/LWNvbG9yLWZsYXQt/aWNvbnMvMTIwMC9l/eHRlcm5hbC1kZWJ1/Zy1tb2JpbGUtYXBw/LWRldmVsb3BtZW50/LWZsYXRpY29ucy1s/aW5lYWwtY29sb3It/ZmxhdC1pY29ucy5q/cGc\" />\n ),\n type: 'flow/branch',\n shortDescription: 'Execute different flows based on a boolean condition',\n tags: ['flow', 'conditional', 'control'],\n markdownDescription: `\nConditionally executes one of two flow paths based on a boolean input.\n\n## Common Use Cases\n- Implementing if/else logic\n- State-based behavior\n- Conditional event handling\n `.trim()\n },\n {\n type: 'flow/sequence',\n shortDescription: 'Execute multiple flows in order',\n tags: ['flow', 'control', 'sequential'],\n markdownDescription: `\n# Sequence\n\nExecutes multiple flow outputs in order, one after another.\n\nPerfect for chaining multiple actions that need to happen sequentially.\n `.trim()\n },\n {\n type: 'flow/delay',\n shortDescription: 'Delay execution for a specified duration',\n tags: ['flow', 'time', 'async'],\n markdownDescription: `\n# Delay\n\nPauses execution for a specified number of seconds before continuing.\n\nUseful for creating timed behaviors, animations, or cooldown mechanics.\n `.trim()\n }\n ];\n\n // Math nodes\n const mathDocs: NodeDocumentation[] = [\n {\n type: 'math/add',\n shortDescription: 'Add two numbers',\n tags: ['math', 'arithmetic', 'basic'],\n markdownDescription: 'Calculates the sum of two numeric values: a + b'\n },\n {\n type: 'math/subtract',\n shortDescription: 'Subtract two numbers',\n tags: ['math', 'arithmetic', 'basic'],\n markdownDescription: 'Calculates the difference: a - b'\n },\n {\n type: 'math/multiply',\n shortDescription: 'Multiply two numbers',\n tags: ['math', 'arithmetic', 'basic'],\n markdownDescription: 'Calculates the product: a * b'\n },\n {\n type: 'math/divide',\n shortDescription: 'Divide two numbers',\n tags: ['math', 'arithmetic', 'basic'],\n markdownDescription:\n 'Calculates the quotient: a / b\\\\n\\\\n⚠️ Division by zero returns 0'\n }\n ];\n\n // Logic nodes\n const logicDocs: NodeDocumentation[] = [\n {\n type: 'logic/and',\n shortDescription: 'Logical AND of two boolean values',\n tags: ['logic', 'boolean', 'gates'],\n markdownDescription: 'Returns true only if both inputs are true'\n },\n {\n type: 'logic/or',\n shortDescription: 'Logical OR of two boolean values',\n tags: ['logic', 'boolean', 'gates'],\n markdownDescription: 'Returns true if at least one input is true'\n },\n {\n type: 'logic/not',\n shortDescription: 'Logical NOT - inverts a boolean value',\n tags: ['logic', 'boolean', 'gates'],\n markdownDescription:\n 'Inverts the input: true becomes false, false becomes true'\n }\n ];\n\n // Variable nodes\n const variableDocs: NodeDocumentation[] = [\n {\n type: 'variable/get',\n shortDescription: 'Read a variable value',\n tags: ['variable', 'state', 'getter'],\n markdownDescription: `\nRetrieves the current value of a named variable.\n\nVariables are shared across the entire graph and persist between executions.\n `.trim()\n },\n {\n type: 'variable/set',\n shortDescription: 'Write a variable value',\n tags: ['variable', 'state', 'setter'],\n markdownDescription: `\nSets the value of a named variable.\n\nThis executes as a flow and passes through to allow chaining.\n `.trim()\n }\n ];\n\n // Event nodes\n const eventDocs: NodeDocumentation[] = [\n {\n type: 'lifecycle/onStart',\n shortDescription: 'Triggered when the graph starts',\n tags: ['event', 'lifecycle', 'entry'],\n markdownDescription: `\nFires once when the graph begins execution.\n\nPerfect for initialization logic and setup tasks.\n `.trim()\n },\n {\n type: 'lifecycle/onEnd',\n shortDescription: 'Triggered when the graph ends',\n tags: ['event', 'lifecycle', 'cleanup'],\n markdownDescription: `\n# On End\n\nFires once when the graph stops execution.\n\nUseful for cleanup, saving state, or final actions.\n `.trim()\n },\n {\n type: 'lifecycle/onTick',\n shortDescription: 'Triggered every frame/update',\n tags: ['event', 'lifecycle', 'update', 'loop'],\n markdownDescription: `\n# On Tick\n\nFires continuously on every update cycle.\n\n⚠️ Use carefully - runs every frame! Great for animations and real-time updates.\n `.trim()\n }\n ];\n\n // Combine and set all documentation\n const allDocs = [\n ...flowDocs,\n ...mathDocs,\n ...logicDocs,\n ...variableDocs,\n ...eventDocs\n ];\n\n docStore.setMultipleDocumentation(allDocs);\n\n console.log(`✅ Loaded documentation for ${allDocs.length} nodes`);\n\n // Register the documentation panel with TabLoader\n sys.tabLoader.register('docs', () => {\n return {\n id: 'docs',\n closable: true,\n title: 'Documentation',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'Error loading Documentation panel'}>\n <DocumentationBrowserPanel />\n </ErrorBoundary>\n )\n };\n });\n\n // Add menu item to Window menu\n const menuStore = sys.menubarStore;\n const currentItems = menuStore.getState().items;\n const windowMenu = currentItems.find((menu) => menu.name === 'window');\n\n if (windowMenu) {\n // Add the Documentation menu item to the Window menu\n const newMenuItem = {\n name: 'docs',\n render: function DocsMenuItem() {\n return (\n <MenuItemElement\n onClick={() => sys.tabStore.getState().openTab('docs')}\n key=\"docs\"\n >\n Documentation\n </MenuItemElement>\n );\n }\n };\n\n menuStore\n .getState()\n .setSubMenuItems('window', [...windowMenu.items, newMenuItem]);\n }\n};\n\nexport const docsPlugin = plugin(docsPluginLoader, {\n name: 'docs'\n});\n","import { createStore } from 'zustand';\nimport type { GraphRunnerClient } from './client';\nimport type {\n AuthCredentials,\n GraphRunnerCapabilities,\n ServerVariable,\n ServerEvent,\n GraphRunnerMessage\n} from './types';\nimport type { System } from '../../system';\nimport type { NodeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { StoreApi } from 'zustand';\n\nexport interface MessageActivity {\n id: string;\n timestamp: number;\n direction: 'sent' | 'received';\n message: GraphRunnerMessage;\n}\n\nexport interface ConnectionConfig {\n url: string;\n auth: AuthCredentials;\n autoReconnect: boolean;\n}\n\nexport interface ConnectionInfo {\n serverId: string | null;\n userId: string | null;\n sessionId: string | null;\n authenticated: boolean;\n capabilities: GraphRunnerCapabilities | null;\n}\n\nexport interface GraphRunnerClientStore {\n // Connection state\n connectionState:\n | 'disconnected'\n | 'connecting'\n | 'authenticating'\n | 'connected';\n connectionConfig: ConnectionConfig;\n connectionInfo: ConnectionInfo;\n error: string | null;\n\n // Client instance\n client: GraphRunnerClient | null;\n\n // Server metadata\n serverVariables: ServerVariable[];\n serverEvents: ServerEvent[];\n nodeTypes: NodeSpecJSON[];\n\n // Message activity\n messageActivity: MessageActivity[];\n maxActivityMessages: number;\n\n // Execution state\n currentRunId: string | null;\n currentGraphId: string | null;\n isExecuting: boolean;\n isPaused: boolean;\n\n // Execution preferences\n clearLogsOnRun: boolean;\n clearTracesOnRun: boolean;\n enableTracing: boolean;\n\n // Actions\n setConnectionConfig: (config: Partial<ConnectionConfig>) => void;\n setClient: (client: GraphRunnerClient | null) => void;\n setConnectionState: (\n state: 'disconnected' | 'connecting' | 'authenticating' | 'connected'\n ) => void;\n setConnectionInfo: (info: Partial<ConnectionInfo>) => void;\n setError: (error: string | null) => void;\n setServerVariables: (variables: ServerVariable[]) => void;\n setServerEvents: (events: ServerEvent[]) => void;\n setNodeTypes: (nodeTypes: NodeSpecJSON[]) => void;\n clearServerMetadata: () => void;\n addMessageActivity: (\n direction: 'sent' | 'received',\n message: GraphRunnerMessage\n ) => void;\n clearMessageActivity: () => void;\n setCurrentRunId: (runId: string | null) => void;\n setCurrentGraphId: (graphId: string | null) => void;\n setIsExecuting: (isExecuting: boolean) => void;\n setIsPaused: (isPaused: boolean) => void;\n setClearLogsOnRun: (clear: boolean) => void;\n setClearTracesOnRun: (clear: boolean) => void;\n setEnableTracing: (enable: boolean) => void;\n}\n\nexport const graphRunnerClientStoreFactory = (\n system: System\n): StoreApi<GraphRunnerClientStore> => {\n return createStore<GraphRunnerClientStore>((set) => ({\n // Initial state\n connectionState: 'disconnected',\n connectionConfig: {\n url: '',\n auth: { type: 'none' },\n autoReconnect: true\n },\n connectionInfo: {\n serverId: null,\n userId: null,\n sessionId: null,\n authenticated: false,\n capabilities: null\n },\n error: null,\n client: null,\n serverVariables: [],\n serverEvents: [],\n nodeTypes: [],\n messageActivity: [],\n maxActivityMessages: 50,\n currentRunId: null,\n currentGraphId: null,\n isExecuting: false,\n isPaused: false,\n clearLogsOnRun: true,\n clearTracesOnRun: true,\n enableTracing: true,\n\n // Actions\n setConnectionConfig: (config) =>\n set((state) => ({\n connectionConfig: { ...state.connectionConfig, ...config }\n })),\n\n setClient: (client) => set({ client }),\n\n setConnectionState: (connectionState) => {\n set({ connectionState });\n },\n\n setConnectionInfo: (info) =>\n set((state) => ({\n connectionInfo: { ...state.connectionInfo, ...info }\n })),\n\n setError: (error) => set({ error }),\n\n setServerVariables: (serverVariables) => {\n set({ serverVariables });\n const variableStore = system.variableStore.getState();\n for (const serverVar of serverVariables) {\n variableStore.setVariable(serverVar.id, serverVar);\n }\n },\n\n setServerEvents: (serverEvents) => {\n set({ serverEvents });\n const eventStore = system.eventsStore.getState();\n for (const event of serverEvents) {\n eventStore.addCustomEvent(event);\n }\n },\n\n setNodeTypes: (nodeTypes) => {\n set({ nodeTypes });\n system.registry.getState().updateSpecs(nodeTypes);\n },\n\n clearServerMetadata: () =>\n set({\n serverVariables: [],\n serverEvents: [],\n nodeTypes: []\n }),\n\n addMessageActivity: (direction, message) =>\n set((state) => {\n const activity: MessageActivity = {\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n timestamp: Date.now(),\n direction,\n message\n };\n const newActivity = [activity, ...state.messageActivity].slice(\n 0,\n state.maxActivityMessages\n );\n return { messageActivity: newActivity };\n }),\n\n clearMessageActivity: () => set({ messageActivity: [] }),\n\n setCurrentRunId: (currentRunId) => set({ currentRunId }),\n\n setCurrentGraphId: (currentGraphId) => set({ currentGraphId }),\n\n setIsExecuting: (isExecuting) => set({ isExecuting }),\n\n setIsPaused: (isPaused) => set({ isPaused }),\n\n setClearLogsOnRun: (clearLogsOnRun) => set({ clearLogsOnRun }),\n\n setClearTracesOnRun: (clearTracesOnRun) => set({ clearTracesOnRun }),\n\n setEnableTracing: (enableTracing) => set({ enableTracing })\n }));\n};\n","/**\n * Transport abstraction for the Graph Runner client\n * Allows different transport implementations (WebSocket, HTTP, SSE, etc.)\n */\n\nimport type { GraphRunnerMessage, ServerGraphRunnerMessage } from './types';\n\nexport type TransportState =\n | 'disconnected'\n | 'connecting'\n | 'connected'\n | 'error';\n\nexport interface TransportConfig {\n url: string;\n reconnectInterval?: number;\n heartbeatInterval?: number;\n}\n\nexport interface ITransport<\n Send = ServerGraphRunnerMessage | GraphRunnerMessage,\n Receive = GraphRunnerMessage | ServerGraphRunnerMessage\n> {\n /**\n * Get current connection state\n */\n getState(): TransportState;\n\n /**\n * Connect to the server\n */\n connect(): Promise<void>;\n\n /**\n * Disconnect from the server\n */\n disconnect(): void;\n\n /**\n * Send a message to the server\n */\n send(message: Send): void;\n\n /**\n * Register a message handler\n */\n onMessage(handler: (message: Receive) => void): void;\n\n /**\n * Register a connection state change handler\n */\n onStateChange(handler: (state: TransportState) => void): void;\n\n /**\n * Register an error handler\n */\n onError(handler: (error: Error) => void): void;\n\n /**\n * Remove all handlers\n */\n removeAllHandlers(): void;\n}\n/**\n * WebSocket transport implementation\n */\nexport class WebSocketTransport\n implements ITransport<GraphRunnerMessage, ServerGraphRunnerMessage>\n{\n private ws: WebSocket | null = null;\n private config: Required<TransportConfig>;\n private state: TransportState = 'disconnected';\n private messageHandlers: Array<(message: ServerGraphRunnerMessage) => void> =\n [];\n private stateChangeHandlers: Array<(state: TransportState) => void> = [];\n private errorHandlers: Array<(error: Error) => void> = [];\n private reconnectTimeout: number | null = null;\n private heartbeatInterval: number | null = null;\n\n constructor(config: TransportConfig) {\n this.config = {\n url: config.url,\n reconnectInterval: config.reconnectInterval ?? 5000,\n heartbeatInterval: config.heartbeatInterval ?? 30000\n };\n }\n\n getState(): TransportState {\n return this.state;\n }\n\n async connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n this.setState('connecting');\n this.ws = new WebSocket(this.config.url);\n\n this.ws.onopen = () => {\n this.setState('connected');\n this.startHeartbeat();\n resolve();\n };\n\n this.ws.onerror = () => {\n this.setState('error');\n const error = new Error('WebSocket connection error');\n this.notifyError(error);\n reject(error);\n };\n\n this.ws.onclose = () => {\n this.handleDisconnect();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event);\n };\n });\n }\n\n disconnect(): void {\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.setState('disconnected');\n }\n\n send(message: GraphRunnerMessage): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not connected');\n }\n this.ws.send(JSON.stringify(message));\n }\n\n onMessage(handler: (message: ServerGraphRunnerMessage) => void): void {\n this.messageHandlers.push(handler);\n }\n\n onStateChange(handler: (state: TransportState) => void): void {\n this.stateChangeHandlers.push(handler);\n }\n\n onError(handler: (error: Error) => void): void {\n this.errorHandlers.push(handler);\n }\n\n removeAllHandlers(): void {\n this.messageHandlers = [];\n this.stateChangeHandlers = [];\n this.errorHandlers = [];\n }\n\n private setState(state: TransportState): void {\n this.state = state;\n this.stateChangeHandlers.forEach((handler) => handler(state));\n }\n\n private notifyError(error: Error): void {\n this.errorHandlers.forEach((handler) => handler(error));\n }\n\n private handleMessage(event: MessageEvent): void {\n try {\n const message: ServerGraphRunnerMessage = JSON.parse(event.data);\n this.messageHandlers.forEach((handler) => handler(message));\n } catch (error) {\n console.error('Failed to parse message:', error);\n this.notifyError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n private handleDisconnect(): void {\n this.setState('disconnected');\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n\n // Auto-reconnect\n if (!this.reconnectTimeout) {\n this.reconnectTimeout = window.setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnect();\n }, this.config.reconnectInterval);\n }\n }\n\n private async reconnect(): Promise<void> {\n try {\n await this.connect();\n } catch (error) {\n console.error('Reconnection failed:', error);\n }\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n }\n this.heartbeatInterval = window.setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n try {\n this.send({ type: 'ping', timestamp: Date.now() });\n } catch (error) {\n console.error('Failed to send heartbeat:', error);\n }\n }\n }, this.config.heartbeatInterval);\n }\n}\n","/**\n * Graph Runner client implementation with abstracted transport layer\n */\n\nimport type {\n EventFilter,\n GraphRunnerCapabilities,\n GraphRunnerClientConfig,\n GraphRunnerMessage,\n ServerGraphRunnerMessage,\n RunStatus,\n ServerEvent,\n ServerVariable,\n SocketConstraint\n} from './types';\nimport {\n WebSocketTransport,\n type ITransport,\n type TransportState\n} from './transport';\nimport type { NodeSpecJSON, GraphJSON } from '@kiberon-labs/behave-graph';\n\n/**\n * Extract message type by its 'type' field\n */\ntype ExtractMessage<T extends string> = Extract<\n ServerGraphRunnerMessage,\n { type: T }\n>;\n\n/**\n * Map of client request message types to their expected server response types\n */\ntype RequestResponseMap = {\n createSession: 'sessionCreated';\n resumeSession: 'sessionResumed';\n closeSession: 'sessionClosed';\n getCapabilities: 'capabilities';\n batchGetStatus: 'batchStatus';\n getRunHistory: 'runHistory';\n getServerVariables: 'serverVariables';\n getServerEvents: 'serverEvents';\n getSocketConstraints: 'socketConstraints';\n registerGraph: 'graphRegistered';\n getNodeTypes: 'nodeTypes';\n validateGraph: 'validationResult';\n runGraph: 'runStarted';\n stopGraph: 'stopped';\n getStatus: 'status';\n listGraphs: 'graphList';\n};\n\n/**\n * Extract the response type for a given request type\n */\ntype ResponseForRequest<T extends keyof RequestResponseMap> = ExtractMessage<\n RequestResponseMap[T]\n>;\n\n/**\n * Handler for messages received from the server\n * Generic type parameter ensures the handler receives the correct message type\n */\ntype ServerMessageHandler<T extends ServerGraphRunnerMessage['type']> = (\n message: ExtractMessage<T>\n) => void;\n\n/**\n * Client for the Behave-Graph Execution Protocol\n * Supports multiple transport implementations (WebSocket, HTTP, etc.)\n */\nexport class GraphRunnerClient {\n public transport: ITransport;\n private config: GraphRunnerClientConfig;\n private messageHandlers = new Map<string, Set<ServerMessageHandler<any>>>();\n private sessionId: string | null = null;\n private capabilities: GraphRunnerCapabilities | null = null;\n private serverId: string | null = null;\n private authenticated = false;\n private userId: string | null = null;\n private pendingRequests = new Map<\n string,\n { resolve: (value: any) => void; reject: (error: any) => void }\n >();\n private connectionState:\n | 'disconnected'\n | 'connecting'\n | 'authenticating'\n | 'connected' = 'disconnected';\n\n constructor(config: GraphRunnerClientConfig) {\n this.config = config;\n\n // Use provided transport or create default WebSocket transport\n if (config.transport) {\n this.transport = config.transport;\n } else if (config.url) {\n this.transport = new WebSocketTransport({\n url: config.url,\n reconnectInterval: config.reconnectInterval,\n heartbeatInterval: config.heartbeatInterval\n });\n } else {\n throw new Error('Either transport or url must be provided');\n }\n\n // Set up transport handlers\n this.transport.onMessage((message) =>\n this.handleMessage(message as unknown as ServerGraphRunnerMessage)\n );\n this.transport.onStateChange((state) =>\n this.handleTransportStateChange(state)\n );\n this.transport.onError((error) => this.handleTransportError(error));\n }\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n this.connectionState = 'connecting';\n\n // Wait for transport to connect\n this.transport\n .connect()\n .then(() => {\n this.connectionState = 'authenticating';\n\n // Wait for welcome message\n const welcomeHandler = (msg: ServerGraphRunnerMessage) => {\n if (msg.type === 'welcome') {\n this.serverId = msg.serverId;\n this.authenticated = msg.authenticated;\n this.userId = msg.userId ?? null;\n this.connectionState = 'connected';\n this.off('welcome', welcomeHandler);\n this.off('error', welcomeHandler);\n resolve();\n } else if (msg.type === 'error') {\n this.connectionState = 'disconnected';\n this.off('welcome', welcomeHandler);\n this.off('error', welcomeHandler);\n reject(new Error(`Connection failed: ${msg.message}`));\n }\n };\n\n this.on('welcome', welcomeHandler);\n this.on('error', welcomeHandler);\n\n // Send hello message\n this.send({\n type: 'hello',\n protocolVersion: this.config.protocolVersion ?? '1.0.0',\n auth: this.config.auth ?? { type: 'none' }\n });\n })\n .then(async () => {\n await this.getCapabilities();\n })\n .catch((error) => {\n this.connectionState = 'disconnected';\n reject(error);\n });\n });\n }\n\n disconnect(): void {\n this.transport.disconnect();\n this.connectionState = 'disconnected';\n }\n\n async createSession(metadata?: Record<string, unknown>): Promise<string> {\n const response = await this.request<'createSession'>({\n type: 'createSession',\n metadata: metadata ?? this.config.metadata\n });\n this.sessionId = response.sessionId;\n return response.sessionId;\n }\n\n async resumeSession(sessionId: string): Promise<string[]> {\n const response = await this.request<'resumeSession'>({\n type: 'resumeSession',\n sessionId\n });\n this.sessionId = sessionId;\n return response.activeRuns;\n }\n\n async closeSession(): Promise<void> {\n if (!this.sessionId) return;\n await this.request({ type: 'closeSession', sessionId: this.sessionId });\n this.sessionId = null;\n }\n\n async getCapabilities(): Promise<GraphRunnerCapabilities> {\n const response = await this.request<'getCapabilities'>({\n type: 'getCapabilities'\n });\n this.capabilities = response.capabilities;\n return response.capabilities;\n }\n\n async getServerVariables(): Promise<ServerVariable[]> {\n this.ensureSession();\n const response = await this.request<'getServerVariables'>({\n type: 'getServerVariables',\n sessionId: this.sessionId!\n });\n return response.variables;\n }\n\n async getServerEvents(): Promise<ServerEvent[]> {\n this.ensureSession();\n const response = await this.request<'getServerEvents'>({\n type: 'getServerEvents',\n sessionId: this.sessionId!\n });\n return response.events;\n }\n\n async getSocketConstraints(\n nodeType: string,\n socketName: string\n ): Promise<{\n valueType: string;\n constraints: SocketConstraint;\n }> {\n this.ensureSession();\n const response = await this.request<'getSocketConstraints'>({\n type: 'getSocketConstraints',\n sessionId: this.sessionId!,\n nodeType,\n socketName\n });\n return {\n valueType: response.valueType,\n constraints: response.constraints\n };\n }\n\n async getNodeTypes(): Promise<NodeSpecJSON[]> {\n this.ensureSession();\n const response = await this.request<'getNodeTypes'>({\n type: 'getNodeTypes',\n sessionId: this.sessionId!\n });\n return response.nodes;\n }\n\n async registerGraph(graphId: string, graph: GraphJSON): Promise<void> {\n this.ensureSession();\n await this.request<'registerGraph'>({\n type: 'registerGraph',\n sessionId: this.sessionId!,\n graphId,\n graph\n });\n }\n\n async listGraphs(): Promise<\n Array<{ graphId: string; registeredAt: number }>\n > {\n this.ensureSession();\n const response = await this.request<'listGraphs'>({\n type: 'listGraphs',\n sessionId: this.sessionId!\n });\n return response.graphs;\n }\n\n async validateGraph(\n graphId: string,\n graph: unknown\n ): Promise<{\n valid: boolean;\n errors: Array<{ nodeId: string; message: string; severity: string }>;\n warnings: Array<{ nodeId: string; message: string; severity: string }>;\n }> {\n this.ensureSession();\n const response = await this.request<'validateGraph'>({\n type: 'validateGraph',\n sessionId: this.sessionId!,\n graphId,\n graph\n });\n return {\n valid: response.valid,\n errors: response.errors,\n warnings: response.warnings\n };\n }\n\n async runGraph(\n graphId: string,\n options?: { graph?: unknown; inputs?: unknown; trace?: boolean }\n ): Promise<string> {\n this.ensureSession();\n const response = await this.request<'runGraph'>({\n type: 'runGraph',\n sessionId: this.sessionId!,\n graphId,\n graph: options?.graph as GraphJSON,\n inputs: options?.inputs,\n options: {\n trace: options?.trace ?? true\n }\n });\n\n return response.runId;\n }\n\n async stopGraph(runId: string): Promise<void> {\n this.ensureSession();\n await this.request({\n type: 'stopGraph',\n sessionId: this.sessionId!,\n runId\n });\n }\n\n async getStatus(runId: string) {\n this.ensureSession();\n const response = await this.request({\n type: 'getStatus',\n sessionId: this.sessionId!,\n runId\n });\n return response;\n }\n\n async batchGetStatus(\n runIds: string[]\n ): Promise<Array<{ runId: string; status: RunStatus; elapsedMs: number }>> {\n this.ensureSession();\n const response = await this.request({\n type: 'batchGetStatus',\n sessionId: this.sessionId!,\n runIds\n });\n return response.statuses;\n }\n\n async subscribe(runId: string, filter?: EventFilter): Promise<void> {\n this.ensureSession();\n this.send({\n type: 'subscribe',\n sessionId: this.sessionId!,\n runId,\n filter\n });\n }\n\n async unsubscribe(runId: string): Promise<void> {\n this.ensureSession();\n this.send({\n type: 'unsubscribe',\n sessionId: this.sessionId!,\n runId\n });\n }\n\n /**\n * Send a nodeAdded event\n * Used to notify the server when a node is added to the graph during execution\n */\n sendNodeAdded(\n runId: string,\n graphId: string,\n nodeId: string,\n nodeType: string,\n nodeData?: unknown\n ): void {\n this.send({\n type: 'nodeAdded',\n runId,\n graphId,\n nodeId,\n nodeType,\n nodeData\n });\n }\n\n async getRunHistory(options?: { limit?: number; graphId?: string }): Promise<\n Array<{\n runId: string;\n graphId: string;\n status: RunStatus;\n startedAt: number;\n completedAt?: number;\n elapsedMs: number;\n result?: unknown;\n }>\n > {\n this.ensureSession();\n const response = await this.request({\n type: 'getRunHistory',\n sessionId: this.sessionId!,\n limit: options?.limit,\n graphId: options?.graphId\n });\n return response.runs;\n }\n\n // Realtime modification methods\n\n addNode(\n runId: string,\n nodeId: string,\n nodeType: string,\n nodeData?: Record<string, unknown>,\n position?: { x: number; y: number }\n ): void {\n this.ensureSession();\n this.send({\n type: 'addNode',\n sessionId: this.sessionId!,\n runId,\n nodeId,\n nodeType,\n nodeData,\n position\n });\n }\n\n removeNode(runId: string, nodeId: string): void {\n this.ensureSession();\n this.send({\n type: 'removeNode',\n sessionId: this.sessionId!,\n runId,\n nodeId\n });\n }\n\n updateSocketValue(\n runId: string,\n nodeId: string,\n socketName: string,\n value: unknown\n ): void {\n this.ensureSession();\n this.send({\n type: 'updateSocketValue',\n sessionId: this.sessionId!,\n runId,\n nodeId,\n socketName,\n value\n });\n }\n\n updateNodeParam(\n runId: string,\n nodeId: string,\n paramName: string,\n value: unknown\n ): void {\n this.ensureSession();\n this.send({\n type: 'updateNodeParam',\n sessionId: this.sessionId!,\n runId,\n nodeId,\n paramName,\n value\n });\n }\n\n createLink(\n runId: string,\n fromNodeId: string,\n fromSocket: string,\n toNodeId: string,\n toSocket: string\n ): void {\n this.ensureSession();\n this.send({\n type: 'createLink',\n sessionId: this.sessionId!,\n runId,\n fromNodeId,\n fromSocket,\n toNodeId,\n toSocket\n });\n }\n\n removeLink(\n runId: string,\n fromNodeId: string,\n fromSocket: string,\n toNodeId: string,\n toSocket: string\n ): void {\n this.ensureSession();\n this.send({\n type: 'removeLink',\n sessionId: this.sessionId!,\n runId,\n fromNodeId,\n fromSocket,\n toNodeId,\n toSocket\n });\n }\n\n directExecuteNode(\n runId: string,\n nodeId: string,\n inputSocketName: string,\n inputValue: unknown,\n autoExecMode: 'new' | 'current' = 'current'\n ): void {\n this.ensureSession();\n this.send({\n type: 'directExecuteNode',\n sessionId: this.sessionId!,\n runId,\n nodeId,\n inputSocketName,\n inputValue,\n autoExecMode\n });\n }\n\n on<T extends ServerGraphRunnerMessage['type']>(\n messageType: T,\n handler: ServerMessageHandler<T>\n ): void {\n if (!this.messageHandlers.has(messageType)) {\n this.messageHandlers.set(messageType, new Set());\n }\n this.messageHandlers.get(messageType)!.add(handler);\n }\n\n off<T extends ServerGraphRunnerMessage['type']>(\n messageType: T,\n handler: ServerMessageHandler<T>\n ): void {\n const handlers = this.messageHandlers.get(messageType);\n if (handlers) {\n handlers.delete(handler);\n }\n }\n\n getConnectionState():\n | 'disconnected'\n | 'connecting'\n | 'authenticating'\n | 'connected' {\n return this.connectionState;\n }\n\n getSessionId(): string | null {\n return this.sessionId;\n }\n\n getCachedCapabilities(): GraphRunnerCapabilities | null {\n return this.capabilities;\n }\n\n isAuthenticated(): boolean {\n return this.authenticated;\n }\n\n getUserId(): string | null {\n return this.userId;\n }\n\n getServerId(): string | null {\n return this.serverId;\n }\n\n isConnected(): boolean {\n return this.connectionState === 'connected';\n }\n\n private send(message: GraphRunnerMessage): void {\n this.transport.send(message);\n // Track sent message if callback is configured\n if (this.config.onMessageActivity) {\n this.config.onMessageActivity('sent', message);\n }\n }\n\n private handleMessage(message: ServerGraphRunnerMessage): void {\n // Track received message if callback is configured\n if (this.config.onMessageActivity) {\n this.config.onMessageActivity(\n 'received',\n message as unknown as GraphRunnerMessage\n );\n }\n\n // Notify all handlers for this message type\n const handlers = this.messageHandlers.get(message.type);\n if (handlers) {\n handlers.forEach((handler) => handler(message));\n }\n\n // Also notify wildcard handlers\n const wildcardHandlers = this.messageHandlers.get('*');\n if (wildcardHandlers) {\n wildcardHandlers.forEach((handler) => handler(message));\n }\n }\n\n private handleTransportStateChange(state: TransportState): void {\n // Map transport state to connection state\n if (state === 'disconnected') {\n this.connectionState = 'disconnected';\n } else if (state === 'connecting') {\n this.connectionState = 'connecting';\n }\n }\n\n private handleTransportError(error: Error): void {\n console.error('Transport error:', error);\n // Reject all pending requests\n this.pendingRequests.forEach(({ reject }) => {\n reject(error);\n });\n this.pendingRequests.clear();\n }\n\n private async request<T extends keyof RequestResponseMap>(\n message: Extract<GraphRunnerMessage, { type: T }>\n ): Promise<ResponseForRequest<T>> {\n return new Promise((resolve, reject) => {\n const requestId = this.generateRequestId();\n this.pendingRequests.set(requestId, { resolve, reject });\n\n const timeout = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error('Request timeout'));\n }, 30000);\n\n const responseType = this.getExpectedResponseType(\n (message as { type: T }).type\n );\n\n const handler = (msg: ExtractMessage<typeof responseType>) => {\n clearTimeout(timeout);\n this.pendingRequests.delete(requestId);\n this.off(responseType, handler);\n resolve(msg as ResponseForRequest<T>);\n };\n\n const errorHandler = (msg: ExtractMessage<'error'>) => {\n clearTimeout(timeout);\n this.pendingRequests.delete(requestId);\n this.off(responseType, handler);\n this.off('error', errorHandler);\n reject(new Error(msg.message));\n };\n\n this.on(responseType, handler);\n this.on('error', errorHandler);\n\n try {\n this.send(message);\n } catch (error) {\n clearTimeout(timeout);\n this.pendingRequests.delete(requestId);\n this.off(responseType, handler);\n this.off('error', errorHandler);\n reject(error);\n }\n });\n }\n\n private ensureSession(): void {\n if (!this.sessionId) {\n throw new Error('No active session. Call createSession() first.');\n }\n }\n\n private generateRequestId(): string {\n return `req_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private getExpectedResponseType<T extends keyof RequestResponseMap>(\n requestType: T\n ): RequestResponseMap[T] {\n const responseMap: RequestResponseMap = {\n createSession: 'sessionCreated',\n resumeSession: 'sessionResumed',\n closeSession: 'sessionClosed',\n getCapabilities: 'capabilities',\n getServerVariables: 'serverVariables',\n getServerEvents: 'serverEvents',\n getSocketConstraints: 'socketConstraints',\n getNodeTypes: 'nodeTypes',\n registerGraph: 'graphRegistered',\n listGraphs: 'graphList',\n validateGraph: 'validationResult',\n runGraph: 'runStarted',\n stopGraph: 'stopped',\n getStatus: 'status',\n batchGetStatus: 'batchStatus',\n getRunHistory: 'runHistory'\n };\n return responseMap[requestType];\n }\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/plugin/graphrunner/styles.module_built.css\";\nconst classes = {\"tabPanel\":\"_7ZOWRq_tabPanel\",\"messageType\":\"_7ZOWRq_messageType\",\"tabPanelGap\":\"_7ZOWRq_tabPanelGap\",\"tabs\":\"_7ZOWRq_tabs\",\"messageDirectionIcon\":\"_7ZOWRq_messageDirectionIcon\",\"buttonGroup\":\"_7ZOWRq_buttonGroup\",\"treeItemContent\":\"_7ZOWRq_treeItemContent\",\"errorBox\":\"_7ZOWRq_errorBox\",\"treeItemTitle\":\"_7ZOWRq_treeItemTitle\",\"connectionForm\":\"_7ZOWRq_connectionForm\",\"button\":\"_7ZOWRq_button\",\"infoBox\":\"_7ZOWRq_infoBox\",\"tabContent\":\"_7ZOWRq_tabContent\",\"treeItemDescription\":\"_7ZOWRq_treeItemDescription\",\"messagesCount\":\"_7ZOWRq_messagesCount\",\"panel\":\"_7ZOWRq_panel\",\"scrollContainer\":\"_7ZOWRq_scrollContainer\",\"emptyMessage\":\"_7ZOWRq_emptyMessage\",\"formField\":\"_7ZOWRq_formField\",\"messageContent\":\"_7ZOWRq_messageContent\",\"infoField\":\"_7ZOWRq_infoField\",\"tabPanelGapLarge\":\"_7ZOWRq_tabPanelGapLarge\",\"messagesToolbar\":\"_7ZOWRq_messagesToolbar\",\"title\":\"_7ZOWRq_title\",\"messageDirection\":\"_7ZOWRq_messageDirection\",\"connectionMessage\":\"_7ZOWRq_connectionMessage\",\"messageHeader\":\"_7ZOWRq_messageHeader\",\"messageCard\":\"_7ZOWRq_messageCard\",\"messageTime\":\"_7ZOWRq_messageTime\",\"codeBlock\":\"_7ZOWRq_codeBlock\"}\nexport default classes\n\nconst _tabPanel0 = classes[\"tabPanel\"]\nexport { _tabPanel0 as \"tabPanel\" }\n\nconst _messageType0 = classes[\"messageType\"]\nexport { _messageType0 as \"messageType\" }\n\nconst _tabPanelGap0 = classes[\"tabPanelGap\"]\nexport { _tabPanelGap0 as \"tabPanelGap\" }\n\nconst _tabs0 = classes[\"tabs\"]\nexport { _tabs0 as \"tabs\" }\n\nconst _messageDirectionIcon0 = classes[\"messageDirectionIcon\"]\nexport { _messageDirectionIcon0 as \"messageDirectionIcon\" }\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\n\nconst _treeItemContent0 = classes[\"treeItemContent\"]\nexport { _treeItemContent0 as \"treeItemContent\" }\n\nconst _errorBox0 = classes[\"errorBox\"]\nexport { _errorBox0 as \"errorBox\" }\n\nconst _treeItemTitle0 = classes[\"treeItemTitle\"]\nexport { _treeItemTitle0 as \"treeItemTitle\" }\n\nconst _connectionForm0 = classes[\"connectionForm\"]\nexport { _connectionForm0 as \"connectionForm\" }\n\nconst _button0 = classes[\"button\"]\nexport { _button0 as \"button\" }\n\nconst _infoBox0 = classes[\"infoBox\"]\nexport { _infoBox0 as \"infoBox\" }\n\nconst _tabContent0 = classes[\"tabContent\"]\nexport { _tabContent0 as \"tabContent\" }\n\nconst _treeItemDescription0 = classes[\"treeItemDescription\"]\nexport { _treeItemDescription0 as \"treeItemDescription\" }\n\nconst _messagesCount0 = classes[\"messagesCount\"]\nexport { _messagesCount0 as \"messagesCount\" }\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _scrollContainer0 = classes[\"scrollContainer\"]\nexport { _scrollContainer0 as \"scrollContainer\" }\n\nconst _emptyMessage0 = classes[\"emptyMessage\"]\nexport { _emptyMessage0 as \"emptyMessage\" }\n\nconst _formField0 = classes[\"formField\"]\nexport { _formField0 as \"formField\" }\n\nconst _messageContent0 = classes[\"messageContent\"]\nexport { _messageContent0 as \"messageContent\" }\n\nconst _infoField0 = classes[\"infoField\"]\nexport { _infoField0 as \"infoField\" }\n\nconst _tabPanelGapLarge0 = classes[\"tabPanelGapLarge\"]\nexport { _tabPanelGapLarge0 as \"tabPanelGapLarge\" }\n\nconst _messagesToolbar0 = classes[\"messagesToolbar\"]\nexport { _messagesToolbar0 as \"messagesToolbar\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _messageDirection0 = classes[\"messageDirection\"]\nexport { _messageDirection0 as \"messageDirection\" }\n\nconst _connectionMessage0 = classes[\"connectionMessage\"]\nexport { _connectionMessage0 as \"connectionMessage\" }\n\nconst _messageHeader0 = classes[\"messageHeader\"]\nexport { _messageHeader0 as \"messageHeader\" }\n\nconst _messageCard0 = classes[\"messageCard\"]\nexport { _messageCard0 as \"messageCard\" }\n\nconst _messageTime0 = classes[\"messageTime\"]\nexport { _messageTime0 as \"messageTime\" }\n\nconst _codeBlock0 = classes[\"codeBlock\"]\nexport { _codeBlock0 as \"codeBlock\" }\n","import React, { useState } from 'react';\nimport { useStore } from 'zustand';\nimport type { System } from '../../system/system';\nimport type { AuthCredentials } from './types';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeCheckbox,\n VscodeSingleSelect,\n VscodeOption,\n VscodeLabel,\n VscodeBadge,\n VscodeTree,\n VscodeTreeItem,\n VscodeCollapsible\n} from '@vscode-elements/react-elements';\nimport styles from './styles.module.css';\n\ninterface GraphRunnerPanelProps {\n system: System;\n}\n\nexport const GraphRunnerPanel: React.FC<GraphRunnerPanelProps> = ({\n system\n}) => {\n const store = system.runner.store;\n\n const connectionState = useStore(store, (state) => state.connectionState);\n const connectionConfig = useStore(store, (state) => state.connectionConfig);\n const connectionInfo = useStore(store, (state) => state.connectionInfo);\n const error = useStore(store, (state) => state.error);\n const serverVariables = useStore(store, (state) => state.serverVariables);\n const serverEvents = useStore(store, (state) => state.serverEvents);\n const nodeTypes = useStore(store, (state) => state.nodeTypes);\n const messageActivity = useStore(store, (state) => state.messageActivity);\n const clearLogsOnRun = useStore(store, (state) => state.clearLogsOnRun);\n const clearTracesOnRun = useStore(store, (state) => state.clearTracesOnRun);\n const enableTracing = useStore(store, (state) => state.enableTracing);\n\n const icons = useStore(system.legendStore, (state) => state.icons);\n const defaultIcon = useStore(\n system.legendStore,\n (state) => state.defaultIcon\n );\n\n const [url, setUrl] = useState(connectionConfig.url);\n const [authType, setAuthType] = useState<'none' | 'bearer' | 'apiKey'>(\n connectionConfig.auth.type\n );\n const [authToken, setAuthToken] = useState('');\n const [autoReconnect, setAutoReconnect] = useState(\n connectionConfig.autoReconnect\n );\n\n const handleConnect = async () => {\n const auth: AuthCredentials =\n authType === 'bearer'\n ? { type: 'bearer', token: authToken }\n : authType === 'apiKey'\n ? { type: 'apiKey', key: authToken }\n : { type: 'none' };\n\n store.getState().setConnectionConfig({ url, auth, autoReconnect });\n\n await system.runner.connect();\n };\n\n const handleDisconnect = async () => {\n await system.runner.disconnect();\n };\n\n const handleRefreshMetadata = async () => {\n await system.runner.refreshMetadata();\n };\n\n const handleClearMessages = () => {\n store.getState().clearMessageActivity();\n };\n\n const isConnected = connectionState === 'connected';\n const isConnecting =\n connectionState === 'connecting' || connectionState === 'authenticating';\n\n return (\n <div className={styles.panel}>\n {/* Scrollable Content Container */}\n <div className={styles.scrollContainer}>\n <h3 className={styles.title}>\n Remote Graph Runner\n <VscodeBadge variant=\"tab-header-counter\">\n {isConnected ? 'Connected' : 'Disconnected'}\n </VscodeBadge>\n </h3>\n\n <div>\n {/* Connection Form */}\n <VscodeCollapsible heading=\"Connection Settings\">\n <div className={styles.connectionForm}>\n <div>\n <VscodeLabel>Server URL</VscodeLabel>\n <VscodeTextfield\n value={url}\n onChange={(e: any) => setUrl(e.target.value)}\n placeholder=\"ws://localhost:8080\"\n disabled={isConnected || isConnecting}\n className={styles.formField}\n />\n </div>\n\n <div>\n <VscodeLabel>Authentication</VscodeLabel>\n <VscodeSingleSelect\n value={authType}\n onChange={(e: any) =>\n setAuthType(e.target.value as 'none' | 'bearer' | 'apiKey')\n }\n disabled={isConnected || isConnecting}\n className={styles.formField}\n >\n <VscodeOption value=\"none\">None</VscodeOption>\n <VscodeOption value=\"bearer\">Bearer Token</VscodeOption>\n <VscodeOption value=\"apiKey\">API Key</VscodeOption>\n </VscodeSingleSelect>\n </div>\n\n {authType !== 'none' && (\n <div>\n <VscodeLabel>\n {authType === 'bearer' ? 'Token' : 'API Key'}\n </VscodeLabel>\n <VscodeTextfield\n type=\"password\"\n value={authToken}\n onChange={(e: any) => setAuthToken(e.target.value)}\n placeholder={\n authType === 'bearer'\n ? 'Enter bearer token'\n : 'Enter API key'\n }\n disabled={isConnected || isConnecting}\n className={styles.formField}\n />\n </div>\n )}\n\n <VscodeCheckbox\n checked={autoReconnect}\n onChange={(e: any) => setAutoReconnect(e.target.checked)}\n disabled={isConnected || isConnecting}\n >\n Auto-reconnect\n </VscodeCheckbox>\n\n <div className={styles.section}>\n <h4 className={styles.sectionTitle}>Execution Preferences</h4>\n <VscodeCheckbox\n checked={enableTracing}\n onChange={(e: any) =>\n store.getState().setEnableTracing(e.target.checked)\n }\n >\n Enable execution tracing\n </VscodeCheckbox>\n <VscodeCheckbox\n checked={clearLogsOnRun}\n onChange={(e: any) =>\n store.getState().setClearLogsOnRun(e.target.checked)\n }\n >\n Clear logs on new run\n </VscodeCheckbox>\n <VscodeCheckbox\n checked={clearTracesOnRun}\n onChange={(e: any) =>\n store.getState().setClearTracesOnRun(e.target.checked)\n }\n >\n Clear traces on new run\n </VscodeCheckbox>\n </div>\n\n <div className={styles.buttonGroup}>\n {!isConnected && (\n <VscodeButton\n onClick={handleConnect}\n disabled={isConnecting || !url}\n className={styles.button}\n >\n {isConnecting ? 'Connecting...' : 'Connect'}\n </VscodeButton>\n )}\n {isConnected && (\n <>\n <VscodeButton\n onClick={handleDisconnect}\n className={styles.button}\n >\n Disconnect\n </VscodeButton>\n <VscodeButton\n onClick={handleRefreshMetadata}\n className={styles.button}\n >\n Refresh\n </VscodeButton>\n </>\n )}\n </div>\n </div>\n </VscodeCollapsible>\n\n {/* Error Display */}\n {error && (\n <div className={styles.errorBox}>\n <strong>Error:</strong> {error}\n </div>\n )}\n\n {/* Connection Info */}\n {isConnected && (\n <VscodeCollapsible heading=\"Status\">\n <div className={styles.infoBox}>\n <div>\n <strong>Status:</strong> Connected\n </div>\n {connectionInfo.serverId && (\n <div className={styles.infoField}>\n <strong>Server:</strong> {connectionInfo.serverId}\n </div>\n )}\n {connectionInfo.sessionId && (\n <div className={styles.infoField}>\n <strong>Session:</strong> {connectionInfo.sessionId}\n </div>\n )}\n {connectionInfo.userId && (\n <div className={styles.infoField}>\n <strong>User:</strong> {connectionInfo.userId}\n </div>\n )}\n {connectionInfo.capabilities && (\n <div className={styles.infoField}>\n <strong>Capabilities:</strong>{' '}\n {Object.entries(connectionInfo.capabilities)\n .filter(([_, v]) => v === true)\n .map(([k]) => k)\n .join(', ')}\n </div>\n )}\n </div>\n </VscodeCollapsible>\n )}\n {isConnected && (\n <>\n <VscodeCollapsible heading=\"Variables\">\n <VscodeBadge slot=\"decorations\">\n {serverVariables.length}\n </VscodeBadge>\n <VscodeTree>\n {serverVariables.map((variable) => {\n const Icon = icons[variable.valueTypeName] ?? defaultIcon;\n const IconComponent = Icon as React.FC<{ slot?: string }>;\n return (\n <VscodeTreeItem key={variable.name}>\n <IconComponent slot=\"icon-leaf\" />\n <span>{variable.name}</span>\n </VscodeTreeItem>\n );\n })}\n </VscodeTree>\n </VscodeCollapsible>\n\n <VscodeCollapsible heading=\"Events\">\n <VscodeBadge slot=\"decorations\">\n {serverEvents.length}\n </VscodeBadge>\n\n <div className={styles.tabPanelGap}>\n {serverEvents.length === 0 ? (\n <p className={styles.emptyMessage}>\n No server events available\n </p>\n ) : (\n <VscodeTree>\n {serverEvents.map((event) => (\n <VscodeTreeItem key={event.name}>\n <span className={styles.treeItemTitle}>\n {event.name}\n </span>\n <VscodeTreeItem key={event.name}>\n <span slot=\"description\">{event.description}</span>\n {event.payloadSchema != null ? (\n <pre className={styles.codeBlock}>\n {JSON.stringify(event.payloadSchema, null, 2)}\n </pre>\n ) : null}\n </VscodeTreeItem>\n </VscodeTreeItem>\n ))}\n </VscodeTree>\n )}\n </div>\n </VscodeCollapsible>\n\n <VscodeCollapsible heading=\"Nodes\">\n <VscodeBadge slot=\"decorations\">{nodeTypes.length}</VscodeBadge>\n <div className={styles.tabPanelGap}>\n {nodeTypes.length === 0 ? (\n <p className={styles.emptyMessage}>\n No node types available\n </p>\n ) : (\n <VscodeTree>\n {nodeTypes.map((node) => (\n <VscodeTreeItem>\n {node.type}\n\n <span slot=\"description\">{node.category}</span>\n </VscodeTreeItem>\n ))}\n </VscodeTree>\n )}\n </div>\n </VscodeCollapsible>\n <VscodeCollapsible heading=\"Message Activity\">\n <VscodeBadge slot=\"decorations\">\n {messageActivity.length}\n </VscodeBadge>\n <div className={styles.tabPanelGapLarge}>\n <div className={styles.messagesToolbar}>\n <div className={styles.messagesCount}>\n {messageActivity.length} message\n {messageActivity.length !== 1 ? 's' : ''}\n </div>\n {messageActivity.length > 0 && (\n <VscodeButton onClick={handleClearMessages}>\n Clear\n </VscodeButton>\n )}\n </div>\n {messageActivity.length === 0 ? (\n <p className={styles.emptyMessage}>No messages yet</p>\n ) : (\n <div className={styles.tabPanelGap}>\n {messageActivity.map((activity) => {\n const time = new Date(\n activity.timestamp\n ).toLocaleTimeString();\n const directionColor =\n activity.direction === 'sent'\n ? 'var(--vscode-gitDecoration-modifiedResourceForeground)'\n : 'var(--vscode-gitDecoration-addedResourceForeground)';\n\n return (\n <div key={activity.id} className={styles.messageCard}>\n <div className={styles.messageHeader}>\n <div className={styles.messageDirection}>\n <span\n className={styles.messageDirectionIcon}\n style={{ color: directionColor }}\n >\n {activity.direction === 'sent' ? '→' : '←'}\n </span>\n <span className={styles.messageType}>\n {activity.message.type}\n </span>\n </div>\n <span className={styles.messageTime}>{time}</span>\n </div>\n <pre className={styles.messageContent}>\n {JSON.stringify(activity.message, null, 2)}\n </pre>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </VscodeCollapsible>\n </>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import { VscodeButton } from '@vscode-elements/react-elements';\nimport { useStore } from 'zustand';\nimport { Play, PauseWindow, Square, ArrowRight } from 'iconoir-react';\nimport type { StoreApi } from 'zustand';\nimport type { GraphRunnerClientStore } from './store';\n\ninterface GraphRunnerButtonsProps {\n store: StoreApi<GraphRunnerClientStore>;\n onPlay: () => void;\n onPause: () => void;\n onResume: () => void;\n onStep: () => void;\n onStop: () => void;\n}\n\nexport const GraphRunnerButtons = ({\n store,\n onPlay,\n onPause,\n onResume,\n onStep,\n onStop\n}: GraphRunnerButtonsProps) => {\n const connectionState = useStore(store, (state) => state.connectionState);\n const isExecuting = useStore(store, (state) => state.isExecuting);\n const isPaused = useStore(store, (state) => state.isPaused);\n\n const isConnected = connectionState === 'connected';\n\n return (\n <>\n {!isExecuting && (\n <VscodeButton\n secondary\n iconOnly\n title=\"Play Graph\"\n onClick={onPlay}\n disabled={!isConnected}\n >\n <Play />\n </VscodeButton>\n )}\n {isExecuting && !isPaused && (\n <VscodeButton\n secondary\n iconOnly\n title=\"Pause Graph\"\n onClick={onPause}\n disabled={!isConnected}\n >\n <PauseWindow />\n </VscodeButton>\n )}\n {isExecuting && isPaused && (\n <>\n <VscodeButton\n secondary\n iconOnly\n title=\"Resume Graph\"\n onClick={onResume}\n disabled={!isConnected}\n >\n <Play />\n </VscodeButton>\n <VscodeButton\n secondary\n iconOnly\n title=\"Step Forward\"\n onClick={onStep}\n disabled={!isConnected}\n >\n <ArrowRight />\n </VscodeButton>\n </>\n )}\n <VscodeButton\n secondary\n iconOnly\n title=\"Stop Graph\"\n onClick={onStop}\n disabled={!isExecuting}\n >\n <Square />\n </VscodeButton>\n </>\n );\n};\n","import type { System } from '../../system/system';\nimport type { StoreApi } from 'zustand';\nimport type { GraphRunnerClientStore } from './store';\nimport type { GraphRunnerClient } from './client';\nimport { executing } from '@/annotations';\nimport { sleep } from '@/util/sleep';\nimport { type ValueJSON } from '@kiberon-labs/behave-graph';\n\n// Helper to clear executing state from all nodes\nasync function clearAllExecutingStates(system: System) {\n await sleep(1); // Delay to allow any final traces to process\n system.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) => {\n if ('data' in node && node.data.annotations?.[executing]) {\n return {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [executing]: false\n }\n }\n };\n }\n return node;\n })\n );\n}\n\n/**\n * Setup persistent event listeners on the client for trace, logs, and run lifecycle\n * This should be called once when the client is connected\n */\nexport function setupClientEventListeners(\n client: GraphRunnerClient,\n system: System,\n store: StoreApi<GraphRunnerClientStore>\n) {\n const { setIsExecuting, setCurrentRunId, setCurrentGraphId, setIsPaused } =\n store.getState();\n\n // Listen for trace events - these apply to all runs\n client.on('trace', async (message) => {\n const traceStore = system.traceStore.getState();\n if (message.event === 'start') {\n let name = message.nodeId;\n if (\n message.data &&\n typeof message.data === 'object' &&\n 'typeName' in message.data\n ) {\n const typeName = (message.data as { typeName?: unknown }).typeName;\n if (typeof typeName === 'string') {\n name = typeName;\n }\n }\n traceStore.addSpan({\n nodeId: message.nodeId,\n name,\n start: message.timestamp || performance.now(),\n end: 1,\n lane: 0\n });\n\n // Mark node as executing\n system.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) =>\n node.id === message.nodeId && 'data' in node\n ? {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [executing]: true\n }\n }\n }\n : node\n )\n );\n } else if (message.event === 'end') {\n traceStore.updateSpan(message.nodeId, {\n end: message.timestamp || performance.now()\n });\n\n //Delay to allow UI to show executing state\n await sleep(1);\n\n // Mark node as no longer executing\n system.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) =>\n node.id === message.nodeId && 'data' in node\n ? {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [executing]: false\n }\n }\n }\n : node\n )\n );\n }\n });\n\n // Listen for log messages\n client.on('log', (message) => {\n const logStore = system.logsStore.getState();\n const formattedMessage = `[${message.runId}/${message.graphId}] ${message.message}${message.data !== undefined ? ` ${JSON.stringify(message.data)}` : ''}`;\n logStore.append({\n time: new Date(),\n data: {\n message: formattedMessage\n },\n type: message.level as any\n });\n });\n\n // Listen for variable change events from server\n client.on('variableChanged', (message) => {\n const variableStore = system.variableStore.getState();\n const id = message.variableName;\n\n // Get existing variable or create new one\n const existingVariable = variableStore.variables[id];\n\n if (existingVariable) {\n // Update existing variable\n system.variableStore.getState().setVariable(id, {\n ...existingVariable,\n initialValue: message.newValue as ValueJSON\n });\n } else {\n // Create new variable if it doesn't exist\n const inferredType = typeof message.newValue;\n const newVariable = {\n id,\n name: message.variableName,\n valueTypeName: inferredType === 'object' ? 'string' : inferredType,\n initialValue: message.newValue as ValueJSON\n };\n variableStore.setVariable(id, newVariable);\n }\n });\n\n // Listen for run completion events\n client.on('completed', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n system.notifications.success(`Graph completed: ${message.graphId}`);\n setIsExecuting(false);\n setCurrentRunId(null);\n setCurrentGraphId(null);\n setIsPaused(false);\n clearAllExecutingStates(system);\n }\n });\n\n client.on('error', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n system.notifications.error(`Graph failed: ${message.graphId}`);\n setIsExecuting(false);\n setCurrentRunId(null);\n setCurrentGraphId(null);\n setIsPaused(false);\n clearAllExecutingStates(system);\n }\n });\n\n client.on('stopped', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n system.notifications.info(`Graph stopped: ${message.graphId}`);\n setIsExecuting(false);\n setCurrentRunId(null);\n setCurrentGraphId(null);\n setIsPaused(false);\n clearAllExecutingStates(system);\n }\n });\n\n // Realtime state change listeners\n client.on('nodeRemoved', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n // Update node store to reflect removal\n system.nodeStore\n .getState()\n .setNodes((nodes) =>\n nodes.filter((node) => node.id !== message.nodeId)\n );\n system.notifications.info(`Node removed: ${message.nodeId}`);\n }\n });\n\n client.on('linkCreated', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n system.notifications.info(\n `Link created: ${message.fromNodeId}/${message.fromSocket} -> ${message.toNodeId}/${message.toSocket}`\n );\n }\n });\n\n client.on('linkRemoved', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n system.notifications.info(\n `Link removed: ${message.fromNodeId}/${message.fromSocket} -> ${message.toNodeId}/${message.toSocket}`\n );\n }\n });\n\n client.on('nodeParamUpdated', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n system.notifications.info(`Parameter updated on ${message.nodeId}`);\n }\n });\n\n client.on('affectedNodes', (message) => {\n const currentRunId = store.getState().currentRunId;\n if (message.runId === currentRunId) {\n // Highlight affected nodes\n system.nodeStore.getState().setNodes((nodes) =>\n nodes.map((node) => {\n if (message.nodeIds.includes(node.id)) {\n return {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data?.annotations,\n [executing]: true\n }\n }\n };\n }\n return node;\n })\n );\n system.notifications.info(\n `Executing ${message.reason}: ${message.nodeIds.length} node(s)`\n );\n }\n });\n}\n","import type { System } from '../../system/system';\nimport type { StoreApi } from 'zustand';\nimport type { GraphRunnerClientStore } from './store';\nimport { GraphRunnerClient } from './client';\nimport { buildUIGraphJSON } from '../../transformers/Uigraph';\nimport { setupClientEventListeners } from './actions';\n\ndeclare module '@/system/system' {\n interface System {\n runner: GraphRunner;\n }\n}\n\nexport class GraphRunner {\n private system: System;\n public readonly store: StoreApi<GraphRunnerClientStore>;\n\n constructor(system: System, store: StoreApi<GraphRunnerClientStore>) {\n this.system = system;\n this.store = store;\n }\n\n /**\n * Connect to the graph runner server\n */\n async connect(): Promise<void> {\n const {\n client,\n connectionConfig,\n setClient,\n setConnectionState,\n setConnectionInfo,\n setError,\n clearServerMetadata,\n addMessageActivity\n } = this.store.getState();\n\n try {\n setError(null);\n setConnectionState('connecting');\n\n const theClient =\n client ??\n new GraphRunnerClient({\n url: connectionConfig.url,\n auth: connectionConfig.auth,\n autoReconnect: connectionConfig.autoReconnect,\n onMessageActivity: (direction, message) => {\n addMessageActivity(direction, message);\n }\n });\n\n setClient(theClient);\n\n await theClient.connect();\n\n // Setup persistent event listeners for trace, logs, and run completion\n setupClientEventListeners(theClient, this.system, this.store);\n\n setConnectionState('connected');\n setConnectionInfo({\n serverId: theClient.getServerId(),\n userId: theClient.getUserId(),\n sessionId: null,\n authenticated: theClient.isAuthenticated(),\n capabilities: null\n });\n\n // Create session\n const sessionId = await theClient.createSession();\n setConnectionInfo({ sessionId });\n\n // Get capabilities\n const capabilities = await theClient.getCapabilities();\n setConnectionInfo({ capabilities });\n\n // Fetch metadata if supported\n if (capabilities.runtimeMetadata) {\n await this.refreshMetadata();\n }\n\n // Notify successful connection\n this.system.notifications.success(\n `Connected to ${theClient.getServerId() || 'graph runner server'}`\n );\n } catch (error) {\n setConnectionState('disconnected');\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n setError(errorMessage);\n setClient(null);\n clearServerMetadata();\n\n // Notify connection error\n this.system.notifications.error(`Failed to connect: ${errorMessage}`);\n }\n }\n\n /**\n * Disconnect from the graph runner server\n */\n async disconnect(): Promise<void> {\n const {\n client,\n setClient,\n setConnectionState,\n setConnectionInfo,\n clearServerMetadata\n } = this.store.getState();\n\n console.log('Disconnecting from graph runner server...');\n if (client) {\n try {\n await client.closeSession();\n client.disconnect();\n } catch (error) {\n console.error('Error disconnecting:', error);\n }\n }\n\n setClient(null);\n setConnectionState('disconnected');\n setConnectionInfo({\n serverId: null,\n userId: null,\n sessionId: null,\n authenticated: false,\n capabilities: null\n });\n clearServerMetadata();\n }\n\n /**\n * Refresh server metadata (variables, events, node types)\n */\n async refreshMetadata(): Promise<void> {\n const {\n client,\n setServerVariables,\n setServerEvents,\n setNodeTypes,\n setError\n } = this.store.getState();\n if (!client) {\n return;\n }\n\n try {\n const capabilities = client.getCachedCapabilities();\n if (!capabilities?.runtimeMetadata) {\n return;\n }\n\n const [variables, events, nodeTypes] = await Promise.all([\n client.getServerVariables(),\n client.getServerEvents(),\n client.getNodeTypes()\n ]);\n\n setServerVariables(variables);\n setServerEvents(events);\n setNodeTypes(nodeTypes);\n\n setError(null);\n } catch (error) {\n setError(error instanceof Error ? error.message : String(error));\n }\n }\n\n /**\n * Run a graph remotely\n */\n async runRemotely(\n graphId: string,\n options?: { graph?: unknown; inputs?: unknown }\n ): Promise<void> {\n const {\n client,\n setCurrentRunId,\n setCurrentGraphId,\n setIsExecuting,\n setIsPaused,\n isExecuting,\n enableTracing\n } = this.store.getState();\n\n if (!client) {\n this.system.notifications.error('No graph runner connection');\n throw new Error('No graph runner connection');\n }\n //already running\n if (isExecuting) {\n return;\n }\n\n try {\n const runId = await client.runGraph(graphId, {\n ...options,\n trace: enableTracing\n });\n\n setCurrentRunId(runId);\n setCurrentGraphId(graphId);\n setIsExecuting(true);\n setIsPaused(false);\n\n this.system.notifications.info(`Graph execution started: ${graphId}`);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n setIsPaused(false);\n this.system.notifications.error(`Failed to run graph: ${errorMessage}`);\n setIsExecuting(false);\n setCurrentRunId(null);\n setCurrentGraphId(null);\n throw error;\n }\n }\n\n /**\n * Stop the current graph execution\n */\n async stop(): Promise<void> {\n const {\n client,\n currentRunId,\n setIsExecuting,\n setCurrentRunId,\n setCurrentGraphId,\n setIsPaused\n } = this.store.getState();\n\n if (!client || !currentRunId) {\n return;\n }\n\n try {\n await client.stopGraph(currentRunId);\n this.system.notifications.info('Stopping graph execution');\n setIsExecuting(false);\n setCurrentRunId(null);\n setCurrentGraphId(null);\n setIsPaused(false);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.system.notifications.error(`Failed to stop graph: ${errorMessage}`);\n }\n }\n\n /**\n * Play the current graph\n */\n async play(): Promise<void> {\n const { clearLogsOnRun, clearTracesOnRun } = this.store.getState();\n\n // Clear logs if enabled\n if (clearLogsOnRun) {\n this.system.logsStore.getState().clear();\n }\n\n // Clear traces if enabled\n if (clearTracesOnRun) {\n this.system.traceStore.getState().clear();\n }\n\n const graphId = 'current';\n const uiGraphData = buildUIGraphJSON(this.system);\n const graphData = uiGraphData.flow;\n\n try {\n await this.runRemotely(graphId, { graph: graphData });\n } catch {\n // Error already handled in runRemotely\n }\n }\n\n /**\n * Pause the current graph execution\n */\n async pause(): Promise<void> {\n const { client, currentRunId, setIsPaused } = this.store.getState();\n\n if (!client || !currentRunId) {\n return;\n }\n\n try {\n // Check if the client's transport is LocalTransport with pause support\n const transport = (client as any).transport;\n if (transport && typeof transport.pauseExecution === 'function') {\n transport.pauseExecution(currentRunId);\n setIsPaused(true);\n this.system.notifications.info('Execution paused');\n } else {\n // Fallback to stop for remote transports\n await this.stop();\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.system.notifications.error(`Failed to pause graph: ${errorMessage}`);\n }\n }\n\n /**\n * Resume paused execution\n */\n async resume(): Promise<void> {\n const { client, currentRunId, setIsPaused } = this.store.getState();\n\n if (!client || !currentRunId) {\n return;\n }\n\n try {\n const transport = (client as any).transport;\n if (transport && typeof transport.resumeExecution === 'function') {\n setIsPaused(false);\n this.system.notifications.info('Resuming execution');\n await transport.resumeExecution(currentRunId);\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.system.notifications.error(\n `Failed to resume graph: ${errorMessage}`\n );\n }\n }\n\n /**\n * Execute one step forward\n */\n async step(): Promise<void> {\n const { client, currentRunId, setIsPaused } = this.store.getState();\n\n if (!client || !currentRunId) {\n return;\n }\n\n try {\n const transport = (client as any).transport;\n if (transport && typeof transport.stepExecution === 'function') {\n setIsPaused(true); // Ensure we stay paused after stepping\n await transport.stepExecution(currentRunId);\n } else {\n this.system.notifications.info(\n 'Step execution not supported for this transport'\n );\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n this.system.notifications.error(`Failed to step graph: ${errorMessage}`);\n }\n }\n}\n","/**\n * Session management for local graph runner\n * Allows customization of execution context and configuration per session\n */\n\nimport type { IRegistry } from '@kiberon-labs/behave-graph';\nimport type {\n GraphRunnerCapabilities,\n EventFilter\n} from '../graphrunner/types.js';\n\n/**\n * Session configuration for graph execution\n */\nexport interface SessionConfig {\n /** Custom metadata attached to the session */\n metadata?: Record<string, unknown>;\n /** Default execution options for all runs in this session */\n defaultExecutionOptions?: {\n autoEnd?: boolean;\n trace?: boolean;\n eventFilter?: EventFilter;\n maxExecutionTimeMs?: number;\n };\n /** Session-level execution settings */\n executionSettings?: {\n /** Delay between execution steps in milliseconds */\n stepDelay?: number;\n /** Execution speed multiplier (0.1 to 2.0) */\n executionSpeed?: number;\n /** Interval between tick events in milliseconds */\n tickInterval?: number;\n /** Maximum number of concurrent runs allowed */\n maxConcurrentRuns?: number;\n };\n /** Custom hook for handling tick timing/delays */\n tickStrategy?: () => Promise<void>;\n /** Custom registry overrides for this session */\n registryOverrides?: Partial<IRegistry>;\n /** Session lifecycle hooks */\n hooks?: SessionHooks;\n /** Session-specific capabilities override */\n capabilities?: Partial<GraphRunnerCapabilities>;\n}\n\n/**\n * Lifecycle hooks for session events\n */\nexport interface SessionHooks {\n /** Called when the session is created */\n onSessionCreated?: (session: Session) => void | Promise<void>;\n /** Called when a run starts in this session */\n onRunStarted?: (\n session: Session,\n runId: string,\n graphId: string\n ) => void | Promise<void>;\n /** Called when a run completes in this session */\n onRunCompleted?: (\n session: Session,\n runId: string,\n graphId: string,\n result: unknown\n ) => void | Promise<void>;\n /** Called when a run fails in this session */\n onRunError?: (\n session: Session,\n runId: string,\n graphId: string,\n error: Error\n ) => void | Promise<void>;\n /** Called when the session is closed */\n onSessionClosed?: (session: Session) => void | Promise<void>;\n}\n\n/**\n * Session state\n */\nexport interface Session {\n /** Unique session identifier */\n readonly sessionId: string;\n /** Session expiration timestamp */\n readonly expiresAt: number;\n /** Session creation timestamp */\n readonly createdAt: number;\n /** Session configuration */\n readonly config: SessionConfig;\n /** Active run IDs in this session */\n readonly activeRuns: Set<string>;\n /** Custom session state (user-definable) */\n state: Record<string, unknown>;\n /** Session metadata */\n metadata: Record<string, unknown>;\n}\n\n/**\n * Factory for creating sessions with custom configuration\n */\nexport interface SessionFactory {\n /**\n * Create a new session with optional configuration\n */\n createSession(sessionId: string, config?: SessionConfig): Session;\n}\n\n/**\n * Default session factory implementation\n */\nexport class DefaultSessionFactory implements SessionFactory {\n private defaultConfig?: SessionConfig;\n\n constructor(defaultConfig?: SessionConfig) {\n this.defaultConfig = defaultConfig;\n }\n\n createSession(sessionId: string, config?: SessionConfig): Session {\n const mergedConfig: SessionConfig = {\n ...this.defaultConfig,\n ...config,\n metadata: {\n ...this.defaultConfig?.metadata,\n ...config?.metadata\n },\n defaultExecutionOptions: {\n ...this.defaultConfig?.defaultExecutionOptions,\n ...config?.defaultExecutionOptions\n },\n executionSettings: {\n ...this.defaultConfig?.executionSettings,\n ...config?.executionSettings\n },\n hooks: {\n ...this.defaultConfig?.hooks,\n ...config?.hooks\n }\n };\n\n const session: Session = {\n sessionId,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000, // 24 hours default\n createdAt: Date.now(),\n config: mergedConfig,\n activeRuns: new Set(),\n state: {},\n metadata: mergedConfig.metadata ?? {}\n };\n\n // Call creation hook\n if (mergedConfig.hooks?.onSessionCreated) {\n void mergedConfig.hooks.onSessionCreated(session);\n }\n\n return session;\n }\n}\n\n/**\n * Session manager to track and manage multiple sessions\n */\nexport class SessionManager {\n private sessions = new Map<string, Session>();\n private sessionFactory: SessionFactory;\n\n constructor(sessionFactory?: SessionFactory) {\n this.sessionFactory = sessionFactory ?? new DefaultSessionFactory();\n }\n\n /**\n * Create a new session\n */\n createSession(sessionId: string, config?: SessionConfig): Session {\n const session = this.sessionFactory.createSession(sessionId, config);\n this.sessions.set(sessionId, session);\n return session;\n }\n\n /**\n * Get an existing session\n */\n getSession(sessionId: string): Session | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Check if a session exists\n */\n hasSession(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n /**\n * Close and remove a session\n */\n async closeSession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (session) {\n // Call close hook\n if (session.config.hooks?.onSessionClosed) {\n await session.config.hooks.onSessionClosed(session);\n }\n this.sessions.delete(sessionId);\n }\n }\n\n /**\n * Add a run to a session\n */\n addRunToSession(sessionId: string, runId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.activeRuns.add(runId);\n }\n }\n\n /**\n * Remove a run from a session\n */\n removeRunFromSession(sessionId: string, runId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.activeRuns.delete(runId);\n }\n }\n\n /**\n * Get all active sessions\n */\n getActiveSessions(): Session[] {\n return Array.from(this.sessions.values());\n }\n\n /**\n * Clean up expired sessions\n */\n cleanupExpiredSessions(): void {\n const now = Date.now();\n for (const [sessionId, session] of this.sessions.entries()) {\n if (session.expiresAt < now) {\n void this.closeSession(sessionId);\n }\n }\n }\n}\n","/**\n * WebSocket client plugin for the Behave-Graph Execution Protocol\n * Provides UI and store integration for remote graph execution\n */\n\nimport { type System } from '../../system/system';\nimport { graphRunnerClientStoreFactory } from './store';\nimport { GraphRunnerClient } from './client';\nimport { GraphRunnerPanel } from './panel';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport { MenuItemElement } from '../../components/menubar/menuItem';\nimport type { StoreApi } from 'zustand';\nimport type { GraphRunnerClientStore } from './store';\nimport { GraphRunnerButtons } from './buttons';\nimport { plugin } from '@/system/plugin';\nimport { isBehaveNode } from '@/util/isBehaveNode';\nimport type { Node } from 'reactflow';\nimport { GraphRunner } from './runner';\n\nexport * from './types';\nexport * from './client';\nexport * from './transport';\nexport * from './panel';\nexport * from './runner';\nexport * from './store';\nexport * from './session';\n/**\n * Options for the GraphRunner plugin\n */\nexport interface GraphRunnerClientPluginOptions {\n /**\n * Preconfigured GraphRunner client instance.\n * If provided, the plugin will use this client instead of creating a new one.\n * Useful when the client is already connected via a custom transport (e.g., VSCode IPC).\n */\n client?: GraphRunnerClient;\n\n /**\n * Preconfigured store instance.\n * If provided, the plugin will use this store instead of creating a new one.\n * Useful for sharing state with external components.\n */\n store?: StoreApi<GraphRunnerClientStore>;\n\n /**\n * Whether to skip automatic connection.\n * Default: false (will attempt to connect if client is not provided or not connected)\n */\n skipAutoConnect?: boolean;\n\n /**\n * Whether to add the menu item to the Window menu.\n * Default: true\n */\n addMenuItem?: boolean;\n}\n\n/**\n * Plugin initialization function\n * Registers the GraphRunnerClient store and actions with the system\n */\nexport async function graphRunnerClientPluginLoader(\n system: System,\n options: GraphRunnerClientPluginOptions = {}\n) {\n // Use provided store or create a new one\n const store = options.store ?? graphRunnerClientStoreFactory(system);\n\n // If a preconfigured client is provided, set it in the store\n if (options.client) {\n store.getState().setClient(options.client);\n\n // If client is already connected, update connection state\n if (options.client.isConnected()) {\n store.getState().setConnectionState('connected');\n\n // Populate connection info if available\n const connectionInfo = {\n serverId: options.client.getServerId(),\n userId: options.client.getUserId(),\n authenticated: options.client.isAuthenticated(),\n capabilities: options.client.getCachedCapabilities(),\n sessionId: null // Session management is external when client is provided\n };\n store.getState().setConnectionInfo(connectionInfo);\n }\n }\n\n // Create and decorate actions\n const runner = new GraphRunner(system, store);\n system.decorate('runner', runner);\n\n // Add toolbar buttons for graph execution control\n system.toolbarStore.getState().addGroup({\n id: 'graph-runner-controls',\n label: 'Graph Runner',\n buttons: [\n <GraphRunnerButtons\n key=\"graph-runner-buttons\"\n store={store}\n onPlay={() => runner.play()}\n onPause={() => runner.pause()}\n onResume={() => runner.resume()}\n onStep={() => runner.step()}\n onStop={() => runner.stop()}\n />\n ]\n });\n\n system.hotKeyStore.getState().register({\n action: 'PLAY',\n description: 'Triggers playing the graph',\n trigger: 'p',\n handler: () => {\n if (runner.store.getState().isExecuting) {\n runner.stop();\n } else {\n runner.play();\n }\n }\n });\n\n // Register the panel with TabLoader\n system.tabLoader.register('graphRunner', () => {\n return {\n id: 'graphRunner',\n closable: true,\n title: 'Remote Graph Runner',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'Error loading Graph Runner panel'}>\n <GraphRunnerPanel system={system} />\n </ErrorBoundary>\n )\n };\n });\n\n // Add menu item to Window menu (unless disabled)\n if (options.addMenuItem !== false) {\n const menuStore = system.menubarStore;\n const currentItems = menuStore.getState().items;\n const windowMenu = currentItems.find((menu) => menu.name === 'window');\n\n if (windowMenu) {\n // Add the Graph Runner menu item to the Window menu\n const newMenuItem = {\n name: 'graphRunner',\n render: function GraphRunnerMenuItem() {\n return (\n <MenuItemElement\n onClick={() => system.tabStore.getState().openTab('graphRunner')}\n key=\"graphRunner\"\n >\n Remote Graph Runner\n </MenuItemElement>\n );\n }\n };\n\n menuStore\n .getState()\n .setSubMenuItems('window', [...windowMenu.items, newMenuItem]);\n }\n }\n\n system.pubsub.subscribe('node:added', (_, node: Node) => {\n if (!isBehaveNode(node)) {\n return;\n }\n\n const client = runner.store.getState().client;\n const currentRunId = runner.store.getState().currentRunId;\n const graphId = runner.store.getState().currentGraphId;\n\n // Only send if we have an active run and realtime is enabled\n if (client && currentRunId && graphId) {\n const capabilities = runner.store.getState().connectionInfo.capabilities;\n if (capabilities?.realtime) {\n client.addNode(\n currentRunId,\n node.id,\n node.data.type,\n node.data as Record<string, unknown>,\n node.position\n );\n }\n }\n });\n\n system.pubsub.subscribe('edge:added', (_, edge) => {\n const client = runner.store.getState().client;\n const currentRunId = runner.store.getState().currentRunId;\n const graphId = runner.store.getState().currentGraphId;\n\n // Only send if we have an active run and realtime is enabled\n if (client && currentRunId && graphId && edge.source && edge.target) {\n const capabilities = runner.store.getState().connectionInfo.capabilities;\n if (capabilities?.realtime) {\n client.createLink(\n currentRunId,\n edge.source,\n edge.sourceHandle || '',\n edge.target,\n edge.targetHandle || ''\n );\n }\n }\n });\n\n system.pubsub.subscribe('edge:removed', (_, edge) => {\n const client = runner.store.getState().client;\n const currentRunId = runner.store.getState().currentRunId;\n const graphId = runner.store.getState().currentGraphId;\n\n // Only send if we have an active run and realtime is enabled\n if (client && currentRunId && graphId && edge.source && edge.target) {\n const capabilities = runner.store.getState().connectionInfo.capabilities;\n if (capabilities?.realtime) {\n client.removeLink(\n currentRunId,\n edge.source,\n edge.sourceHandle || '',\n edge.target,\n edge.targetHandle || ''\n );\n }\n }\n });\n\n system.pubsub.subscribe('node:removed', (_, node: Node) => {\n if (!isBehaveNode(node)) {\n return;\n }\n\n const client = runner.store.getState().client;\n const currentRunId = runner.store.getState().currentRunId;\n const graphId = runner.store.getState().currentGraphId;\n\n // Only send if we have an active run and realtime is enabled\n if (client && currentRunId && graphId) {\n const capabilities = runner.store.getState().connectionInfo.capabilities;\n if (capabilities?.realtime) {\n client.removeNode(currentRunId, node.id);\n }\n }\n });\n\n if (!options.skipAutoConnect) {\n await runner.connect();\n }\n}\n\nexport const graphRunnerClientPlugin = plugin(graphRunnerClientPluginLoader, {\n name: 'graph-runner-client'\n});\n","/**\n * Shared graph execution utilities for both local and worker runners\n */\n\nimport {\n Engine,\n type GraphInstance,\n type ILifecycleEventEmitter,\n readGraphFromJSON,\n validateGraph,\n ManualLifecycleEventEmitter,\n DefaultLogger,\n type ILogger,\n type IRegistry,\n writeNodeSpecsToJSON,\n type NodeSpecJSON,\n type GraphJSON\n} from '@kiberon-labs/behave-graph';\nimport type {\n GraphRunnerCapabilities,\n RunStatus,\n ServerGraphRunnerMessage,\n ServerVariable,\n ServerEvent\n} from '../graphrunner/types.js';\nimport { sleep } from '@kiberon-labs/behave-graph';\n\nexport interface ActiveRun {\n runId: string;\n graphId: string;\n engine: Engine;\n graphInstance: GraphInstance;\n registry: IRegistry;\n status: RunStatus;\n startedAt: number;\n performance: {\n nodesExecuted: number;\n eventsEmitted: number;\n variableChanges: number;\n };\n isPaused: boolean;\n executionPhase: 'start' | 'tick' | 'end' | 'completed';\n currentTick: number;\n}\n\nexport interface MessageContext {\n sendMessage: (message: ServerGraphRunnerMessage) => void;\n sendError: (\n code: string,\n message: string,\n details?: Record<string, unknown>\n ) => void;\n}\n\n/**\n * Create a logger that forwards messages through a callback\n */\nexport function createForwardingLogger(\n runId: string,\n graphId: string,\n onLog: (message: ServerGraphRunnerMessage) => void\n): ILogger {\n const baseLogger = new DefaultLogger();\n\n return {\n log: (severity: string, text: string) => {\n baseLogger.log(severity as any, text);\n onLog({\n type: 'log',\n runId,\n graphId,\n level: severity,\n message: text\n });\n }\n };\n}\n\n/**\n * Prepare a registry with required dependencies injected\n */\nexport function prepareRegistryWithDependencies(\n registry: IRegistry,\n logger: ILogger\n): IRegistry {\n // Ensure lifecycle event emitter and logger are available in registry\n if (\n !registry.dependencies?.ILifecycleEventEmitter ||\n !registry.dependencies?.ILogger\n ) {\n // Create a new registry with required dependencies injected\n return {\n ...registry,\n dependencies: {\n ...registry.dependencies,\n ILifecycleEventEmitter:\n registry.dependencies?.ILifecycleEventEmitter ||\n new ManualLifecycleEventEmitter(),\n ILogger: logger\n }\n };\n } else {\n // Replace the existing logger\n return {\n ...registry,\n dependencies: {\n ...registry.dependencies,\n ILogger: logger\n }\n };\n }\n}\n\n/**\n * Parse and validate a graph\n */\nexport function parseAndValidateGraph(\n graphData: GraphJSON,\n registry: IRegistry\n): { graphInstance: GraphInstance; errors: string[] } {\n const graphInstance = readGraphFromJSON({\n graphJson: graphData,\n registry\n });\n\n const errors = validateGraph(graphInstance);\n return { graphInstance, errors };\n}\n\n/**\n * Generate a unique ID\n */\nexport function generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Handle hello message\n */\nexport function handleHello(\n message: { type: 'hello'; protocolVersion: string },\n serverId: string,\n ctx: MessageContext\n): void {\n ctx.sendMessage({\n type: 'welcome',\n protocolVersion: message.protocolVersion,\n serverId,\n authenticated: true,\n userId: 'local-user'\n });\n}\n\n/**\n * Handle createSession message\n */\nexport function handleCreateSession(\n _message: { type: 'createSession'; metadata?: Record<string, unknown> },\n ctx: MessageContext\n): string {\n const sessionId = generateId('session');\n ctx.sendMessage({\n type: 'sessionCreated',\n sessionId,\n expiresAt: Date.now() + 24 * 60 * 60 * 1000\n });\n return sessionId;\n}\n\n/**\n * Handle getCapabilities message\n */\nexport function handleGetCapabilities(ctx: MessageContext): void {\n const capabilities: GraphRunnerCapabilities = {\n trace: true,\n validation: true,\n graphRegistry: false,\n eventFiltering: false,\n batchOperations: false,\n runHistory: false,\n runtimeMetadata: true,\n maxConcurrentRuns: 10\n };\n\n ctx.sendMessage({\n type: 'capabilities',\n capabilities\n });\n}\n\n/**\n * Setup tracing for a run\n */\nexport function setupTracing(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext\n): void {\n run.engine.onNodeExecutionStart.addListener((node) => {\n run.performance.nodesExecuted++;\n ctx.sendMessage({\n type: 'trace',\n runId: run.runId,\n graphId,\n nodeId: node.id,\n event: 'start',\n data: { typeName: node.description.typeName },\n timestamp: Date.now() - run.startedAt\n });\n });\n\n run.engine.onNodeExecutionEnd.addListener((node) => {\n ctx.sendMessage({\n type: 'trace',\n runId: run.runId,\n graphId,\n nodeId: node.id,\n event: 'end',\n data: { typeName: node.description.typeName },\n timestamp: Date.now() - run.startedAt\n });\n });\n}\n\n/**\n * Setup variable change tracking for a run\n */\nexport function setupVariableChangeTracking(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext\n): void {\n // Track old values so we can report them in the change event\n const variableOldValues = new Map<string, unknown>();\n\n const variables = Object.values(run.graphInstance.variables);\n\n for (const variable of variables) {\n // Store initial value as the \"old\" value\n variableOldValues.set(variable.id, variable.get());\n\n variable.onChanged.addListener(() => {\n run.performance.variableChanges++;\n const oldValue = variableOldValues.get(variable.id);\n const newValue = variable.get();\n\n // Update tracked value for next change\n variableOldValues.set(variable.id, newValue);\n\n ctx.sendMessage({\n type: 'variableChanged',\n runId: run.runId,\n graphId,\n variableName: variable.name,\n oldValue,\n newValue\n });\n });\n }\n}\n\n/**\n * Execute a graph through its lifecycle phases\n */\nexport async function executeGraphLifecycle(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext,\n options?: {\n tickInterval?: number;\n onStepComplete?: () => Promise<void>;\n autoEnd?: boolean;\n }\n): Promise<void> {\n try {\n const eventEmitter = run.registry.dependencies?.ILifecycleEventEmitter as\n | ILifecycleEventEmitter\n | undefined;\n\n // Execute start event\n if (run.executionPhase === 'start') {\n if (\n eventEmitter?.startEvent &&\n eventEmitter.startEvent.listenerCount > 0\n ) {\n eventEmitter.startEvent.emit();\n await run.engine.executeAllAsync();\n }\n run.executionPhase = 'tick';\n }\n\n // Execute tick events\n if (run.executionPhase === 'tick') {\n if (eventEmitter?.tickEvent && eventEmitter.tickEvent.listenerCount > 0) {\n while (!run.isPaused && run.status === 'running') {\n eventEmitter.tickEvent.emit();\n await run.engine.executeAllAsync();\n run.currentTick++;\n\n if (options?.onStepComplete) {\n await options.onStepComplete();\n }\n\n if (run.isPaused || run.status !== 'running') {\n return;\n }\n\n await sleep((options?.tickInterval ?? 50) / 1000);\n }\n } else {\n run.executionPhase = 'end';\n }\n }\n\n // Execute end event\n if (run.executionPhase === 'end' && !run.isPaused) {\n if (eventEmitter?.endEvent && eventEmitter.endEvent.listenerCount > 0) {\n eventEmitter.endEvent.emit();\n await run.engine.executeAllAsync();\n }\n run.executionPhase = 'completed';\n }\n\n // Complete if not paused\n if (!run.isPaused && !options?.autoEnd) {\n run.status = 'completed';\n const elapsedMs = Date.now() - run.startedAt;\n\n ctx.sendMessage({\n type: 'completed',\n runId: run.runId,\n graphId,\n completedAt: Date.now(),\n elapsedMs,\n result: null,\n performance: run.performance\n });\n\n run.engine.dispose();\n }\n } catch (error) {\n run.status = 'error';\n const errorMessage = error instanceof Error ? error.message : String(error);\n ctx.sendError('NODE_EXECUTION_ERROR', errorMessage, {\n runId: run.runId,\n graphId\n });\n run.engine.dispose();\n throw error;\n }\n}\n\n/**\n * Handle getServerVariables message\n */\nexport function handleGetServerVariables(\n variables: ServerVariable[],\n ctx: MessageContext\n): void {\n ctx.sendMessage({\n type: 'serverVariables',\n variables\n });\n}\n\n/**\n * Handle getServerEvents message\n */\nexport function handleGetServerEvents(\n events: ServerEvent[],\n ctx: MessageContext\n): void {\n ctx.sendMessage({\n type: 'serverEvents',\n events\n });\n}\n\n/**\n * Handle getSocketConstraints message\n */\nexport function handleGetSocketConstraints(\n message: {\n nodeType: string;\n socketName: string;\n },\n registry: IRegistry,\n ctx: MessageContext\n): void {\n const nodeSpec = writeNodeSpecsToJSON(registry).find(\n (spec) => spec.type === message.nodeType\n );\n if (!nodeSpec) {\n ctx.sendError('INVALID_GRAPH', `Node type not found: ${message.nodeType}`);\n return;\n }\n\n const socket = [...nodeSpec.inputs, ...nodeSpec.outputs].find(\n (s) => s.name === message.socketName\n );\n\n if (!socket) {\n ctx.sendError(\n 'INVALID_GRAPH',\n `Socket not found: ${message.socketName} on node ${message.nodeType}`\n );\n return;\n }\n\n const constraints: {\n type: 'enum' | 'range' | 'pattern' | 'custom';\n choices?: Array<{ value: unknown; label: string }>;\n min?: number;\n max?: number;\n pattern?: string;\n validator?: string;\n } = {\n type: 'custom'\n };\n\n if ('choices' in socket && Array.isArray(socket.choices)) {\n constraints.type = 'enum';\n constraints.choices = socket.choices.map(\n (choice: { text: string; value: unknown } | string) =>\n typeof choice === 'string'\n ? { value: choice, label: choice }\n : { value: choice.value, label: choice.text }\n );\n }\n\n ctx.sendMessage({\n type: 'socketConstraints',\n nodeType: message.nodeType,\n socketName: message.socketName,\n valueType: socket.valueType,\n constraints\n });\n}\n\n/**\n * Handle getNodeTypes message\n */\nexport function handleGetNodeTypes(\n registry: IRegistry,\n ctx: MessageContext\n): void {\n let nodes: NodeSpecJSON[] = [];\n\n if (registry.nodes) {\n nodes = writeNodeSpecsToJSON(registry);\n }\n\n ctx.sendMessage({\n type: 'nodeTypes',\n nodes\n });\n}\n","/**\n * Local (in-browser) transport implementation for graph execution\n * Executes graphs directly using the local Engine instead of a remote server\n */\n\nimport type {\n GraphRunnerMessage,\n RunStatus,\n GraphRunnerCapabilities,\n ServerVariable,\n ServerEvent,\n ServerGraphRunnerMessage,\n RunGraphMessage,\n HelloMessage,\n CreateSessionMessage,\n GetNodeTypesMessage,\n GetStatusMessage,\n CloseSessionMessage,\n StopGraphMessage,\n GetSocketConstraintsMessage,\n AddNodeMessage,\n RemoveNodeMessage,\n UpdateSocketValueMessage,\n UpdateNodeParamMessage,\n CreateLinkMessage,\n RemoveLinkMessage,\n DirectExecuteNodeMessage\n} from '../graphrunner/types.js';\nimport type { ITransport, TransportState } from '../graphrunner/transport.js';\nimport {\n Engine,\n type GraphInstance,\n type ILifecycleEventEmitter,\n readGraphFromJSON,\n validateGraph,\n ManualLifecycleEventEmitter,\n DefaultLogger,\n type ILogger,\n Link,\n makeGraphApi\n} from '@kiberon-labs/behave-graph';\nimport type { IRegistry } from '@kiberon-labs/behave-graph';\nimport type { StoreApi } from 'zustand';\nimport type { LocalGraphRunnerStore } from './store.js';\nimport { sleep } from '@kiberon-labs/behave-graph';\nimport {\n setupVariableChangeTracking,\n handleGetServerVariables,\n handleGetServerEvents,\n handleGetSocketConstraints,\n handleGetNodeTypes\n} from './execution-utils.js';\nimport {\n SessionManager,\n type Session,\n type SessionConfig,\n type SessionFactory\n} from '../graphrunner/session.js';\nimport { createNode } from '@kiberon-labs/behave-graph';\n\ninterface ActiveRun {\n runId: string;\n graphId: string;\n sessionId: string;\n engine: Engine;\n graphInstance: GraphInstance;\n registry: IRegistry;\n status: RunStatus;\n startedAt: number;\n performance: {\n nodesExecuted: number;\n eventsEmitted: number;\n variableChanges: number;\n };\n // Step execution control\n isPaused: boolean;\n executionPhase: 'start' | 'tick' | 'end' | 'completed';\n currentTick: number;\n maxTicks: number;\n}\n\n/**\n * Local transport that executes graphs in the browser using the Engine\n */\nexport class LocalTransport implements ITransport {\n private state: TransportState = 'disconnected';\n private messageHandlers: Array<(message: ServerGraphRunnerMessage) => void> =\n [];\n private stateChangeHandlers: Array<(state: TransportState) => void> = [];\n private errorHandlers: Array<(error: Error) => void> = [];\n private registry: IRegistry;\n private sessionManager: SessionManager;\n private activeRuns = new Map<string, ActiveRun>();\n private store: StoreApi<LocalGraphRunnerStore> | null = null;\n private variables: ServerVariable[];\n private serverEvents: ServerEvent[];\n\n constructor(\n registry: IRegistry,\n options?: {\n store?: StoreApi<LocalGraphRunnerStore>;\n variables?: ServerVariable[];\n serverEvents?: ServerEvent[];\n sessionFactory?: SessionFactory;\n }\n ) {\n this.registry = registry;\n this.store = options?.store ?? null;\n this.variables = options?.variables ?? [];\n this.serverEvents = options?.serverEvents ?? [];\n this.sessionManager = new SessionManager(options?.sessionFactory);\n }\n\n /**\n * Create a logger that forwards log messages to the client\n */\n private createTransportLogger(runId: string, graphId: string): ILogger {\n const baseLogger =\n (this.registry.dependencies?.ILogger as ILogger) || new DefaultLogger();\n\n return {\n log: (severity: string, text: string) => {\n baseLogger.log(severity as any, text);\n this.notifyMessage({\n type: 'log',\n runId,\n graphId,\n level: severity,\n message: text\n });\n }\n };\n }\n\n getState(): TransportState {\n return this.state;\n }\n\n async connect(): Promise<void> {\n this.setState('connected');\n }\n\n disconnect(): void {\n // Clean up all active runs\n for (const run of this.activeRuns.values()) {\n run.engine.dispose();\n }\n this.activeRuns.clear();\n\n // Close all sessions\n for (const session of this.sessionManager.getActiveSessions()) {\n void this.sessionManager.closeSession(session.sessionId);\n }\n\n this.setState('disconnected');\n this.updateStoreActiveRuns();\n }\n\n send(message: GraphRunnerMessage): void {\n // Handle messages synchronously in the browser\n try {\n this.handleMessage(message);\n } catch (error) {\n this.notifyError(\n error instanceof Error ? error : new Error(String(error))\n );\n }\n }\n\n onMessage(handler: (message: ServerGraphRunnerMessage) => void): void {\n this.messageHandlers.push(handler);\n }\n\n onStateChange(handler: (state: TransportState) => void): void {\n this.stateChangeHandlers.push(handler);\n }\n\n onError(handler: (error: Error) => void): void {\n this.errorHandlers.push(handler);\n }\n\n removeAllHandlers(): void {\n this.messageHandlers = [];\n this.stateChangeHandlers = [];\n this.errorHandlers = [];\n }\n\n private setState(newState: TransportState): void {\n this.state = newState;\n this.stateChangeHandlers.forEach((handler) => handler(newState));\n }\n\n private notifyError(error: Error): void {\n this.errorHandlers.forEach((handler) => handler(error));\n }\n\n private notifyMessage(message: ServerGraphRunnerMessage): void {\n this.messageHandlers.forEach((handler) => handler(message));\n }\n updateStoreActiveRuns(): void {\n if (this.store) {\n this.store.getState().setActiveRuns(this.activeRuns.size);\n }\n }\n\n private updateStoreExecutionState(\n isExecuting: boolean,\n isPaused: boolean\n ): void {\n if (this.store) {\n this.store.getState().setIsExecuting(isExecuting);\n this.store.getState().setIsPaused(isPaused);\n }\n }\n\n private getExecutionDelay(): number {\n if (this.store) {\n const { stepDelay, executionSpeed } = this.store.getState();\n // Apply speed multiplier and step delay\n return (\n stepDelay + (executionSpeed < 1.0 ? (1.0 - executionSpeed) * 100 : 0)\n );\n }\n return 0;\n }\n\n private getExecutionStepLimit(): number {\n return 1;\n }\n\n private getTickInterval(): number {\n if (this.store) {\n return this.store.getState().tickInterval;\n }\n return 50; // Default 50ms\n }\n\n /**\n * Get the default sleep-based tick strategy\n */\n private createSleepTickStrategy(tickInterval: number): () => Promise<void> {\n return async () => {\n await sleep(tickInterval / 1000); // Convert ms to seconds\n };\n }\n\n private generateId(prefix: string): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private handleMessage(message: GraphRunnerMessage): void {\n switch (message.type) {\n case 'hello':\n this.handleHello(message);\n break;\n case 'createSession':\n this.handleCreateSession(message);\n break;\n case 'getCapabilities':\n this.handleGetCapabilities();\n break;\n case 'getServerVariables':\n this.handleGetServerVariables(message);\n break;\n case 'getServerEvents':\n this.handleGetServerEvents(message);\n break;\n case 'getSocketConstraints':\n this.handleGetSocketConstraints(message);\n break;\n case 'getNodeTypes':\n this.handleGetNodeTypes(message);\n break;\n case 'runGraph':\n this.handleRunGraph(message);\n break;\n case 'stopGraph':\n this.handleStopGraph(message);\n break;\n case 'getStatus':\n this.handleGetStatus(message);\n break;\n case 'closeSession':\n this.handleCloseSession(message);\n break;\n case 'addNode':\n this.handleAddNode(message);\n break;\n case 'removeNode':\n this.handleRemoveNode(message);\n break;\n case 'updateSocketValue':\n this.handleUpdateSocketValue(message);\n break;\n case 'updateNodeParam':\n this.handleUpdateNodeParam(message);\n break;\n case 'createLink':\n this.handleCreateLink(message);\n break;\n case 'removeLink':\n this.handleRemoveLink(message);\n break;\n case 'directExecuteNode':\n this.handleDirectExecuteNode(message);\n break;\n default:\n this.sendError(\n 'PROTOCOL_VIOLATION',\n `Unsupported message type: ${(message as GraphRunnerMessage).type}`\n );\n }\n }\n\n private handleHello(message: HelloMessage): void {\n this.notifyMessage({\n type: 'welcome',\n protocolVersion: message.protocolVersion,\n serverId: 'local-runner',\n authenticated: true,\n userId: 'local-user'\n });\n }\n\n private handleCreateSession(message: CreateSessionMessage): void {\n const sessionId = this.generateId('session');\n const sessionConfig: SessionConfig = {\n metadata: message.metadata\n };\n\n const session = this.sessionManager.createSession(sessionId, sessionConfig);\n\n this.notifyMessage({\n type: 'sessionCreated',\n sessionId: session.sessionId,\n expiresAt: session.expiresAt\n });\n }\n\n private handleGetCapabilities(): void {\n // Get default capabilities, can be overridden by session\n const capabilities: GraphRunnerCapabilities = {\n trace: true,\n validation: true,\n graphRegistry: false,\n eventFiltering: false,\n batchOperations: false,\n runHistory: false,\n runtimeMetadata: true,\n maxConcurrentRuns: 10,\n realtime: true,\n maxConcurrentDynamicRuns: 10,\n updateGranularity: 'socket'\n };\n\n this.notifyMessage({\n type: 'capabilities',\n capabilities\n });\n }\n\n private handleGetServerVariables(_message: {\n type: 'getServerVariables';\n sessionId: string;\n }): void {\n handleGetServerVariables(this.variables, {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, msg, details) => this.sendError(code, msg, details)\n });\n }\n\n private handleGetServerEvents(_message: {\n type: 'getServerEvents';\n sessionId: string;\n }): void {\n handleGetServerEvents(this.serverEvents, {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, msg, details) => this.sendError(code, msg, details)\n });\n }\n\n private handleGetSocketConstraints(\n message: GetSocketConstraintsMessage\n ): void {\n handleGetSocketConstraints(\n { nodeType: message.nodeType, socketName: message.socketName },\n this.registry,\n {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, msg, details) => this.sendError(code, msg, details)\n }\n );\n }\n\n private handleGetNodeTypes(_message: GetNodeTypesMessage): void {\n handleGetNodeTypes(this.registry, {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, msg, details) => this.sendError(code, msg, details)\n });\n }\n\n private async handleRunGraph(message: RunGraphMessage): Promise<void> {\n const runId = this.generateId('run');\n\n try {\n // Get session for this run\n const session = this.sessionManager.getSession(message.sessionId);\n if (!session) {\n this.sendError('SESSION_NOT_FOUND', 'Session not found', {\n runId,\n graphId: message.graphId\n });\n return;\n }\n\n if (!message.graph) {\n this.sendError('INVALID_GRAPH', 'Graph not provided', {\n runId,\n graphId: message.graphId\n });\n return;\n }\n\n // Create transport logger that forwards log messages to the client\n const transportLogger = this.createTransportLogger(\n runId,\n message.graphId\n );\n\n // Ensure lifecycle event emitter and logger are available in registry\n let registryToUse = this.registry;\n\n // Apply session registry overrides if provided\n if (session.config.registryOverrides) {\n registryToUse = {\n ...registryToUse,\n ...session.config.registryOverrides\n };\n }\n\n if (\n !registryToUse.dependencies?.ILifecycleEventEmitter ||\n !registryToUse.dependencies?.ILogger\n ) {\n // Create a new registry with required dependencies injected\n registryToUse = {\n ...registryToUse,\n dependencies: {\n ...registryToUse.dependencies,\n ILifecycleEventEmitter:\n registryToUse.dependencies?.ILifecycleEventEmitter ||\n new ManualLifecycleEventEmitter(),\n ILogger: transportLogger\n }\n };\n } else {\n // Replace the existing logger with the transport logger\n registryToUse = {\n ...registryToUse,\n dependencies: {\n ...registryToUse.dependencies,\n ILogger: transportLogger\n }\n };\n }\n\n // Parse graph with registry that has lifecycle event emitter\n const graphInstance = readGraphFromJSON({\n graphJson: message.graph,\n registry: registryToUse\n });\n\n // Validate graph\n const errors = validateGraph(graphInstance);\n if (errors.length > 0) {\n this.sendError('VALIDATION_FAILED', errors.join('; '), {\n runId,\n graphId: message.graphId\n });\n return;\n }\n\n // Create engine - it will now have access to lifecycle event emitter through graph instance\n const engine = new Engine(graphInstance, registryToUse);\n\n // Merge execution options: message options override session defaults\n const executionOptions = {\n ...session.config.defaultExecutionOptions,\n ...message.options\n };\n\n // Create run record\n const run: ActiveRun = {\n runId,\n sessionId: message.sessionId,\n graphId: message.graphId,\n\n engine,\n graphInstance,\n registry: registryToUse,\n status: 'running',\n startedAt: Date.now(),\n performance: {\n nodesExecuted: 0,\n eventsEmitted: 0,\n variableChanges: 0\n },\n isPaused: false,\n executionPhase: 'start',\n currentTick: 0,\n maxTicks: Infinity // No limit - tick events run until stopped\n };\n\n this.activeRuns.set(runId, run);\n this.sessionManager.addRunToSession(message.sessionId, runId);\n\n // Call session hook for run started\n if (session.config.hooks?.onRunStarted) {\n await session.config.hooks.onRunStarted(\n session,\n runId,\n message.graphId\n );\n }\n\n // Send run started\n this.notifyMessage({\n type: 'runStarted',\n runId,\n graphId: message.graphId,\n startedAt: run.startedAt\n });\n\n // Update store state\n this.updateStoreActiveRuns();\n this.updateStoreExecutionState(true, false);\n\n // Set up variable change tracking\n setupVariableChangeTracking(run, message.graphId, {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, msg, details) => this.sendError(code, msg, details)\n });\n\n // Set up tracing\n if (executionOptions.trace) {\n engine.onNodeExecutionStart.addListener((node) => {\n run.performance.nodesExecuted++;\n this.notifyMessage({\n type: 'trace',\n runId,\n graphId: message.graphId,\n nodeId: node.id,\n event: 'start',\n data: { typeName: node.description.typeName },\n timestamp: Date.now() - run.startedAt\n });\n });\n\n engine.onNodeExecutionEnd.addListener((node) => {\n this.notifyMessage({\n type: 'trace',\n runId,\n graphId: message.graphId,\n nodeId: node.id,\n event: 'end',\n data: { typeName: node.description.typeName },\n timestamp: Date.now() - run.startedAt\n });\n });\n }\n\n // Execute graph asynchronously\n const autoEnd = executionOptions.autoEnd ?? true;\n this.executeGraph(run, message.graphId, autoEnd, session);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Get session for error hook\n const session = this.sessionManager.getSession(message.sessionId);\n if (session?.config.hooks?.onRunError) {\n await session.config.hooks.onRunError(\n session,\n runId,\n message.graphId,\n error instanceof Error ? error : new Error(errorMessage)\n );\n }\n\n this.sendError('NODE_EXECUTION_ERROR', errorMessage, {\n runId,\n graphId: message.graphId\n });\n }\n }\n\n private async executeGraph(\n run: ActiveRun,\n graphId: string,\n autoEnd: boolean,\n session: Session\n ): Promise<void> {\n try {\n // Get lifecycle event emitter from the registry dependencies\n const eventEmitter = run.registry.dependencies?.ILifecycleEventEmitter as\n | ILifecycleEventEmitter\n | undefined;\n\n // Execute start event\n if (run.executionPhase === 'start') {\n if (\n eventEmitter?.startEvent &&\n eventEmitter.startEvent.listenerCount > 0\n ) {\n eventEmitter.startEvent.emit();\n await this.executeWithPauseSupport(run);\n }\n run.executionPhase = 'tick';\n }\n\n // Execute tick events (runs indefinitely until stopped)\n if (run.executionPhase === 'tick') {\n if (\n eventEmitter?.tickEvent &&\n eventEmitter.tickEvent.listenerCount > 0\n ) {\n // Get tick strategy hook or create default\n const tickStrategy =\n session.config.tickStrategy ||\n this.createSleepTickStrategy(\n session.config.executionSettings?.tickInterval ??\n this.getTickInterval()\n );\n\n while (!run.isPaused && run.status === 'running') {\n eventEmitter.tickEvent.emit();\n await this.executeWithPauseSupport(run);\n run.currentTick++;\n\n if (run.isPaused || run.status !== 'running') {\n return; // Exit early if paused or stopped\n }\n\n // Call the tick strategy hook to handle timing\n await tickStrategy();\n }\n } else {\n // No tick event listeners, move to end phase\n run.executionPhase = 'end';\n }\n }\n\n // Execute end event\n if (run.executionPhase === 'end' && !run.isPaused) {\n if (eventEmitter?.endEvent && eventEmitter.endEvent.listenerCount > 0) {\n eventEmitter.endEvent.emit();\n await this.executeWithPauseSupport(run);\n }\n run.executionPhase = 'completed';\n }\n\n // Only complete if not paused\n if (!run.isPaused && !autoEnd) {\n // Run completed successfully\n run.status = 'completed';\n const elapsedMs = Date.now() - run.startedAt;\n const result = null; // Placeholder for result\n\n // Call session hook for run completed\n if (session.config.hooks?.onRunCompleted) {\n await session.config.hooks.onRunCompleted(\n session,\n run.runId,\n graphId,\n result\n );\n }\n\n this.notifyMessage({\n type: 'completed',\n runId: run.runId,\n graphId,\n completedAt: Date.now(),\n elapsedMs,\n result,\n performance: run.performance\n });\n\n // Cleanup\n run.engine.dispose();\n this.activeRuns.delete(run.runId);\n this.sessionManager.removeRunFromSession(run.sessionId, run.runId);\n this.updateStoreActiveRuns();\n this.updateStoreExecutionState(false, false);\n }\n } catch (error) {\n run.status = 'error';\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n // Call session hook for run error\n if (session.config.hooks?.onRunError) {\n await session.config.hooks.onRunError(\n session,\n run.runId,\n graphId,\n error instanceof Error ? error : new Error(errorMessage)\n );\n }\n\n this.sendError('NODE_EXECUTION_ERROR', errorMessage, {\n runId: run.runId,\n graphId\n });\n\n run.engine.dispose();\n this.activeRuns.delete(run.runId);\n this.sessionManager.removeRunFromSession(run.sessionId, run.runId);\n this.updateStoreActiveRuns();\n this.updateStoreExecutionState(false, false);\n }\n }\n\n /**\n * Execute engine with pause support - executes one step at a time with configurable delay\n */\n private async executeWithPauseSupport(run: ActiveRun): Promise<void> {\n const session = this.sessionManager.getSession(run.sessionId);\n\n // Get settings from session, fallback to store\n const stepDelay =\n session?.config.executionSettings?.stepDelay ??\n this.store?.getState().stepDelay ??\n 0;\n const executionSpeed =\n session?.config.executionSettings?.executionSpeed ??\n this.store?.getState().executionSpeed ??\n 1.0;\n\n const stepLimit = this.getExecutionStepLimit();\n const delay =\n stepDelay + (executionSpeed < 1.0 ? (1.0 - executionSpeed) * 100 : 0);\n\n // Loop while engine has pending work and not paused\n while (run.engine.hasPending() && !run.isPaused) {\n // Execute limited number of steps\n await run.engine.executeAllAsync(5, stepLimit);\n\n // Apply delay between successive calls\n if (delay > 0 && run.engine.hasPending() && !run.isPaused) {\n await sleep(delay / 1000);\n }\n }\n }\n\n /**\n * Pause execution of a running graph\n */\n public pauseExecution(runId: string): void {\n const run = this.activeRuns.get(runId);\n if (!run) {\n this.updateStoreExecutionState(true, true);\n throw new Error(`Run not found: ${runId}`);\n }\n run.isPaused = true;\n run.status = 'running'; // Keep as running but paused\n }\n\n /**\n * Resume execution of a paused graph\n */\n public async resumeExecution(runId: string): Promise<void> {\n this.updateStoreExecutionState(true, false);\n const run = this.activeRuns.get(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n const session = this.sessionManager.getSession(run.sessionId);\n if (!session) {\n throw new Error(`Session not found: ${run.sessionId}`);\n }\n\n run.isPaused = false;\n // Continue execution from where we left off\n await this.executeGraph(run, run.graphId, true, session);\n }\n\n /**\n * Step forward one execution step\n */\n public async stepExecution(runId: string): Promise<void> {\n const run = this.activeRuns.get(runId);\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n\n const eventEmitter = run.registry.dependencies?.ILifecycleEventEmitter as\n | ILifecycleEventEmitter\n | undefined;\n\n // Execute one step based on current phase\n if (run.executionPhase === 'start') {\n if (\n eventEmitter?.startEvent &&\n eventEmitter.startEvent.listenerCount > 0\n ) {\n eventEmitter.startEvent.emit();\n }\n // Execute one fiber step\n await run.engine.executeAllSync(5, 1);\n\n // Check if we should move to next phase\n if (!run.engine.hasPending()) {\n run.executionPhase = 'tick';\n }\n } else if (run.executionPhase === 'tick') {\n if (run.currentTick < run.maxTicks) {\n if (\n eventEmitter?.tickEvent &&\n eventEmitter.tickEvent.listenerCount > 0 &&\n !run.engine.hasPending()\n ) {\n eventEmitter.tickEvent.emit();\n }\n // Execute one fiber step\n await run.engine.executeAllSync(5, 1);\n\n // Check if current tick is done\n if (!run.engine.hasPending()) {\n run.currentTick++;\n if (run.currentTick >= run.maxTicks) {\n run.executionPhase = 'end';\n }\n }\n } else {\n run.executionPhase = 'end';\n }\n } else if (run.executionPhase === 'end') {\n if (\n eventEmitter?.endEvent &&\n eventEmitter.endEvent.listenerCount > 0 &&\n !run.engine.hasPending()\n ) {\n eventEmitter.endEvent.emit();\n }\n // Execute one fiber step\n await run.engine.executeAllSync(5, 1);\n\n // Check if we're done\n if (!run.engine.hasPending()) {\n run.executionPhase = 'completed';\n\n // Run completed successfully\n run.status = 'completed';\n const elapsedMs = Date.now() - run.startedAt;\n const result = null;\n\n // Call session hook for run completed\n const session = this.sessionManager.getSession(run.sessionId);\n if (session?.config.hooks?.onRunCompleted) {\n await session.config.hooks.onRunCompleted(\n session,\n run.runId,\n run.graphId,\n result\n );\n }\n\n this.notifyMessage({\n type: 'completed',\n runId: run.runId,\n graphId: run.graphId,\n completedAt: Date.now(),\n elapsedMs,\n result,\n performance: run.performance\n });\n\n // Cleanup\n run.engine.dispose();\n this.activeRuns.delete(run.runId);\n this.sessionManager.removeRunFromSession(run.sessionId, run.runId);\n }\n }\n }\n\n /**\n * Check if a run is currently paused\n */\n public isPaused(runId: string): boolean {\n const run = this.activeRuns.get(runId);\n return run?.isPaused ?? false;\n }\n\n private handleStopGraph(message: StopGraphMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', 'Run not found', {\n runId: message.runId\n });\n return;\n }\n\n run.status = 'stopped';\n this.updateStoreActiveRuns();\n this.updateStoreExecutionState(false, false);\n run.engine.dispose();\n this.activeRuns.delete(message.runId);\n this.sessionManager.removeRunFromSession(run.sessionId, message.runId);\n\n this.notifyMessage({\n type: 'stopped',\n runId: message.runId,\n graphId: run.graphId,\n reason: 'User requested stop'\n });\n }\n\n private handleGetStatus(message: GetStatusMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', 'Run not found', {\n runId: message.runId\n });\n return;\n }\n\n const elapsedMs = Date.now() - run.startedAt;\n\n this.notifyMessage({\n type: 'status',\n runId: run.runId,\n graphId: run.graphId,\n status: run.status,\n startedAt: run.startedAt,\n elapsedMs,\n performance: run.performance,\n startedGraphs: []\n });\n }\n\n private async handleCloseSession(\n message: CloseSessionMessage\n ): Promise<void> {\n const session = this.sessionManager.getSession(message.sessionId);\n\n if (session) {\n // Clean up all runs in this session\n for (const run of this.activeRuns.values()) {\n if (run.sessionId === message.sessionId) {\n run.engine.dispose();\n this.activeRuns.delete(run.runId);\n }\n }\n\n this.updateStoreActiveRuns();\n this.updateStoreExecutionState(false, false);\n\n // Close the session (calls session hooks)\n await this.sessionManager.closeSession(message.sessionId);\n }\n\n this.notifyMessage({\n type: 'sessionClosed',\n sessionId: message.sessionId\n });\n }\n\n private sendError(\n code: string,\n message: string,\n details?: Record<string, unknown>\n ): void {\n this.notifyMessage({\n type: 'error',\n code: code as any,\n message,\n ...details\n });\n }\n\n // Realtime modification handlers\n\n private handleAddNode(message: AddNodeMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n try {\n run.graphInstance.nodes[message.nodeId] = createNode({\n id: message.nodeId,\n nodeTypeName: message.nodeType,\n nodeConfiguration: message.nodeData?.configuration || {},\n registry: run.registry,\n graph: makeGraphApi({\n ...run.registry,\n variables: run.graphInstance.variables,\n customEvents: run.graphInstance.customEvents\n })\n });\n\n this.notifyMessage({\n type: 'nodeAdded',\n runId: message.runId,\n graphId: run.graphId,\n nodeId: message.nodeId,\n nodeType: message.nodeType,\n nodeData: message.nodeData\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to add node: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private handleRemoveNode(message: RemoveNodeMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n const node = run.graphInstance.nodes?.[message.nodeId];\n if (!node) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Node ${message.nodeId} not found in graph`\n );\n return;\n }\n\n try {\n // Clean up links connected to this node's sockets\n for (const socket of [...(node.inputs || []), ...(node.outputs || [])]) {\n // Clear all links by removing them one by one\n while (socket.links.length > 0) {\n socket.links.pop();\n }\n }\n\n // Also clean up links pointing TO this node from other nodes\n for (const otherNode of Object.values(run.graphInstance.nodes || {})) {\n if (otherNode && otherNode !== node) {\n for (const inputSocket of otherNode.inputs || []) {\n for (let i = inputSocket.links.length - 1; i >= 0; i--) {\n const link = inputSocket.links[i];\n if (link && link.nodeId === message.nodeId) {\n inputSocket.links.splice(i, 1);\n }\n }\n }\n }\n }\n\n // Remove the node from the graph\n delete run.graphInstance.nodes[message.nodeId];\n\n // Notify client\n this.notifyMessage({\n type: 'nodeRemoved',\n runId: message.runId,\n graphId: run.graphId,\n nodeId: message.nodeId\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to remove node: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private handleUpdateSocketValue(message: UpdateSocketValueMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n const node = run.graphInstance.nodes?.[message.nodeId];\n if (!node) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Node ${message.nodeId} not found in graph`\n );\n return;\n }\n\n try {\n // Find the socket by name\n const socket = node.inputs.find((s) => s.name === message.socketName);\n if (!socket) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Socket ${message.socketName} not found on node`\n );\n return;\n }\n\n // Update the socket value\n socket.value = message.value;\n\n // Notify about the change\n this.notifyMessage({\n type: 'trace',\n runId: message.runId,\n graphId: run.graphId,\n nodeId: message.nodeId,\n event: 'socketUpdated',\n data: { socketName: message.socketName, value: message.value },\n timestamp: Date.now() - run.startedAt\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to update socket: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private handleUpdateNodeParam(message: UpdateNodeParamMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n const node = run.graphInstance.nodes?.[message.nodeId];\n if (!node) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Node ${message.nodeId} not found in graph`\n );\n return;\n }\n\n try {\n // Store old value for delta\n const oldValue = node.configuration[message.paramName];\n\n // Update the parameter\n node.configuration[message.paramName] = message.value;\n\n // Notify about the change\n this.notifyMessage({\n type: 'nodeParamUpdated',\n runId: message.runId,\n graphId: run.graphId,\n nodeId: message.nodeId,\n paramName: message.paramName,\n oldValue,\n newValue: message.value\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to update parameter: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private handleCreateLink(message: CreateLinkMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n try {\n const fromNode = run.graphInstance.nodes?.[message.fromNodeId];\n const toNode = run.graphInstance.nodes?.[message.toNodeId];\n\n if (!fromNode) {\n this.sendError('NODE_EXECUTION_ERROR', `Src node not found in graph`);\n return;\n }\n if (!toNode) {\n this.sendError('NODE_EXECUTION_ERROR', `Dest node not found in graph`);\n return;\n }\n\n // Find the output socket on the source node\n const fromSocket = fromNode.outputs.find(\n (s) => s.name === message.fromSocket\n );\n if (!fromSocket) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Output socket ${message.fromSocket} not found on source node`\n );\n return;\n }\n\n // Find the input socket on the target node\n const toSocket = toNode.inputs.find((s) => s.name === message.toSocket);\n if (!toSocket) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Input socket ${message.toSocket} not found on target node`\n );\n return;\n }\n\n // Create the link\n const link = new Link(message.fromNodeId, message.fromSocket);\n toSocket.links.push(link);\n\n // Notify about the change\n this.notifyMessage({\n type: 'linkCreated',\n runId: message.runId,\n graphId: run.graphId,\n fromNodeId: message.fromNodeId,\n fromSocket: message.fromSocket,\n toNodeId: message.toNodeId,\n toSocket: message.toSocket\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to create link: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private handleRemoveLink(message: RemoveLinkMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n try {\n const toNode = run.graphInstance.nodes?.[message.toNodeId];\n if (!toNode) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Target node ${message.toNodeId} not found in graph`\n );\n return;\n }\n\n // Find the input socket on the target node\n const toSocket = toNode.inputs.find((s) => s.name === message.toSocket);\n if (!toSocket) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Input socket ${message.toSocket} not found on target node`\n );\n return;\n }\n\n // Remove the matching link\n for (let i = toSocket.links.length - 1; i >= 0; i--) {\n const link = toSocket.links[i];\n if (\n link &&\n link.nodeId === message.fromNodeId &&\n link.socketName === message.fromSocket\n ) {\n toSocket.links.splice(i, 1);\n }\n }\n\n // Notify about the change\n this.notifyMessage({\n type: 'linkRemoved',\n runId: message.runId,\n graphId: run.graphId,\n fromNodeId: message.fromNodeId,\n fromSocket: message.fromSocket,\n toNodeId: message.toNodeId,\n toSocket: message.toSocket\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to remove link: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private handleDirectExecuteNode(message: DirectExecuteNodeMessage): void {\n const run = this.activeRuns.get(message.runId);\n if (!run) {\n this.sendError('RUN_NOT_FOUND', `Run ${message.runId} not found`);\n return;\n }\n\n try {\n const node = run.graphInstance.nodes?.[message.nodeId];\n if (!node) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Node ${message.nodeId} not found in graph`\n );\n return;\n }\n\n // Find and update the input socket\n const inputSocket = node.inputs.find(\n (s) => s.name === message.inputSocketName\n );\n if (!inputSocket) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Input socket ${message.inputSocketName} not found on node`\n );\n return;\n }\n\n inputSocket.value = message.inputValue;\n\n // Get downstream nodes\n const downstreamNodes = this.getDownstreamNodes(\n message.nodeId,\n run.graphInstance\n );\n const nodesToExecute = [message.nodeId, ...downstreamNodes];\n\n // Execute the node and downstream\n this.notifyMessage({\n type: 'affectedNodes',\n runId: message.runId,\n graphId: run.graphId,\n nodeIds: nodesToExecute,\n reason: 'direct-execution'\n });\n } catch (error) {\n this.sendError(\n 'NODE_EXECUTION_ERROR',\n `Failed to execute node: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n\n private getDownstreamNodes(nodeId: string, graph: GraphInstance): string[] {\n const downstream = new Set<string>();\n const visited = new Set<string>();\n const queue = [nodeId];\n\n while (queue.length > 0) {\n const currentId = queue.shift()!;\n if (visited.has(currentId)) {\n continue;\n }\n visited.add(currentId);\n\n const currentNode = graph.nodes?.[currentId];\n if (!currentNode) {\n continue;\n }\n\n // Find all nodes that depend on this one via output socket links\n for (const outputSocket of currentNode.outputs) {\n for (const link of outputSocket.links) {\n if (!visited.has(link.nodeId)) {\n downstream.add(link.nodeId);\n queue.push(link.nodeId);\n }\n }\n }\n }\n\n return Array.from(downstream);\n }\n}\n","import { createStore } from 'zustand';\n\nexport interface LocalGraphRunnerStore {\n // Execution settings\n executionSpeed: number; // Multiplier for execution speed (1.0 = normal)\n stepDelay: number; // Delay in milliseconds between steps\n tickInterval: number; // Delay in milliseconds between tick events\n\n // Runtime state\n isExecuting: boolean;\n isPaused: boolean;\n activeRuns: number;\n\n // Actions\n setExecutionSpeed: (speed: number) => void;\n setStepDelay: (delay: number) => void;\n setTickInterval: (interval: number) => void;\n setIsExecuting: (isExecuting: boolean) => void;\n setIsPaused: (isPaused: boolean) => void;\n setActiveRuns: (count: number) => void;\n}\n\nexport const localGraphRunnerStoreFactory = () => {\n return createStore<LocalGraphRunnerStore>((set) => ({\n // Initial state\n executionSpeed: 1.0,\n stepDelay: 0,\n tickInterval: 50,\n isExecuting: false,\n isPaused: false,\n activeRuns: 0,\n\n // Actions\n setExecutionSpeed: (executionSpeed) => set({ executionSpeed }),\n setStepDelay: (stepDelay) => set({ stepDelay }),\n setTickInterval: (tickInterval) => set({ tickInterval }),\n setIsExecuting: (isExecuting) => set({ isExecuting }),\n setIsPaused: (isPaused) => set({ isPaused }),\n setActiveRuns: (activeRuns) => set({ activeRuns })\n }));\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/plugin/graphrunner-local/styles.module_built.css\";\nconst classes = {\"sectionTitle\":\"_9Fiycq_sectionTitle\",\"inputGroup\":\"_9Fiycq_inputGroup\",\"formField\":\"_9Fiycq_formField\",\"section\":\"_9Fiycq_section\",\"formGroup\":\"_9Fiycq_formGroup\",\"title\":\"_9Fiycq_title\",\"panel\":\"_9Fiycq_panel\",\"statusRow\":\"_9Fiycq_statusRow\",\"currentValue\":\"_9Fiycq_currentValue\",\"helpText\":\"_9Fiycq_helpText\",\"helpList\":\"_9Fiycq_helpList\",\"scrollContainer\":\"_9Fiycq_scrollContainer\",\"presetButtons\":\"_9Fiycq_presetButtons\"}\nexport default classes\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _inputGroup0 = classes[\"inputGroup\"]\nexport { _inputGroup0 as \"inputGroup\" }\n\nconst _formField0 = classes[\"formField\"]\nexport { _formField0 as \"formField\" }\n\nconst _section0 = classes[\"section\"]\nexport { _section0 as \"section\" }\n\nconst _formGroup0 = classes[\"formGroup\"]\nexport { _formGroup0 as \"formGroup\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _statusRow0 = classes[\"statusRow\"]\nexport { _statusRow0 as \"statusRow\" }\n\nconst _currentValue0 = classes[\"currentValue\"]\nexport { _currentValue0 as \"currentValue\" }\n\nconst _helpText0 = classes[\"helpText\"]\nexport { _helpText0 as \"helpText\" }\n\nconst _helpList0 = classes[\"helpList\"]\nexport { _helpList0 as \"helpList\" }\n\nconst _scrollContainer0 = classes[\"scrollContainer\"]\nexport { _scrollContainer0 as \"scrollContainer\" }\n\nconst _presetButtons0 = classes[\"presetButtons\"]\nexport { _presetButtons0 as \"presetButtons\" }\n","import { useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeLabel,\n VscodeBadge\n} from '@vscode-elements/react-elements';\n\nimport styles from './styles.module.css';\nimport { useSystem } from '@/system/index.js';\n\nexport const LocalGraphRunnerPanel = () => {\n const system = useSystem();\n const store = system.localGraphRunnerStore;\n const executionSpeed = useStore(store, (state) => state.executionSpeed);\n const stepDelay = useStore(store, (state) => state.stepDelay);\n const tickInterval = useStore(store, (state) => state.tickInterval);\n const isExecuting = useStore(store, (state) => state.isExecuting);\n const isPaused = useStore(store, (state) => state.isPaused);\n const activeRuns = useStore(store, (state) => state.activeRuns);\n\n const [speedInput, setSpeedInput] = useState(executionSpeed.toString());\n const [delayInput, setDelayInput] = useState(stepDelay.toString());\n const [tickIntervalInput, setTickIntervalInput] = useState(\n tickInterval.toString()\n );\n\n const handleSetSpeed = () => {\n const speed = parseFloat(speedInput);\n if (!isNaN(speed) && speed > 0) {\n store.getState().setExecutionSpeed(speed);\n }\n };\n\n const handleSetDelay = () => {\n const delay = parseInt(delayInput, 10);\n if (!isNaN(delay) && delay >= 0) {\n store.getState().setStepDelay(delay);\n }\n };\n\n const handleSetTickInterval = () => {\n const interval = parseInt(tickIntervalInput, 10);\n if (!isNaN(interval) && interval >= 0) {\n store.getState().setTickInterval(interval);\n }\n };\n\n const getStatusBadge = () => {\n if (isExecuting && isPaused) {\n return <VscodeBadge>Paused</VscodeBadge>;\n }\n if (isExecuting) {\n return <VscodeBadge>Running</VscodeBadge>;\n }\n return <VscodeBadge>Idle</VscodeBadge>;\n };\n\n return (\n <div className={styles.panel}>\n <div className={styles.scrollContainer}>\n <h3 className={styles.title}>Local Graph Runner</h3>\n\n {/* Status Section */}\n <div className={styles.section}>\n <div className={styles.statusRow}>\n <VscodeLabel>Status:</VscodeLabel>\n {getStatusBadge()}\n </div>\n <div className={styles.statusRow}>\n <VscodeLabel>Active Runs:</VscodeLabel>\n <span>{activeRuns}</span>\n </div>\n </div>\n\n {/* Execution Speed Controls */}\n <div className={styles.section}>\n <h4 className={styles.sectionTitle}>Execution Speed</h4>\n\n <div className={styles.formGroup}>\n <VscodeLabel>\n Speed Multiplier\n <span className={styles.helpText}>\n (0.1 = slow, 1.0 = normal, 10 = fast)\n </span>\n </VscodeLabel>\n <div className={styles.inputGroup}>\n <VscodeTextfield\n value={speedInput}\n onChange={(e: any) => setSpeedInput(e.target.value)}\n placeholder=\"1.0\"\n min={0.01}\n step={0.01}\n max={1}\n type=\"number\"\n className={styles.formField}\n />\n <VscodeButton onClick={handleSetSpeed}>Apply</VscodeButton>\n </div>\n <div className={styles.currentValue}>\n Current: {executionSpeed}x\n </div>\n </div>\n\n <div className={styles.formGroup}>\n <VscodeLabel>\n Step Delay (ms)\n <span className={styles.helpText}>\n (delay between execution steps)\n </span>\n </VscodeLabel>\n <div className={styles.inputGroup}>\n <VscodeTextfield\n value={delayInput}\n onChange={(e: any) => setDelayInput(e.target.value)}\n placeholder=\"0\"\n type=\"number\"\n className={styles.formField}\n />\n <VscodeButton onClick={handleSetDelay}>Apply</VscodeButton>\n </div>\n <div className={styles.currentValue}>Current: {stepDelay}ms</div>\n </div>\n\n <div className={styles.formGroup}>\n <VscodeLabel>\n Tick Interval (ms)\n <span className={styles.helpText}>\n (delay between tick events)\n </span>\n </VscodeLabel>\n <div className={styles.inputGroup}>\n <VscodeTextfield\n value={tickIntervalInput}\n onChange={(e: any) => setTickIntervalInput(e.target.value)}\n placeholder=\"50\"\n type=\"number\"\n className={styles.formField}\n />\n <VscodeButton onClick={handleSetTickInterval}>Apply</VscodeButton>\n </div>\n <div className={styles.currentValue}>Current: {tickInterval}ms</div>\n </div>\n\n {/* Quick Presets */}\n <div className={styles.formGroup}>\n <VscodeLabel>Quick Presets</VscodeLabel>\n <div className={styles.presetButtons}>\n <VscodeButton\n secondary\n onClick={() => {\n store.getState().setExecutionSpeed(0.1);\n store.getState().setStepDelay(500);\n store.getState().setTickInterval(1000);\n setSpeedInput('0.1');\n setDelayInput('500');\n setTickIntervalInput('1000');\n }}\n >\n Very Slow\n </VscodeButton>\n <VscodeButton\n secondary\n onClick={() => {\n store.getState().setExecutionSpeed(0.5);\n store.getState().setStepDelay(100);\n store.getState().setTickInterval(200);\n setSpeedInput('0.5');\n setDelayInput('100');\n setTickIntervalInput('200');\n }}\n >\n Slow\n </VscodeButton>\n <VscodeButton\n secondary\n onClick={() => {\n store.getState().setExecutionSpeed(1.0);\n store.getState().setStepDelay(0);\n store.getState().setTickInterval(50);\n setSpeedInput('1.0');\n setDelayInput('0');\n setTickIntervalInput('50');\n }}\n >\n Normal\n </VscodeButton>\n <VscodeButton\n secondary\n onClick={() => {\n store.getState().setExecutionSpeed(5.0);\n store.getState().setStepDelay(0);\n store.getState().setTickInterval(16);\n setSpeedInput('5.0');\n setDelayInput('0');\n setTickIntervalInput('16');\n }}\n >\n Fast\n </VscodeButton>\n </div>\n </div>\n </div>\n\n {/* Help Section */}\n <div className={styles.section}>\n <h4 className={styles.sectionTitle}>How to Use</h4>\n <ul className={styles.helpList}>\n <li>\n <strong>Speed Multiplier:</strong> Controls how fast the engine\n executes. Lower values = slower execution, good for debugging.\n </li>\n <li>\n <strong>Step Delay:</strong> Adds a delay between each execution\n step. Useful for visualizing graph execution flow.\n </li>\n <li>\n <strong>Tick Interval:</strong> Controls the delay between tick\n events (default 50ms). Lower values = faster ticks.\n </li>\n <li>\n <strong>Pause/Step:</strong> Use the toolbar buttons to pause\n execution and step through one node at a time.\n </li>\n </ul>\n </div>\n </div>\n </div>\n );\n};\n","/**\n * Local graph runner plugin for in-browser graph execution\n * Uses the local Engine instead of a remote server\n */\n\nimport type { System } from '../../system/system.js';\nimport { plugin } from '../../system/plugin.js';\nimport type { IRegistry } from '@kiberon-labs/behave-graph';\nimport { GraphRunnerClient } from '../graphrunner/client.js';\nimport { LocalTransport } from './transport.js';\nimport {\n graphRunnerClientPlugin,\n type ServerEvent,\n type ServerVariable,\n type SessionFactory\n} from '../graphrunner/index.js';\nimport { DefaultSessionFactory } from '../graphrunner/session.js';\nimport { localGraphRunnerStoreFactory } from './store.js';\nimport { LocalGraphRunnerPanel } from './panel.js';\nimport { MenuItemElement } from '../../components/menubar/menuItem.js';\nimport { ErrorBoundary } from 'react-error-boundary';\n\nexport * from './transport.js';\nexport * from './store.js';\nexport * from './panel.js';\nexport * from './types.js';\n\n/**\n * Options for the local graph runner plugin\n */\nexport interface LocalGraphRunnerPluginOptions {\n /**\n * Node registry with registered nodes, values, and dependencies.\n * Required for graph execution.\n */\n registry: IRegistry;\n variables?: ServerVariable[];\n events?: ServerEvent[];\n sessionFactory?: SessionFactory;\n\n /**\n * Custom tick strategy hook for controlling timing between tick events.\n * If not provided, defaults to requestAnimationFrame for smooth browser refresh sync.\n */\n tickStrategy?: () => Promise<void>;\n\n /**\n * Whether to skip automatic connection.\n * Default: false (will attempt to connect immediately)\n */\n skipAutoConnect?: boolean;\n\n /**\n * Whether to add the menu item to the Window menu.\n * Default: true\n */\n addMenuItem?: boolean;\n}\n\n/**\n * Default RAF-based tick strategy for smooth browser animation frame sync\n */\nconst defaultRafTickStrategy = (): Promise<void> => {\n return new Promise((resolve) => {\n requestAnimationFrame(() => resolve());\n });\n};\n\n/**\n * Plugin initialization function for local graph execution\n * Registers a GraphRunnerClient with a local transport that executes graphs in-browser\n */\nexport async function localGraphRunnerPluginLoader(\n system: System,\n options: LocalGraphRunnerPluginOptions\n): Promise<void> {\n // Create local graph runner store\n const localStore = localGraphRunnerStoreFactory();\n system.decorate('localGraphRunnerStore', localStore);\n\n // Create or use provided session factory with tick strategy\n const tickStrategy = options.tickStrategy ?? defaultRafTickStrategy;\n const sessionFactory =\n options.sessionFactory ??\n new DefaultSessionFactory({\n tickStrategy\n });\n\n // Create local transport with access to the node registry and store\n const transport = new LocalTransport(options.registry, {\n ...options,\n store: localStore,\n sessionFactory\n });\n\n // Create client with the local transport and message activity tracking\n const client = new GraphRunnerClient({\n transport,\n protocolVersion: '1.0.0',\n auth: { type: 'none' },\n onMessageActivity: (direction, message) => {\n // Access the store from the system after it's registered\n const graphRunnerStore = system.runner.store;\n if (graphRunnerStore) {\n graphRunnerStore.getState().addMessageActivity(direction, message);\n }\n }\n });\n\n // Register the graph runner client plugin\n // This will create the graphRunnerClientStore and decorate it on the system\n system.registerPlugin(graphRunnerClientPlugin, {\n client\n });\n\n // Register the local graph runner panel\n system.tabLoader.register('localGraphRunner', () => {\n return {\n id: 'localGraphRunner',\n closable: true,\n title: 'Local Graph Runner',\n group: 'default',\n content: () => (\n <ErrorBoundary\n fallback={<div>Error loading Local Graph Runner panel</div>}\n >\n <LocalGraphRunnerPanel />\n </ErrorBoundary>\n )\n };\n });\n\n // Add menu item to Window menu (unless disabled)\n if (options.addMenuItem !== false) {\n const menuStore = system.menubarStore;\n const currentItems = menuStore.getState().items;\n const windowMenu = currentItems.find((menu) => menu.name === 'window');\n\n if (windowMenu) {\n // Add the Local Graph Runner menu item to the Window menu\n const newMenuItem = {\n name: 'localGraphRunner',\n render: function LocalGraphRunnerMenuItem() {\n return (\n <MenuItemElement\n onClick={() =>\n system.tabStore.getState().openTab('localGraphRunner')\n }\n key=\"localGraphRunner\"\n >\n Local Graph Runner\n </MenuItemElement>\n );\n }\n };\n\n menuStore\n .getState()\n .setSubMenuItems('window', [...windowMenu.items, newMenuItem]);\n }\n }\n}\n\nexport const localGraphRunnerPlugin = plugin(localGraphRunnerPluginLoader, {\n name: 'graphrunner-local'\n});\n"],"mappings":"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A,UACA,UACM;AACN,OAAK,KAAK;GACR,MAAM;GACN;GACA;GACA;GACA;GACA;GACD,CAAC;;CAGJ,MAAM,cAAc,SAUlB;AACA,OAAK,eAAe;AAOpB,UANiB,MAAM,KAAK,QAAQ;GAClC,MAAM;GACN,WAAW,KAAK;GAChB,OAAO,SAAS;GAChB,SAAS,SAAS;GACnB,CAAC,EACc;;CAKlB,QACE,OACA,QACA,UACA,UACA,UACM;AACN,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACA;GACA;GACA;GACD,CAAC;;CAGJ,WAAW,OAAe,QAAsB;AAC9C,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACD,CAAC;;CAGJ,kBACE,OACA,QACA,YACA,OACM;AACN,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACA;GACA;GACD,CAAC;;CAGJ,gBACE,OACA,QACA,WACA,OACM;AACN,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACA;GACA;GACD,CAAC;;CAGJ,WACE,OACA,YACA,YACA,UACA,UACM;AACN,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACA;GACA;GACA;GACD,CAAC;;CAGJ,WACE,OACA,YACA,YACA,UACA,UACM;AACN,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACA;GACA;GACA;GACD,CAAC;;CAGJ,kBACE,OACA,QACA,iBACA,YACA,eAAkC,WAC5B;AACN,OAAK,eAAe;AACpB,OAAK,KAAK;GACR,MAAM;GACN,WAAW,KAAK;GAChB;GACA;GACA;GACA;GACA;GACD,CAAC;;CAGJ,GACE,aACA,SACM;AACN,MAAI,CAAC,KAAK,gBAAgB,IAAI,YAAY,CACxC,MAAK,gBAAgB,IAAI,6BAAa,IAAI,KAAK,CAAC;AAElD,OAAK,gBAAgB,IAAI,YAAY,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"}