@kiberon-labs/behave-graph-flow 1.0.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.fallowrc.json +16 -0
- package/.storybook/main.ts +32 -0
- package/.storybook/manager.ts +6 -0
- package/.storybook/preview.ts +64 -0
- package/.storybook/styles.css +16 -0
- package/.turbo/turbo-build.log +7 -0
- package/CHANGELOG.md +368 -0
- package/LICENSE +6 -0
- package/README.md +2 -2
- package/data/Polynomial.json +510 -0
- package/data/sequence.json +337 -0
- package/data/trigger-event.json +241 -0
- package/data/variable-change.json +210 -0
- package/dist/AnyControlImpl-Ds-CShIB.js +20 -0
- package/dist/AnyControlImpl-Ds-CShIB.js.map +1 -0
- package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js +166 -0
- package/dist/DocumentationBrowserPanelImpl-deZNzFX8.js.map +1 -0
- package/dist/entry.css +4 -0
- package/dist/index.css +42 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +3597 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18009 -0
- package/dist/index.js.map +1 -0
- package/dist/noteImpl-KkrrWgJd.js +242 -0
- package/dist/noteImpl-KkrrWgJd.js.map +1 -0
- package/dist/styles.module-CvmpDkZj.css +3 -0
- package/dist/styles.module-CvmpDkZj.css.map +1 -0
- package/dist/styles.module-DZxg8aW9.js +271 -0
- package/dist/styles.module-DZxg8aW9.js.map +1 -0
- package/dist/useChangeNodeData-ChQGK7AI.js +23 -0
- package/dist/useChangeNodeData-ChQGK7AI.js.map +1 -0
- package/docs/notifications.md +246 -0
- package/docs/protocol.md +702 -0
- package/docs/specifics.md +191 -0
- package/package.json +82 -22
- package/postcss.config.ts +3 -4
- package/src/annotations/index.ts +32 -0
- package/src/components/FloatingToolbar/index.module.css +37 -0
- package/src/components/FloatingToolbar/index.tsx +256 -0
- package/src/components/Flow.tsx +287 -75
- package/src/components/contextMenus/DynamicContextMenu.tsx +85 -0
- package/src/components/contextMenus/NodePicker.module.css +274 -0
- package/src/components/contextMenus/NodePicker.tsx +481 -0
- package/src/components/contextMenus/edge.tsx +22 -0
- package/src/components/contextMenus/node.tsx +15 -0
- package/src/components/contextMenus/selection.tsx +11 -0
- package/src/components/controls/any/AnyControlImpl.tsx +14 -0
- package/src/components/controls/any/index.tsx +19 -0
- package/src/components/controls/boolean/index.tsx +13 -0
- package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
- package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
- package/src/components/controls/colorPicker/index.module.css +18 -0
- package/src/components/controls/colorPicker/index.tsx +61 -0
- package/src/components/controls/number/index.tsx +35 -0
- package/src/components/controls/string/index.tsx +16 -0
- package/src/components/edges/index.tsx +475 -0
- package/src/components/edges/offsetBezier.ts +134 -0
- package/src/components/hotKeys.tsx +20 -0
- package/src/components/layoutController/index.module.css +13 -0
- package/src/components/layoutController/index.tsx +140 -0
- package/src/components/layoutController/utils.ts +248 -0
- package/src/components/menubar/defaults.tsx +516 -0
- package/src/components/menubar/index.tsx +49 -0
- package/src/components/menubar/menuItem.module.css +31 -0
- package/src/components/menubar/menuItem.tsx +65 -0
- package/src/components/nodes/behave/Node.module.css +23 -0
- package/src/components/nodes/behave/Node.tsx +176 -0
- package/src/components/nodes/behave/NodeContainer.module.css +88 -0
- package/src/components/nodes/behave/NodeContainer.tsx +46 -0
- package/src/components/nodes/behave/index.tsx +14 -0
- package/src/components/nodes/group/index.tsx +109 -0
- package/src/components/nodes/wrapper/index.tsx +73 -0
- package/src/components/nodes/wrapper/styles.module.css +87 -0
- package/src/components/notifications/NotificationProvider.tsx +81 -0
- package/src/components/notifications/index.ts +2 -0
- package/src/components/notifications/utils.ts +71 -0
- package/src/components/panels/alignment/index.module.css +10 -0
- package/src/components/panels/alignment/index.tsx +244 -0
- package/src/components/panels/base/index.tsx +5 -0
- package/src/components/panels/base/styles.module.css +12 -0
- package/src/components/panels/common/PanelHeader.module.css +24 -0
- package/src/components/panels/common/PanelHeader.tsx +22 -0
- package/src/components/panels/common/SectionTitle.module.css +13 -0
- package/src/components/panels/common/SectionTitle.tsx +10 -0
- package/src/components/panels/events/EditEventPanel.tsx +324 -0
- package/src/components/panels/events/ManageEventsPanel.tsx +101 -0
- package/src/components/panels/events/index.tsx +23 -0
- package/src/components/panels/events/styles.module.css +178 -0
- package/src/components/panels/graphProperties/index.tsx +125 -0
- package/src/components/panels/history/index.tsx +92 -0
- package/src/components/panels/history/styles.module.css +97 -0
- package/src/components/panels/keymaps/index.module.css +68 -0
- package/src/components/panels/keymaps/index.tsx +166 -0
- package/src/components/panels/layers/index.tsx +245 -0
- package/src/components/panels/layers/styles.module.css +107 -0
- package/src/components/panels/legend/index.module.css +6 -0
- package/src/components/panels/legend/index.tsx +76 -0
- package/src/components/panels/logs/index.module.css +218 -0
- package/src/components/panels/logs/index.tsx +288 -0
- package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
- package/src/components/panels/nodeInputs/InputsGroup.tsx +65 -0
- package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
- package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
- package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
- package/src/components/panels/nodeInputs/OutputsGroup.tsx +55 -0
- package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
- package/src/components/panels/nodeInputs/index.module.css +308 -0
- package/src/components/panels/nodeInputs/index.tsx +349 -0
- package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
- package/src/components/panels/nodeInputs/useNodeInputsData.ts +153 -0
- package/src/components/panels/nodePicker/index.tsx +115 -0
- package/src/components/panels/panel/index.module.css +66 -0
- package/src/components/panels/panel/index.tsx +88 -0
- package/src/components/panels/search/index.module.css +16 -0
- package/src/components/panels/search/index.tsx +215 -0
- package/src/components/panels/systemSettings/ConversionsSettings.tsx +203 -0
- package/src/components/panels/systemSettings/index.tsx +251 -0
- package/src/components/panels/systemSettings/styles.module.css +138 -0
- package/src/components/panels/traces/GridLines.tsx +38 -0
- package/src/components/panels/traces/TimeGrid.tsx +48 -0
- package/src/components/panels/traces/TraceLane.tsx +62 -0
- package/src/components/panels/traces/TraceTooltip.tsx +22 -0
- package/src/components/panels/traces/TracesHeader.tsx +56 -0
- package/src/components/panels/traces/index.module.css +159 -0
- package/src/components/panels/traces/index.tsx +298 -0
- package/src/components/panels/traces/types.ts +48 -0
- package/src/components/panels/traces/useDerivedSpans.ts +307 -0
- package/src/components/panels/traces/utils.ts +33 -0
- package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
- package/src/components/panels/variables/ManageVariablesScreen.tsx +147 -0
- package/src/components/panels/variables/index.tsx +125 -0
- package/src/components/panels/variables/styles.module.css +149 -0
- package/src/components/primitives/icon.module.css +45 -0
- package/src/components/primitives/icon.tsx +38 -0
- package/src/components/sockets/input/index.tsx +83 -0
- package/src/components/sockets/input/styles.module.css +26 -0
- package/src/components/sockets/output/index.tsx +68 -0
- package/src/components/sockets/output/styles.module.css +22 -0
- package/src/css/notes.css +135 -0
- package/src/css/prosemirror.css +57 -0
- package/src/css/rc-dock.css +212 -0
- package/src/css/rc-menu.css +101 -0
- package/src/css/themes/kiberon.css +127 -0
- package/src/css/vars.css +198 -0
- package/src/css/vscode-elements.css +124 -0
- package/src/entry.css +4 -0
- package/src/generators/CallSubgraphGenerator.tsx +136 -0
- package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
- package/src/generators/GraphBoundaryGenerator.module.css +32 -0
- package/src/generators/GraphBoundaryGenerator.tsx +193 -0
- package/src/generators/SequenceGenerator.tsx +104 -0
- package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
- package/src/generators/SwitchOnStringGenerator.tsx +263 -0
- package/src/generators/callSubgraphSync.ts +126 -0
- package/src/generators/registerDefaultGenerators.ts +55 -0
- package/src/generators/registerDefaults.ts +26 -0
- package/src/hooks/useBehaveGraphFlow.ts +17 -16
- package/src/hooks/useFlowHandlers.ts +154 -30
- package/src/hooks/useWasdPan.ts +210 -0
- package/src/index.css +134 -0
- package/src/index.ts +53 -18
- package/src/manifest/contributionRegistry.ts +93 -0
- package/src/manifest/index.ts +4 -0
- package/src/manifest/loadManifest.ts +82 -0
- package/src/manifest/manifestPlugin.ts +29 -0
- package/src/manifest/passthroughValueType.ts +40 -0
- package/src/plugin/alignment/index.ts +91 -0
- package/src/plugin/autosave/controller.ts +366 -0
- package/src/plugin/autosave/index.tsx +114 -0
- package/src/plugin/autosave/panel/BackupPanel.tsx +141 -0
- package/src/plugin/autosave/panel/index.tsx +1 -0
- package/src/plugin/autosave/panel/styles.module.css +56 -0
- package/src/plugin/autosave/settings.ts +65 -0
- package/src/plugin/autosave/storage.ts +147 -0
- package/src/plugin/docs/index.tsx +297 -0
- package/src/plugin/docs/panel/DocumentationBrowserPanelImpl.tsx +200 -0
- package/src/plugin/docs/panel/index.tsx +21 -0
- package/src/plugin/docs/panel/styles.module.css +174 -0
- package/src/plugin/graphrunner/actions.ts +326 -0
- package/src/plugin/graphrunner/buttons.tsx +95 -0
- package/src/plugin/graphrunner/client.ts +707 -0
- package/src/plugin/graphrunner/index.tsx +184 -0
- package/src/plugin/graphrunner/panel.tsx +386 -0
- package/src/plugin/graphrunner/runController.ts +283 -0
- package/src/plugin/graphrunner/runner.ts +187 -0
- package/src/plugin/graphrunner/session.ts +243 -0
- package/src/plugin/graphrunner/store.ts +196 -0
- package/src/plugin/graphrunner/styles.module.css +171 -0
- package/src/plugin/graphrunner/transport.ts +250 -0
- package/src/plugin/graphrunner/types.ts +693 -0
- package/src/plugin/graphrunner-local/execution-utils.ts +637 -0
- package/src/plugin/graphrunner-local/index.tsx +172 -0
- package/src/plugin/graphrunner-local/panel.tsx +187 -0
- package/src/plugin/graphrunner-local/store.ts +41 -0
- package/src/plugin/graphrunner-local/styles.module.css +82 -0
- package/src/plugin/graphrunner-local/transport.ts +1339 -0
- package/src/plugin/graphrunner-local/types.ts +10 -0
- package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +635 -0
- package/src/plugin/graphrunner-webworker/index.tsx +140 -0
- package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
- package/src/plugin/graphrunner-webworker/store.ts +98 -0
- package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
- package/src/plugin/kitchen-sink/index.ts +38 -0
- package/src/plugin/layout/dagre.ts +131 -0
- package/src/plugin/layout/elk.ts +216 -0
- package/src/plugin/layout/index.ts +80 -0
- package/src/plugin/notes/FormatToolbar.tsx +200 -0
- package/src/plugin/notes/index.tsx +191 -0
- package/src/plugin/notes/nodeActions.ts +100 -0
- package/src/plugin/notes/note.tsx +20 -0
- package/src/plugin/notes/noteImpl.tsx +89 -0
- package/src/plugin/realtime/realtimeRunner.ts +624 -0
- package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
- package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
- package/src/specifics/VariableGetSpecific.tsx +110 -0
- package/src/specifics/VariableSetSpecific.tsx +110 -0
- package/src/store/actions.tsx +698 -0
- package/src/store/commands.ts +278 -0
- package/src/store/contextMenu.ts +192 -0
- package/src/store/controls.tsx +62 -0
- package/src/store/conversions.ts +47 -0
- package/src/store/documentation.tsx +69 -0
- package/src/store/events.tsx +116 -0
- package/src/store/flow.tsx +230 -0
- package/src/store/graphMeta.ts +39 -0
- package/src/store/hotKeys.tsx +364 -0
- package/src/store/layers.ts +259 -0
- package/src/store/legend.tsx +76 -0
- package/src/store/logs.ts +28 -0
- package/src/store/menubar.ts +41 -0
- package/src/store/refs.ts +84 -0
- package/src/store/registry.ts +51 -0
- package/src/store/selection.ts +22 -0
- package/src/store/settings.ts +99 -0
- package/src/store/settingsSchema.ts +210 -0
- package/src/store/socketGenerator.tsx +54 -0
- package/src/store/specific.tsx +75 -0
- package/src/store/specs.tsx +35 -0
- package/src/store/tabs.ts +282 -0
- package/src/store/toolbar.tsx +45 -0
- package/src/store/traces.ts +240 -0
- package/src/store/variables.ts +37 -0
- package/src/system/graph.ts +131 -0
- package/src/system/graphSession.ts +172 -0
- package/src/system/index.ts +6 -0
- package/src/system/notifications.ts +111 -0
- package/src/system/persistence.ts +82 -0
- package/src/system/plugin.ts +55 -0
- package/src/system/provider.tsx +86 -0
- package/src/system/pubsub.ts +323 -0
- package/src/system/system.ts +653 -0
- package/src/system/tabLoader.tsx +303 -0
- package/src/system/undoRedo.ts +103 -0
- package/src/transformers/Uigraph.ts +61 -0
- package/src/transformers/behaveToFlow.ts +16 -4
- package/src/transformers/contract.ts +87 -0
- package/src/transformers/flowToBehave.ts +40 -12
- package/src/types/NodeMetadata.ts +27 -0
- package/src/types/graph.ts +49 -0
- package/src/types/nodes.ts +50 -0
- package/src/types.ts +18 -0
- package/src/util/autoConvert.ts +200 -0
- package/src/util/colors.ts +1 -29
- package/src/util/downloadJson.ts +18 -0
- package/src/util/extractNodeMetadata.ts +16 -0
- package/src/util/getPickerFilters.ts +1 -1
- package/src/util/isBehaveNode.ts +6 -0
- package/src/util/isValidConnection.ts +51 -17
- package/src/util/mergeSockets.ts +29 -0
- package/src/util/serializeVariables.ts +66 -0
- package/src/util/sockets.ts +43 -0
- package/stories/apex/layoutController/example-graph.worker.ts +39 -0
- package/stories/apex/layoutController/index.stories.tsx +48 -0
- package/stories/apex/layoutController/webworker.stories.tsx +103 -0
- package/stories/apex/menubar/menubar.stories.tsx +19 -0
- package/stories/components/colorpicker/index.stories.tsx +20 -0
- package/stories/components/contextMenus/edge.stories.tsx +32 -0
- package/stories/components/contextMenus/node.stories.tsx +26 -0
- package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
- package/stories/components/controls/any/index.stories.tsx +19 -0
- package/stories/components/controls/boolean/index.stories.tsx +19 -0
- package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
- package/stories/components/controls/number/index.stories.tsx +19 -0
- package/stories/components/controls/string/index.stories.tsx +19 -0
- package/stories/components/nodes/behaveNode.stories.tsx +108 -0
- package/stories/components/panels/alignment.stories.tsx +24 -0
- package/stories/components/panels/events.stories.tsx +38 -0
- package/stories/components/panels/graphRunner.stories.tsx +317 -0
- package/stories/components/panels/history.stories.tsx +37 -0
- package/stories/components/panels/keymaps.stories.tsx +21 -0
- package/stories/components/panels/legend.stories.tsx +37 -0
- package/stories/components/panels/logs.stories.tsx +24 -0
- package/stories/components/panels/nodeInputs.stories.tsx +21 -0
- package/stories/components/panels/nodePicker.stories.tsx +37 -0
- package/stories/components/panels/panel.stories.tsx +39 -0
- package/stories/components/panels/search.stories.tsx +24 -0
- package/stories/components/panels/systemSettings.stories.tsx +26 -0
- package/stories/components/panels/traces.stories.tsx +225 -0
- package/stories/components/panels/variables.stories.tsx +24 -0
- package/stories/defaults/defaultStoryProvider.tsx +170 -0
- package/stories/defaults/systemGenerator.ts +43 -0
- package/stories/plugins/notes.stories.tsx +100 -0
- package/tests/autoConvert.test.ts +329 -0
- package/tests/autosavePlugin.test.ts +204 -0
- package/tests/callSubgraphSync.test.ts +148 -0
- package/tests/commandRegistry.test.ts +137 -0
- package/tests/components/edges/offsetBezier.test.ts +51 -0
- package/tests/components/layoutController/utils.test.ts +68 -0
- package/tests/components/panels/traces/utils.test.ts +52 -0
- package/tests/contract.test.ts +51 -0
- package/tests/contractSerialize.test.ts +62 -0
- package/tests/deriveSpans.test.ts +71 -0
- package/tests/flowToBehave.test.ts +27 -4
- package/tests/hotkeys.test.ts +79 -0
- package/tests/keepAliveLifecycle.test.ts +167 -0
- package/tests/loadManifest.test.ts +113 -0
- package/tests/noteMarkdown.test.ts +65 -0
- package/tests/notesPlugin.test.ts +162 -0
- package/tests/notifications.test.ts +87 -0
- package/tests/persistence.test.ts +51 -0
- package/tests/saveLoad.test.ts +373 -0
- package/tests/settings.test.ts +178 -0
- package/tests/traceStore.test.ts +46 -0
- package/tests/util/calculateNewEdge.test.ts +98 -0
- package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
- package/tests/util/hasPositionMetaData.test.ts +33 -0
- package/tests/util/isBehaveNode.test.ts +22 -0
- package/tests/util/isHandleConnected.test.ts +37 -0
- package/tests/util/mergeSockets.test.ts +43 -0
- package/tests/visual/README.md +64 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-localGraphRunner-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
- package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
- package/tests/visual/panels.visual.test.tsx +76 -0
- package/tests/wasdPan.test.ts +71 -0
- package/tsconfig.base.json +39 -0
- package/tsconfig.json +18 -59
- package/tsconfig.prod.json +23 -0
- package/tsdown.config.ts +15 -3
- package/typedoc.json +7 -7
- package/vite.config.js +7 -0
- package/vitest.config.ts +5 -2
- package/vitest.visual.config.ts +55 -0
- package/src/components/AutoSizeInput.tsx +0 -65
- package/src/components/Controls.tsx +0 -87
- package/src/components/InputSocket.tsx +0 -142
- package/src/components/Node.tsx +0 -68
- package/src/components/NodeContainer.tsx +0 -46
- package/src/components/NodePicker.tsx +0 -77
- package/src/components/OutputSocket.tsx +0 -58
- package/src/components/modals/ClearModal.tsx +0 -40
- package/src/components/modals/HelpModal.tsx +0 -36
- package/src/components/modals/LoadModal.tsx +0 -96
- package/src/components/modals/Modal.tsx +0 -64
- package/src/components/modals/SaveModal.tsx +0 -60
- package/src/hooks/useCustomNodeTypes.tsx +0 -31
- package/src/hooks/useGraphRunner.ts +0 -104
- package/src/hooks/useMergeMap.ts +0 -14
- package/src/hooks/useNodeSpecJson.ts +0 -20
- package/src/hooks/useQueriableDefinitions.ts +0 -22
- package/src/styles.css +0 -8
- package/tailwind.config.ts +0 -19
- package/tests/tsconfig.json +0 -10
- /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["spec","inputName","outputName","position: XYPosition","uuidv4","classes","_socket0","_hidden0","_name0","_row0","InputSocket: React.FC<InputSocketProps>","useStore","Icon","styles","categoryColorMap: Record<NodeSpecJSON['category'], string>","classes","_container0","_actions0","_header0","_content0","_title0","NodeContainer: React.FC<PropsWithChildren<NodeProps>>","styles","classes","_hidden0","_row0","_name0","useStore","Icon","styles","pair: [T | undefined, U | undefined]","inputs: SocketBase[]","outputs: SocketBase[]","classes","_controls0","_title0","_header0","_subtitle0","classNames","styles","classes","handleChange","useStore","specificNode: SpecificNode","generatorNode: SocketGeneratorNode","NodeContainer","styles","InputSocket","nodes: Node[]","edges: Edge[]","node: IBehaveNode","uuidv4","variableJson: VariableJSON","graphInputs: GraphSocketJSON[]","graphOutputs: GraphSocketJSON[]","graph: GraphJSON","nodeSpec","behaveNode: NodeJSON","useStore","graphJson","nodes","edges","uuidv4","socket","uuidv4","nextTabs: TabBase[]","defaultLayout: LayoutBase","updatedLayout: LayoutBase","floatPanel: PanelBase","floatbox: BoxBase","classes","_divider0","_list0","_label0","_description0","_empty0","_searchRow0","classes","_root0","styles","classes","_title0","styles","ConversionsSettings: React.FC","useStore","styles","styles","useStore","classes","_toolbar0","_emptyState0","_row0","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","_editorActions0","_emptyStateText0","_emptyState0","_editorHeader0","_editorFields0","_field0","_root0","useStore","styles","classes","_title0","_header0","_actions0","styles","useStore","styles","useStore","classes","_sectionTitle0","_emptyState0","_infoButton0","_panel0","_toolbar0","_inputRow0","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 }>","nextAnnotations: Record<string, any>","useStore","newHiddenInputs: Record<string, boolean>","newHiddenOutputs: Record<string, boolean>","styles","classes","_content0","_row0","partitionSelectedNodes","align","styles","classes","useStore","styles","classes","_actionCell0","_content0","_helpText0","_actionsCell0","_table0","_header0","_buttonGroup0","useStore","styles","classes","_root0","_content0","_actions0","_formField0","ManageEventsPanel: React.FC<ManageEventsPanelProps>","useStore","created: CustomEventJSON","styles","EditEventPanel: React.FC<EditEventPanelProps>","useStore","parameters","styles","classes","_subtitle0","_header0","_title0","_empty0","EMPTY: DerivedData","ticks: Tick[]","buckets: TraceSpan[][]","placed: PlacedSpan[]","stackRight: number[]","visualSpans: VisualSpan[]","laneData: LaneData[]","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","_empty0","_list0","_row0","_name0","useStore","styles","HotKeys","HotKeysComp","useStore","classes","_content0","_container0","_list0","_empty0","NodePicker: React.FC<NodePickerProps>","next: ExtendedNodeSpecJSON[]","description","groupsToRender: Array<[string, ExtendedNodeSpecJSON[]]>","styles","useStore","uuidv4","classes","_title0","_container0","_badge0","_header0","_table0","styles","classes","_list0","_title0","_header0","getAnnotatedLayerId","useStore","styles","GraphProperties: React.FC<{ session: GraphSession }>","useStore","MetadataRow: React.FC<{\n entryKey: string;\n value: any;\n onRename: (oldKey: string, newKey: string, value: any) => void;\n onValueChange: (value: string) => void;\n onRemove: () => void;\n}>","useStore","HotKeys","initial: Record<string, unknown>","DEFAULT_SETTINGS: SettingDescriptor[]","createStore","settings","sectionOrder","settings: SettingDescriptor[]","sectionOrder: string[]","classes","_label0","_root0","useStore","styles","children","useStore","useStore","MODIFIER_LABELS: Record<string, string>","KEY_LABELS: Record<string, string>","chosen: string | undefined","defaultBindings: HotkeyBinding[]","keymap: Record<string, string | string[]>","descriptions: Record<string, string>","handlers: Record<string, Handler>","commandToAction: Record<string, string>","ex: any","list: string[]","result: boolean | string","BooleanControl: React.FC<ControlProps>","NumberControl: React.FC<ControlProps>","handleChange","StringControl: React.FC<ControlProps>","classes","classes","NumberControl","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[]","change: EdgeChange","Graph","useStore","controlPoints: ControlPoint[]","NodeResizer","useStore","GroupNode","variables: Record<string, any>","nativeNodeChanges","useStore","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","layerId","nextNodeLayers: Record<string, string>","nextLayers: Record<string, Layer>","Graph","defaultPersistenceAdapter: PersistenceAdapter","resolved: PersistenceAdapter","createStore","uuidv4","plugin","settings: Record<string, any>","timer: ReturnType<typeof setTimeout> | undefined","ctx: CommandContext","data: MenuData[]","lastGroup: unknown","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","_name0","GraphBoundaryGenerator: React.FC<\n SocketGeneratorRenderProps & { kind: BoundaryKind }\n>","useStore","params: ContractParam[]","sockets: Socket[]","uuidv4","styles","CallSubgraphGenerator: React.FC<SocketGeneratorRenderProps>","useStore","inputs: ContractParam[]","outputs: ContractParam[]","classes","_panel0","_toolbar0","_buttonGroup0","FloatingToolbar: React.FC","useStore","styles","Flow: React.FC","useStore","classes","NotificationProvider: React.FC","groups: Record<string, TabGroup>","buttons: React.ReactElement[]","styles","useStore","contributionAppliers: Record<string, ContributionApplier>","values: Record<string, ValueTypeMetadata>","styles","flowDocs: NodeDocumentation[]","mathDocs: NodeDocumentation[]","logicDocs: NodeDocumentation[]","variableDocs: NodeDocumentation[]","eventDocs: NodeDocumentation[]","dagrePromise: Promise<typeof dagreNS> | undefined","positionMap: Record<string, Position>","nodes","elkPromise:\n | Promise<{ layout: (graph: ElkNode) => Promise<ElkNode> }>\n | undefined","graph: ElkNode","padding","copy: Node","uuidv4","note: INoteNode","uuidv4","AUTOSAVE_SETTINGS: SettingDescriptor[]","createStore","graph: UIGraphJSON","snapshot: BackupSnapshot","uuidv4","classes","_buttonGroup0","styles","useStore","message: ServerGraphRunnerMessage","classes","GraphRunnerPanel: React.FC<GraphRunnerPanelProps>","useStore","auth: AuthCredentials","styles","useStore","mergedConfig: SessionConfig","session: Session","buffer: TraceBatchEvent[]","flushTimer: ReturnType<typeof setTimeout> | undefined","sleep","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","graphApi: IGraphApi","run: ActiveRun","ctx: MessageContext","toSocket","styles","useStore","workerMessage: MainToWorkerMessage","useStore","styles","nextOutputs: Record<string, Record<string, unknown>>","meta: Record<string, string>","ids: string[]","updates: Array<{\n nodeId: string;\n outputName: string;\n value: unknown;\n }>"],"sources":["../src/util/getSocketsByNodeTypeAndHandleType.ts","../src/util/isHandleConnected.ts","../src/util/mergeSockets.ts","../src/util/autoConvert.ts","../src/util/isValidConnection.ts","../src/components/sockets/input/styles.module.css?css_module","../src/components/sockets/input/index.tsx","../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/util/serializeVariables.ts","../src/util/isBehaveNode.ts","../src/transformers/contract.ts","../src/transformers/flowToBehave.ts","../src/util/autoLayout.ts","../src/util/hasPositionMetaData.ts","../src/hooks/useBehaveGraphFlow.ts","../src/util/calculateNewEdge.ts","../src/util/getPickerFilters.ts","../src/hooks/useFlowHandlers.ts","../src/hooks/useWasdPan.ts","../src/store/tabs.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/common/SectionTitle.module.css?css_module","../src/components/panels/common/SectionTitle.tsx","../src/components/panels/systemSettings/ConversionsSettings.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/components/panels/common/PanelHeader.module.css?css_module","../src/components/panels/common/PanelHeader.tsx","../src/components/panels/variables/ManageVariablesScreen.tsx","../src/components/panels/variables/index.tsx","../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/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/layers/styles.module.css?css_module","../src/components/panels/layers/index.tsx","../src/components/panels/graphProperties/index.tsx","../src/system/tabLoader.tsx","../src/store/settings.ts","../src/store/settingsSchema.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/store/hotKeys.tsx","../src/system/pubsub.ts","../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/selection.ts","../src/store/registry.ts","../src/store/specs.tsx","../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/documentation.tsx","../src/store/toolbar.tsx","../src/system/notifications.ts","../src/store/conversions.ts","../src/store/commands.ts","../src/store/contextMenu.ts","../src/system/undoRedo.ts","../src/system/graph.ts","../src/components/edges/offsetBezier.ts","../src/components/edges/index.tsx","../src/components/nodes/group/index.tsx","../src/components/nodes/behave/index.tsx","../src/store/flow.tsx","../src/store/variables.ts","../src/store/refs.ts","../src/transformers/Uigraph.ts","../src/store/actions.tsx","../src/store/traces.ts","../src/store/events.tsx","../src/store/layers.ts","../src/store/logs.ts","../src/store/graphMeta.ts","../src/system/graphSession.ts","../src/util/downloadJson.ts","../src/system/persistence.ts","../src/system/system.ts","../src/system/plugin.ts","../src/components/contextMenus/DynamicContextMenu.tsx","../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/GraphBoundaryGenerator.module.css?css_module","../src/generators/GraphBoundaryGenerator.tsx","../src/generators/CallSubgraphGenerator.tsx","../src/generators/registerDefaultGenerators.ts","../src/generators/callSubgraphSync.ts","../src/generators/registerDefaults.ts","../src/components/FloatingToolbar/index.module.css?css_module","../src/components/FloatingToolbar/index.tsx","../src/components/Flow.tsx","../src/util/sleep.ts","../src/util/extractNodeMetadata.ts","../src/components/layoutController/index.module.css?css_module","../src/components/notifications/NotificationProvider.tsx","../src/components/layoutController/index.tsx","../src/manifest/passthroughValueType.ts","../src/manifest/contributionRegistry.ts","../src/manifest/loadManifest.ts","../src/manifest/manifestPlugin.ts","../src/plugin/docs/panel/index.tsx","../src/plugin/docs/index.tsx","../src/plugin/alignment/index.ts","../src/plugin/layout/dagre.ts","../src/plugin/layout/elk.ts","../src/plugin/layout/index.ts","../src/plugin/notes/note.tsx","../src/plugin/notes/nodeActions.ts","../src/plugin/notes/index.tsx","../src/plugin/autosave/storage.ts","../src/plugin/autosave/settings.ts","../src/plugin/autosave/controller.ts","../src/plugin/autosave/panel/styles.module.css?css_module","../src/plugin/autosave/panel/BackupPanel.tsx","../src/plugin/autosave/index.tsx","../src/plugin/kitchen-sink/index.ts","../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/runController.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","../src/plugin/graphrunner-webworker/worker-transport.ts","../src/plugin/graphrunner-webworker/store.ts","../src/plugin/graphrunner-webworker/panel.tsx","../src/plugin/graphrunner-webworker/index.tsx","../src/plugin/realtime/realtimeRunner.ts"],"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, Edge, Node, XYPosition } from 'reactflow';\nimport { v4 as uuidv4 } from 'uuid';\nimport { getSocketsByNodeTypeAndHandleType } from './getSocketsByNodeTypeAndHandleType.js';\nimport { mergeSockets } from './mergeSockets.js';\nimport type { ConversionRule } from '@/store/conversions';\nimport type { IBehaveNode } from '@/types/nodes.js';\n\n/**\n * Find a node spec that converts `sourceType` to `targetType` , a pure value\n * function with exactly one value input of the source type and one value output\n * of the target type, and no flow sockets (e.g. `math/toString/integer`).\n */\nexport const findConverterSpec = (\n specs: NodeSpecJSON[],\n sourceType: string,\n targetType: string\n): NodeSpecJSON | undefined =>\n specs.find((spec) => {\n const valueIns = spec.inputs.filter((i) => i.valueType !== 'flow');\n const valueOuts = spec.outputs.filter((o) => o.valueType !== 'flow');\n const hasFlow =\n spec.inputs.some((i) => i.valueType === 'flow') ||\n spec.outputs.some((o) => o.valueType === 'flow');\n return (\n !hasFlow &&\n valueIns.length === 1 &&\n valueOuts.length === 1 &&\n valueIns[0]!.valueType === sourceType &&\n valueOuts[0]!.valueType === targetType\n );\n });\n\nexport type ResolvedConverter = {\n nodeType: string;\n inputName: string;\n outputName: string;\n};\n\nconst firstValueSocketName = (\n sockets: { name: string; valueType: string }[]\n): string | undefined => sockets.find((s) => s.valueType !== 'flow')?.name;\n\n/**\n * Pick the socket that should carry a value of `valueType`: prefer one whose type\n * matches exactly (so multi-port converter nodes resolve the *right* port), then\n * fall back to the first non-flow socket for single-port nodes.\n */\nconst socketNameForType = (\n sockets: { name: string; valueType: string }[],\n valueType: string\n): string | undefined =>\n sockets.find((s) => s.valueType === valueType)?.name ??\n firstValueSocketName(sockets);\n\n/**\n * Resolve which converter to use for `from`→`to`. A registered\n * {@link ConversionRule} (e.g. from a custom profile) takes precedence; otherwise\n * fall back to scanning the specs for a generic single-in/single-out converter.\n *\n * A rule's `inputKey`/`outputKey` pin the exact ports to wire (required for\n * converter nodes with more than one input or output). When omitted they are\n * resolved by matching the port's value type to `from`/`to`.\n */\nexport const resolveConverter = (\n specs: NodeSpecJSON[],\n from: string,\n to: string,\n conversions?: ConversionRule[]\n): ResolvedConverter | undefined => {\n const rule = conversions?.find((c) => c.from === from && c.to === to);\n if (rule) {\n const spec = specs.find((s) => s.type === rule.nodeType);\n const inputName =\n rule.inputKey ?? socketNameForType(spec?.inputs ?? [], from);\n const outputName =\n rule.outputKey ?? socketNameForType(spec?.outputs ?? [], to);\n if (inputName && outputName) {\n return { nodeType: rule.nodeType, inputName, outputName };\n }\n return undefined;\n }\n\n const spec = findConverterSpec(specs, from, to);\n if (!spec) return undefined;\n const inputName = firstValueSocketName(spec.inputs);\n const outputName = firstValueSocketName(spec.outputs);\n if (!inputName || !outputName) return undefined;\n return { nodeType: spec.type, inputName, outputName };\n};\n\n/** Resolve a node socket's value type (spec sockets merged with dynamic ports). */\nconst getSocketValueType = (\n node: IBehaveNode,\n handleId: string | null | undefined,\n handleType: 'source' | 'target',\n specs: NodeSpecJSON[]\n): string | undefined => {\n if (!handleId) return undefined;\n const specSockets = getSocketsByNodeTypeAndHandleType(\n specs,\n node.data?.type,\n handleType\n );\n if (!specSockets) return undefined;\n const dynamic =\n handleType === 'source'\n ? node.data.dynamicPorts?.outputs\n : node.data.dynamicPorts?.inputs;\n const sockets = mergeSockets(specSockets, dynamic);\n return sockets.find((s) => s.name === handleId)?.valueType;\n};\n\nexport type ConverterInsertion = { node: IBehaveNode; edges: Edge[] };\n\n/**\n * If a connection joins different-but-convertible value types, build the\n * converter node and the two edges needed to splice it in between source and\n * target. Returns null when the types match, can't be resolved, or no converter\n * is registered.\n */\nexport const buildConverterInsertion = (\n connection: Connection,\n nodes: Node[],\n specs: NodeSpecJSON[],\n conversions?: ConversionRule[]\n): ConverterInsertion | null => {\n if (!connection.source || !connection.target) return null;\n\n const sourceNode = nodes.find((n) => n.id === connection.source) as\n | IBehaveNode\n | undefined;\n const targetNode = nodes.find((n) => n.id === connection.target) as\n | IBehaveNode\n | undefined;\n if (!sourceNode || !targetNode) return null;\n\n const sourceType = getSocketValueType(\n sourceNode,\n connection.sourceHandle,\n 'source',\n specs\n );\n const targetType = getSocketValueType(\n targetNode,\n connection.targetHandle,\n 'target',\n specs\n );\n if (!sourceType || !targetType) return null;\n if (sourceType === targetType) return null;\n if (sourceType === 'flow' || targetType === 'flow') return null;\n\n const converter = resolveConverter(\n specs,\n sourceType,\n targetType,\n conversions\n );\n if (!converter) return null;\n\n const { nodeType, inputName: inName, outputName: outName } = converter;\n\n const position: XYPosition = {\n x: (sourceNode.position.x + targetNode.position.x) / 2,\n y: (sourceNode.position.y + targetNode.position.y) / 2\n };\n\n const convId = uuidv4();\n const node: IBehaveNode = {\n id: convId,\n type: 'behaveNode',\n position,\n data: {\n type: nodeType,\n configuration: {},\n ports: {},\n dynamicPorts: {}\n }\n };\n\n const edges: Edge[] = [\n {\n id: uuidv4(),\n source: connection.source,\n sourceHandle: connection.sourceHandle ?? undefined,\n target: convId,\n targetHandle: inName\n },\n {\n id: uuidv4(),\n source: convId,\n sourceHandle: outName,\n target: connection.target,\n targetHandle: connection.targetHandle ?? undefined\n }\n ];\n\n return { node, edges };\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 { resolveConverter } from './autoConvert.js';\nimport type { ConversionRule } from '@/store/conversions';\nimport type { IBehaveNode } from '@/types/nodes.js';\n\nexport const isValidConnection = (\n connection: Connection,\n instance: ReactFlowInstance,\n specJSON: NodeSpecJSON[],\n options?: { autoConvert?: boolean; conversions?: ConversionRule[] }\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 if (sourceSocket.valueType === targetSocket.valueType) return true;\n\n // Different value types are allowed when auto-convert can splice in a\n // converter node (handled on connect).\n if (\n options?.autoConvert &&\n sourceSocket.valueType !== 'flow' &&\n targetSocket.valueType !== 'flow' &&\n resolveConverter(\n specJSON,\n sourceSocket.valueType,\n targetSocket.valueType,\n options.conversions\n )\n ) {\n return true;\n }\n\n return false;\n};\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/sockets/input/styles.module_built.css\";\nconst classes = {\"socket\":\"VKTv4W_socket\",\"disconnected\":\"VKTv4W_disconnected\",\"hidden\":\"VKTv4W_hidden\",\"name\":\"VKTv4W_name\",\"row\":\"VKTv4W_row\"}\nexport default classes\n\nconst _socket0 = classes[\"socket\"]\nexport { _socket0 as \"socket\" }\n\nconst _disconnected0 = classes[\"disconnected\"]\nexport { _disconnected0 as \"disconnected\" }\n\nconst _hidden0 = classes[\"hidden\"]\nexport { _hidden0 as \"hidden\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\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 label?: string;\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 label,\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 autoConvert = useStore(sys.systemSettings, (s) => s.autoConvert);\n const conversions = useStore(sys.conversionStore, (s) => s.conversions);\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}>{label ?? 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 autoConvert,\n conversions\n })\n }\n >\n <Icon />\n </Handle>\n </div>\n );\n};\n\nexport default InputSocket;\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 = {\"container\":\"o6IlGa_container\",\"actions\":\"o6IlGa_actions\",\"red\":\"o6IlGa_red\",\"green\":\"o6IlGa_green\",\"lime\":\"o6IlGa_lime\",\"purple\":\"o6IlGa_purple\",\"gray\":\"o6IlGa_gray\",\"blue\":\"o6IlGa_blue\",\"selected\":\"o6IlGa_selected\",\"header\":\"o6IlGa_header\",\"content\":\"o6IlGa_content\",\"title\":\"o6IlGa_title\",\"white\":\"o6IlGa_white\"}\nexport default classes\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n\nconst _red0 = classes[\"red\"]\nexport { _red0 as \"red\" }\n\nconst _green0 = classes[\"green\"]\nexport { _green0 as \"green\" }\n\nconst _lime0 = classes[\"lime\"]\nexport { _lime0 as \"lime\" }\n\nconst _purple0 = classes[\"purple\"]\nexport { _purple0 as \"purple\" }\n\nconst _gray0 = classes[\"gray\"]\nexport { _gray0 as \"gray\" }\n\nconst _blue0 = classes[\"blue\"]\nexport { _blue0 as \"blue\" }\n\nconst _selected0 = classes[\"selected\"]\nexport { _selected0 as \"selected\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _white0 = classes[\"white\"]\nexport { _white0 as \"white\" }\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\",\"socket\":\"yuNsAq_socket\",\"row\":\"yuNsAq_row\",\"name\":\"yuNsAq_name\"}\nexport default classes\n\nconst _hidden0 = classes[\"hidden\"]\nexport { _hidden0 as \"hidden\" }\n\nconst _socket0 = classes[\"socket\"]\nexport { _socket0 as \"socket\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\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 label?: string;\n specJSON: NodeSpecJSON[];\n} & OutputSocketSpecJSON;\n\nexport default function OutputSocket({\n specJSON,\n connected,\n hide,\n valueType,\n name,\n label\n}: OutputSocketProps) {\n const instance = useReactFlow();\n const sys = useSystem();\n const { valueTypeColors, icons, defaultIcon } = useStore(sys.legendStore);\n const autoConvert = useStore(sys.systemSettings, (s) => s.autoConvert);\n const conversions = useStore(sys.conversionStore, (s) => s.conversions);\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}>{label ?? 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 autoConvert,\n conversions\n })\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 = {\"controls\":\"_1e74Uq_controls\",\"title\":\"_1e74Uq_title\",\"header\":\"_1e74Uq_header\",\"subtitle\":\"_1e74Uq_subtitle\",\"pulse-border\":\"_1e74Uq_pulse-border\",\"hidden\":\"_1e74Uq_hidden\",\"nodeWrapper\":\"_1e74Uq_nodeWrapper\",\"error\":\"_1e74Uq_error\",\"executing\":\"_1e74Uq_executing\",\"smallIcon\":\"_1e74Uq_smallIcon\",\"titleContainer\":\"_1e74Uq_titleContainer\",\"headerContent\":\"_1e74Uq_headerContent\",\"pinned\":\"_1e74Uq_pinned\",\"icons\":\"_1e74Uq_icons\"}\nexport default classes\n\nconst _controls0 = classes[\"controls\"]\nexport { _controls0 as \"controls\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _subtitle0 = classes[\"subtitle\"]\nexport { _subtitle0 as \"subtitle\" }\n\nconst _pulse_border0 = classes[\"pulse-border\"]\nexport { _pulse_border0 as \"pulse-border\" }\n\nconst _hidden0 = classes[\"hidden\"]\nexport { _hidden0 as \"hidden\" }\n\nconst _nodeWrapper0 = classes[\"nodeWrapper\"]\nexport { _nodeWrapper0 as \"nodeWrapper\" }\n\nconst _error0 = classes[\"error\"]\nexport { _error0 as \"error\" }\n\nconst _executing0 = classes[\"executing\"]\nexport { _executing0 as \"executing\" }\n\nconst _smallIcon0 = classes[\"smallIcon\"]\nexport { _smallIcon0 as \"smallIcon\" }\n\nconst _titleContainer0 = classes[\"titleContainer\"]\nexport { _titleContainer0 as \"titleContainer\" }\n\nconst _headerContent0 = classes[\"headerContent\"]\nexport { _headerContent0 as \"headerContent\" }\n\nconst _pinned0 = classes[\"pinned\"]\nexport { _pinned0 as \"pinned\" }\n\nconst _icons0 = classes[\"icons\"]\nexport { _icons0 as \"icons\" }\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 = {\"valueInputRow\":\"oZj_Cq_valueInputRow\",\"pairRow\":\"oZj_Cq_pairRow\"}\nexport default classes\n\nconst _valueInputRow0 = classes[\"valueInputRow\"]\nexport { _valueInputRow0 as \"valueInputRow\" }\n\nconst _pairRow0 = classes[\"pairRow\"]\nexport { _pairRow0 as \"pairRow\" }\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","/**\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 { Node } from 'reactflow';\nimport type { GraphSocketJSON } from '@kiberon-labs/behave-graph';\nimport type { Socket } from '@/types';\n\nexport const GRAPH_INPUT_TYPE = 'graph/input';\nexport const GRAPH_OUTPUT_TYPE = 'graph/output';\nexport const CALL_SUBGRAPH_TYPE = 'flow/callSubgraph';\n\nexport type ContractParam = {\n /** Stable identifier (socket key / contract key). Independent of the name. */\n id?: string;\n /** User-facing display name; editable without breaking wiring. */\n name: string;\n valueTypeName: string;\n defaultValue?: any;\n};\n\nexport type GraphContract = {\n graphInputs: GraphSocketJSON[];\n graphOutputs: GraphSocketJSON[];\n};\n\n/** Stable identity of a param , its id, falling back to name for legacy data. */\nexport const paramId = (param: ContractParam): string => param.id ?? param.name;\n\nconst readParams = (node: Node): ContractParam[] => {\n const params = (node.data as any)?.configuration?.parameters;\n return Array.isArray(params) ? (params as ContractParam[]) : [];\n};\n\nconst toSocket = (param: ContractParam): GraphSocketJSON => ({\n key: paramId(param),\n valueType: param.valueTypeName,\n ...(param.defaultValue !== undefined\n ? { defaultValue: param.defaultValue }\n : {}),\n label: param.name\n});\n\n/**\n * Derive a graph's contract from its boundary nodes. The `graph/input` /\n * `graph/output` nodes are the source of truth; their configured parameters\n * become the graph's `graphInputs` / `graphOutputs`.\n */\nexport const deriveContract = (nodes: Node[]): GraphContract => {\n const graphInputs: GraphSocketJSON[] = [];\n const graphOutputs: GraphSocketJSON[] = [];\n\n for (const node of nodes) {\n const type = (node.data as any)?.type;\n if (type === GRAPH_INPUT_TYPE) {\n graphInputs.push(...readParams(node).map(toSocket));\n } else if (type === GRAPH_OUTPUT_TYPE) {\n graphOutputs.push(...readParams(node).map(toSocket));\n }\n }\n\n return { graphInputs, graphOutputs };\n};\n\n/**\n * Convert a derived contract's sockets back into editable {@link ContractParam}s\n * , the form stored in a Call Subgraph node's configuration. The socket `key`\n * is the stable param id; its `label` is the display name.\n */\nexport const contractToParams = (sockets: GraphSocketJSON[]): ContractParam[] =>\n sockets.map((s) => ({\n id: s.key,\n name: s.label ?? s.key,\n valueTypeName: s.valueType,\n ...(s.defaultValue !== undefined ? { defaultValue: s.defaultValue } : {})\n }));\n\n/**\n * Convert contract params into dynamic-port sockets. The socket identity\n * (name/key/handle id) is the stable param id; the display label is the name.\n */\nexport const paramsToSockets = (params: ContractParam[]): Socket[] =>\n params.map((p) => {\n const id = paramId(p);\n return {\n name: id,\n key: id,\n label: p.name || id,\n valueType: p.valueTypeName || 'string'\n };\n });\n","import type {\n GraphJSON,\n NodeJSON,\n NodeSpecJSON\n} from '@kiberon-labs/behave-graph';\nimport type { Edge, Node } from 'reactflow';\nimport type { GraphSession } from '../system/graphSession';\nimport { writeVariablesToJSON } from '../util/serializeVariables';\nimport { isBehaveNode } from '@/util/isBehaveNode';\nimport { deriveContract } from './contract';\n\nconst isNullish = (value: any): value is null | undefined =>\n value === undefined || value === null;\n\nexport const flowToBehave = (\n session: GraphSession,\n nodes: Node[],\n edges: Edge[],\n nodeSpecJSON: NodeSpecJSON[]\n): GraphJSON => {\n const graph: GraphJSON = {\n nodes: [],\n variables: [],\n customEvents: session.eventsStore.getState().getCustomEvents()\n };\n\n const registry = session.editor.registry.getState();\n const varStore = session.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\n // Derive the graph's contract (inputs/outputs) from its boundary nodes so\n // callers and the runtime can read it.\n const { graphInputs, graphOutputs } = deriveContract(nodes);\n if (graphInputs.length > 0) graph.graphInputs = graphInputs;\n if (graphOutputs.length > 0) graph.graphOutputs = graphOutputs;\n\n return graph;\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 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 { useGraph } 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 = useGraph();\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 { buildConverterInsertion } from '../util/autoConvert.js';\nimport { getNodePickerFilters } from '../util/getPickerFilters.js';\nimport { useBehaveGraphFlow } from './useBehaveGraphFlow.js';\nimport { useGraph } 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 = useGraph();\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 // Auto-convert: if the value types differ but a converter node exists,\n // splice the converter in between instead of a direct edge.\n const autoConvert = sys.editor.systemSettings.getState().autoConvert;\n if (autoConvert && specJSON) {\n const insertion = buildConverterInsertion(\n connection,\n sys.nodeStore.getState().nodes,\n specJSON,\n sys.editor.conversionStore.getState().conversions\n );\n if (insertion) {\n const { node, edges: convEdges } = insertion;\n sys.undoManager.execute({\n name: 'Auto-convert connection',\n execute: () => {\n sys.nodeStore.getState().addNode(node);\n sys.edgeStore\n .getState()\n .setEdges([...sys.edgeStore.getState().edges, ...convEdges]);\n convEdges.forEach((e) => sys.pubsub.publish('edge:added', e));\n },\n undo: () => {\n const ids = new Set(convEdges.map((e) => e.id));\n sys.nodeStore\n .getState()\n .setNodes((ns) => ns.filter((n) => n.id !== node.id));\n sys.edgeStore\n .getState()\n .setEdges(\n sys.edgeStore.getState().edges.filter((e) => !ids.has(e.id))\n );\n }\n });\n return;\n }\n }\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, sys, specJSON]\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.editor.tabStore.getState().layout;\n const newLayout = removeTabFromLayout(currentLayout, 'nodepicker');\n sys.editor.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.editor.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.editor.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.editor.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.editor.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 isEditableElement = (element: HTMLElement): boolean => {\n const tag = element.tagName?.toLowerCase();\n // Contenteditable surfaces (e.g. the notes plugin's prosemirror editor) are\n // divs, so checking the tag alone is not enough — WASD must type, not pan.\n return (\n tag === 'input' ||\n tag === 'textarea' ||\n tag === 'select' ||\n element.isContentEditable\n );\n};\n\nexport const isEventFromEditable = (event: KeyboardEvent) => {\n // Events from inside a web component are retargeted: at the window listener\n // `event.target` is the custom-element host (e.g. the conversation panel's\n // <vscode-textfield>), not the <input> in its shadow DOM. composedPath()\n // exposes the real target chain, so walk it and check every element.\n const path =\n typeof event.composedPath === 'function' ? event.composedPath() : [];\n if (path.length > 0) {\n return path.some(\n (node) => node instanceof HTMLElement && isEditableElement(node)\n );\n }\n const target = event.target as HTMLElement | null;\n if (!target) return false;\n return isEditableElement(target);\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 type { BoxBase, LayoutBase, PanelBase, TabBase } from 'rc-dock';\nimport { create } from 'zustand';\nimport { isGraphTabId } from '@/components/layoutController/utils';\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: 'graphProperties'\n },\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 ?? (isGraphTabId(tabId) ? '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 \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/systemSettings/styles.module_built.css\";\nconst classes = {\"setting\":\"pTBRlW_setting\",\"divider\":\"pTBRlW_divider\",\"list\":\"pTBRlW_list\",\"label\":\"pTBRlW_label\",\"addForm\":\"pTBRlW_addForm\",\"modified\":\"pTBRlW_modified\",\"rule\":\"pTBRlW_rule\",\"conversionsLabel\":\"pTBRlW_conversionsLabel\",\"labelRow\":\"pTBRlW_labelRow\",\"reset\":\"pTBRlW_reset\",\"body\":\"pTBRlW_body\",\"ruleNode\":\"pTBRlW_ruleNode\",\"description\":\"pTBRlW_description\",\"ruleText\":\"pTBRlW_ruleText\",\"empty\":\"pTBRlW_empty\",\"searchRow\":\"pTBRlW_searchRow\",\"conversions\":\"pTBRlW_conversions\",\"toggle\":\"pTBRlW_toggle\"}\nexport default classes\n\nconst _setting0 = classes[\"setting\"]\nexport { _setting0 as \"setting\" }\n\nconst _divider0 = classes[\"divider\"]\nexport { _divider0 as \"divider\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _label0 = classes[\"label\"]\nexport { _label0 as \"label\" }\n\nconst _addForm0 = classes[\"addForm\"]\nexport { _addForm0 as \"addForm\" }\n\nconst _modified0 = classes[\"modified\"]\nexport { _modified0 as \"modified\" }\n\nconst _rule0 = classes[\"rule\"]\nexport { _rule0 as \"rule\" }\n\nconst _conversionsLabel0 = classes[\"conversionsLabel\"]\nexport { _conversionsLabel0 as \"conversionsLabel\" }\n\nconst _labelRow0 = classes[\"labelRow\"]\nexport { _labelRow0 as \"labelRow\" }\n\nconst _reset0 = classes[\"reset\"]\nexport { _reset0 as \"reset\" }\n\nconst _body0 = classes[\"body\"]\nexport { _body0 as \"body\" }\n\nconst _ruleNode0 = classes[\"ruleNode\"]\nexport { _ruleNode0 as \"ruleNode\" }\n\nconst _description0 = classes[\"description\"]\nexport { _description0 as \"description\" }\n\nconst _ruleText0 = classes[\"ruleText\"]\nexport { _ruleText0 as \"ruleText\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _searchRow0 = classes[\"searchRow\"]\nexport { _searchRow0 as \"searchRow\" }\n\nconst _conversions0 = classes[\"conversions\"]\nexport { _conversions0 as \"conversions\" }\n\nconst _toggle0 = classes[\"toggle\"]\nexport { _toggle0 as \"toggle\" }\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 \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/common/SectionTitle.module_built.css\";\nconst classes = {\"title\":\"n05LSq_title\"}\nexport default classes\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n","import type React from 'react';\nimport styles from './SectionTitle.module.css';\n\n/**\n * Compact uppercase section header, shared across panels so every panel renders\n * its groups with the same VSCode-settings-style chrome.\n */\nexport const SectionTitle = ({ children }: { children: React.ReactNode }) => {\n return <div className={styles.title}>{children}</div>;\n};\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeButton,\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\nimport { Trash } from 'iconoir-react';\nimport { useSystem } from '@/system/provider';\nimport styles from './styles.module.css';\n\n/**\n * Editor for the custom automatic type conversions used by auto-convert. Rules\n * defined here override the generic spec-derived defaults and are persisted with\n * the editor settings.\n *\n * A rule pins the converter node AND the specific ports to wire: which input\n * receives the `from` value and which output produces the `to` value. The port\n * choices are filtered to type-compatible sockets, so converter nodes with more\n * than one input/output resolve unambiguously.\n */\nexport const ConversionsSettings: React.FC = () => {\n const sys = useSystem();\n const values = useStore(sys.registry, (s) => s.values);\n const specs = useStore(sys.specStore, (s) => s.specs);\n const conversions = useStore(sys.conversionStore, (s) => s.conversions);\n\n const valueTypes = useMemo(\n () => Object.keys(values).filter((t) => t !== 'flow'),\n [values]\n );\n const nodeTypes = useMemo(() => specs.map((s) => s.type).sort(), [specs]);\n\n const [from, setFrom] = useState('');\n const [to, setTo] = useState('');\n const [nodeType, setNodeType] = useState('');\n const [inputKey, setInputKey] = useState('');\n const [outputKey, setOutputKey] = useState('');\n\n const selectedSpec = useMemo(\n () => specs.find((s) => s.type === nodeType),\n [specs, nodeType]\n );\n\n // Only ports whose type matches the conversion endpoints are valid targets:\n // the spliced node must accept `from` and emit `to`.\n const inputPorts = useMemo(\n () =>\n (selectedSpec?.inputs ?? []).filter(\n (i) => i.valueType !== 'flow' && (!from || i.valueType === from)\n ),\n [selectedSpec, from]\n );\n const outputPorts = useMemo(\n () =>\n (selectedSpec?.outputs ?? []).filter(\n (o) => o.valueType !== 'flow' && (!to || o.valueType === to)\n ),\n [selectedSpec, to]\n );\n\n // Default the port selection to the first compatible socket whenever the node\n // or endpoints change; the user can still override when several ports match.\n useEffect(() => {\n setInputKey(inputPorts[0]?.name ?? '');\n }, [inputPorts]);\n useEffect(() => {\n setOutputKey(outputPorts[0]?.name ?? '');\n }, [outputPorts]);\n\n const nodeChosen = Boolean(nodeType);\n const portsMissing =\n nodeChosen && (inputPorts.length === 0 || outputPorts.length === 0);\n const canAdd =\n Boolean(from && to && nodeType && inputKey && outputKey) && from !== to;\n\n const add = () => {\n if (!canAdd) return;\n sys.conversionStore\n .getState()\n .registerConversion({ from, to, nodeType, inputKey, outputKey });\n setFrom('');\n setTo('');\n setNodeType('');\n setInputKey('');\n setOutputKey('');\n };\n\n return (\n <div className={styles.conversions}>\n <span className={styles.conversionsLabel}>\n Custom rules override the built-in defaults.\n </span>\n {conversions.length === 0 && (\n <div className={styles.empty}>No custom conversions.</div>\n )}\n {conversions.map((rule) => (\n <div key={`${rule.from}->${rule.to}`} className={styles.rule}>\n <span className={styles.ruleText}>\n {rule.from} → {rule.to}{' '}\n <span className={styles.ruleNode}>\n ({rule.nodeType}\n {rule.inputKey && rule.outputKey\n ? `: ${rule.inputKey} → ${rule.outputKey}`\n : ''}\n )\n </span>\n </span>\n <VscodeButton\n secondary\n iconOnly\n title=\"Remove\"\n onClick={() =>\n sys.conversionStore\n .getState()\n .removeConversion(rule.from, rule.to)\n }\n >\n <Trash />\n </VscodeButton>\n </div>\n ))}\n\n <div className={styles.addForm}>\n <VscodeSingleSelect\n value={from}\n onChange={(e: any) => setFrom(String(e?.target?.value ?? ''))}\n >\n <VscodeOption value=\"\">from…</VscodeOption>\n {valueTypes.map((t) => (\n <VscodeOption key={t} value={t}>\n {t}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n <VscodeSingleSelect\n value={to}\n onChange={(e: any) => setTo(String(e?.target?.value ?? ''))}\n >\n <VscodeOption value=\"\">to…</VscodeOption>\n {valueTypes.map((t) => (\n <VscodeOption key={t} value={t}>\n {t}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n <VscodeSingleSelect\n value={nodeType}\n onChange={(e: any) => setNodeType(String(e?.target?.value ?? ''))}\n >\n <VscodeOption value=\"\">converter node…</VscodeOption>\n {nodeTypes.map((t) => (\n <VscodeOption key={t} value={t}>\n {t}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n\n {nodeChosen && !portsMissing && (\n <>\n <VscodeSingleSelect\n value={inputKey}\n onChange={(e: any) => setInputKey(String(e?.target?.value ?? ''))}\n >\n <VscodeOption value=\"\">input port…</VscodeOption>\n {inputPorts.map((p) => (\n <VscodeOption key={p.name} value={p.name}>\n {p.name} ({p.valueType})\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n <VscodeSingleSelect\n value={outputKey}\n onChange={(e: any) =>\n setOutputKey(String(e?.target?.value ?? ''))\n }\n >\n <VscodeOption value=\"\">output port…</VscodeOption>\n {outputPorts.map((p) => (\n <VscodeOption key={p.name} value={p.name}>\n {p.name} ({p.valueType})\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n </>\n )}\n\n {portsMissing && (\n <span className={styles.empty}>\n “{nodeType}” has no {inputPorts.length === 0 ? `${from} input` : ''}\n {inputPorts.length === 0 && outputPorts.length === 0 ? ' / ' : ''}\n {outputPorts.length === 0 ? `${to} output` : ''} , not a valid\n converter for {from} → {to}.\n </span>\n )}\n\n <VscodeButton secondary disabled={!canAdd} onClick={add}>\n + Add conversion\n </VscodeButton>\n </div>\n </div>\n );\n};\n","import { Fragment, useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeCheckbox,\n VscodeDivider,\n VscodeOption,\n VscodeSingleSelect,\n VscodeTextfield\n} from '@vscode-elements/react-elements';\nimport { Undo } from 'iconoir-react';\nimport { useSystem } from '@/system/provider';\nimport type { SettingDescriptor, SettingsValues } from '@/store/settingsSchema';\nimport styles from './styles.module.css';\nimport { BasePanel } from '../base';\nimport { SectionTitle } from '../common/SectionTitle';\nimport { ConversionsSettings } from './ConversionsSettings';\n\ntype RowProps = {\n descriptor: SettingDescriptor;\n value: unknown;\n setValue: (value: unknown) => void;\n};\n\n/** The input control for a descriptor, chosen by its `type`. */\nconst SettingControl = ({ descriptor, value, setValue }: RowProps) => {\n switch (descriptor.type) {\n case 'boolean':\n return (\n <VscodeCheckbox\n checked={Boolean(value)}\n onChange={(e: any) => setValue(Boolean(e?.target?.checked))}\n />\n );\n case 'enum':\n return (\n <VscodeSingleSelect\n value={String(value ?? '')}\n onChange={(e: any) => {\n const next = e?.target?.value as string | undefined;\n if (next !== undefined) setValue(next);\n }}\n >\n {descriptor.options.map((option) => (\n <VscodeOption key={option.value} value={option.value}>\n {option.label}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n );\n case 'number':\n return (\n <VscodeTextfield\n type=\"number\"\n value={String(value ?? '')}\n min={descriptor.min}\n max={descriptor.max}\n step={descriptor.step}\n style={{ width: '100%' }}\n onChange={(e: any) => {\n const next = Number(e?.target?.value);\n if (!Number.isNaN(next)) setValue(next);\n }}\n />\n );\n case 'string':\n return (\n <VscodeTextfield\n value={String(value ?? '')}\n placeholder={descriptor.placeholder}\n style={{ width: '100%' }}\n onChange={(e: any) => setValue(String(e?.target?.value ?? ''))}\n />\n );\n case 'custom': {\n const Render = descriptor.render;\n return (\n <Render value={value} setValue={setValue} descriptor={descriptor} />\n );\n }\n }\n};\n\nconst ResetButton = ({ onClick }: { onClick: () => void }) => (\n <button\n type=\"button\"\n className={styles.reset}\n title=\"Reset to default\"\n aria-label=\"Reset to default\"\n onClick={onClick}\n >\n <Undo width={13} height={13} />\n </button>\n);\n\nconst Label = ({\n descriptor,\n modified\n}: {\n descriptor: SettingDescriptor;\n modified: boolean;\n}) => (\n <span className={styles.label}>\n {descriptor.title}\n {modified && <span className={styles.modified} title=\"Modified\" />}\n </span>\n);\n\n/** A single auto-generated setting row. Booleans put the control inline with the\n * label (toggle layout); other types stack the control under the label. */\nconst SettingRow = ({ descriptor, value, setValue }: RowProps) => {\n const modified = descriptor.type !== 'custom' && value !== descriptor.default;\n const reset = () => setValue(descriptor.default);\n\n if (descriptor.type === 'custom') {\n return (\n <div className={styles.setting}>\n {descriptor.title && (\n <span className={styles.label}>{descriptor.title}</span>\n )}\n {descriptor.description && (\n <span className={styles.description}>{descriptor.description}</span>\n )}\n <SettingControl\n descriptor={descriptor}\n value={value}\n setValue={setValue}\n />\n </div>\n );\n }\n\n if (descriptor.type === 'boolean') {\n return (\n <div className={`${styles.setting} ${styles.toggle}`}>\n <SettingControl\n descriptor={descriptor}\n value={value}\n setValue={setValue}\n />\n <div className={styles.body}>\n <Label descriptor={descriptor} modified={modified} />\n {descriptor.description && (\n <span className={styles.description}>{descriptor.description}</span>\n )}\n </div>\n {modified && <ResetButton onClick={reset} />}\n </div>\n );\n }\n\n return (\n <div className={styles.setting}>\n <div className={styles.labelRow}>\n <Label descriptor={descriptor} modified={modified} />\n {modified && <ResetButton onClick={reset} />}\n </div>\n {descriptor.description && (\n <span className={styles.description}>{descriptor.description}</span>\n )}\n <SettingControl\n descriptor={descriptor}\n value={value}\n setValue={setValue}\n />\n </div>\n );\n};\n\n/**\n * Schema-driven Settings panel. Rows are auto-generated from the descriptor\n * registry (`system.settingsSchema`) — built-in and plugin-contributed settings\n * render through the same path — grouped by section, filterable, with reset.\n */\nexport const Settings = () => {\n const system = useSystem();\n const descriptors = useStore(system.settingsSchema, (s) => s.settings);\n const sectionOrder = useStore(system.settingsSchema, (s) => s.sectionOrder);\n const values = useStore(system.systemSettings) as SettingsValues & {\n setSetting: (key: string, value: unknown) => void;\n };\n const [query, setQuery] = useState('');\n\n const bySection = useMemo(() => {\n const q = query.trim().toLowerCase();\n const matches = (d: SettingDescriptor) =>\n !q ||\n [d.title, d.description, d.section, d.key].some(\n (field) => typeof field === 'string' && field.toLowerCase().includes(q)\n );\n const visible = (d: SettingDescriptor) => (d.when ? d.when(values) : true);\n\n const map = new Map<string, SettingDescriptor[]>();\n for (const descriptor of descriptors) {\n if (!matches(descriptor) || !visible(descriptor)) continue;\n const rows = map.get(descriptor.section) ?? [];\n rows.push(descriptor);\n map.set(descriptor.section, rows);\n }\n for (const rows of map.values()) {\n rows.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n return map;\n }, [descriptors, query, values]);\n\n const visibleSections = sectionOrder.filter(\n (section) => (bySection.get(section)?.length ?? 0) > 0\n );\n\n return (\n <BasePanel>\n <div className={styles.searchRow}>\n <VscodeTextfield\n value={query}\n placeholder=\"Search settings\"\n style={{ width: '100%' }}\n onChange={(e: any) => setQuery(String(e?.target?.value ?? ''))}\n />\n </div>\n\n {visibleSections.length === 0 ? (\n <div className={styles.empty}>No settings match “{query}”.</div>\n ) : (\n <div className={styles.list}>\n {visibleSections.map((section, index) => (\n <Fragment key={section}>\n {index > 0 && <VscodeDivider className={styles.divider} />}\n <SectionTitle>{section}</SectionTitle>\n {bySection.get(section)!.map((descriptor) => (\n <Fragment key={descriptor.key}>\n <SettingRow\n descriptor={descriptor}\n // Fall back to the descriptor default so plugin-registered\n // settings (whose value is not seeded into the settings\n // store until first changed) show their real initial state.\n value={values[descriptor.key] ?? descriptor.default}\n setValue={(next) => values.setSetting(descriptor.key, next)}\n />\n {/* The conversions editor is a bespoke built-in control shown\n under Auto-convert when it is enabled. */}\n {descriptor.key === 'autoConvert' && values.autoConvert ? (\n <ConversionsSettings />\n ) : null}\n </Fragment>\n ))}\n </Fragment>\n ))}\n </div>\n )}\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 = {\"levelChip\":\"g0WdIG_levelChip\",\"searchIcon\":\"g0WdIG_searchIcon\",\"levelChipIcon\":\"g0WdIG_levelChipIcon\",\"levelChipLabel\":\"g0WdIG_levelChipLabel\",\"highlight\":\"g0WdIG_highlight\",\"levelOff\":\"g0WdIG_levelOff\",\"logCount\":\"g0WdIG_logCount\",\"logsList\":\"g0WdIG_logsList\",\"toolbar\":\"g0WdIG_toolbar\",\"emptyState\":\"g0WdIG_emptyState\",\"searchInput\":\"g0WdIG_searchInput\",\"filters\":\"g0WdIG_filters\",\"row\":\"g0WdIG_row\",\"actionActive\":\"g0WdIG_actionActive\",\"searchField\":\"g0WdIG_searchField\",\"searchBar\":\"g0WdIG_searchBar\",\"levelChipCount\":\"g0WdIG_levelChipCount\",\"toolbarActions\":\"g0WdIG_toolbarActions\",\"logsContainer\":\"g0WdIG_logsContainer\",\"rowIcon\":\"g0WdIG_rowIcon\",\"rowTime\":\"g0WdIG_rowTime\",\"rowMessage\":\"g0WdIG_rowMessage\"}\nexport default classes\n\nconst _levelChip0 = classes[\"levelChip\"]\nexport { _levelChip0 as \"levelChip\" }\n\nconst _searchIcon0 = classes[\"searchIcon\"]\nexport { _searchIcon0 as \"searchIcon\" }\n\nconst _levelChipIcon0 = classes[\"levelChipIcon\"]\nexport { _levelChipIcon0 as \"levelChipIcon\" }\n\nconst _levelChipLabel0 = classes[\"levelChipLabel\"]\nexport { _levelChipLabel0 as \"levelChipLabel\" }\n\nconst _highlight0 = classes[\"highlight\"]\nexport { _highlight0 as \"highlight\" }\n\nconst _levelOff0 = classes[\"levelOff\"]\nexport { _levelOff0 as \"levelOff\" }\n\nconst _logCount0 = classes[\"logCount\"]\nexport { _logCount0 as \"logCount\" }\n\nconst _logsList0 = classes[\"logsList\"]\nexport { _logsList0 as \"logsList\" }\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _searchInput0 = classes[\"searchInput\"]\nexport { _searchInput0 as \"searchInput\" }\n\nconst _filters0 = classes[\"filters\"]\nexport { _filters0 as \"filters\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _actionActive0 = classes[\"actionActive\"]\nexport { _actionActive0 as \"actionActive\" }\n\nconst _searchField0 = classes[\"searchField\"]\nexport { _searchField0 as \"searchField\" }\n\nconst _searchBar0 = classes[\"searchBar\"]\nexport { _searchBar0 as \"searchBar\" }\n\nconst _levelChipCount0 = classes[\"levelChipCount\"]\nexport { _levelChipCount0 as \"levelChipCount\" }\n\nconst _toolbarActions0 = classes[\"toolbarActions\"]\nexport { _toolbarActions0 as \"toolbarActions\" }\n\nconst _logsContainer0 = classes[\"logsContainer\"]\nexport { _logsContainer0 as \"logsContainer\" }\n\nconst _rowIcon0 = classes[\"rowIcon\"]\nexport { _rowIcon0 as \"rowIcon\" }\n\nconst _rowTime0 = classes[\"rowTime\"]\nexport { _rowTime0 as \"rowTime\" }\n\nconst _rowMessage0 = classes[\"rowMessage\"]\nexport { _rowMessage0 as \"rowMessage\" }\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/primitives/icon.module_built.css\";\nconst classes = {\"large\":\"JtM8cG_large\",\"icon\":\"JtM8cG_icon\",\"small\":\"JtM8cG_small\",\"disabled\":\"JtM8cG_disabled\",\"medium\":\"JtM8cG_medium\"}\nexport default classes\n\nconst _large0 = classes[\"large\"]\nexport { _large0 as \"large\" }\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","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 { useActiveGraph } 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(--ds-terminal-cyan, #29b8db)',\n info: 'var(--ds-chart-blue, #3794ff)',\n warning: 'var(--ds-warning, #cca700)',\n error: 'var(--ds-error, #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 = useActiveGraph()!;\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.editor.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 = {\"editorVariableName\":\"_9RH7Bq_editorVariableName\",\"editorActions\":\"_9RH7Bq_editorActions\",\"tree\":\"_9RH7Bq_tree\",\"treeItemInfo\":\"_9RH7Bq_treeItemInfo\",\"treeItemIcon\":\"_9RH7Bq_treeItemIcon\",\"variableList\":\"_9RH7Bq_variableList\",\"emptyStateText\":\"_9RH7Bq_emptyStateText\",\"fieldControl\":\"_9RH7Bq_fieldControl\",\"emptyState\":\"_9RH7Bq_emptyState\",\"editorTitle\":\"_9RH7Bq_editorTitle\",\"treeItemContent\":\"_9RH7Bq_treeItemContent\",\"editorHeader\":\"_9RH7Bq_editorHeader\",\"fieldLabel\":\"_9RH7Bq_fieldLabel\",\"editorFields\":\"_9RH7Bq_editorFields\",\"field\":\"_9RH7Bq_field\",\"selectedEditor\":\"_9RH7Bq_selectedEditor\",\"section\":\"_9RH7Bq_section\",\"root\":\"_9RH7Bq_root\",\"emptyStateHint\":\"_9RH7Bq_emptyStateHint\",\"actionsRow\":\"_9RH7Bq_actionsRow\",\"headerRow\":\"_9RH7Bq_headerRow\",\"sectionPadded\":\"_9RH7Bq_sectionPadded\"}\nexport default classes\n\nconst _editorVariableName0 = classes[\"editorVariableName\"]\nexport { _editorVariableName0 as \"editorVariableName\" }\n\nconst _editorActions0 = classes[\"editorActions\"]\nexport { _editorActions0 as \"editorActions\" }\n\nconst _tree0 = classes[\"tree\"]\nexport { _tree0 as \"tree\" }\n\nconst _treeItemInfo0 = classes[\"treeItemInfo\"]\nexport { _treeItemInfo0 as \"treeItemInfo\" }\n\nconst _treeItemIcon0 = classes[\"treeItemIcon\"]\nexport { _treeItemIcon0 as \"treeItemIcon\" }\n\nconst _variableList0 = classes[\"variableList\"]\nexport { _variableList0 as \"variableList\" }\n\nconst _emptyStateText0 = classes[\"emptyStateText\"]\nexport { _emptyStateText0 as \"emptyStateText\" }\n\nconst _fieldControl0 = classes[\"fieldControl\"]\nexport { _fieldControl0 as \"fieldControl\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _editorTitle0 = classes[\"editorTitle\"]\nexport { _editorTitle0 as \"editorTitle\" }\n\nconst _treeItemContent0 = classes[\"treeItemContent\"]\nexport { _treeItemContent0 as \"treeItemContent\" }\n\nconst _editorHeader0 = classes[\"editorHeader\"]\nexport { _editorHeader0 as \"editorHeader\" }\n\nconst _fieldLabel0 = classes[\"fieldLabel\"]\nexport { _fieldLabel0 as \"fieldLabel\" }\n\nconst _editorFields0 = classes[\"editorFields\"]\nexport { _editorFields0 as \"editorFields\" }\n\nconst _field0 = classes[\"field\"]\nexport { _field0 as \"field\" }\n\nconst _selectedEditor0 = classes[\"selectedEditor\"]\nexport { _selectedEditor0 as \"selectedEditor\" }\n\nconst _section0 = classes[\"section\"]\nexport { _section0 as \"section\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _emptyStateHint0 = classes[\"emptyStateHint\"]\nexport { _emptyStateHint0 as \"emptyStateHint\" }\n\nconst _actionsRow0 = classes[\"actionsRow\"]\nexport { _actionsRow0 as \"actionsRow\" }\n\nconst _headerRow0 = classes[\"headerRow\"]\nexport { _headerRow0 as \"headerRow\" }\n\nconst _sectionPadded0 = classes[\"sectionPadded\"]\nexport { _sectionPadded0 as \"sectionPadded\" }\n","import React, { useCallback, useMemo, useState } from 'react';\nimport { useStore } from 'zustand';\nimport { Variable } from '@kiberon-labs/behave-graph';\nimport { useActiveGraph } 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 = useActiveGraph()!;\n const registry = useStore(system.editor.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 \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/common/PanelHeader.module_built.css\";\nconst classes = {\"title\":\"NQ-87q_title\",\"header\":\"NQ-87q_header\",\"actions\":\"NQ-87q_actions\"}\nexport default classes\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n","import type React from 'react';\nimport styles from './PanelHeader.module.css';\n\n/**\n * A panel section header row: a compact uppercase title (matching SectionTitle)\n * on the left with an optional actions slot (e.g. a \"+\" button) on the right.\n * Shared so Variables, Events and similar panels render identical chrome.\n */\nexport const PanelHeader = ({\n title,\n actions\n}: {\n title: React.ReactNode;\n actions?: React.ReactNode;\n}) => {\n return (\n <div className={styles.header}>\n <span className={styles.title}>{title}</span>\n {actions ? <div className={styles.actions}>{actions}</div> : null}\n </div>\n );\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 { useActiveGraph } from '@/system';\nimport { useStore } from 'zustand';\nimport { Icon } from '@/components/primitives/icon';\nimport { PanelHeader } from '../common/PanelHeader';\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 = useActiveGraph()!;\n const icons = useStore(system.editor.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 <PanelHeader\n title=\"Variables\"\n actions={\n <Icon title=\"New variable\" onClick={onNewVariable}>\n <Plus />\n </Icon>\n }\n />\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 { useActiveGraph } 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 = useActiveGraph()!;\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 \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/panels/nodeInputs/index.module_built.css\";\nconst classes = {\"connectedMessage\":\"_1lC7Cq_connectedMessage\",\"stackGap2Padded\":\"_1lC7Cq_stackGap2Padded\",\"sectionTitle\":\"_1lC7Cq_sectionTitle\",\"annotationsPre\":\"_1lC7Cq_annotationsPre\",\"panelTitle\":\"_1lC7Cq_panelTitle\",\"nodeCard\":\"_1lC7Cq_nodeCard\",\"panelHeader\":\"_1lC7Cq_panelHeader\",\"panelTitleContainer\":\"_1lC7Cq_panelTitleContainer\",\"annotationsSection\":\"_1lC7Cq_annotationsSection\",\"noInputs\":\"_1lC7Cq_noInputs\",\"annotationsValue\":\"_1lC7Cq_annotationsValue\",\"inputToggle\":\"_1lC7Cq_inputToggle\",\"emptyState\":\"_1lC7Cq_emptyState\",\"descriptionSection\":\"_1lC7Cq_descriptionSection\",\"inputName\":\"_1lC7Cq_inputName\",\"descriptionTextarea\":\"_1lC7Cq_descriptionTextarea\",\"inputWithToggle\":\"_1lC7Cq_inputWithToggle\",\"annotationsListItem\":\"_1lC7Cq_annotationsListItem\",\"inputControlWrapper\":\"_1lC7Cq_inputControlWrapper\",\"stackGap2\":\"_1lC7Cq_stackGap2\",\"inputMeta\":\"_1lC7Cq_inputMeta\",\"panelTitleTextfield\":\"_1lC7Cq_panelTitleTextfield\",\"settingsRow\":\"_1lC7Cq_settingsRow\",\"tabs\":\"_1lC7Cq_tabs\",\"annotationsEmpty\":\"_1lC7Cq_annotationsEmpty\",\"nodeCardMeta\":\"_1lC7Cq_nodeCardMeta\",\"nodeTitleIcon\":\"_1lC7Cq_nodeTitleIcon\",\"panelTitleEdit\":\"_1lC7Cq_panelTitleEdit\",\"listGap1\":\"_1lC7Cq_listGap1\",\"stackColPadded\":\"_1lC7Cq_stackColPadded\",\"subTitle\":\"_1lC7Cq_subTitle\",\"panelId\":\"_1lC7Cq_panelId\",\"panelHeaderLabel\":\"_1lC7Cq_panelHeaderLabel\",\"infoButton\":\"_1lC7Cq_infoButton\",\"inputSubtext\":\"_1lC7Cq_inputSubtext\",\"annotationsList\":\"_1lC7Cq_annotationsList\",\"panel\":\"_1lC7Cq_panel\",\"toolbar\":\"_1lC7Cq_toolbar\",\"inputRow\":\"_1lC7Cq_inputRow\",\"nodeCardTitle\":\"_1lC7Cq_nodeCardTitle\"}\nexport default classes\n\nconst _connectedMessage0 = classes[\"connectedMessage\"]\nexport { _connectedMessage0 as \"connectedMessage\" }\n\nconst _stackGap2Padded0 = classes[\"stackGap2Padded\"]\nexport { _stackGap2Padded0 as \"stackGap2Padded\" }\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _annotationsPre0 = classes[\"annotationsPre\"]\nexport { _annotationsPre0 as \"annotationsPre\" }\n\nconst _panelTitle0 = classes[\"panelTitle\"]\nexport { _panelTitle0 as \"panelTitle\" }\n\nconst _nodeCard0 = classes[\"nodeCard\"]\nexport { _nodeCard0 as \"nodeCard\" }\n\nconst _panelHeader0 = classes[\"panelHeader\"]\nexport { _panelHeader0 as \"panelHeader\" }\n\nconst _panelTitleContainer0 = classes[\"panelTitleContainer\"]\nexport { _panelTitleContainer0 as \"panelTitleContainer\" }\n\nconst _annotationsSection0 = classes[\"annotationsSection\"]\nexport { _annotationsSection0 as \"annotationsSection\" }\n\nconst _noInputs0 = classes[\"noInputs\"]\nexport { _noInputs0 as \"noInputs\" }\n\nconst _annotationsValue0 = classes[\"annotationsValue\"]\nexport { _annotationsValue0 as \"annotationsValue\" }\n\nconst _inputToggle0 = classes[\"inputToggle\"]\nexport { _inputToggle0 as \"inputToggle\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _descriptionSection0 = classes[\"descriptionSection\"]\nexport { _descriptionSection0 as \"descriptionSection\" }\n\nconst _inputName0 = classes[\"inputName\"]\nexport { _inputName0 as \"inputName\" }\n\nconst _descriptionTextarea0 = classes[\"descriptionTextarea\"]\nexport { _descriptionTextarea0 as \"descriptionTextarea\" }\n\nconst _inputWithToggle0 = classes[\"inputWithToggle\"]\nexport { _inputWithToggle0 as \"inputWithToggle\" }\n\nconst _annotationsListItem0 = classes[\"annotationsListItem\"]\nexport { _annotationsListItem0 as \"annotationsListItem\" }\n\nconst _inputControlWrapper0 = classes[\"inputControlWrapper\"]\nexport { _inputControlWrapper0 as \"inputControlWrapper\" }\n\nconst _stackGap20 = classes[\"stackGap2\"]\nexport { _stackGap20 as \"stackGap2\" }\n\nconst _inputMeta0 = classes[\"inputMeta\"]\nexport { _inputMeta0 as \"inputMeta\" }\n\nconst _panelTitleTextfield0 = classes[\"panelTitleTextfield\"]\nexport { _panelTitleTextfield0 as \"panelTitleTextfield\" }\n\nconst _settingsRow0 = classes[\"settingsRow\"]\nexport { _settingsRow0 as \"settingsRow\" }\n\nconst _tabs0 = classes[\"tabs\"]\nexport { _tabs0 as \"tabs\" }\n\nconst _annotationsEmpty0 = classes[\"annotationsEmpty\"]\nexport { _annotationsEmpty0 as \"annotationsEmpty\" }\n\nconst _nodeCardMeta0 = classes[\"nodeCardMeta\"]\nexport { _nodeCardMeta0 as \"nodeCardMeta\" }\n\nconst _nodeTitleIcon0 = classes[\"nodeTitleIcon\"]\nexport { _nodeTitleIcon0 as \"nodeTitleIcon\" }\n\nconst _panelTitleEdit0 = classes[\"panelTitleEdit\"]\nexport { _panelTitleEdit0 as \"panelTitleEdit\" }\n\nconst _listGap10 = classes[\"listGap1\"]\nexport { _listGap10 as \"listGap1\" }\n\nconst _stackColPadded0 = classes[\"stackColPadded\"]\nexport { _stackColPadded0 as \"stackColPadded\" }\n\nconst _subTitle0 = classes[\"subTitle\"]\nexport { _subTitle0 as \"subTitle\" }\n\nconst _panelId0 = classes[\"panelId\"]\nexport { _panelId0 as \"panelId\" }\n\nconst _panelHeaderLabel0 = classes[\"panelHeaderLabel\"]\nexport { _panelHeaderLabel0 as \"panelHeaderLabel\" }\n\nconst _infoButton0 = classes[\"infoButton\"]\nexport { _infoButton0 as \"infoButton\" }\n\nconst _inputSubtext0 = classes[\"inputSubtext\"]\nexport { _inputSubtext0 as \"inputSubtext\" }\n\nconst _annotationsList0 = classes[\"annotationsList\"]\nexport { _annotationsList0 as \"annotationsList\" }\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n\nconst _inputRow0 = classes[\"inputRow\"]\nexport { _inputRow0 as \"inputRow\" }\n\nconst _nodeCardTitle0 = classes[\"nodeCardTitle\"]\nexport { _nodeCardTitle0 as \"nodeCardTitle\" }\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 className={styles.inputToggle}\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 className={styles.inputToggle}\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}>{output.valueType}</div>\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.subTitle}>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.subTitle}>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 { GraphSession } from '@/system/graphSession';\n\nexport function useNodeInputsData(system: GraphSession) {\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(\n system.editor.socketGeneratorStore,\n (s) => s.generators\n );\n const generatorLocation = useStore(\n system.editor.systemSettings,\n (s) => s.generatorLocation\n );\n\n const allSpecsJson = useStore(system.editor.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 // `valueOutputs` already contains every non-flow output. (The `pairs` from\n // configureSockets also carry these value outputs in their second slot ,\n // iterating both would render each value output twice and collide on the\n // React key, e.g. `provider` / `agent`.)\n const { valueOutputs } = configureSockets(\n selectedNode.data.configuration,\n nodeSpec,\n selectedNode.data.dynamicPorts\n );\n\n return valueOutputs.map((output) => ({\n name: output.name,\n valueType: output.valueType,\n connected: isHandleConnected(\n edges,\n selectedNode.id,\n output.name,\n 'source'\n )\n }));\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 { GraphSession } from '@/system/graphSession';\n\nexport function useNodeHandlers(\n system: GraphSession,\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 { useActiveGraph, GraphProvider } 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 = useActiveGraph()!;\n const documentation = useStore(\n system.editor.documentationStore,\n (x) => x.docs\n );\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.editor.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.editor.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 <span className={styles.panelHeaderLabel}>Inputs</span>\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 (\n // Generators read per-graph state via useGraph(); bind them to the\n // active session since this panel lives outside the graph tab.\n <GraphProvider value={system}>\n <SocketGenerators\n generators={matchingGenerators}\n generatorNode={generatorNode}\n />\n </GraphProvider>\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 <span className={styles.panelHeaderLabel}>Outputs</span>\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\"}\nexport default classes\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\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 { useActiveGraph } from '@/system/provider';\nimport type { GraphSession } 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: GraphSession) => (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 = useActiveGraph()!;\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 = {\"searchRow\":\"ATQk8G_searchRow\",\"fullWidth\":\"ATQk8G_fullWidth\",\"searchGroup\":\"ATQk8G_searchGroup\"}\nexport default classes\n\nconst _searchRow0 = classes[\"searchRow\"]\nexport { _searchRow0 as \"searchRow\" }\n\nconst _fullWidth0 = classes[\"fullWidth\"]\nexport { _fullWidth0 as \"fullWidth\" }\n\nconst _searchGroup0 = classes[\"searchGroup\"]\nexport { _searchGroup0 as \"searchGroup\" }\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, useActiveGraph } 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 = useActiveGraph()!;\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 = {\"actionId\":\"Gx7a7W_actionId\",\"actionCell\":\"Gx7a7W_actionCell\",\"actionInfo\":\"Gx7a7W_actionInfo\",\"actionLabel\":\"Gx7a7W_actionLabel\",\"content\":\"Gx7a7W_content\",\"keyBadge\":\"Gx7a7W_keyBadge\",\"helpText\":\"Gx7a7W_helpText\",\"actionsCell\":\"Gx7a7W_actionsCell\",\"textfield\":\"Gx7a7W_textfield\",\"table\":\"Gx7a7W_table\",\"header\":\"Gx7a7W_header\",\"keybindingCell\":\"Gx7a7W_keybindingCell\",\"buttonGroup\":\"Gx7a7W_buttonGroup\"}\nexport default classes\n\nconst _actionId0 = classes[\"actionId\"]\nexport { _actionId0 as \"actionId\" }\n\nconst _actionCell0 = classes[\"actionCell\"]\nexport { _actionCell0 as \"actionCell\" }\n\nconst _actionInfo0 = classes[\"actionInfo\"]\nexport { _actionInfo0 as \"actionInfo\" }\n\nconst _actionLabel0 = classes[\"actionLabel\"]\nexport { _actionLabel0 as \"actionLabel\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _keyBadge0 = classes[\"keyBadge\"]\nexport { _keyBadge0 as \"keyBadge\" }\n\nconst _helpText0 = classes[\"helpText\"]\nexport { _helpText0 as \"helpText\" }\n\nconst _actionsCell0 = classes[\"actionsCell\"]\nexport { _actionsCell0 as \"actionsCell\" }\n\nconst _textfield0 = classes[\"textfield\"]\nexport { _textfield0 as \"textfield\" }\n\nconst _table0 = classes[\"table\"]\nexport { _table0 as \"table\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _keybindingCell0 = classes[\"keybindingCell\"]\nexport { _keybindingCell0 as \"keybindingCell\" }\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\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} title={action}>\n {getDescription(action)}\n </div>\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 = {\"parametersContent\":\"vQ4f7a_parametersContent\",\"root\":\"vQ4f7a_root\",\"emptyState\":\"vQ4f7a_emptyState\",\"formGrid\":\"vQ4f7a_formGrid\",\"content\":\"vQ4f7a_content\",\"parametersHeader\":\"vQ4f7a_parametersHeader\",\"parametersTitle\":\"vQ4f7a_parametersTitle\",\"parametersGrid\":\"vQ4f7a_parametersGrid\",\"parameterFieldLabel\":\"vQ4f7a_parameterFieldLabel\",\"parameterDelete\":\"vQ4f7a_parameterDelete\",\"editorActions\":\"vQ4f7a_editorActions\",\"actions\":\"vQ4f7a_actions\",\"eventName\":\"vQ4f7a_eventName\",\"editorFields\":\"vQ4f7a_editorFields\",\"parameterField\":\"vQ4f7a_parameterField\",\"headerTitle\":\"vQ4f7a_headerTitle\",\"emptyStateText\":\"vQ4f7a_emptyStateText\",\"editorHeader\":\"vQ4f7a_editorHeader\",\"formField\":\"vQ4f7a_formField\",\"eventMeta\":\"vQ4f7a_eventMeta\",\"formLabel\":\"vQ4f7a_formLabel\",\"editRoot\":\"vQ4f7a_editRoot\",\"parametersEmpty\":\"vQ4f7a_parametersEmpty\",\"controlWrapper\":\"vQ4f7a_controlWrapper\",\"parameterRow\":\"vQ4f7a_parameterRow\",\"parametersSection\":\"vQ4f7a_parametersSection\"}\nexport default classes\n\nconst _parametersContent0 = classes[\"parametersContent\"]\nexport { _parametersContent0 as \"parametersContent\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _emptyState0 = classes[\"emptyState\"]\nexport { _emptyState0 as \"emptyState\" }\n\nconst _formGrid0 = classes[\"formGrid\"]\nexport { _formGrid0 as \"formGrid\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _parametersHeader0 = classes[\"parametersHeader\"]\nexport { _parametersHeader0 as \"parametersHeader\" }\n\nconst _parametersTitle0 = classes[\"parametersTitle\"]\nexport { _parametersTitle0 as \"parametersTitle\" }\n\nconst _parametersGrid0 = classes[\"parametersGrid\"]\nexport { _parametersGrid0 as \"parametersGrid\" }\n\nconst _parameterFieldLabel0 = classes[\"parameterFieldLabel\"]\nexport { _parameterFieldLabel0 as \"parameterFieldLabel\" }\n\nconst _parameterDelete0 = classes[\"parameterDelete\"]\nexport { _parameterDelete0 as \"parameterDelete\" }\n\nconst _editorActions0 = classes[\"editorActions\"]\nexport { _editorActions0 as \"editorActions\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n\nconst _eventName0 = classes[\"eventName\"]\nexport { _eventName0 as \"eventName\" }\n\nconst _editorFields0 = classes[\"editorFields\"]\nexport { _editorFields0 as \"editorFields\" }\n\nconst _parameterField0 = classes[\"parameterField\"]\nexport { _parameterField0 as \"parameterField\" }\n\nconst _headerTitle0 = classes[\"headerTitle\"]\nexport { _headerTitle0 as \"headerTitle\" }\n\nconst _emptyStateText0 = classes[\"emptyStateText\"]\nexport { _emptyStateText0 as \"emptyStateText\" }\n\nconst _editorHeader0 = classes[\"editorHeader\"]\nexport { _editorHeader0 as \"editorHeader\" }\n\nconst _formField0 = classes[\"formField\"]\nexport { _formField0 as \"formField\" }\n\nconst _eventMeta0 = classes[\"eventMeta\"]\nexport { _eventMeta0 as \"eventMeta\" }\n\nconst _formLabel0 = classes[\"formLabel\"]\nexport { _formLabel0 as \"formLabel\" }\n\nconst _editRoot0 = classes[\"editRoot\"]\nexport { _editRoot0 as \"editRoot\" }\n\nconst _parametersEmpty0 = classes[\"parametersEmpty\"]\nexport { _parametersEmpty0 as \"parametersEmpty\" }\n\nconst _controlWrapper0 = classes[\"controlWrapper\"]\nexport { _controlWrapper0 as \"controlWrapper\" }\n\nconst _parameterRow0 = classes[\"parameterRow\"]\nexport { _parameterRow0 as \"parameterRow\" }\n\nconst _parametersSection0 = classes[\"parametersSection\"]\nexport { _parametersSection0 as \"parametersSection\" }\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 { useActiveGraph } 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';\nimport { PanelHeader } from '../common/PanelHeader';\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 = useActiveGraph()!;\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 <PanelHeader\n title=\"Custom Events\"\n actions={\n <Icon title=\"New event\" onClick={addNewEvent}>\n <Plus />\n </Icon>\n }\n />\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 { useActiveGraph } 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 = useActiveGraph()!;\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.editor.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\n style={{\n height: '100%',\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '16px'\n }}\n >\n <div style={{ color: 'var(--ds-fg-muted)', textAlign: '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\",\"span\":\"na343q_span\",\"windowSelect\":\"na343q_windowSelect\",\"windowControls\":\"na343q_windowControls\",\"subtitle\":\"na343q_subtitle\",\"tooltip\":\"na343q_tooltip\",\"spanLabel\":\"na343q_spanLabel\",\"header\":\"na343q_header\",\"windowLabel\":\"na343q_windowLabel\",\"tooltipTitle\":\"na343q_tooltipTitle\",\"tooltipDuration\":\"na343q_tooltipDuration\",\"title\":\"na343q_title\",\"lanes\":\"na343q_lanes\",\"empty\":\"na343q_empty\",\"tooltipNodeId\":\"na343q_tooltipNodeId\",\"stats\":\"na343q_stats\",\"statValue\":\"na343q_statValue\",\"laneRow\":\"na343q_laneRow\"}\nexport default classes\n\nconst _scroll0 = classes[\"scroll\"]\nexport { _scroll0 as \"scroll\" }\n\nconst _span0 = classes[\"span\"]\nexport { _span0 as \"span\" }\n\nconst _windowSelect0 = classes[\"windowSelect\"]\nexport { _windowSelect0 as \"windowSelect\" }\n\nconst _windowControls0 = classes[\"windowControls\"]\nexport { _windowControls0 as \"windowControls\" }\n\nconst _subtitle0 = classes[\"subtitle\"]\nexport { _subtitle0 as \"subtitle\" }\n\nconst _tooltip0 = classes[\"tooltip\"]\nexport { _tooltip0 as \"tooltip\" }\n\nconst _spanLabel0 = classes[\"spanLabel\"]\nexport { _spanLabel0 as \"spanLabel\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _windowLabel0 = classes[\"windowLabel\"]\nexport { _windowLabel0 as \"windowLabel\" }\n\nconst _tooltipTitle0 = classes[\"tooltipTitle\"]\nexport { _tooltipTitle0 as \"tooltipTitle\" }\n\nconst _tooltipDuration0 = classes[\"tooltipDuration\"]\nexport { _tooltipDuration0 as \"tooltipDuration\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _lanes0 = classes[\"lanes\"]\nexport { _lanes0 as \"lanes\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _tooltipNodeId0 = classes[\"tooltipNodeId\"]\nexport { _tooltipNodeId0 as \"tooltipNodeId\" }\n\nconst _stats0 = classes[\"stats\"]\nexport { _stats0 as \"stats\" }\n\nconst _statValue0 = classes[\"statValue\"]\nexport { _statValue0 as \"statValue\" }\n\nconst _laneRow0 = classes[\"laneRow\"]\nexport { _laneRow0 as \"laneRow\" }\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\n/**\n * How far past the captured data extent the user may zoom out. Without headroom\n * the view range is clamped to the data range, so you hit a wall and \"can't zoom\n * out\" , especially for very short traces. This lets the trace be pulled back\n * into a smaller cluster with surrounding space.\n */\nexport const MAX_ZOOM_OUT_FACTOR = 8;\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 {\n calculateTimeInterval,\n clamp,\n hashToHue,\n MAX_ZOOM_OUT_FACTOR\n} from './utils';\n\nconst MIN_WIDTH_PCT = 0.5;\nconst OVERLAP_EPSILON_PCT = 0.5;\n\n/**\n * Minimum *visual* span length (ms). Instant nodes record start === end (0ms),\n * which otherwise collapses the range (maxEnd <= minStart) and renders nothing.\n * The true duration is still reported to the tooltip.\n */\nconst MIN_SPAN_MS = 1;\n\n/** Effective end used for layout: clamps instant/zero-length spans to MIN_SPAN_MS. */\nconst visualEnd = (start: number, rawEnd: number): number =>\n Math.max(rawEnd, start + MIN_SPAN_MS);\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 origin: 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 // Position uses absolute time; the label is relative to the trace origin\n // (first span) so it reads 0ms… instead of the raw clock value.\n ticks.push({ time: t - origin, 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 () => computeDerivedSpans(collector, windowMs, view),\n [collector, version, windowMs, view.follow, view.range, view.start]\n );\n}\n\n/**\n * Pure span → layout derivation used by {@link useDerivedSpans}. Exported so the\n * layout math (lane assignment, min-span visibility, ticks, zoom clamping) can be\n * unit-tested without a React render.\n */\ntype TraceSpan = import('@/store/traces').TraceSpan;\n\ninterface SpanScan {\n minStart: number;\n maxEnd: number;\n maxLane: number;\n buckets: TraceSpan[][];\n}\n\n/** Walk the ring buffer newest-window-first, bucketing spans by lane and\n * tracking the overall time/lane bounds. */\nfunction scanSpans(collector: SpanCollector, now: number): SpanScan {\n const { capacity, size, writeIndex, spans } = collector;\n let minStart = Number.POSITIVE_INFINITY;\n let maxEnd = Number.NEGATIVE_INFINITY;\n let maxLane = -1;\n const buckets: 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 rawEnd = Number.isNaN(s.end) ? now : s.end;\n const end = visualEnd(s.start, rawEnd);\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 return { minStart, maxEnd, maxLane, buckets };\n}\n\ninterface ViewWindow {\n viewStart: number;\n viewEnd: number;\n viewRange: number;\n}\n\n/** Resolve the visible time window from the data bounds, the follow/zoom mode,\n * and the requested window size. */\nfunction resolveViewWindow(\n scan: SpanScan,\n fullRange: number,\n windowMs: number,\n view: ViewState\n): ViewWindow {\n const { minStart, maxEnd } = scan;\n const desiredRange = windowMs <= 0 ? fullRange : Math.max(1, windowMs);\n const desiredStart = Math.max(minStart, maxEnd - desiredRange);\n\n // Following snaps to the data range; manual zoom may pull back past the data\n // extent (up to MAX_ZOOM_OUT_FACTOR×) so short traces aren't un-zoom-out-able.\n const viewRange = clamp(\n view.follow ? desiredRange : view.range,\n 1,\n view.follow ? fullRange : fullRange * MAX_ZOOM_OUT_FACTOR\n );\n const viewStart = clamp(\n view.follow ? desiredStart : view.start,\n minStart,\n maxEnd - viewRange\n );\n\n return { viewStart, viewEnd: viewStart + viewRange, viewRange };\n}\n\ntype PlacedSpan = {\n span: TraceSpan;\n leftPct: number;\n widthPct: number;\n rightPct: number;\n durationMs: number;\n};\n\n/** Project a single span onto the view window, or null if it falls outside. */\nfunction placeSpan(\n s: TraceSpan,\n now: number,\n win: ViewWindow\n): PlacedSpan | null {\n const { viewStart, viewEnd, viewRange } = win;\n const rawEnd = Number.isNaN(s.end) ? now : s.end;\n const end = visualEnd(s.start, rawEnd);\n if (end < viewStart || s.start > viewEnd) return null;\n\n const visibleStart = Math.max(s.start, viewStart);\n const visibleEnd = Math.min(end, viewEnd);\n if (visibleEnd <= visibleStart) return null;\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(Math.max(MIN_WIDTH_PCT, rawWidth), 0, 100 - leftPct);\n const rightPct = leftPct + widthPct;\n // Report the true duration (0ms for instant nodes), not the padded one.\n const durationMs = Math.max(0, rawEnd - s.start);\n\n return { span: s, leftPct, widthPct, rightPct, durationMs };\n}\n\n/** Pack a placed span into the lowest stack row that has cleared its left edge,\n * returning the chosen stack index and updating `stackRight` in place. */\nfunction assignStack(placed: PlacedSpan, stackRight: number[]): number {\n let stack = 0;\n for (; stack < stackRight.length; stack++) {\n if (placed.leftPct >= stackRight[stack]! + OVERLAP_EPSILON_PCT) break;\n }\n if (stack === stackRight.length) stackRight.push(placed.rightPct);\n else stackRight[stack] = Math.max(stackRight[stack]!, placed.rightPct);\n return stack;\n}\n\n/** Build the fill/border colours for a span at a given stack depth. */\nfunction spanColors(\n span: TraceSpan,\n stack: number\n): { bg: string; border: string } {\n const hue = hashToHue(span.nodeId);\n const isOpen = Number.isNaN(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 return { bg, border };\n}\n\n/** Lay out one lane's spans into stacked, coloured visual spans. */\nfunction buildLaneData(\n laneSpans: TraceSpan[] | undefined,\n now: number,\n win: ViewWindow\n): LaneData {\n if (!laneSpans || laneSpans.length === 0) {\n return { stackCount: 1, visualSpans: [] };\n }\n\n const placed: PlacedSpan[] = [];\n for (const s of laneSpans) {\n const p = placeSpan(s, now, win);\n if (p) placed.push(p);\n }\n placed.sort((a, b) => a.leftPct - b.leftPct);\n\n const stackRight: number[] = [];\n const visualSpans: VisualSpan[] = [];\n for (const v of placed) {\n const stack = assignStack(v, stackRight);\n const { bg, border } = spanColors(v.span, stack);\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 return { stackCount: Math.max(1, stackRight.length), visualSpans };\n}\n\nexport function computeDerivedSpans(\n collector: SpanCollector,\n windowMs: number,\n view: ViewState\n): DerivedData {\n const now = performance.now();\n\n if (collector.size <= 0) return { ...EMPTY, now };\n\n const scan = scanSpans(collector, now);\n const { minStart, maxEnd, maxLane, buckets } = scan;\n const { size } = collector;\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 const win = resolveViewWindow(scan, fullRange, windowMs, view);\n\n const laneData: LaneData[] = Array.from({ length: maxLane + 1 }, (_, lane) =>\n buildLaneData(buckets[lane], now, win)\n );\n\n const ticks = computeTicks(\n win.viewStart,\n win.viewEnd,\n win.viewRange,\n minStart\n );\n\n return {\n now,\n size,\n lanes: maxLane + 1,\n minStart,\n maxEnd,\n range: fullRange,\n viewStart: win.viewStart,\n viewEnd: win.viewEnd,\n viewRange: win.viewRange,\n buckets,\n laneData,\n ticks\n };\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(--ds-fg-muted)',\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(--ds-editor-bg)',\n borderBottom: '1px solid var(--ds-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(--ds-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 { useActiveGraph } 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, MAX_ZOOM_OUT_FACTOR } 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 = useActiveGraph()!;\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(\n v.range * zoomFactor,\n 1,\n derived.range * MAX_ZOOM_OUT_FACTOR\n );\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 style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>\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 = {\"countBadge\":\"LpoP_G_countBadge\",\"badgeCell\":\"LpoP_G_badgeCell\",\"sectionTitle\":\"LpoP_G_sectionTitle\",\"empty\":\"LpoP_G_empty\",\"list\":\"LpoP_G_list\",\"row\":\"LpoP_G_row\",\"redo\":\"LpoP_G_redo\",\"kindBadge\":\"LpoP_G_kindBadge\",\"now\":\"LpoP_G_now\",\"name\":\"LpoP_G_name\",\"index\":\"LpoP_G_index\",\"nowLabel\":\"LpoP_G_nowLabel\",\"undo\":\"LpoP_G_undo\"}\nexport default classes\n\nconst _countBadge0 = classes[\"countBadge\"]\nexport { _countBadge0 as \"countBadge\" }\n\nconst _badgeCell0 = classes[\"badgeCell\"]\nexport { _badgeCell0 as \"badgeCell\" }\n\nconst _sectionTitle0 = classes[\"sectionTitle\"]\nexport { _sectionTitle0 as \"sectionTitle\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _redo0 = classes[\"redo\"]\nexport { _redo0 as \"redo\" }\n\nconst _kindBadge0 = classes[\"kindBadge\"]\nexport { _kindBadge0 as \"kindBadge\" }\n\nconst _now0 = classes[\"now\"]\nexport { _now0 as \"now\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _index0 = classes[\"index\"]\nexport { _index0 as \"index\" }\n\nconst _nowLabel0 = classes[\"nowLabel\"]\nexport { _nowLabel0 as \"nowLabel\" }\n\nconst _undo0 = classes[\"undo\"]\nexport { _undo0 as \"undo\" }\n","import React from 'react';\nimport { VscodeBadge, VscodeDivider } from '@vscode-elements/react-elements';\nimport { useStore } from 'zustand';\nimport { useActiveGraph } from '@/system/provider';\nimport styles from './styles.module.css';\nimport { BasePanel } from '../base';\n\nexport function HistoryPanel() {\n const system = useActiveGraph()!;\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 \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/contextMenus/NodePicker.module_built.css\";\nconst classes = {\"cardThumb\":\"oeIJiq_cardThumb\",\"search\":\"oeIJiq_search\",\"viewToggles\":\"oeIJiq_viewToggles\",\"grid\":\"oeIJiq_grid\",\"content\":\"oeIJiq_content\",\"nodeText\":\"oeIJiq_nodeText\",\"sidebarItemActive\":\"oeIJiq_sidebarItemActive\",\"container\":\"oeIJiq_container\",\"sidebarItem\":\"oeIJiq_sidebarItem\",\"groupTitle\":\"oeIJiq_groupTitle\",\"tag\":\"oeIJiq_tag\",\"footer\":\"oeIJiq_footer\",\"nodeRow\":\"oeIJiq_nodeRow\",\"nodeTitle\":\"oeIJiq_nodeTitle\",\"list\":\"oeIJiq_list\",\"nodeSub\":\"oeIJiq_nodeSub\",\"card\":\"oeIJiq_card\",\"sidebar\":\"oeIJiq_sidebar\",\"main\":\"oeIJiq_main\",\"topbar\":\"oeIJiq_topbar\",\"thumb\":\"oeIJiq_thumb\",\"tags\":\"oeIJiq_tags\",\"cardInner\":\"oeIJiq_cardInner\",\"sidebarList\":\"oeIJiq_sidebarList\",\"icon\":\"oeIJiq_icon\",\"gridView\":\"oeIJiq_gridView\",\"infoButton\":\"oeIJiq_infoButton\",\"empty\":\"oeIJiq_empty\"}\nexport default classes\n\nconst _cardThumb0 = classes[\"cardThumb\"]\nexport { _cardThumb0 as \"cardThumb\" }\n\nconst _search0 = classes[\"search\"]\nexport { _search0 as \"search\" }\n\nconst _viewToggles0 = classes[\"viewToggles\"]\nexport { _viewToggles0 as \"viewToggles\" }\n\nconst _grid0 = classes[\"grid\"]\nexport { _grid0 as \"grid\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _nodeText0 = classes[\"nodeText\"]\nexport { _nodeText0 as \"nodeText\" }\n\nconst _sidebarItemActive0 = classes[\"sidebarItemActive\"]\nexport { _sidebarItemActive0 as \"sidebarItemActive\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _sidebarItem0 = classes[\"sidebarItem\"]\nexport { _sidebarItem0 as \"sidebarItem\" }\n\nconst _groupTitle0 = classes[\"groupTitle\"]\nexport { _groupTitle0 as \"groupTitle\" }\n\nconst _tag0 = classes[\"tag\"]\nexport { _tag0 as \"tag\" }\n\nconst _footer0 = classes[\"footer\"]\nexport { _footer0 as \"footer\" }\n\nconst _nodeRow0 = classes[\"nodeRow\"]\nexport { _nodeRow0 as \"nodeRow\" }\n\nconst _nodeTitle0 = classes[\"nodeTitle\"]\nexport { _nodeTitle0 as \"nodeTitle\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _nodeSub0 = classes[\"nodeSub\"]\nexport { _nodeSub0 as \"nodeSub\" }\n\nconst _card0 = classes[\"card\"]\nexport { _card0 as \"card\" }\n\nconst _sidebar0 = classes[\"sidebar\"]\nexport { _sidebar0 as \"sidebar\" }\n\nconst _main0 = classes[\"main\"]\nexport { _main0 as \"main\" }\n\nconst _topbar0 = classes[\"topbar\"]\nexport { _topbar0 as \"topbar\" }\n\nconst _thumb0 = classes[\"thumb\"]\nexport { _thumb0 as \"thumb\" }\n\nconst _tags0 = classes[\"tags\"]\nexport { _tags0 as \"tags\" }\n\nconst _cardInner0 = classes[\"cardInner\"]\nexport { _cardInner0 as \"cardInner\" }\n\nconst _sidebarList0 = classes[\"sidebarList\"]\nexport { _sidebarList0 as \"sidebarList\" }\n\nconst _icon0 = classes[\"icon\"]\nexport { _icon0 as \"icon\" }\n\nconst _gridView0 = classes[\"gridView\"]\nexport { _gridView0 as \"gridView\" }\n\nconst _infoButton0 = classes[\"infoButton\"]\nexport { _infoButton0 as \"infoButton\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\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 { useActiveGraph } 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 = useActiveGraph()!;\n const specJson = useStore(sys.editor.specStore, (x) => x.specs);\n const documentation = useStore(sys.editor.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.editor.tabStore.getState().layout;\n const newLayout = removeTabFromLayout(currentLayout, 'nodepicker');\n sys.editor.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.editor.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.editor.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 = {\"optionsCell\":\"CoEoEq_optionsCell\",\"title\":\"CoEoEq_title\",\"groupCell\":\"CoEoEq_groupCell\",\"container\":\"CoEoEq_container\",\"count\":\"CoEoEq_count\",\"badge\":\"CoEoEq_badge\",\"header\":\"CoEoEq_header\",\"actionCell\":\"CoEoEq_actionCell\",\"idCell\":\"CoEoEq_idCell\",\"titleCell\":\"CoEoEq_titleCell\",\"table\":\"CoEoEq_table\"}\nexport default classes\n\nconst _optionsCell0 = classes[\"optionsCell\"]\nexport { _optionsCell0 as \"optionsCell\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _groupCell0 = classes[\"groupCell\"]\nexport { _groupCell0 as \"groupCell\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _count0 = classes[\"count\"]\nexport { _count0 as \"count\" }\n\nconst _badge0 = classes[\"badge\"]\nexport { _badge0 as \"badge\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _actionCell0 = classes[\"actionCell\"]\nexport { _actionCell0 as \"actionCell\" }\n\nconst _idCell0 = classes[\"idCell\"]\nexport { _idCell0 as \"idCell\" }\n\nconst _titleCell0 = classes[\"titleCell\"]\nexport { _titleCell0 as \"titleCell\" }\n\nconst _table0 = classes[\"table\"]\nexport { _table0 as \"table\" }\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/layers/styles.module_built.css\";\nconst classes = {\"layerName\":\"ExR4dG_layerName\",\"controls\":\"ExR4dG_controls\",\"list\":\"ExR4dG_list\",\"container\":\"ExR4dG_container\",\"addRow\":\"ExR4dG_addRow\",\"rowTop\":\"ExR4dG_rowTop\",\"title\":\"ExR4dG_title\",\"opacityLabel\":\"ExR4dG_opacityLabel\",\"nameInput\":\"ExR4dG_nameInput\",\"header\":\"ExR4dG_header\",\"badge\":\"ExR4dG_badge\",\"subtitle\":\"ExR4dG_subtitle\",\"actions\":\"ExR4dG_actions\",\"row\":\"ExR4dG_row\",\"checkboxLabel\":\"ExR4dG_checkboxLabel\"}\nexport default classes\n\nconst _layerName0 = classes[\"layerName\"]\nexport { _layerName0 as \"layerName\" }\n\nconst _controls0 = classes[\"controls\"]\nexport { _controls0 as \"controls\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n\nconst _container0 = classes[\"container\"]\nexport { _container0 as \"container\" }\n\nconst _addRow0 = classes[\"addRow\"]\nexport { _addRow0 as \"addRow\" }\n\nconst _rowTop0 = classes[\"rowTop\"]\nexport { _rowTop0 as \"rowTop\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _opacityLabel0 = classes[\"opacityLabel\"]\nexport { _opacityLabel0 as \"opacityLabel\" }\n\nconst _nameInput0 = classes[\"nameInput\"]\nexport { _nameInput0 as \"nameInput\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _badge0 = classes[\"badge\"]\nexport { _badge0 as \"badge\" }\n\nconst _subtitle0 = classes[\"subtitle\"]\nexport { _subtitle0 as \"subtitle\" }\n\nconst _actions0 = classes[\"actions\"]\nexport { _actions0 as \"actions\" }\n\nconst _row0 = classes[\"row\"]\nexport { _row0 as \"row\" }\n\nconst _checkboxLabel0 = classes[\"checkboxLabel\"]\nexport { _checkboxLabel0 as \"checkboxLabel\" }\n","import { BasePanel } from '@/components/panels/base';\nimport { layerId } from '@/annotations';\nimport { useActiveGraph } from '@/system/provider';\nimport {\n VscodeButton,\n VscodeCheckbox,\n VscodeDivider\n} 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 = useActiveGraph()!;\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 <VscodeCheckbox\n className={styles.checkboxLabel}\n checked={layer.visible}\n label=\"Visible\"\n onChange={(event: any) =>\n system.layerStore\n .getState()\n .setLayerVisibility(\n layer.id,\n Boolean(event?.target?.checked)\n )\n }\n />\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 React, { useState } from 'react';\nimport { useStore } from 'zustand';\nimport { VscodeButton, VscodeTextfield } from '@vscode-elements/react-elements';\nimport { Trash } from 'iconoir-react';\nimport { useActiveGraph } from '@/system/provider';\nimport type { GraphSession } from '@/system/graphSession';\nimport { BasePanel } from '../base';\nimport { SectionTitle } from '../common/SectionTitle';\n\nexport function GraphPropertiesPanel() {\n const session = useActiveGraph();\n if (!session) {\n return (\n <BasePanel>\n <div style={{ padding: 12, opacity: 0.7 }}>No graph open.</div>\n </BasePanel>\n );\n }\n return <GraphProperties session={session} />;\n}\n\nconst GraphProperties: React.FC<{ session: GraphSession }> = ({ session }) => {\n const name = useStore(session.metaStore, (s) => s.name);\n const metadata = useStore(session.metaStore, (s) => s.metadata);\n const { setName, setMetadataValue, removeMetadataKey, setMetadata } =\n session.metaStore.getState();\n\n const entries = Object.entries(metadata);\n\n const renameKey = (oldKey: string, newKey: string, value: any) => {\n const trimmed = newKey.trim();\n if (trimmed === oldKey) return;\n const next = { ...session.metaStore.getState().metadata };\n delete next[oldKey];\n if (trimmed) next[trimmed] = value;\n setMetadata(next);\n };\n\n const addEntry = () => {\n const current = session.metaStore.getState().metadata;\n let i = 1;\n let key = `key${i}`;\n while (key in current) key = `key${++i}`;\n setMetadataValue(key, '');\n };\n\n return (\n <BasePanel>\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n minWidth: 0\n }}\n >\n <SectionTitle>Name</SectionTitle>\n <VscodeTextfield\n value={name}\n placeholder=\"Graph name\"\n style={{ width: '100%' }}\n onChange={(e: any) => setName(String(e?.target?.value ?? ''))}\n />\n\n <SectionTitle>Metadata</SectionTitle>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {entries.length === 0 && (\n <div\n style={{\n fontSize: 'var(--fs-desc, 0.72rem)',\n color: 'var(--ds-fg-muted)'\n }}\n >\n No metadata. Add a key/value pair below.\n </div>\n )}\n {entries.map(([key, value]) => (\n <MetadataRow\n key={key}\n entryKey={key}\n value={value}\n onRename={renameKey}\n onValueChange={(v) => setMetadataValue(key, v)}\n onRemove={() => removeMetadataKey(key)}\n />\n ))}\n <VscodeButton secondary onClick={addEntry}>\n + Add metadata\n </VscodeButton>\n </div>\n </div>\n </BasePanel>\n );\n};\n\nconst MetadataRow: React.FC<{\n entryKey: string;\n value: any;\n onRename: (oldKey: string, newKey: string, value: any) => void;\n onValueChange: (value: string) => void;\n onRemove: () => void;\n}> = ({ entryKey, value, onRename, onValueChange, onRemove }) => {\n // Key edits commit on blur (renaming changes identity); value edits are live.\n const [draftKey, setDraftKey] = useState(entryKey);\n\n return (\n <div style={{ display: 'flex', gap: 4, alignItems: 'center' }}>\n <VscodeTextfield\n value={draftKey}\n placeholder=\"key\"\n style={{ flex: 1, minWidth: 0 }}\n onChange={(e: any) => setDraftKey(String(e?.target?.value ?? ''))}\n onBlur={() => onRename(entryKey, draftKey, value)}\n />\n <VscodeTextfield\n value={String(value ?? '')}\n placeholder=\"value\"\n style={{ flex: 1, minWidth: 0 }}\n onChange={(e: any) => onValueChange(String(e?.target?.value ?? ''))}\n />\n <VscodeButton secondary iconOnly title=\"Remove\" onClick={onRemove}>\n <Trash />\n </VscodeButton>\n </div>\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 { LayersPanel } from '@/components/panels/layers';\nimport { GraphPropertiesPanel } from '@/components/panels/graphProperties';\nimport { GraphProvider } from './provider';\nimport { useStore } from 'zustand';\nimport type { GraphSession } from './graphSession';\nimport {\n DEFAULT_GRAPH_ID,\n isGraphTabId,\n sessionIdFromTabId,\n tabIdForSession\n} from '@/components/layoutController/utils';\n\n/** Live graph tab title , re-renders when the graph is renamed. */\nconst GraphTabTitle = ({ session }: { session: GraphSession }) => {\n const name = useStore(session.metaStore, (s) => s.name);\n return <>{name}</>;\n};\n\nexport class TabLoader {\n public readonly tabs: Record<string, () => TabData> = {};\n private readonly system: System;\n\n constructor(system: System) {\n this.system = system;\n\n // The default graph tab. Other graphs are loaded dynamically by id\n // (see `loadGraphTab`).\n this.register(DEFAULT_GRAPH_ID, () => this.buildGraphTab(DEFAULT_GRAPH_ID));\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\n this.register('graphProperties', () => {\n return {\n id: 'graphProperties',\n closable: true,\n title: 'Graph Properties',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <GraphPropertiesPanel />\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 // The 'conversation' tab is provided by the AI nodes package's editor\n // plugin (`@kiberon-labs/behave-graph-nodes-ai/ui`), which owns the chat\n // store and panel.\n }\n\n load(tab: TabBase): TabData | undefined {\n if (!tab.id) {\n return;\n }\n // Dynamic per-graph tabs (`graph:<sessionId>`) are not in the registry.\n if (isGraphTabId(tab.id) && tab.id !== DEFAULT_GRAPH_ID) {\n return this.buildGraphTab(tab.id);\n }\n return this.tabs[tab.id]?.();\n }\n\n register(id: string, loader: () => TabData) {\n this.tabs[id] = loader;\n }\n\n /**\n * Build the TabData for a graph tab, resolving (or lazily creating) its\n * session and wrapping the canvas in a {@link GraphProvider} so it stays bound\n * to its own graph regardless of which tab is focused.\n */\n private buildGraphTab(tabId: string): TabData {\n const sessionId = sessionIdFromTabId(tabId);\n const session = this.system.getOrCreateSession(sessionId);\n return {\n id: tabIdForSession(sessionId),\n closable: true,\n cached: true,\n group: 'graph',\n title: <GraphTabTitle session={session} />,\n content: () => (\n <ErrorBoundary fallback={'whoops'}>\n <GraphProvider value={session}>\n <HotKeys>\n <Flow />\n </HotKeys>\n </GraphProvider>\n </ErrorBoundary>\n )\n };\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 type GeneratorLocation = 'inline' | 'panel';\n\n/**\n * Single source of truth for editor settings. Each entry's `default` defines the\n * value (and its type); `persist: false` excludes it from the saved settings.\n * The store shape, setters, and the persisted-key list are all derived from this\n * , adding a setting here is the only edit needed (no setter boilerplate, no\n * separate persist allow-list to keep in sync).\n */\nconst SETTINGS = {\n edgeType: { default: EDGE_TYPE.bezier as EdgeType },\n debugMode: { default: false as boolean },\n showMenu: { default: true as boolean },\n showTimings: { default: false as boolean },\n showMinimap: { default: false as boolean },\n showGrid: { default: true as boolean },\n // Transient UI state , not persisted.\n showSearch: { default: false as boolean, persist: false },\n /** Delay applying a node value change until the user commits it. */\n delayedUpdate: { default: false as boolean },\n /** Show value types inline on nodes. */\n inlineTypes: { default: false as boolean },\n /** Show values inline on nodes. */\n inlineValues: { default: false as boolean },\n connectOnClick: { default: true as boolean },\n /**\n * When connecting sockets of different-but-convertible value types,\n * automatically insert a conversion node between them.\n */\n autoConvert: { default: true as boolean },\n snapGrid: { default: false as boolean },\n gridSize: { default: 15 as number },\n generatorLocation: { default: 'panel' as GeneratorLocation }\n} satisfies Record<string, { default: unknown; persist?: boolean }>;\n\ntype SettingsSchema = typeof SETTINGS;\n\ntype SettingsState = {\n [K in keyof SettingsSchema]: SettingsSchema[K]['default'];\n};\n\ntype SettingsSetters = {\n [K in keyof SettingsSchema as `set${Capitalize<K & string>}`]: (\n value: SettingsSchema[K]['default']\n ) => void;\n};\n\n/**\n * Generic accessors so plugin-contributed settings (dynamic keys not in the\n * static {@link SETTINGS} schema) live in the same store as the typed built-ins.\n * The auto-generated panel writes every row through {@link SystemSettingsStore.setSetting};\n * the typed per-key setters above remain for existing typed consumers.\n */\ntype SettingsDynamicAccess = {\n /** Dynamic plugin-contributed setting values, keyed by descriptor key. */\n [key: string]: unknown;\n /** Set any setting by key (used by the schema-driven panel + plugins). */\n setSetting: (key: string, value: unknown) => void;\n};\n\nexport type SystemSettingsStore = SettingsState &\n SettingsSetters &\n SettingsDynamicAccess;\n\nconst setterName = (key: string): string =>\n `set${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n\n/** Settings round-tripped to persisted storage (everything except `persist:false`). */\nexport const PERSISTED_SETTING_KEYS = (\n Object.entries(SETTINGS) as [keyof SettingsSchema, { persist?: boolean }][]\n)\n .filter(([, spec]) => spec.persist !== false)\n .map(([key]) => key);\n\nexport const systemSettingsFactory = () =>\n create<SystemSettingsStore>((set) => {\n const initial: Record<string, unknown> = {};\n for (const [key, spec] of Object.entries(SETTINGS)) {\n initial[key] = spec.default;\n initial[setterName(key)] = (value: unknown) =>\n set({ [key]: value } as Partial<SystemSettingsStore>);\n }\n // Generic setter for dynamic (plugin-contributed) keys and for the\n // schema-driven panel, which writes every row by key.\n initial.setSetting = (key: string, value: unknown) =>\n set({ [key]: value } as Partial<SystemSettingsStore>);\n return initial as SystemSettingsStore;\n });\n","import { createStore, type StoreApi } from 'zustand/vanilla';\nimport type { FC } from 'react';\nimport { EDGE_TYPE } from './settings';\n\n/**\n * Schema-driven settings.\n *\n * The Settings panel is auto-generated from a registry of {@link SettingDescriptor}s\n * rather than hand-coded JSX. Built-in settings are seeded as {@link DEFAULT_SETTINGS};\n * plugins contribute their own via `system.registerSetting(...)`, and the panel\n * renders them the same way — so a plugin can surface settings without forking\n * the panel.\n *\n * Descriptors are intentionally plain data (everything except `render`/`when` is\n * JSON-serializable), so a future declarative manifest `contributes.configuration`\n * section can feed this same registry.\n */\n\nexport type SettingEnumOption = { value: string; label: string };\n\n/** Live values bag passed to a descriptor's {@link SettingDescriptorBase.when}. */\nexport type SettingsValues = Record<string, unknown>;\n\n/** Props handed to a `type: 'custom'` descriptor's `render` component. */\nexport type SettingControlProps = {\n value: unknown;\n setValue: (value: unknown) => void;\n descriptor: SettingDescriptor;\n};\n\ntype SettingDescriptorBase = {\n /**\n * Unique key. Built-ins are flat (`edgeType`) and match the value-store keys\n * 1:1; plugin settings should be namespaced (`graphRunner.autoStart`) to avoid\n * collisions.\n */\n key: string;\n /** Category heading the row is grouped under, e.g. `\"Layout\"`. */\n section: string;\n /** Sort order within the section (falls back to registration order). */\n order?: number;\n /** Row label. */\n title?: string;\n /** Secondary description text under the label. */\n description?: string;\n /** Excluded from persisted settings when `false`. Defaults to `true`. */\n persist?: boolean;\n /** Hide the row unless this returns true for the current values. */\n when?: (values: SettingsValues) => boolean;\n};\n\nexport type SettingDescriptor =\n | (SettingDescriptorBase & { type: 'boolean'; default: boolean })\n | (SettingDescriptorBase & {\n type: 'number';\n default: number;\n min?: number;\n max?: number;\n step?: number;\n })\n | (SettingDescriptorBase & {\n type: 'string';\n default: string;\n placeholder?: string;\n })\n | (SettingDescriptorBase & {\n type: 'enum';\n default: string;\n options: SettingEnumOption[];\n })\n | (SettingDescriptorBase & {\n type: 'custom';\n default?: unknown;\n render: FC<SettingControlProps>;\n });\n\nexport type SettingsSchemaStore = {\n /** Registered descriptors, in registration order. */\n settings: SettingDescriptor[];\n /** Section names in first-seen order, for stable display grouping. */\n sectionOrder: string[];\n registerSetting: (descriptor: SettingDescriptor) => void;\n registerSettings: (descriptors: SettingDescriptor[]) => void;\n};\n\nconst toOptions = (values: readonly string[]): SettingEnumOption[] =>\n values.map((value) => ({ value, label: value }));\n\n/**\n * Built-in editor settings, mirroring the previously hand-coded panel. Keys\n * match the value-store keys in {@link file://./settings.ts} exactly, so typed\n * consumers (`settings.edgeType`, …) are unaffected.\n */\nexport const DEFAULT_SETTINGS: SettingDescriptor[] = [\n {\n key: 'edgeType',\n section: 'Layout',\n type: 'enum',\n default: EDGE_TYPE.bezier,\n options: toOptions(Object.values(EDGE_TYPE)),\n title: 'Edge Type',\n description: 'Select the type of edge to use in the graph editor.'\n },\n {\n key: 'inlineTypes',\n section: 'Accessibility',\n type: 'boolean',\n default: false,\n title: 'Show inline types',\n description:\n 'Adds additional spans to help differentiate types for colorblind users.'\n },\n {\n key: 'delayedUpdate',\n section: 'Interaction',\n type: 'boolean',\n default: false,\n title: 'Use delayed interaction',\n description: 'Forces a user to click save to update port.'\n },\n {\n key: 'connectOnClick',\n section: 'Interaction',\n type: 'boolean',\n default: true,\n title: 'Click to connect',\n description: 'Allows you to quick connect nodes by clicking on the 2 port.'\n },\n {\n key: 'autoConvert',\n section: 'Interaction',\n type: 'boolean',\n default: true,\n title: 'Auto-convert types',\n description:\n 'When connecting different but convertible types, insert a conversion node automatically.'\n },\n {\n key: 'showMinimap',\n section: 'Display',\n type: 'boolean',\n default: false,\n title: 'Show Minimap',\n description: 'Shows the minimap in the graph editing area.'\n },\n {\n key: 'showGrid',\n section: 'Display',\n type: 'boolean',\n default: true,\n title: 'Show Grid',\n description: 'Shows the grid in the graph editing area.'\n },\n {\n key: 'snapGrid',\n section: 'Display',\n type: 'boolean',\n default: false,\n title: 'Snap to Grid',\n description: 'Snaps nodes to the grid while dragging.'\n },\n {\n key: 'showTimings',\n section: 'Performance',\n type: 'boolean',\n default: false,\n title: 'Show execution time',\n description: 'Shows how long it takes for a node to process.'\n }\n];\n\nexport const settingsSchemaStoreFactory = (\n initial: SettingDescriptor[] = DEFAULT_SETTINGS\n): StoreApi<SettingsSchemaStore> =>\n createStore<SettingsSchemaStore>((set, get) => {\n const registerSetting = (descriptor: SettingDescriptor): void => {\n const { settings, sectionOrder } = get();\n if (settings.some((existing) => existing.key === descriptor.key)) {\n console.warn(\n `Setting \"${descriptor.key}\" is already registered; ignoring duplicate.`\n );\n return;\n }\n set({\n settings: [...settings, descriptor],\n sectionOrder: sectionOrder.includes(descriptor.section)\n ? sectionOrder\n : [...sectionOrder, descriptor.section]\n });\n };\n\n // Seed the built-in descriptors as the starting state.\n const settings: SettingDescriptor[] = [];\n const sectionOrder: string[] = [];\n for (const descriptor of initial) {\n if (settings.some((existing) => existing.key === descriptor.key))\n continue;\n settings.push(descriptor);\n if (!sectionOrder.includes(descriptor.section)) {\n sectionOrder.push(descriptor.section);\n }\n }\n\n return {\n settings,\n sectionOrder,\n registerSetting,\n registerSettings: (descriptors) => descriptors.forEach(registerSetting)\n };\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 = {\"label\":\"lDoYmW_label\",\"root\":\"lDoYmW_root\",\"inner\":\"lDoYmW_inner\",\"keybinding\":\"lDoYmW_keybinding\"}\nexport default classes\n\nconst _label0 = classes[\"label\"]\nexport { _label0 as \"label\" }\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _inner0 = classes[\"inner\"]\nexport { _inner0 as \"inner\" }\n\nconst _keybinding0 = classes[\"keybinding\"]\nexport { _keybinding0 as \"keybinding\" }\n","import { Item } from 'rc-menu';\nimport React from 'react';\nimport { useStore } from 'zustand';\nimport { useSystem } from '@/system';\n\nimport styles from './menuItem.module.css';\n\nexport type IMenuItemElement = React.ComponentProps<typeof Item> & {\n icon?: React.ReactNode;\n /**\n * Explicit shortcut hint (e.g. `'Ctrl+S'`). Overrides the auto-detected one.\n */\n keybinding?: string;\n /**\n * Command id this item runs. When provided, the shortcut hint is detected\n * automatically from the live keymap, so a menu item shows its shortcut just\n * by naming the command it dispatches.\n */\n commandId?: string;\n /**\n * Needed to hack into the inner part of the menu item\n */\n inner?: (children: React.ReactNode) => React.ReactNode;\n};\n\n/** Right-aligned shortcut hint resolved live from the command's keymap binding. */\nconst KeybindingHint = ({ commandId }: { commandId: string }) => {\n const sys = useSystem();\n const hint = useStore(sys.hotKeyStore, (s) =>\n s.getCommandKeybinding(commandId)\n );\n if (!hint) return null;\n return <span className={styles.keybinding}>{hint}</span>;\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 keybinding,\n commandId,\n ...rest\n}: IMenuItemElement) => {\n const hint = keybinding ? (\n <span className={styles.keybinding}>{keybinding}</span>\n ) : commandId ? (\n <KeybindingHint commandId={commandId} />\n ) : null;\n\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}>\n <span className={styles.label}>{children}</span>\n {hint}\n </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 /** Command id whose shortcut is shown next to this item. */\n commandId?: string;\n}\n/**\n * A simple button that toggles a window panel\n * @param param0\n * @returns\n */\nconst windowButton = ({\n name,\n id,\n title,\n icon,\n content,\n commandId\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\n onClick={onToggle}\n key={title}\n icon={icon}\n commandId={commandId}\n >\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: function NewGraph(rest) {\n const system = useSystem();\n return (\n <MenuItemElement\n key=\"new\"\n icon={<PagePlusIn />}\n onClick={() => system.newGraph()}\n {...rest}\n >\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 void system.runCommand('editor.save');\n };\n\n return (\n <MenuItemElement\n key={'saveUI'}\n icon={<Download />}\n onClick={onSave}\n commandId=\"editor.save\"\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.runCommand('editor.undo')}\n disabled={!canUndo}\n key={key}\n icon={<Undo />}\n commandId=\"editor.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.runCommand('editor.redo')}\n disabled={!canRedo}\n key={key}\n icon={<Redo />}\n commandId=\"editor.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: function Copy({ key, ...rest }) {\n const sys = useSystem();\n return (\n <MenuItemElement\n key={key}\n icon={<Redo />}\n onClick={() => sys.runCommand('selection.copy')}\n commandId=\"selection.copy\"\n {...rest}\n >\n Copy\n </MenuItemElement>\n );\n }\n },\n {\n name: 'paste',\n render: function Paste({ key, ...rest }) {\n const sys = useSystem();\n return (\n <MenuItemElement\n key={key}\n icon={<Redo />}\n onClick={() => void sys.runCommand('selection.paste')}\n commandId=\"selection.paste\"\n {...rest}\n >\n Paste\n </MenuItemElement>\n );\n }\n },\n new Seperator(),\n windowButton({\n name: 'find',\n id: 'find',\n title: 'Find',\n content: <SearchPanel />,\n commandId: 'editor.find'\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 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 /** Reverse map: command id -> keymap action, so any UI surface that runs a\n * command can look up its live shortcut without knowing the action name. */\n commandToAction: Record<string, string>;\n register(val: {\n action: string;\n trigger: string | string[];\n description?: string;\n handler?: Handler;\n /** Command id this binding invokes; enables shortcut hints in menus. */\n command?: string;\n }): void;\n registerDescription(action: string, description: string): void;\n registerHandler(action: string, handler: Handler): void;\n /**\n * Formatted shortcut hint for a command id (e.g. `'Ctrl+Shift+←'`), derived\n * live from the keymap, or undefined if the command has no bound key.\n */\n getCommandKeybinding(commandId: string): string | undefined;\n};\n\nconst MODIFIER_LABELS: Record<string, string> = {\n ctrl: 'Ctrl',\n control: 'Ctrl',\n cmd: 'Cmd',\n command: 'Cmd',\n meta: 'Cmd',\n shift: 'Shift',\n alt: 'Alt',\n option: 'Alt'\n};\n\nconst KEY_LABELS: Record<string, string> = {\n left: '←',\n right: '→',\n up: '↑',\n down: '↓',\n plus: '+',\n minus: '-',\n esc: 'Esc',\n escape: 'Esc',\n del: 'Del',\n delete: 'Del',\n backspace: 'Backspace',\n enter: 'Enter',\n return: 'Enter',\n space: 'Space',\n tab: 'Tab'\n};\n\nconst formatKeyPart = (part: string): string => {\n const lower = part.toLowerCase();\n if (MODIFIER_LABELS[lower]) return MODIFIER_LABELS[lower];\n if (KEY_LABELS[lower]) return KEY_LABELS[lower];\n if (part.length === 1) return part.toUpperCase();\n return part.charAt(0).toUpperCase() + part.slice(1);\n};\n\n/**\n * Format a keymap trigger into a human-readable hint, e.g. `'ctrl+shift+left'`\n * -> `'Ctrl+Shift+←'`. When several triggers are bound (cross-platform), prefer\n * the `ctrl` variant so menus show one stable shortcut. Returns undefined for an\n * empty/unset trigger.\n */\nexport const formatTrigger = (\n trigger: string | string[] | undefined\n): string | undefined => {\n let chosen: string | undefined;\n if (Array.isArray(trigger)) {\n chosen =\n trigger.find((t) => t.toLowerCase().includes('ctrl')) ?? trigger[0];\n } else {\n chosen = trigger;\n }\n if (!chosen) return undefined;\n return chosen\n .split('+')\n .map((p) => formatKeyPart(p.trim()))\n .join('+');\n};\n\n/**\n * Declarative default hotkey bindings. One table is the single source of truth\n * for the keymap, descriptions, and handlers (previously three objects that had\n * to be kept in sync). Most bindings just dispatch a registered command by id;\n * the few that need key-specific context (the pressed node / number key) use a\n * custom `handler`.\n */\ntype HotkeyBinding = {\n action: string;\n trigger: string | string[];\n description: string;\n /** Dispatch this command id (with preventDefault/stopPropagation). */\n command?: string;\n /**\n * For handler-based bindings, the command id this key maps to. Used only to\n * surface the shortcut hint in menus; does not affect what the key does.\n */\n hintCommand?: string;\n /** Or run custom key-specific logic. */\n handler?: (sys: System, e?: KeyboardEvent) => void;\n};\n\nconst NUMBER_TRIGGERS = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\nconst traceFromSelection =\n (commandId: string) => (sys: System, e?: KeyboardEvent) => {\n e?.preventDefault();\n e?.stopPropagation();\n const selection = sys.selectionStore.getState().selectedNodeId;\n if (selection) sys.runCommand(commandId, { nodeId: selection });\n };\n\nconst defaultBindings: HotkeyBinding[] = [\n {\n action: 'SAVE',\n trigger: 'ctrl+s',\n description: 'Save',\n command: 'editor.save'\n },\n {\n action: 'GROUP',\n trigger: 'ctrl+g',\n description: 'Group',\n command: 'selection.group'\n },\n {\n action: 'COPY',\n trigger: ['command+c', 'ctrl+c'],\n description: 'Copy',\n command: 'selection.copy'\n },\n {\n action: 'PASTE',\n trigger: ['command+v', 'ctrl+v'],\n description: 'Paste',\n command: 'selection.paste'\n },\n {\n action: 'SELECT_ALL',\n trigger: 'ctrl+a',\n description: 'Select All',\n command: 'selection.selectAll'\n },\n {\n action: 'UNDO',\n trigger: ['command+z', 'ctrl+z'],\n description: 'Undo',\n command: 'editor.undo'\n },\n {\n action: 'REDO',\n trigger: ['command+shift+z', 'ctrl+shift+z'],\n description: 'Redo',\n command: 'editor.redo'\n },\n {\n action: 'FIND',\n trigger: ['ctrl+f', 'command+f'],\n description: 'Find',\n command: 'editor.find'\n },\n {\n action: 'AUTO_LAYOUT',\n trigger: 'shift+alt+f',\n description: 'Auto Layout',\n command: 'editor.autoLayout'\n },\n {\n action: 'FIT_VIEW',\n trigger: ['f'],\n description: 'Fit View',\n command: 'view.fit'\n },\n {\n action: 'ZOOM_IN',\n trigger: ['ctrl+plus', 'command+plus'],\n description: 'Zoom In',\n command: 'view.zoomIn'\n },\n {\n action: 'ZOOM_OUT',\n trigger: ['command+-', 'ctrl+-'],\n description: 'Zoom Out',\n command: 'view.zoomOut'\n },\n {\n action: 'ZOOM_RESET',\n trigger: 'ctrl+0',\n description: 'Zoom Reset',\n command: 'view.zoomReset'\n },\n {\n action: 'TOGGLE_GRID',\n trigger: ['command+shift+g', 'ctrl+shift+g'],\n description: 'Toggle Grid',\n command: 'view.toggleGrid'\n },\n {\n action: 'TOGGLE_MINIMAP',\n trigger: ['command+shift+m', 'ctrl+shift+m'],\n description: 'Toggle Minimap',\n command: 'view.toggleMinimap'\n },\n {\n action: 'TOGGLE_SNAP_GRID',\n trigger: ['command+shift+s', 'ctrl+shift+s'],\n description: 'Toggle Snap Grid',\n command: 'view.toggleSnapGrid'\n },\n // Bound for the keymap UI; behaviour handled elsewhere or not yet implemented.\n {\n action: 'DUPLICATE',\n trigger: ['command+d', 'ctrl+d'],\n description: 'Duplicate'\n },\n // Deletion is handled natively by reactflow; listed here for the keymap UI.\n {\n action: 'DELETE',\n trigger: ['delete', 'del', 'backspace'],\n description: 'Delete'\n },\n // Context-aware handlers.\n {\n action: 'TRACE_UPSTREAM',\n trigger: 'ctrl+shift+left',\n description: 'Trace Upstream',\n hintCommand: 'node.traceUpstream',\n handler: traceFromSelection('node.traceUpstream')\n },\n {\n action: 'TRACE_DOWNSTREAM',\n trigger: 'ctrl+shift+right',\n description: 'Trace Downstream',\n hintCommand: 'node.traceDownstream',\n handler: traceFromSelection('node.traceDownstream')\n },\n {\n action: 'SAVE_VIEWPORT',\n trigger: [\n ...NUMBER_TRIGGERS.map((n) => `command+${n}`),\n ...NUMBER_TRIGGERS.map((n) => `ctrl+${n}`)\n ],\n description: 'Save Viewport',\n handler: (sys, event) => {\n event?.preventDefault();\n const reactFlowInstance = sys.refStore.getState().getRef('reactflow');\n if (!event || !reactFlowInstance) return;\n const viewportIndex = parseInt(event.key) - 1;\n if (viewportIndex >= 0 && viewportIndex < 9) {\n sys.graph.setViewport(viewportIndex, reactFlowInstance.getViewport());\n sys.notifications.info(`Saved viewport ${viewportIndex + 1}`);\n }\n }\n },\n {\n action: 'RECALL_VIEWPORT',\n trigger: NUMBER_TRIGGERS,\n description: 'Recall Viewport',\n handler: (sys, event) => {\n event?.preventDefault();\n const reactFlowInstance = sys.refStore.getState().getRef('reactflow');\n if (!event || !reactFlowInstance) return;\n const viewportIndex = parseInt(event.key) - 1;\n if (viewportIndex < 0 || viewportIndex >= 9) return;\n const viewport = sys.graph.viewports[viewportIndex];\n if (!viewport) {\n return;\n }\n reactFlowInstance.setViewport(viewport);\n }\n }\n];\n\nconst buildDefaults = (sys: System) => {\n const keymap: Record<string, string | string[]> = {};\n const descriptions: Record<string, string> = {};\n const handlers: Record<string, Handler> = {};\n const commandToAction: Record<string, string> = {};\n\n for (const binding of defaultBindings) {\n keymap[binding.action] = binding.trigger;\n descriptions[binding.action] = binding.description;\n\n const hintTarget = binding.command ?? binding.hintCommand;\n if (hintTarget) commandToAction[hintTarget] = binding.action;\n\n if (binding.command) {\n const commandId = binding.command;\n handlers[binding.action] = (event) => {\n event?.preventDefault();\n event?.stopPropagation();\n void sys.runCommand(commandId);\n };\n } else if (binding.handler) {\n const handler = binding.handler;\n handlers[binding.action] = (event) => handler(sys, event);\n }\n }\n\n return { keymap, descriptions, handlers, commandToAction };\n};\n\nexport const hotKeyStoreFactory = (sys: System) => {\n const { keymap, descriptions, handlers, commandToAction } =\n buildDefaults(sys);\n\n return create<HotkeyStore>((set, get) => ({\n keymap,\n descriptions,\n handlers,\n commandToAction,\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 commandToAction: {\n ...s.commandToAction,\n ...(val.command ? { [val.command]: val.action } : {})\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 getCommandKeybinding(commandId) {\n const action = get().commandToAction[commandId];\n if (!action) return undefined;\n return formatTrigger(get().keymap[action]);\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 { lazy, Suspense } from 'react';\nimport type { ControlProps } from '@/store/controls';\n\n// `json-edit-react` is a sizeable dependency and this is the *default* control\n// (used whenever a socket has no specific control), so eager-importing it puts\n// it on the editor's first-paint critical path. Load it lazily instead: the\n// node still renders immediately, and the JSON editor swaps in once its chunk\n// arrives.\nconst LazyAnyControl = lazy(() =>\n import('./AnyControlImpl').then((m) => ({ default: m.AnyControlImpl }))\n);\n\nexport const AnyControl = (props: ControlProps) => {\n return (\n <Suspense fallback={null}>\n <LazyAnyControl {...props} />\n </Suspense>\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 = {\"slideLeftAndFade\":\"TSabVa_slideLeftAndFade\",\"popoverContent\":\"TSabVa_popoverContent\",\"popoverClose\":\"TSabVa_popoverClose\",\"popoverArrow\":\"TSabVa_popoverArrow\",\"slideUpAndFade\":\"TSabVa_slideUpAndFade\",\"slideRightAndFade\":\"TSabVa_slideRightAndFade\",\"slideDownAndFade\":\"TSabVa_slideDownAndFade\"}\nexport default classes\n\nconst _slideLeftAndFade0 = classes[\"slideLeftAndFade\"]\nexport { _slideLeftAndFade0 as \"slideLeftAndFade\" }\n\nconst _popoverContent0 = classes[\"popoverContent\"]\nexport { _popoverContent0 as \"popoverContent\" }\n\nconst _popoverClose0 = classes[\"popoverClose\"]\nexport { _popoverClose0 as \"popoverClose\" }\n\nconst _popoverArrow0 = classes[\"popoverArrow\"]\nexport { _popoverArrow0 as \"popoverArrow\" }\n\nconst _slideUpAndFade0 = classes[\"slideUpAndFade\"]\nexport { _slideUpAndFade0 as \"slideUpAndFade\" }\n\nconst _slideRightAndFade0 = classes[\"slideRightAndFade\"]\nexport { _slideRightAndFade0 as \"slideRightAndFade\" }\n\nconst _slideDownAndFade0 = classes[\"slideDownAndFade\"]\nexport { _slideDownAndFade0 as \"slideDownAndFade\" }\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/controls/colorPicker/index.module_built.css\";\nconst classes = {\"colorPickerTrigger\":\"jBt58a_colorPickerTrigger\",\"popoverCloseRemoveButton\":\"jBt58a_popoverCloseRemoveButton\"}\nexport default classes\n\nconst _colorPickerTrigger0 = classes[\"colorPickerTrigger\"]\nexport { _colorPickerTrigger0 as \"colorPickerTrigger\" }\n\nconst _popoverCloseRemoveButton0 = classes[\"popoverCloseRemoveButton\"]\nexport { _popoverCloseRemoveButton0 as \"popoverCloseRemoveButton\" }\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 { GraphSession } from '@/system/graphSession';\nimport { create } from 'zustand';\n\nexport type SelectionStore = {\n selectedNodeId: string | null;\n setSelectedNodeId: (nodeId: string | null) => void;\n};\n\nexport const selectionStoreFactory = (session: GraphSession) => {\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 session.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 { 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 // Merge specs by type (additive) so layering multiple profiles/plugins\n // (core + image + ai + ...) doesn't clobber previously-registered node\n // types. Later registrations override an existing type. Use updateSpecs\n // for a full replacement.\n const byType = new Map(x.specs.map((spec) => [spec.type, spec]));\n for (const spec of registry.specs) byType.set(spec.type, spec);\n return {\n values: { ...x.values, ...registry.values },\n specs: Array.from(byType.values())\n };\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 React, { useEffect, useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeOption,\n VscodeSingleSelect\n} from '@vscode-elements/react-elements';\n\nimport { useGraph } 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 = useGraph();\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 { useGraph } 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 = useGraph();\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 { useGraph } 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 = useGraph();\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 { useGraph } 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 = useGraph();\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 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/system';\nimport type { Renderable, Toast } from 'react-hot-toast';\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}\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, type StoreApi } from 'zustand';\n\n/**\n * A user/plugin-defined automatic type conversion: \"when connecting a `from`\n * socket to a `to` socket, splice in `nodeType`\". `inputKey`/`outputKey` name\n * the converter's value sockets; when omitted they're resolved from the node\n * spec (first non-flow input/output).\n */\nexport type ConversionRule = {\n from: string;\n to: string;\n nodeType: string;\n inputKey?: string;\n outputKey?: string;\n};\n\nexport type ConversionStore = {\n conversions: ConversionRule[];\n /** Add (or replace the existing rule for the same from→to pair). */\n registerConversion: (rule: ConversionRule) => void;\n removeConversion: (from: string, to: string) => void;\n setConversions: (rules: ConversionRule[]) => void;\n findConversion: (from: string, to: string) => ConversionRule | undefined;\n};\n\nexport const conversionStoreFactory = (): StoreApi<ConversionStore> =>\n create<ConversionStore>((set, get) => ({\n conversions: [],\n registerConversion: (rule) =>\n set((s) => ({\n conversions: [\n ...s.conversions.filter(\n (c) => !(c.from === rule.from && c.to === rule.to)\n ),\n rule\n ]\n })),\n removeConversion: (from, to) =>\n set((s) => ({\n conversions: s.conversions.filter(\n (c) => !(c.from === from && c.to === to)\n )\n })),\n setConversions: (conversions) => set({ conversions: [...conversions] }),\n findConversion: (from, to) =>\n get().conversions.find((c) => c.from === from && c.to === to)\n }));\n","import { createStore, type StoreApi } from 'zustand';\nimport type { EdgeChange, XYPosition } from 'reactflow';\nimport type { System } from '@/system/system';\nimport type { GraphSession } from '@/system/graphSession';\n\n/**\n * Context handed to a command when it runs. Carries the editor + the graph it\n * acts on, plus optional targets so the same command works from a context menu,\n * a hotkey, or a toolbar button.\n */\nexport type CommandContext = {\n editor: System;\n session: GraphSession;\n nodeId?: string;\n edgeId?: string;\n sourceId?: string;\n targetId?: string;\n position?: XYPosition;\n};\n\n/**\n * A named, dispatchable action. Decouples *what* (id) from *how* (run), so UI\n * surfaces (context menus, hotkeys, menubar, toolbar) reference commands by id\n * instead of reaching into concrete stores.\n */\nexport type Command = {\n id: string;\n title?: string;\n /** When present and false, the command is treated as unavailable. */\n isEnabled?: (ctx: CommandContext) => boolean;\n run: (ctx: CommandContext) => void | Promise<void>;\n};\n\nexport type CommandStore = {\n commands: Map<string, Command>;\n /** Register (or replace) a command. Returns an unregister disposer. */\n register: (command: Command) => () => void;\n unregister: (id: string) => void;\n get: (id: string) => Command | undefined;\n list: () => Command[];\n /** Run a command by id; no-ops (with a warning) if unknown or disabled. */\n run: (id: string, ctx: CommandContext) => void | Promise<void>;\n};\n\nexport const commandStoreFactory = (): StoreApi<CommandStore> =>\n createStore<CommandStore>((set, get) => ({\n commands: new Map(),\n register: (command) => {\n set((s) => {\n const next = new Map(s.commands);\n next.set(command.id, command);\n return { commands: next };\n });\n return () => get().unregister(command.id);\n },\n unregister: (id) =>\n set((s) => {\n if (!s.commands.has(id)) return s;\n const next = new Map(s.commands);\n next.delete(id);\n return { commands: next };\n }),\n get: (id) => get().commands.get(id),\n list: () => Array.from(get().commands.values()),\n run: (id, ctx) => {\n const command = get().commands.get(id);\n if (!command) {\n console.warn(`[commands] unknown command: ${id}`);\n return;\n }\n if (command.isEnabled && !command.isEnabled(ctx)) return;\n return command.run(ctx);\n }\n }));\n\n// --- Default graph commands --------------------------------------------------\n// Transitional: these delegate to the per-session action store. As actions are\n// decomposed (a later slice), the logic can move into the command handlers and\n// the action store can shrink.\n\nconst actionsOf = (ctx: CommandContext) =>\n ctx.session.actionStore.getState().actions;\n\nconst centerOnNode = (session: GraphSession, nodeId: string): void => {\n const node = session.nodeStore.getState().nodes.find((n) => n.id === nodeId);\n if (!node) return;\n const x = node.position.x + (node.width ?? 0) / 2;\n const y = node.position.y + (node.height ?? 0) / 2;\n session.refStore\n .getState()\n .getRef('reactflow')\n ?.setCenter(x, y, { duration: 200, zoom: 1 });\n};\n\nconst reactFlowOf = (session: GraphSession) =>\n session.refStore.getState().getRef('reactflow');\n\n/**\n * Register the built-in editor commands. Hosts may override any of them by\n * re-registering with the same id, or add their own.\n */\nexport const registerDefaultCommands = (\n store: StoreApi<CommandStore>\n): void => {\n const { register } = store.getState();\n\n register({\n id: 'node.focus',\n title: 'Focus',\n run: (ctx) => {\n if (ctx.nodeId) actionsOf(ctx).focusNode(ctx.nodeId);\n }\n });\n register({\n id: 'node.traceUpstream',\n title: 'Trace Upstream',\n run: (ctx) => {\n if (ctx.nodeId) actionsOf(ctx).traceUpstream(ctx.nodeId);\n }\n });\n register({\n id: 'node.traceDownstream',\n title: 'Trace Downstream',\n run: (ctx) => {\n if (ctx.nodeId) actionsOf(ctx).traceDownstream(ctx.nodeId);\n }\n });\n register({\n id: 'trace.reset',\n title: 'Reset Trace',\n run: (ctx) => actionsOf(ctx).resetTrace()\n });\n register({\n id: 'node.togglePinned',\n title: 'Pin / Unpin',\n run: (ctx) => {\n if (ctx.nodeId) actionsOf(ctx).toggleNodePinned(ctx.nodeId);\n }\n });\n register({\n id: 'node.toggleHidden',\n title: 'Hide / Show',\n run: (ctx) => {\n if (ctx.nodeId) actionsOf(ctx).toggleNodeHidden(ctx.nodeId);\n }\n });\n\n register({\n id: 'edge.findSource',\n title: 'Find Source',\n run: (ctx) => {\n if (ctx.sourceId) centerOnNode(ctx.session, ctx.sourceId);\n }\n });\n register({\n id: 'edge.findTarget',\n title: 'Find Target',\n run: (ctx) => {\n if (ctx.targetId) centerOnNode(ctx.session, ctx.targetId);\n }\n });\n register({\n id: 'edge.delete',\n title: 'Delete',\n run: (ctx) => {\n if (!ctx.edgeId) return;\n const change: EdgeChange = { id: ctx.edgeId, type: 'remove' };\n ctx.session.edgeStore.getState().applyEdgeChanges([change]);\n }\n });\n\n register({\n id: 'selection.copy',\n title: 'Copy',\n run: (ctx) => actionsOf(ctx).copySelectionToClipboard()\n });\n register({\n id: 'selection.paste',\n title: 'Paste',\n run: (ctx) => actionsOf(ctx).pasteFromClipboard()\n });\n register({\n id: 'selection.group',\n title: 'Group',\n run: (ctx) => actionsOf(ctx).groupNodes()\n });\n register({\n id: 'selection.selectAll',\n title: 'Select All',\n run: (ctx) =>\n ctx.session.nodeStore\n .getState()\n .setNodes((nodes) => nodes.map((n) => ({ ...n, selected: true })))\n });\n\n // Editor-level\n register({\n id: 'editor.save',\n title: 'Save Graph',\n run: (ctx) => {\n void actionsOf(ctx).save();\n }\n });\n register({\n id: 'editor.undo',\n title: 'Undo',\n run: (ctx) => ctx.session.undoManager.undo()\n });\n register({\n id: 'editor.redo',\n title: 'Redo',\n run: (ctx) => ctx.session.undoManager.redo()\n });\n register({\n id: 'editor.find',\n title: 'Find',\n run: (ctx) => ctx.editor.tabStore.getState().openTab('find')\n });\n // `editor.autoLayout` is contributed by the optional layout plugin\n // (`@/plugin/layout`), which owns the heavy elkjs/dagre dependencies. When\n // that plugin is not registered the command is simply unavailable and the\n // bound hotkey no-ops.\n\n // View\n register({\n id: 'view.fit',\n title: 'Fit View',\n run: (ctx) => {\n reactFlowOf(ctx.session)?.fitView({\n padding: 0.2,\n includeHiddenNodes: true\n });\n }\n });\n register({\n id: 'view.zoomIn',\n title: 'Zoom In',\n run: (ctx) => reactFlowOf(ctx.session)?.zoomIn({ duration: 300 })\n });\n register({\n id: 'view.zoomOut',\n title: 'Zoom Out',\n run: (ctx) => reactFlowOf(ctx.session)?.zoomOut({ duration: 300 })\n });\n register({\n id: 'view.zoomReset',\n title: 'Reset Zoom',\n run: (ctx) => {\n const rf = reactFlowOf(ctx.session);\n if (!rf) return;\n rf.setViewport({ ...rf.getViewport(), zoom: 1 });\n }\n });\n register({\n id: 'view.toggleGrid',\n title: 'Toggle Grid',\n run: (ctx) => {\n const s = ctx.editor.systemSettings.getState();\n s.setShowGrid(!s.showGrid);\n }\n });\n register({\n id: 'view.toggleMinimap',\n title: 'Toggle Minimap',\n run: (ctx) => {\n const s = ctx.editor.systemSettings.getState();\n s.setShowMinimap(!s.showMinimap);\n }\n });\n register({\n id: 'view.toggleSnapGrid',\n title: 'Toggle Snap to Grid',\n run: (ctx) => {\n const s = ctx.editor.systemSettings.getState();\n s.setSnapGrid(!s.snapGrid);\n }\n });\n};\n","import { createStore, type StoreApi } from 'zustand';\nimport { hidden, pinned } from '@/annotations';\nimport { isBehaveNode } from '@/util/isBehaveNode';\nimport type { CommandContext } from './commands';\n\n/** Which canvas target a context-menu item applies to. */\nexport type ContextMenuTarget = 'node' | 'edge' | 'selection' | 'pane';\n\n/**\n * A registrable context-menu entry. Items dispatch either a registered command\n * (`commandId`) or an inline `onSelect`. `group` controls separator placement;\n * `order` controls position within a target. `when` hides the item dynamically.\n */\nexport type ContextMenuItem = {\n id: string;\n target: ContextMenuTarget;\n /** Static text, or a function for state-dependent labels (e.g. Pin/Unpin). */\n label: string | ((ctx: CommandContext) => string);\n keybinding?: string;\n /** Ascending sort within the target. */\n order?: number;\n /** Items with different adjacent groups get a separator between them. */\n group?: string | number;\n when?: (ctx: CommandContext) => boolean;\n /** Dispatch a registered command by id. */\n commandId?: string;\n /** Or run inline (takes precedence over commandId). */\n onSelect?: (ctx: CommandContext) => void;\n};\n\nexport type ContextMenuStore = {\n items: ContextMenuItem[];\n /** Register (or replace by id) an item. Returns an unregister disposer. */\n register: (item: ContextMenuItem) => () => void;\n unregister: (id: string) => void;\n /** Items for a target, sorted by `order`. Filtering by `when` is the caller's. */\n getItems: (target: ContextMenuTarget) => ContextMenuItem[];\n};\n\nexport const contextMenuStoreFactory = (): StoreApi<ContextMenuStore> =>\n createStore<ContextMenuStore>((set, get) => ({\n items: [],\n register: (item) => {\n set((s) => ({\n items: [...s.items.filter((i) => i.id !== item.id), item]\n }));\n return () => get().unregister(item.id);\n },\n unregister: (id) =>\n set((s) => ({ items: s.items.filter((i) => i.id !== id) })),\n getItems: (target) =>\n get()\n .items.filter((i) => i.target === target)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0))\n }));\n\n// --- Default context menus ---------------------------------------------------\n\nconst nodeAt = (ctx: CommandContext) =>\n ctx.session.nodeStore.getState().nodes.find((n) => n.id === ctx.nodeId);\n\nconst nodeFlag = (ctx: CommandContext, key: string): boolean => {\n const node = nodeAt(ctx);\n return node && 'data' in node\n ? Boolean((node.data.annotations as Record<string, unknown>)?.[key])\n : false;\n};\n\n// The default node items only make sense on behave nodes; presentational node\n// types (notes, groups, ...) register their own `when`-scoped items instead.\nconst isBehaveTarget = (ctx: CommandContext): boolean => {\n const node = nodeAt(ctx);\n return node !== undefined && isBehaveNode(node);\n};\n\n/**\n * Register the built-in context-menu items, dispatching the default commands.\n * Hosts can add/remove/replace items by id without forking the menu components.\n */\nexport const registerDefaultContextMenu = (\n store: StoreApi<ContextMenuStore>\n): void => {\n const { register } = store.getState();\n\n // Node\n register({\n id: 'node.focus',\n target: 'node',\n label: 'Focus',\n order: 10,\n group: 'focus',\n when: isBehaveTarget,\n commandId: 'node.focus'\n });\n register({\n id: 'node.traceUpstream',\n target: 'node',\n label: 'Trace Upstream',\n order: 20,\n group: 'trace',\n when: isBehaveTarget,\n commandId: 'node.traceUpstream'\n });\n register({\n id: 'node.traceDownstream',\n target: 'node',\n label: 'Trace Downstream',\n order: 21,\n group: 'trace',\n when: isBehaveTarget,\n commandId: 'node.traceDownstream'\n });\n register({\n id: 'node.resetTrace',\n target: 'node',\n label: 'Reset Trace',\n order: 30,\n group: 'reset',\n when: isBehaveTarget,\n commandId: 'trace.reset'\n });\n register({\n id: 'node.togglePinned',\n target: 'node',\n label: (ctx) => (nodeFlag(ctx, pinned) ? 'Unpin' : 'Pin'),\n order: 40,\n group: 'visibility',\n when: isBehaveTarget,\n commandId: 'node.togglePinned'\n });\n register({\n id: 'node.toggleHidden',\n target: 'node',\n label: (ctx) => (nodeFlag(ctx, hidden) ? 'Show' : 'Hide'),\n order: 41,\n group: 'visibility',\n when: isBehaveTarget,\n commandId: 'node.toggleHidden'\n });\n\n // Edge\n register({\n id: 'edge.findSource',\n target: 'edge',\n label: 'Find Source',\n order: 10,\n group: 'find',\n commandId: 'edge.findSource'\n });\n register({\n id: 'edge.findTarget',\n target: 'edge',\n label: 'Find Target',\n order: 11,\n group: 'find',\n commandId: 'edge.findTarget'\n });\n register({\n id: 'edge.delete',\n target: 'edge',\n label: 'Delete',\n order: 20,\n group: 'delete',\n commandId: 'edge.delete'\n });\n\n // Selection\n register({\n id: 'selection.copy',\n target: 'selection',\n label: 'Copy',\n order: 10,\n group: 'clipboard',\n commandId: 'selection.copy'\n });\n register({\n id: 'selection.paste',\n target: 'selection',\n label: 'Paste',\n order: 11,\n group: 'clipboard',\n commandId: 'selection.paste'\n });\n register({\n id: 'selection.group',\n target: 'selection',\n label: 'Group',\n order: 20,\n group: 'group',\n commandId: 'selection.group'\n });\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\nconst 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 { Viewport } from 'reactflow';\nimport type { GraphSession } from './graphSession';\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: GraphSession;\n\n constructor(session: GraphSession) {\n this.sys = session;\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 const meta = this.sys.metaStore.getState();\n return {\n v: '1.0.0',\n name: meta.name,\n user: {\n viewport: this.viewports[0] || { x: 0, y: 0, zoom: 1 }\n },\n annotations: { ...meta.metadata },\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.sys.metaStore.getState().metadata };\n }\n\n setAnnotations(annotations: { [key: string]: any }) {\n this.sys.metaStore.getState().mergeMetadata(annotations);\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.sys.metaStore.getState().setMetadata(data.annotations || {});\n if (data.name) this.sys.metaStore.getState().setName(data.name);\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 { 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/** The reactflow path builder that backs a given edge type when there are no\n * control points. Unknown types fall back to the better-bezier builder. */\nfunction edgeFnForType(edgeType: string) {\n switch (edgeType) {\n case EDGE_TYPE.simpleBezier:\n return getSimpleBezierPath;\n case EDGE_TYPE.smoothStep:\n return getSmoothStepPath;\n case EDGE_TYPE.straight:\n return getStraightPath;\n case EDGE_TYPE.bezier:\n default:\n return getBetterBezierPath;\n }\n}\n\n/** Straight polyline through every point. */\nfunction straightPathThrough(points: ControlPoint[]): string {\n return points\n .map((p, i) => (i === 0 ? `M ${p.x},${p.y}` : `L ${p.x},${p.y}`))\n .join(' ');\n}\n\n/** Orthogonal \"smooth step\" path that jogs at the midpoint of each segment. */\nfunction smoothStepPathThrough(points: ControlPoint[]): string {\n let path = `M ${points[0]?.x},${points[0]?.y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const current = points[i];\n const next = points[i + 1];\n if (!current || !next) continue;\n const midX = (current.x + next.x) / 2;\n path += ` L ${midX},${current.y} L ${midX},${next.y}`;\n }\n path += ` L ${points[points.length - 1]?.x},${points[points.length - 1]?.y}`;\n return path;\n}\n\n/** Curved path through every point, degrading to line/quadratic for 2/3 points. */\nfunction bezierPathThrough(points: ControlPoint[]): string {\n if (points.length === 2) {\n return `M ${points[0]?.x},${points[0]?.y} L ${points[1]?.x},${points[1]?.y}`;\n }\n if (points.length === 3) {\n return `M ${points[0]?.x},${points[0]?.y} Q ${points[1]?.x},${points[1]?.y} ${points[2]?.x},${points[2]?.y}`;\n }\n\n // For multiple control points, chain quadratic segments and finish with a line.\n let path = `M ${points[0]?.x},${points[0]?.y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p1 = points[i + 1];\n if (!p1) continue;\n\n if (i === points.length - 2) {\n path += ` L ${p1.x},${p1.y}`;\n continue;\n }\n\n path += ` Q ${p1.x},${p1.y}`;\n const p2 = points[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 return path;\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 the default builder for the edge type.\n const [path] = edgeFnForType(edgeType)({\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 return straightPathThrough(allPoints);\n }\n if (edgeType === EDGE_TYPE.smoothStep) {\n return smoothStepPathThrough(allPoints);\n }\n return bezierPathThrough(allPoints);\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 {\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 { useGraph } 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 = useGraph();\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(--ds-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 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 { GraphSession } from '@/system/graphSession';\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 { 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\nexport const flowStoreFactory = (session: GraphSession) => {\n const flowStore = create<FlowStore>((set, get) => ({\n graphJson: null,\n // `noteNode` (and its legacy `commentNode` alias) is contributed by the\n // optional notes plugin (`@/plugin/notes`), which owns the heavy\n // tiptap/prosemirror dependency.\n nodeTypes: {\n group: GroupNode,\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 = session.nodeStore.getState().nodes;\n const edges = session.edgeStore.getState().edges;\n const _variables = session.variableStore.getState().variables;\n const specs = session.editor.specStore.getState().specs;\n\n const computed = flowToBehave(session, nodes, edges, specs);\n\n set({ graphJson: computed });\n return computed;\n },\n\n setGraph: (graphJson: GraphJSON, options?: { skipLayout?: boolean }) => {\n session.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 session.editor.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 session.nodeStore.getState().setNodes(nodes);\n session.edgeStore.getState().setEdges(edges);\n }\n\n // custom events stored in session.eventsStore\n session.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 session.nodeStore.subscribe(() => {\n flowStore.getState().invalidateCache();\n });\n\n session.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 = (session: GraphSession) =>\n create<NodeStore>((set) => ({\n nodes: [],\n addNode(node) {\n set((x) => ({ nodes: [...x.nodes, node] }));\n session.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 session.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 = (session: GraphSession) =>\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 session.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 { 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 { 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 type { GraphSession } from '@/system/graphSession';\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: GraphSession): 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 system.metaStore.getState().name ||\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 { GraphSession } from '@/system/graphSession';\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: GraphSession) => {\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: GraphSession, 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: GraphSession) =>\n create<ActionStore>((set, get) => ({\n actions: {\n save: async () => {\n try {\n const uiGraph = buildUIGraphJSON(sys);\n sys.editor.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 type { Engine, INode } from '@kiberon-labs/behave-graph';\nimport { create } from 'zustand';\nimport type { GraphSession } from '@/system/graphSession';\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' | 'lane'> & { lane?: number }) => void;\n updateSpan: (nodeId: string, updates: Partial<TraceSpan>) => void;\n};\n\nexport const traceStoreFactory = (_: GraphSession) => {\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 { 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 type { GraphSession } from '@/system/graphSession';\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 = (session: GraphSession) => {\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 session.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 { 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 { create, type StoreApi } from 'zustand';\n\n/**\n * Reactive graph-level properties for a single {@link GraphSession}: the display\n * name (also the tab title) and an arbitrary metadata bag (the graph\n * annotations). Backed by a store so the Graph Properties panel, the tab title\n * and anything else stay in sync.\n */\nexport type GraphMetaStore = {\n name: string;\n metadata: Record<string, any>;\n setName: (name: string) => void;\n /** Replace the whole metadata bag. */\n setMetadata: (metadata: Record<string, any>) => void;\n /** Shallow-merge into the metadata bag. */\n mergeMetadata: (partial: Record<string, any>) => void;\n setMetadataValue: (key: string, value: any) => void;\n removeMetadataKey: (key: string) => void;\n};\n\nexport const graphMetaStoreFactory = (\n name = 'Graph'\n): StoreApi<GraphMetaStore> =>\n create<GraphMetaStore>((set) => ({\n name,\n metadata: {},\n setName: (name) => set({ name }),\n setMetadata: (metadata) => set({ metadata: { ...metadata } }),\n mergeMetadata: (partial) =>\n set((s) => ({ metadata: { ...s.metadata, ...partial } })),\n setMetadataValue: (key, value) =>\n set((s) => ({ metadata: { ...s.metadata, [key]: value } })),\n removeMetadataKey: (key) =>\n set((s) => {\n const next = { ...s.metadata };\n delete next[key];\n return { metadata: next };\n })\n }));\n","import { type StoreApi } from 'zustand';\nimport { UndoManager } from './undoRedo';\nimport { PubSub } from './pubsub';\nimport { Graph } from './graph';\nimport type { System, GraphPubSys } from './system';\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 { actionStoreFactory, type ActionStore } from '@/store/actions';\nimport { traceStoreFactory, type TraceStore } from '@/store/traces';\nimport { eventsStoreFactory, type EventsStore } from '@/store/events';\nimport { layerStoreFactory, type LayerStore } from '@/store/layers';\nimport { logStoreFactory, type LogStore } from '@/store/logs';\nimport { graphMetaStoreFactory, type GraphMetaStore } from '@/store/graphMeta';\nimport type { UIGraphJSON } from '@/types/graph';\n\n/**\n * Augmentable surface for per-graph state contributed by plugins. Mirrors\n * {@link ISystem} at the editor level: a plugin adds typed properties to every\n * graph by augmenting this interface and assigning them via\n * {@link GraphSession.decorate} from inside a session extension.\n *\n * @example\n * declare module '@/system/graphSession' {\n * interface IGraphSession {\n * myController?: MyController;\n * }\n * }\n */\nexport interface IGraphSession {}\n\n/**\n * Merge the augmentable surface into the class instance type. Declaration\n * merging (same-named interface + class) makes plugin-added members , set via\n * {@link GraphSession.decorate} , readable as `session.x`, which `implements`\n * alone would NOT provide.\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface GraphSession extends IGraphSession {}\n\n/**\n * A single open graph. Owns all per-graph state , nodes, edges, variables,\n * selection, traces, layers, logs, undo history and a private pubsub , so that\n * multiple graphs can be open simultaneously in complete isolation.\n *\n * Shared, editor-level resources (registry, specs, settings, notifications, ...)\n * are reached through {@link GraphSession.editor}.\n *\n * Per-graph state contributed by editor plugins is attached on creation via\n * session extensions (`system.registerSessionExtension`), which may register\n * teardown through {@link GraphSession.onDispose}.\n */\nexport class GraphSession {\n public readonly id: string;\n public readonly editor: System;\n /** Reactive graph-level properties (name + metadata). */\n public readonly metaStore: StoreApi<GraphMetaStore>;\n public readonly pubsub = new PubSub<GraphPubSys>();\n public readonly undoManager = new UndoManager();\n\n /** Display name, used as the graph tab title. Backed by {@link metaStore}. */\n get name(): string {\n return this.metaStore.getState().name;\n }\n set name(value: string) {\n this.metaStore.getState().setName(value);\n }\n\n public readonly controlStore: StoreApi<ControlsStore>;\n public readonly variableStore: StoreApi<VariableStore>;\n public readonly refStore: StoreApi<RefStore>;\n public readonly logsStore: StoreApi<LogStore>;\n public readonly eventsStore: StoreApi<EventsStore>;\n public readonly nodeStore: StoreApi<NodeStore>;\n public readonly edgeStore: StoreApi<EdgeStore>;\n public readonly flowStore: StoreApi<FlowStore>;\n public readonly selectionStore: StoreApi<SelectionStore>;\n public readonly actionStore: StoreApi<ActionStore>;\n public readonly layerStore: StoreApi<LayerStore>;\n public readonly traceStore: StoreApi<TraceStore>;\n public readonly graph: Graph;\n\n /** Cleanups registered by session extensions, run (LIFO) on {@link dispose}. */\n private readonly disposers: Array<() => void> = [];\n\n constructor(editor: System, id = 'graph', name = 'Graph') {\n this.id = id;\n this.editor = editor;\n this.metaStore = graphMetaStoreFactory(name);\n\n // Construction order preserves the dependency wiring of the old System ctor.\n this.controlStore = controlsStoreFactory();\n this.variableStore = variableStoreFactory();\n this.refStore = refStoreFactory();\n this.logsStore = logStoreFactory();\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.actionStore = actionStoreFactory(this);\n this.layerStore = layerStoreFactory(this);\n this.traceStore = traceStoreFactory(this);\n this.graph = new Graph(this);\n\n // Per-session behaviours (alignment, ...) are contributed by opt-in plugins\n // via system.registerSessionExtension(...), not wired here. See the\n // alignment plugin (`@/plugin/alignment`).\n }\n\n /**\n * Convenience access to the shared editor notifications service.\n */\n get notifications() {\n return this.editor.notifications;\n }\n\n /**\n * Attach a plugin-contributed property to this session. The companion to the\n * {@link IGraphSession} augmentation; mirrors {@link System.decorate}.\n */\n decorate<K extends keyof IGraphSession>(\n name: K,\n val: IGraphSession[K]\n ): void {\n (this as IGraphSession)[name] = val;\n }\n\n /**\n * Register a cleanup to run when this session is disposed. Session extensions\n * use this (via their returned cleanup) to tear down per-graph state they\n * attached. Cleanups run in reverse registration order.\n */\n onDispose(cleanup: () => void): void {\n this.disposers.push(cleanup);\n }\n\n serialize(): UIGraphJSON {\n return this.graph.serialize();\n }\n\n /**\n * Tear down this session's reactive wiring. Called when its tab is closed so\n * its pubsub subscriptions and trace flush loop don't leak. Extension-supplied\n * cleanups run first (LIFO), then the built-in teardown.\n */\n dispose(): void {\n for (let i = this.disposers.length - 1; i >= 0; i--) {\n try {\n this.disposers[i]!();\n } catch (err) {\n console.error('GraphSession disposer failed', err);\n }\n }\n this.disposers.length = 0;\n\n // Per-session plugin state (e.g. the graph runner's runController) is torn\n // down by the extension cleanups registered above via onDispose , core no\n // longer reaches into plugin-owned fields here.\n this.traceStore.getState().connectEngine(undefined);\n this.pubsub.clearAllSubscriptions();\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 type { LayoutBase } from 'rc-dock';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport type { UIGraphJSON } from '@/types/graph';\nimport { downloadJson } from '@/util/downloadJson';\nimport type { System } from './system';\n\n/**\n * Sinks invoked when the editor emits its save events. Each entry maps one\n * editor-level pubsub topic to the side effect that persists it (write the JSON\n * somewhere). Override any subset to redirect where saved data goes; sinks left\n * unspecified keep the built-in file-download behaviour.\n *\n * Loading is not represented here: the menubar's \"Load\" items already read a\n * file from disk and deserialize it into the focused graph by default, so there\n * is nothing host-specific to wire for the common case.\n */\nexport interface PersistenceAdapter {\n /** Persist a full UI graph save (`graph:saved`). */\n saveGraph: (graph: UIGraphJSON) => void;\n /** Persist a raw inner behave-graph save (`graph:inner:saved`). */\n saveInnerGraph: (graph: GraphJSON) => void;\n /** Persist a dock layout save (`layout:saved`). */\n saveLayout: (layout: LayoutBase) => void;\n}\n\n/**\n * Whether the file-download default can run. Guards the built-in sinks so that\n * constructing a `System` in a non-DOM context (tests, SSR, the compiler) never\n * throws , the subscriptions are harmless, only the download body is skipped.\n */\nconst canDownload = (): boolean =>\n typeof document !== 'undefined' && typeof URL !== 'undefined';\n\n/**\n * The built-in persistence: saving triggers a browser download of the\n * corresponding JSON file. This is the default so a freshly constructed editor\n * has working Save actions without any per-host or per-story wiring.\n */\nexport const defaultPersistenceAdapter: PersistenceAdapter = {\n saveGraph: (graph) => {\n if (canDownload()) downloadJson('graph.json', graph);\n },\n saveInnerGraph: (graph) => {\n if (canDownload()) downloadJson('graph.behave.json', graph);\n },\n saveLayout: (layout) => {\n if (canDownload()) downloadJson('layout.json', layout);\n }\n};\n\n/**\n * Subscribe the given (or default) persistence sinks to the editor's save\n * topics. Any sink not provided falls back to {@link defaultPersistenceAdapter}.\n * Returns a disposer that removes every subscription it added.\n */\nexport function installPersistence(\n system: System,\n adapter: Partial<PersistenceAdapter> = {}\n): () => void {\n const resolved: PersistenceAdapter = {\n ...defaultPersistenceAdapter,\n ...adapter\n };\n\n const tokens = [\n system.pubsub.subscribe('graph:saved', (_, graph) =>\n resolved.saveGraph(graph)\n ),\n system.pubsub.subscribe('graph:inner:saved', (_, graph) =>\n resolved.saveInnerGraph(graph)\n ),\n system.pubsub.subscribe('layout:saved', (_, layout) =>\n resolved.saveLayout(layout)\n )\n ];\n\n return () => {\n for (const token of tokens) {\n if (typeof token === 'string') system.pubsub.unsubscribe(token);\n }\n };\n}\n","import { type StoreApi } from 'zustand';\nimport { createStore } from 'zustand/vanilla';\nimport type { Edge, Node, Viewport } from 'reactflow';\nimport { tabStoreFactory, type TabStore } from '@/store/tabs';\nimport { TabLoader } from './tabLoader';\nimport {\n systemSettingsFactory,\n PERSISTED_SETTING_KEYS,\n type SystemSettingsStore\n} from '../store/settings.js';\nimport {\n settingsSchemaStoreFactory,\n type SettingsSchemaStore,\n type SettingDescriptor\n} from '../store/settingsSchema.js';\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 { controlsStoreFactory, type ControlsStore } from '@/store/controls';\nimport { selectionStoreFactory, type SelectionStore } from '@/store/selection';\nimport { registryStoreFactory, type RegistryStore } from '@/store/registry';\nimport { specsStoreFactory, type SpecsStore } from '@/store/specs';\nimport { specificStoreFactory, type SpecificStore } from '@/store/specific';\nimport {\n socketGeneratorStoreFactory,\n type SocketGeneratorStore\n} from '@/store/socketGenerator';\nimport {\n documentationStoreFactory,\n type DocumentationStore\n} from '@/store/documentation';\nimport { toolbarStoreFactory, type ToolbarStore } from '@/store/toolbar';\nimport { Notifications, type NotificationData } from './notifications';\nimport {\n conversionStoreFactory,\n type ConversionStore,\n type ConversionRule\n} from '@/store/conversions';\nimport {\n commandStoreFactory,\n registerDefaultCommands,\n type CommandStore,\n type CommandContext\n} from '@/store/commands';\nimport {\n contextMenuStoreFactory,\n registerDefaultContextMenu,\n type ContextMenuStore\n} from '@/store/contextMenu';\nimport { GraphSession } from './graphSession';\nimport { installPersistence, type PersistenceAdapter } from './persistence';\nimport { v4 as uuidv4 } from 'uuid';\nimport { tabIdForSession } from '@/components/layoutController/utils';\nimport type { Renderable } from 'react-hot-toast';\nimport type { INodeRegistry } from '@/types/NodeMetadata';\nimport type { LoadablePlugin, SessionExtension } from './plugin';\nimport type { UIGraphJSON } from '@/types/graph';\nimport type { GraphJSON } from '@kiberon-labs/behave-graph';\nimport type { LayoutBase } from 'rc-dock';\nimport type { FlowStore, NodeStore, EdgeStore } from '@/store/flow';\nimport type { VariableStore } from '@/store/variables';\nimport type { RefStore } from '@/store/refs';\nimport type { ActionStore } from '@/store/actions';\nimport type { TraceStore } from '@/store/traces';\nimport type { EventsStore } from '@/store/events';\nimport type { LogStore } from '@/store/logs';\nimport type { LayerStore } from '@/store/layers';\nimport type { UndoManager } from './undoRedo';\nimport type { Graph } from './graph';\n\n/**\n * Editor-level pubsub topics. These are global to the editor and shared across\n * every open graph. Augment this interface (not {@link GraphPubSys}) for events\n * that are not tied to a specific graph.\n */\nexport interface EditorPubSys {\n notification: NotificationData;\n 'notification:dismiss': {\n toastId?: string;\n };\n 'layout:saved': LayoutBase;\n 'graph:saved': UIGraphJSON;\n 'graph:inner:saved': GraphJSON;\n}\n\n/**\n * Per-graph pubsub topics. Each {@link GraphSession} owns its own bus typed with\n * this interface, so events stay isolated to the graph that produced them.\n * Augment this interface for events that belong to a single graph.\n */\nexport interface GraphPubSys {\n 'edge:added': Edge;\n 'node:added': Node;\n 'edge:removed': Edge;\n 'node:removed': Node;\n graphAnnotationsChanged: {\n [key: string]: any;\n };\n saveViewport: {\n index: number;\n viewport: Viewport;\n };\n}\n\n/**\n * Combined pubsub surface kept for backwards compatibility. Prefer the split\n * {@link EditorPubSys} / {@link GraphPubSys} interfaces.\n */\nexport interface PubSys extends EditorPubSys, GraphPubSys {}\n\n/**\n * Use this to extend the System interface when adding plugins\n */\nexport interface ISystem {}\n\n/** Minimal storage adapter for persisting editor settings. */\nexport type SettingsStorage = {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n};\n\n/** Serialized editor-level settings (UI toggles + custom type conversions). */\nexport type EditorSettingsJSON = {\n settings?: Record<string, any>;\n conversions?: ConversionRule[];\n};\n\nconst SETTINGS_STORAGE_KEY = 'behave-graph:editor-settings';\n\nconst settingSetterName = (key: string): string =>\n `set${key.charAt(0).toUpperCase()}${key.slice(1)}`;\n\nconst defaultSettingsStorage = (): SettingsStorage | undefined => {\n try {\n if (typeof localStorage !== 'undefined') return localStorage;\n } catch {\n // localStorage access can throw in sandboxed contexts\n }\n return undefined;\n};\n\n/**\n * Observable registry of open graph sessions plus the currently focused one.\n * Backed by a zustand store so panels rendered outside of a graph tab can\n * subscribe and re-render when the active graph changes.\n */\nexport type ActiveGraphStore = {\n activeGraphId: string | null;\n sessions: Record<string, GraphSession>;\n setActiveGraph: (id: string | null) => void;\n addSession: (session: GraphSession) => void;\n removeSession: (id: string) => void;\n getActive: () => GraphSession | undefined;\n};\n\nconst activeGraphStoreFactory = () =>\n createStore<ActiveGraphStore>((set, get) => ({\n activeGraphId: null,\n sessions: {},\n setActiveGraph: (activeGraphId) => set(() => ({ activeGraphId })),\n addSession: (session) =>\n set((state) => ({\n sessions: { ...state.sessions, [session.id]: session }\n })),\n removeSession: (id) =>\n set((state) => {\n const next = { ...state.sessions };\n delete next[id];\n const activeGraphId =\n state.activeGraphId === id ? null : state.activeGraphId;\n return { sessions: next, activeGraphId };\n }),\n getActive: () => {\n const state = get();\n return state.activeGraphId\n ? state.sessions[state.activeGraphId]\n : undefined;\n }\n }));\n\n/**\n * The editor-level system. Holds state that is shared across every open graph\n * (settings, registry, specs, menubar, tabs, ...) plus an observable registry of\n * per-graph {@link GraphSession} instances. Per-graph state itself lives on the\n * sessions, not here.\n *\n * The class is intentionally still named `System` so existing `declare module`\n * augmentations (`interface System { ... }`) keep merging and the public API is\n * stable; `EditorSystem` is exported as an alias for new code.\n */\nexport class System implements ISystem {\n public readonly pubsub = new PubSub<EditorPubSys>();\n public readonly tabStore: StoreApi<TabStore>;\n public readonly tabLoader: TabLoader;\n public readonly systemSettings: StoreApi<SystemSettingsStore>;\n /** Registry of setting descriptors driving the auto-generated Settings panel. */\n public readonly settingsSchema: StoreApi<SettingsSchemaStore>;\n public readonly legendStore: StoreApi<LegendStore>;\n public readonly menubarStore: StoreApi<MenuBarStore>;\n public readonly hotKeyStore: StoreApi<HotkeyStore>;\n public readonly registry: StoreApi<RegistryStore>;\n public readonly specStore: StoreApi<SpecsStore>;\n public readonly specificStore: StoreApi<SpecificStore>;\n public readonly socketGeneratorStore: StoreApi<SocketGeneratorStore>;\n public readonly documentationStore: StoreApi<DocumentationStore>;\n public readonly toolbarStore: StoreApi<ToolbarStore>;\n public readonly controlStore: StoreApi<ControlsStore>;\n /** User/plugin-defined automatic type conversions for auto-convert. */\n public readonly conversionStore: StoreApi<ConversionStore>;\n /** Named, dispatchable commands shared across hotkeys/menus/toolbar. */\n public readonly commandStore: StoreApi<CommandStore>;\n /** Per-target context-menu item registry (node/edge/selection/pane). */\n public readonly contextMenuStore: StoreApi<ContextMenuStore>;\n public readonly notifications: Notifications = new Notifications(this);\n\n /** Observable registry of open graph sessions + the focused one. */\n public readonly activeGraph: StoreApi<ActiveGraphStore>;\n\n /** Editor-level extensions applied to every graph session on creation. */\n private readonly sessionExtensions = new Set<SessionExtension>();\n\n /** Disposer for the currently installed graph/layout save handlers. */\n private persistenceDisposer: () => void = () => {};\n\n protected deps: Record<string, unknown> = {};\n\n /**\n * Create a new editor System instance\n * @param registry - INodeRegistry containing nodes and values metadata\n */\n constructor(registry?: INodeRegistry) {\n this.activeGraph = activeGraphStoreFactory();\n this.tabStore = tabStoreFactory();\n this.controlStore = controlsStoreFactory();\n this.systemSettings = systemSettingsFactory();\n // Seeded with the built-in setting descriptors (DEFAULT_SETTINGS). Plugins\n // append their own via registerSetting(...).\n this.settingsSchema = settingsSchemaStoreFactory();\n this.legendStore = legendStoreFactory();\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.conversionStore = conversionStoreFactory();\n this.commandStore = commandStoreFactory();\n this.contextMenuStore = contextMenuStoreFactory();\n this.hotKeyStore = hotKeyStoreFactory(this);\n\n // Seed the built-in commands + context-menu items. Hosts can override by id\n // or add their own via these registries.\n registerDefaultCommands(this.commandStore);\n registerDefaultContextMenu(this.contextMenuStore);\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 // Wire the default graph/layout save handlers (download-to-file) so a fresh\n // editor has working Save actions out of the box. Hosts that persist\n // elsewhere override via enablePersistence(...) or opt out with\n // disablePersistence().\n this.persistenceDisposer = installPersistence(this);\n }\n\n /**\n * The currently focused graph session, if any.\n */\n get session(): GraphSession | undefined {\n return this.activeGraph.getState().getActive();\n }\n\n /**\n * Create a new graph session, register it and (by default) make it active.\n */\n createSession(\n id = 'graph',\n options?: { activate?: boolean; name?: string }\n ): GraphSession {\n const session = new GraphSession(this, id, options?.name ?? 'Graph');\n this.activeGraph.getState().addSession(session);\n // Let editor plugins extend the fully-constructed session before it becomes\n // active, so panels reacting to the active graph see a complete instance.\n for (const extension of this.sessionExtensions) {\n this.applySessionExtension(session, extension);\n }\n if (options?.activate ?? true) {\n this.activeGraph.getState().setActiveGraph(id);\n }\n return session;\n }\n\n /**\n * Look up an existing session by id, creating an empty one if missing.\n */\n getOrCreateSession(id: string): GraphSession {\n return (\n this.activeGraph.getState().sessions[id] ??\n this.createSession(id, { activate: false })\n );\n }\n\n /**\n * Create a brand new, empty graph in its own tab and focus it.\n */\n newGraph(name?: string): GraphSession {\n const id = uuidv4();\n const count = Object.keys(this.activeGraph.getState().sessions).length;\n const session = this.createSession(id, {\n activate: true,\n name: name ?? `Untitled ${count}`\n });\n this.tabStore.getState().openTab(tabIdForSession(id));\n return session;\n }\n\n /**\n * Dispose a graph session and remove it from the registry. Called when its\n * tab is closed.\n */\n disposeSession(id: string): void {\n const session = this.activeGraph.getState().sessions[id];\n if (!session) return;\n session.dispose();\n this.activeGraph.getState().removeSession(id);\n }\n\n // ---------------------------------------------------------------------------\n // Focused-graph accessors.\n //\n // All graph-canvas and dock-panel consumers read per-graph state through\n // useGraph()/useActiveGraph(), and execution is per-session via each\n // GraphSession's run controller. These getters remain only for editor-level\n // surfaces that imperatively act on the *focused* graph , the hotkey handlers,\n // layout utilities, the menubar, and server-metadata fan-out. They resolve to\n // the focused session, consistent with the \"panels follow focus\" model; they\n // are a convenience, not a single-open-graph limit (multiple graphs are open\n // and independently runnable at once).\n // ---------------------------------------------------------------------------\n get flowStore(): StoreApi<FlowStore> {\n return this.session!.flowStore;\n }\n get nodeStore(): StoreApi<NodeStore> {\n return this.session!.nodeStore;\n }\n get edgeStore(): StoreApi<EdgeStore> {\n return this.session!.edgeStore;\n }\n get variableStore(): StoreApi<VariableStore> {\n return this.session!.variableStore;\n }\n get selectionStore(): StoreApi<SelectionStore> {\n return this.session!.selectionStore;\n }\n get refStore(): StoreApi<RefStore> {\n return this.session!.refStore;\n }\n get actionStore(): StoreApi<ActionStore> {\n return this.session!.actionStore;\n }\n get traceStore(): StoreApi<TraceStore> {\n return this.session!.traceStore;\n }\n get eventsStore(): StoreApi<EventsStore> {\n return this.session!.eventsStore;\n }\n get logsStore(): StoreApi<LogStore> {\n return this.session!.logsStore;\n }\n get layerStore(): StoreApi<LayerStore> {\n return this.session!.layerStore;\n }\n get graph(): Graph {\n return this.session!.graph;\n }\n get undoManager(): UndoManager {\n return this.session!.undoManager;\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 * Register an extension applied to every {@link GraphSession}. It runs against\n * each graph already open at registration time and against every graph created\n * afterwards (via {@link createSession}), so a plugin can attach per-graph\n * state to new graph instances from a single editor-level registration.\n *\n * If the extension returns a cleanup it is wired to the session's\n * {@link GraphSession.onDispose} and runs when that graph's tab is closed.\n *\n * @returns an unregister function that stops the extension from applying to\n * sessions created later. It does not retroactively tear down sessions already\n * extended (those clean up on their own dispose).\n */\n registerSessionExtension(extension: SessionExtension): () => void {\n this.sessionExtensions.add(extension);\n // Apply to graphs that already exist so registration order doesn't matter.\n for (const session of Object.values(this.activeGraph.getState().sessions)) {\n this.applySessionExtension(session, extension);\n }\n return () => {\n this.sessionExtensions.delete(extension);\n };\n }\n\n /** Run a single session extension, wiring any returned cleanup to dispose. */\n private applySessionExtension(\n session: GraphSession,\n extension: SessionExtension\n ): void {\n try {\n const cleanup = extension(session);\n if (typeof cleanup === 'function') session.onDispose(cleanup);\n } catch (err) {\n console.error('Session extension failed', err);\n }\n }\n\n /**\n * Register a custom automatic type conversion (e.g. from a profile plugin) so\n * auto-convert can splice in the given node for that type pair.\n */\n registerConversion(rule: ConversionRule): void {\n this.conversionStore.getState().registerConversion(rule);\n }\n\n /**\n * Contribute a setting to the schema-driven Settings panel. The panel\n * auto-generates a row for it (grouped under `descriptor.section`), and its\n * default value is seeded into the settings store if not already present.\n * Built-in settings are registered the same way at construction.\n *\n * @example\n * system.registerSetting({\n * key: 'graphRunner.autoStart', section: 'Graph Runner', type: 'boolean',\n * default: false, title: 'Auto-start runner'\n * });\n */\n registerSetting(descriptor: SettingDescriptor): void {\n if (\n descriptor.type !== 'custom' &&\n !(descriptor.key in this.systemSettings.getState())\n ) {\n this.systemSettings\n .getState()\n .setSetting(descriptor.key, descriptor.default);\n }\n this.settingsSchema.getState().registerSetting(descriptor);\n }\n\n /** Contribute several settings at once. */\n registerSettings(descriptors: SettingDescriptor[]): void {\n for (const descriptor of descriptors) this.registerSetting(descriptor);\n }\n\n /** Read a setting value by key (built-in or plugin-contributed). */\n getSetting<T = unknown>(key: string): T {\n return this.systemSettings.getState()[key] as T;\n }\n\n /** Set a setting value by key. Persists if the descriptor allows it. */\n setSetting(key: string, value: unknown): void {\n this.systemSettings.getState().setSetting(key, value);\n }\n\n /**\n * Dispatch a registered command against the focused graph (or a supplied\n * session). Convenience used by hotkeys, the menubar and the toolbar so they\n * share one dispatch path. No-ops if there is no graph to act on.\n */\n runCommand(id: string, ctx?: Partial<CommandContext>): void | Promise<void> {\n const session = ctx?.session ?? this.session;\n if (!session) return;\n return this.commandStore\n .getState()\n .run(id, { editor: this, session, ...ctx });\n }\n\n /**\n * Override where the editor's Save actions send their data. The editor\n * publishes `graph:saved`, `graph:inner:saved` and `layout:saved`; by default\n * each triggers a JSON file download. Pass an adapter to redirect any subset\n * of those to your own sink (write to disk, POST to a backend, ...); topics\n * you omit keep the file-download default. Replaces any previously installed\n * handlers and returns a disposer.\n *\n * This governs graph/layout saving only; editor *settings* persistence is\n * separate , see {@link enableSettingsPersistence}.\n *\n * @example\n * // Persist graphs to a backend, keep the default layout download.\n * system.enablePersistence({\n * saveGraph: (graph) => api.put('/graphs/current', graph)\n * });\n */\n enablePersistence(adapter?: Partial<PersistenceAdapter>): () => void {\n this.persistenceDisposer();\n this.persistenceDisposer = installPersistence(this, adapter);\n return this.persistenceDisposer;\n }\n\n /**\n * Remove the default (or custom) graph/layout save handlers entirely. Use this\n * when the host handles saving through a channel of its own and the built-in\n * file download would be redundant (e.g. the VS Code extension).\n */\n disablePersistence(): void {\n this.persistenceDisposer();\n this.persistenceDisposer = () => {};\n }\n\n /**\n * Serialize the persistable editor settings , the UI toggles plus any custom\n * type conversions , to a plain JSON object.\n */\n serializeSettings(): EditorSettingsJSON {\n const state = this.systemSettings.getState() as Record<string, any>;\n const settings: Record<string, any> = {};\n for (const key of this.persistedSettingKeys()) settings[key] = state[key];\n return {\n settings,\n conversions: this.conversionStore.getState().conversions\n };\n }\n\n /**\n * Keys round-tripped to persisted storage: the built-in persisted keys plus\n * every plugin-contributed descriptor that opts in (`persist !== false`).\n * Custom descriptors carry no backing value, so they are excluded.\n */\n private persistedSettingKeys(): string[] {\n const keys = new Set<string>(PERSISTED_SETTING_KEYS as string[]);\n for (const descriptor of this.settingsSchema.getState().settings) {\n if (descriptor.type === 'custom' || descriptor.persist === false)\n continue;\n keys.add(descriptor.key);\n }\n return [...keys];\n }\n\n /**\n * Apply previously-serialized editor settings (toggles + conversions).\n * Unknown keys are ignored.\n */\n applySettings(json: EditorSettingsJSON | undefined): void {\n if (!json) return;\n const state = this.systemSettings.getState() as Record<string, any>;\n for (const [key, value] of Object.entries(json.settings ?? {})) {\n if (value === undefined) continue;\n const setter = state[settingSetterName(key)];\n if (typeof setter === 'function') setter(value);\n // Plugin-contributed keys have no typed setter: write generically.\n else if (typeof state.setSetting === 'function')\n state.setSetting(key, value);\n }\n if (Array.isArray(json.conversions)) {\n this.conversionStore.getState().setConversions(json.conversions);\n }\n }\n\n /**\n * Persist editor settings + conversions to a storage adapter (localStorage by\n * default). Applies any saved state immediately, then saves (debounced) on\n * change. Returns a disposer. A host can pass its own storage adapter (e.g.\n * one backed by VS Code workspace state) instead of localStorage.\n */\n enableSettingsPersistence(\n storage: SettingsStorage | undefined = defaultSettingsStorage()\n ): () => void {\n if (!storage) return () => {};\n\n try {\n const raw = storage.getItem(SETTINGS_STORAGE_KEY);\n if (raw) this.applySettings(JSON.parse(raw));\n } catch {\n // ignore malformed saved state\n }\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n const save = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n try {\n storage.setItem(\n SETTINGS_STORAGE_KEY,\n JSON.stringify(this.serializeSettings())\n );\n } catch {\n // ignore quota / serialization errors\n }\n }, 300);\n };\n\n const unsubSettings = this.systemSettings.subscribe(save);\n const unsubConversions = this.conversionStore.subscribe(save);\n return () => {\n if (timer) clearTimeout(timer);\n unsubSettings();\n unsubConversions();\n };\n }\n}\n\n/**\n * Alias for {@link System} expressing its role as the shared editor-level system.\n */\nexport { System as EditorSystem };\n","import type { System } from '.';\nimport type { GraphSession } from './graphSession';\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}\n\n/**\n * Cleanup returned by a {@link SessionExtension}. Run when the session it was\n * applied to is disposed (its tab closed).\n */\nexport type SessionExtensionCleanup = () => void;\n\n/**\n * Extends a single {@link GraphSession}. Registered at the editor level via\n * `system.registerSessionExtension(...)`, it runs against every graph , those\n * already open at registration time and any created afterwards , so an editor\n * plugin can attach per-graph state (extra stores, controllers, pubsub\n * subscriptions) to each new graph instance.\n *\n * Return a cleanup to tear that per-graph state down when the session is\n * disposed.\n *\n * @example\n * system.registerSessionExtension((session) => {\n * const controller = new MyController(session);\n * session.decorate('myController', controller);\n * return () => controller.dispose();\n * });\n */\nexport interface SessionExtension {\n (session: GraphSession): void | SessionExtensionCleanup;\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 type { CSSProperties } from 'react';\nimport { useStore } from 'zustand';\nimport { VscodeContextMenu } from '@vscode-elements/react-elements';\nimport { useGraph } from '@/system';\nimport type { CommandContext } from '@/store/commands';\nimport type { ContextMenuTarget } from '@/store/contextMenu';\n\ntype MenuData =\n | { separator: true }\n | { label: string; value: string; keybinding?: string };\n\n/**\n * Renders a context menu for a target from the editor's contextMenu registry,\n * dispatching selections through the command registry. The three concrete menus\n * (node/edge/selection) are thin wrappers that supply the target + context.\n */\nexport const DynamicContextMenu = ({\n target,\n context,\n style\n}: {\n target: ContextMenuTarget;\n context: Omit<CommandContext, 'editor' | 'session'>;\n style?: CSSProperties;\n}) => {\n const session = useGraph();\n const editor = session.editor;\n\n // Subscribe so the menu re-renders when items/commands/keymap change.\n useStore(editor.contextMenuStore, (s) => s.items);\n useStore(editor.commandStore, (s) => s.commands);\n useStore(editor.hotKeyStore, (s) => s.keymap);\n\n const hotKeys = editor.hotKeyStore.getState();\n\n const ctx: CommandContext = { editor, session, ...context };\n\n const items = editor.contextMenuStore\n .getState()\n .getItems(target)\n .filter((i) => !i.when || i.when(ctx));\n\n const data: MenuData[] = [];\n let lastGroup: unknown;\n for (const item of items) {\n if (data.length > 0 && item.group !== lastGroup) {\n data.push({ separator: true });\n }\n lastGroup = item.group;\n // Auto-detect the shortcut from the command's live keymap binding; fall\n // back to a static hint only when the command has no bound key.\n const derived = item.commandId\n ? hotKeys.getCommandKeybinding(item.commandId)\n : undefined;\n data.push({\n label: typeof item.label === 'function' ? item.label(ctx) : item.label,\n value: item.id,\n keybinding: derived ?? item.keybinding\n });\n }\n\n if (data.length === 0) return null;\n\n const onSelect = (e: any) => {\n const id = e?.detail?.value as string | undefined;\n const item = items.find((i) => i.id === id);\n if (!item) return;\n if (item.onSelect) {\n item.onSelect(ctx);\n return;\n }\n if (item.commandId) {\n void editor.commandStore.getState().run(item.commandId, ctx);\n }\n };\n\n return (\n <VscodeContextMenu\n show\n onVscContextMenuSelect={onSelect}\n style={{ zIndex: 2000, position: 'absolute', ...style }}\n data={data}\n />\n );\n};\n","import type { CSSProperties } from 'react';\nimport { DynamicContextMenu } from './DynamicContextMenu';\n\nexport interface INodeContextMenuProps extends CSSProperties {\n nodeID: string;\n}\n\n/**\n * Node context menu. Items come from the editor's contextMenu registry (target\n * 'node') and dispatch through the command registry , see store/contextMenu.ts\n * and store/commands.ts to add or override entries.\n */\nexport const NodeContextMenu = ({ nodeID, ...rest }: INodeContextMenuProps) => (\n <DynamicContextMenu target=\"node\" context={{ nodeId: nodeID }} style={rest} />\n);\n","import type { CSSProperties } from 'react';\nimport { DynamicContextMenu } from './DynamicContextMenu';\n\nexport interface IEdgeContextMenuProps extends CSSProperties {\n edgeID: string;\n sourceID: string;\n targetID: string;\n}\n\n/** Edge context menu , items from the contextMenu registry (target 'edge'). */\nexport const EdgeContextMenu = ({\n edgeID,\n sourceID,\n targetID,\n ...rest\n}: IEdgeContextMenuProps) => (\n <DynamicContextMenu\n target=\"edge\"\n context={{ edgeId: edgeID, sourceId: sourceID, targetId: targetID }}\n style={rest}\n />\n);\n","import type { CSSProperties } from 'react';\nimport { DynamicContextMenu } from './DynamicContextMenu';\n\nexport interface ISelectionContextMenuProps extends CSSProperties {}\n\n/** Selection context menu , items from the contextMenu registry ('selection'). */\nexport const SelectionContextMenu = ({\n ...rest\n}: ISelectionContextMenuProps) => (\n <DynamicContextMenu target=\"selection\" context={{}} style={rest} />\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 { useGraph } 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 = useGraph();\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 { useGraph } 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 = useGraph();\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 { useGraph } 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 = useGraph();\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 { useGraph } 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 = useGraph();\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 \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/generators/GraphBoundaryGenerator.module_built.css\";\nconst classes = {\"type\":\"wvnzHW_type\",\"param\":\"wvnzHW_param\",\"topRow\":\"wvnzHW_topRow\",\"name\":\"wvnzHW_name\",\"list\":\"wvnzHW_list\"}\nexport default classes\n\nconst _type0 = classes[\"type\"]\nexport { _type0 as \"type\" }\n\nconst _param0 = classes[\"param\"]\nexport { _param0 as \"param\" }\n\nconst _topRow0 = classes[\"topRow\"]\nexport { _topRow0 as \"topRow\" }\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _list0 = classes[\"list\"]\nexport { _list0 as \"list\" }\n","import React, { useCallback, useEffect, useMemo } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeButton,\n VscodeOption,\n VscodeSingleSelect,\n VscodeTextfield\n} from '@vscode-elements/react-elements';\nimport { Trash } from 'iconoir-react';\nimport { useGraph } 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';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n GRAPH_INPUT_TYPE,\n GRAPH_OUTPUT_TYPE,\n paramId,\n type ContractParam\n} from '@/transformers/contract';\nimport styles from './GraphBoundaryGenerator.module.css';\n\ntype BoundaryKind = 'input' | 'output';\n\nexport function getGraphInputGenerator() {\n return {\n name: `${GRAPH_INPUT_TYPE}.socketGenerator`,\n check: (spec: NodeSpecJSON) => spec?.type === GRAPH_INPUT_TYPE,\n render: (props: SocketGeneratorRenderProps) => (\n <GraphBoundaryGenerator {...props} kind=\"input\" />\n )\n };\n}\n\nexport function getGraphOutputGenerator() {\n return {\n name: `${GRAPH_OUTPUT_TYPE}.socketGenerator`,\n check: (spec: NodeSpecJSON) => spec?.type === GRAPH_OUTPUT_TYPE,\n render: (props: SocketGeneratorRenderProps) => (\n <GraphBoundaryGenerator {...props} kind=\"output\" />\n )\n };\n}\n\n/**\n * Properties-panel editor for a subgraph boundary node's contract: add / name /\n * type the inputs (`graph/input`) or outputs (`graph/output`). The configured\n * params are mirrored onto the node's dynamic ports , `graph/input` exposes them\n * as outputs, `graph/output` as inputs (the `flow` socket is static on the core\n * node).\n */\nconst GraphBoundaryGenerator: React.FC<\n SocketGeneratorRenderProps & { kind: BoundaryKind }\n> = ({ node, kind }) => {\n const session = useGraph();\n // Select the stable `values` object then derive , a freshly built array inside\n // the selector would change identity every render and loop.\n const values = useStore(session.editor.registry, (s) => s.values);\n const valueTypes = useMemo(\n () => Object.keys(values).filter((t) => t !== 'flow'),\n [values]\n );\n\n const params: ContractParam[] = useMemo(\n () =>\n Array.isArray(node.data.configuration?.parameters)\n ? (node.data.configuration!.parameters as ContractParam[])\n : [],\n [node.data]\n );\n const paramsKey = JSON.stringify(params);\n\n // Mirror params onto dynamic ports. The socket identity (name/key/handle id)\n // is the stable param id; the display label is the editable name.\n useEffect(() => {\n const sockets: Socket[] = params.map((param) => {\n const id = paramId(param);\n return {\n name: id,\n key: id,\n label: param.name || id,\n valueType: param.valueTypeName || 'string'\n };\n });\n session.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 ...(kind === 'input' ? { outputs: sockets } : { inputs: sockets })\n }\n }\n } as IBehaveNode;\n })\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [paramsKey, kind, node.id, session.nodeStore]);\n\n const update = useCallback(\n (next: ContractParam[]) => {\n session.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.data?.configuration, parameters: next }\n }\n } as IBehaveNode;\n })\n );\n },\n [node.id, session]\n );\n\n const addParam = useCallback(() => {\n const base = kind === 'input' ? 'in' : 'out';\n const existing = new Set(params.map((p) => p.name));\n let i = params.length + 1;\n let name = `${base}${i}`;\n while (existing.has(name)) name = `${base}${++i}`;\n update([\n ...params,\n { id: uuidv4(), name, valueTypeName: valueTypes[0] ?? 'string' }\n ]);\n }, [kind, params, update, valueTypes]);\n\n const setName = useCallback(\n (index: number, name: string) =>\n update(params.map((p, i) => (i === index ? { ...p, name } : p))),\n [params, update]\n );\n\n const setType = useCallback(\n (index: number, valueTypeName: string) =>\n update(params.map((p, i) => (i === index ? { ...p, valueTypeName } : p))),\n [params, update]\n );\n\n const remove = useCallback(\n (index: number) => update(params.filter((_, i) => i !== index)),\n [params, update]\n );\n\n return (\n <div className={styles.list}>\n {params.map((param, index) => (\n <div key={param.id ?? index} className={styles.param}>\n <div className={styles.topRow}>\n <VscodeTextfield\n className={styles.name}\n value={param.name}\n placeholder={`${kind} name`}\n onChange={(e: any) =>\n setName(index, String(e?.target?.value ?? ''))\n }\n />\n <VscodeButton\n secondary\n iconOnly\n title={`Remove ${kind}`}\n onClick={() => remove(index)}\n >\n <Trash />\n </VscodeButton>\n </div>\n <VscodeSingleSelect\n className={styles.type}\n value={param.valueTypeName}\n onChange={(e: any) =>\n setType(index, String(e?.target?.value ?? 'string'))\n }\n >\n {valueTypes.map((t) => (\n <VscodeOption key={t} value={t}>\n {t}\n </VscodeOption>\n ))}\n </VscodeSingleSelect>\n </div>\n ))}\n <VscodeButton secondary onClick={addParam}>\n + Add {kind}\n </VscodeButton>\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';\nimport { useGraph } 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';\nimport {\n CALL_SUBGRAPH_TYPE,\n contractToParams,\n deriveContract,\n paramsToSockets,\n type ContractParam\n} from '@/transformers/contract';\n\nexport function getCallSubgraphGenerator() {\n return {\n name: `${CALL_SUBGRAPH_TYPE}.socketGenerator`,\n check: (spec: NodeSpecJSON) => spec?.type === CALL_SUBGRAPH_TYPE,\n render: CallSubgraphGenerator\n };\n}\n\nconst toSockets = (params: ContractParam[] | undefined): Socket[] =>\n paramsToSockets(params ?? []);\n\n/**\n * Properties-panel editor for a Call Subgraph node: pick which open graph to\n * call. Selecting one copies that graph's contract into the node configuration\n * and mirrors it onto the node's dynamic input/output ports. The `flow` input\n * and the `started` / `completed` flow outputs are static on the core node.\n */\nconst CallSubgraphGenerator: React.FC<SocketGeneratorRenderProps> = ({\n node\n}) => {\n const session = useGraph();\n const sessions = useStore(session.editor.activeGraph, (s) => s.sessions);\n\n const options = useMemo(\n () =>\n Object.values(sessions)\n .filter((s) => s.id !== session.id)\n .map((s) => ({ id: s.id, name: s.name })),\n [sessions, session.id]\n );\n\n const config = node.data.configuration as\n | {\n subgraphId?: string;\n inputs?: ContractParam[];\n outputs?: ContractParam[];\n }\n | undefined;\n const subgraphId = String(config?.subgraphId ?? '');\n const portsKey = JSON.stringify({\n inputs: config?.inputs ?? [],\n outputs: config?.outputs ?? []\n });\n\n // Mirror the copied contract onto dynamic ports.\n useEffect(() => {\n const inputs = toSockets(config?.inputs);\n const outputs = toSockets(config?.outputs);\n session.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.data?.dynamicPorts, inputs, outputs }\n }\n } as IBehaveNode;\n })\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [portsKey, node.id, session.nodeStore]);\n\n const select = useCallback(\n (nextId: string) => {\n const target = sessions[nextId];\n const contract = target\n ? deriveContract(target.nodeStore.getState().nodes)\n : { graphInputs: [], graphOutputs: [] };\n const inputs = contractToParams(contract.graphInputs);\n const outputs = contractToParams(contract.graphOutputs);\n\n session.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 subgraphId: nextId,\n inputs,\n outputs\n }\n }\n } as IBehaveNode;\n })\n );\n },\n [node.id, session, sessions]\n );\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n <div style={{ fontSize: 12, opacity: 0.9 }}>Subgraph</div>\n <VscodeSingleSelect\n value={subgraphId}\n onChange={(e: any) => select(String(e?.target?.value ?? ''))}\n disabled={options.length === 0}\n >\n {options.length === 0 ? (\n <VscodeOption value=\"\">No other graphs open</VscodeOption>\n ) : (\n <>\n <VscodeOption value=\"\">Select a graph...</VscodeOption>\n {options.map((opt) => (\n <VscodeOption key={opt.id} value={opt.id}>\n {opt.name || opt.id}\n </VscodeOption>\n ))}\n </>\n )}\n </VscodeSingleSelect>\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';\nimport {\n getGraphInputGenerator,\n getGraphOutputGenerator\n} from '../generators/GraphBoundaryGenerator';\nimport { getCallSubgraphGenerator } from '../generators/CallSubgraphGenerator';\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 const graphInput = getGraphInputGenerator();\n store.registerGenerator(graphInput);\n\n const graphOutput = getGraphOutputGenerator();\n store.registerGenerator(graphOutput);\n\n const callSubgraph = getCallSubgraphGenerator();\n store.registerGenerator(callSubgraph);\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 system.socketGeneratorStore.getState().unregisterGenerator(graphInput.name);\n system.socketGeneratorStore\n .getState()\n .unregisterGenerator(graphOutput.name);\n system.socketGeneratorStore\n .getState()\n .unregisterGenerator(callSubgraph.name);\n };\n}\n","import type { System } from '@/system/system';\nimport type { GraphSession } from '@/system/graphSession';\nimport type { IBehaveNode } from '@/types/nodes';\nimport {\n CALL_SUBGRAPH_TYPE,\n contractToParams,\n deriveContract,\n paramsToSockets,\n type ContractParam\n} from '@/transformers/contract';\n\n/**\n * Stable string key for a session's contract (its graph/input + graph/output\n * params). Used to detect *contract* changes and ignore unrelated node edits\n * (e.g. dragging), so we only repropagate when the boundary actually changes.\n */\nconst contractKey = (session: GraphSession): string =>\n JSON.stringify(deriveContract(session.nodeStore.getState().nodes));\n\n/**\n * Reconcile every Call Subgraph node in every open graph with the *current*\n * contract of the subgraph it references. Idempotent: a node is only rewritten\n * when its stored contract/ports actually differ, so this converges and never\n * loops (rewriting a call node does not change its host graph's contract).\n */\nconst resyncAllCallNodes = (editor: System): void => {\n const sessions = editor.activeGraph.getState().sessions;\n\n for (const target of Object.values(sessions)) {\n let mutated = false;\n\n const nextNodes = target.nodeStore.getState().nodes.map((node) => {\n if (node.data?.type !== CALL_SUBGRAPH_TYPE) return node;\n\n const subgraphId = String(node.data?.configuration?.subgraphId ?? '');\n const subgraph = subgraphId ? sessions[subgraphId] : undefined;\n // Referenced graph not open (e.g. its tab was closed): leave the last\n // known contract in place rather than wiping the node's ports.\n if (!subgraph) return node;\n\n const contract = deriveContract(subgraph.nodeStore.getState().nodes);\n const inputs: ContractParam[] = contractToParams(contract.graphInputs);\n const outputs: ContractParam[] = contractToParams(contract.graphOutputs);\n const inputSockets = paramsToSockets(inputs);\n const outputSockets = paramsToSockets(outputs);\n\n const currentConfig = {\n inputs: node.data?.configuration?.inputs ?? [],\n outputs: node.data?.configuration?.outputs ?? []\n };\n const currentPorts = {\n inputs: node.data?.dynamicPorts?.inputs ?? [],\n outputs: node.data?.dynamicPorts?.outputs ?? []\n };\n\n if (\n JSON.stringify(currentConfig) === JSON.stringify({ inputs, outputs }) &&\n JSON.stringify(currentPorts) ===\n JSON.stringify({ inputs: inputSockets, outputs: outputSockets })\n ) {\n return node;\n }\n\n mutated = true;\n return {\n ...node,\n data: {\n ...node.data,\n configuration: {\n ...node.data?.configuration,\n inputs,\n outputs\n },\n dynamicPorts: {\n ...node.data?.dynamicPorts,\n inputs: inputSockets,\n outputs: outputSockets\n }\n }\n } as IBehaveNode;\n });\n\n if (mutated) target.nodeStore.getState().setNodes(() => nextNodes);\n }\n};\n\n/**\n * Keep Call Subgraph nodes live with the graphs they reference. Without this a\n * call node only captures the subgraph's contract at selection time; editing the\n * subgraph's inputs/outputs afterwards would leave callers stale.\n *\n * Implemented as an editor session extension: every open graph (existing and\n * future) watches its own contract, and when it changes we repropagate to all\n * call nodes referencing it across every graph. Returns a disposer.\n */\nexport function setupCallSubgraphSync(editor: System): () => void {\n const unsubscribes = new Map<string, () => void>();\n\n const watch = (session: GraphSession) => {\n if (unsubscribes.has(session.id)) return;\n\n let last = contractKey(session);\n const unsub = session.nodeStore.subscribe(() => {\n const next = contractKey(session);\n if (next === last) return; // ignore non-contract edits (drags, etc.)\n last = next;\n resyncAllCallNodes(editor);\n });\n\n unsubscribes.set(session.id, unsub);\n session.onDispose(() => {\n unsubscribes.get(session.id)?.();\n unsubscribes.delete(session.id);\n });\n };\n\n const unregister = editor.registerSessionExtension(watch);\n // Reconcile graphs already open (e.g. a project loaded from disk) once.\n resyncAllCallNodes(editor);\n\n return () => {\n unregister();\n for (const unsub of unsubscribes.values()) unsub();\n unsubscribes.clear();\n };\n}\n","import type { System } from '@/system/system';\nimport { registerDefaultSocketGenerators } from './registerDefaultGenerators';\nimport { setupCallSubgraphSync } from './callSubgraphSync';\n\n/** Editors that already had their built-in content registered. */\nconst initialized = new WeakSet<System>();\n\n/**\n * Register the editor's built-in content , the default socket generators and the\n * call-subgraph contract sync , on an editor instance.\n *\n * Idempotent per editor: safe to call from every graph-canvas mount (multiple\n * tabs) without double-registering. The default content is editor-lifetime; the\n * subgraph sync's per-session subscriptions clean themselves up on session\n * dispose.\n *\n * A host that wants a blank or fully custom editor can simply not rely on the\n * canvas's auto-call and register its own content instead.\n */\nexport function registerDefaults(editor: System): void {\n if (initialized.has(editor)) return;\n initialized.add(editor);\n\n registerDefaultSocketGenerators(editor);\n setupCallSubgraphSync(editor);\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/components/FloatingToolbar/index.module_built.css\";\nconst classes = {\"panel\":\"YfUpeW_panel\",\"toolbar\":\"YfUpeW_toolbar\",\"zoomLevel\":\"YfUpeW_zoomLevel\",\"buttonGroup\":\"YfUpeW_buttonGroup\"}\nexport default classes\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n\nconst _zoomLevel0 = classes[\"zoomLevel\"]\nexport { _zoomLevel0 as \"zoomLevel\" }\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\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 { useGraph } 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 session = useGraph();\n const visible = useStore(session.editor.toolbarStore, (x) => x.visible);\n const customGroups = useStore(session.editor.toolbarStore, (x) => x.groups);\n const reactFlowInstance = useRefFromStore(session.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 session.pubsub.publishSync('alignment:align', { type, axis });\n },\n [session]\n );\n\n const publishDistribution = useCallback(\n (type: AlignmentType, axis: AlignmentAxis) => {\n session.pubsub.publishSync('alignment:distribute', { type, axis });\n },\n [session]\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 { useGraph } 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 { registerDefaults } from '@/generators/registerDefaults';\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 session = useGraph();\n const editor = session.editor;\n const getGraphJson = useStore(session.flowStore, (x) => x.getGraph);\n const specJson = useStore(editor.specStore, (x) => x.specs);\n const showGrid = useStore(editor.systemSettings, (x) => x.showGrid);\n const showMinimap = useStore(editor.systemSettings, (x) => x.showMinimap);\n const snapToGrid = useStore(editor.systemSettings, (x) => x.snapGrid);\n const gridSize = useStore(editor.systemSettings, (x) => x.gridSize);\n const edgeTypes = useStore(session.flowStore, (x) => x.edgeTypes);\n const nodeTypes = useStore(session.flowStore, (x) => x.nodeTypes);\n const layers = useStore(session.layerStore, (x) => x.layers);\n const nodeLayers = useStore(session.layerStore, (x) => x.nodeLayers);\n const defaultLayerId = useStore(session.layerStore, (x) => x.defaultLayerId);\n\n const ref = useRef<HTMLDivElement>(null);\n const setRef = useStore(session.refStore, (x) => x.setRef);\n\n // When this canvas is interacted with, mark its graph as focused so the shared\n // side-panels (Variables, Traces, ...) bind to it. Lets two graphs be open at\n // once without a singular \"active graph\" , focus simply follows interaction.\n const focusThisGraph = useCallback(() => {\n const active = editor.activeGraph.getState();\n if (active.activeGraphId !== session.id) {\n active.setActiveGraph(session.id);\n }\n }, [editor, session.id]);\n\n const getReactFlowInstance = useCallback(\n () => session.refStore.getState().getRef('reactflow'),\n [session.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 // Editor-level built-in content. Idempotent per editor, so opening multiple\n // graph tabs (each a Flow canvas) registers it once rather than per mount.\n useEffect(() => {\n registerDefaults(editor);\n }, [editor]);\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 id={session.id}\n style={{ flex: 1 }}\n ref={ref}\n onPointerDownCapture={focusThisGraph}\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","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 = {\"root\":\"H8EqXq_root\",\"panelExtra\":\"H8EqXq_panelExtra\"}\nexport default classes\n\nconst _root0 = classes[\"root\"]\nexport { _root0 as \"root\" }\n\nconst _panelExtra0 = classes[\"panelExtra\"]\nexport { _panelExtra0 as \"panelExtra\" }\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 {\n findGraphPanel,\n collectGraphSessionIds,\n isGraphTabId,\n sessionIdFromTabId\n} 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 // Keep the editor's active graph in sync with the focused graph tab so\n // panels bound via useActiveGraph() rebind to it.\n if (isGraphTabId(graphContainer.activeId)) {\n system.activeGraph\n .getState()\n .setActiveGraph(sessionIdFromTabId(graphContainer.activeId));\n }\n }\n\n // Dispose sessions whose tabs were closed in this layout change.\n const before = collectGraphSessionIds(layout);\n const after = collectGraphSessionIds(newLayout);\n for (const id of before) {\n if (!after.has(id)) {\n system.disposeSession(id);\n }\n }\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 type { ValueTypeSpecJSON } from '@kiberon-labs/behave-graph';\nimport type { ValueTypeMetadata } from '@/types/NodeMetadata';\n\nconst clone = <T>(value: T): T => {\n if (value === null || typeof value !== 'object') return value;\n try {\n return structuredClone(value);\n } catch {\n return JSON.parse(JSON.stringify(value)) as T;\n }\n};\n\n/**\n * Build a function-bearing {@link ValueTypeMetadata} from a function-free\n * {@link ValueTypeSpecJSON} carried in a manifest.\n *\n * The editor calls `creator`/`serialize`/`deserialize` at author time (creating\n * variables, editing events, deserializing a graph's variables). A manifest can\n * only ship JSON, so we synthesise pass-through behaviour: the value is already\n * its own JSON form, so (de)serialize are identity and `creator` returns a clone\n * of the declared default. This keeps every existing UI call site working with\n * **zero code execution**. When the package is later trusted-loaded, a\n * `valueType` contribution can replace this with the real implementation.\n */\nexport function passthroughValueType(\n spec: ValueTypeSpecJSON\n): ValueTypeMetadata {\n return {\n name: spec.name,\n creator: () =>\n spec.defaultJSON === null || spec.defaultJSON === undefined\n ? undefined\n : clone(spec.defaultJSON),\n serialize: (value: unknown) => value,\n deserialize: (value: unknown) => value,\n clone: (value: unknown) => clone(value),\n equals: (a: unknown, b: unknown) =>\n a === b || JSON.stringify(a) === JSON.stringify(b)\n };\n}\n","import type { FC } from 'react';\nimport type { TabData } from 'rc-dock';\nimport {\n ContributionKind,\n type ContributionSpec\n} from '@kiberon-labs/behave-graph';\nimport type { System } from '@/system/system';\nimport type { ControlProps } from '@/store/controls';\nimport type { Specific } from '@/store/specific';\nimport type { SocketGenerator } from '@/store/socketGenerator';\nimport type { ConversionRule } from '@/store/conversions';\nimport type { Command } from '@/store/commands';\nimport type { ContextMenuItem } from '@/store/contextMenu';\nimport type { ValueTypeMetadata } from '@/types/NodeMetadata';\n\n/**\n * Registers a single resolved contribution into the right editor store. `value`\n * is whatever the host's resolver loaded for the contribution's `export` (its\n * concrete shape depends on the kind).\n */\nexport type ContributionApplier = (\n system: System,\n contribution: ContributionSpec,\n value: unknown\n) => void;\n\n/** Dispatch table mapping each {@link ContributionKind} to its store action. */\nexport const contributionAppliers: Record<string, ContributionApplier> = {\n [ContributionKind.Control]: (system, c, value) => {\n const name = c.bind?.controlName ?? c.bind?.valueType;\n if (!name) {\n throw new Error(\n `control contribution '${c.id}' needs bind.controlName (or bind.valueType)`\n );\n }\n system.controlStore\n .getState()\n .registerControl(name, value as FC<ControlProps>);\n },\n\n [ContributionKind.Specific]: (system, _c, value) => {\n system.specificStore.getState().registerSpecific(value as Specific);\n },\n\n [ContributionKind.Panel]: (system, c, value) => {\n // A panel resolves to a tab loader `() => TabData`, registered under the\n // contribution id (the tab id the host opens).\n system.tabLoader.register(c.id, value as () => TabData);\n },\n\n [ContributionKind.SocketGenerator]: (system, _c, value) => {\n system.socketGeneratorStore\n .getState()\n .registerGenerator(value as SocketGenerator);\n },\n\n [ContributionKind.Conversion]: (system, _c, value) => {\n system.conversionStore\n .getState()\n .registerConversion(value as ConversionRule);\n },\n\n [ContributionKind.Command]: (system, _c, value) => {\n system.commandStore.getState().register(value as Command);\n },\n\n [ContributionKind.ContextMenu]: (system, _c, value) => {\n system.contextMenuStore.getState().register(value as ContextMenuItem);\n },\n\n [ContributionKind.ValueType]: (system, c, value) => {\n // Replaces the pass-through value type with the real, function-bearing one.\n const vt = value as ValueTypeMetadata;\n const name = c.bind?.valueType ?? vt.name;\n system.registry.getState().updateValues({ [name]: { ...vt, name } });\n }\n};\n\n/** Apply a resolved contribution, warning (not throwing) on an unknown kind. */\nexport function applyContribution(\n system: System,\n contribution: ContributionSpec,\n value: unknown\n): void {\n const applier = contributionAppliers[contribution.kind];\n if (!applier) {\n console.warn(\n `[manifest] no applier for contribution kind '${contribution.kind}' (${contribution.id})`\n );\n return;\n }\n applier(system, contribution, value);\n}\n","import type {\n ContributionSpec,\n ManifestJSON,\n PackageRequirement\n} from '@kiberon-labs/behave-graph';\nimport type { System } from '@/system/system';\nimport type { ValueTypeMetadata } from '@/types/NodeMetadata';\nimport { passthroughValueType } from './passthroughValueType';\nimport { applyContribution } from './contributionRegistry';\n\n/**\n * Resolves a contribution's declarative `export` (e.g. `\"./ui.js#ImageControl\"`)\n * to its actual value. The host owns this because a bundler must know the\n * concrete module — so loading code contributions is always host-mediated and\n * gated behind {@link LoadManifestOptions.trust}.\n */\nexport type ContributionResolver = (\n contribution: ContributionSpec,\n manifest: ManifestJSON\n) => unknown | Promise<unknown>;\n\nexport type LoadManifestOptions = {\n /**\n * Gate for executing code contributions. Default `false`: only nodes and\n * pass-through value types load (no package code runs). Set true together\n * with {@link LoadManifestOptions.resolve} once the package is trusted.\n */\n trust?: boolean;\n /** Required to load contributions; without it only the static parts load. */\n resolve?: ContributionResolver;\n /**\n * Called for each declared host requirement (persistent backend, config,\n * ...). Lets the host surface a badge or run a backend. No code executes here.\n */\n onRequirement?: (\n requirement: PackageRequirement,\n manifest: ManifestJSON\n ) => void;\n};\n\n/**\n * Load a package manifest into the editor.\n *\n * Always (no code execution): registers the node specs and pass-through value\n * types, so the palette is fully populated from JSON alone. Only under explicit\n * `trust` + a `resolve`r does it import and register the package's code\n * contributions. Declared host requirements are surfaced via `onRequirement`.\n */\nexport async function loadManifest(\n system: System,\n manifest: ManifestJSON,\n options: LoadManifestOptions = {}\n): Promise<void> {\n // 1. Static: nodes + pass-through value types. No package code runs.\n const values: Record<string, ValueTypeMetadata> = {};\n for (const value of manifest.values) {\n values[value.name] = passthroughValueType(value);\n }\n system.registry.getState().updateRegistry({ specs: manifest.nodes, values });\n\n // 2. Surface host requirements (no code execution).\n if (options.onRequirement && manifest.requirements) {\n for (const requirement of manifest.requirements) {\n options.onRequirement(requirement, manifest);\n }\n }\n\n // 3. Code contributions — only when explicitly trusted and a resolver exists.\n if (!options.trust || !options.resolve) return;\n for (const contribution of manifest.contributions) {\n try {\n const value = await options.resolve(contribution, manifest);\n if (value === null || value === undefined) continue;\n applyContribution(system, contribution, value);\n } catch (err) {\n console.error(\n `[manifest] failed to load contribution '${contribution.id}'`,\n err\n );\n }\n }\n}\n","import type { ManifestJSON } from '@kiberon-labs/behave-graph';\nimport { plugin } from '@/system/plugin';\nimport type { System } from '@/system/system';\nimport { loadManifest, type LoadManifestOptions } from './loadManifest';\n\nexport interface ManifestPluginOptions extends LoadManifestOptions {\n /** Manifests to load, in order (later ones override earlier node types). */\n manifests: ManifestJSON[];\n}\n\nexport async function manifestPluginLoader(\n system: System,\n options: ManifestPluginOptions\n): Promise<void> {\n const { manifests, ...loadOptions } = options;\n for (const manifest of manifests) {\n await loadManifest(system, manifest, loadOptions);\n }\n}\n\n/**\n * Register one or more package manifests as a single plugin. The static parts\n * (nodes + value types) always load; code contributions load only under\n * `trust` + `resolve` (see {@link LoadManifestOptions}).\n */\nexport const manifestPlugin = plugin<ManifestPluginOptions>(\n manifestPluginLoader,\n { name: 'manifest' }\n);\n","import { lazy, Suspense } from 'react';\nimport styles from './styles.module.css';\n\n/**\n * The documentation panel embeds a tiptap/prosemirror editor (~320 KB) to render\n * node markdown. Load it lazily so that weight only enters the bundle when the\n * panel is actually opened.\n */\nconst LazyPanel = lazy(() =>\n import('./DocumentationBrowserPanelImpl').then((m) => ({\n default: m.DocumentationBrowserPanelImpl\n }))\n);\n\nexport function DocumentationBrowserPanel() {\n return (\n <Suspense fallback={<div className={styles.container} />}>\n <LazyPanel />\n </Suspense>\n );\n}\n","import { type System } from '@/system/system';\nimport type { NodeDocumentation } from '@/store/documentation';\nimport { BounceRight, Flash, GitFork, 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: <GitFork />,\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 { align, distribute, ALIGNMENT } from '@/components/panels/alignment';\nimport type { GraphSession } from '@/system/graphSession';\nimport type { Node } from 'reactflow';\nimport { plugin } from '@/system/plugin';\nimport type { System } from '@/system/system';\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 GraphPubSys {\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 setupSessionActions = (session: GraphSession) => {\n // Subscribe to alignment events\n session.pubsub.subscribe('alignment:align', (_, data) => {\n const { nodes, setNodes } = session.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 session.pubsub.subscribe('alignment:distribute', (_, data) => {\n const { nodes, setNodes } = session.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\n/**\n * Adds node alignment + distribution to the editor. The behaviour is opt-in: it\n * subscribes each graph's pubsub (via a session extension, so it covers graphs\n * already open and any opened later) to the `alignment:align` /\n * `alignment:distribute` events the FloatingToolbar and Alignment panel publish.\n *\n * Register it directly or via the kitchen-sink plugin. Without it those events\n * have no subscriber and the alignment controls simply no-op.\n */\nexport const alignmentPlugin = plugin(\n (system: System) => {\n system.registerSessionExtension((session) => {\n setupSessionActions(session);\n });\n },\n { name: 'alignment' }\n);\n","import { Position } from 'reactflow';\nimport type { Edge, Node } from 'reactflow';\nimport type dagreNS 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\n/**\n * dagre is only needed when the user actually runs a Dagre layout, so load it\n * lazily (a dynamic import the bundler code-splits into a separate chunk). This\n * keeps it out of the initial load even for hosts that register the layout\n * plugin. The module is fetched once and reused.\n */\nlet dagrePromise: Promise<typeof dagreNS> | undefined;\nconst getDagre = () => {\n dagrePromise ??= import('dagre').then((m) => m.default ?? m);\n return dagrePromise;\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 positionMap: Record<string, Position> = {\n T: Position.Top,\n L: Position.Left,\n R: Position.Right,\n B: Position.Bottom\n};\n\nexport async 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 const dagre = await getDagre();\n const dagreGraph = new dagre.graphlib!.Graph();\n dagreGraph.setDefaultEdgeLabel(() => ({}));\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 type {\n ElkExtendedEdge,\n ElkNode,\n ElkPort\n} from 'elkjs/lib/elk.bundled.js';\nimport type { Edge, Node } from 'reactflow';\nimport { pinned } from '@/annotations';\n\n/**\n * elkjs is ~1.4 MB — by far the largest dependency the editor can pull in, yet\n * it is only used when the user explicitly runs an ELK layout. Load it lazily (a\n * dynamic import the bundler code-splits into a separate chunk) so it stays out\n * of the initial load even for consumers of this layout plugin. The instance is\n * created once and reused.\n */\nlet elkPromise:\n | Promise<{ layout: (graph: ElkNode) => Promise<ElkNode> }>\n | undefined;\nconst getElk = () => {\n elkPromise ??= import('elkjs/lib/elk.bundled.js').then(\n (m) => new m.default()\n );\n return elkPromise;\n};\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 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 elk = await getElk();\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 { plugin } from '@/system/plugin';\nimport type { System } from '@/system/system';\nimport { applyDagreLayout } from './dagre';\nimport { applyElkLayout } from './elk';\n\nexport * from './dagre';\nexport * from './elk';\n\n/**\n * Available auto-layout engines. `Dagre` is a small, synchronous layered layout;\n * the `Elk - *` options use elkjs (~1.4 MB, loaded lazily on first use) for\n * higher-quality layouts.\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\n/**\n * Run the currently-selected auto-layout engine against the focused graph.\n * Reads the `layoutType` setting (registered by this plugin) to pick the engine.\n */\nexport const applyAutoLayout = (system: System): void => {\n switch (system.getSetting<LayoutType>('layoutType')) {\n case LAYOUT_TYPE.dagre:\n void applyDagreLayout(system);\n break;\n case LAYOUT_TYPE.elkLayered:\n void applyElkLayout(system, 'org.eclipse.elk.layered');\n break;\n case LAYOUT_TYPE.elkForce:\n void applyElkLayout(system, 'org.eclipse.elk.force');\n break;\n case LAYOUT_TYPE.elkRect:\n void applyElkLayout(system, 'org.eclipse.elk.rectpacking');\n break;\n }\n};\n\n/**\n * Adds graph auto-layout (Dagre + ELK) to the editor. elkjs and dagre are heavy\n * dependencies that not every host needs, so they live here rather than in the\n * core editor — register this plugin (directly or via the kitchen-sink plugin)\n * to opt in.\n *\n * The plugin:\n * - registers the `layoutType` setting (the engine picker in the Settings panel);\n * - registers the `editor.autoLayout` command that the \"Auto Layout\" hotkey and\n * menu dispatch to.\n *\n * Without it, `editor.autoLayout` is simply unregistered (the hotkey no-ops).\n */\nexport const layoutPlugin = plugin(\n (system: System) => {\n system.registerSetting({\n key: 'layoutType',\n section: 'Layout',\n type: 'enum',\n default: LAYOUT_TYPE.dagre,\n options: Object.values(LAYOUT_TYPE).map((value) => ({\n value,\n label: value\n })),\n title: 'Layout Type',\n description:\n 'Select the type of layout engine to use in the graph editor.'\n });\n\n system.commandStore.getState().register({\n id: 'editor.autoLayout',\n title: 'Auto Layout',\n run: (ctx) => applyAutoLayout(ctx.editor)\n });\n },\n { name: 'layout' }\n);\n","import { lazy, memo, Suspense } from 'react';\nimport type { NodeProps } from 'reactflow';\nimport type { INoteNode } from '@/types/nodes';\n\n/**\n * Note nodes embed a tiptap/prosemirror rich-text editor (~320 KB). Most\n * graphs have no note nodes, so load the implementation lazily — the editor\n * weight only enters the bundle when a note node is actually rendered.\n */\nconst LazyNoteNode = lazy(() =>\n import('./noteImpl').then((m) => ({ default: m.NoteNodeImpl }))\n);\n\nconst NoteNodeRaw = (props: NodeProps<INoteNode['data']>) => (\n <Suspense fallback={null}>\n <LazyNoteNode {...props} />\n </Suspense>\n);\n\nexport const NoteNode = memo(NoteNodeRaw);\n","import { v4 as uuidv4 } from 'uuid';\nimport type { Node } from 'reactflow';\nimport type { CommandContext } from '@/store/commands';\nimport type { GraphSession } from '@/system/graphSession';\n\n/** Node type registered for notes created by this plugin. */\nexport const NOTE_NODE_TYPE = 'noteNode';\n\n/**\n * Type string notes used while they lived in the core editor as \"comment\"\n * nodes. Registered as an alias so graphs saved before the move still render.\n */\nexport const LEGACY_COMMENT_NODE_TYPE = 'commentNode';\n\nexport const isNoteNode = (node: Node | undefined): node is Node =>\n node?.type === NOTE_NODE_TYPE || node?.type === LEGACY_COMMENT_NODE_TYPE;\n\nexport const noteAt = (ctx: CommandContext): Node | undefined => {\n const node = ctx.session.nodeStore\n .getState()\n .nodes.find((n) => n.id === ctx.nodeId);\n return isNoteNode(node) ? node : undefined;\n};\n\nexport const duplicateNote = (session: GraphSession, note: Node): void => {\n const copy: Node = {\n ...note,\n id: uuidv4(),\n selected: false,\n position: { x: note.position.x + 24, y: note.position.y + 24 },\n data: { ...note.data }\n };\n session.undoManager.execute({\n name: 'Duplicate note',\n execute: () => {\n session.nodeStore.getState().addNode(copy);\n },\n undo: () => {\n session.nodeStore\n .getState()\n .setNodes((existing) => existing.filter((n) => n.id !== copy.id));\n }\n });\n};\n\nexport const deleteNote = (session: GraphSession, note: Node): void => {\n const index = session.nodeStore\n .getState()\n .nodes.findIndex((n) => n.id === note.id);\n session.undoManager.execute({\n name: 'Delete note',\n execute: () => {\n session.nodeStore\n .getState()\n .setNodes((existing) => existing.filter((n) => n.id !== note.id));\n },\n undo: () => {\n session.nodeStore.getState().setNodes((existing) => {\n const next = [...existing];\n next.splice(Math.min(index, next.length), 0, note);\n return next;\n });\n }\n });\n};\n\n/**\n * Move a note within the nodes array: React Flow paints later nodes on top, so\n * array order is z-order.\n */\nexport const reorderNote = (\n session: GraphSession,\n note: Node,\n to: 'front' | 'back'\n): void => {\n const from = session.nodeStore\n .getState()\n .nodes.findIndex((n) => n.id === note.id);\n if (from < 0) return;\n\n const move = (position: 'front' | 'back' | number) => {\n session.nodeStore.getState().setNodes((existing) => {\n const index = existing.findIndex((n) => n.id === note.id);\n if (index < 0) return existing;\n const next = [...existing];\n const [moved] = next.splice(index, 1);\n if (moved === undefined) return existing;\n if (position === 'front') next.push(moved);\n else if (position === 'back') next.unshift(moved);\n else next.splice(Math.min(position, next.length), 0, moved);\n return next;\n });\n };\n\n session.undoManager.execute({\n name: to === 'front' ? 'Bring note to front' : 'Send note to back',\n execute: () => move(to),\n undo: () => move(from)\n });\n};\n","import { Notes } from 'iconoir-react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { plugin } from '@/system/plugin';\nimport type { System } from '@/system/system';\nimport type { CommandContext } from '@/store/commands';\nimport type { INoteNode } from '@/types/nodes';\nimport { NoteNode } from './note';\nimport {\n NOTE_NODE_TYPE,\n LEGACY_COMMENT_NODE_TYPE,\n noteAt,\n duplicateNote,\n deleteNote,\n reorderNote\n} from './nodeActions';\n\nexport { NoteNode } from './note';\nexport * from './nodeActions';\n\n/**\n * Create a note node on the graph the command targets. Placed at the given\n * position (e.g. from a context menu) or, from surfaces without one (toolbar,\n * hotkey), at the centre of the current viewport. Undo-aware.\n */\nconst addNote = (ctx: CommandContext): void => {\n const reactflow = ctx.session.refStore.getState().getRef('reactflow');\n const position = ctx.position ??\n reactflow?.screenToFlowPosition({\n x: window.innerWidth / 2,\n y: window.innerHeight / 2\n }) ?? { x: 0, y: 0 };\n\n const note: INoteNode = {\n id: uuidv4(),\n type: NOTE_NODE_TYPE,\n position,\n selected: true,\n // Only the header drags the node; the body is a text surface.\n dragHandle: '.notes-node__header',\n style: { width: 280, height: 180 },\n data: { text: '' }\n };\n\n ctx.session.undoManager.execute({\n name: 'Add note',\n execute: () => {\n ctx.session.nodeStore.getState().addNode(note);\n },\n undo: () => {\n ctx.session.nodeStore\n .getState()\n .setNodes((existing) => existing.filter((n) => n.id !== note.id));\n }\n });\n};\n\n/**\n * Adds markdown note nodes to the editor. Notes are purely presentational:\n * they never appear in the compiled behave graph (only behave nodes do), but\n * they persist with the UI graph JSON like any other canvas node.\n *\n * The note editor embeds tiptap/prosemirror, a heavy dependency most hosts do\n * not need, so notes live here rather than in the core editor — register this\n * plugin (directly or via the kitchen-sink plugin) to opt in.\n *\n * The plugin:\n * - registers the `noteNode` component on every graph session (plus the legacy\n * `commentNode` alias for graphs saved before notes moved here);\n * - registers the `notes.addNote` command, an \"Add Note\" button on the\n * floating toolbar, and a `Shift+N` hotkey that dispatch it;\n * - registers note-specific node commands + context-menu items\n * (duplicate / delete / bring to front / send to back).\n */\nexport const notesPlugin = plugin(\n (system: System) => {\n system.registerSessionExtension((session) => {\n const { registerNodeType } = session.flowStore.getState();\n registerNodeType(NOTE_NODE_TYPE, NoteNode);\n registerNodeType(LEGACY_COMMENT_NODE_TYPE, NoteNode);\n });\n\n const commands = system.commandStore.getState();\n commands.register({\n id: 'notes.addNote',\n title: 'Add Note',\n run: addNote\n });\n commands.register({\n id: 'note.duplicate',\n title: 'Duplicate Note',\n run: (ctx) => {\n const note = noteAt(ctx);\n if (note) duplicateNote(ctx.session, note);\n }\n });\n commands.register({\n id: 'note.delete',\n title: 'Delete Note',\n run: (ctx) => {\n const note = noteAt(ctx);\n if (note) deleteNote(ctx.session, note);\n }\n });\n commands.register({\n id: 'note.bringToFront',\n title: 'Bring Note to Front',\n run: (ctx) => {\n const note = noteAt(ctx);\n if (note) reorderNote(ctx.session, note, 'front');\n }\n });\n commands.register({\n id: 'note.sendToBack',\n title: 'Send Note to Back',\n run: (ctx) => {\n const note = noteAt(ctx);\n if (note) reorderNote(ctx.session, note, 'back');\n }\n });\n\n // Notes get their own node context menu; the behave items (trace, pin,\n // ...) are guarded by `when` in the core defaults and stay hidden here.\n const menu = system.contextMenuStore.getState();\n const noteOnly = (ctx: CommandContext) => Boolean(noteAt(ctx));\n menu.register({\n id: 'note.duplicate',\n target: 'node',\n label: 'Duplicate',\n order: 10,\n group: 'note',\n when: noteOnly,\n commandId: 'note.duplicate'\n });\n menu.register({\n id: 'note.bringToFront',\n target: 'node',\n label: 'Bring to Front',\n order: 20,\n group: 'note-order',\n when: noteOnly,\n commandId: 'note.bringToFront'\n });\n menu.register({\n id: 'note.sendToBack',\n target: 'node',\n label: 'Send to Back',\n order: 21,\n group: 'note-order',\n when: noteOnly,\n commandId: 'note.sendToBack'\n });\n menu.register({\n id: 'note.delete',\n target: 'node',\n label: 'Delete',\n order: 30,\n group: 'note-danger',\n when: noteOnly,\n commandId: 'note.delete'\n });\n\n const dispatchAddNote = () => {\n const session = system.session;\n if (!session) return;\n void system.commandStore\n .getState()\n .run('notes.addNote', { editor: system, session });\n };\n\n system.toolbarStore.getState().addGroup({\n id: 'notes',\n label: 'Notes',\n buttons: [\n {\n id: 'notes.addNote',\n icon: <Notes />,\n label: 'Add Note',\n onClick: dispatchAddNote\n }\n ]\n });\n\n system.hotKeyStore.getState().register({\n action: 'ADD_NOTE',\n description: 'Add a markdown note to the graph',\n trigger: 'shift+n',\n handler: dispatchAddNote\n });\n },\n { name: 'notes' }\n);\n","import type { UIGraphJSON } from '@/types/graph';\nimport type { SettingsStorage } from '@/system/system';\n\n/** Single local-storage key holding every graph's backup ring. */\nexport const AUTOSAVE_STORAGE_KEY = 'behave-graph:autosave';\n\n/** A single point-in-time copy of one graph. */\nexport type BackupSnapshot = {\n /** Unique id for this snapshot (used by the panel to restore/delete). */\n id: string;\n /** Session id of the graph this snapshot came from. */\n graphId: string;\n /** Graph display name captured at snapshot time (for the panel list). */\n name: string;\n /** Epoch milliseconds when the snapshot was taken. */\n timestamp: number;\n /** Node count, shown in the panel without deserializing the whole graph. */\n nodeCount: number;\n /** The full, restorable graph document. */\n graph: UIGraphJSON;\n};\n\n/** Per-graph ring buffer of snapshots, newest last. */\ntype GraphBackups = {\n name: string;\n snapshots: BackupSnapshot[];\n};\n\n/** The persisted shape: graph id -> its backups. */\ntype BackupStore = Record<string, GraphBackups>;\n\n/**\n * localStorage-or-nothing accessor. The whole backup set lives under a single\n * key as a JSON object, so a plain get/set storage adapter (the same shape the\n * settings persistence uses) is all we need , no `key(i)`/`length` scanning.\n */\nconst defaultStorage = (): SettingsStorage | undefined => {\n try {\n if (typeof localStorage !== 'undefined') return localStorage;\n } catch {\n // localStorage can throw in sandboxed / SSR contexts.\n }\n return undefined;\n};\n\nconst readStore = (storage: SettingsStorage): BackupStore => {\n try {\n const raw = storage.getItem(AUTOSAVE_STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw);\n return parsed && typeof parsed === 'object' ? (parsed as BackupStore) : {};\n } catch {\n return {};\n }\n};\n\nconst writeStore = (storage: SettingsStorage, store: BackupStore): void => {\n try {\n storage.setItem(AUTOSAVE_STORAGE_KEY, JSON.stringify(store));\n } catch {\n // Quota exceeded / serialization error: drop this write rather than throw.\n // The next successful snapshot will re-establish the ring.\n }\n};\n\n/**\n * Thin persistence wrapper over the single backup key. Kept storage-agnostic\n * (any get/set adapter) so hosts can back it with something other than\n * localStorage and tests can inject an in-memory map.\n */\nexport class BackupStorage {\n private readonly storage: SettingsStorage | undefined;\n\n constructor(storage: SettingsStorage | undefined = defaultStorage()) {\n this.storage = storage;\n }\n\n /** Whether a backing store is available (false in SSR / sandboxed contexts). */\n get available(): boolean {\n return this.storage !== undefined;\n }\n\n /** All snapshots across every graph, newest first. */\n listAll(): BackupSnapshot[] {\n if (!this.storage) return [];\n const store = readStore(this.storage);\n return Object.values(store)\n .flatMap((g) => g.snapshots)\n .sort((a, b) => b.timestamp - a.timestamp);\n }\n\n /** Find one snapshot by id (across all graphs). */\n find(id: string): BackupSnapshot | undefined {\n return this.listAll().find((s) => s.id === id);\n }\n\n /**\n * Append a snapshot to its graph's ring and trim to `maxCopies` (oldest\n * dropped). `name` refreshes the stored graph label so the panel tracks\n * renames.\n */\n append(snapshot: BackupSnapshot, maxCopies: number): void {\n if (!this.storage) return;\n const store = readStore(this.storage);\n const entry = store[snapshot.graphId] ?? {\n name: snapshot.name,\n snapshots: []\n };\n entry.name = snapshot.name;\n entry.snapshots = [...entry.snapshots, snapshot];\n const limit = Math.max(1, Math.floor(maxCopies));\n if (entry.snapshots.length > limit) {\n entry.snapshots = entry.snapshots.slice(entry.snapshots.length - limit);\n }\n store[snapshot.graphId] = entry;\n writeStore(this.storage, store);\n }\n\n /** Remove a single snapshot; prunes the graph entry once it is empty. */\n remove(id: string): void {\n if (!this.storage) return;\n const store = readStore(this.storage);\n for (const [graphId, entry] of Object.entries(store)) {\n const next = entry.snapshots.filter((s) => s.id !== id);\n if (next.length === entry.snapshots.length) continue;\n if (next.length === 0) delete store[graphId];\n else store[graphId] = { ...entry, snapshots: next };\n writeStore(this.storage, store);\n return;\n }\n }\n\n /** Drop every snapshot for a single graph. */\n removeGraph(graphId: string): void {\n if (!this.storage) return;\n const store = readStore(this.storage);\n if (!(graphId in store)) return;\n delete store[graphId];\n writeStore(this.storage, store);\n }\n\n /** Wipe all backups. */\n clear(): void {\n if (!this.storage) return;\n writeStore(this.storage, {});\n }\n}\n","import type { SettingDescriptor } from '@/store/settingsSchema';\n\n/**\n * Setting keys owned by the autosave plugin. Namespaced (`autosave.*`) so they\n * never collide with the built-in flat setting keys.\n */\nexport const AUTOSAVE_ENABLED = 'autosave.enabled';\nexport const AUTOSAVE_INTERVAL_SECONDS = 'autosave.intervalSeconds';\nexport const AUTOSAVE_MAX_COPIES = 'autosave.maxCopies';\n\n/** Shipped defaults, also used by the controller when a value is missing. */\nexport const AUTOSAVE_DEFAULTS = {\n enabled: false,\n intervalSeconds: 60,\n maxCopies: 20\n} as const;\n\n/** Lower bound on the timer so a typo can't spin the loop every frame. */\nexport const MIN_INTERVAL_SECONDS = 5;\n\n/**\n * The Settings-panel rows this plugin contributes. Registered via\n * `system.registerSettings(...)`, which also seeds each default into the value\n * store, so `system.getSetting(AUTOSAVE_*)` is populated the moment the plugin\n * loads.\n */\nexport const AUTOSAVE_SETTINGS: SettingDescriptor[] = [\n {\n key: AUTOSAVE_ENABLED,\n section: 'Autosave',\n order: 0,\n type: 'boolean',\n default: AUTOSAVE_DEFAULTS.enabled,\n title: 'Enable local backups',\n description:\n 'Periodically snapshot open graphs into local storage so a crash or a bad edit is recoverable. Purely client-side; nothing leaves the browser.'\n },\n {\n key: AUTOSAVE_INTERVAL_SECONDS,\n section: 'Autosave',\n order: 1,\n type: 'number',\n default: AUTOSAVE_DEFAULTS.intervalSeconds,\n min: MIN_INTERVAL_SECONDS,\n step: 5,\n title: 'Backup frequency (seconds)',\n description:\n 'How often a snapshot is taken. A copy is only written when the graph has actually changed and is in a consistent state.',\n when: (values) => values[AUTOSAVE_ENABLED] === true\n },\n {\n key: AUTOSAVE_MAX_COPIES,\n section: 'Autosave',\n order: 2,\n type: 'number',\n default: AUTOSAVE_DEFAULTS.maxCopies,\n min: 1,\n max: 200,\n step: 1,\n title: 'Copies to keep per graph',\n description:\n 'The oldest snapshots are discarded once a graph has this many. Higher values use more local storage.',\n when: (values) => values[AUTOSAVE_ENABLED] === true\n }\n];\n","import { createStore, type StoreApi } from 'zustand/vanilla';\nimport { v4 as uuidv4 } from 'uuid';\nimport type { System, SettingsStorage } from '@/system/system';\nimport type { GraphSession } from '@/system/graphSession';\nimport { buildUIGraphJSON } from '@/transformers/Uigraph';\nimport type { UIGraphJSON } from '@/types/graph';\nimport { BackupStorage, type BackupSnapshot } from './storage';\nimport {\n AUTOSAVE_ENABLED,\n AUTOSAVE_INTERVAL_SECONDS,\n AUTOSAVE_MAX_COPIES,\n AUTOSAVE_DEFAULTS,\n MIN_INTERVAL_SECONDS\n} from './settings';\n\n/**\n * Wait for a graph to be untouched for this long before snapshotting it. A drag\n * or a multi-store edit produces a burst of store updates; requiring a quiet\n * window means we capture the settled result rather than a half-applied frame.\n */\nconst QUIESCE_MS = 800;\n\n/** Reactive slice the backup panel subscribes to. */\nexport type BackupControllerStore = {\n /** All snapshots across every graph, newest first. */\n snapshots: BackupSnapshot[];\n /** Whether the timer is currently running. */\n running: boolean;\n /** Epoch ms of the last successful capture, or null. */\n lastBackupAt: number | null;\n};\n\n/** Per-open-session bookkeeping used to decide when a snapshot is worthwhile. */\ntype SessionWatch = {\n /** Changed since the last successful capture. */\n dirty: boolean;\n /** Epoch ms of the most recent store change (for the quiescence window). */\n lastChange: number;\n /** Serialized form of the last captured graph, to skip exact duplicates. */\n lastCapturedJson: string;\n /** Removes the node/edge store subscriptions. */\n unsubscribe: () => void;\n};\n\n/**\n * Every edge must point at nodes that exist. A snapshot taken mid-way through a\n * load or a bulk mutation can have edges referencing not-yet-added (or\n * already-removed) nodes; refusing to persist such a document is the concrete\n * meaning of \"do not take a copy during an inconsistent state\".\n */\nconst isConsistent = (graph: UIGraphJSON): boolean => {\n if (!Array.isArray(graph.nodes) || !Array.isArray(graph.edges)) return false;\n const ids = new Set<string>();\n for (const node of graph.nodes) {\n if (!node || typeof node.id !== 'string') return false;\n ids.add(node.id);\n }\n for (const edge of graph.edges) {\n if (!edge || !edge.source || !edge.target) return false;\n if (!ids.has(edge.source) || !ids.has(edge.target)) return false;\n }\n return true;\n};\n\n/**\n * Drives periodic, consistency-checked backups of every open graph into local\n * storage, and restores from them. Owned by the autosave plugin and exposed on\n * the editor as `system.backups` so panels and other plugins can drive it.\n *\n * Snapshots are only written when a graph has actually changed, has settled\n * (see {@link QUIESCE_MS}), is internally consistent, and is not empty , and\n * never while a caller has the controller suspended. Timer cadence, copy count\n * and the on/off switch are read live from the editor settings.\n */\nexport class BackupController {\n public readonly store: StoreApi<BackupControllerStore>;\n private readonly system: System;\n private readonly backups: BackupStorage;\n\n private timer: ReturnType<typeof setInterval> | undefined;\n /** Nesting counter: > 0 means \"unsafe to snapshot right now\". */\n private suspendDepth = 0;\n private readonly watches = new Map<string, SessionWatch>();\n\n private readonly disposers: Array<() => void> = [];\n\n constructor(system: System, storage?: SettingsStorage) {\n this.system = system;\n this.backups = new BackupStorage(storage);\n this.store = createStore<BackupControllerStore>(() => ({\n snapshots: this.backups.listAll(),\n running: false,\n lastBackupAt: null\n }));\n\n // Track sessions as tabs open and close so each open graph is watched.\n this.syncSessions();\n this.disposers.push(\n this.system.activeGraph.subscribe(() => this.syncSessions())\n );\n\n // React to enable/interval changes without a restart.\n this.disposers.push(\n this.system.systemSettings.subscribe(() => this.applySettings())\n );\n\n this.applySettings();\n }\n\n // ---------------------------------------------------------------------------\n // Suspension , the \"no copy during inconsistent state\" API.\n // ---------------------------------------------------------------------------\n\n /** Mark the start of a region where a snapshot would be unsafe. */\n suspend(): void {\n this.suspendDepth += 1;\n }\n\n /** End a region opened by {@link suspend}. */\n resume(): void {\n if (this.suspendDepth > 0) this.suspendDepth -= 1;\n }\n\n /** Whether snapshots are currently suspended. */\n get suspended(): boolean {\n return this.suspendDepth > 0;\n }\n\n /**\n * Run `fn` with snapshots suspended, resuming even if it throws. Use this to\n * bracket bulk mutations (loads, imports, programmatic rewrites) so an\n * autosave tick can never capture the graph mid-transition.\n */\n runExclusive<T>(fn: () => T): T {\n this.suspend();\n try {\n return fn();\n } finally {\n this.resume();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Scheduling.\n // ---------------------------------------------------------------------------\n\n private intervalMs(): number {\n const raw = Number(\n this.system.getSetting(AUTOSAVE_INTERVAL_SECONDS) ??\n AUTOSAVE_DEFAULTS.intervalSeconds\n );\n const seconds = Number.isFinite(raw)\n ? Math.max(MIN_INTERVAL_SECONDS, raw)\n : AUTOSAVE_DEFAULTS.intervalSeconds;\n return seconds * 1000;\n }\n\n private maxCopies(): number {\n const raw = Number(\n this.system.getSetting(AUTOSAVE_MAX_COPIES) ?? AUTOSAVE_DEFAULTS.maxCopies\n );\n return Number.isFinite(raw) && raw >= 1\n ? Math.floor(raw)\n : AUTOSAVE_DEFAULTS.maxCopies;\n }\n\n /** (Re)start or stop the timer to match the current settings. */\n private applySettings(): void {\n const enabled =\n this.system.getSetting<boolean>(AUTOSAVE_ENABLED) === true &&\n this.backups.available;\n if (enabled) this.start();\n else this.stop();\n }\n\n private start(): void {\n this.stop();\n this.timer = setInterval(() => this.tick(), this.intervalMs());\n this.store.setState({ running: true });\n }\n\n private stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = undefined;\n }\n this.store.setState({ running: false });\n }\n\n /** One scheduler pass: try to capture each open, dirty, settled graph. */\n private tick(): void {\n if (this.suspended) return;\n for (const session of Object.values(\n this.system.activeGraph.getState().sessions\n )) {\n this.captureSession(session);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Capture.\n // ---------------------------------------------------------------------------\n\n /**\n * Snapshot one graph now if it is worth it: changed, settled, non-empty,\n * consistent and not a duplicate of the last capture. Returns the snapshot on\n * success, or null when it was skipped.\n */\n captureSession(session: GraphSession, force = false): BackupSnapshot | null {\n if (this.suspended) return null;\n const watch = this.watches.get(session.id);\n const now = Date.now();\n\n if (!force) {\n if (!watch?.dirty) return null;\n if (now - watch.lastChange < QUIESCE_MS) return null;\n }\n\n let graph: UIGraphJSON;\n try {\n graph = buildUIGraphJSON(session);\n } catch {\n // A graph that can't even be serialized is by definition inconsistent.\n return null;\n }\n\n // Skip empty graphs: an accidental \"Clear\" should not evict good backups.\n if (graph.nodes.length === 0) {\n if (watch) watch.dirty = false;\n return null;\n }\n\n if (!isConsistent(graph)) return null;\n\n const json = JSON.stringify(graph);\n if (watch && json === watch.lastCapturedJson) {\n watch.dirty = false;\n return null;\n }\n\n const snapshot: BackupSnapshot = {\n id: uuidv4(),\n graphId: session.id,\n name: session.name,\n timestamp: now,\n nodeCount: graph.nodes.length,\n graph\n };\n\n this.backups.append(snapshot, this.maxCopies());\n if (watch) {\n watch.dirty = false;\n watch.lastCapturedJson = json;\n }\n this.store.setState({\n snapshots: this.backups.listAll(),\n lastBackupAt: now\n });\n return snapshot;\n }\n\n /** Force an immediate backup of the focused graph (the \"Back up now\" action). */\n backupNow(): BackupSnapshot | null {\n const session = this.system.session;\n if (!session) return null;\n return this.captureSession(session, true);\n }\n\n // ---------------------------------------------------------------------------\n // Restore + management.\n // ---------------------------------------------------------------------------\n\n /**\n * Restore a snapshot into a brand-new graph tab, leaving all currently open\n * graphs untouched , the safe choice when recovering from a bad state.\n * Returns the new session, or undefined if the snapshot is gone.\n */\n restore(snapshotId: string): GraphSession | undefined {\n const snapshot = this.backups.find(snapshotId);\n if (!snapshot) return undefined;\n\n const session = this.system.newGraph(`${snapshot.name} (restored)`);\n this.runExclusive(() => {\n session.graph.deseralize(snapshot.graph);\n session.flowStore\n .getState()\n .setGraph(snapshot.graph.flow, { skipLayout: true });\n });\n this.system.notifications.success(\n `Restored \"${snapshot.name}\" into a new tab`\n );\n return session;\n }\n\n /** Delete one snapshot. */\n deleteSnapshot(id: string): void {\n this.backups.remove(id);\n this.refresh();\n }\n\n /** Delete every snapshot. */\n clearAll(): void {\n this.backups.clear();\n this.refresh();\n }\n\n /** Re-read storage into the reactive store (after an external change). */\n refresh(): void {\n this.store.setState({ snapshots: this.backups.listAll() });\n }\n\n // ---------------------------------------------------------------------------\n // Session watching.\n // ---------------------------------------------------------------------------\n\n /** Add watches for newly opened sessions, drop them for closed ones. */\n private syncSessions(): void {\n const sessions = this.system.activeGraph.getState().sessions;\n // Add watches for new sessions.\n for (const session of Object.values(sessions)) {\n if (!this.watches.has(session.id)) this.watchSession(session);\n }\n // Remove watches for sessions that have gone away.\n for (const [id, watch] of this.watches) {\n if (!(id in sessions)) {\n watch.unsubscribe();\n this.watches.delete(id);\n }\n }\n }\n\n private watchSession(session: GraphSession): void {\n const markDirty = () => {\n const watch = this.watches.get(session.id);\n if (!watch) return;\n watch.dirty = true;\n watch.lastChange = Date.now();\n };\n const unsubNodes = session.nodeStore.subscribe(markDirty);\n const unsubEdges = session.edgeStore.subscribe(markDirty);\n this.watches.set(session.id, {\n dirty: false,\n lastChange: 0,\n lastCapturedJson: '',\n unsubscribe: () => {\n unsubNodes();\n unsubEdges();\n }\n });\n }\n\n /** Tear down timers and subscriptions. */\n dispose(): void {\n this.stop();\n for (const watch of this.watches.values()) watch.unsubscribe();\n this.watches.clear();\n for (const dispose of this.disposers) {\n try {\n dispose();\n } catch {\n // ignore disposer errors\n }\n }\n this.disposers.length = 0;\n }\n}\n","import \"/home/runner/work/behave-graph/behave-graph/packages/flow/src/plugin/autosave/panel/styles.module_built.css\";\nconst classes = {\"name\":\"_6DHf2W_name\",\"buttonGroup\":\"_6DHf2W_buttonGroup\",\"toolbar\":\"_6DHf2W_toolbar\",\"helpText\":\"_6DHf2W_helpText\",\"empty\":\"_6DHf2W_empty\",\"header\":\"_6DHf2W_header\",\"actionsCell\":\"_6DHf2W_actionsCell\",\"nameCell\":\"_6DHf2W_nameCell\",\"content\":\"_6DHf2W_content\",\"table\":\"_6DHf2W_table\"}\nexport default classes\n\nconst _name0 = classes[\"name\"]\nexport { _name0 as \"name\" }\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\n\nconst _toolbar0 = classes[\"toolbar\"]\nexport { _toolbar0 as \"toolbar\" }\n\nconst _helpText0 = classes[\"helpText\"]\nexport { _helpText0 as \"helpText\" }\n\nconst _empty0 = classes[\"empty\"]\nexport { _empty0 as \"empty\" }\n\nconst _header0 = classes[\"header\"]\nexport { _header0 as \"header\" }\n\nconst _actionsCell0 = classes[\"actionsCell\"]\nexport { _actionsCell0 as \"actionsCell\" }\n\nconst _nameCell0 = classes[\"nameCell\"]\nexport { _nameCell0 as \"nameCell\" }\n\nconst _content0 = classes[\"content\"]\nexport { _content0 as \"content\" }\n\nconst _table0 = classes[\"table\"]\nexport { _table0 as \"table\" }\n","import { useStore } from 'zustand';\nimport {\n VscodeButton,\n VscodeLabel,\n VscodeTable,\n VscodeTableBody,\n VscodeTableCell,\n VscodeTableHeader,\n VscodeTableHeaderCell,\n VscodeTableRow\n} from '@vscode-elements/react-elements';\nimport { useSystem } from '@/system/provider';\nimport { BasePanel } from '@/components/panels/base';\nimport type { BackupController } from '../controller';\nimport type { BackupSnapshot } from '../storage';\nimport styles from './styles.module.css';\n\nconst formatTime = (ms: number): string => {\n try {\n return new Date(ms).toLocaleString();\n } catch {\n return String(ms);\n }\n};\n\n/**\n * Browse and restore local graph backups. Restoring opens the snapshot in a new\n * tab so the current work is never overwritten. Rendered from the autosave\n * plugin's registered `autosaveBackups` tab.\n */\nexport const BackupPanel = () => {\n const system = useSystem();\n const controller = system.backups as BackupController | undefined;\n\n if (!controller) {\n return (\n <BasePanel>\n <div className={styles.empty}>Backups are not available.</div>\n </BasePanel>\n );\n }\n\n return <BackupPanelBody controller={controller} />;\n};\n\nconst BackupPanelBody = ({ controller }: { controller: BackupController }) => {\n const snapshots = useStore(controller.store, (s) => s.snapshots);\n const running = useStore(controller.store, (s) => s.running);\n const lastBackupAt = useStore(controller.store, (s) => s.lastBackupAt);\n\n const onRestore = (snapshot: BackupSnapshot) => {\n controller.restore(snapshot.id);\n };\n\n const onDelete = (snapshot: BackupSnapshot) => {\n controller.deleteSnapshot(snapshot.id);\n };\n\n const onClearAll = () => {\n if (\n typeof confirm === 'function' &&\n !confirm('Delete all local backups? This cannot be undone.')\n ) {\n return;\n }\n controller.clearAll();\n };\n\n return (\n <BasePanel>\n <div className={styles.content}>\n <div className={styles.header}>\n <VscodeLabel>Local Backups</VscodeLabel>\n <span className={styles.helpText}>\n {running\n ? 'Autosave is on. Snapshots are kept in this browser only.'\n : 'Autosave is off. Enable it in Settings, or back up on demand.'}\n {lastBackupAt ? ` Last backup: ${formatTime(lastBackupAt)}.` : ''}\n </span>\n </div>\n\n <div className={styles.toolbar}>\n <VscodeButton onClick={() => controller.backupNow()}>\n Back up now\n </VscodeButton>\n <VscodeButton\n secondary\n disabled={snapshots.length === 0}\n onClick={onClearAll}\n >\n Clear all\n </VscodeButton>\n </div>\n\n {snapshots.length === 0 ? (\n <div className={styles.empty}>\n No backups yet. A copy is saved automatically when a graph changes\n (with autosave on), or press “Back up now”.\n </div>\n ) : (\n <VscodeTable className={styles.table} zebra>\n <VscodeTableHeader slot=\"header\">\n <VscodeTableHeaderCell>Graph</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>When</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Nodes</VscodeTableHeaderCell>\n <VscodeTableHeaderCell>Actions</VscodeTableHeaderCell>\n </VscodeTableHeader>\n <VscodeTableBody slot=\"body\">\n {snapshots.map((snapshot) => (\n <VscodeTableRow key={snapshot.id}>\n <VscodeTableCell className={styles.nameCell}>\n <span className={styles.name} title={snapshot.name}>\n {snapshot.name || 'Untitled'}\n </span>\n </VscodeTableCell>\n <VscodeTableCell>\n {formatTime(snapshot.timestamp)}\n </VscodeTableCell>\n <VscodeTableCell>{snapshot.nodeCount}</VscodeTableCell>\n <VscodeTableCell className={styles.actionsCell}>\n <div className={styles.buttonGroup}>\n <VscodeButton onClick={() => onRestore(snapshot)}>\n Restore\n </VscodeButton>\n <VscodeButton\n secondary\n onClick={() => onDelete(snapshot)}\n >\n Delete\n </VscodeButton>\n </div>\n </VscodeTableCell>\n </VscodeTableRow>\n ))}\n </VscodeTableBody>\n </VscodeTable>\n )}\n </div>\n </BasePanel>\n );\n};\n","import { ErrorBoundary } from 'react-error-boundary';\nimport { plugin } from '@/system/plugin';\nimport type { System, SettingsStorage } from '@/system/system';\nimport { MenuItemElement } from '@/components/menubar/menuItem';\nimport { BackupController } from './controller';\nimport { BackupPanel } from './panel';\nimport { AUTOSAVE_SETTINGS } from './settings';\n\nexport * from './settings';\nexport * from './storage';\nexport * from './controller';\n\ndeclare module '@/system/system' {\n interface System {\n /** Local backup controller, present when the autosave plugin is loaded. */\n backups?: BackupController;\n }\n}\n\n/** Tab id for the backup browser panel. */\nexport const BACKUP_PANEL_TAB_ID = 'autosaveBackups';\n\n/** Options for {@link autosavePlugin}. */\nexport interface AutosavePluginOptions {\n /**\n * Storage adapter for the backups. Defaults to `localStorage`. Provide your\n * own (e.g. backed by VS Code workspace state) to persist elsewhere; pass a\n * throwaway map in tests.\n */\n storage?: SettingsStorage;\n /** Add the \"Local Backups\" item to the Window menu. Default: true. */\n addMenuItem?: boolean;\n}\n\n/**\n * Client-side automatic graph backups.\n *\n * Periodically snapshots every open graph into local storage so a crash or a\n * bad edit during development is recoverable, and adds a panel to browse and\n * restore those copies. Everything stays in the browser , no backend.\n *\n * The plugin:\n * - contributes the `Autosave` settings (on/off, frequency, copies-to-keep);\n * - installs a {@link BackupController} on the editor as `system.backups`,\n * which runs the consistency-checked capture loop and honours the settings;\n * - registers the `autosaveBackups` panel plus `autosave.openBackups` /\n * `autosave.backupNow` commands and a Window-menu entry.\n *\n * Snapshots are only taken when a graph changed, settled, is consistent and is\n * not empty; callers can bracket bulk mutations with\n * `system.backups.runExclusive(...)` to guarantee no copy is taken mid-change.\n */\nexport const autosavePlugin = plugin(\n (system: System, options: AutosavePluginOptions = {}) => {\n system.registerSettings(AUTOSAVE_SETTINGS);\n\n const controller = new BackupController(system, options.storage);\n system.decorate('backups', controller);\n\n const commands = system.commandStore.getState();\n commands.register({\n id: 'autosave.openBackups',\n title: 'Open Local Backups',\n run: (ctx) => ctx.editor.tabStore.getState().openTab(BACKUP_PANEL_TAB_ID)\n });\n commands.register({\n id: 'autosave.backupNow',\n title: 'Back Up Graph Now',\n run: (ctx) => {\n ctx.editor.backups?.backupNow();\n }\n });\n\n system.tabLoader.register(BACKUP_PANEL_TAB_ID, () => ({\n id: BACKUP_PANEL_TAB_ID,\n closable: true,\n title: 'Local Backups',\n group: 'default',\n content: () => (\n <ErrorBoundary fallback={'Error loading Local Backups panel'}>\n <BackupPanel />\n </ErrorBoundary>\n )\n }));\n\n if (options.addMenuItem !== false) {\n const menuStore = system.menubarStore;\n const windowMenu = menuStore\n .getState()\n .items.find((menu) => menu.name === 'window');\n if (windowMenu) {\n menuStore.getState().setSubMenuItems('window', [\n ...windowMenu.items,\n {\n name: 'autosaveBackups',\n render: function BackupsMenuItem() {\n return (\n <MenuItemElement\n key=\"autosaveBackups\"\n onClick={() =>\n system.tabStore.getState().openTab(BACKUP_PANEL_TAB_ID)\n }\n >\n Local Backups\n </MenuItemElement>\n );\n }\n }\n ]);\n }\n }\n },\n { name: 'autosave' }\n);\n","import { plugin } from '@/system/plugin';\nimport type { System } from '@/system/system';\nimport { docsPlugin } from '@/plugin/docs';\nimport { alignmentPlugin } from '@/plugin/alignment';\nimport { layoutPlugin } from '@/plugin/layout';\nimport { notesPlugin } from '@/plugin/notes';\nimport { autosavePlugin } from '@/plugin/autosave';\n\n/**\n * Batteries-included bundle of the standard editor plugins. Register this once\n * instead of wiring each plugin by hand:\n *\n * ```ts\n * const system = new System(registry);\n * system.registerPlugin(kitchenSinkPlugin);\n * ```\n *\n * It currently pulls in:\n * - {@link docsPlugin} — the in-editor node documentation browser;\n * - {@link alignmentPlugin} — node alignment + distribution;\n * - {@link layoutPlugin} — Dagre/ELK auto-layout (heavy deps, opt-in);\n * - {@link notesPlugin} — markdown note nodes (tiptap/prosemirror, opt-in);\n * - {@link autosavePlugin} — client-side local backups of open graphs.\n *\n * It intentionally does **not** register a graph runner: runners\n * ({@link localGraphRunnerPlugin}, the remote client, ...) need host-specific\n * options (a node registry, transport, ...) so hosts wire those themselves.\n */\nexport const kitchenSinkPlugin = plugin(\n async (system: System) => {\n await system.registerPlugin(docsPlugin);\n await system.registerPlugin(alignmentPlugin);\n await system.registerPlugin(layoutPlugin);\n await system.registerPlugin(notesPlugin);\n await system.registerPlugin(autosavePlugin);\n },\n { name: 'kitchen-sink' }\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 preferences (global defaults applied to every run)\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 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 clearLogsOnRun: true,\n clearTracesOnRun: true,\n // Off by default: tracing costs two events per node execution and is the\n // single biggest per-frame overhead for display-rate graphs. Opt in via the\n // \"Enable execution tracing\" checkbox in the graph runner panel.\n enableTracing: false,\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 // Trace traffic is high-frequency (per node execution / per frame) and\n // has its own dedicated panel; recording it here allocated a new\n // activity array per event and instantly evicted every other message\n // from the 50-entry ring. Received server messages are cast into this\n // union by the callers, so compare the raw type string.\n const type = (message as { type: string }).type;\n if (type === 'trace' || type === 'traceBatch') {\n return state;\n }\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 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/**\n * Optional capability: a transport that can interactively control a run\n * (pause / resume / step). Remote transports may not support it; the client\n * detects support via {@link supportsExecutionControl} rather than reaching into\n * transport internals.\n */\nexport interface IExecutionControl {\n pauseExecution(runId: string): void;\n resumeExecution(runId: string): Promise<void>;\n stepExecution(runId: string): Promise<void>;\n isPaused(runId: string): boolean;\n}\n\n/** Type guard: does this transport implement {@link IExecutionControl}? */\nexport function supportsExecutionControl(\n transport: unknown\n): transport is IExecutionControl {\n return (\n !!transport &&\n typeof (transport as IExecutionControl).pauseExecution === 'function' &&\n typeof (transport as IExecutionControl).resumeExecution === 'function' &&\n typeof (transport as IExecutionControl).stepExecution === 'function'\n );\n}\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 // Default off , tracing is a debugging aid with a real per-node cost;\n // callers opt in explicitly (the run controller passes the panel's\n // \"Enable execution tracing\" preference).\n trace: options?.trace ?? false\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 = {\"emptyMessage\":\"_7ZOWRq_emptyMessage\",\"infoField\":\"_7ZOWRq_infoField\",\"messagesCount\":\"_7ZOWRq_messagesCount\",\"messageHeader\":\"_7ZOWRq_messageHeader\",\"tabPanelGapLarge\":\"_7ZOWRq_tabPanelGapLarge\",\"buttonGroup\":\"_7ZOWRq_buttonGroup\",\"messagesToolbar\":\"_7ZOWRq_messagesToolbar\",\"panel\":\"_7ZOWRq_panel\",\"scrollContainer\":\"_7ZOWRq_scrollContainer\",\"title\":\"_7ZOWRq_title\",\"tabPanelGap\":\"_7ZOWRq_tabPanelGap\",\"messageCard\":\"_7ZOWRq_messageCard\",\"button\":\"_7ZOWRq_button\",\"messageDirectionIcon\":\"_7ZOWRq_messageDirectionIcon\",\"treeItemTitle\":\"_7ZOWRq_treeItemTitle\",\"messageType\":\"_7ZOWRq_messageType\",\"connectionForm\":\"_7ZOWRq_connectionForm\",\"codeBlock\":\"_7ZOWRq_codeBlock\",\"infoBox\":\"_7ZOWRq_infoBox\",\"formField\":\"_7ZOWRq_formField\",\"messageDirection\":\"_7ZOWRq_messageDirection\",\"errorBox\":\"_7ZOWRq_errorBox\",\"messageContent\":\"_7ZOWRq_messageContent\",\"messageTime\":\"_7ZOWRq_messageTime\"}\nexport default classes\n\nconst _emptyMessage0 = classes[\"emptyMessage\"]\nexport { _emptyMessage0 as \"emptyMessage\" }\n\nconst _infoField0 = classes[\"infoField\"]\nexport { _infoField0 as \"infoField\" }\n\nconst _messagesCount0 = classes[\"messagesCount\"]\nexport { _messagesCount0 as \"messagesCount\" }\n\nconst _messageHeader0 = classes[\"messageHeader\"]\nexport { _messageHeader0 as \"messageHeader\" }\n\nconst _tabPanelGapLarge0 = classes[\"tabPanelGapLarge\"]\nexport { _tabPanelGapLarge0 as \"tabPanelGapLarge\" }\n\nconst _buttonGroup0 = classes[\"buttonGroup\"]\nexport { _buttonGroup0 as \"buttonGroup\" }\n\nconst _messagesToolbar0 = classes[\"messagesToolbar\"]\nexport { _messagesToolbar0 as \"messagesToolbar\" }\n\nconst _panel0 = classes[\"panel\"]\nexport { _panel0 as \"panel\" }\n\nconst _scrollContainer0 = classes[\"scrollContainer\"]\nexport { _scrollContainer0 as \"scrollContainer\" }\n\nconst _title0 = classes[\"title\"]\nexport { _title0 as \"title\" }\n\nconst _tabPanelGap0 = classes[\"tabPanelGap\"]\nexport { _tabPanelGap0 as \"tabPanelGap\" }\n\nconst _messageCard0 = classes[\"messageCard\"]\nexport { _messageCard0 as \"messageCard\" }\n\nconst _button0 = classes[\"button\"]\nexport { _button0 as \"button\" }\n\nconst _messageDirectionIcon0 = classes[\"messageDirectionIcon\"]\nexport { _messageDirectionIcon0 as \"messageDirectionIcon\" }\n\nconst _treeItemTitle0 = classes[\"treeItemTitle\"]\nexport { _treeItemTitle0 as \"treeItemTitle\" }\n\nconst _messageType0 = classes[\"messageType\"]\nexport { _messageType0 as \"messageType\" }\n\nconst _connectionForm0 = classes[\"connectionForm\"]\nexport { _connectionForm0 as \"connectionForm\" }\n\nconst _codeBlock0 = classes[\"codeBlock\"]\nexport { _codeBlock0 as \"codeBlock\" }\n\nconst _infoBox0 = classes[\"infoBox\"]\nexport { _infoBox0 as \"infoBox\" }\n\nconst _formField0 = classes[\"formField\"]\nexport { _formField0 as \"formField\" }\n\nconst _messageDirection0 = classes[\"messageDirection\"]\nexport { _messageDirection0 as \"messageDirection\" }\n\nconst _errorBox0 = classes[\"errorBox\"]\nexport { _errorBox0 as \"errorBox\" }\n\nconst _messageContent0 = classes[\"messageContent\"]\nexport { _messageContent0 as \"messageContent\" }\n\nconst _messageTime0 = classes[\"messageTime\"]\nexport { _messageTime0 as \"messageTime\" }\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(--ds-git-modified)'\n : 'var(--ds-git-added)';\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, type StoreApi } from 'zustand';\nimport { Play, PauseWindow, Square, ArrowRight } from 'iconoir-react';\nimport { useGraph } from '@/system/provider';\nimport type { GraphRunnerClientStore } from './store';\nimport type { GraphRunController } from './runController';\n\n/**\n * Execution controls for the graph in the surrounding tab. Connection state\n * comes from the shared runner connection; run state comes from this graph's own\n * run controller, so each open graph has independent controls.\n */\nexport const GraphRunnerButtons = () => {\n const session = useGraph();\n const controller = session.runController;\n if (!controller) return null;\n return (\n <Buttons\n controller={controller}\n connectionStore={session.editor.runner.store}\n />\n );\n};\n\nconst Buttons = ({\n controller,\n connectionStore\n}: {\n controller: GraphRunController;\n connectionStore: StoreApi<GraphRunnerClientStore>;\n}) => {\n const connectionState = useStore(connectionStore, (s) => s.connectionState);\n const isExecuting = useStore(controller.store, (s) => s.isExecuting);\n const isPaused = useStore(controller.store, (s) => s.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={() => controller.play()}\n disabled={!isConnected}\n >\n <Play />\n </VscodeButton>\n )}\n {isExecuting && !isPaused && (\n <VscodeButton\n secondary\n iconOnly\n title=\"Pause Graph\"\n onClick={() => controller.pause()}\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={() => controller.resume()}\n disabled={!isConnected}\n >\n <Play />\n </VscodeButton>\n <VscodeButton\n secondary\n iconOnly\n title=\"Step Forward\"\n onClick={() => controller.step()}\n disabled={!isConnected}\n >\n <ArrowRight />\n </VscodeButton>\n </>\n )}\n <VscodeButton\n secondary\n iconOnly\n title=\"Stop Graph\"\n onClick={() => controller.stop()}\n disabled={!isExecuting}\n >\n <Square />\n </VscodeButton>\n </>\n );\n};\n","import type { GraphSession } from '@/system/graphSession';\nimport type { GraphRunnerClient } from './client';\nimport type { GraphRunner } from './runner';\nimport { executing } from '@/annotations';\nimport { type ValueJSON } from '@kiberon-labs/behave-graph';\nimport type { TraceBatchEvent } from './types';\n\n/**\n * Per-session batcher for the `executing` node annotation.\n *\n * Trace events arrive per node execution (start + end), which at display-rate\n * ticking means hundreds of events per frame. Writing the annotation straight\n * through did a full O(nodes) copy-map of the node array per event; instead,\n * accumulate the net executing state here and apply it once per animation\n * frame with a single identity-preserving setNodes pass.\n */\ntype ExecutingBatch = {\n pending: Map<string, boolean>;\n scheduled: boolean;\n};\n\nconst executingBatches = new WeakMap<GraphSession, ExecutingBatch>();\n\nconst scheduleFrame = (cb: () => void): void => {\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(cb);\n } else {\n setTimeout(cb, 16);\n }\n};\n\nfunction flushExecutingState(session: GraphSession, batch: ExecutingBatch) {\n batch.scheduled = false;\n if (batch.pending.size === 0) return;\n const updates = batch.pending;\n batch.pending = new Map();\n\n session.nodeStore.getState().setNodes((nodes) => {\n let changed = false;\n const next = nodes.map((node) => {\n if (!('data' in node)) return node;\n const target = updates.get(node.id);\n if (target === undefined) return node;\n if (Boolean(node.data.annotations?.[executing]) === target) return node;\n changed = true;\n return {\n ...node,\n data: {\n ...node.data,\n annotations: {\n ...node.data.annotations,\n [executing]: target\n }\n }\n };\n });\n // Keep the original array identity when nothing changed so selector-based\n // subscribers (the React Flow canvas) skip the re-render entirely.\n return changed ? next : nodes;\n });\n}\n\nfunction markExecuting(session: GraphSession, nodeId: string, state: boolean) {\n let batch = executingBatches.get(session);\n if (!batch) {\n batch = { pending: new Map(), scheduled: false };\n executingBatches.set(session, batch);\n }\n batch.pending.set(nodeId, state);\n if (!batch.scheduled) {\n batch.scheduled = true;\n scheduleFrame(() => flushExecutingState(session, batch));\n }\n}\n\n// Clear executing state from all nodes of a session, dropping any queued\n// per-node updates so a pending flush can't re-highlight after the run ended.\nfunction clearAllExecutingStates(session: GraphSession) {\n const batch = executingBatches.get(session);\n if (batch) batch.pending.clear();\n session.nodeStore.getState().setNodes((nodes) => {\n let changed = false;\n const next = nodes.map((node) => {\n if ('data' in node && node.data.annotations?.[executing]) {\n changed = true;\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 return changed ? next : nodes;\n });\n}\n\n/** Apply one trace event to the session's trace spans + executing annotation. */\nfunction processTraceEvent(session: GraphSession, ev: TraceBatchEvent) {\n const traceStore = session.traceStore.getState();\n if (ev.event === 'start') {\n let name = ev.nodeId;\n if (ev.data && typeof ev.data === 'object' && 'typeName' in ev.data) {\n const typeName = (ev.data as { typeName?: unknown }).typeName;\n if (typeof typeName === 'string') {\n name = typeName;\n }\n }\n traceStore.addSpan({\n nodeId: ev.nodeId,\n name,\n // `??` not `||`: the worker sends run-relative ms, so 0 is a valid (and\n // common, for the first node) start , `||` fell back to the main thread's\n // performance.now(), producing huge, wrong-clock timestamps.\n start: ev.timestamp ?? performance.now(),\n // Open span: NaN until the matching `end` event arrives. The store/render\n // treat NaN as \"still running\"; a literal end let it render mis-sized.\n end: Number.NaN\n // lane omitted: let the store allocate/free lanes so concurrent spans\n // stack instead of all piling into lane 0.\n });\n markExecuting(session, ev.nodeId, true);\n } else if (ev.event === 'end') {\n traceStore.updateSpan(ev.nodeId, {\n end: ev.timestamp ?? performance.now()\n });\n markExecuting(session, ev.nodeId, false);\n }\n}\n\n/**\n * Clients that already have listeners attached. Guards against double-wiring when\n * both the plugin's `runner.connect()` and a host (e.g. the webworker runner)\n * call {@link setupClientEventListeners} on the same client , which would record\n * every trace span, log and event twice.\n */\nconst wiredClients = new WeakSet<GraphRunnerClient>();\n\n/**\n * Setup persistent event listeners on the shared client. Registered once when\n * the client connects; every message is routed to the session that started its\n * run (via {@link GraphRunner.runIndex}), so concurrent graphs stay isolated.\n *\n * Idempotent per client: calling it again with the same client is a no-op.\n */\nexport function setupClientEventListeners(\n client: GraphRunnerClient,\n runner: GraphRunner\n) {\n if (wiredClients.has(client)) return;\n wiredClients.add(client);\n\n // Resolve the session that owns a given run id, or null if unknown.\n const sessionFor = (runId: string): GraphSession | null =>\n runner.runIndex.get(runId)?.session ?? null;\n\n // Batched trace events (one message per flush window, many events inside).\n client.on('traceBatch', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n for (const ev of message.events) {\n processTraceEvent(session, ev);\n }\n });\n\n // Single trace events , kept for remote servers that predate `traceBatch`.\n client.on('trace', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n processTraceEvent(session, message);\n });\n\n // Listen for log messages\n client.on('log', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n const formattedMessage = `[${message.runId}/${message.graphId}] ${message.message}${message.data !== undefined ? ` ${JSON.stringify(message.data)}` : ''}`;\n session.logsStore.getState().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. A tick-driven graph writes\n // variables every frame, so coalesce to the latest value per variable and\n // apply once per animation frame instead of one store write per change.\n const pendingVariableUpdates = new Map<GraphSession, Map<string, unknown>>();\n let variableFlushScheduled = false;\n\n const flushVariableUpdates = () => {\n variableFlushScheduled = false;\n for (const [session, updates] of pendingVariableUpdates) {\n const variableStore = session.variableStore.getState();\n for (const [id, newValue] of updates) {\n const existingVariable = variableStore.variables[id];\n if (existingVariable) {\n variableStore.setVariable(id, {\n ...existingVariable,\n initialValue: newValue as ValueJSON\n });\n } else {\n const inferredType = typeof newValue;\n variableStore.setVariable(id, {\n id,\n name: id,\n valueTypeName: inferredType === 'object' ? 'string' : inferredType,\n initialValue: newValue as ValueJSON\n });\n }\n }\n }\n pendingVariableUpdates.clear();\n };\n\n client.on('variableChanged', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n let updates = pendingVariableUpdates.get(session);\n if (!updates) {\n updates = new Map();\n pendingVariableUpdates.set(session, updates);\n }\n updates.set(message.variableName, message.newValue);\n if (!variableFlushScheduled) {\n variableFlushScheduled = true;\n scheduleFrame(flushVariableUpdates);\n }\n });\n\n // Run lifecycle events\n client.on('completed', (message) => {\n const controller = runner.runIndex.get(message.runId);\n if (!controller) return;\n controller.session.editor.notifications.success(\n `Graph completed: ${message.graphId}`\n );\n controller.finishRun();\n clearAllExecutingStates(controller.session);\n });\n\n client.on('error', (message) => {\n if (!message.runId) return;\n const controller = runner.runIndex.get(message.runId);\n if (!controller) return;\n controller.session.editor.notifications.error(\n `Graph failed: ${message.graphId}`\n );\n controller.finishRun();\n clearAllExecutingStates(controller.session);\n });\n\n client.on('stopped', (message) => {\n const controller = runner.runIndex.get(message.runId);\n if (!controller) return;\n controller.session.editor.notifications.info(\n `Graph stopped: ${message.graphId}`\n );\n controller.finishRun();\n clearAllExecutingStates(controller.session);\n });\n\n // Realtime state change listeners\n client.on('nodeRemoved', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n session.nodeStore\n .getState()\n .setNodes((nodes) => nodes.filter((node) => node.id !== message.nodeId));\n session.editor.notifications.info(`Node removed: ${message.nodeId}`);\n });\n\n client.on('linkCreated', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n session.editor.notifications.info(\n `Link created: ${message.fromNodeId}/${message.fromSocket} -> ${message.toNodeId}/${message.toSocket}`\n );\n });\n\n client.on('linkRemoved', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n session.editor.notifications.info(\n `Link removed: ${message.fromNodeId}/${message.fromSocket} -> ${message.toNodeId}/${message.toSocket}`\n );\n });\n\n client.on('nodeParamUpdated', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n session.editor.notifications.info(`Parameter updated on ${message.nodeId}`);\n });\n\n client.on('affectedNodes', (message) => {\n const session = sessionFor(message.runId);\n if (!session) return;\n session.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 session.editor.notifications.info(\n `Executing ${message.reason}: ${message.nodeIds.length} node(s)`\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 { setupClientEventListeners } from './actions';\nimport type { GraphRunController } from './runController';\n\ndeclare module '@/system/system' {\n interface System {\n runner: GraphRunner;\n }\n}\n\n/**\n * Shared connection to the graph runner server. Owns the client, connection\n * lifecycle and server metadata; per-graph run state and run lifecycle live on\n * {@link GraphRunController}. Incoming server messages are dispatched back to the\n * owning controller via {@link GraphRunner.runIndex}, keyed by run id, so\n * multiple graphs can run concurrently and independently.\n */\nexport class GraphRunner {\n private system: System;\n public readonly store: StoreApi<GraphRunnerClientStore>;\n /** runId -> the controller that started it. */\n public readonly runIndex = new Map<string, GraphRunController>();\n\n constructor(system: System, store: StoreApi<GraphRunnerClientStore>) {\n this.system = system;\n this.store = store;\n }\n\n registerRun(runId: string, controller: GraphRunController): void {\n this.runIndex.set(runId, controller);\n }\n\n unregisterRun(runId: string): void {\n this.runIndex.delete(runId);\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 // Messages are routed to the originating session by run id.\n setupClientEventListeners(theClient, this);\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","import { createStore, type StoreApi } from 'zustand';\nimport type { GraphSession } from '@/system/graphSession';\nimport type { GraphRunner } from './runner';\nimport { buildUIGraphJSON } from '../../transformers/Uigraph';\nimport { isBehaveNode } from '@/util/isBehaveNode';\nimport { supportsExecutionControl } from './transport';\n\n// Contribute the per-session run controller to the graph session as a typed,\n// plugin-owned property. Core no longer declares this field , the graph runner\n// plugin attaches it via `session.decorate('runController', …)` from a session\n// extension (see ./index.tsx).\ndeclare module '@/system/graphSession' {\n interface IGraphSession {\n runController?: GraphRunController;\n }\n}\n\n/**\n * Per-run state for a single graph. Each {@link GraphSession} owns one of these,\n * so multiple graphs can run independently and concurrently.\n */\nexport interface RunControllerStore {\n currentRunId: string | null;\n currentGraphId: string | null;\n isExecuting: boolean;\n isPaused: boolean;\n setCurrentRunId: (runId: string | null) => void;\n setCurrentGraphId: (graphId: string | null) => void;\n setIsExecuting: (isExecuting: boolean) => void;\n setIsPaused: (isPaused: boolean) => void;\n}\n\nconst runControllerStoreFactory = (): StoreApi<RunControllerStore> =>\n createStore<RunControllerStore>((set) => ({\n currentRunId: null,\n currentGraphId: null,\n isExecuting: false,\n isPaused: false,\n setCurrentRunId: (currentRunId) => set({ currentRunId }),\n setCurrentGraphId: (currentGraphId) => set({ currentGraphId }),\n setIsExecuting: (isExecuting) => set({ isExecuting }),\n setIsPaused: (isPaused) => set({ isPaused })\n }));\n\n/**\n * Drives execution for a single graph session. Run lifecycle and run state are\n * per-session; the underlying connection/client is shared via {@link GraphRunner}.\n * Incoming server messages are routed back to the originating controller by run\n * id (see `GraphRunner.runIndex`).\n */\nexport class GraphRunController {\n public readonly session: GraphSession;\n public readonly runner: GraphRunner;\n public readonly store: StoreApi<RunControllerStore> =\n runControllerStoreFactory();\n private readonly disposers: Array<() => void> = [];\n\n constructor(session: GraphSession, runner: GraphRunner) {\n this.session = session;\n this.runner = runner;\n this.setupRealtimeForwarding();\n }\n\n private get notifications() {\n return this.session.editor.notifications;\n }\n\n /** Run the graph for this session. */\n async play(): Promise<void> {\n const { clearLogsOnRun, clearTracesOnRun } = this.runner.store.getState();\n\n if (clearLogsOnRun) {\n this.session.logsStore.getState().clear();\n }\n if (clearTracesOnRun) {\n this.session.traceStore.getState().clear();\n }\n\n const graphId = this.session.id;\n const uiGraphData = buildUIGraphJSON(this.session);\n try {\n await this.runRemotely(graphId, { graph: uiGraphData.flow });\n } catch {\n // Error already surfaced in runRemotely\n }\n }\n\n async runRemotely(\n graphId: string,\n options?: { graph?: unknown; inputs?: unknown }\n ): Promise<void> {\n const client = this.runner.store.getState().client;\n const { enableTracing } = this.runner.store.getState();\n const { setCurrentRunId, setCurrentGraphId, setIsExecuting, setIsPaused } =\n this.store.getState();\n\n if (!client) {\n this.notifications.error('No graph runner connection');\n throw new Error('No graph runner connection');\n }\n if (this.store.getState().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 this.runner.registerRun(runId, this);\n\n this.notifications.info(`Graph execution started: ${graphId}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n setIsExecuting(false);\n setIsPaused(false);\n setCurrentRunId(null);\n setCurrentGraphId(null);\n this.notifications.error(`Failed to run graph: ${message}`);\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n const client = this.runner.store.getState().client;\n const { currentRunId } = this.store.getState();\n if (!client || !currentRunId) return;\n\n try {\n await client.stopGraph(currentRunId);\n this.notifications.info('Stopping graph execution');\n this.finishRun();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.notifications.error(`Failed to stop graph: ${message}`);\n }\n }\n\n async pause(): Promise<void> {\n const client = this.runner.store.getState().client;\n const { currentRunId, setIsPaused } = this.store.getState();\n if (!client || !currentRunId) return;\n\n try {\n const transport = client.transport;\n if (supportsExecutionControl(transport)) {\n transport.pauseExecution(currentRunId);\n setIsPaused(true);\n this.notifications.info('Execution paused');\n } else {\n await this.stop();\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.notifications.error(`Failed to pause graph: ${message}`);\n }\n }\n\n async resume(): Promise<void> {\n const client = this.runner.store.getState().client;\n const { currentRunId, setIsPaused } = this.store.getState();\n if (!client || !currentRunId) return;\n\n try {\n const transport = client.transport;\n if (supportsExecutionControl(transport)) {\n setIsPaused(false);\n this.notifications.info('Resuming execution');\n await transport.resumeExecution(currentRunId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.notifications.error(`Failed to resume graph: ${message}`);\n }\n }\n\n async step(): Promise<void> {\n const client = this.runner.store.getState().client;\n const { currentRunId, setIsPaused } = this.store.getState();\n if (!client || !currentRunId) return;\n\n try {\n const transport = client.transport;\n if (supportsExecutionControl(transport)) {\n setIsPaused(true);\n await transport.stepExecution(currentRunId);\n } else {\n this.notifications.info(\n 'Step execution not supported for this transport'\n );\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.notifications.error(`Failed to step graph: ${message}`);\n }\n }\n\n /** Reset run state after completion/stop/error and unregister the run. */\n finishRun(): void {\n const runId = this.store.getState().currentRunId;\n if (runId) this.runner.unregisterRun(runId);\n const s = this.store.getState();\n s.setIsExecuting(false);\n s.setIsPaused(false);\n s.setCurrentRunId(null);\n s.setCurrentGraphId(null);\n }\n\n /**\n * Forward live graph edits to the server while this graph is running, tagged\n * with this controller's run id so concurrent graphs stay isolated.\n */\n private setupRealtimeForwarding(): void {\n const pubsub = this.session.pubsub;\n const canForward = () => {\n const client = this.runner.store.getState().client;\n const runId = this.store.getState().currentRunId;\n const caps = this.runner.store.getState().connectionInfo.capabilities;\n return client && runId && caps?.realtime ? { client, runId } : null;\n };\n\n const tokens = [\n pubsub.subscribe('node:added', (_, node) => {\n if (!isBehaveNode(node)) return;\n const ctx = canForward();\n if (!ctx) return;\n ctx.client.addNode(\n ctx.runId,\n node.id,\n node.data.type,\n node.data as Record<string, unknown>,\n node.position\n );\n }),\n pubsub.subscribe('edge:added', (_, edge) => {\n const ctx = canForward();\n if (!ctx || !edge.source || !edge.target) return;\n ctx.client.createLink(\n ctx.runId,\n edge.source,\n edge.sourceHandle || '',\n edge.target,\n edge.targetHandle || ''\n );\n }),\n pubsub.subscribe('edge:removed', (_, edge) => {\n const ctx = canForward();\n if (!ctx || !edge.source || !edge.target) return;\n ctx.client.removeLink(\n ctx.runId,\n edge.source,\n edge.sourceHandle || '',\n edge.target,\n edge.targetHandle || ''\n );\n }),\n pubsub.subscribe('node:removed', (_, node) => {\n if (!isBehaveNode(node)) return;\n const ctx = canForward();\n if (!ctx) return;\n ctx.client.removeNode(ctx.runId, node.id);\n })\n ];\n\n for (const token of tokens) {\n if (typeof token === 'string') {\n this.disposers.push(() => pubsub.unsubscribe(token));\n }\n }\n }\n\n dispose(): void {\n const runId = this.store.getState().currentRunId;\n if (runId) this.runner.unregisterRun(runId);\n this.disposers.forEach((d) => d());\n this.disposers.length = 0;\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 { GraphRunner } from './runner';\nimport { GraphRunController } from './runController';\nimport type { GraphSession } from '@/system/graphSession';\n\nexport * from './types';\nexport * from './client';\nexport * from './transport';\nexport * from './panel';\nexport * from './runner';\nexport * from './runController';\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 // Shared connection. Per-session run controllers are created below.\n const runner = new GraphRunner(system, store);\n system.decorate('runner', runner);\n\n // Attach a run controller to every graph session (existing + future) so each\n // open graph runs independently over the shared connection. The editor applies\n // this to graphs already open and to every graph created later, and tears the\n // controller down when a graph's tab is closed.\n system.registerSessionExtension((session: GraphSession) => {\n if (!session.runController) {\n session.decorate(\n 'runController',\n new GraphRunController(session, runner)\n );\n }\n return () => {\n session.runController?.dispose();\n session.decorate('runController', undefined);\n };\n });\n\n // Add toolbar buttons for graph execution control. Rendered inside each graph\n // tab, GraphRunnerButtons resolves its own session's controller.\n system.toolbarStore.getState().addGroup({\n id: 'graph-runner-controls',\n label: 'Graph Runner',\n buttons: [<GraphRunnerButtons key=\"graph-runner-buttons\" />]\n });\n\n system.hotKeyStore.getState().register({\n action: 'PLAY',\n description: 'Triggers playing the graph',\n trigger: 'p',\n handler: () => {\n const controller = system.session?.runController;\n if (!controller) return;\n if (controller.store.getState().isExecuting) {\n controller.stop();\n } else {\n controller.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 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 TraceBatchEvent\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 * Flushes any trace events still buffered by {@link setupTracing}. Set when\n * tracing is enabled; call before emitting `completed`/`stopped` so the\n * client receives the tail of the trace while the run id is still routable.\n */\n flushTracing?: () => void;\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/** Flush buffered trace events roughly once per frame. */\nconst TRACE_FLUSH_INTERVAL_MS = 16;\n/** Safety valve: flush early if a single window buffers this many events. */\nconst TRACE_FLUSH_MAX_EVENTS = 2048;\n\n/**\n * Setup tracing for a run.\n *\n * Node execution events are buffered and flushed as a single `traceBatch`\n * message per flush window instead of one `trace` message per event. A graph\n * ticking at display rate executes every node twice per frame (start + end);\n * sending each event individually made the message pipeline (store updates,\n * postMessage for the worker runner) the dominant per-frame cost.\n */\nexport function setupTracing(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext\n): void {\n let buffer: TraceBatchEvent[] = [];\n let flushTimer: ReturnType<typeof setTimeout> | undefined;\n\n const flush = () => {\n if (flushTimer !== undefined) {\n clearTimeout(flushTimer);\n flushTimer = undefined;\n }\n if (buffer.length === 0) return;\n const events = buffer;\n buffer = [];\n ctx.sendMessage({\n type: 'traceBatch',\n runId: run.runId,\n graphId,\n events\n });\n };\n run.flushTracing = flush;\n\n const push = (event: TraceBatchEvent) => {\n buffer.push(event);\n if (buffer.length >= TRACE_FLUSH_MAX_EVENTS) {\n flush();\n return;\n }\n if (flushTimer === undefined) {\n flushTimer = setTimeout(flush, TRACE_FLUSH_INTERVAL_MS);\n }\n };\n\n run.engine.onNodeExecutionStart.addListener((node) => {\n run.performance.nodesExecuted++;\n push({\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 push({\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 */\n/**\n * The single graph-execution lifecycle shared by both runners (the in-browser\n * local transport and the web-worker runner). It drives the start → tick → end →\n * completed phase machine and emits the `completed` / error messages; runner-\n * specific behaviour (how fibers are stepped, tick timing, and what to do on\n * completion/error) is injected via {@link ExecuteGraphLifecycleOptions} hooks so\n * neither runner keeps its own copy of this logic.\n */\nexport interface ExecuteGraphLifecycleOptions {\n /** Tick timing when no {@link tickStrategy} is given. Defaults to 50ms. */\n tickInterval?: number;\n /**\n * When true, the run finalizes (end phase, `completed` message, engine\n * dispose) once its flows drain. Defaults to false: the run idles in the\n * tick phase, keeping event-node subscriptions live and draining any fibers\n * they commit, until it is explicitly stopped.\n */\n autoEnd?: boolean;\n /**\n * Run the engine's pending fibers for the current phase. Defaults to\n * `run.engine.executeAllAsync()`; the local runner injects a pause-aware\n * executor that also honours its step-delay / speed settings.\n */\n executeStep?: () => Promise<void>;\n /** Timing between tick iterations. Defaults to `sleep(tickInterval)`. */\n tickStrategy?: () => Promise<void>;\n /** Invoked after each tick iteration. */\n onStepComplete?: () => Promise<void>;\n /**\n * Invoked after a natural completion — the run is marked completed, the\n * `completed` message has been sent, and the engine disposed. Lets a runner\n * run session hooks and sync its own state (e.g. the local panel's status).\n */\n onComplete?: () => void | Promise<void>;\n /**\n * Invoked on error (after the run is marked errored, before the engine is\n * disposed and the error rethrown). Replaces the default `sendError`.\n */\n onError?: (error: Error) => void | Promise<void>;\n}\n\n/** True when a lifecycle event has at least one listener attached. */\nfunction hasListeners(event?: { listenerCount: number }): boolean {\n return !!event && event.listenerCount > 0;\n}\n\n/**\n * Run the `start` lifecycle phase: emit the start event (if anyone is\n * listening) and drain the fibers it commits, then advance to the tick phase.\n */\nasync function runStartPhase(\n run: ActiveRun,\n eventEmitter: ILifecycleEventEmitter | undefined,\n executeStep: () => Promise<unknown>\n): Promise<void> {\n if (run.executionPhase !== 'start') return;\n if (hasListeners(eventEmitter?.startEvent)) {\n eventEmitter!.startEvent.emit();\n await executeStep();\n }\n run.executionPhase = 'tick';\n}\n\n/**\n * Run the `tick` phase until the run is paused or stopped. Returns `true` when\n * the loop yielded control mid-tick (paused/stopped) so the caller should bail\n * out without finalizing.\n *\n * A run stays alive here even with no tick listeners: completing it would\n * dispose the engine and tear down event-node subscriptions (ai/onToolCall,\n * ai/onMessage, custom triggers) that fire out-of-band, after the start flow has\n * drained. The loop keeps draining fibers those events commit. Pass\n * `autoEnd: true` to restore the finalize-when-drained behaviour for\n * fire-and-forget runs.\n */\nasync function runTickPhase(\n run: ActiveRun,\n eventEmitter: ILifecycleEventEmitter | undefined,\n executeStep: () => Promise<unknown>,\n tickStrategy: () => Promise<unknown>,\n options?: ExecuteGraphLifecycleOptions\n): Promise<boolean> {\n if (run.executionPhase !== 'tick') return false;\n\n const hasTickListeners = hasListeners(eventEmitter?.tickEvent);\n const autoEnd = options?.autoEnd ?? false;\n if (!hasTickListeners && autoEnd) {\n run.executionPhase = 'end';\n return false;\n }\n\n while (!run.isPaused && run.status === 'running') {\n if (hasTickListeners) {\n eventEmitter!.tickEvent.emit();\n run.currentTick++;\n }\n await executeStep();\n\n if (options?.onStepComplete) {\n await options.onStepComplete();\n }\n\n if (run.isPaused || run.status !== 'running') {\n return true;\n }\n\n await tickStrategy();\n }\n return false;\n}\n\n/**\n * Run the `end` lifecycle phase: emit the end event (if listened) and drain,\n * then mark the run as reaching the `completed` phase.\n */\nasync function runEndPhase(\n run: ActiveRun,\n eventEmitter: ILifecycleEventEmitter | undefined,\n executeStep: () => Promise<unknown>\n): Promise<void> {\n if (run.executionPhase !== 'end' || run.isPaused) return;\n if (hasListeners(eventEmitter?.endEvent)) {\n eventEmitter!.endEvent.emit();\n await executeStep();\n }\n run.executionPhase = 'completed';\n}\n\n/**\n * Finalize a run that ran out of fibers and isn't paused. Only autoEnd runs\n * advance this far; by default a run idles in the tick phase until stopped.\n */\nasync function finalizeCompletedRun(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext,\n options?: ExecuteGraphLifecycleOptions\n): Promise<void> {\n if (\n run.executionPhase !== 'completed' ||\n run.isPaused ||\n !(options?.autoEnd ?? false)\n ) {\n return;\n }\n\n run.status = 'completed';\n const elapsedMs = Date.now() - run.startedAt;\n\n // Deliver any buffered trace events before `completed` , the client\n // unregisters the run id on completion and would drop a late batch.\n run.flushTracing?.();\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 await options?.onComplete?.();\n}\n\n/** Mark the run errored, notify, dispose the engine, and rethrow. */\nasync function handleLifecycleError(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext,\n error: unknown,\n options?: ExecuteGraphLifecycleOptions\n): Promise<never> {\n run.status = 'error';\n run.flushTracing?.();\n const err = error instanceof Error ? error : new Error(String(error));\n if (options?.onError) {\n await options.onError(err);\n } else {\n ctx.sendError('NODE_EXECUTION_ERROR', err.message, {\n runId: run.runId,\n graphId\n });\n }\n run.engine.dispose();\n throw error;\n}\n\nexport async function executeGraphLifecycle(\n run: ActiveRun,\n graphId: string,\n ctx: MessageContext,\n options?: ExecuteGraphLifecycleOptions\n): Promise<void> {\n const executeStep =\n options?.executeStep ?? (() => run.engine.executeAllAsync());\n const tickStrategy =\n options?.tickStrategy ??\n (() => sleep((options?.tickInterval ?? 50) / 1000));\n\n try {\n const eventEmitter = run.registry.dependencies?.ILifecycleEventEmitter as\n | ILifecycleEventEmitter\n | undefined;\n\n await runStartPhase(run, eventEmitter, executeStep);\n\n const yielded = await runTickPhase(\n run,\n eventEmitter,\n executeStep,\n tickStrategy,\n options\n );\n if (yielded) return;\n\n await runEndPhase(run, eventEmitter, executeStep);\n await finalizeCompletedRun(run, graphId, ctx, options);\n } catch (error) {\n await handleLifecycleError(run, graphId, ctx, error, options);\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 {\n ITransport,\n IExecutionControl,\n TransportState\n} from '../graphrunner/transport.js';\nimport {\n Engine,\n type GraphInstance,\n type ILifecycleEventEmitter,\n readGraphFromJSON,\n validateGraph,\n DefaultLogger,\n type ILogger,\n Link,\n makeGraphApi,\n runSubgraph,\n DEFAULT_SUBGRAPH_MAX_DEPTH\n} from '@kiberon-labs/behave-graph';\nimport type {\n IRegistry,\n IGraphApi,\n GraphJSON\n} 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 setupTracing,\n setupVariableChangeTracking,\n prepareRegistryWithDependencies,\n handleGetServerVariables,\n handleGetServerEvents,\n handleGetSocketConstraints,\n handleGetNodeTypes,\n executeGraphLifecycle,\n type ActiveRun as BaseActiveRun,\n type MessageContext\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\n/**\n * Local run record. Extends the shared {@link BaseActiveRun} (used by both the\n * local and worker runners) with the session + tick bookkeeping that only the\n * local, interactively-controllable transport needs.\n */\ninterface ActiveRun extends BaseActiveRun {\n sessionId: string;\n maxTicks: number;\n /** Whether this run finalizes when its flows drain (default: stay alive). */\n autoEnd: boolean;\n}\n\n/**\n * Local transport that executes graphs in the browser using the Engine\n */\nexport class LocalTransport implements ITransport, IExecutionControl {\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 private resolveGraph?: (id: string) => GraphJSON | undefined;\n\n constructor(\n registry: IRegistry,\n options?: {\n store?: StoreApi<LocalGraphRunnerStore>;\n variables?: ServerVariable[];\n serverEvents?: ServerEvent[];\n sessionFactory?: SessionFactory;\n /**\n * Resolve a referenced graph's JSON by id, enabling Call Subgraph nodes.\n */\n resolveGraph?: (id: string) => GraphJSON | undefined;\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 this.resolveGraph = options?.resolveGraph;\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 // Inject the lifecycle event emitter (if absent) and the forwarding logger\n // , shared with the worker runner.\n registryToUse = prepareRegistryWithDependencies(\n registryToUse,\n transportLogger\n );\n\n // Inject the subgraph resolver so Call Subgraph nodes can run referenced\n // graphs. runSubgraph builds a cycle/depth-guarded IGraphApi for nested\n // calls; the active graph id seeds the call stack so a graph calling back\n // to the active graph (or itself) is detected as a cycle and refused.\n if (this.resolveGraph) {\n const resolveGraph = this.resolveGraph;\n const activeGraphId = message.graphId;\n const graphApi: IGraphApi = {\n getGraph: (id) => resolveGraph(id),\n runGraph: (id, inputs) => {\n const childGraph = resolveGraph(id);\n return childGraph\n ? runSubgraph({\n graphJson: childGraph,\n registry: registryToUse,\n inputs,\n resolveGraph,\n graphId: id,\n stack: [activeGraphId],\n maxDepth: DEFAULT_SUBGRAPH_MAX_DEPTH\n })\n : Promise.resolve({});\n }\n };\n registryToUse = {\n ...registryToUse,\n dependencies: { ...registryToUse.dependencies, IGraphApi: graphApi }\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 // Runs stay alive by default so event subscriptions (ai/onToolCall\n // etc.) keep firing after the start flow drains; opting into autoEnd\n // restores fire-and-forget completion.\n autoEnd: executionOptions.autoEnd ?? false\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 , shared with the worker runner so the trace event shape\n // and timestamps stay consistent across runners.\n if (executionOptions.trace) {\n setupTracing(run, message.graphId, {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, msg, details) => this.sendError(code, msg, details)\n });\n }\n\n // Execute graph asynchronously\n this.executeGraph(run, message.graphId, run.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 const ctx: MessageContext = {\n sendMessage: this.notifyMessage.bind(this),\n sendError: (code, message, details) =>\n this.sendError(code, message, details)\n };\n\n // Tick timing: the session's custom strategy if provided, else a sleep based\n // on the configured tick interval.\n const tickStrategy =\n session.config.tickStrategy ||\n this.createSleepTickStrategy(\n session.config.executionSettings?.tickInterval ?? this.getTickInterval()\n );\n\n // Tear the run down and re-sync the panel's running / active-runs state.\n const cleanup = (): void => {\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 try {\n await executeGraphLifecycle(run, graphId, ctx, {\n autoEnd,\n // Pause-aware executor that also honours the local step-delay / speed.\n executeStep: () => this.executeWithPauseSupport(run),\n tickStrategy,\n onComplete: async () => {\n if (session.config.hooks?.onRunCompleted) {\n await session.config.hooks.onRunCompleted(\n session,\n run.runId,\n graphId,\n null\n );\n }\n cleanup();\n },\n onError: async (error) => {\n if (session.config.hooks?.onRunError) {\n await session.config.hooks.onRunError(\n session,\n run.runId,\n graphId,\n error\n );\n }\n this.sendError('NODE_EXECUTION_ERROR', error.message, {\n runId: run.runId,\n graphId\n });\n cleanup();\n }\n });\n } catch {\n // The error was already reported + cleaned up by the onError hook; this\n // method is fire-and-forget, so swallow the lifecycle's rethrow.\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 delay =\n stepDelay + (executionSpeed < 1.0 ? (1.0 - executionSpeed) * 100 : 0);\n\n // Full-speed path: no artificial delay requested, so drain in large chunks.\n // The single-step limit below exists only to interleave the step delay; at\n // full speed it forced an executeAllAsync call (time checks, promise churn)\n // per node, which dominated the per-tick cost. Chunking keeps pause\n // responsive (checked between chunks) while the engine's sync fast path\n // runs unhindered within a chunk.\n if (delay <= 0) {\n const CHUNK_STEPS = 8192;\n while (run.engine.hasPending() && !run.isPaused) {\n await run.engine.executeAllAsync(5, CHUNK_STEPS);\n }\n return;\n }\n\n const stepLimit = this.getExecutionStepLimit();\n\n // Slow-motion path: execute step by step, sleeping between steps.\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, run.autoEnd, 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 run.flushTracing?.();\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 // Keep the panel's running/active-runs state in sync when stepping\n // reaches the end of the graph.\n this.updateStoreActiveRuns();\n this.updateStoreExecutionState(false, false);\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 run.flushTracing?.();\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 = {\"field\":\"_9Fiycq_field\",\"statusRow\":\"_9Fiycq_statusRow\",\"label\":\"_9Fiycq_label\",\"inputRow\":\"_9Fiycq_inputRow\",\"divider\":\"_9Fiycq_divider\",\"statusValue\":\"_9Fiycq_statusValue\",\"input\":\"_9Fiycq_input\",\"current\":\"_9Fiycq_current\",\"presets\":\"_9Fiycq_presets\",\"helpList\":\"_9Fiycq_helpList\",\"description\":\"_9Fiycq_description\"}\nexport default classes\n\nconst _field0 = classes[\"field\"]\nexport { _field0 as \"field\" }\n\nconst _statusRow0 = classes[\"statusRow\"]\nexport { _statusRow0 as \"statusRow\" }\n\nconst _label0 = classes[\"label\"]\nexport { _label0 as \"label\" }\n\nconst _inputRow0 = classes[\"inputRow\"]\nexport { _inputRow0 as \"inputRow\" }\n\nconst _divider0 = classes[\"divider\"]\nexport { _divider0 as \"divider\" }\n\nconst _statusValue0 = classes[\"statusValue\"]\nexport { _statusValue0 as \"statusValue\" }\n\nconst _input0 = classes[\"input\"]\nexport { _input0 as \"input\" }\n\nconst _current0 = classes[\"current\"]\nexport { _current0 as \"current\" }\n\nconst _presets0 = classes[\"presets\"]\nexport { _presets0 as \"presets\" }\n\nconst _helpList0 = classes[\"helpList\"]\nexport { _helpList0 as \"helpList\" }\n\nconst _description0 = classes[\"description\"]\nexport { _description0 as \"description\" }\n","import { useState } from 'react';\nimport { useStore } from 'zustand';\nimport {\n VscodeButton,\n VscodeTextfield,\n VscodeBadge,\n VscodeDivider\n} from '@vscode-elements/react-elements';\n\nimport styles from './styles.module.css';\nimport { useSystem } from '@/system/index.js';\nimport { BasePanel } from '@/components/panels/base';\nimport { SectionTitle } from '@/components/panels/common/SectionTitle';\n\n/** A labelled numeric field with a hint, an Apply button, and the current value. */\nconst NumberControl = ({\n label,\n hint,\n value,\n current,\n onChange,\n onApply,\n ...inputProps\n}: {\n label: string;\n hint: string;\n value: string;\n current: string;\n onChange: (value: string) => void;\n onApply: () => void;\n} & Record<string, unknown>) => (\n <div className={styles.field}>\n <span className={styles.label}>{label}</span>\n <span className={styles.description}>{hint}</span>\n <div className={styles.inputRow}>\n <VscodeTextfield\n className={styles.input}\n type=\"number\"\n value={value}\n onChange={(e: any) => onChange(e.target.value)}\n {...inputProps}\n />\n <VscodeButton onClick={onApply}>Apply</VscodeButton>\n </div>\n <span className={styles.current}>Current: {current}</span>\n </div>\n);\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 applyPreset = (speed: number, delay: number, tick: number) => {\n store.getState().setExecutionSpeed(speed);\n store.getState().setStepDelay(delay);\n store.getState().setTickInterval(tick);\n setSpeedInput(speed.toString());\n setDelayInput(delay.toString());\n setTickIntervalInput(tick.toString());\n };\n\n const statusLabel = isExecuting ? (isPaused ? 'Paused' : 'Running') : 'Idle';\n\n return (\n <BasePanel>\n <SectionTitle>Status</SectionTitle>\n <div className={styles.statusRow}>\n <span className={styles.label}>Status</span>\n <VscodeBadge>{statusLabel}</VscodeBadge>\n </div>\n <div className={styles.statusRow}>\n <span className={styles.label}>Active runs</span>\n <span className={styles.statusValue}>{activeRuns}</span>\n </div>\n\n <VscodeDivider className={styles.divider} />\n <SectionTitle>Execution Speed</SectionTitle>\n\n <NumberControl\n label=\"Speed Multiplier\"\n hint=\"0.1 = slow, 1.0 = normal, 10 = fast\"\n value={speedInput}\n current={`${executionSpeed}x`}\n onChange={setSpeedInput}\n onApply={handleSetSpeed}\n placeholder=\"1.0\"\n min={0.01}\n max={10}\n step={0.01}\n />\n\n <NumberControl\n label=\"Step Delay (ms)\"\n hint=\"delay between execution steps\"\n value={delayInput}\n current={`${stepDelay}ms`}\n onChange={setDelayInput}\n onApply={handleSetDelay}\n placeholder=\"0\"\n min={0}\n />\n\n <NumberControl\n label=\"Tick Interval (ms)\"\n hint=\"delay between tick events\"\n value={tickIntervalInput}\n current={`${tickInterval}ms`}\n onChange={setTickIntervalInput}\n onApply={handleSetTickInterval}\n placeholder=\"50\"\n min={0}\n />\n\n <div className={styles.field}>\n <span className={styles.label}>Quick Presets</span>\n <div className={styles.presets}>\n <VscodeButton secondary onClick={() => applyPreset(0.1, 500, 1000)}>\n Very Slow\n </VscodeButton>\n <VscodeButton secondary onClick={() => applyPreset(0.5, 100, 200)}>\n Slow\n </VscodeButton>\n <VscodeButton secondary onClick={() => applyPreset(1.0, 0, 50)}>\n Normal\n </VscodeButton>\n <VscodeButton secondary onClick={() => applyPreset(5.0, 0, 16)}>\n Fast\n </VscodeButton>\n </div>\n </div>\n\n <VscodeDivider className={styles.divider} />\n <SectionTitle>How to Use</SectionTitle>\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 step.\n Useful for visualizing graph execution flow.\n </li>\n <li>\n <strong>Tick Interval:</strong> Controls the delay between tick events\n (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 </BasePanel>\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 { buildUIGraphJSON } from '../../transformers/Uigraph.js';\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 // `resolveGraph` lets Call Subgraph nodes run other open graphs by id.\n const transport = new LocalTransport(options.registry, {\n ...options,\n store: localStore,\n sessionFactory,\n resolveGraph: (id) => {\n const target = system.activeGraph.getState().sessions[id];\n return target ? buildUIGraphJSON(target).flow : undefined;\n }\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","/**\n * Web Worker transport implementation for graph execution\n * Communicates with a Web Worker that executes graphs\n */\n\nimport type { GraphRunnerMessage } from '../graphrunner/types.js';\nimport type { ITransport, TransportState } from '../graphrunner/transport.js';\n\n/**\n * Messages sent from main thread to worker\n */\ntype MainToWorkerMessage = {\n type: 'execute';\n message: GraphRunnerMessage;\n};\n\n/**\n * Messages sent from worker to main thread\n */\ntype WorkerToMainMessage =\n | {\n type: 'message';\n data: GraphRunnerMessage;\n }\n | {\n type: 'error';\n error: string;\n };\n\n/**\n * Web Worker transport that delegates graph execution to a worker thread\n */\nexport class WorkerTransport implements ITransport {\n private state: TransportState = 'disconnected';\n private messageHandlers: Array<(message: GraphRunnerMessage) => void> = [];\n private stateChangeHandlers: Array<(state: TransportState) => void> = [];\n private errorHandlers: Array<(error: Error) => void> = [];\n private worker: Worker;\n\n constructor(worker: Worker) {\n this.worker = worker;\n }\n\n getState(): TransportState {\n console.log('Current transport state:', this.state);\n return this.state;\n }\n\n async connect(): Promise<void> {\n this.setState('connecting');\n try {\n // Set up message handler\n this.worker.onmessage = (event: MessageEvent<WorkerToMainMessage>) => {\n this.handleWorkerMessage(event.data);\n };\n\n // Set up error handler\n this.worker.onerror = (error) => {\n this.notifyError(new Error(`Worker error: ${error.message}`));\n };\n\n this.setState('connected');\n } catch (error) {\n this.setState('error');\n throw error;\n }\n }\n\n disconnect(): void {\n this.worker.terminate();\n this.setState('disconnected');\n }\n\n send(message: GraphRunnerMessage): void {\n const workerMessage: MainToWorkerMessage = {\n type: 'execute',\n message\n };\n this.worker.postMessage(workerMessage);\n }\n\n onMessage(handler: (message: GraphRunnerMessage) => 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: GraphRunnerMessage): void {\n this.messageHandlers.forEach((handler) => handler(message));\n }\n\n private handleWorkerMessage(data: WorkerToMainMessage): void {\n switch (data.type) {\n case 'message':\n this.notifyMessage(data.data);\n break;\n case 'error':\n this.notifyError(new Error(data.error));\n break;\n }\n }\n}\n","/**\n * Store for Web Worker Graph Runner state\n */\n\nimport { create, type StoreApi } from 'zustand';\n\nexport type WebWorkerGraphRunnerStore = {\n /**\n * Number of active graph runs in the worker\n */\n activeRuns: number;\n\n /**\n * Whether a graph is currently executing\n */\n isExecuting: boolean;\n\n /**\n * Whether execution is paused\n */\n isPaused: boolean;\n\n /**\n * Tick interval in milliseconds (for tick events)\n * Default: 50ms\n */\n tickInterval: number;\n\n /**\n * Step delay in milliseconds (between execution steps)\n * Default: 0ms (no delay)\n */\n stepDelay: number;\n\n /**\n * Execution speed multiplier\n * 1.0 = normal speed, 0.5 = half speed, 2.0 = double speed\n * Default: 1.0\n */\n executionSpeed: number;\n\n /**\n * Set the number of active runs\n */\n setActiveRuns: (count: number) => void;\n\n /**\n * Set execution state\n */\n setIsExecuting: (isExecuting: boolean) => void;\n\n /**\n * Set pause state\n */\n setIsPaused: (isPaused: boolean) => void;\n\n /**\n * Set tick interval\n */\n setTickInterval: (interval: number) => void;\n\n /**\n * Set step delay\n */\n setStepDelay: (delay: number) => void;\n\n /**\n * Set execution speed\n */\n setExecutionSpeed: (speed: number) => void;\n};\n\nexport const webWorkerGraphRunnerStoreFactory =\n (): StoreApi<WebWorkerGraphRunnerStore> =>\n create<WebWorkerGraphRunnerStore>((set) => ({\n activeRuns: 0,\n isExecuting: false,\n isPaused: false,\n tickInterval: 50,\n stepDelay: 0,\n executionSpeed: 1.0,\n\n setActiveRuns: (count) => set({ activeRuns: count }),\n setIsExecuting: (isExecuting) => set({ isExecuting }),\n setIsPaused: (isPaused) => set({ isPaused }),\n setTickInterval: (interval) => set({ tickInterval: interval }),\n setStepDelay: (delay) => set({ stepDelay: delay }),\n setExecutionSpeed: (speed) => set({ executionSpeed: speed })\n }));\n\ndeclare module '@/system/system' {\n interface System {\n /**\n * Web Worker Graph Runner store\n */\n webWorkerGraphRunnerStore: StoreApi<WebWorkerGraphRunnerStore>;\n }\n}\n","/**\n * Panel component for Web Worker Graph Runner\n */\n\nimport React from 'react';\nimport { useSystem } from '@/system/provider';\nimport { useStore } from 'zustand';\nimport { BasePanel } from '@/components/panels/base';\nimport { VscodeButton, VscodeTextfield } from '@vscode-elements/react-elements';\n\nimport styles from '../graphrunner-local/styles.module.css';\n\nexport function WebWorkerGraphRunnerPanel() {\n const system = useSystem();\n const store = system.webWorkerGraphRunnerStore;\n\n const activeRuns = useStore(store, (s) => s.activeRuns);\n const isExecuting = useStore(store, (s) => s.isExecuting);\n const isPaused = useStore(store, (s) => s.isPaused);\n const tickInterval = useStore(store, (s) => s.tickInterval);\n const stepDelay = useStore(store, (s) => s.stepDelay);\n const executionSpeed = useStore(store, (s) => s.executionSpeed);\n\n const [tickInputValue, setTickInputValue] = React.useState(\n String(tickInterval)\n );\n const [stepDelayValue, setStepDelayValue] = React.useState(String(stepDelay));\n const [speedValue, setSpeedValue] = React.useState(String(executionSpeed));\n\n const handleApplyTick = () => {\n const value = parseInt(tickInputValue, 10);\n if (!isNaN(value) && value > 0) {\n store.getState().setTickInterval(value);\n }\n };\n\n const handleApplyStepDelay = () => {\n const value = parseInt(stepDelayValue, 10);\n if (!isNaN(value) && value >= 0) {\n store.getState().setStepDelay(value);\n }\n };\n\n const handleApplySpeed = () => {\n const value = parseFloat(speedValue);\n if (!isNaN(value) && value > 0) {\n store.getState().setExecutionSpeed(value);\n }\n };\n\n return (\n <BasePanel>\n <div className={styles.container}>\n <div className={styles.header}>\n <h3>Web Worker Graph Runner</h3>\n <p className={styles.description}>\n Executes graphs in a separate Web Worker thread for non-blocking\n performance\n </p>\n </div>\n\n <div className={styles.section}>\n <h4>Status</h4>\n <div className={styles.statusGrid}>\n <div>\n <strong>Active Runs:</strong> {activeRuns}\n </div>\n <div>\n <strong>Executing:</strong> {isExecuting ? 'Yes' : 'No'}\n </div>\n <div>\n <strong>Paused:</strong> {isPaused ? 'Yes' : 'No'}\n </div>\n </div>\n </div>\n\n <div className={styles.section}>\n <h4>Execution Settings</h4>\n\n <div className={styles.formGroup}>\n <label>Tick Interval (ms)</label>\n <p className={styles.helpText}>\n Time between tick events. Lower = faster ticking.\n </p>\n <div className={styles.inputGroup}>\n <VscodeTextfield\n value={tickInputValue}\n onInput={(e: any) => setTickInputValue(e.target.value)}\n placeholder=\"50\"\n />\n <VscodeButton onClick={handleApplyTick}>Apply</VscodeButton>\n </div>\n <div className={styles.presetButtons}>\n <VscodeButton\n onClick={() => {\n setTickInputValue('1000');\n store.getState().setTickInterval(1000);\n }}\n >\n Very Slow (1000ms)\n </VscodeButton>\n <VscodeButton\n onClick={() => {\n setTickInputValue('200');\n store.getState().setTickInterval(200);\n }}\n >\n Slow (200ms)\n </VscodeButton>\n <VscodeButton\n onClick={() => {\n setTickInputValue('50');\n store.getState().setTickInterval(50);\n }}\n >\n Normal (50ms)\n </VscodeButton>\n <VscodeButton\n onClick={() => {\n setTickInputValue('16');\n store.getState().setTickInterval(16);\n }}\n >\n Fast (16ms)\n </VscodeButton>\n </div>\n </div>\n\n <div className={styles.formGroup}>\n <label>Step Delay (ms)</label>\n <p className={styles.helpText}>\n Delay between execution steps. Use for debugging.\n </p>\n <div className={styles.inputGroup}>\n <VscodeTextfield\n value={stepDelayValue}\n onInput={(e: any) => setStepDelayValue(e.target.value)}\n placeholder=\"0\"\n />\n <VscodeButton onClick={handleApplyStepDelay}>Apply</VscodeButton>\n </div>\n </div>\n\n <div className={styles.formGroup}>\n <label>Execution Speed</label>\n <p className={styles.helpText}>\n Speed multiplier. 1.0 = normal, 0.5 = half speed, 2.0 = double\n speed.\n </p>\n <div className={styles.inputGroup}>\n <VscodeTextfield\n value={speedValue}\n onInput={(e: any) => setSpeedValue(e.target.value)}\n placeholder=\"1.0\"\n />\n <VscodeButton onClick={handleApplySpeed}>Apply</VscodeButton>\n </div>\n </div>\n </div>\n\n <div className={styles.section}>\n <h4>About Web Worker Execution</h4>\n <p className={styles.helpText}>\n Graphs execute in a separate Web Worker thread, keeping the UI\n responsive even during intensive computations. All node execution,\n lifecycle events, and graph state management happens off the main\n thread.\n </p>\n </div>\n </div>\n </BasePanel>\n );\n}\n","/**\n * Web Worker graph runner plugin for browser-based graph execution in a worker thread\n * Uses a Web Worker to execute graphs without blocking the UI\n */\n\nimport type { System } from '../../system/system.js';\nimport { plugin } from '../../system/plugin.js';\nimport { GraphRunnerClient } from '../graphrunner/client.js';\nimport { WorkerTransport } from './worker-transport.js';\nimport { graphRunnerClientPlugin } from '../graphrunner/index.js';\nimport { webWorkerGraphRunnerStoreFactory } from './store.js';\nimport { WebWorkerGraphRunnerPanel } from './panel.js';\nimport { MenuItemElement } from '../../components/menubar/menuItem.js';\nimport { ErrorBoundary } from 'react-error-boundary';\n\nexport * from './worker-transport.js';\nexport * from './store.js';\nexport * from './panel.js';\n\n/**\n * Options for the Web Worker graph runner plugin\n */\nexport interface WebWorkerGraphRunnerPluginOptions {\n /**\n * Pre-configured Web Worker instance.\n * The worker should be set up with the necessary registry and message handlers.\n * The registry MUST be defined inside the worker file itself.\n *\n * Example:\n * ```ts\n * const worker = new Worker(new URL('./my-graph-worker.ts', import.meta.url), { type: 'module' });\n * ```\n */\n worker: Worker;\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 * Plugin initialization function for Web Worker graph execution\n * Registers a GraphRunnerClient with a worker transport that executes graphs in a Web Worker\n */\nexport async function webWorkerGraphRunnerPluginLoader(\n system: System,\n options: WebWorkerGraphRunnerPluginOptions\n): Promise<void> {\n // Create web worker graph runner store\n const webWorkerStore = webWorkerGraphRunnerStoreFactory();\n system.decorate('webWorkerGraphRunnerStore', webWorkerStore);\n\n // Create worker transport with the user-provided worker\n const transport = new WorkerTransport(options.worker);\n\n // Create client with the worker 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. With skipAutoConnect:false the\n // plugin calls runner.connect(), which wires the persistent client event\n // listeners (trace/logs/lifecycle) on this same client , so we must NOT wire\n // them again here, or every trace span would be recorded twice.\n await system.registerPlugin(graphRunnerClientPlugin, {\n client,\n skipAutoConnect: false\n });\n\n // Register the web worker graph runner panel\n system.tabLoader.register('webWorkerGraphRunner', () => {\n return {\n id: 'webWorkerGraphRunner',\n closable: true,\n title: 'Web Worker Graph Runner',\n group: 'default',\n content: () => (\n <ErrorBoundary\n fallback={<div>Error loading Web Worker Graph Runner panel</div>}\n >\n <WebWorkerGraphRunnerPanel />\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 Web Worker Graph Runner menu item to the Window menu\n const newMenuItem = {\n name: 'webWorkerGraphRunner',\n render: function WebWorkerGraphRunnerMenuItem() {\n return (\n <MenuItemElement\n onClick={() =>\n system.tabStore.getState().openTab('webWorkerGraphRunner')\n }\n key=\"webWorkerGraphRunner\"\n >\n Web Worker Graph Runner\n </MenuItemElement>\n );\n }\n };\n\n menuStore\n .getState()\n .setSubMenuItems('window', [...windowMenu.items, newMenuItem]);\n }\n }\n}\n\nexport const webWorkerGraphRunnerPlugin = plugin(\n webWorkerGraphRunnerPluginLoader,\n {\n name: 'graphrunner-webworker'\n }\n);\n","import {\n Engine,\n type GraphInstance,\n type ILifecycleEventEmitter,\n type IRegistry,\n isFunctionNode,\n readGraphFromJSON\n} from '@kiberon-labs/behave-graph';\nimport { create, type StoreApi } from 'zustand';\n\nimport type { System } from '@/system/system.js';\nimport { flowToBehave } from '@/transformers/flowToBehave.js';\nimport { realtime } from '@/annotations';\n\nexport type RealtimeRunnerStore = {\n engine?: Engine;\n /** Live output values published for UI consumers (keyed by nodeId -> outputName) */\n outputs: Record<string, Record<string, unknown>>;\n setEngine: (engine?: Engine) => void;\n setOutputs: (\n updates: Array<{ nodeId: string; outputName: string; value: unknown }>\n ) => void;\n};\n\nconst realtimeRunnerStoreFactory = () =>\n create<RealtimeRunnerStore>((set) => ({\n engine: undefined,\n outputs: {},\n setEngine: (engine) => set({ engine }),\n setOutputs: (updates) =>\n set((state) => {\n if (updates.length === 0) return state;\n\n let changed = false;\n const nextOutputs: Record<string, Record<string, unknown>> = {\n ...state.outputs\n };\n\n for (const { nodeId, outputName, value } of updates) {\n const prevNode = nextOutputs[nodeId] ?? state.outputs[nodeId];\n const prevVal = prevNode?.[outputName];\n if (Object.is(prevVal, value)) continue;\n\n const base = prevNode ?? {};\n // Copy-on-write per node\n const nextNode = base === prevNode ? { ...base } : { ...base };\n nextNode[outputName] = value;\n nextOutputs[nodeId] = nextNode;\n changed = true;\n }\n\n if (!changed) return state;\n return { outputs: nextOutputs };\n })\n }));\n\n/**\n * RealtimeRunner keeps a small preview Engine up-to-date with the current graph.\n * It is designed for UI previews (e.g. live node output thumbnails) and does not\n * replace the existing `GraphRunner`.\n */\nexport class RealtimeRunner {\n private system: System;\n private executionRegistry?: IRegistry;\n private graphInstance?: GraphInstance;\n private engine?: Engine;\n private scheduled = false;\n private tickRafHandle?: number;\n private tickTimeoutHandle?: number;\n private tickLoopActive = false;\n private tickInProgress = false;\n private lastTickAtMs = 0;\n private readonly tickIntervalMs = 50;\n private unsubscribers: Array<() => void> = [];\n private watched = new Map<string, Set<string>>();\n private lastPublished = new Map<string, Map<string, unknown>>();\n private lastGraphSignature?: string;\n private annotatedOutputNodeIds: string[] = [];\n\n public readonly store: StoreApi<RealtimeRunnerStore>;\n\n constructor(system: System, executionRegistry?: IRegistry) {\n this.system = system;\n this.executionRegistry = executionRegistry;\n this.store = realtimeRunnerStoreFactory();\n\n // Start in a low-impact mode; actual ticking only happens when something is watched.\n this.start();\n }\n\n getEngine(): Engine | undefined {\n return this.engine;\n }\n\n /**\n * Get a value from a node's output socket, if available.\n */\n getNodeOutputValue(nodeId: string, outputName: string): unknown {\n const node = this.engine?.nodes?.[nodeId];\n const socket = node?.outputs?.find((s: any) => s.name === outputName);\n return socket?.value;\n }\n\n /**\n * Register interest in a particular node output. Used to keep the preview runner efficient.\n */\n watchNodeOutput(nodeId: string, outputName: string): () => void {\n const existing = this.watched.get(nodeId);\n if (existing) {\n existing.add(outputName);\n } else {\n this.watched.set(nodeId, new Set([outputName]));\n }\n\n this.ensureTicking();\n this.scheduleEvaluate();\n\n return () => {\n const set = this.watched.get(nodeId);\n if (!set) return;\n set.delete(outputName);\n if (set.size === 0) this.watched.delete(nodeId);\n this.ensureTicking();\n };\n }\n\n start(): void {\n this.stop();\n\n // Rebuild/re-evaluate when graph inputs change.\n this.unsubscribers.push(\n this.system.nodeStore.subscribe(() => this.scheduleEvaluate())\n );\n this.unsubscribers.push(\n this.system.edgeStore.subscribe(() => this.scheduleEvaluate())\n );\n this.unsubscribers.push(\n this.system.variableStore.subscribe(() => this.scheduleEvaluate())\n );\n this.unsubscribers.push(\n this.system.specStore.subscribe(() => this.scheduleEvaluate())\n );\n this.unsubscribers.push(\n this.system.registry.subscribe(() => this.scheduleEvaluate())\n );\n\n this.scheduleEvaluate();\n }\n\n stop(): void {\n this.unsubscribers.forEach((u) => u());\n this.unsubscribers = [];\n\n this.stopTickLoop();\n\n if (this.engine) {\n this.engine.dispose();\n this.engine = undefined;\n this.graphInstance = undefined;\n this.store.getState().setEngine(undefined);\n }\n }\n\n triggerNode(nodeId: string): void {\n const node = this.engine?.nodes?.[nodeId];\n if (!node) {\n throw new Error(`node not found: ${nodeId}`);\n }\n this.engine?.trigger(node, 'flow');\n // this.engine?.executeAllSync(100,1);\n // this.startTickLoop();\n }\n\n private ensureTicking(): void {\n const hasWatchers = this.watched.size > 0;\n\n if (hasWatchers) {\n this.startTickLoop();\n return;\n }\n\n this.stopTickLoop();\n }\n\n private nowMs(): number {\n return typeof performance !== 'undefined' && performance.now\n ? performance.now()\n : Date.now();\n }\n\n private startTickLoop(): void {\n if (\n this.tickRafHandle !== undefined ||\n this.tickTimeoutHandle !== undefined\n ) {\n return;\n }\n\n this.tickLoopActive = true;\n\n this.lastTickAtMs = this.nowMs();\n this.scheduleNextTick();\n }\n\n private stopTickLoop(): void {\n this.tickLoopActive = false;\n if (this.tickRafHandle !== undefined) {\n window.cancelAnimationFrame(this.tickRafHandle);\n this.tickRafHandle = undefined;\n }\n if (this.tickTimeoutHandle !== undefined) {\n window.clearTimeout(this.tickTimeoutHandle);\n this.tickTimeoutHandle = undefined;\n }\n }\n\n private scheduleNextTick(): void {\n if (!this.tickLoopActive) return;\n //TODO REadd\n // if (this.watched.size === 0) return;\n if (\n this.tickRafHandle !== undefined ||\n this.tickTimeoutHandle !== undefined\n )\n return;\n\n const raf = window.requestAnimationFrame;\n if (typeof raf === 'function') {\n this.tickRafHandle = raf((timestampMs) => {\n this.tickRafHandle = undefined;\n\n if (!this.tickLoopActive) return;\n // if (this.watched.size === 0) return;\n\n const now =\n typeof timestampMs === 'number' ? timestampMs : this.nowMs();\n if (now - this.lastTickAtMs >= this.tickIntervalMs) {\n if (this.tickInProgress) return;\n\n this.tickInProgress = true;\n this.lastTickAtMs = now;\n void this.tick().finally(() => {\n this.tickInProgress = false;\n this.scheduleNextTick();\n });\n return;\n }\n\n this.scheduleNextTick();\n });\n return;\n }\n\n // Fallback (non-browser/test environments).\n this.tickTimeoutHandle = window.setTimeout(() => {\n this.tickTimeoutHandle = undefined;\n if (!this.tickLoopActive) return;\n // if (this.watched.size === 0) return;\n if (this.tickInProgress) return;\n\n this.tickInProgress = true;\n this.lastTickAtMs = this.nowMs();\n void this.tick().finally(() => {\n this.tickInProgress = false;\n this.scheduleNextTick();\n });\n }, this.tickIntervalMs);\n }\n\n private scheduleEvaluate(): void {\n if (this.scheduled) return;\n this.scheduled = true;\n\n // Batch rapid changes (dragging, typing) into a single eval.\n window.setTimeout(() => {\n this.scheduled = false;\n void this.evaluate();\n }, 50);\n }\n\n private stripNonSemanticMetadata(graphJson: any): any {\n // We want previews to react to semantic changes (types/ports/edges/vars),\n // not editor-only movement/selection changes.\n if (!graphJson?.nodes) return graphJson;\n const nodes = graphJson.nodes.map((n: any) => {\n if (!n || typeof n !== 'object') return n;\n if (!n.metadata) return n;\n\n const meta = { ...n.metadata };\n delete meta.positionX;\n delete meta.positionY;\n\n const hasMeta = Object.keys(meta).length > 0;\n return hasMeta ? { ...n, metadata: meta } : { ...n, metadata: undefined };\n });\n return { ...graphJson, nodes };\n }\n\n private computeGraphSignature(graphJson: any): string {\n // Stable enough for our preview use-case.\n return JSON.stringify(graphJson);\n }\n\n private mergeNodeAnnotationsIntoMetadata(\n graphJson: any,\n flowNodes: any[]\n ): any {\n // The editor stores node annotations in ReactFlow `node.data.annotations`.\n // The execution engine only sees behave-graph `node.metadata` (string map),\n // so we merge annotations into metadata here.\n if (!graphJson?.nodes) return graphJson;\n\n const byId = new Map<string, any>();\n for (const n of flowNodes) {\n if (n?.id) byId.set(n.id, n);\n }\n\n const nodes = graphJson.nodes.map((nodeJson: any) => {\n const flowNode = byId.get(nodeJson?.id);\n const annotations = flowNode?.data?.annotations;\n if (!annotations || typeof annotations !== 'object') return nodeJson;\n\n const meta: Record<string, string> = {\n ...(nodeJson.metadata as Record<string, string> | undefined)\n };\n for (const [key, value] of Object.entries(annotations)) {\n if (value === undefined) continue;\n if (typeof value === 'string') {\n meta[key] = value;\n continue;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n meta[key] = String(value);\n continue;\n }\n try {\n meta[key] = JSON.stringify(value);\n } catch {\n meta[key] = String(value);\n }\n }\n\n return { ...nodeJson, metadata: meta };\n });\n\n return { ...graphJson, nodes };\n }\n\n private isRealtimeOutputNode(node: any): boolean {\n const meta = node?.metadata;\n if (!meta || typeof meta !== 'object') return false;\n\n const rawFlag = meta[realtime];\n\n return !(rawFlag === undefined || rawFlag === null);\n }\n\n private rebuildAnnotatedOutputNodeCache(): void {\n if (!this.engine?.nodes) {\n this.annotatedOutputNodeIds = [];\n return;\n }\n\n const ids: string[] = [];\n for (const node of Object.values(this.engine.nodes)) {\n if (this.isRealtimeOutputNode(node)) {\n ids.push(node.id);\n }\n }\n this.annotatedOutputNodeIds = ids;\n }\n\n private async resolveSocketValueForPreview(\n inputSocket: any\n ): Promise<number> {\n if (!this.engine) return 0;\n if (!inputSocket?.links || inputSocket.links.length === 0) return 0;\n\n const nodes = this.engine.nodes;\n\n // Safe because links.length > 0\n const upstreamLink = inputSocket.links[0]!;\n\n if (\n upstreamLink._targetNode === undefined ||\n upstreamLink._targetSocket === undefined\n ) {\n upstreamLink._targetNode = nodes[upstreamLink.nodeId]!;\n upstreamLink._targetSocket = upstreamLink._targetNode.outputs.find(\n (socket: any) => socket.name === upstreamLink.socketName\n );\n if (upstreamLink._targetSocket === undefined) {\n throw new Error(\n `can not find socket with the name ${upstreamLink.socketName}`\n );\n }\n }\n\n const upstreamNode = upstreamLink._targetNode;\n const upstreamOutputSocket = upstreamLink._targetSocket;\n\n // If upstream is a flow/event/async node, use its existing output value.\n if (!isFunctionNode(upstreamNode)) {\n inputSocket.value = upstreamOutputSocket.value;\n return 0;\n }\n\n let executionSteps = 0;\n for (const upstreamInputSocket of upstreamNode.inputs) {\n executionSteps +=\n await this.resolveSocketValueForPreview(upstreamInputSocket);\n }\n\n this.engine.onNodeExecutionStart.emit(upstreamNode);\n await upstreamNode.exec(upstreamNode);\n executionSteps++;\n this.engine.onNodeExecutionEnd.emit(upstreamNode);\n\n inputSocket.value = upstreamOutputSocket.value;\n return executionSteps;\n }\n\n private async recalculateAnnotatedOutputNodes(): Promise<void> {\n if (!this.engine) return;\n if (this.annotatedOutputNodeIds.length === 0) return;\n\n for (const nodeId of this.annotatedOutputNodeIds) {\n await this.evaluateNodeForPreview(nodeId);\n }\n }\n\n /**\n * Evaluate every node that a UI consumer is actively watching.\n *\n * Pure function graphs (e.g. the image nodes) never run during\n * `executeAllSync()` because nothing pushes a flow fiber through them. They\n * are normally pulled lazily when a downstream flow/event node reads their\n * value. In the editor preview there is no such consumer, so the act of a\n * component calling `watchNodeOutput()` is what drives evaluation: we resolve\n * the node's upstream function graph and execute the node itself so its\n * sockets hold a fresh value for `publishWatchedOutputs()` to read.\n *\n * This intentionally does not depend on the `ui.realtime` annotation , any\n * watched output is evaluated.\n */\n private async recalculateWatchedOutputs(): Promise<void> {\n if (!this.engine) return;\n if (this.watched.size === 0) return;\n\n for (const nodeId of this.watched.keys()) {\n await this.evaluateNodeForPreview(nodeId);\n }\n }\n\n /**\n * Resolve a single function node's inputs (recursively executing its upstream\n * function graph) and execute it. Non-function nodes keep whatever value their\n * last real execution produced. Resilient: a failure on one node is logged and\n * does not abort evaluation of the others.\n */\n private async evaluateNodeForPreview(nodeId: string): Promise<void> {\n if (!this.engine) return;\n const node = this.engine.nodes?.[nodeId];\n if (!node) return;\n if (!isFunctionNode(node)) return;\n\n try {\n let executionSteps = 0;\n for (const inputSocket of node.inputs) {\n executionSteps += await this.resolveSocketValueForPreview(inputSocket);\n }\n\n this.engine.onNodeExecutionStart.emit(node);\n await node.exec(node);\n executionSteps++;\n this.engine.onNodeExecutionEnd.emit(node);\n\n this.engine.executionSteps += executionSteps;\n } catch (err) {\n console.error(\n `RealtimeRunner: failed to evaluate watched node ${nodeId}:`,\n err\n );\n }\n }\n\n private rebuildEngine(): void {\n const specJson = this.system.specStore.getState().specs;\n if (!specJson || specJson.length === 0) return;\n\n const nodes = this.system.nodeStore.getState().nodes;\n const edges = this.system.edgeStore.getState().edges;\n\n const rawGraphJson = flowToBehave(\n this.system.session!,\n nodes,\n edges,\n specJson\n );\n const graphWithAnnotations = this.mergeNodeAnnotationsIntoMetadata(\n rawGraphJson,\n nodes\n );\n const graphJson = this.stripNonSemanticMetadata(graphWithAnnotations);\n\n const signature = this.computeGraphSignature(graphJson);\n if (this.lastGraphSignature === signature && this.engine) {\n return;\n }\n this.lastGraphSignature = signature;\n\n if (!this.executionRegistry) {\n return;\n }\n\n this.graphInstance = readGraphFromJSON({\n graphJson,\n registry: this.executionRegistry\n });\n\n if (this.engine) {\n this.engine.dispose();\n }\n\n this.engine = new Engine(this.graphInstance, this.executionRegistry);\n\n this.engine.onNodeExecutionError.addListener(({ error }) => {\n console.error(error);\n });\n\n this.store.getState().setEngine(this.engine);\n\n this.rebuildAnnotatedOutputNodeCache();\n }\n\n private publishWatchedOutputs(): void {\n if (!this.engine) return;\n if (this.watched.size === 0) return;\n\n const updates: Array<{\n nodeId: string;\n outputName: string;\n value: unknown;\n }> = [];\n\n for (const [nodeId, outputs] of this.watched.entries()) {\n const node = this.engine.nodes?.[nodeId];\n if (!node) continue;\n\n let lastForNode = this.lastPublished.get(nodeId);\n if (!lastForNode) {\n lastForNode = new Map<string, unknown>();\n this.lastPublished.set(nodeId, lastForNode);\n }\n\n for (const outputName of outputs.values()) {\n const outputSocket = node.outputs?.find(\n (s: any) => s.name === outputName\n );\n const inputSocket = outputSocket\n ? undefined\n : node.inputs?.find((s: any) => s.name === outputName);\n\n const value = (outputSocket ?? inputSocket)?.value;\n const prev = lastForNode.get(outputName);\n if (Object.is(prev, value)) continue;\n\n lastForNode.set(outputName, value);\n updates.push({ nodeId, outputName, value });\n }\n }\n\n if (updates.length > 0) {\n this.store.getState().setOutputs(updates);\n }\n }\n\n private async evaluate(): Promise<void> {\n try {\n this.rebuildEngine();\n if (!this.engine) return;\n\n // Compute function/flow nodes immediately.\n await this.engine.executeAllSync();\n\n // Recalculate annotated output nodes to force evaluation of upstream function graphs.\n await this.recalculateAnnotatedOutputNodes();\n\n // Pull every watched output (e.g. live image node previews) so pure\n // function graphs are evaluated even without a flow consumer.\n await this.recalculateWatchedOutputs();\n\n this.publishWatchedOutputs();\n } catch (err) {\n // Keep preview runner resilient; don't crash the editor.\n console.error('RealtimeRunner evaluate failed:', err);\n }\n }\n\n private async tick(): Promise<void> {\n if (!this.engine) return;\n if (this.watched.size === 0) return;\n\n try {\n const eventEmitter = this.executionRegistry?.dependencies\n ?.ILifecycleEventEmitter as ILifecycleEventEmitter | undefined;\n\n // Tick time-based graphs.\n eventEmitter?.tickEvent?.emit();\n\n await this.engine.executeAllSync();\n // Recalculate annotated output nodes to force evaluation of upstream function graphs.\n await this.recalculateAnnotatedOutputNodes();\n\n // Pull every watched output (e.g. live image node previews) so pure\n // function graphs are evaluated even without a flow consumer.\n await this.recalculateWatchedOutputs();\n\n this.publishWatchedOutputs();\n } catch {\n // ignore\n }\n }\n}\n"],"mappings":"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"}
|