@kiberon-labs/behave-graph-flow 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/.fallowrc.json +16 -0
  2. package/.storybook/main.ts +32 -0
  3. package/.storybook/preview.ts +16 -0
  4. package/.storybook/styles.css +10 -0
  5. package/.storybook/vscode.css +814 -0
  6. package/.turbo/turbo-build.log +7 -0
  7. package/LICENSE +6 -0
  8. package/README.md +2 -2
  9. package/data/Polynomial.json +510 -0
  10. package/data/sequence.json +337 -0
  11. package/data/trigger-event.json +241 -0
  12. package/data/variable-change.json +210 -0
  13. package/dist/entry.css +4 -0
  14. package/dist/index.css +39 -0
  15. package/dist/index.css.map +1 -0
  16. package/dist/index.d.ts +2282 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +14873 -0
  19. package/dist/index.js.map +1 -0
  20. package/docs/notifications.md +246 -0
  21. package/docs/protocol.md +679 -0
  22. package/docs/specifics.md +191 -0
  23. package/package.json +85 -21
  24. package/postcss.config.ts +3 -4
  25. package/src/annotations/index.ts +32 -0
  26. package/src/components/FloatingToolbar/index.module.css +45 -0
  27. package/src/components/FloatingToolbar/index.tsx +256 -0
  28. package/src/components/Flow.tsx +276 -75
  29. package/src/components/contextMenus/NodePicker.module.css +274 -0
  30. package/src/components/contextMenus/NodePicker.tsx +481 -0
  31. package/src/components/contextMenus/edge.tsx +108 -0
  32. package/src/components/contextMenus/node.tsx +155 -0
  33. package/src/components/contextMenus/selection.tsx +77 -0
  34. package/src/components/controls/any/index.tsx +8 -0
  35. package/src/components/controls/boolean/index.tsx +13 -0
  36. package/src/components/controls/colorPicker/InputPopover.module.css +100 -0
  37. package/src/components/controls/colorPicker/InputPopover.tsx +31 -0
  38. package/src/components/controls/colorPicker/index.module.css +18 -0
  39. package/src/components/controls/colorPicker/index.tsx +61 -0
  40. package/src/components/controls/number/index.tsx +35 -0
  41. package/src/components/controls/string/index.tsx +16 -0
  42. package/src/components/edges/index.tsx +469 -0
  43. package/src/components/edges/offsetBezier.ts +134 -0
  44. package/src/components/hotKeys.tsx +20 -0
  45. package/src/components/layoutController/index.module.css +10 -0
  46. package/src/components/layoutController/index.tsx +117 -0
  47. package/src/components/layoutController/utils.ts +205 -0
  48. package/src/components/menubar/defaults.tsx +480 -0
  49. package/src/components/menubar/index.tsx +49 -0
  50. package/src/components/menubar/menuItem.module.css +16 -0
  51. package/src/components/menubar/menuItem.tsx +32 -0
  52. package/src/components/nodes/behave/Node.module.css +23 -0
  53. package/src/components/nodes/behave/Node.tsx +176 -0
  54. package/src/components/nodes/behave/NodeContainer.module.css +87 -0
  55. package/src/components/nodes/behave/NodeContainer.tsx +46 -0
  56. package/src/components/nodes/behave/index.tsx +14 -0
  57. package/src/components/nodes/comment/FormatToolbar.tsx +118 -0
  58. package/src/components/nodes/comment/comment.tsx +103 -0
  59. package/src/components/nodes/comment/styles.module.css +150 -0
  60. package/src/components/nodes/group/index.tsx +109 -0
  61. package/src/components/nodes/wrapper/index.tsx +73 -0
  62. package/src/components/nodes/wrapper/styles.module.css +113 -0
  63. package/src/components/notifications/NotificationProvider.tsx +81 -0
  64. package/src/components/notifications/index.ts +2 -0
  65. package/src/components/notifications/utils.ts +71 -0
  66. package/src/components/panels/alignment/index.module.css +20 -0
  67. package/src/components/panels/alignment/index.tsx +244 -0
  68. package/src/components/panels/base/index.tsx +5 -0
  69. package/src/components/panels/base/styles.module.css +12 -0
  70. package/src/components/panels/conversation/index.module.css +151 -0
  71. package/src/components/panels/conversation/index.tsx +162 -0
  72. package/src/components/panels/events/CustomEventsEditor.tsx +384 -0
  73. package/src/components/panels/events/EditEventPanel.tsx +315 -0
  74. package/src/components/panels/events/ManageEventsPanel.tsx +98 -0
  75. package/src/components/panels/events/index.tsx +23 -0
  76. package/src/components/panels/events/styles.module.css +236 -0
  77. package/src/components/panels/history/index.tsx +92 -0
  78. package/src/components/panels/history/styles.module.css +106 -0
  79. package/src/components/panels/keymaps/index.module.css +78 -0
  80. package/src/components/panels/keymaps/index.tsx +167 -0
  81. package/src/components/panels/layers/index.tsx +240 -0
  82. package/src/components/panels/layers/styles.module.css +110 -0
  83. package/src/components/panels/legend/index.module.css +6 -0
  84. package/src/components/panels/legend/index.tsx +76 -0
  85. package/src/components/panels/logs/index.module.css +212 -0
  86. package/src/components/panels/logs/index.tsx +288 -0
  87. package/src/components/panels/nodeInputs/InputControl.tsx +63 -0
  88. package/src/components/panels/nodeInputs/InputsGroup.tsx +64 -0
  89. package/src/components/panels/nodeInputs/MultipleNodesView.tsx +37 -0
  90. package/src/components/panels/nodeInputs/NodeSettings.tsx +92 -0
  91. package/src/components/panels/nodeInputs/NodeTitleEditor.tsx +125 -0
  92. package/src/components/panels/nodeInputs/OutputsGroup.tsx +65 -0
  93. package/src/components/panels/nodeInputs/SocketGenerators.tsx +32 -0
  94. package/src/components/panels/nodeInputs/index.module.css +284 -0
  95. package/src/components/panels/nodeInputs/index.tsx +339 -0
  96. package/src/components/panels/nodeInputs/useNodeHandlers.ts +76 -0
  97. package/src/components/panels/nodeInputs/useNodeInputsData.ts +173 -0
  98. package/src/components/panels/nodePicker/index.tsx +115 -0
  99. package/src/components/panels/panel/index.module.css +66 -0
  100. package/src/components/panels/panel/index.tsx +88 -0
  101. package/src/components/panels/search/index.module.css +66 -0
  102. package/src/components/panels/search/index.tsx +215 -0
  103. package/src/components/panels/systemSettings/index.tsx +206 -0
  104. package/src/components/panels/systemSettings/styles.module.css +11 -0
  105. package/src/components/panels/traces/GridLines.tsx +38 -0
  106. package/src/components/panels/traces/TimeGrid.tsx +48 -0
  107. package/src/components/panels/traces/TraceLane.tsx +62 -0
  108. package/src/components/panels/traces/TraceTooltip.tsx +22 -0
  109. package/src/components/panels/traces/TracesHeader.tsx +56 -0
  110. package/src/components/panels/traces/index.module.css +166 -0
  111. package/src/components/panels/traces/index.tsx +294 -0
  112. package/src/components/panels/traces/types.ts +48 -0
  113. package/src/components/panels/traces/useDerivedSpans.ts +212 -0
  114. package/src/components/panels/traces/utils.ts +25 -0
  115. package/src/components/panels/variables/CreateVariableScreen.tsx +162 -0
  116. package/src/components/panels/variables/ManageVariablesScreen.tsx +144 -0
  117. package/src/components/panels/variables/index.tsx +125 -0
  118. package/src/components/panels/variables/styles.module.css +236 -0
  119. package/src/components/primitives/icon.module.css +45 -0
  120. package/src/components/primitives/icon.tsx +38 -0
  121. package/src/components/sockets/input/index.tsx +76 -0
  122. package/src/components/sockets/input/styles.module.css +27 -0
  123. package/src/components/sockets/output/index.tsx +61 -0
  124. package/src/components/sockets/output/styles.module.css +27 -0
  125. package/src/css/prosemirror.css +57 -0
  126. package/src/css/rc-dock.css +112 -0
  127. package/src/css/rc-menu.css +100 -0
  128. package/src/css/vars.css +14 -0
  129. package/src/css/vscode.css +13 -0
  130. package/src/entry.css +4 -0
  131. package/src/generators/CustomEventOnTriggeredGenerator.tsx +85 -0
  132. package/src/generators/SequenceGenerator.tsx +104 -0
  133. package/src/generators/SwitchOnIntegerGenerator.tsx +256 -0
  134. package/src/generators/SwitchOnStringGenerator.tsx +263 -0
  135. package/src/generators/registerDefaultGenerators.ts +34 -0
  136. package/src/hooks/useBehaveGraphFlow.ts +17 -16
  137. package/src/hooks/useDetachNodes.ts +39 -0
  138. package/src/hooks/useFlowHandlers.ts +115 -29
  139. package/src/hooks/useWasdPan.ts +188 -0
  140. package/src/index.css +146 -0
  141. package/src/index.ts +36 -18
  142. package/src/layout/dagre.tsx +119 -0
  143. package/src/layout/elk.ts +200 -0
  144. package/src/plugin/alignment/index.ts +81 -0
  145. package/src/plugin/docs/index.tsx +299 -0
  146. package/src/plugin/docs/panel/index.tsx +200 -0
  147. package/src/plugin/docs/panel/styles.module.css +174 -0
  148. package/src/plugin/graphrunner/actions.ts +253 -0
  149. package/src/plugin/graphrunner/buttons.tsx +87 -0
  150. package/src/plugin/graphrunner/client.ts +704 -0
  151. package/src/plugin/graphrunner/index.tsx +255 -0
  152. package/src/plugin/graphrunner/panel.tsx +386 -0
  153. package/src/plugin/graphrunner/runner.ts +358 -0
  154. package/src/plugin/graphrunner/session.ts +243 -0
  155. package/src/plugin/graphrunner/store.ts +206 -0
  156. package/src/plugin/graphrunner/styles.module.css +211 -0
  157. package/src/plugin/graphrunner/transport.ts +224 -0
  158. package/src/plugin/graphrunner/types.ts +672 -0
  159. package/src/plugin/graphrunner-local/execution-utils.ts +457 -0
  160. package/src/plugin/graphrunner-local/index.tsx +166 -0
  161. package/src/plugin/graphrunner-local/panel.tsx +231 -0
  162. package/src/plugin/graphrunner-local/store.ts +41 -0
  163. package/src/plugin/graphrunner-local/styles.module.css +101 -0
  164. package/src/plugin/graphrunner-local/transport.ts +1372 -0
  165. package/src/plugin/graphrunner-local/types.ts +10 -0
  166. package/src/plugin/graphrunner-webworker/graph-executor.worker.ts +633 -0
  167. package/src/plugin/graphrunner-webworker/index.tsx +146 -0
  168. package/src/plugin/graphrunner-webworker/panel.tsx +173 -0
  169. package/src/plugin/graphrunner-webworker/store.ts +89 -0
  170. package/src/plugin/graphrunner-webworker/types.ts +17 -0
  171. package/src/plugin/graphrunner-webworker/worker-transport.ts +123 -0
  172. package/src/plugin/realtime/realtimeRunner.ts +570 -0
  173. package/src/specifics/CustomEventOnTriggeredSpecific.tsx +92 -0
  174. package/src/specifics/CustomEventTriggerSpecific.tsx +141 -0
  175. package/src/specifics/VariableGetSpecific.tsx +110 -0
  176. package/src/specifics/VariableSetSpecific.tsx +110 -0
  177. package/src/specifics/registerDefaultSpecifics.ts +5 -0
  178. package/src/store/actions.tsx +698 -0
  179. package/src/store/chat.ts +73 -0
  180. package/src/store/controls.tsx +62 -0
  181. package/src/store/documentation.tsx +69 -0
  182. package/src/store/events.tsx +116 -0
  183. package/src/store/flow.tsx +245 -0
  184. package/src/store/graphRunnerClient.ts +110 -0
  185. package/src/store/hotKeys.tsx +323 -0
  186. package/src/store/layers.ts +259 -0
  187. package/src/store/legend.tsx +76 -0
  188. package/src/store/logs.ts +28 -0
  189. package/src/store/menubar.ts +41 -0
  190. package/src/store/refs.ts +84 -0
  191. package/src/store/registry.ts +43 -0
  192. package/src/store/selection.ts +22 -0
  193. package/src/store/settings.ts +99 -0
  194. package/src/store/socketGenerator.tsx +54 -0
  195. package/src/store/specific.tsx +75 -0
  196. package/src/store/specs.tsx +35 -0
  197. package/src/store/tabs.ts +278 -0
  198. package/src/store/toolbar.tsx +45 -0
  199. package/src/store/traces.ts +240 -0
  200. package/src/store/variables.ts +37 -0
  201. package/src/system/graph.ts +134 -0
  202. package/src/system/index.ts +3 -0
  203. package/src/system/notifications.ts +98 -0
  204. package/src/system/plugin.ts +27 -0
  205. package/src/system/provider.tsx +22 -0
  206. package/src/system/pubsub.ts +323 -0
  207. package/src/system/system.ts +223 -0
  208. package/src/system/tabLoader.tsx +265 -0
  209. package/src/system/undoRedo.ts +103 -0
  210. package/src/transformers/Uigraph.ts +60 -0
  211. package/src/transformers/behaveToFlow.ts +16 -4
  212. package/src/transformers/flowToBehave.ts +32 -12
  213. package/src/types/NodeMetadata.ts +27 -0
  214. package/src/types/graph.ts +49 -0
  215. package/src/types/nodes.ts +45 -0
  216. package/src/types.ts +16 -0
  217. package/src/util/colors.ts +1 -29
  218. package/src/util/downloadJson.ts +18 -0
  219. package/src/util/extractNodeMetadata.ts +16 -0
  220. package/src/util/getPickerFilters.ts +1 -1
  221. package/src/util/isBehaveNode.ts +6 -0
  222. package/src/util/isValidConnection.ts +28 -15
  223. package/src/util/mergeSockets.ts +29 -0
  224. package/src/util/serializeVariables.ts +66 -0
  225. package/src/util/sockets.ts +43 -0
  226. package/stories/apex/layoutController/example-graph.worker.ts +39 -0
  227. package/stories/apex/layoutController/index.stories.tsx +48 -0
  228. package/stories/apex/layoutController/webworker.stories.tsx +103 -0
  229. package/stories/apex/menubar/menubar.stories.tsx +19 -0
  230. package/stories/components/colorpicker/index.stories.tsx +20 -0
  231. package/stories/components/contextMenus/edge.stories.tsx +32 -0
  232. package/stories/components/contextMenus/node.stories.tsx +26 -0
  233. package/stories/components/contextMenus/nodePicker.stories.tsx +115 -0
  234. package/stories/components/controls/any/index.stories.tsx +19 -0
  235. package/stories/components/controls/boolean/index.stories.tsx +19 -0
  236. package/stories/components/controls/colorPicker/index.stories.tsx +49 -0
  237. package/stories/components/controls/number/index.stories.tsx +19 -0
  238. package/stories/components/controls/string/index.stories.tsx +19 -0
  239. package/stories/components/nodes/behaveNode.stories.tsx +108 -0
  240. package/stories/components/nodes/comment.stories.tsx +106 -0
  241. package/stories/components/panels/alignment.stories.tsx +24 -0
  242. package/stories/components/panels/events.stories.tsx +38 -0
  243. package/stories/components/panels/graphRunner.stories.tsx +317 -0
  244. package/stories/components/panels/history.stories.tsx +37 -0
  245. package/stories/components/panels/keymaps.stories.tsx +21 -0
  246. package/stories/components/panels/legend.stories.tsx +37 -0
  247. package/stories/components/panels/logs.stories.tsx +24 -0
  248. package/stories/components/panels/nodeInputs.stories.tsx +21 -0
  249. package/stories/components/panels/nodePicker.stories.tsx +37 -0
  250. package/stories/components/panels/panel.stories.tsx +39 -0
  251. package/stories/components/panels/search.stories.tsx +24 -0
  252. package/stories/components/panels/systemSettings.stories.tsx +26 -0
  253. package/stories/components/panels/traces.stories.tsx +225 -0
  254. package/stories/components/panels/variables.stories.tsx +24 -0
  255. package/stories/defaults/defaultStoryProvider.tsx +167 -0
  256. package/stories/defaults/systemGenerator.ts +38 -0
  257. package/tests/components/edges/offsetBezier.test.ts +51 -0
  258. package/tests/components/layoutController/utils.test.ts +68 -0
  259. package/tests/components/panels/traces/utils.test.ts +52 -0
  260. package/tests/flowToBehave.test.ts +26 -4
  261. package/tests/notifications.test.ts +87 -0
  262. package/tests/saveLoad.test.ts +372 -0
  263. package/tests/util/calculateNewEdge.test.ts +98 -0
  264. package/tests/util/getSocketsByNodeTypeAndHandleType.test.ts +31 -0
  265. package/tests/util/hasPositionMetaData.test.ts +33 -0
  266. package/tests/util/isBehaveNode.test.ts +22 -0
  267. package/tests/util/isHandleConnected.test.ts +37 -0
  268. package/tests/util/mergeSockets.test.ts +43 -0
  269. package/tests/visual/README.md +64 -0
  270. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-alignment-chromium-win32.png +0 -0
  271. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-conversation-chromium-win32.png +0 -0
  272. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-events-chromium-win32.png +0 -0
  273. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-history-chromium-win32.png +0 -0
  274. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-keymaps-chromium-win32.png +0 -0
  275. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-layers-chromium-win32.png +0 -0
  276. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-legend-chromium-win32.png +0 -0
  277. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-logs-chromium-win32.png +0 -0
  278. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodeInputs-chromium-win32.png +0 -0
  279. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-nodePicker-chromium-win32.png +0 -0
  280. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-panel-chromium-win32.png +0 -0
  281. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-search-chromium-win32.png +0 -0
  282. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-systemSettings-chromium-win32.png +0 -0
  283. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-traces-chromium-win32.png +0 -0
  284. package/tests/visual/__screenshots__/panels.visual.test.tsx/panel-variables-chromium-win32.png +0 -0
  285. package/tests/visual/panels.visual.test.tsx +76 -0
  286. package/tsconfig.base.json +39 -0
  287. package/tsconfig.json +18 -59
  288. package/tsconfig.prod.json +23 -0
  289. package/tsdown.config.ts +15 -3
  290. package/typedoc.json +7 -7
  291. package/vite.config.js +7 -0
  292. package/vitest.config.ts +5 -2
  293. package/vitest.visual.config.ts +48 -0
  294. package/src/components/AutoSizeInput.tsx +0 -65
  295. package/src/components/Controls.tsx +0 -87
  296. package/src/components/InputSocket.tsx +0 -142
  297. package/src/components/Node.tsx +0 -68
  298. package/src/components/NodeContainer.tsx +0 -46
  299. package/src/components/NodePicker.tsx +0 -77
  300. package/src/components/OutputSocket.tsx +0 -58
  301. package/src/components/modals/ClearModal.tsx +0 -40
  302. package/src/components/modals/HelpModal.tsx +0 -36
  303. package/src/components/modals/LoadModal.tsx +0 -96
  304. package/src/components/modals/Modal.tsx +0 -64
  305. package/src/components/modals/SaveModal.tsx +0 -60
  306. package/src/hooks/useCustomNodeTypes.tsx +0 -31
  307. package/src/hooks/useGraphRunner.ts +0 -104
  308. package/src/hooks/useMergeMap.ts +0 -14
  309. package/src/hooks/useNodeSpecJson.ts +0 -20
  310. package/src/hooks/useQueriableDefinitions.ts +0 -22
  311. package/src/styles.css +0 -8
  312. package/tailwind.config.ts +0 -19
  313. package/tests/tsconfig.json +0 -10
  314. /package/src/{types.d.ts → types-declarations.d.ts} +0 -0
@@ -0,0 +1,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)