@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,10 @@
|
|
|
1
|
+
import type { localGraphRunnerStoreFactory } from './store';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Extend the System interface to include the local graph runner store
|
|
5
|
+
*/
|
|
6
|
+
declare module '@/system/system' {
|
|
7
|
+
interface System {
|
|
8
|
+
localGraphRunnerStore: ReturnType<typeof localGraphRunnerStoreFactory>;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
import { Engine, type IRegistry } from '@kiberon-labs/behave-graph';
|
|
2
|
+
import type {
|
|
3
|
+
GraphRunnerMessage,
|
|
4
|
+
ServerGraphRunnerMessage,
|
|
5
|
+
ServerVariable,
|
|
6
|
+
ServerEvent
|
|
7
|
+
} from '../graphrunner/types.js';
|
|
8
|
+
import type { SessionFactory, Session } from '../graphrunner/session.js';
|
|
9
|
+
import {
|
|
10
|
+
type ActiveRun,
|
|
11
|
+
type MessageContext,
|
|
12
|
+
generateId,
|
|
13
|
+
handleHello,
|
|
14
|
+
handleCreateSession,
|
|
15
|
+
handleGetCapabilities,
|
|
16
|
+
createForwardingLogger,
|
|
17
|
+
prepareRegistryWithDependencies,
|
|
18
|
+
parseAndValidateGraph,
|
|
19
|
+
setupTracing,
|
|
20
|
+
setupVariableChangeTracking,
|
|
21
|
+
executeGraphLifecycle,
|
|
22
|
+
handleGetServerVariables,
|
|
23
|
+
handleGetServerEvents,
|
|
24
|
+
handleGetSocketConstraints,
|
|
25
|
+
handleGetNodeTypes
|
|
26
|
+
} from '../graphrunner-local/execution-utils.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Session context provided to lifecycle hooks
|
|
30
|
+
*/
|
|
31
|
+
export interface SessionContext {
|
|
32
|
+
sessionId: string;
|
|
33
|
+
metadata?: Record<string, unknown>;
|
|
34
|
+
createdAt: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Run context provided to lifecycle hooks
|
|
39
|
+
*/
|
|
40
|
+
export interface RunContext {
|
|
41
|
+
runId: string;
|
|
42
|
+
graphId: string;
|
|
43
|
+
sessionId: string;
|
|
44
|
+
inputs?: unknown;
|
|
45
|
+
options?: { trace?: boolean };
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Lifecycle hooks for customizing graph worker behavior
|
|
50
|
+
*/
|
|
51
|
+
export interface GraphWorkerHooks {
|
|
52
|
+
/**
|
|
53
|
+
* Called when a new session is created
|
|
54
|
+
* Can return metadata to associate with the session
|
|
55
|
+
*/
|
|
56
|
+
onSessionCreated?: (
|
|
57
|
+
sessionId: string,
|
|
58
|
+
metadata?: Record<string, unknown>
|
|
59
|
+
) =>
|
|
60
|
+
| void
|
|
61
|
+
| Promise<void>
|
|
62
|
+
| Record<string, unknown>
|
|
63
|
+
| Promise<Record<string, unknown>>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Called when a session is closed
|
|
67
|
+
*/
|
|
68
|
+
onSessionClosed?: (context: SessionContext) => void | Promise<void>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Called before a graph run starts
|
|
72
|
+
* Can return false to prevent the run
|
|
73
|
+
*/
|
|
74
|
+
onRunStart?: (
|
|
75
|
+
context: RunContext
|
|
76
|
+
) => boolean | Promise<boolean> | void | Promise<void>;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Called when a graph run completes successfully
|
|
80
|
+
*/
|
|
81
|
+
onRunComplete?: (context: RunContext, run: ActiveRun) => void | Promise<void>;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Called when a graph run encounters an error
|
|
85
|
+
*/
|
|
86
|
+
onRunError?: (context: RunContext, error: Error) => void | Promise<void>;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Called when a graph run is stopped
|
|
90
|
+
*/
|
|
91
|
+
onRunStopped?: (context: RunContext, reason: string) => void | Promise<void>;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Called on any incoming message, before processing
|
|
95
|
+
* Can return false to prevent default handling
|
|
96
|
+
*/
|
|
97
|
+
onMessage?: (message: GraphRunnerMessage) => boolean | void;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Options for initializing the graph worker
|
|
102
|
+
*/
|
|
103
|
+
export interface GraphWorkerOptions {
|
|
104
|
+
/**
|
|
105
|
+
* The registry containing node definitions
|
|
106
|
+
*/
|
|
107
|
+
registry: IRegistry;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Server variables to expose to graphs
|
|
111
|
+
*/
|
|
112
|
+
variables?: ServerVariable[];
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Server events to expose to graphs
|
|
116
|
+
*/
|
|
117
|
+
serverEvents?: ServerEvent[];
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Lifecycle hooks for customizing behavior
|
|
121
|
+
*/
|
|
122
|
+
hooks?: GraphWorkerHooks;
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Custom message handlers for extending the protocol
|
|
126
|
+
*/
|
|
127
|
+
customMessageHandlers?: Record<
|
|
128
|
+
string,
|
|
129
|
+
(message: unknown, ctx: MessageContext) => void
|
|
130
|
+
>;
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Factory function for creating custom session objects
|
|
134
|
+
* Uses the existing SessionFactory interface from session.ts
|
|
135
|
+
*/
|
|
136
|
+
sessionFactory?: SessionFactory;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Initialize the graph worker
|
|
141
|
+
* @param options - Configuration options including registry and customizations
|
|
142
|
+
*/
|
|
143
|
+
export function initializeGraphWorker(options: GraphWorkerOptions): void {
|
|
144
|
+
const registry = options.registry;
|
|
145
|
+
const variables = options.variables ?? [];
|
|
146
|
+
const events = options.serverEvents ?? [];
|
|
147
|
+
const hooks = options.hooks ?? {};
|
|
148
|
+
const customHandlers = options.customMessageHandlers ?? {};
|
|
149
|
+
const sessionFactory = options.sessionFactory;
|
|
150
|
+
|
|
151
|
+
// Worker state
|
|
152
|
+
const activeRuns = new Map<string, ActiveRun>();
|
|
153
|
+
let sessionId: string | null = null;
|
|
154
|
+
let session: Session | null = null;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Send a message to the main thread
|
|
158
|
+
*/
|
|
159
|
+
function sendMessage(message: ServerGraphRunnerMessage): void {
|
|
160
|
+
self.postMessage({
|
|
161
|
+
type: 'message',
|
|
162
|
+
data: message
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Send an error to the main thread
|
|
168
|
+
*/
|
|
169
|
+
function sendError(
|
|
170
|
+
code: string,
|
|
171
|
+
message: string,
|
|
172
|
+
details?: Record<string, unknown>
|
|
173
|
+
): void {
|
|
174
|
+
sendMessage({
|
|
175
|
+
type: 'error',
|
|
176
|
+
code: code as any,
|
|
177
|
+
message,
|
|
178
|
+
...details
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const ctx: MessageContext = { sendMessage, sendError };
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Handle incoming messages from main thread
|
|
186
|
+
*/
|
|
187
|
+
async function handleMessage(message: GraphRunnerMessage): Promise<void> {
|
|
188
|
+
// Call onMessage hook if provided
|
|
189
|
+
if (hooks.onMessage) {
|
|
190
|
+
const shouldContinue = hooks.onMessage(message);
|
|
191
|
+
if (shouldContinue === false) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Check for custom handlers
|
|
197
|
+
const customHandler = customHandlers[message.type];
|
|
198
|
+
if (customHandler) {
|
|
199
|
+
customHandler(message, ctx);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
switch (message.type) {
|
|
204
|
+
case 'hello':
|
|
205
|
+
handleHello(message, 'webworker-runner', ctx);
|
|
206
|
+
break;
|
|
207
|
+
case 'createSession':
|
|
208
|
+
await handleCreateSessionWithHooks(message);
|
|
209
|
+
break;
|
|
210
|
+
case 'getCapabilities':
|
|
211
|
+
handleGetCapabilities(ctx);
|
|
212
|
+
break;
|
|
213
|
+
case 'getServerVariables':
|
|
214
|
+
handleGetServerVariables(variables, ctx);
|
|
215
|
+
break;
|
|
216
|
+
case 'getServerEvents':
|
|
217
|
+
handleGetServerEvents(events, ctx);
|
|
218
|
+
break;
|
|
219
|
+
case 'getSocketConstraints':
|
|
220
|
+
handleGetSocketConstraints(
|
|
221
|
+
{ nodeType: message.nodeType, socketName: message.socketName },
|
|
222
|
+
registry,
|
|
223
|
+
ctx
|
|
224
|
+
);
|
|
225
|
+
break;
|
|
226
|
+
case 'getNodeTypes':
|
|
227
|
+
handleGetNodeTypes(registry, ctx);
|
|
228
|
+
break;
|
|
229
|
+
case 'runGraph':
|
|
230
|
+
await handleRunGraphWithHooks(message);
|
|
231
|
+
break;
|
|
232
|
+
case 'stopGraph':
|
|
233
|
+
await handleStopGraphWithHooks(message);
|
|
234
|
+
break;
|
|
235
|
+
case 'getStatus':
|
|
236
|
+
handleGetStatus(message);
|
|
237
|
+
break;
|
|
238
|
+
case 'closeSession':
|
|
239
|
+
await handleCloseSessionWithHooks(message);
|
|
240
|
+
break;
|
|
241
|
+
|
|
242
|
+
default:
|
|
243
|
+
sendError(
|
|
244
|
+
'PROTOCOL_VIOLATION',
|
|
245
|
+
`Unsupported message type: ${(message as any).type}`
|
|
246
|
+
);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Handle createSession with lifecycle hooks
|
|
252
|
+
*/
|
|
253
|
+
async function handleCreateSessionWithHooks(message: {
|
|
254
|
+
type: 'createSession';
|
|
255
|
+
metadata?: Record<string, unknown>;
|
|
256
|
+
}): Promise<void> {
|
|
257
|
+
sessionId = handleCreateSession(message, ctx);
|
|
258
|
+
|
|
259
|
+
let sessionMetadata = message.metadata ?? {};
|
|
260
|
+
|
|
261
|
+
// Call onSessionCreated hook if provided
|
|
262
|
+
if (hooks.onSessionCreated) {
|
|
263
|
+
try {
|
|
264
|
+
const hookResult = await hooks.onSessionCreated(
|
|
265
|
+
sessionId,
|
|
266
|
+
message.metadata
|
|
267
|
+
);
|
|
268
|
+
if (hookResult && typeof hookResult === 'object') {
|
|
269
|
+
sessionMetadata = { ...sessionMetadata, ...hookResult };
|
|
270
|
+
}
|
|
271
|
+
} catch (error) {
|
|
272
|
+
console.error('Error in onSessionCreated hook:', error);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Use custom session factory if provided, otherwise create default session
|
|
277
|
+
if (sessionFactory) {
|
|
278
|
+
try {
|
|
279
|
+
session = sessionFactory.createSession(sessionId, {
|
|
280
|
+
metadata: sessionMetadata
|
|
281
|
+
});
|
|
282
|
+
} catch (error) {
|
|
283
|
+
console.error('Error in sessionFactory:', error);
|
|
284
|
+
// Fallback to default session
|
|
285
|
+
session = {
|
|
286
|
+
sessionId,
|
|
287
|
+
metadata: sessionMetadata,
|
|
288
|
+
createdAt: Date.now(),
|
|
289
|
+
expiresAt: Date.now() + 24 * 60 * 60 * 1000,
|
|
290
|
+
config: { metadata: sessionMetadata },
|
|
291
|
+
activeRuns: new Set(),
|
|
292
|
+
state: {}
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
} else {
|
|
296
|
+
session = {
|
|
297
|
+
sessionId,
|
|
298
|
+
metadata: sessionMetadata,
|
|
299
|
+
createdAt: Date.now(),
|
|
300
|
+
expiresAt: Date.now() + 24 * 60 * 60 * 1000,
|
|
301
|
+
config: { metadata: sessionMetadata },
|
|
302
|
+
activeRuns: new Set(),
|
|
303
|
+
state: {}
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Handle closeSession with lifecycle hooks
|
|
310
|
+
*/
|
|
311
|
+
async function handleCloseSessionWithHooks(message: {
|
|
312
|
+
type: 'closeSession';
|
|
313
|
+
sessionId: string;
|
|
314
|
+
}): Promise<void> {
|
|
315
|
+
// Call onSessionClosed hook if provided
|
|
316
|
+
if (hooks.onSessionClosed && session) {
|
|
317
|
+
try {
|
|
318
|
+
await hooks.onSessionClosed({
|
|
319
|
+
sessionId: session.sessionId,
|
|
320
|
+
metadata: session.metadata,
|
|
321
|
+
createdAt: session.createdAt
|
|
322
|
+
});
|
|
323
|
+
} catch (error) {
|
|
324
|
+
console.error('Error in onSessionClosed hook:', error);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
for (const run of activeRuns.values()) {
|
|
329
|
+
run.engine.dispose();
|
|
330
|
+
}
|
|
331
|
+
activeRuns.clear();
|
|
332
|
+
|
|
333
|
+
sendMessage({
|
|
334
|
+
type: 'sessionClosed',
|
|
335
|
+
sessionId: message.sessionId
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
sessionId = null;
|
|
339
|
+
session = null;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Handle runGraph with lifecycle hooks
|
|
344
|
+
*/
|
|
345
|
+
async function handleRunGraphWithHooks(message: {
|
|
346
|
+
type: 'runGraph';
|
|
347
|
+
sessionId: string;
|
|
348
|
+
graphId: string;
|
|
349
|
+
graph?: unknown;
|
|
350
|
+
inputs?: unknown;
|
|
351
|
+
options?: { trace?: boolean };
|
|
352
|
+
}): Promise<void> {
|
|
353
|
+
const runContext: RunContext = {
|
|
354
|
+
runId: '', // Will be set below
|
|
355
|
+
graphId: message.graphId,
|
|
356
|
+
sessionId: message.sessionId,
|
|
357
|
+
inputs: message.inputs,
|
|
358
|
+
options: message.options
|
|
359
|
+
};
|
|
360
|
+
|
|
361
|
+
// Call onRunStart hook if provided
|
|
362
|
+
if (hooks.onRunStart) {
|
|
363
|
+
try {
|
|
364
|
+
const shouldContinue = await hooks.onRunStart(runContext);
|
|
365
|
+
if (shouldContinue === false) {
|
|
366
|
+
sendMessage({
|
|
367
|
+
type: 'stopped',
|
|
368
|
+
runId: runContext.runId,
|
|
369
|
+
graphId: message.graphId,
|
|
370
|
+
reason: 'Cancelled by onRunStart hook'
|
|
371
|
+
});
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
} catch (error) {
|
|
375
|
+
console.error('Error in onRunStart hook:', error);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
await handleRunGraph(message, runContext);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/**
|
|
383
|
+
* Handle stopGraph with lifecycle hooks
|
|
384
|
+
*/
|
|
385
|
+
async function handleStopGraphWithHooks(message: {
|
|
386
|
+
type: 'stopGraph';
|
|
387
|
+
sessionId: string;
|
|
388
|
+
runId: string;
|
|
389
|
+
}): Promise<void> {
|
|
390
|
+
const run = activeRuns.get(message.runId);
|
|
391
|
+
if (!run) {
|
|
392
|
+
sendError('RUN_NOT_FOUND', 'Run not found', { runId: message.runId });
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const runContext: RunContext = {
|
|
397
|
+
runId: message.runId,
|
|
398
|
+
graphId: run.graphId,
|
|
399
|
+
sessionId: message.sessionId
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
const reason = 'User requested stop';
|
|
403
|
+
|
|
404
|
+
// Call onRunStopped hook if provided
|
|
405
|
+
if (hooks.onRunStopped) {
|
|
406
|
+
try {
|
|
407
|
+
await hooks.onRunStopped(runContext, reason);
|
|
408
|
+
} catch (error) {
|
|
409
|
+
console.error('Error in onRunStopped hook:', error);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
run.status = 'stopped';
|
|
414
|
+
run.flushTracing?.();
|
|
415
|
+
run.engine.dispose();
|
|
416
|
+
activeRuns.delete(message.runId);
|
|
417
|
+
|
|
418
|
+
sendMessage({
|
|
419
|
+
type: 'stopped',
|
|
420
|
+
runId: message.runId,
|
|
421
|
+
graphId: run.graphId,
|
|
422
|
+
reason
|
|
423
|
+
});
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
async function handleRunGraph(
|
|
427
|
+
message: {
|
|
428
|
+
type: 'runGraph';
|
|
429
|
+
sessionId: string;
|
|
430
|
+
graphId: string;
|
|
431
|
+
graph?: unknown;
|
|
432
|
+
inputs?: unknown;
|
|
433
|
+
options?: { trace?: boolean };
|
|
434
|
+
},
|
|
435
|
+
runContext: RunContext
|
|
436
|
+
): Promise<void> {
|
|
437
|
+
const runId = generateId('run');
|
|
438
|
+
runContext.runId = runId;
|
|
439
|
+
|
|
440
|
+
try {
|
|
441
|
+
if (!message.graph) {
|
|
442
|
+
sendError('INVALID_GRAPH', 'Graph not provided', {
|
|
443
|
+
runId,
|
|
444
|
+
graphId: message.graphId
|
|
445
|
+
});
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Create logger
|
|
450
|
+
const logger = createForwardingLogger(
|
|
451
|
+
runId,
|
|
452
|
+
message.graphId,
|
|
453
|
+
sendMessage
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
// Prepare registry with dependencies
|
|
457
|
+
const registryWithDeps = prepareRegistryWithDependencies(
|
|
458
|
+
registry,
|
|
459
|
+
logger
|
|
460
|
+
);
|
|
461
|
+
|
|
462
|
+
// Parse and validate graph
|
|
463
|
+
const { graphInstance, errors } = parseAndValidateGraph(
|
|
464
|
+
message.graph,
|
|
465
|
+
registryWithDeps
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
if (errors.length > 0) {
|
|
469
|
+
sendError('VALIDATION_FAILED', errors.join('; '), {
|
|
470
|
+
runId,
|
|
471
|
+
graphId: message.graphId
|
|
472
|
+
});
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
// Create engine
|
|
477
|
+
const engine = new Engine(graphInstance, registryWithDeps);
|
|
478
|
+
|
|
479
|
+
// Create run record
|
|
480
|
+
const run: ActiveRun = {
|
|
481
|
+
runId,
|
|
482
|
+
graphId: message.graphId,
|
|
483
|
+
engine,
|
|
484
|
+
graphInstance,
|
|
485
|
+
registry: registryWithDeps,
|
|
486
|
+
status: 'running',
|
|
487
|
+
startedAt: Date.now(),
|
|
488
|
+
performance: {
|
|
489
|
+
nodesExecuted: 0,
|
|
490
|
+
eventsEmitted: 0,
|
|
491
|
+
variableChanges: 0
|
|
492
|
+
},
|
|
493
|
+
isPaused: false,
|
|
494
|
+
executionPhase: 'start',
|
|
495
|
+
currentTick: 0
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
activeRuns.set(runId, run);
|
|
499
|
+
|
|
500
|
+
// Send run started
|
|
501
|
+
sendMessage({
|
|
502
|
+
type: 'runStarted',
|
|
503
|
+
runId,
|
|
504
|
+
graphId: message.graphId,
|
|
505
|
+
startedAt: run.startedAt
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
// Set up variable change tracking
|
|
509
|
+
setupVariableChangeTracking(run, message.graphId, ctx);
|
|
510
|
+
|
|
511
|
+
// Set up tracing if requested
|
|
512
|
+
if (message.options?.trace) {
|
|
513
|
+
setupTracing(run, message.graphId, ctx);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Execute graph
|
|
517
|
+
executeGraphLifecycle(run, message.graphId, ctx)
|
|
518
|
+
.then(async () => {
|
|
519
|
+
// Call onRunComplete hook if provided
|
|
520
|
+
if (hooks.onRunComplete) {
|
|
521
|
+
try {
|
|
522
|
+
await hooks.onRunComplete(runContext, run);
|
|
523
|
+
} catch (error) {
|
|
524
|
+
console.error('Error in onRunComplete hook:', error);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
})
|
|
528
|
+
.catch(async (error) => {
|
|
529
|
+
console.error('Graph execution error:', error);
|
|
530
|
+
|
|
531
|
+
// Call onRunError hook if provided
|
|
532
|
+
if (hooks.onRunError) {
|
|
533
|
+
try {
|
|
534
|
+
await hooks.onRunError(runContext, error);
|
|
535
|
+
} catch (hookError) {
|
|
536
|
+
console.error('Error in onRunError hook:', hookError);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
})
|
|
540
|
+
.finally(() => {
|
|
541
|
+
activeRuns.delete(runId);
|
|
542
|
+
});
|
|
543
|
+
} catch (error) {
|
|
544
|
+
const errorMessage =
|
|
545
|
+
error instanceof Error ? error.message : String(error);
|
|
546
|
+
sendError('NODE_EXECUTION_ERROR', errorMessage, {
|
|
547
|
+
runId,
|
|
548
|
+
graphId: message.graphId
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
// Call onRunError hook if provided
|
|
552
|
+
if (hooks.onRunError) {
|
|
553
|
+
try {
|
|
554
|
+
await hooks.onRunError(runContext, error as Error);
|
|
555
|
+
} catch (hookError) {
|
|
556
|
+
console.error('Error in onRunError hook:', hookError);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
function handleStopGraph(message: {
|
|
563
|
+
type: 'stopGraph';
|
|
564
|
+
sessionId: string;
|
|
565
|
+
runId: string;
|
|
566
|
+
}): void {
|
|
567
|
+
const run = activeRuns.get(message.runId);
|
|
568
|
+
if (!run) {
|
|
569
|
+
sendError('RUN_NOT_FOUND', 'Run not found', { runId: message.runId });
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
run.status = 'stopped';
|
|
574
|
+
run.flushTracing?.();
|
|
575
|
+
run.engine.dispose();
|
|
576
|
+
activeRuns.delete(message.runId);
|
|
577
|
+
|
|
578
|
+
sendMessage({
|
|
579
|
+
type: 'stopped',
|
|
580
|
+
runId: message.runId,
|
|
581
|
+
graphId: run.graphId,
|
|
582
|
+
reason: 'User requested stop'
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
function handleGetStatus(message: {
|
|
587
|
+
type: 'getStatus';
|
|
588
|
+
sessionId: string;
|
|
589
|
+
runId: string;
|
|
590
|
+
}): void {
|
|
591
|
+
const run = activeRuns.get(message.runId);
|
|
592
|
+
if (!run) {
|
|
593
|
+
sendError('RUN_NOT_FOUND', 'Run not found', { runId: message.runId });
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
const elapsedMs = Date.now() - run.startedAt;
|
|
598
|
+
|
|
599
|
+
sendMessage({
|
|
600
|
+
type: 'status',
|
|
601
|
+
runId: run.runId,
|
|
602
|
+
graphId: run.graphId,
|
|
603
|
+
status: run.status,
|
|
604
|
+
startedAt: run.startedAt,
|
|
605
|
+
elapsedMs,
|
|
606
|
+
performance: run.performance,
|
|
607
|
+
startedGraphs: []
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
function handleCloseSession(message: {
|
|
612
|
+
type: 'closeSession';
|
|
613
|
+
sessionId: string;
|
|
614
|
+
}): void {
|
|
615
|
+
for (const run of activeRuns.values()) {
|
|
616
|
+
run.engine.dispose();
|
|
617
|
+
}
|
|
618
|
+
activeRuns.clear();
|
|
619
|
+
|
|
620
|
+
sendMessage({
|
|
621
|
+
type: 'sessionClosed',
|
|
622
|
+
sessionId: message.sessionId
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
sessionId = null;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/**
|
|
629
|
+
* Main message handler
|
|
630
|
+
*/
|
|
631
|
+
self.onmessage = (event: MessageEvent) => {
|
|
632
|
+
const message = event.data.message;
|
|
633
|
+
void handleMessage(message);
|
|
634
|
+
};
|
|
635
|
+
}
|