@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,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local graph runner plugin for in-browser graph execution
|
|
3
|
+
* Uses the local Engine instead of a remote server
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { System } from '../../system/system.js';
|
|
7
|
+
import { plugin } from '../../system/plugin.js';
|
|
8
|
+
import type { IRegistry } from '@kiberon-labs/behave-graph';
|
|
9
|
+
import { buildUIGraphJSON } from '../../transformers/Uigraph.js';
|
|
10
|
+
import { GraphRunnerClient } from '../graphrunner/client.js';
|
|
11
|
+
import { LocalTransport } from './transport.js';
|
|
12
|
+
import {
|
|
13
|
+
graphRunnerClientPlugin,
|
|
14
|
+
type ServerEvent,
|
|
15
|
+
type ServerVariable,
|
|
16
|
+
type SessionFactory
|
|
17
|
+
} from '../graphrunner/index.js';
|
|
18
|
+
import { DefaultSessionFactory } from '../graphrunner/session.js';
|
|
19
|
+
import { localGraphRunnerStoreFactory } from './store.js';
|
|
20
|
+
import { LocalGraphRunnerPanel } from './panel.js';
|
|
21
|
+
import { MenuItemElement } from '../../components/menubar/menuItem.js';
|
|
22
|
+
import { ErrorBoundary } from 'react-error-boundary';
|
|
23
|
+
|
|
24
|
+
export * from './transport.js';
|
|
25
|
+
export * from './store.js';
|
|
26
|
+
export * from './panel.js';
|
|
27
|
+
export * from './types.js';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Options for the local graph runner plugin
|
|
31
|
+
*/
|
|
32
|
+
export interface LocalGraphRunnerPluginOptions {
|
|
33
|
+
/**
|
|
34
|
+
* Node registry with registered nodes, values, and dependencies.
|
|
35
|
+
* Required for graph execution.
|
|
36
|
+
*/
|
|
37
|
+
registry: IRegistry;
|
|
38
|
+
variables?: ServerVariable[];
|
|
39
|
+
events?: ServerEvent[];
|
|
40
|
+
sessionFactory?: SessionFactory;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Custom tick strategy hook for controlling timing between tick events.
|
|
44
|
+
* If not provided, defaults to requestAnimationFrame for smooth browser refresh sync.
|
|
45
|
+
*/
|
|
46
|
+
tickStrategy?: () => Promise<void>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Whether to skip automatic connection.
|
|
50
|
+
* Default: false (will attempt to connect immediately)
|
|
51
|
+
*/
|
|
52
|
+
skipAutoConnect?: boolean;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Whether to add the menu item to the Window menu.
|
|
56
|
+
* Default: true
|
|
57
|
+
*/
|
|
58
|
+
addMenuItem?: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Default RAF-based tick strategy for smooth browser animation frame sync
|
|
63
|
+
*/
|
|
64
|
+
const defaultRafTickStrategy = (): Promise<void> => {
|
|
65
|
+
return new Promise((resolve) => {
|
|
66
|
+
requestAnimationFrame(() => resolve());
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Plugin initialization function for local graph execution
|
|
72
|
+
* Registers a GraphRunnerClient with a local transport that executes graphs in-browser
|
|
73
|
+
*/
|
|
74
|
+
export async function localGraphRunnerPluginLoader(
|
|
75
|
+
system: System,
|
|
76
|
+
options: LocalGraphRunnerPluginOptions
|
|
77
|
+
): Promise<void> {
|
|
78
|
+
// Create local graph runner store
|
|
79
|
+
const localStore = localGraphRunnerStoreFactory();
|
|
80
|
+
system.decorate('localGraphRunnerStore', localStore);
|
|
81
|
+
|
|
82
|
+
// Create or use provided session factory with tick strategy
|
|
83
|
+
const tickStrategy = options.tickStrategy ?? defaultRafTickStrategy;
|
|
84
|
+
const sessionFactory =
|
|
85
|
+
options.sessionFactory ??
|
|
86
|
+
new DefaultSessionFactory({
|
|
87
|
+
tickStrategy
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Create local transport with access to the node registry and store.
|
|
91
|
+
// `resolveGraph` lets Call Subgraph nodes run other open graphs by id.
|
|
92
|
+
const transport = new LocalTransport(options.registry, {
|
|
93
|
+
...options,
|
|
94
|
+
store: localStore,
|
|
95
|
+
sessionFactory,
|
|
96
|
+
resolveGraph: (id) => {
|
|
97
|
+
const target = system.activeGraph.getState().sessions[id];
|
|
98
|
+
return target ? buildUIGraphJSON(target).flow : undefined;
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
// Create client with the local transport and message activity tracking
|
|
103
|
+
const client = new GraphRunnerClient({
|
|
104
|
+
transport,
|
|
105
|
+
protocolVersion: '1.0.0',
|
|
106
|
+
auth: { type: 'none' },
|
|
107
|
+
onMessageActivity: (direction, message) => {
|
|
108
|
+
// Access the store from the system after it's registered
|
|
109
|
+
const graphRunnerStore = system.runner.store;
|
|
110
|
+
if (graphRunnerStore) {
|
|
111
|
+
graphRunnerStore.getState().addMessageActivity(direction, message);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
// Register the graph runner client plugin
|
|
117
|
+
// This will create the graphRunnerClientStore and decorate it on the system
|
|
118
|
+
system.registerPlugin(graphRunnerClientPlugin, {
|
|
119
|
+
client
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Register the local graph runner panel
|
|
123
|
+
system.tabLoader.register('localGraphRunner', () => {
|
|
124
|
+
return {
|
|
125
|
+
id: 'localGraphRunner',
|
|
126
|
+
closable: true,
|
|
127
|
+
title: 'Local Graph Runner',
|
|
128
|
+
group: 'default',
|
|
129
|
+
content: () => (
|
|
130
|
+
<ErrorBoundary
|
|
131
|
+
fallback={<div>Error loading Local Graph Runner panel</div>}
|
|
132
|
+
>
|
|
133
|
+
<LocalGraphRunnerPanel />
|
|
134
|
+
</ErrorBoundary>
|
|
135
|
+
)
|
|
136
|
+
};
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Add menu item to Window menu (unless disabled)
|
|
140
|
+
if (options.addMenuItem !== false) {
|
|
141
|
+
const menuStore = system.menubarStore;
|
|
142
|
+
const currentItems = menuStore.getState().items;
|
|
143
|
+
const windowMenu = currentItems.find((menu) => menu.name === 'window');
|
|
144
|
+
|
|
145
|
+
if (windowMenu) {
|
|
146
|
+
// Add the Local Graph Runner menu item to the Window menu
|
|
147
|
+
const newMenuItem = {
|
|
148
|
+
name: 'localGraphRunner',
|
|
149
|
+
render: function LocalGraphRunnerMenuItem() {
|
|
150
|
+
return (
|
|
151
|
+
<MenuItemElement
|
|
152
|
+
onClick={() =>
|
|
153
|
+
system.tabStore.getState().openTab('localGraphRunner')
|
|
154
|
+
}
|
|
155
|
+
key="localGraphRunner"
|
|
156
|
+
>
|
|
157
|
+
Local Graph Runner
|
|
158
|
+
</MenuItemElement>
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
menuStore
|
|
164
|
+
.getState()
|
|
165
|
+
.setSubMenuItems('window', [...windowMenu.items, newMenuItem]);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export const localGraphRunnerPlugin = plugin(localGraphRunnerPluginLoader, {
|
|
171
|
+
name: 'graphrunner-local'
|
|
172
|
+
});
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { useStore } from 'zustand';
|
|
3
|
+
import {
|
|
4
|
+
VscodeButton,
|
|
5
|
+
VscodeTextfield,
|
|
6
|
+
VscodeBadge,
|
|
7
|
+
VscodeDivider
|
|
8
|
+
} from '@vscode-elements/react-elements';
|
|
9
|
+
|
|
10
|
+
import styles from './styles.module.css';
|
|
11
|
+
import { useSystem } from '@/system/index.js';
|
|
12
|
+
import { BasePanel } from '@/components/panels/base';
|
|
13
|
+
import { SectionTitle } from '@/components/panels/common/SectionTitle';
|
|
14
|
+
|
|
15
|
+
/** A labelled numeric field with a hint, an Apply button, and the current value. */
|
|
16
|
+
const NumberControl = ({
|
|
17
|
+
label,
|
|
18
|
+
hint,
|
|
19
|
+
value,
|
|
20
|
+
current,
|
|
21
|
+
onChange,
|
|
22
|
+
onApply,
|
|
23
|
+
...inputProps
|
|
24
|
+
}: {
|
|
25
|
+
label: string;
|
|
26
|
+
hint: string;
|
|
27
|
+
value: string;
|
|
28
|
+
current: string;
|
|
29
|
+
onChange: (value: string) => void;
|
|
30
|
+
onApply: () => void;
|
|
31
|
+
} & Record<string, unknown>) => (
|
|
32
|
+
<div className={styles.field}>
|
|
33
|
+
<span className={styles.label}>{label}</span>
|
|
34
|
+
<span className={styles.description}>{hint}</span>
|
|
35
|
+
<div className={styles.inputRow}>
|
|
36
|
+
<VscodeTextfield
|
|
37
|
+
className={styles.input}
|
|
38
|
+
type="number"
|
|
39
|
+
value={value}
|
|
40
|
+
onChange={(e: any) => onChange(e.target.value)}
|
|
41
|
+
{...inputProps}
|
|
42
|
+
/>
|
|
43
|
+
<VscodeButton onClick={onApply}>Apply</VscodeButton>
|
|
44
|
+
</div>
|
|
45
|
+
<span className={styles.current}>Current: {current}</span>
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
export const LocalGraphRunnerPanel = () => {
|
|
50
|
+
const system = useSystem();
|
|
51
|
+
const store = system.localGraphRunnerStore;
|
|
52
|
+
const executionSpeed = useStore(store, (state) => state.executionSpeed);
|
|
53
|
+
const stepDelay = useStore(store, (state) => state.stepDelay);
|
|
54
|
+
const tickInterval = useStore(store, (state) => state.tickInterval);
|
|
55
|
+
const isExecuting = useStore(store, (state) => state.isExecuting);
|
|
56
|
+
const isPaused = useStore(store, (state) => state.isPaused);
|
|
57
|
+
const activeRuns = useStore(store, (state) => state.activeRuns);
|
|
58
|
+
|
|
59
|
+
const [speedInput, setSpeedInput] = useState(executionSpeed.toString());
|
|
60
|
+
const [delayInput, setDelayInput] = useState(stepDelay.toString());
|
|
61
|
+
const [tickIntervalInput, setTickIntervalInput] = useState(
|
|
62
|
+
tickInterval.toString()
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
const handleSetSpeed = () => {
|
|
66
|
+
const speed = parseFloat(speedInput);
|
|
67
|
+
if (!isNaN(speed) && speed > 0) {
|
|
68
|
+
store.getState().setExecutionSpeed(speed);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const handleSetDelay = () => {
|
|
73
|
+
const delay = parseInt(delayInput, 10);
|
|
74
|
+
if (!isNaN(delay) && delay >= 0) {
|
|
75
|
+
store.getState().setStepDelay(delay);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const handleSetTickInterval = () => {
|
|
80
|
+
const interval = parseInt(tickIntervalInput, 10);
|
|
81
|
+
if (!isNaN(interval) && interval >= 0) {
|
|
82
|
+
store.getState().setTickInterval(interval);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const applyPreset = (speed: number, delay: number, tick: number) => {
|
|
87
|
+
store.getState().setExecutionSpeed(speed);
|
|
88
|
+
store.getState().setStepDelay(delay);
|
|
89
|
+
store.getState().setTickInterval(tick);
|
|
90
|
+
setSpeedInput(speed.toString());
|
|
91
|
+
setDelayInput(delay.toString());
|
|
92
|
+
setTickIntervalInput(tick.toString());
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const statusLabel = isExecuting ? (isPaused ? 'Paused' : 'Running') : 'Idle';
|
|
96
|
+
|
|
97
|
+
return (
|
|
98
|
+
<BasePanel>
|
|
99
|
+
<SectionTitle>Status</SectionTitle>
|
|
100
|
+
<div className={styles.statusRow}>
|
|
101
|
+
<span className={styles.label}>Status</span>
|
|
102
|
+
<VscodeBadge>{statusLabel}</VscodeBadge>
|
|
103
|
+
</div>
|
|
104
|
+
<div className={styles.statusRow}>
|
|
105
|
+
<span className={styles.label}>Active runs</span>
|
|
106
|
+
<span className={styles.statusValue}>{activeRuns}</span>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<VscodeDivider className={styles.divider} />
|
|
110
|
+
<SectionTitle>Execution Speed</SectionTitle>
|
|
111
|
+
|
|
112
|
+
<NumberControl
|
|
113
|
+
label="Speed Multiplier"
|
|
114
|
+
hint="0.1 = slow, 1.0 = normal, 10 = fast"
|
|
115
|
+
value={speedInput}
|
|
116
|
+
current={`${executionSpeed}x`}
|
|
117
|
+
onChange={setSpeedInput}
|
|
118
|
+
onApply={handleSetSpeed}
|
|
119
|
+
placeholder="1.0"
|
|
120
|
+
min={0.01}
|
|
121
|
+
max={10}
|
|
122
|
+
step={0.01}
|
|
123
|
+
/>
|
|
124
|
+
|
|
125
|
+
<NumberControl
|
|
126
|
+
label="Step Delay (ms)"
|
|
127
|
+
hint="delay between execution steps"
|
|
128
|
+
value={delayInput}
|
|
129
|
+
current={`${stepDelay}ms`}
|
|
130
|
+
onChange={setDelayInput}
|
|
131
|
+
onApply={handleSetDelay}
|
|
132
|
+
placeholder="0"
|
|
133
|
+
min={0}
|
|
134
|
+
/>
|
|
135
|
+
|
|
136
|
+
<NumberControl
|
|
137
|
+
label="Tick Interval (ms)"
|
|
138
|
+
hint="delay between tick events"
|
|
139
|
+
value={tickIntervalInput}
|
|
140
|
+
current={`${tickInterval}ms`}
|
|
141
|
+
onChange={setTickIntervalInput}
|
|
142
|
+
onApply={handleSetTickInterval}
|
|
143
|
+
placeholder="50"
|
|
144
|
+
min={0}
|
|
145
|
+
/>
|
|
146
|
+
|
|
147
|
+
<div className={styles.field}>
|
|
148
|
+
<span className={styles.label}>Quick Presets</span>
|
|
149
|
+
<div className={styles.presets}>
|
|
150
|
+
<VscodeButton secondary onClick={() => applyPreset(0.1, 500, 1000)}>
|
|
151
|
+
Very Slow
|
|
152
|
+
</VscodeButton>
|
|
153
|
+
<VscodeButton secondary onClick={() => applyPreset(0.5, 100, 200)}>
|
|
154
|
+
Slow
|
|
155
|
+
</VscodeButton>
|
|
156
|
+
<VscodeButton secondary onClick={() => applyPreset(1.0, 0, 50)}>
|
|
157
|
+
Normal
|
|
158
|
+
</VscodeButton>
|
|
159
|
+
<VscodeButton secondary onClick={() => applyPreset(5.0, 0, 16)}>
|
|
160
|
+
Fast
|
|
161
|
+
</VscodeButton>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
|
|
165
|
+
<VscodeDivider className={styles.divider} />
|
|
166
|
+
<SectionTitle>How to Use</SectionTitle>
|
|
167
|
+
<ul className={styles.helpList}>
|
|
168
|
+
<li>
|
|
169
|
+
<strong>Speed Multiplier:</strong> Controls how fast the engine
|
|
170
|
+
executes. Lower values = slower execution, good for debugging.
|
|
171
|
+
</li>
|
|
172
|
+
<li>
|
|
173
|
+
<strong>Step Delay:</strong> Adds a delay between each execution step.
|
|
174
|
+
Useful for visualizing graph execution flow.
|
|
175
|
+
</li>
|
|
176
|
+
<li>
|
|
177
|
+
<strong>Tick Interval:</strong> Controls the delay between tick events
|
|
178
|
+
(default 50ms). Lower values = faster ticks.
|
|
179
|
+
</li>
|
|
180
|
+
<li>
|
|
181
|
+
<strong>Pause/Step:</strong> Use the toolbar buttons to pause
|
|
182
|
+
execution and step through one node at a time.
|
|
183
|
+
</li>
|
|
184
|
+
</ul>
|
|
185
|
+
</BasePanel>
|
|
186
|
+
);
|
|
187
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createStore } from 'zustand';
|
|
2
|
+
|
|
3
|
+
export interface LocalGraphRunnerStore {
|
|
4
|
+
// Execution settings
|
|
5
|
+
executionSpeed: number; // Multiplier for execution speed (1.0 = normal)
|
|
6
|
+
stepDelay: number; // Delay in milliseconds between steps
|
|
7
|
+
tickInterval: number; // Delay in milliseconds between tick events
|
|
8
|
+
|
|
9
|
+
// Runtime state
|
|
10
|
+
isExecuting: boolean;
|
|
11
|
+
isPaused: boolean;
|
|
12
|
+
activeRuns: number;
|
|
13
|
+
|
|
14
|
+
// Actions
|
|
15
|
+
setExecutionSpeed: (speed: number) => void;
|
|
16
|
+
setStepDelay: (delay: number) => void;
|
|
17
|
+
setTickInterval: (interval: number) => void;
|
|
18
|
+
setIsExecuting: (isExecuting: boolean) => void;
|
|
19
|
+
setIsPaused: (isPaused: boolean) => void;
|
|
20
|
+
setActiveRuns: (count: number) => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const localGraphRunnerStoreFactory = () => {
|
|
24
|
+
return createStore<LocalGraphRunnerStore>((set) => ({
|
|
25
|
+
// Initial state
|
|
26
|
+
executionSpeed: 1.0,
|
|
27
|
+
stepDelay: 0,
|
|
28
|
+
tickInterval: 50,
|
|
29
|
+
isExecuting: false,
|
|
30
|
+
isPaused: false,
|
|
31
|
+
activeRuns: 0,
|
|
32
|
+
|
|
33
|
+
// Actions
|
|
34
|
+
setExecutionSpeed: (executionSpeed) => set({ executionSpeed }),
|
|
35
|
+
setStepDelay: (stepDelay) => set({ stepDelay }),
|
|
36
|
+
setTickInterval: (tickInterval) => set({ tickInterval }),
|
|
37
|
+
setIsExecuting: (isExecuting) => set({ isExecuting }),
|
|
38
|
+
setIsPaused: (isPaused) => set({ isPaused }),
|
|
39
|
+
setActiveRuns: (activeRuns) => set({ activeRuns })
|
|
40
|
+
}));
|
|
41
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/* Local Graph Runner panel — follows the shared panel conventions: BasePanel
|
|
2
|
+
chrome, SectionTitle headers, VscodeDivider separators, and the design
|
|
3
|
+
system's spacing/type scale (no card backgrounds or bespoke pixel values). */
|
|
4
|
+
|
|
5
|
+
.divider {
|
|
6
|
+
margin: 0.4rem 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/* Status rows */
|
|
10
|
+
.statusRow {
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
gap: var(--space-2, 0.5rem);
|
|
14
|
+
padding: 0.1rem 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.statusValue {
|
|
18
|
+
font-size: var(--fs-label, 0.8rem);
|
|
19
|
+
font-variant-numeric: tabular-nums;
|
|
20
|
+
color: var(--ds-fg);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Labelled control rows (mirrors the Settings panel) */
|
|
24
|
+
.field {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
gap: 0.15rem;
|
|
28
|
+
padding: var(--space-1, 0.25rem) 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.label {
|
|
32
|
+
font-size: var(--fs-label, 0.8rem);
|
|
33
|
+
color: var(--ds-fg);
|
|
34
|
+
line-height: 1.3;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.description {
|
|
38
|
+
font-size: var(--fs-desc, 0.72rem);
|
|
39
|
+
color: var(--ds-fg-muted);
|
|
40
|
+
line-height: 1.35;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.inputRow {
|
|
44
|
+
display: flex;
|
|
45
|
+
gap: var(--space-2, 0.5rem);
|
|
46
|
+
align-items: center;
|
|
47
|
+
margin-top: 0.15rem;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.input {
|
|
51
|
+
flex: 1;
|
|
52
|
+
min-width: 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.current {
|
|
56
|
+
font-size: var(--fs-desc, 0.72rem);
|
|
57
|
+
color: var(--ds-fg-muted);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.presets {
|
|
61
|
+
display: flex;
|
|
62
|
+
gap: var(--space-2, 0.5rem);
|
|
63
|
+
flex-wrap: wrap;
|
|
64
|
+
margin-top: 0.15rem;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* How-to-use list */
|
|
68
|
+
.helpList {
|
|
69
|
+
display: flex;
|
|
70
|
+
flex-direction: column;
|
|
71
|
+
gap: var(--space-2, 0.5rem);
|
|
72
|
+
margin: 0.25rem 0 0;
|
|
73
|
+
padding-left: 1.1rem;
|
|
74
|
+
font-size: var(--fs-desc, 0.72rem);
|
|
75
|
+
line-height: 1.5;
|
|
76
|
+
color: var(--ds-fg-muted);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.helpList strong {
|
|
80
|
+
color: var(--ds-fg);
|
|
81
|
+
font-weight: 600;
|
|
82
|
+
}
|