@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
package/src/index.ts
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export * from './components/
|
|
4
|
-
export * from './components/
|
|
5
|
-
export * from './components/modals/SaveModal.js';
|
|
6
|
-
export * from './components/Controls.js';
|
|
7
|
-
|
|
8
|
-
export * from './components/AutoSizeInput.js';
|
|
9
|
-
export * from './components/Controls.js';
|
|
10
|
-
export * from './components/InputSocket.js';
|
|
11
|
-
export * from './components/Node.js';
|
|
1
|
+
import './index.css';
|
|
2
|
+
|
|
3
|
+
export * from './components/sockets/input/index.js';
|
|
4
|
+
export * from './components/nodes/behave/Node.js';
|
|
12
5
|
export * from './components/Flow.js';
|
|
13
|
-
export * from './components/
|
|
14
|
-
export * from './components/
|
|
15
|
-
export * from './components/
|
|
6
|
+
export * from './components/FloatingToolbar/index.js';
|
|
7
|
+
export * from './components/nodes/behave/NodeContainer.js';
|
|
8
|
+
export * from './components/contextMenus/NodePicker.js';
|
|
9
|
+
export * from './components/contextMenus/NodePicker.js';
|
|
10
|
+
export * from './components/sockets/output/index.js';
|
|
11
|
+
export * from './components/menubar/menuItem';
|
|
12
|
+
// Presentational panel primitives, exported so plugin packages (e.g. the AI
|
|
13
|
+
// nodes package's conversation panel) can author panels that match the editor.
|
|
14
|
+
export * from './components/panels/base/index.js';
|
|
15
|
+
export * from './components/primitives/icon.js';
|
|
16
16
|
|
|
17
|
+
//================== Reusable hooks =================//
|
|
17
18
|
export * from './hooks/useChangeNodeData.js';
|
|
18
19
|
export * from './hooks/useOnPressKey.js';
|
|
19
20
|
export * from './hooks/useFlowHandlers.js';
|
|
20
|
-
export * from './hooks/useGraphRunner.js';
|
|
21
21
|
export * from './hooks/useBehaveGraphFlow.js';
|
|
22
|
-
export * from './hooks/useNodeSpecJson.js';
|
|
23
|
-
export * from './hooks/useCustomNodeTypes.js';
|
|
24
|
-
export * from './hooks/useMergeMap.js';
|
|
25
22
|
|
|
26
23
|
export * from './transformers/behaveToFlow.js';
|
|
27
24
|
export * from './transformers/flowToBehave.js';
|
|
@@ -35,3 +32,41 @@ export * from './util/hasPositionMetaData.js';
|
|
|
35
32
|
export * from './util/isHandleConnected.js';
|
|
36
33
|
export * from './util/isValidConnection.js';
|
|
37
34
|
export * from './util/sleep.js';
|
|
35
|
+
export * from './util/serializeVariables.js';
|
|
36
|
+
export * from './util/downloadJson';
|
|
37
|
+
|
|
38
|
+
// New metadata types and utilities (v2.0)
|
|
39
|
+
export * from './types/NodeMetadata.js';
|
|
40
|
+
export * from './util/extractNodeMetadata.js';
|
|
41
|
+
|
|
42
|
+
export * from './system/index.js';
|
|
43
|
+
export * from './components/layoutController/index.js';
|
|
44
|
+
|
|
45
|
+
export * from './store/controls';
|
|
46
|
+
export * from './store/specific';
|
|
47
|
+
export * from './store/socketGenerator';
|
|
48
|
+
export * from './store/documentation';
|
|
49
|
+
export * from './store/toolbar';
|
|
50
|
+
export * from './store/conversions';
|
|
51
|
+
export * from './store/commands';
|
|
52
|
+
export * from './store/contextMenu';
|
|
53
|
+
export * from './store/settingsSchema';
|
|
54
|
+
export { registerDefaults } from './generators/registerDefaults';
|
|
55
|
+
|
|
56
|
+
export * from './annotations/index';
|
|
57
|
+
|
|
58
|
+
export * from './types/graph';
|
|
59
|
+
|
|
60
|
+
//================== Plugins =================//
|
|
61
|
+
export * from './system/plugin';
|
|
62
|
+
export * from './manifest/index.js';
|
|
63
|
+
export * from './plugin/docs/index.js';
|
|
64
|
+
export * from './plugin/alignment/index.js';
|
|
65
|
+
export * from './plugin/layout/index.js';
|
|
66
|
+
export * from './plugin/notes/index.js';
|
|
67
|
+
export * from './plugin/autosave/index.js';
|
|
68
|
+
export * from './plugin/kitchen-sink/index.js';
|
|
69
|
+
export * from './plugin/graphrunner/index.js';
|
|
70
|
+
export * from './plugin/graphrunner-local/index.js';
|
|
71
|
+
export * from './plugin/graphrunner-webworker/index.js';
|
|
72
|
+
export * from './plugin/realtime/realtimeRunner.js';
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { FC } from 'react';
|
|
2
|
+
import type { TabData } from 'rc-dock';
|
|
3
|
+
import {
|
|
4
|
+
ContributionKind,
|
|
5
|
+
type ContributionSpec
|
|
6
|
+
} from '@kiberon-labs/behave-graph';
|
|
7
|
+
import type { System } from '@/system/system';
|
|
8
|
+
import type { ControlProps } from '@/store/controls';
|
|
9
|
+
import type { Specific } from '@/store/specific';
|
|
10
|
+
import type { SocketGenerator } from '@/store/socketGenerator';
|
|
11
|
+
import type { ConversionRule } from '@/store/conversions';
|
|
12
|
+
import type { Command } from '@/store/commands';
|
|
13
|
+
import type { ContextMenuItem } from '@/store/contextMenu';
|
|
14
|
+
import type { ValueTypeMetadata } from '@/types/NodeMetadata';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Registers a single resolved contribution into the right editor store. `value`
|
|
18
|
+
* is whatever the host's resolver loaded for the contribution's `export` (its
|
|
19
|
+
* concrete shape depends on the kind).
|
|
20
|
+
*/
|
|
21
|
+
export type ContributionApplier = (
|
|
22
|
+
system: System,
|
|
23
|
+
contribution: ContributionSpec,
|
|
24
|
+
value: unknown
|
|
25
|
+
) => void;
|
|
26
|
+
|
|
27
|
+
/** Dispatch table mapping each {@link ContributionKind} to its store action. */
|
|
28
|
+
export const contributionAppliers: Record<string, ContributionApplier> = {
|
|
29
|
+
[ContributionKind.Control]: (system, c, value) => {
|
|
30
|
+
const name = c.bind?.controlName ?? c.bind?.valueType;
|
|
31
|
+
if (!name) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`control contribution '${c.id}' needs bind.controlName (or bind.valueType)`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
system.controlStore
|
|
37
|
+
.getState()
|
|
38
|
+
.registerControl(name, value as FC<ControlProps>);
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
[ContributionKind.Specific]: (system, _c, value) => {
|
|
42
|
+
system.specificStore.getState().registerSpecific(value as Specific);
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
[ContributionKind.Panel]: (system, c, value) => {
|
|
46
|
+
// A panel resolves to a tab loader `() => TabData`, registered under the
|
|
47
|
+
// contribution id (the tab id the host opens).
|
|
48
|
+
system.tabLoader.register(c.id, value as () => TabData);
|
|
49
|
+
},
|
|
50
|
+
|
|
51
|
+
[ContributionKind.SocketGenerator]: (system, _c, value) => {
|
|
52
|
+
system.socketGeneratorStore
|
|
53
|
+
.getState()
|
|
54
|
+
.registerGenerator(value as SocketGenerator);
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
[ContributionKind.Conversion]: (system, _c, value) => {
|
|
58
|
+
system.conversionStore
|
|
59
|
+
.getState()
|
|
60
|
+
.registerConversion(value as ConversionRule);
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
[ContributionKind.Command]: (system, _c, value) => {
|
|
64
|
+
system.commandStore.getState().register(value as Command);
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
[ContributionKind.ContextMenu]: (system, _c, value) => {
|
|
68
|
+
system.contextMenuStore.getState().register(value as ContextMenuItem);
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
[ContributionKind.ValueType]: (system, c, value) => {
|
|
72
|
+
// Replaces the pass-through value type with the real, function-bearing one.
|
|
73
|
+
const vt = value as ValueTypeMetadata;
|
|
74
|
+
const name = c.bind?.valueType ?? vt.name;
|
|
75
|
+
system.registry.getState().updateValues({ [name]: { ...vt, name } });
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
/** Apply a resolved contribution, warning (not throwing) on an unknown kind. */
|
|
80
|
+
export function applyContribution(
|
|
81
|
+
system: System,
|
|
82
|
+
contribution: ContributionSpec,
|
|
83
|
+
value: unknown
|
|
84
|
+
): void {
|
|
85
|
+
const applier = contributionAppliers[contribution.kind];
|
|
86
|
+
if (!applier) {
|
|
87
|
+
console.warn(
|
|
88
|
+
`[manifest] no applier for contribution kind '${contribution.kind}' (${contribution.id})`
|
|
89
|
+
);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
applier(system, contribution, value);
|
|
93
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ContributionSpec,
|
|
3
|
+
ManifestJSON,
|
|
4
|
+
PackageRequirement
|
|
5
|
+
} from '@kiberon-labs/behave-graph';
|
|
6
|
+
import type { System } from '@/system/system';
|
|
7
|
+
import type { ValueTypeMetadata } from '@/types/NodeMetadata';
|
|
8
|
+
import { passthroughValueType } from './passthroughValueType';
|
|
9
|
+
import { applyContribution } from './contributionRegistry';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Resolves a contribution's declarative `export` (e.g. `"./ui.js#ImageControl"`)
|
|
13
|
+
* to its actual value. The host owns this because a bundler must know the
|
|
14
|
+
* concrete module — so loading code contributions is always host-mediated and
|
|
15
|
+
* gated behind {@link LoadManifestOptions.trust}.
|
|
16
|
+
*/
|
|
17
|
+
export type ContributionResolver = (
|
|
18
|
+
contribution: ContributionSpec,
|
|
19
|
+
manifest: ManifestJSON
|
|
20
|
+
) => unknown | Promise<unknown>;
|
|
21
|
+
|
|
22
|
+
export type LoadManifestOptions = {
|
|
23
|
+
/**
|
|
24
|
+
* Gate for executing code contributions. Default `false`: only nodes and
|
|
25
|
+
* pass-through value types load (no package code runs). Set true together
|
|
26
|
+
* with {@link LoadManifestOptions.resolve} once the package is trusted.
|
|
27
|
+
*/
|
|
28
|
+
trust?: boolean;
|
|
29
|
+
/** Required to load contributions; without it only the static parts load. */
|
|
30
|
+
resolve?: ContributionResolver;
|
|
31
|
+
/**
|
|
32
|
+
* Called for each declared host requirement (persistent backend, config,
|
|
33
|
+
* ...). Lets the host surface a badge or run a backend. No code executes here.
|
|
34
|
+
*/
|
|
35
|
+
onRequirement?: (
|
|
36
|
+
requirement: PackageRequirement,
|
|
37
|
+
manifest: ManifestJSON
|
|
38
|
+
) => void;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Load a package manifest into the editor.
|
|
43
|
+
*
|
|
44
|
+
* Always (no code execution): registers the node specs and pass-through value
|
|
45
|
+
* types, so the palette is fully populated from JSON alone. Only under explicit
|
|
46
|
+
* `trust` + a `resolve`r does it import and register the package's code
|
|
47
|
+
* contributions. Declared host requirements are surfaced via `onRequirement`.
|
|
48
|
+
*/
|
|
49
|
+
export async function loadManifest(
|
|
50
|
+
system: System,
|
|
51
|
+
manifest: ManifestJSON,
|
|
52
|
+
options: LoadManifestOptions = {}
|
|
53
|
+
): Promise<void> {
|
|
54
|
+
// 1. Static: nodes + pass-through value types. No package code runs.
|
|
55
|
+
const values: Record<string, ValueTypeMetadata> = {};
|
|
56
|
+
for (const value of manifest.values) {
|
|
57
|
+
values[value.name] = passthroughValueType(value);
|
|
58
|
+
}
|
|
59
|
+
system.registry.getState().updateRegistry({ specs: manifest.nodes, values });
|
|
60
|
+
|
|
61
|
+
// 2. Surface host requirements (no code execution).
|
|
62
|
+
if (options.onRequirement && manifest.requirements) {
|
|
63
|
+
for (const requirement of manifest.requirements) {
|
|
64
|
+
options.onRequirement(requirement, manifest);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// 3. Code contributions — only when explicitly trusted and a resolver exists.
|
|
69
|
+
if (!options.trust || !options.resolve) return;
|
|
70
|
+
for (const contribution of manifest.contributions) {
|
|
71
|
+
try {
|
|
72
|
+
const value = await options.resolve(contribution, manifest);
|
|
73
|
+
if (value === null || value === undefined) continue;
|
|
74
|
+
applyContribution(system, contribution, value);
|
|
75
|
+
} catch (err) {
|
|
76
|
+
console.error(
|
|
77
|
+
`[manifest] failed to load contribution '${contribution.id}'`,
|
|
78
|
+
err
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ManifestJSON } from '@kiberon-labs/behave-graph';
|
|
2
|
+
import { plugin } from '@/system/plugin';
|
|
3
|
+
import type { System } from '@/system/system';
|
|
4
|
+
import { loadManifest, type LoadManifestOptions } from './loadManifest';
|
|
5
|
+
|
|
6
|
+
export interface ManifestPluginOptions extends LoadManifestOptions {
|
|
7
|
+
/** Manifests to load, in order (later ones override earlier node types). */
|
|
8
|
+
manifests: ManifestJSON[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function manifestPluginLoader(
|
|
12
|
+
system: System,
|
|
13
|
+
options: ManifestPluginOptions
|
|
14
|
+
): Promise<void> {
|
|
15
|
+
const { manifests, ...loadOptions } = options;
|
|
16
|
+
for (const manifest of manifests) {
|
|
17
|
+
await loadManifest(system, manifest, loadOptions);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Register one or more package manifests as a single plugin. The static parts
|
|
23
|
+
* (nodes + value types) always load; code contributions load only under
|
|
24
|
+
* `trust` + `resolve` (see {@link LoadManifestOptions}).
|
|
25
|
+
*/
|
|
26
|
+
export const manifestPlugin = plugin<ManifestPluginOptions>(
|
|
27
|
+
manifestPluginLoader,
|
|
28
|
+
{ name: 'manifest' }
|
|
29
|
+
);
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ValueTypeSpecJSON } from '@kiberon-labs/behave-graph';
|
|
2
|
+
import type { ValueTypeMetadata } from '@/types/NodeMetadata';
|
|
3
|
+
|
|
4
|
+
const clone = <T>(value: T): T => {
|
|
5
|
+
if (value === null || typeof value !== 'object') return value;
|
|
6
|
+
try {
|
|
7
|
+
return structuredClone(value);
|
|
8
|
+
} catch {
|
|
9
|
+
return JSON.parse(JSON.stringify(value)) as T;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Build a function-bearing {@link ValueTypeMetadata} from a function-free
|
|
15
|
+
* {@link ValueTypeSpecJSON} carried in a manifest.
|
|
16
|
+
*
|
|
17
|
+
* The editor calls `creator`/`serialize`/`deserialize` at author time (creating
|
|
18
|
+
* variables, editing events, deserializing a graph's variables). A manifest can
|
|
19
|
+
* only ship JSON, so we synthesise pass-through behaviour: the value is already
|
|
20
|
+
* its own JSON form, so (de)serialize are identity and `creator` returns a clone
|
|
21
|
+
* of the declared default. This keeps every existing UI call site working with
|
|
22
|
+
* **zero code execution**. When the package is later trusted-loaded, a
|
|
23
|
+
* `valueType` contribution can replace this with the real implementation.
|
|
24
|
+
*/
|
|
25
|
+
export function passthroughValueType(
|
|
26
|
+
spec: ValueTypeSpecJSON
|
|
27
|
+
): ValueTypeMetadata {
|
|
28
|
+
return {
|
|
29
|
+
name: spec.name,
|
|
30
|
+
creator: () =>
|
|
31
|
+
spec.defaultJSON === null || spec.defaultJSON === undefined
|
|
32
|
+
? undefined
|
|
33
|
+
: clone(spec.defaultJSON),
|
|
34
|
+
serialize: (value: unknown) => value,
|
|
35
|
+
deserialize: (value: unknown) => value,
|
|
36
|
+
clone: (value: unknown) => clone(value),
|
|
37
|
+
equals: (a: unknown, b: unknown) =>
|
|
38
|
+
a === b || JSON.stringify(a) === JSON.stringify(b)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { align, distribute, ALIGNMENT } from '@/components/panels/alignment';
|
|
2
|
+
import type { GraphSession } from '@/system/graphSession';
|
|
3
|
+
import type { Node } from 'reactflow';
|
|
4
|
+
import { plugin } from '@/system/plugin';
|
|
5
|
+
import type { System } from '@/system/system';
|
|
6
|
+
import { pinned } from '@/annotations';
|
|
7
|
+
|
|
8
|
+
const partitionSelectedNodes = (nodes: Node[]) => {
|
|
9
|
+
return nodes.reduce(
|
|
10
|
+
(acc, node) => {
|
|
11
|
+
if (node.selected && !node.data?.metadata?.[pinned]) {
|
|
12
|
+
acc.selectedNodes.push(node);
|
|
13
|
+
} else {
|
|
14
|
+
acc.unselectedNodes.push(node);
|
|
15
|
+
}
|
|
16
|
+
return acc;
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
selectedNodes: [] as Node[],
|
|
20
|
+
unselectedNodes: [] as Node[]
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type AlignmentAxis = 'x' | 'y';
|
|
26
|
+
export type AlignmentType = 'start' | 'center' | 'end';
|
|
27
|
+
|
|
28
|
+
declare module '@/system/system' {
|
|
29
|
+
interface GraphPubSys {
|
|
30
|
+
'alignment:align': {
|
|
31
|
+
type: AlignmentType;
|
|
32
|
+
axis: AlignmentAxis;
|
|
33
|
+
};
|
|
34
|
+
'alignment:distribute': {
|
|
35
|
+
type: AlignmentType;
|
|
36
|
+
axis: AlignmentAxis;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const setupSessionActions = (session: GraphSession) => {
|
|
42
|
+
// Subscribe to alignment events
|
|
43
|
+
session.pubsub.subscribe('alignment:align', (_, data) => {
|
|
44
|
+
const { nodes, setNodes } = session.nodeStore.getState();
|
|
45
|
+
const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);
|
|
46
|
+
|
|
47
|
+
const alignmentType =
|
|
48
|
+
data.type === 'start'
|
|
49
|
+
? ALIGNMENT.START
|
|
50
|
+
: data.type === 'center'
|
|
51
|
+
? ALIGNMENT.CENTER
|
|
52
|
+
: ALIGNMENT.END;
|
|
53
|
+
|
|
54
|
+
align(alignmentType, data.axis)(selectedNodes);
|
|
55
|
+
setNodes([...unselectedNodes, ...selectedNodes]);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// Subscribe to distribution events
|
|
59
|
+
session.pubsub.subscribe('alignment:distribute', (_, data) => {
|
|
60
|
+
const { nodes, setNodes } = session.nodeStore.getState();
|
|
61
|
+
const { selectedNodes, unselectedNodes } = partitionSelectedNodes(nodes);
|
|
62
|
+
|
|
63
|
+
const alignmentType =
|
|
64
|
+
data.type === 'start'
|
|
65
|
+
? ALIGNMENT.START
|
|
66
|
+
: data.type === 'center'
|
|
67
|
+
? ALIGNMENT.CENTER
|
|
68
|
+
: ALIGNMENT.END;
|
|
69
|
+
|
|
70
|
+
distribute(alignmentType, data.axis)(selectedNodes);
|
|
71
|
+
setNodes([...unselectedNodes, ...selectedNodes]);
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Adds node alignment + distribution to the editor. The behaviour is opt-in: it
|
|
77
|
+
* subscribes each graph's pubsub (via a session extension, so it covers graphs
|
|
78
|
+
* already open and any opened later) to the `alignment:align` /
|
|
79
|
+
* `alignment:distribute` events the FloatingToolbar and Alignment panel publish.
|
|
80
|
+
*
|
|
81
|
+
* Register it directly or via the kitchen-sink plugin. Without it those events
|
|
82
|
+
* have no subscriber and the alignment controls simply no-op.
|
|
83
|
+
*/
|
|
84
|
+
export const alignmentPlugin = plugin(
|
|
85
|
+
(system: System) => {
|
|
86
|
+
system.registerSessionExtension((session) => {
|
|
87
|
+
setupSessionActions(session);
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
{ name: 'alignment' }
|
|
91
|
+
);
|