@kiberon-labs/behave-graph-flow 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.fallowrc.json +16 -0
- package/.storybook/main.ts +32 -0
- package/.storybook/preview.ts +16 -0
- package/.storybook/styles.css +10 -0
- package/.storybook/vscode.css +814 -0
- package/.turbo/turbo-build.log +7 -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/entry.css +4 -0
- package/dist/index.css +39 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +2282 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14873 -0
- package/dist/index.js.map +1 -0
- package/docs/notifications.md +246 -0
- package/docs/protocol.md +679 -0
- package/docs/specifics.md +191 -0
- package/package.json +85 -21
- package/postcss.config.ts +3 -4
- package/src/annotations/index.ts +32 -0
- package/src/components/FloatingToolbar/index.module.css +45 -0
- package/src/components/FloatingToolbar/index.tsx +256 -0
- package/src/components/Flow.tsx +276 -75
- package/src/components/contextMenus/NodePicker.module.css +274 -0
- package/src/components/contextMenus/NodePicker.tsx +481 -0
- package/src/components/contextMenus/edge.tsx +108 -0
- package/src/components/contextMenus/node.tsx +155 -0
- package/src/components/contextMenus/selection.tsx +77 -0
- package/src/components/controls/any/index.tsx +8 -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 +469 -0
- package/src/components/edges/offsetBezier.ts +134 -0
- package/src/components/hotKeys.tsx +20 -0
- package/src/components/layoutController/index.module.css +10 -0
- package/src/components/layoutController/index.tsx +117 -0
- package/src/components/layoutController/utils.ts +205 -0
- package/src/components/menubar/defaults.tsx +480 -0
- package/src/components/menubar/index.tsx +49 -0
- package/src/components/menubar/menuItem.module.css +16 -0
- package/src/components/menubar/menuItem.tsx +32 -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 +87 -0
- package/src/components/nodes/behave/NodeContainer.tsx +46 -0
- package/src/components/nodes/behave/index.tsx +14 -0
- package/src/components/nodes/comment/FormatToolbar.tsx +118 -0
- package/src/components/nodes/comment/comment.tsx +103 -0
- package/src/components/nodes/comment/styles.module.css +150 -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 +113 -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 +20 -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/conversation/index.module.css +151 -0
- package/src/components/panels/conversation/index.tsx +162 -0
- package/src/components/panels/events/CustomEventsEditor.tsx +384 -0
- package/src/components/panels/events/EditEventPanel.tsx +315 -0
- package/src/components/panels/events/ManageEventsPanel.tsx +98 -0
- package/src/components/panels/events/index.tsx +23 -0
- package/src/components/panels/events/styles.module.css +236 -0
- package/src/components/panels/history/index.tsx +92 -0
- package/src/components/panels/history/styles.module.css +106 -0
- package/src/components/panels/keymaps/index.module.css +78 -0
- package/src/components/panels/keymaps/index.tsx +167 -0
- package/src/components/panels/layers/index.tsx +240 -0
- package/src/components/panels/layers/styles.module.css +110 -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 +212 -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 +64 -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 +65 -0
- package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
- package/src/components/panels/nodeInputs/index.module.css +284 -0
- package/src/components/panels/nodeInputs/index.tsx +339 -0
- package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
- package/src/components/panels/nodeInputs/useNodeInputsData.ts +173 -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 +66 -0
- package/src/components/panels/search/index.tsx +215 -0
- package/src/components/panels/systemSettings/index.tsx +206 -0
- package/src/components/panels/systemSettings/styles.module.css +11 -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 +166 -0
- package/src/components/panels/traces/index.tsx +294 -0
- package/src/components/panels/traces/types.ts +48 -0
- package/src/components/panels/traces/useDerivedSpans.ts +212 -0
- package/src/components/panels/traces/utils.ts +25 -0
- package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
- package/src/components/panels/variables/ManageVariablesScreen.tsx +144 -0
- package/src/components/panels/variables/index.tsx +125 -0
- package/src/components/panels/variables/styles.module.css +236 -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 +76 -0
- package/src/components/sockets/input/styles.module.css +27 -0
- package/src/components/sockets/output/index.tsx +61 -0
- package/src/components/sockets/output/styles.module.css +27 -0
- package/src/css/prosemirror.css +57 -0
- package/src/css/rc-dock.css +112 -0
- package/src/css/rc-menu.css +100 -0
- package/src/css/vars.css +14 -0
- package/src/css/vscode.css +13 -0
- package/src/entry.css +4 -0
- package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -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/registerDefaultGenerators.ts +34 -0
- package/src/hooks/useBehaveGraphFlow.ts +17 -16
- package/src/hooks/useDetachNodes.ts +39 -0
- package/src/hooks/useFlowHandlers.ts +115 -29
- package/src/hooks/useWasdPan.ts +188 -0
- package/src/index.css +146 -0
- package/src/index.ts +36 -18
- package/src/layout/dagre.tsx +119 -0
- package/src/layout/elk.ts +200 -0
- package/src/plugin/alignment/index.ts +81 -0
- package/src/plugin/docs/index.tsx +299 -0
- package/src/plugin/docs/panel/index.tsx +200 -0
- package/src/plugin/docs/panel/styles.module.css +174 -0
- package/src/plugin/graphrunner/actions.ts +253 -0
- package/src/plugin/graphrunner/buttons.tsx +87 -0
- package/src/plugin/graphrunner/client.ts +704 -0
- package/src/plugin/graphrunner/index.tsx +255 -0
- package/src/plugin/graphrunner/panel.tsx +386 -0
- package/src/plugin/graphrunner/runner.ts +358 -0
- package/src/plugin/graphrunner/session.ts +243 -0
- package/src/plugin/graphrunner/store.ts +206 -0
- package/src/plugin/graphrunner/styles.module.css +211 -0
- package/src/plugin/graphrunner/transport.ts +224 -0
- package/src/plugin/graphrunner/types.ts +672 -0
- package/src/plugin/graphrunner-local/execution-utils.ts +457 -0
- package/src/plugin/graphrunner-local/index.tsx +166 -0
- package/src/plugin/graphrunner-local/panel.tsx +231 -0
- package/src/plugin/graphrunner-local/store.ts +41 -0
- package/src/plugin/graphrunner-local/styles.module.css +101 -0
- package/src/plugin/graphrunner-local/transport.ts +1372 -0
- package/src/plugin/graphrunner-local/types.ts +10 -0
- package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +633 -0
- package/src/plugin/graphrunner-webworker/index.tsx +146 -0
- package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
- package/src/plugin/graphrunner-webworker/store.ts +89 -0
- package/src/plugin/graphrunner-webworker/types.ts +17 -0
- package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
- package/src/plugin/realtime/realtimeRunner.ts +570 -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/specifics/registerDefaultSpecifics.ts +5 -0
- package/src/store/actions.tsx +698 -0
- package/src/store/chat.ts +73 -0
- package/src/store/controls.tsx +62 -0
- package/src/store/documentation.tsx +69 -0
- package/src/store/events.tsx +116 -0
- package/src/store/flow.tsx +245 -0
- package/src/store/graphRunnerClient.ts +110 -0
- package/src/store/hotKeys.tsx +323 -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 +43 -0
- package/src/store/selection.ts +22 -0
- package/src/store/settings.ts +99 -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 +278 -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 +134 -0
- package/src/system/index.ts +3 -0
- package/src/system/notifications.ts +98 -0
- package/src/system/plugin.ts +27 -0
- package/src/system/provider.tsx +22 -0
- package/src/system/pubsub.ts +323 -0
- package/src/system/system.ts +223 -0
- package/src/system/tabLoader.tsx +265 -0
- package/src/system/undoRedo.ts +103 -0
- package/src/transformers/Uigraph.ts +60 -0
- package/src/transformers/behaveToFlow.ts +16 -4
- package/src/transformers/flowToBehave.ts +32 -12
- package/src/types/NodeMetadata.ts +27 -0
- package/src/types/graph.ts +49 -0
- package/src/types/nodes.ts +45 -0
- package/src/types.ts +16 -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 +28 -15
- 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/nodes/comment.stories.tsx +106 -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 +167 -0
- package/stories/defaults/systemGenerator.ts +38 -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/flowToBehave.test.ts +26 -4
- package/tests/notifications.test.ts +87 -0
- package/tests/saveLoad.test.ts +372 -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-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/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 +48 -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
package/docs/protocol.md
ADDED
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
|
|
2
|
+
# Behave-Graph Execution Protocol (WebSocket)
|
|
3
|
+
|
|
4
|
+
**Version:** 1.0.0
|
|
5
|
+
|
|
6
|
+
This protocol defines a WebSocket-based interface for decoupled execution of behavior graphs. It supports local or remote execution, tracing, session management, and server-sent events for real-time updates. All requests and responses involving graph execution must include the relevant graph IDs, as graphs may call other graphs.
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
- **Transport:** WebSocket (JSON messages)
|
|
10
|
+
- **Client:** Graph editor or automation
|
|
11
|
+
- **Server:** Graph execution backend (local or remote)
|
|
12
|
+
- **Feature Discovery:** Clients query server capabilities
|
|
13
|
+
- **Event-Driven:** Server emits events for graph lifecycle, tracing, errors, etc.
|
|
14
|
+
- **Reconnection:** Sessions persist across WebSocket reconnections
|
|
15
|
+
- **Message Ordering:** Events are delivered in execution order per runId
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 1. Connection & Protocol Negotiation
|
|
20
|
+
|
|
21
|
+
### Initial Handshake
|
|
22
|
+
|
|
23
|
+
**CRITICAL:** The `hello` message **MUST** be the first message sent by the client after WebSocket connection is established. The server **MUST** reject any other message type sent before `hello` with an error.
|
|
24
|
+
|
|
25
|
+
### Protocol Version & Authentication
|
|
26
|
+
- **Client → Server (FIRST MESSAGE ONLY):**
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"type": "hello",
|
|
30
|
+
"protocolVersion": "1.0.0",
|
|
31
|
+
"auth": {
|
|
32
|
+
"type": "bearer",
|
|
33
|
+
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Authentication Types:**
|
|
39
|
+
- `bearer` — Bearer token (JWT or API key)
|
|
40
|
+
- `apiKey` — Simple API key
|
|
41
|
+
- `none` — No authentication (development only)
|
|
42
|
+
|
|
43
|
+
**Example with API Key:**
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"type": "hello",
|
|
47
|
+
"protocolVersion": "1.0.0",
|
|
48
|
+
"auth": {
|
|
49
|
+
"type": "apiKey",
|
|
50
|
+
"key": "your-api-key-here"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Example without authentication:**
|
|
56
|
+
```json
|
|
57
|
+
{
|
|
58
|
+
"type": "hello",
|
|
59
|
+
"protocolVersion": "1.0.0",
|
|
60
|
+
"auth": {
|
|
61
|
+
"type": "none"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- **Server → Client (Success):**
|
|
67
|
+
```json
|
|
68
|
+
{
|
|
69
|
+
"type": "welcome",
|
|
70
|
+
"protocolVersion": "1.0.0",
|
|
71
|
+
"serverId": "backend-1",
|
|
72
|
+
"authenticated": true,
|
|
73
|
+
"userId": "user-123"
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**Error Responses:**
|
|
78
|
+
|
|
79
|
+
If versions are incompatible:
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"type": "error",
|
|
83
|
+
"code": "PROTOCOL_VERSION_MISMATCH",
|
|
84
|
+
"message": "Unsupported version",
|
|
85
|
+
"supportedVersions": ["1.0.0"]
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
If authentication fails:
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"type": "error",
|
|
93
|
+
"code": "AUTHENTICATION_FAILED",
|
|
94
|
+
"message": "Invalid or expired token"
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
If hello is not the first message:
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"type": "error",
|
|
102
|
+
"code": "PROTOCOL_VIOLATION",
|
|
103
|
+
"message": "Hello message must be sent first"
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 2. Session Management
|
|
110
|
+
|
|
111
|
+
### Create Session
|
|
112
|
+
- **Client → Server:**
|
|
113
|
+
```json
|
|
114
|
+
{ "type": "createSession", "metadata": { "clientId": "editor-1", "user": "dev" } }
|
|
115
|
+
```
|
|
116
|
+
- **Server → Client:**
|
|
117
|
+
```json
|
|
118
|
+
{ "type": "sessionCreated", "sessionId": "sess-xyz", "expiresAt": 1234567890 }
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Resume Session (after reconnection)
|
|
122
|
+
- **Client → Server:**
|
|
123
|
+
```json
|
|
124
|
+
{ "type": "resumeSession", "sessionId": "sess-xyz" }
|
|
125
|
+
```
|
|
126
|
+
- **Server → Client:**
|
|
127
|
+
```json
|
|
128
|
+
{ "type": "sessionResumed", "sessionId": "sess-xyz", "activeRuns": ["abc123", "def456"] }
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Close Session
|
|
132
|
+
- **Client → Server:**
|
|
133
|
+
```json
|
|
134
|
+
{ "type": "closeSession", "sessionId": "sess-xyz" }
|
|
135
|
+
```
|
|
136
|
+
- **Server → Client:**
|
|
137
|
+
```json
|
|
138
|
+
{ "type": "sessionClosed", "sessionId": "sess-xyz" }
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Heartbeat (every 30s recommended)
|
|
142
|
+
- **Client → Server:**
|
|
143
|
+
```json
|
|
144
|
+
{ "type": "ping", "timestamp": 1234567890 }
|
|
145
|
+
```
|
|
146
|
+
- **Server → Client:**
|
|
147
|
+
```json
|
|
148
|
+
{ "type": "pong", "timestamp": 1234567890 }
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
All subsequent requests must include the `sessionId`.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 3. Capabilities
|
|
156
|
+
|
|
157
|
+
### Capabilities Request
|
|
158
|
+
- **Client → Server:**
|
|
159
|
+
```json
|
|
160
|
+
{ "type": "getCapabilities" }
|
|
161
|
+
```
|
|
162
|
+
- **Server → Client:**
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"type": "capabilities",
|
|
166
|
+
"capabilities": {
|
|
167
|
+
"trace": true,
|
|
168
|
+
"validation": true,
|
|
169
|
+
"graphRegistry": true,
|
|
170
|
+
"eventFiltering": true,
|
|
171
|
+
"batchOperations": true,
|
|
172
|
+
"runHistory": true,
|
|
173
|
+
"runtimeMetadata": true,
|
|
174
|
+
"maxConcurrentRuns": 100
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 4. Runtime Metadata (Optional)
|
|
182
|
+
|
|
183
|
+
These endpoints provide the editor with information about server-side runtime state and constraints.
|
|
184
|
+
|
|
185
|
+
### Query Server Variables
|
|
186
|
+
```json
|
|
187
|
+
{ "type": "getServerVariables", "sessionId": "sess-xyz" }
|
|
188
|
+
```
|
|
189
|
+
- **Response:**
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"type": "serverVariables",
|
|
193
|
+
"variables": [
|
|
194
|
+
{
|
|
195
|
+
"name": "playerHealth",
|
|
196
|
+
"type": "number",
|
|
197
|
+
"currentValue": 100,
|
|
198
|
+
"readonly": false,
|
|
199
|
+
"description": "Current player health points"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
"name": "gameMode",
|
|
203
|
+
"type": "string",
|
|
204
|
+
"currentValue": "survival",
|
|
205
|
+
"readonly": true,
|
|
206
|
+
"description": "Current game mode"
|
|
207
|
+
}
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Query Server Events
|
|
213
|
+
```json
|
|
214
|
+
{ "type": "getServerEvents", "sessionId": "sess-xyz" }
|
|
215
|
+
```
|
|
216
|
+
- **Response:**
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"type": "serverEvents",
|
|
220
|
+
"events": [
|
|
221
|
+
{
|
|
222
|
+
"name": "onPlayerDeath",
|
|
223
|
+
"description": "Triggered when a player dies",
|
|
224
|
+
"payloadSchema": {
|
|
225
|
+
"playerId": "string",
|
|
226
|
+
"cause": "string",
|
|
227
|
+
"position": "vector3"
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"name": "onLevelComplete",
|
|
232
|
+
"description": "Triggered when a level is completed",
|
|
233
|
+
"payloadSchema": {
|
|
234
|
+
"levelId": "number",
|
|
235
|
+
"score": "number",
|
|
236
|
+
"timeElapsed": "number"
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Query Socket Constraints
|
|
244
|
+
Get metadata about specific node sockets, including allowed values/types.
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"type": "getSocketConstraints",
|
|
249
|
+
"sessionId": "sess-xyz",
|
|
250
|
+
"nodeType": "math/operation",
|
|
251
|
+
"socketName": "operation"
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
- **Response:**
|
|
255
|
+
```json
|
|
256
|
+
{
|
|
257
|
+
"type": "socketConstraints",
|
|
258
|
+
"nodeType": "math/operation",
|
|
259
|
+
"socketName": "operation",
|
|
260
|
+
"valueType": "string",
|
|
261
|
+
"constraints": {
|
|
262
|
+
"type": "enum",
|
|
263
|
+
"choices": [
|
|
264
|
+
{ "value": "add", "label": "Add (+)" },
|
|
265
|
+
{ "value": "subtract", "label": "Subtract (-)" },
|
|
266
|
+
{ "value": "multiply", "label": "Multiply (×)" },
|
|
267
|
+
{ "value": "divide", "label": "Divide (÷)" }
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Query All Node Types
|
|
274
|
+
Get metadata about all available node types and their sockets.
|
|
275
|
+
|
|
276
|
+
```json
|
|
277
|
+
{ "type": "getNodeTypes", "sessionId": "sess-xyz" }
|
|
278
|
+
```
|
|
279
|
+
- **Response:**
|
|
280
|
+
```json
|
|
281
|
+
{
|
|
282
|
+
"type": "nodeTypes",
|
|
283
|
+
"nodes": [
|
|
284
|
+
{
|
|
285
|
+
"type": "math/operation",
|
|
286
|
+
"category": "math",
|
|
287
|
+
"label": "Math Operation",
|
|
288
|
+
"description": "Perform mathematical operations",
|
|
289
|
+
"inputs": [
|
|
290
|
+
{ "name": "a", "valueType": "number", "required": true },
|
|
291
|
+
{ "name": "b", "valueType": "number", "required": true },
|
|
292
|
+
{ "name": "operation", "valueType": "string", "hasConstraints": true }
|
|
293
|
+
],
|
|
294
|
+
"outputs": [
|
|
295
|
+
{ "name": "result", "valueType": "number" }
|
|
296
|
+
]
|
|
297
|
+
}
|
|
298
|
+
]
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
## 5. Graph Registry (Optional)
|
|
305
|
+
|
|
306
|
+
### Register Graph
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"type": "registerGraph",
|
|
310
|
+
"sessionId": "sess-xyz",
|
|
311
|
+
"graphId": "my-graph-1",
|
|
312
|
+
"graph": { /* graph definition */ }
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
- **Response:**
|
|
316
|
+
```json
|
|
317
|
+
{ "type": "graphRegistered", "graphId": "my-graph-1" }
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### List Registered Graphs
|
|
321
|
+
```json
|
|
322
|
+
{ "type": "listGraphs", "sessionId": "sess-xyz" }
|
|
323
|
+
```
|
|
324
|
+
- **Response:**
|
|
325
|
+
```json
|
|
326
|
+
{ "type": "graphList", "graphs": [{ "graphId": "my-graph-1", "registeredAt": 1234567890 }] }
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 6. Graph Validation
|
|
332
|
+
|
|
333
|
+
### Validate Graph
|
|
334
|
+
```json
|
|
335
|
+
{
|
|
336
|
+
"type": "validateGraph",
|
|
337
|
+
"sessionId": "sess-xyz",
|
|
338
|
+
"graphId": "my-graph-1",
|
|
339
|
+
"graph": { /* graph definition */ }
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
- **Response:**
|
|
343
|
+
```json
|
|
344
|
+
{
|
|
345
|
+
"type": "validationResult",
|
|
346
|
+
"graphId": "my-graph-1",
|
|
347
|
+
"valid": false,
|
|
348
|
+
"errors": [
|
|
349
|
+
{ "nodeId": "node5", "message": "Missing required input", "severity": "error" }
|
|
350
|
+
],
|
|
351
|
+
"warnings": [
|
|
352
|
+
{ "nodeId": "node10", "message": "Unused output", "severity": "warning" }
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
---
|
|
358
|
+
|
|
359
|
+
## 7. Commands (Client → Server)
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
### Run Graph
|
|
363
|
+
```json
|
|
364
|
+
{
|
|
365
|
+
"type": "runGraph",
|
|
366
|
+
"sessionId": "sess-xyz",
|
|
367
|
+
"graphId": "main-graph-1",
|
|
368
|
+
"graph": { /* graph definition or omit if registered */ },
|
|
369
|
+
"inputs": { /* optional input values */ },
|
|
370
|
+
"options": {
|
|
371
|
+
"trace": true,
|
|
372
|
+
"eventFilter": { "variables": ["score", "health"], "events": ["onDeath"] },
|
|
373
|
+
"maxExecutionTimeMs": 30000,
|
|
374
|
+
// Whether the graph should complete with no more pending fibres
|
|
375
|
+
"autoEnd":true
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
```
|
|
379
|
+
- **Response:**
|
|
380
|
+
```json
|
|
381
|
+
{ "type": "runStarted", "runId": "abc123", "graphId": "main-graph-1", "startedAt": 1234567890 }
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
|
|
385
|
+
### Stop Graph
|
|
386
|
+
```json
|
|
387
|
+
{ "type": "stopGraph", "sessionId": "sess-xyz", "runId": "abc123" }
|
|
388
|
+
```
|
|
389
|
+
- **Response:**
|
|
390
|
+
```json
|
|
391
|
+
{ "type": "stopped", "runId": "abc123", "graphId": "main-graph-1", "reason": "user_requested" }
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
### Query Status
|
|
397
|
+
```json
|
|
398
|
+
{ "type": "getStatus", "sessionId": "sess-xyz", "runId": "abc123" }
|
|
399
|
+
```
|
|
400
|
+
- **Response:**
|
|
401
|
+
```json
|
|
402
|
+
{
|
|
403
|
+
"type": "status",
|
|
404
|
+
"runId": "abc123",
|
|
405
|
+
"graphId": "main-graph-1",
|
|
406
|
+
"status": "running",
|
|
407
|
+
"startedAt": 1234567890,
|
|
408
|
+
"elapsedMs": 1532,
|
|
409
|
+
"currentNodeId": "node42",
|
|
410
|
+
"startedGraphs": [
|
|
411
|
+
{ "runId": "child-1", "graphId": "sub-graph-1", "status": "completed" },
|
|
412
|
+
{ "runId": "child-2", "graphId": "sub-graph-2", "status": "running" }
|
|
413
|
+
],
|
|
414
|
+
"performance": {
|
|
415
|
+
"nodesExecuted": 42,
|
|
416
|
+
"eventsEmitted": 15,
|
|
417
|
+
"variableChanges": 8
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Batch Status Query
|
|
423
|
+
```json
|
|
424
|
+
{ "type": "batchGetStatus", "sessionId": "sess-xyz", "runIds": ["abc123", "def456"] }
|
|
425
|
+
```
|
|
426
|
+
- **Response:**
|
|
427
|
+
```json
|
|
428
|
+
{
|
|
429
|
+
"type": "batchStatus",
|
|
430
|
+
"statuses": [
|
|
431
|
+
{ "runId": "abc123", "status": "running", "elapsedMs": 1532 },
|
|
432
|
+
{ "runId": "def456", "status": "completed", "elapsedMs": 890 }
|
|
433
|
+
]
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### Subscribe to Events
|
|
438
|
+
```json
|
|
439
|
+
{
|
|
440
|
+
"type": "subscribe",
|
|
441
|
+
"sessionId": "sess-xyz",
|
|
442
|
+
"runId": "abc123",
|
|
443
|
+
"filter": {
|
|
444
|
+
"eventTypes": ["variableChanged", "eventEmitted"],
|
|
445
|
+
"variableNames": ["score"],
|
|
446
|
+
"eventNames": ["onDeath"]
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Unsubscribe from Events
|
|
452
|
+
```json
|
|
453
|
+
{ "type": "unsubscribe", "sessionId": "sess-xyz", "runId": "abc123" }
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
---
|
|
457
|
+
|
|
458
|
+
## 8. Run History
|
|
459
|
+
|
|
460
|
+
### Query Run History
|
|
461
|
+
```json
|
|
462
|
+
{
|
|
463
|
+
"type": "getRunHistory",
|
|
464
|
+
"sessionId": "sess-xyz",
|
|
465
|
+
"limit": 10,
|
|
466
|
+
"graphId": "main-graph-1"
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
- **Response:**
|
|
470
|
+
```json
|
|
471
|
+
{
|
|
472
|
+
"type": "runHistory",
|
|
473
|
+
"runs": [
|
|
474
|
+
{
|
|
475
|
+
"runId": "abc123",
|
|
476
|
+
"graphId": "main-graph-1",
|
|
477
|
+
"status": "completed",
|
|
478
|
+
"startedAt": 1234567890,
|
|
479
|
+
"completedAt": 1234567900,
|
|
480
|
+
"elapsedMs": 10000,
|
|
481
|
+
"result": { /* output values */ }
|
|
482
|
+
}
|
|
483
|
+
]
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
---
|
|
488
|
+
|
|
489
|
+
## 9. Server-Sent Events (Server → Client)
|
|
490
|
+
|
|
491
|
+
### Graph Lifecycle Events
|
|
492
|
+
|
|
493
|
+
#### Run Started
|
|
494
|
+
```json
|
|
495
|
+
{ "type": "runStarted", "runId": "abc123", "graphId": "main-graph-1", "startedAt": 1234567890 }
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
#### Completed
|
|
499
|
+
```json
|
|
500
|
+
{
|
|
501
|
+
"type": "completed",
|
|
502
|
+
"runId": "abc123",
|
|
503
|
+
"graphId": "main-graph-1",
|
|
504
|
+
"completedAt": 1234567900,
|
|
505
|
+
"elapsedMs": 10000,
|
|
506
|
+
"result": { /* output values */ },
|
|
507
|
+
"performance": {
|
|
508
|
+
"nodesExecuted": 150,
|
|
509
|
+
"eventsEmitted": 45,
|
|
510
|
+
"variableChanges": 23
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
#### Stopped
|
|
516
|
+
```json
|
|
517
|
+
{ "type": "stopped", "runId": "abc123", "graphId": "main-graph-1", "reason": "user_requested" }
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
#### Error
|
|
521
|
+
```json
|
|
522
|
+
{
|
|
523
|
+
"type": "error",
|
|
524
|
+
"runId": "abc123",
|
|
525
|
+
"graphId": "main-graph-1",
|
|
526
|
+
"code": "NODE_EXECUTION_ERROR",
|
|
527
|
+
"message": "Division by zero",
|
|
528
|
+
"nodeId": "node42",
|
|
529
|
+
"stack": "..."
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
### Tracing/Debug Events
|
|
536
|
+
|
|
537
|
+
#### Trace Event
|
|
538
|
+
```json
|
|
539
|
+
{
|
|
540
|
+
"type": "trace",
|
|
541
|
+
"runId": "abc123",
|
|
542
|
+
"graphId": "main-graph-1",
|
|
543
|
+
"nodeId": "node42",
|
|
544
|
+
"event": "activated",
|
|
545
|
+
"data": { "inputs": { ... }, "outputs": { ... } }
|
|
546
|
+
}
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
#### Log Event
|
|
550
|
+
```json
|
|
551
|
+
{
|
|
552
|
+
"type": "log",
|
|
553
|
+
"runId": "abc123",
|
|
554
|
+
"graphId": "main-graph-1",
|
|
555
|
+
"level": "info",
|
|
556
|
+
"message": "Processing item 42",
|
|
557
|
+
"data": { /* optional context */ }
|
|
558
|
+
}
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
### Variable Change Events
|
|
562
|
+
- `variableChanged` — Emitted when a variable's value changes during execution.
|
|
563
|
+
- Includes: `runId`, `graphId`, `variableName`, `oldValue`, `newValue`, and optionally `nodeId` (if the change was triggered by a node).
|
|
564
|
+
|
|
565
|
+
#### Example Variable Change Event
|
|
566
|
+
```json
|
|
567
|
+
{
|
|
568
|
+
"type": "variableChanged",
|
|
569
|
+
"runId": "abc123",
|
|
570
|
+
"graphId": "main-graph-1",
|
|
571
|
+
"variableName": "score",
|
|
572
|
+
"oldValue": 10,
|
|
573
|
+
"newValue": 11,
|
|
574
|
+
"nodeId": "node99"
|
|
575
|
+
}
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
### Event Emission
|
|
579
|
+
- `eventEmitted` — Emitted when an event is triggered during graph execution.
|
|
580
|
+
- Includes: `runId`, `graphId`, `eventName`, `payload`, and optionally `nodeId` (if the event was triggered by a specific node).
|
|
581
|
+
|
|
582
|
+
#### Example Event Emission
|
|
583
|
+
```json
|
|
584
|
+
{
|
|
585
|
+
"type": "eventEmitted",
|
|
586
|
+
"runId": "abc123",
|
|
587
|
+
"graphId": "main-graph-1",
|
|
588
|
+
"eventName": "onPlayerDeath",
|
|
589
|
+
"payload": { "playerId": "player123", "cause": "fall" },
|
|
590
|
+
"nodeId": "node55"
|
|
591
|
+
}
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
### Node Addition Events
|
|
595
|
+
- `nodeAdded` — Emitted when a node is added to a graph during execution.
|
|
596
|
+
- Includes: `runId`, `graphId`, `nodeId`, `nodeType`, and optionally `nodeData` with the full node configuration.
|
|
597
|
+
|
|
598
|
+
#### Example Node Addition Event
|
|
599
|
+
```json
|
|
600
|
+
{
|
|
601
|
+
"type": "nodeAdded",
|
|
602
|
+
"runId": "abc123",
|
|
603
|
+
"graphId": "main-graph-1",
|
|
604
|
+
"nodeId": "node42",
|
|
605
|
+
"nodeType": "math/add",
|
|
606
|
+
"nodeData": {
|
|
607
|
+
"id": "node42",
|
|
608
|
+
"type": "math/add",
|
|
609
|
+
"position": { "x": 100, "y": 200 },
|
|
610
|
+
"configuration": {}
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
## 10. Error Handling
|
|
618
|
+
|
|
619
|
+
### Error Codes
|
|
620
|
+
- `PROTOCOL_VERSION_MISMATCH` — Incompatible protocol versions
|
|
621
|
+
- `PROTOCOL_VIOLATION` — Protocol rules violated (e.g., hello not sent first)
|
|
622
|
+
- `AUTHENTICATION_FAILED` — Invalid or missing authentication credentials
|
|
623
|
+
- `AUTHENTICATION_REQUIRED` — Authentication is required but not provided
|
|
624
|
+
- `SESSION_NOT_FOUND` — Session does not exist or expired
|
|
625
|
+
- `SESSION_EXPIRED` — Session timed out
|
|
626
|
+
- `INVALID_GRAPH` — Graph definition is malformed
|
|
627
|
+
- `VALIDATION_FAILED` — Graph failed validation
|
|
628
|
+
- `RUN_NOT_FOUND` — Run ID does not exist
|
|
629
|
+
- `NODE_EXECUTION_ERROR` — Error during node execution
|
|
630
|
+
- `TIMEOUT` — Execution exceeded max time
|
|
631
|
+
- `CONCURRENT_LIMIT_EXCEEDED` — Too many concurrent runs
|
|
632
|
+
- `PERMISSION_DENIED` — Unauthorized operation
|
|
633
|
+
|
|
634
|
+
### Error Response Format
|
|
635
|
+
```json
|
|
636
|
+
{
|
|
637
|
+
"type": "error",
|
|
638
|
+
"code": "NODE_EXECUTION_ERROR",
|
|
639
|
+
"message": "Division by zero in node42",
|
|
640
|
+
"runId": "abc123",
|
|
641
|
+
"graphId": "main-graph-1",
|
|
642
|
+
"nodeId": "node42",
|
|
643
|
+
"details": { /* additional context */ }
|
|
644
|
+
}
|
|
645
|
+
```
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
|
|
649
|
+
## 11. Extensibility & Best Practices
|
|
650
|
+
|
|
651
|
+
### Protocol Evolution
|
|
652
|
+
- New message types and capabilities can be added without breaking existing clients
|
|
653
|
+
- Clients must check `capabilities` before using optional features
|
|
654
|
+
- Unknown message types should be ignored (forward compatibility)
|
|
655
|
+
- Protocol version follows semantic versioning
|
|
656
|
+
|
|
657
|
+
### Performance Recommendations
|
|
658
|
+
- Use event filtering to reduce network traffic
|
|
659
|
+
- Batch status queries when checking multiple runs
|
|
660
|
+
- Register frequently-used graphs to avoid re-sending definitions
|
|
661
|
+
- Implement client-side caching of graph validation results
|
|
662
|
+
- Use heartbeat to detect connection issues early
|
|
663
|
+
|
|
664
|
+
### Security Considerations
|
|
665
|
+
- **Authentication is strongly recommended for production environments**
|
|
666
|
+
- Use bearer tokens (JWT) for secure, stateless authentication
|
|
667
|
+
- Tokens should have reasonable expiration times (e.g., 1 hour for access tokens)
|
|
668
|
+
- Implement token refresh mechanisms for long-lived sessions
|
|
669
|
+
- Sessions should have reasonable expiration times (default: 1 hour)
|
|
670
|
+
- Implement rate limiting on graph execution and authentication attempts
|
|
671
|
+
- Validate all graph definitions before execution
|
|
672
|
+
- Enforce that `hello` is always the first message (reject connections otherwise)
|
|
673
|
+
- Use TLS/WSS in production to encrypt WebSocket traffic
|
|
674
|
+
- Sanitize error messages to avoid information leakage
|
|
675
|
+
|
|
676
|
+
---
|
|
677
|
+
## 12. Typescript interface
|
|
678
|
+
|
|
679
|
+
See the [../src/plugin/graphrunner/types.ts](Typescript interface)
|